File size: 9,804 Bytes
12d891e
a48e7a7
7c95914
a48e7a7
12d891e
7c95914
 
 
 
 
 
 
d796104
44c0e78
 
8a1f468
 
 
a48e7a7
44c0e78
8a1f468
44c0e78
 
f3aaf05
47f6195
13c5f18
a48e7a7
13c5f18
a48e7a7
cfb0afd
a48e7a7
 
 
 
a7c76ce
 
a48e7a7
 
 
 
508bae1
a48e7a7
 
6c1b73b
a7c76ce
c2af936
a48e7a7
0bb013f
6c1b73b
a48e7a7
cfb0afd
a48e7a7
 
 
 
6c1b73b
cfb0afd
a48e7a7
 
 
 
a7c76ce
cfb0afd
a48e7a7
 
508bae1
 
 
 
a7c76ce
508bae1
 
 
cfb0afd
 
 
508bae1
a7c76ce
508bae1
a48e7a7
6c1b73b
508bae1
 
 
 
a7c76ce
508bae1
6c1b73b
a7c76ce
 
 
 
 
 
 
 
6c1b73b
a48e7a7
 
 
 
13c5f18
 
 
 
 
 
a48e7a7
 
 
13c5f18
a48e7a7
 
 
 
89ad1c6
13c5f18
403a475
7c95914
12d891e
7c95914
12d891e
 
 
 
 
 
 
 
 
 
8a1f468
7c95914
 
 
 
2df9243
7c95914
 
 
 
8a1f468
a63f1b5
12d891e
c678561
a6d00b1
a48e7a7
 
 
 
2efa07b
6755ee0
a48e7a7
 
 
 
 
 
 
 
 
 
13c5f18
a48e7a7
 
13c5f18
a48e7a7
 
 
 
 
 
 
6755ee0
12d891e
77070ab
 
 
 
 
12d891e
191e71b
12d891e
 
77070ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b6bac0f
 
 
 
7c95914
 
 
a152229
7c95914
b6bac0f
 
 
 
9ca7d21
 
b6bac0f
 
13c5f18
a48e7a7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10a642d
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
import streamlit as st
import os
import pickle
from streamlit_extras.add_vertical_space import add_vertical_space
from huggingface_hub import Repository
from PyPDF2 import PdfReader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.llms import OpenAI
from langchain.chains.question_answering import load_qa_chain
from langchain.callbacks import get_openai_callback

# Step 1: Clone the Dataset Repository
repo = Repository(
    local_dir="Private_Book",  # Local directory to clone the repository
    repo_type="dataset",  # Specify that this is a dataset repository
    clone_from="Anne31415/Private_Book",  # Replace with your repository URL
    token=os.getenv("HUB_TOKEN")  # Use the secret token to authenticate
)
repo.git_pull()  # Pull the latest changes (if any)

# Step 2: Load the PDF File
pdf_file_path = "Private_Book/KOMBI_all2.pdf"  # Replace with your PDF file path

def cloud_button(label, key=None, color=None):
    button_id = f"cloud-button-{key or label}"
    color_class = f"color-{color}" if color else ""
    cloud_button_html = f"""
    <div class="cloud {color_class}" id="{button_id}" style="margin-bottom: 20px;">
        <div class="circle small"></div>
        <div class="circle medium"></div>
        <div class="circle large"></div>
        <div class="rectangle">{label}</div>
        <div class="circle medium right"></div>
        <div class="circle small right"></div>
    </div>
    <style>
        .cloud {{
            position: relative;
            display: inline-block;
            cursor: pointer;
            user-select: none;
            font-size: 16px;
            background-color: #f8f9fa;
        }}
        .rectangle {{
            min-width: 120px;
            height: auto;
            border-radius: 30px;
            position: relative;
            display: flex;
            align-items: center;
            justify-content: center;
            font-weight: bold;
            padding: 10px 20px;
            z-index: 2;
            transition: background-color 0.4s;
        }}
        .circle {{
            position: absolute;
            background-color: #f8f9fa;
            z-index: 1;
        }}
        .circle.small {{
            width: 40px;
            height: 40px;
            border-radius: 20px;
            top: 50%;
            left: -20px;
            transform: translateY(-50%);
        }}
        .circle.medium {{
            width: 60px;
            height: 60px;
            border-radius: 30px;
            top: 50%;
            left: -30px;
            transform: translateY(-50%);
        }}
        .circle.large {{
            width: 80px;
            height: 80px;
            border-radius: 40px;
            top: 50%;
            left: -40px;
            transform: translateY(-50%);
        }}
        .circle.right.small {{
            left: auto;
            right: -20px;
        }}
        .circle.right.medium {{
            left: auto;
            right: -30px;
        }}
       
        .cloud:hover .rectangle {{
            background-color: #008CBA;
            color: white;
        }}
        .color-1 .rectangle {{ background-color: #FFA07A; }}
        .color-2 .rectangle {{ background-color: #FF7F50; }}
        .color-3 .rectangle {{ background-color: #FF6347; }}
        .color-4 .rectangle {{ background-color: #FF4500; }}
        .color-5 .rectangle {{ background-color: #FF8C00; }}
        .color-6 .rectangle {{ background-color: #FFD700; }}
    </style>
    <script>
        document.getElementById("{button_id}").onclick = function() {{
            // Your existing JavaScript code for handling button click
        }};
    </script>
    """
    st.markdown(cloud_button_html, unsafe_allow_html=True)


def load_pdf(file_path):
    pdf_reader = PdfReader(file_path)
    text = ""
    for page in pdf_reader.pages:
        text += page.extract_text()

    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=1000,
        chunk_overlap=200,
        length_function=len
    )
    chunks = text_splitter.split_text(text=text)

    store_name, _ = os.path.splitext(os.path.basename(file_path))

    if os.path.exists(f"{store_name}.pkl"):
        with open(f"{store_name}.pkl", "rb") as f:
            VectorStore = pickle.load(f)
    else:
        embeddings = OpenAIEmbeddings()
        VectorStore = FAISS.from_texts(chunks, embedding=embeddings)
        with open(f"{store_name}.pkl", "wb") as f:
            pickle.dump(VectorStore, f)

    return VectorStore

def load_chatbot():
    return load_qa_chain(llm=OpenAI(), chain_type="stuff")

def display_chat_history(chat_history):
    for chat in chat_history:
        background_color = "#FFA07A" if chat[2] == "new" else "#acf" if chat[0] == "User" else "#caf"
        st.markdown(f"<div style='background-color: {background_color}; padding: 10px; border-radius: 10px; margin: 10px;'>{chat[0]}: {chat[1]}</div>", unsafe_allow_html=True)

def main():
    with st.sidebar:
        st.title('BinDoc GmbH')
        st.markdown("Experience revolutionary interaction with BinDocs Chat App, leveraging state-of-the-art AI technology.")
        
        add_vertical_space(1)  # Adjust as per the desired spacing
        
        st.markdown("""
        Hello! I’m here to assist you with:<br><br>
        📘 **Glossary Inquiries:**<br>
        I can clarify terms like "DiGA", "AOP", or "BfArM", providing clear and concise explanations to help you understand our content better.<br><br>
        
        🆘 **Help Page Navigation:**<br>
        Ask me if you forgot your password or want to know more about topics related to the platform.<br><br>
        
        📰 **Latest Whitepapers Insights:**<br>
        Curious about our recent publications? Feel free to ask about our latest whitepapers!<br><br>
        """, unsafe_allow_html=True)
        
        add_vertical_space(1)  # Adjust as per the desired spacing
        st.write('Made with ❤️ by BinDoc GmbH')
        api_key = os.getenv("OPENAI_API_KEY")

    hide_streamlit_style = """
        <style>
        #MainMenu {visibility: hidden;}
        footer {visibility: hidden;}
        </style>
    """
    st.markdown(hide_streamlit_style, unsafe_allow_html=True)

    # Main content
    st.title("Welcome to BinDocs ChatBot! 🤖")

    # Cloud Buttons as Example Questions
    st.markdown("**Example Questions:**")
    cloud_button("Was genau ist ein Belegarzt?", color="1")
    st.markdown("<div style='margin-bottom: 20px;'></div>", unsafe_allow_html=True)  # Space after the cloud button
    cloud_button("Wofür wird die Alpha-ID verwendet?", color="2")
    st.markdown("<div style='margin-bottom: 20px;'></div>", unsafe_allow_html=True)  # Space after the cloud button
    cloud_button("Was sind die Vorteile des ambulanten operierens?", color="3")
    st.markdown("<div style='margin-bottom: 20px;'></div>", unsafe_allow_html=True)  # Space after the cloud button
    cloud_button("Was kann ich mit dem Prognose-Analyse Toll machen?", color="4")
    st.markdown("<div style='margin-bottom: 20px;'></div>", unsafe_allow_html=True)  # Space after the cloud button
    cloud_button("Was sagt mir die Farbe der Balken der Bevölkerungsentwicklung?", color="5")
    st.markdown("<div style='margin-bottom: 20px;'></div>", unsafe_allow_html=True)  # Space after the cloud button
    cloud_button("Ich habe mein Meta Password vergessen, wie kann ich es zurücksetzen?", color="6")
    st.markdown("<div style='margin-bottom: 20px;'></div>", unsafe_allow_html=True)  # Space after the cloud button

    pdf_path = "path_to_your_pdf_file.pdf"  # Update this to the path of your PDF file
    if not os.path.exists(pdf_path):
        st.error("File not found. Please check the file path.")
        return

    if "chat_history" not in st.session_state:
        st.session_state['chat_history'] = []

    display_chat_history(st.session_state['chat_history'])

    st.write("<!-- Start Spacer -->", unsafe_allow_html=True)
    st.write("<div style='flex: 1;'></div>", unsafe_allow_html=True)
    st.write("<!-- End Spacer -->", unsafe_allow_html=True)

    new_messages_placeholder = st.empty()

    if pdf_path is not None:
        query = st.text_input("Ask questions about your PDF file (in any preferred language):")
        
        if st.button("Ask") or (not st.session_state['chat_history'] and query) or (st.session_state['chat_history'] and query != st.session_state['chat_history'][-1][1]):
            st.session_state['chat_history'].append(("User", query, "new"))
            loading_message = st.empty()
            loading_message.text('Bot is thinking...')
            VectorStore = load_pdf(pdf_path)
            chain = load_chatbot()
            docs = VectorStore.similarity_search(query=query, k=3)
            response = chain.run(input_documents=docs, question=query)
            st.session_state['chat_history'].append(("Bot", response, "new"))
            new_messages = st.session_state['chat_history'][-2:]
            for chat in new_messages:
                background_color = "#FFA07A" if chat[2] == "new" else "#acf" if chat[0] == "User" else "#caf"
                new_messages_placeholder.markdown(f"<div style='background-color: {background_color}; padding: 10px; border-radius: 10px; margin: 10px;'>{chat[0]}: {chat[1]}</div>", unsafe_allow_html=True)
            st.write("<script>document.getElementById('response').scrollIntoView();</script>", unsafe_allow_html=True)
            loading_message.empty()
            query = ""
        st.session_state['chat_history'] = [(sender, msg, "old") for sender, msg, _ in st.session_state['chat_history']]

if __name__ == "__main__":
    main()