awacke1 commited on
Commit
eb289fa
Β·
1 Parent(s): 952b643

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +104 -72
app.py CHANGED
@@ -8,7 +8,6 @@ import mistune
8
  import pytz
9
  import math
10
  import requests
11
- import pandas as pd
12
 
13
  from datetime import datetime
14
  from openai import ChatCompletion
@@ -17,46 +16,22 @@ from bs4 import BeautifulSoup
17
  from collections import deque
18
  from audio_recorder_streamlit import audio_recorder
19
 
20
- openai.api_key = os.getenv('OPENAI_KEY')
21
- st.set_page_config(page_title="GPT Streamlit Document Reasoner",layout="wide")
22
-
23
- menu = ["txt", "htm", "md", "py", "csv", "xlsx"]
24
- choice = st.sidebar.selectbox("Output File Type:", menu)
25
- model_choice = st.sidebar.radio("Select Model:", ('gpt-3.5-turbo', 'gpt-3.5-turbo-0301'))
26
-
27
  def generate_filename(prompt, file_type):
28
  central = pytz.timezone('US/Central')
29
  safe_date_time = datetime.now(central).strftime("%m%d_%I%M")
30
  safe_prompt = "".join(x for x in prompt if x.isalnum())[:45]
31
  return f"{safe_date_time}_{safe_prompt}.{file_type}"
32
 
33
- TEMPERATURE = st.sidebar.slider("Adjust Creativity:", min_value=0.1, max_value=1.0, value=0.5, step=0.1)
34
  def chat_with_model(prompt, document_section):
35
  model = model_choice
36
  conversation = [{'role': 'system', 'content': 'You are a helpful assistant.'}]
37
  conversation.append({'role': 'user', 'content': prompt})
38
- conversation.append({'role': 'assistant', 'content': document_section})
39
- response = openai.ChatCompletion.create(model=model, messages=conversation, temperature=TEMPERATURE)
 
 
40
  return response['choices'][0]['message']['content']
41
 
42
- def create_file(filename, prompt, response):
43
- if filename.endswith(".txt"):
44
- with open(filename, 'w') as file:
45
- file.write(f"Prompt:\n{prompt}\nResponse:\n{response}")
46
- elif filename.endswith(".htm"):
47
- with open(filename, 'w') as file:
48
- file.write(f"<h1>Prompt:</h1> <p>{prompt}</p> <h1>Response:</h1> <p>{response}</p>")
49
- elif filename.endswith(".md"):
50
- with open(filename, 'w') as file:
51
- file.write(f"# Prompt:\n{prompt}\n# Response:\n{response}")
52
- elif filename.endswith(".csv"):
53
- response_df = pd.DataFrame({"Prompt": [prompt], "Response": [response]})
54
- response_df.to_csv(filename, index=False)
55
- elif filename.endswith(".xlsx"):
56
- response_df = pd.DataFrame({"Prompt": [prompt], "Response": [response]})
57
- response_df.to_excel(filename, index=False)
58
-
59
- # Updated to auto process transcript to chatgpt in AI pipeline from Whisper to ChatGPT
60
  def transcribe_audio(openai_key, file_path, model):
61
  OPENAI_API_URL = "https://api.openai.com/v1/audio/transcriptions"
62
  headers = {
@@ -66,19 +41,18 @@ def transcribe_audio(openai_key, file_path, model):
66
  data = {'file': f}
67
  response = requests.post(OPENAI_API_URL, headers=headers, files=data, data={'model': model})
68
  if response.status_code == 200:
69
- st.write('Reasoning with your transcription..')
70
- transcript=response.json().get('text')
71
- st.write(transcript)
72
- gptResponse = chat_with_model(transcript, '') # send transcript to ChatGPT
73
- filename = generate_filename(transcript, choice) # auto name file with date and prompt per output file type
74
- create_file(filename, transcript, gptResponse) # write output file
75
- return gptResponse
76
  else:
77
  st.write(response.json())
78
  st.error("Error in API call.")
79
  return None
80
 
81
- # Updated to call direct from transcription to chat inference.
82
  def save_and_play_audio(audio_recorder):
83
  audio_bytes = audio_recorder()
84
  if audio_bytes:
@@ -87,20 +61,21 @@ def save_and_play_audio(audio_recorder):
87
  f.write(audio_bytes)
88
  st.audio(audio_bytes, format="audio/wav")
89
  return filename
90
- USEAUDIO=False
91
- if USEAUDIO:
92
- if st.sidebar.checkbox('Use Audio Input'):
93
- filename = save_and_play_audio(audio_recorder)
94
- if filename is not None:
95
- #if st.button("Transcribe"):
96
- transcription = transcribe_audio(openai.api_key, filename, "whisper-1")
97
- st.markdown('### Transcription:')
98
- st.write(transcription)
99
-
100
 
 
 
 
 
 
 
 
 
 
 
 
101
  def truncate_document(document, length):
102
  return document[:length]
103
-
104
  def divide_document(document, max_length):
105
  return [document[i:i+max_length] for i in range(0, len(document), max_length)]
106
 
@@ -112,8 +87,12 @@ def get_table_download_link(file_path):
112
  ext = os.path.splitext(file_name)[1] # get the file extension
113
  if ext == '.txt':
114
  mime_type = 'text/plain'
115
- elif ext == '.wav':
116
- mime_type = 'audio/x-wav'
 
 
 
 
117
  elif ext == '.htm':
118
  mime_type = 'text/html'
119
  elif ext == '.md':
@@ -148,24 +127,47 @@ def read_file_content(file,max_length):
148
  return content
149
  elif file.type == "text/plain":
150
  return file.getvalue().decode()
151
- elif file.type == "text/csv":
152
- df = pd.read_csv(file)
153
- return df.to_string(index=False)
154
- elif file.type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
155
- df = pd.read_excel(file)
156
- return df.to_string(index=False)
157
  else:
158
  return ""
159
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160
  def main():
161
- # max_length = 12000 - optimal for gpt35 turbo. 2x=24000 for gpt4. 8x=96000 for gpt4-32k.
162
- max_length = st.sidebar.slider("File section length for large files", min_value=1000, max_value=128000, value=12000, step=1000)
163
-
164
- colprompt, colupload = st.columns([5,2]) # adjust the ratio as needed
165
- with colprompt:
166
- user_prompt = st.text_area("Enter prompts, instructions & questions:", '', height=150)
167
  with colupload:
168
- uploaded_file = st.file_uploader("Add a file for context:", type=["xml", "json", "html", "htm", "txt"])
169
 
170
  document_sections = deque()
171
  document_responses = {}
@@ -188,7 +190,7 @@ def main():
188
  else:
189
  if st.button(f"Chat about Section {i+1}"):
190
  st.write('Reasoning with your inputs...')
191
- response = chat_with_model(user_prompt, section)
192
  st.write('Response:')
193
  st.write(response)
194
  document_responses[i] = response
@@ -198,7 +200,7 @@ def main():
198
 
199
  if st.button('πŸ’¬ Chat'):
200
  st.write('Reasoning with your inputs...')
201
- response = chat_with_model(user_prompt, ''.join(list(document_sections)))
202
  st.write('Response:')
203
  st.write(response)
204
 
@@ -209,18 +211,48 @@ def main():
209
  all_files = glob.glob("*.*")
210
  all_files = [file for file in all_files if len(os.path.splitext(file)[0]) >= 20] # exclude files with short names
211
  all_files.sort(key=lambda x: (os.path.splitext(x)[1], x), reverse=True) # sort by file type and file name in descending order
212
-
 
 
 
213
  for file in all_files:
214
- col1, col3 = st.sidebar.columns([5,1]) # adjust the ratio as needed
215
  with col1:
216
- try:
217
- st.markdown(get_table_download_link(file), unsafe_allow_html=True)
218
- except Exception as e:
219
- st.error(f"Error occurred while processing file {file}: {str(e)}")
 
 
220
  with col3:
 
 
 
 
 
 
 
 
 
 
221
  if st.button("πŸ—‘", key="delete_"+file):
222
  os.remove(file)
223
  st.experimental_rerun()
224
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
225
  if __name__ == "__main__":
226
  main()
 
8
  import pytz
9
  import math
10
  import requests
 
11
 
12
  from datetime import datetime
13
  from openai import ChatCompletion
 
16
  from collections import deque
17
  from audio_recorder_streamlit import audio_recorder
18
 
 
 
 
 
 
 
 
19
  def generate_filename(prompt, file_type):
20
  central = pytz.timezone('US/Central')
21
  safe_date_time = datetime.now(central).strftime("%m%d_%I%M")
22
  safe_prompt = "".join(x for x in prompt if x.isalnum())[:45]
23
  return f"{safe_date_time}_{safe_prompt}.{file_type}"
24
 
 
25
  def chat_with_model(prompt, document_section):
26
  model = model_choice
27
  conversation = [{'role': 'system', 'content': 'You are a helpful assistant.'}]
28
  conversation.append({'role': 'user', 'content': prompt})
29
+ if len(document_section)>0:
30
+ conversation.append({'role': 'assistant', 'content': document_section})
31
+ response = openai.ChatCompletion.create(model=model, messages=conversation)
32
+ #return response
33
  return response['choices'][0]['message']['content']
34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  def transcribe_audio(openai_key, file_path, model):
36
  OPENAI_API_URL = "https://api.openai.com/v1/audio/transcriptions"
37
  headers = {
 
41
  data = {'file': f}
42
  response = requests.post(OPENAI_API_URL, headers=headers, files=data, data={'model': model})
43
  if response.status_code == 200:
44
+ st.write(response.json())
45
+
46
+ response2 = chat_with_model(response.json().get('text'), '') # *************************************
47
+ st.write('Responses:')
48
+ #st.write(response)
49
+ st.write(response2)
50
+ return response.json().get('text')
51
  else:
52
  st.write(response.json())
53
  st.error("Error in API call.")
54
  return None
55
 
 
56
  def save_and_play_audio(audio_recorder):
57
  audio_bytes = audio_recorder()
58
  if audio_bytes:
 
61
  f.write(audio_bytes)
62
  st.audio(audio_bytes, format="audio/wav")
63
  return filename
64
+ return None
 
 
 
 
 
 
 
 
 
65
 
66
+ def create_file(filename, prompt, response):
67
+ if filename.endswith(".txt"):
68
+ with open(filename, 'w') as file:
69
+ file.write(f"{prompt}\n{response}")
70
+ elif filename.endswith(".htm"):
71
+ with open(filename, 'w') as file:
72
+ file.write(f"{prompt} {response}")
73
+ elif filename.endswith(".md"):
74
+ with open(filename, 'w') as file:
75
+ file.write(f"{prompt}\n\n{response}")
76
+
77
  def truncate_document(document, length):
78
  return document[:length]
 
79
  def divide_document(document, max_length):
80
  return [document[i:i+max_length] for i in range(0, len(document), max_length)]
81
 
 
87
  ext = os.path.splitext(file_name)[1] # get the file extension
88
  if ext == '.txt':
89
  mime_type = 'text/plain'
90
+ elif ext == '.py':
91
+ mime_type = 'text/plain'
92
+ elif ext == '.xlsx':
93
+ mime_type = 'text/plain'
94
+ elif ext == '.csv':
95
+ mime_type = 'text/plain'
96
  elif ext == '.htm':
97
  mime_type = 'text/html'
98
  elif ext == '.md':
 
127
  return content
128
  elif file.type == "text/plain":
129
  return file.getvalue().decode()
 
 
 
 
 
 
130
  else:
131
  return ""
132
 
133
+
134
+
135
+ def chat_with_file_contents(prompt, file_content):
136
+ conversation = [{'role': 'system', 'content': 'You are a helpful assistant.'}]
137
+ conversation.append({'role': 'user', 'content': prompt})
138
+ if len(file_content)>0:
139
+ conversation.append({'role': 'assistant', 'content': file_content})
140
+ response = openai.ChatCompletion.create(model=model_choice, messages=conversation)
141
+ return response['choices'][0]['message']['content']
142
+
143
+
144
+ # Sidebar and global
145
+ openai.api_key = os.getenv('OPENAI_KEY')
146
+ st.set_page_config(page_title="GPT Streamlit Document Reasoner",layout="wide")
147
+ menu = ["htm", "txt", "xlsx", "csv", "md", "py"] #619
148
+ choice = st.sidebar.selectbox("Output File Type:", menu)
149
+ model_choice = st.sidebar.radio("Select Model:", ('gpt-3.5-turbo', 'gpt-3.5-turbo-0301'))
150
+
151
+ # Audio, transcribe, GPT:
152
+ filename = save_and_play_audio(audio_recorder)
153
+ if filename is not None:
154
+ transcription = transcribe_audio(openai.api_key, filename, "whisper-1")
155
+ st.write(transcription)
156
+ gptOutput = chat_with_model(transcription, '') # *************************************
157
+ filename = generate_filename(transcription, choice)
158
+ create_file(filename, transcription, gptOutput)
159
+ st.sidebar.markdown(get_table_download_link(filename), unsafe_allow_html=True)
160
+
161
+
162
  def main():
163
+ user_prompt = st.text_area("Enter prompts, instructions & questions:", '', height=100)
164
+
165
+ collength, colupload = st.columns([2,3]) # adjust the ratio as needed
166
+ with collength:
167
+ #max_length = 12000 - optimal for gpt35 turbo. 2x=24000 for gpt4. 8x=96000 for gpt4-32k.
168
+ max_length = st.slider("File section length for large files", min_value=1000, max_value=128000, value=12000, step=1000)
169
  with colupload:
170
+ uploaded_file = st.file_uploader("Add a file for context:", type=["xml", "json", "xlsx","csv","html", "htm", "md", "txt"])
171
 
172
  document_sections = deque()
173
  document_responses = {}
 
190
  else:
191
  if st.button(f"Chat about Section {i+1}"):
192
  st.write('Reasoning with your inputs...')
193
+ response = chat_with_model(user_prompt, section) # *************************************
194
  st.write('Response:')
195
  st.write(response)
196
  document_responses[i] = response
 
200
 
201
  if st.button('πŸ’¬ Chat'):
202
  st.write('Reasoning with your inputs...')
203
+ response = chat_with_model(user_prompt, ''.join(list(document_sections))) # *************************************
204
  st.write('Response:')
205
  st.write(response)
206
 
 
211
  all_files = glob.glob("*.*")
212
  all_files = [file for file in all_files if len(os.path.splitext(file)[0]) >= 20] # exclude files with short names
213
  all_files.sort(key=lambda x: (os.path.splitext(x)[1], x), reverse=True) # sort by file type and file name in descending order
214
+
215
+ # sidebar of files
216
+ file_contents=''
217
+ next_action=''
218
  for file in all_files:
219
+ col1, col2, col3, col4, col5 = st.sidebar.columns([1,6,1,1,1]) # adjust the ratio as needed
220
  with col1:
221
+ if st.button("🌐", key="md_"+file): # md emoji button
222
+ with open(file, 'r') as f:
223
+ file_contents = f.read()
224
+ next_action='md'
225
+ with col2:
226
+ st.markdown(get_table_download_link(file), unsafe_allow_html=True)
227
  with col3:
228
+ if st.button("πŸ“‚", key="open_"+file): # open emoji button
229
+ with open(file, 'r') as f:
230
+ file_contents = f.read()
231
+ next_action='open'
232
+ with col4:
233
+ if st.button("πŸ”", key="read_"+file): # search emoji button
234
+ with open(file, 'r') as f:
235
+ file_contents = f.read()
236
+ next_action='search'
237
+ with col5:
238
  if st.button("πŸ—‘", key="delete_"+file):
239
  os.remove(file)
240
  st.experimental_rerun()
241
+
242
+ if len(file_contents) > 0:
243
+ if next_action=='open':
244
+ file_content_area = st.text_area("File Contents:", file_contents, height=500)
245
+ if next_action=='md':
246
+ st.markdown(file_contents)
247
+ if next_action=='search':
248
+ file_content_area = st.text_area("File Contents:", file_contents, height=500)
249
+ st.write('Reasoning with your inputs...')
250
+ response = chat_with_file_contents(user_prompt, file_contents)
251
+ st.write('Response:')
252
+ st.write(response)
253
+ filename = generate_filename(file_content_area, choice)
254
+ create_file(filename, file_content_area, response)
255
+ st.sidebar.markdown(get_table_download_link(filename), unsafe_allow_html=True)
256
+
257
  if __name__ == "__main__":
258
  main()