Spaces:
Paused
Paused
Update app.py via AI Editor
Browse files
app.py
CHANGED
@@ -162,7 +162,7 @@ def process_document(action, selected_filename=None, chat_input=None):
|
|
162 |
if chat_input:
|
163 |
prompt += f"User additional instructions: {chat_input}\n"
|
164 |
prompt += f"\nFile Name: {selected_filename}\n\n"
|
165 |
-
result_holder = {"text": None, "
|
166 |
def thread_shred():
|
167 |
global shredded_document
|
168 |
shredded_document = ""
|
@@ -173,8 +173,8 @@ def process_document(action, selected_filename=None, chat_input=None):
|
|
173 |
logging.info("Document shredded successfully.")
|
174 |
docx_bytes = save_shredded_as_docx(result, selected_filename)
|
175 |
generated_docx_name = f"{os.path.splitext(selected_filename)[0]}_shredded.docx"
|
|
|
176 |
result_holder["text"] = result
|
177 |
-
result_holder["docx_bytes"] = docx_bytes
|
178 |
result_holder["docx_name"] = generated_docx_name
|
179 |
except Exception as e:
|
180 |
shredded_document = f"Error during shredding: {e}"
|
@@ -184,13 +184,10 @@ def process_document(action, selected_filename=None, chat_input=None):
|
|
184 |
t = Thread(target=thread_shred)
|
185 |
t.start()
|
186 |
t.join()
|
187 |
-
if result_holder["
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
except Exception as e:
|
192 |
-
logging.error(f"Error adding shredded docx to uploaded_documents: {e}")
|
193 |
-
return result_holder["text"], result_holder["docx_bytes"], result_holder["docx_name"], result_holder["text"]
|
194 |
|
195 |
elif action == 'generate':
|
196 |
if not shredded_document:
|
@@ -204,7 +201,7 @@ def process_document(action, selected_filename=None, chat_input=None):
|
|
204 |
if chat_input:
|
205 |
prompt += f"User additional instructions: {chat_input}\n"
|
206 |
prompt += f"\nFile Name: {selected_filename}\n\n{shredded_document}"
|
207 |
-
result_holder = {"text": None, "
|
208 |
def thread_generate():
|
209 |
global generated_response
|
210 |
generated_response = ""
|
@@ -215,8 +212,8 @@ def process_document(action, selected_filename=None, chat_input=None):
|
|
215 |
logging.info("Proposal response generated successfully.")
|
216 |
docx_bytes = save_proposal_as_docx(result, selected_filename)
|
217 |
generated_docx_name = f"{os.path.splitext(selected_filename)[0]}_proposal.docx"
|
|
|
218 |
result_holder["text"] = result
|
219 |
-
result_holder["docx_bytes"] = docx_bytes
|
220 |
result_holder["docx_name"] = generated_docx_name
|
221 |
except Exception as e:
|
222 |
generated_response = f"Error during generation: {e}"
|
@@ -226,7 +223,7 @@ def process_document(action, selected_filename=None, chat_input=None):
|
|
226 |
t = Thread(target=thread_generate)
|
227 |
t.start()
|
228 |
t.join()
|
229 |
-
return result_holder["text"],
|
230 |
|
231 |
elif action == 'proposal':
|
232 |
if not doc_content:
|
@@ -244,7 +241,7 @@ def process_document(action, selected_filename=None, chat_input=None):
|
|
244 |
prompt += f"User additional instructions: {chat_input}\n"
|
245 |
prompt += f"\n---\nRFP/SOW/PWS/RFI ({rfp_filename}):\n{doc_content}\n"
|
246 |
logging.info(f"Sending proposal prompt to Gemini. RFP: {rfp_filename}")
|
247 |
-
result_holder = {"text": None, "
|
248 |
def thread_proposal():
|
249 |
try:
|
250 |
logging.info("Connecting to Gemini for proposal.")
|
@@ -252,8 +249,8 @@ def process_document(action, selected_filename=None, chat_input=None):
|
|
252 |
logging.info("Received proposal results from Gemini.")
|
253 |
docx_bytes = save_proposal_as_docx(response, rfp_filename)
|
254 |
generated_docx_name = f"{os.path.splitext(rfp_filename)[0]}_proposal.docx"
|
|
|
255 |
result_holder["text"] = response
|
256 |
-
result_holder["docx_bytes"] = docx_bytes
|
257 |
result_holder["docx_name"] = generated_docx_name
|
258 |
except Exception as e:
|
259 |
logging.error("Error during Gemini proposal request: %s", e)
|
@@ -261,7 +258,7 @@ def process_document(action, selected_filename=None, chat_input=None):
|
|
261 |
t = Thread(target=thread_proposal)
|
262 |
t.start()
|
263 |
t.join()
|
264 |
-
return result_holder["text"],
|
265 |
|
266 |
elif action == 'compliance':
|
267 |
return "Compliance checking not implemented yet.", None, None, None
|
@@ -347,8 +344,8 @@ def get_ctx_input_n_clicks(ctx, idx):
|
|
347 |
return []
|
348 |
|
349 |
app.layout = dbc.Container([
|
350 |
-
dcc.Store(id='shred-store', data={'text': None, '
|
351 |
-
dcc.Store(id='proposal-store', data={'text': None, '
|
352 |
dbc.Row([
|
353 |
dbc.Col([
|
354 |
dbc.Card([
|
@@ -514,8 +511,8 @@ def master_callback(
|
|
514 |
|
515 |
upload_triggered = False
|
516 |
|
517 |
-
shred_store = {'text': None, '
|
518 |
-
proposal_store = {'text': None, '
|
519 |
|
520 |
rfp_delete_clicks = safe_get_n_clicks(ctx, 4)
|
521 |
proposal_delete_clicks = safe_get_n_clicks(ctx, 8)
|
@@ -628,14 +625,10 @@ def master_callback(
|
|
628 |
|
629 |
if triggered_id == 'shred-action-btn':
|
630 |
output_data_upload = dcc.Loading(type="default", children=html.Div("Shredding document...", style={"wordWrap": "break-word"}))
|
631 |
-
shred_text,
|
632 |
-
shred_store = {'text': shred_text, '
|
633 |
-
|
634 |
-
if
|
635 |
-
shredded_documents[shredded_docx_name] = shredded_docx_bytes
|
636 |
-
logging.info(f"Shredded docx saved: {shredded_docx_name}")
|
637 |
-
if shredded_docx_name not in uploaded_documents:
|
638 |
-
uploaded_documents[shredded_docx_name] = shredded_text
|
639 |
doc_options = [{'label': fn, 'value': fn} for fn in uploaded_documents.keys()]
|
640 |
doc_value = shredded_docx_name if shredded_docx_name in uploaded_documents else (next(iter(uploaded_documents), None) if uploaded_documents else None)
|
641 |
uploaded_doc_list = get_uploaded_doc_list(uploaded_documents)
|
@@ -650,11 +643,10 @@ def master_callback(
|
|
650 |
|
651 |
if triggered_id == 'proposal-action-btn':
|
652 |
output_data_upload = dcc.Loading(type="default", children=html.Div("Generating proposal...", style={"wordWrap": "break-word"}))
|
653 |
-
proposal_text,
|
654 |
-
proposal_store = {'text': proposal_text, '
|
655 |
new_generated_doc_value = generated_doc_value
|
656 |
-
if
|
657 |
-
generated_documents[proposal_docx_name] = proposal_docx_bytes
|
658 |
generated_doc_options = [{'label': fn, 'value': fn} for fn in generated_documents.keys()]
|
659 |
new_generated_doc_value = proposal_docx_name if proposal_docx_name in generated_documents else (next(iter(generated_documents), None) if generated_documents else None)
|
660 |
generated_doc_list = get_generated_doc_list(generated_documents)
|
|
|
162 |
if chat_input:
|
163 |
prompt += f"User additional instructions: {chat_input}\n"
|
164 |
prompt += f"\nFile Name: {selected_filename}\n\n"
|
165 |
+
result_holder = {"text": None, "docx_name": None}
|
166 |
def thread_shred():
|
167 |
global shredded_document
|
168 |
shredded_document = ""
|
|
|
173 |
logging.info("Document shredded successfully.")
|
174 |
docx_bytes = save_shredded_as_docx(result, selected_filename)
|
175 |
generated_docx_name = f"{os.path.splitext(selected_filename)[0]}_shredded.docx"
|
176 |
+
shredded_documents[generated_docx_name] = docx_bytes
|
177 |
result_holder["text"] = result
|
|
|
178 |
result_holder["docx_name"] = generated_docx_name
|
179 |
except Exception as e:
|
180 |
shredded_document = f"Error during shredding: {e}"
|
|
|
184 |
t = Thread(target=thread_shred)
|
185 |
t.start()
|
186 |
t.join()
|
187 |
+
if result_holder["docx_name"] and result_holder["text"]:
|
188 |
+
if result_holder["docx_name"] not in uploaded_documents:
|
189 |
+
uploaded_documents[result_holder["docx_name"]] = result_holder["text"]
|
190 |
+
return result_holder["text"], None, result_holder["docx_name"], result_holder["text"]
|
|
|
|
|
|
|
191 |
|
192 |
elif action == 'generate':
|
193 |
if not shredded_document:
|
|
|
201 |
if chat_input:
|
202 |
prompt += f"User additional instructions: {chat_input}\n"
|
203 |
prompt += f"\nFile Name: {selected_filename}\n\n{shredded_document}"
|
204 |
+
result_holder = {"text": None, "docx_name": None}
|
205 |
def thread_generate():
|
206 |
global generated_response
|
207 |
generated_response = ""
|
|
|
212 |
logging.info("Proposal response generated successfully.")
|
213 |
docx_bytes = save_proposal_as_docx(result, selected_filename)
|
214 |
generated_docx_name = f"{os.path.splitext(selected_filename)[0]}_proposal.docx"
|
215 |
+
generated_documents[generated_docx_name] = docx_bytes
|
216 |
result_holder["text"] = result
|
|
|
217 |
result_holder["docx_name"] = generated_docx_name
|
218 |
except Exception as e:
|
219 |
generated_response = f"Error during generation: {e}"
|
|
|
223 |
t = Thread(target=thread_generate)
|
224 |
t.start()
|
225 |
t.join()
|
226 |
+
return result_holder["text"], None, result_holder["docx_name"], result_holder["text"]
|
227 |
|
228 |
elif action == 'proposal':
|
229 |
if not doc_content:
|
|
|
241 |
prompt += f"User additional instructions: {chat_input}\n"
|
242 |
prompt += f"\n---\nRFP/SOW/PWS/RFI ({rfp_filename}):\n{doc_content}\n"
|
243 |
logging.info(f"Sending proposal prompt to Gemini. RFP: {rfp_filename}")
|
244 |
+
result_holder = {"text": None, "docx_name": None}
|
245 |
def thread_proposal():
|
246 |
try:
|
247 |
logging.info("Connecting to Gemini for proposal.")
|
|
|
249 |
logging.info("Received proposal results from Gemini.")
|
250 |
docx_bytes = save_proposal_as_docx(response, rfp_filename)
|
251 |
generated_docx_name = f"{os.path.splitext(rfp_filename)[0]}_proposal.docx"
|
252 |
+
generated_documents[generated_docx_name] = docx_bytes
|
253 |
result_holder["text"] = response
|
|
|
254 |
result_holder["docx_name"] = generated_docx_name
|
255 |
except Exception as e:
|
256 |
logging.error("Error during Gemini proposal request: %s", e)
|
|
|
258 |
t = Thread(target=thread_proposal)
|
259 |
t.start()
|
260 |
t.join()
|
261 |
+
return result_holder["text"], None, result_holder["docx_name"], result_holder["text"]
|
262 |
|
263 |
elif action == 'compliance':
|
264 |
return "Compliance checking not implemented yet.", None, None, None
|
|
|
344 |
return []
|
345 |
|
346 |
app.layout = dbc.Container([
|
347 |
+
dcc.Store(id='shred-store', data={'text': None, 'docx_name': None}),
|
348 |
+
dcc.Store(id='proposal-store', data={'text': None, 'docx_name': None}),
|
349 |
dbc.Row([
|
350 |
dbc.Col([
|
351 |
dbc.Card([
|
|
|
511 |
|
512 |
upload_triggered = False
|
513 |
|
514 |
+
shred_store = {'text': None, 'docx_name': None}
|
515 |
+
proposal_store = {'text': None, 'docx_name': None}
|
516 |
|
517 |
rfp_delete_clicks = safe_get_n_clicks(ctx, 4)
|
518 |
proposal_delete_clicks = safe_get_n_clicks(ctx, 8)
|
|
|
625 |
|
626 |
if triggered_id == 'shred-action-btn':
|
627 |
output_data_upload = dcc.Loading(type="default", children=html.Div("Shredding document...", style={"wordWrap": "break-word"}))
|
628 |
+
shred_text, _, shredded_docx_name, shredded_text = process_document('shred', doc_value, chat_input)
|
629 |
+
shred_store = {'text': shred_text, 'docx_name': shredded_docx_name}
|
630 |
+
|
631 |
+
if shredded_docx_name:
|
|
|
|
|
|
|
|
|
632 |
doc_options = [{'label': fn, 'value': fn} for fn in uploaded_documents.keys()]
|
633 |
doc_value = shredded_docx_name if shredded_docx_name in uploaded_documents else (next(iter(uploaded_documents), None) if uploaded_documents else None)
|
634 |
uploaded_doc_list = get_uploaded_doc_list(uploaded_documents)
|
|
|
643 |
|
644 |
if triggered_id == 'proposal-action-btn':
|
645 |
output_data_upload = dcc.Loading(type="default", children=html.Div("Generating proposal...", style={"wordWrap": "break-word"}))
|
646 |
+
proposal_text, _, proposal_docx_name, proposal_text_preview = process_document('proposal', doc_value, chat_input)
|
647 |
+
proposal_store = {'text': proposal_text, 'docx_name': proposal_docx_name}
|
648 |
new_generated_doc_value = generated_doc_value
|
649 |
+
if proposal_docx_name:
|
|
|
650 |
generated_doc_options = [{'label': fn, 'value': fn} for fn in generated_documents.keys()]
|
651 |
new_generated_doc_value = proposal_docx_name if proposal_docx_name in generated_documents else (next(iter(generated_documents), None) if generated_documents else None)
|
652 |
generated_doc_list = get_generated_doc_list(generated_documents)
|