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)
|