File size: 6,269 Bytes
12d891e
27dbdfd
7c95914
12d891e
7c95914
27dbdfd
7c95914
 
 
 
 
 
27dbdfd
d796104
a56964f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d47dd8a
35fb3be
13c5f18
976f538
5f51ac1
744d5b3
1110c74
902d85a
4e0fb75
1110c74
2c1ff12
d2d9c5f
a48e7a7
35fb3be
5efe4f5
902d85a
5efe4f5
a48e7a7
 
 
35fb3be
 
 
d47dd8a
35fb3be
d47dd8a
35fb3be
d47dd8a
 
a48e7a7
 
 
 
89ad1c6
35fb3be
a56964f
 
 
 
 
0cba2f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6755ee0
12d891e
6741ab6
 
 
 
 
12d891e
191e71b
12d891e
d47dd8a
27dbdfd
b6bac0f
 
 
 
7c95914
 
a407d5b
a152229
7c95914
a56964f
 
 
 
 
6741ab6
a56964f
 
 
 
 
 
 
 
 
 
6741ab6
35f13e1
35fb3be
 
 
 
 
 
 
 
 
 
35f13e1
6741ab6
 
 
 
 
 
 
 
 
 
35f13e1
 
 
 
 
 
 
 
 
 
6741ab6
35f13e1
 
27dbdfd
10a642d
6741ab6
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
import streamlit as st
from dotenv import load_dotenv
import pickle
from huggingface_hub import Repository
from PyPDF2 import PdfReader
from streamlit_extras.add_vertical_space import add_vertical_space
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
import os

# 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.environ["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, query, key=None, color=None, overlap=30):
    button_id = f"cloud-button-{key or label}".replace(" ", "-")
    color_class = f"color-{color}" if color else ""
    num_circles = max(3, min(35, len(label) // 4))
    circle_size = 60

    circles_html = ''.join([
        f'<div class="circle {color_class}" style="margin-right: -{overlap}px;"></div>'
        for _ in range(num_circles)
    ])
    circles_html += f'<div class="circle-text">{label}</div>'

    cloud_button_html = f"""
    <div class="cloud" id="{button_id}" style="margin-bottom: 20px; cursor: pointer;">
        <div class="wrapper {color_class}">
            {circles_html}
        </div>
    </div>
    <script>
        document.getElementById("{button_id}").onclick = function() {{
            const query = "{query}";
            const label = "{label}";
            const button_id = "{button_id}";
            window.parent.postMessage({{
                'isStreamlitMessage': true,
                'type': 'streamlit:setComponentValue',
                'value': {{'label': label, 'query': query, 'button_id': button_id}},
                'key': 'button_clicked'
            }}, '*');
        }};
    </script>
    """
    st.markdown(cloud_button_html, unsafe_allow_html=True)


def display_chat_history(chat_history):
    for sender, msg, _ in chat_history:
        background_color = "#FFA07A" if sender == "User" else "#caf"
        st.markdown(f"<div style='background-color: {background_color}; padding: 10px; border-radius: 10px; margin: 10px;'>{sender}: {msg}</div>", 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 main():
    hide_streamlit_style = """
    <style>
    #MainMenu {visibility: hidden;}
    footer {visibility: hidden;}
    </style>
    """
    st.markdown(hide_streamlit_style, unsafe_allow_html=True)

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

    pdf_path = pdf_file_path
    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)

    if pdf_path is not None:
        query = st.text_input("Ask questions about your PDF file (in any preferred language):", key="user_query")

        cloud_buttons = [
            ("Was genau ist ein Belegarzt?", "Was genau ist ein Belegarzt?", "1"),
            ("Wofür wird die Alpha-ID verwendet?", "Wofür wird die Alpha-ID verwendet?", "2"),
            # Add more buttons as needed
        ]

        for label, query, color in cloud_buttons:
            cloud_button(label, query, color=color)

        user_input = st.empty()

        if "button_clicked" in st.session_state:
            button_info = st.session_state["button_clicked"]
            if button_info:
                st.write(f"You clicked: {button_info['label']}")
                st.write(f"Query: {button_info['query']}")
                # Handle the button click as needed
                # For example, you can call a function to process the query
                # process_query(button_info['query'])
                st.session_state["button_clicked"] = None  # Reset after handling


        if st.button("Ask"):
            user_input = st.session_state.user_query
            handle_query(user_input, pdf_path)

def handle_query(query, pdf_path):
    if not query:
        st.warning("Please enter a query.")
        return

    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)
    with get_openai_callback() as cb:
        response = chain.run(input_documents=docs, question=query)

    st.session_state['chat_history'].append(("Bot", response, "new"))
    display_chat_history(st.session_state['chat_history'][-2:])
    loading_message.empty()
    st.session_state['chat_history'] = [(sender, msg, "old") for sender, msg, _ in st.session_state['chat_history']]

if __name__ == "__main__":
    main()