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
|