Spaces:
Paused
Paused
Update app.py via AI Editor
Browse files
app.py
CHANGED
|
@@ -46,6 +46,7 @@ def decode_document(decoded_bytes):
|
|
| 46 |
def anthropic_stream_generate(prompt):
|
| 47 |
stream_result = []
|
| 48 |
try:
|
|
|
|
| 49 |
with anthropic_client.messages.create(
|
| 50 |
model=CLAUDE3_SONNET_MODEL,
|
| 51 |
max_tokens=CLAUDE3_MAX_OUTPUT_TOKENS,
|
|
@@ -57,6 +58,7 @@ def anthropic_stream_generate(prompt):
|
|
| 57 |
piece = event.delta.text
|
| 58 |
stream_result.append(piece)
|
| 59 |
logging.debug(f"Streaming piece: {piece}")
|
|
|
|
| 60 |
return ''.join(stream_result)
|
| 61 |
except Exception as e:
|
| 62 |
logging.error("Error during anthropic streaming request: %s", e)
|
|
@@ -179,8 +181,10 @@ def process_document(action, selected_filename=None, chat_input=None, selected_p
|
|
| 179 |
rfp_filename = selected_filename
|
| 180 |
generated_docname = selected_generated
|
| 181 |
if not (selected_filename and selected_filename in uploaded_documents):
|
|
|
|
| 182 |
return "No RFP/SOW/PWS/RFI document selected.", None, None
|
| 183 |
if not (selected_generated and selected_generated in generated_documents):
|
|
|
|
| 184 |
return "No generated document selected.", None, None
|
| 185 |
rfp_content = uploaded_documents[selected_filename]
|
| 186 |
gen_bytes = generated_documents[selected_generated]
|
|
@@ -208,11 +212,13 @@ def process_document(action, selected_filename=None, chat_input=None, selected_p
|
|
| 208 |
prompt += f"User additional instructions: {chat_input}\n"
|
| 209 |
prompt += f"\n---\nRFP/SOW/PWS/RFI ({rfp_filename}):\n{rfp_content}\n"
|
| 210 |
prompt += f"\n---\nGenerated Document ({generated_docname}):\n{generated_doc_content}\n"
|
| 211 |
-
logging.info("Sending proposal prompt to anthropic.
|
| 212 |
result_holder = {"text": None, "docx_bytes": None, "docx_name": None}
|
| 213 |
def thread_proposal():
|
| 214 |
try:
|
|
|
|
| 215 |
result = anthropic_stream_generate(prompt)
|
|
|
|
| 216 |
docx_bytes = save_proposal_as_docx(result, rfp_filename)
|
| 217 |
generated_docx_name = f"{os.path.splitext(rfp_filename)[0]}_{os.path.splitext(generated_docname)[0]}_proposal.docx"
|
| 218 |
result_holder["text"] = result
|
|
@@ -514,22 +520,7 @@ def master_callback(
|
|
| 514 |
'recover-action-btn', 'board-action-btn', 'loe-action-btn'
|
| 515 |
]
|
| 516 |
|
| 517 |
-
|
| 518 |
-
output_data_upload = html.Div("Generating proposal from selected documents...", style={"wordWrap": "break-word"})
|
| 519 |
-
# This is a progress placeholder, real work will happen in the next callback (Dash pattern)
|
| 520 |
-
return (
|
| 521 |
-
uploaded_doc_list,
|
| 522 |
-
doc_options,
|
| 523 |
-
doc_value,
|
| 524 |
-
proposal_options,
|
| 525 |
-
proposal_value,
|
| 526 |
-
uploaded_proposal_list,
|
| 527 |
-
generated_doc_list,
|
| 528 |
-
generated_doc_options,
|
| 529 |
-
generated_doc_value,
|
| 530 |
-
output_data_upload
|
| 531 |
-
)
|
| 532 |
-
|
| 533 |
if triggered_id in action_buttons:
|
| 534 |
result = ""
|
| 535 |
generated_docx_bytes = None
|
|
@@ -544,12 +535,16 @@ def master_callback(
|
|
| 544 |
new_selected_generated = generated_docx_name
|
| 545 |
|
| 546 |
elif triggered_id == 'proposal-action-btn':
|
|
|
|
|
|
|
|
|
|
|
|
|
| 547 |
result, generated_docx_bytes, generated_docx_name = process_document(
|
| 548 |
'proposal',
|
| 549 |
-
|
| 550 |
chat_input,
|
| 551 |
None,
|
| 552 |
-
|
| 553 |
)
|
| 554 |
if generated_docx_bytes and generated_docx_name:
|
| 555 |
generated_documents[generated_docx_name] = generated_docx_bytes
|
|
|
|
| 46 |
def anthropic_stream_generate(prompt):
|
| 47 |
stream_result = []
|
| 48 |
try:
|
| 49 |
+
logging.info("Connecting to Anthropic Claude for streaming completion...")
|
| 50 |
with anthropic_client.messages.create(
|
| 51 |
model=CLAUDE3_SONNET_MODEL,
|
| 52 |
max_tokens=CLAUDE3_MAX_OUTPUT_TOKENS,
|
|
|
|
| 58 |
piece = event.delta.text
|
| 59 |
stream_result.append(piece)
|
| 60 |
logging.debug(f"Streaming piece: {piece}")
|
| 61 |
+
logging.info("Received response from Anthropic Claude streaming.")
|
| 62 |
return ''.join(stream_result)
|
| 63 |
except Exception as e:
|
| 64 |
logging.error("Error during anthropic streaming request: %s", e)
|
|
|
|
| 181 |
rfp_filename = selected_filename
|
| 182 |
generated_docname = selected_generated
|
| 183 |
if not (selected_filename and selected_filename in uploaded_documents):
|
| 184 |
+
logging.warning("No RFP/SOW/PWS/RFI document selected for proposal action.")
|
| 185 |
return "No RFP/SOW/PWS/RFI document selected.", None, None
|
| 186 |
if not (selected_generated and selected_generated in generated_documents):
|
| 187 |
+
logging.warning("No generated document selected for proposal action.")
|
| 188 |
return "No generated document selected.", None, None
|
| 189 |
rfp_content = uploaded_documents[selected_filename]
|
| 190 |
gen_bytes = generated_documents[selected_generated]
|
|
|
|
| 212 |
prompt += f"User additional instructions: {chat_input}\n"
|
| 213 |
prompt += f"\n---\nRFP/SOW/PWS/RFI ({rfp_filename}):\n{rfp_content}\n"
|
| 214 |
prompt += f"\n---\nGenerated Document ({generated_docname}):\n{generated_doc_content}\n"
|
| 215 |
+
logging.info(f"Sending proposal prompt to anthropic. RFP: {rfp_filename}, Generated Doc: {generated_docname}")
|
| 216 |
result_holder = {"text": None, "docx_bytes": None, "docx_name": None}
|
| 217 |
def thread_proposal():
|
| 218 |
try:
|
| 219 |
+
logging.info("Connecting to Anthropic Claude for proposal streaming...")
|
| 220 |
result = anthropic_stream_generate(prompt)
|
| 221 |
+
logging.info("Received proposal results from Anthropic Claude.")
|
| 222 |
docx_bytes = save_proposal_as_docx(result, rfp_filename)
|
| 223 |
generated_docx_name = f"{os.path.splitext(rfp_filename)[0]}_{os.path.splitext(generated_docname)[0]}_proposal.docx"
|
| 224 |
result_holder["text"] = result
|
|
|
|
| 520 |
'recover-action-btn', 'board-action-btn', 'loe-action-btn'
|
| 521 |
]
|
| 522 |
|
| 523 |
+
# Fix: When "Proposal" is clicked, trigger proposal streaming with correct dropdown doc selections
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 524 |
if triggered_id in action_buttons:
|
| 525 |
result = ""
|
| 526 |
generated_docx_bytes = None
|
|
|
|
| 535 |
new_selected_generated = generated_docx_name
|
| 536 |
|
| 537 |
elif triggered_id == 'proposal-action-btn':
|
| 538 |
+
# Use the currently selected doc and generated doc from dropdowns
|
| 539 |
+
rfp_doc = selected_filename
|
| 540 |
+
gen_doc = selected_generated_dropdown_state
|
| 541 |
+
logging.info(f"Starting proposal streaming with RFP: {rfp_doc}, Generated Doc: {gen_doc}")
|
| 542 |
result, generated_docx_bytes, generated_docx_name = process_document(
|
| 543 |
'proposal',
|
| 544 |
+
rfp_doc,
|
| 545 |
chat_input,
|
| 546 |
None,
|
| 547 |
+
gen_doc
|
| 548 |
)
|
| 549 |
if generated_docx_bytes and generated_docx_name:
|
| 550 |
generated_documents[generated_docx_name] = generated_docx_bytes
|