shukdevdatta123 commited on
Commit
5b88cc6
Β·
verified Β·
1 Parent(s): 7209079

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +164 -164
app.py CHANGED
@@ -1,165 +1,165 @@
1
- import streamlit as st
2
- from llama_index.core import VectorStoreIndex, Document
3
- from llama_index.llms.openai import OpenAI
4
- from llama_index.core import Settings
5
- import os
6
- import pdfplumber
7
- from docx import Document as DocxDocument
8
- from dotenv import load_dotenv
9
- import json
10
-
11
- # Load environment variables from .env file
12
- load_dotenv()
13
-
14
- st.header("Chat with the Streamlit docs πŸ’¬ πŸ“š")
15
-
16
- # Sidebar for OpenAI API Key
17
- if 'openai_api_key' not in st.session_state:
18
- st.session_state.openai_api_key = ""
19
-
20
- # Input for OpenAI API Key
21
- st.session_state.openai_api_key = st.sidebar.text_input("Enter your OpenAI API Key:",
22
- type="password",
23
- value=st.session_state.openai_api_key)
24
-
25
- # Initialize session state for messages
26
- if "messages" not in st.session_state:
27
- st.session_state.messages = [
28
- {"role": "assistant", "content": "Ask me a question about the documents you uploaded!"}
29
- ]
30
-
31
- # Function to read PDF files
32
- def read_pdf(file):
33
- with pdfplumber.open(file) as pdf:
34
- text = ''
35
- for page in pdf.pages:
36
- text += page.extract_text() + '\n'
37
- return text
38
-
39
- # Function to read DOCX files
40
- def read_docx(file):
41
- doc = DocxDocument(file)
42
- text = ''
43
- for paragraph in doc.paragraphs:
44
- text += paragraph.text + '\n'
45
- return text
46
-
47
- @st.cache_resource(show_spinner=False)
48
- def load_data(uploaded_files):
49
- with st.spinner("Loading and indexing the documents – hang tight! This should take 1-2 minutes."):
50
- docs = []
51
- for uploaded_file in uploaded_files:
52
- if uploaded_file.type == "application/pdf":
53
- text = read_pdf(uploaded_file)
54
- docs.append(Document(text=text))
55
- elif uploaded_file.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
56
- text = read_docx(uploaded_file)
57
- docs.append(Document(text=text))
58
-
59
- Settings.llm = OpenAI(model="gpt-3.5-turbo", temperature=0.5,
60
- system_prompt="You are an expert on the Streamlit Python library and your job is to answer technical questions. Assume that all questions are related to the Streamlit Python library. Keep your answers technical and based on facts – do not hallucinate features.")
61
-
62
- index = VectorStoreIndex.from_documents(docs, settings=Settings.llm)
63
- return index
64
-
65
- # Function to save the conversation
66
- def save_conversation():
67
- with open("conversations.json", "a") as f:
68
- json.dump(st.session_state.messages, f)
69
- f.write("\n")
70
-
71
- # Function to load previous conversations
72
- def load_conversations():
73
- if os.path.exists("conversations.json"):
74
- with open("conversations.json", "r") as f:
75
- conversations = [json.loads(line) for line in f]
76
- return conversations
77
- return []
78
-
79
- # Function to delete selected conversations
80
- def delete_selected_conversations(selected_indices):
81
- conversations = load_conversations()
82
- remaining_conversations = [conv for i, conv in enumerate(conversations) if i not in selected_indices]
83
- with open("conversations.json", "w") as f:
84
- for conv in remaining_conversations:
85
- json.dump(conv, f)
86
- f.write("\n")
87
-
88
- # File uploader for multiple PDF and DOCX files
89
- uploaded_files = st.file_uploader("Upload PDF or DOCX files", type=["pdf", "docx"], accept_multiple_files=True)
90
-
91
- if uploaded_files and st.session_state.openai_api_key:
92
- index = load_data(uploaded_files)
93
- chat_engine = index.as_chat_engine(chat_mode="condense_question", verbose=True)
94
-
95
- # User input for questions
96
- if prompt := st.chat_input("Your question"):
97
- st.session_state.messages.append({"role": "user", "content": prompt})
98
-
99
- for message in st.session_state.messages:
100
- with st.chat_message(message["role"]):
101
- st.write(message["content"])
102
-
103
- if len(st.session_state.messages) > 0 and st.session_state.messages[-1]["role"] != "assistant":
104
- with st.chat_message("assistant"):
105
- with st.spinner("Thinking..."):
106
- response = chat_engine.chat(prompt)
107
- st.write(response.response)
108
- message = {"role": "assistant", "content": response.response}
109
- st.session_state.messages.append(message)
110
-
111
- if st.button("Save Conversation"):
112
- if st.session_state.messages:
113
- st.session_state.confirm_save = True
114
-
115
- if st.session_state.get('confirm_save', False):
116
- st.warning("Do you want to save the conversation?")
117
- col1, col2 = st.columns(2)
118
- with col1:
119
- if st.button("Yes"):
120
- save_conversation()
121
- st.success("Conversation saved!")
122
- st.session_state.confirm_save = False
123
- with col2:
124
- if st.button("No"):
125
- st.session_state.confirm_save = False
126
-
127
- if st.button("End Conversation"):
128
- st.session_state.messages = []
129
- st.success("Conversation ended. You can start a new one!")
130
-
131
- else:
132
- st.sidebar.warning("Please enter your OpenAI API key and upload PDF or DOCX files to proceed.")
133
-
134
- # Sidebar to toggle visibility of previous conversations
135
- if 'show_conversations' not in st.session_state:
136
- st.session_state.show_conversations = False
137
-
138
- if st.sidebar.button("Toggle Previous Conversations"):
139
- st.session_state.show_conversations = not st.session_state.show_conversations
140
-
141
- # Show previous conversations if the toggle is enabled
142
- if st.session_state.show_conversations:
143
- st.sidebar.subheader("Previous Conversations")
144
- conversations = load_conversations()
145
-
146
- if conversations:
147
- selected_indices = []
148
- for i, conv in enumerate(conversations):
149
- st.sidebar.write(f"Conversation {i + 1}:")
150
- for message in conv:
151
- st.sidebar.write(f"{message['role']}: {message['content']}")
152
- # Checkbox for selecting conversation to delete
153
- if st.sidebar.checkbox(f"Select Conversation {i + 1} for Deletion", key=f"delete_checkbox_{i}"):
154
- selected_indices.append(i)
155
-
156
- if st.sidebar.button("Delete Selected Conversations"):
157
- if selected_indices:
158
- delete_selected_conversations(selected_indices)
159
- st.success("Selected conversations deleted. Please Refresh to See the Effect!")
160
- st.session_state.messages = [] # Optional: reset messages for a fresh start
161
-
162
- else:
163
- st.sidebar.write("No previous conversations found.")
164
- else:
165
  st.sidebar.write("Previous conversations are hidden. Click 'Toggle Previous Conversations' to show.")
 
1
+ import streamlit as st
2
+ from llama_index.core import VectorStoreIndex, Document
3
+ from llama_index.llms.openai import OpenAI
4
+ from llama_index.core import Settings
5
+ import os
6
+ import pdfplumber
7
+ from docx import Document as DocxDocument
8
+ from dotenv import load_dotenv
9
+ import json
10
+
11
+ # Load environment variables from .env file
12
+ load_dotenv(".env")
13
+
14
+ st.header("Chat with the Streamlit docs πŸ’¬ πŸ“š")
15
+
16
+ # Sidebar for OpenAI API Key
17
+ if 'openai_api_key' not in st.session_state:
18
+ st.session_state.openai_api_key = ""
19
+
20
+ # Input for OpenAI API Key
21
+ st.session_state.openai_api_key = st.sidebar.text_input("Enter your OpenAI API Key:",
22
+ type="password",
23
+ value=st.session_state.openai_api_key)
24
+
25
+ # Initialize session state for messages
26
+ if "messages" not in st.session_state:
27
+ st.session_state.messages = [
28
+ {"role": "assistant", "content": "Ask me a question about the documents you uploaded!"}
29
+ ]
30
+
31
+ # Function to read PDF files
32
+ def read_pdf(file):
33
+ with pdfplumber.open(file) as pdf:
34
+ text = ''
35
+ for page in pdf.pages:
36
+ text += page.extract_text() + '\n'
37
+ return text
38
+
39
+ # Function to read DOCX files
40
+ def read_docx(file):
41
+ doc = DocxDocument(file)
42
+ text = ''
43
+ for paragraph in doc.paragraphs:
44
+ text += paragraph.text + '\n'
45
+ return text
46
+
47
+ @st.cache_resource(show_spinner=False)
48
+ def load_data(uploaded_files):
49
+ with st.spinner("Loading and indexing the documents – hang tight! This should take 1-2 minutes."):
50
+ docs = []
51
+ for uploaded_file in uploaded_files:
52
+ if uploaded_file.type == "application/pdf":
53
+ text = read_pdf(uploaded_file)
54
+ docs.append(Document(text=text))
55
+ elif uploaded_file.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
56
+ text = read_docx(uploaded_file)
57
+ docs.append(Document(text=text))
58
+
59
+ Settings.llm = OpenAI(model="gpt-3.5-turbo", temperature=0.5,
60
+ system_prompt="You are an expert on the Streamlit Python library and your job is to answer technical questions. Assume that all questions are related to the Streamlit Python library. Keep your answers technical and based on facts – do not hallucinate features.")
61
+
62
+ index = VectorStoreIndex.from_documents(docs, settings=Settings.llm)
63
+ return index
64
+
65
+ # Function to save the conversation
66
+ def save_conversation():
67
+ with open("conversations.json", "a") as f:
68
+ json.dump(st.session_state.messages, f)
69
+ f.write("\n")
70
+
71
+ # Function to load previous conversations
72
+ def load_conversations():
73
+ if os.path.exists("conversations.json"):
74
+ with open("conversations.json", "r") as f:
75
+ conversations = [json.loads(line) for line in f]
76
+ return conversations
77
+ return []
78
+
79
+ # Function to delete selected conversations
80
+ def delete_selected_conversations(selected_indices):
81
+ conversations = load_conversations()
82
+ remaining_conversations = [conv for i, conv in enumerate(conversations) if i not in selected_indices]
83
+ with open("conversations.json", "w") as f:
84
+ for conv in remaining_conversations:
85
+ json.dump(conv, f)
86
+ f.write("\n")
87
+
88
+ # File uploader for multiple PDF and DOCX files
89
+ uploaded_files = st.file_uploader("Upload PDF or DOCX files", type=["pdf", "docx"], accept_multiple_files=True)
90
+
91
+ if uploaded_files and st.session_state.openai_api_key:
92
+ index = load_data(uploaded_files)
93
+ chat_engine = index.as_chat_engine(chat_mode="condense_question", verbose=True)
94
+
95
+ # User input for questions
96
+ if prompt := st.chat_input("Your question"):
97
+ st.session_state.messages.append({"role": "user", "content": prompt})
98
+
99
+ for message in st.session_state.messages:
100
+ with st.chat_message(message["role"]):
101
+ st.write(message["content"])
102
+
103
+ if len(st.session_state.messages) > 0 and st.session_state.messages[-1]["role"] != "assistant":
104
+ with st.chat_message("assistant"):
105
+ with st.spinner("Thinking..."):
106
+ response = chat_engine.chat(prompt)
107
+ st.write(response.response)
108
+ message = {"role": "assistant", "content": response.response}
109
+ st.session_state.messages.append(message)
110
+
111
+ if st.button("Save Conversation"):
112
+ if st.session_state.messages:
113
+ st.session_state.confirm_save = True
114
+
115
+ if st.session_state.get('confirm_save', False):
116
+ st.warning("Do you want to save the conversation?")
117
+ col1, col2 = st.columns(2)
118
+ with col1:
119
+ if st.button("Yes"):
120
+ save_conversation()
121
+ st.success("Conversation saved!")
122
+ st.session_state.confirm_save = False
123
+ with col2:
124
+ if st.button("No"):
125
+ st.session_state.confirm_save = False
126
+
127
+ if st.button("End Conversation"):
128
+ st.session_state.messages = []
129
+ st.success("Conversation ended. You can start a new one!")
130
+
131
+ else:
132
+ st.sidebar.warning("Please enter your OpenAI API key and upload PDF or DOCX files to proceed.")
133
+
134
+ # Sidebar to toggle visibility of previous conversations
135
+ if 'show_conversations' not in st.session_state:
136
+ st.session_state.show_conversations = False
137
+
138
+ if st.sidebar.button("Toggle Previous Conversations"):
139
+ st.session_state.show_conversations = not st.session_state.show_conversations
140
+
141
+ # Show previous conversations if the toggle is enabled
142
+ if st.session_state.show_conversations:
143
+ st.sidebar.subheader("Previous Conversations")
144
+ conversations = load_conversations()
145
+
146
+ if conversations:
147
+ selected_indices = []
148
+ for i, conv in enumerate(conversations):
149
+ st.sidebar.write(f"Conversation {i + 1}:")
150
+ for message in conv:
151
+ st.sidebar.write(f"{message['role']}: {message['content']}")
152
+ # Checkbox for selecting conversation to delete
153
+ if st.sidebar.checkbox(f"Select Conversation {i + 1} for Deletion", key=f"delete_checkbox_{i}"):
154
+ selected_indices.append(i)
155
+
156
+ if st.sidebar.button("Delete Selected Conversations"):
157
+ if selected_indices:
158
+ delete_selected_conversations(selected_indices)
159
+ st.success("Selected conversations deleted. Please Refresh to See the Effect!")
160
+ st.session_state.messages = [] # Optional: reset messages for a fresh start
161
+
162
+ else:
163
+ st.sidebar.write("No previous conversations found.")
164
+ else:
165
  st.sidebar.write("Previous conversations are hidden. Click 'Toggle Previous Conversations' to show.")