Spaces:
Paused
Paused
Update app.py via AI Editor
Browse files
app.py
CHANGED
@@ -199,9 +199,9 @@ def get_left_col_content():
|
|
199 |
'overflowY': 'auto'
|
200 |
},
|
201 |
rows=5,
|
202 |
-
wrap='soft'
|
|
|
203 |
),
|
204 |
-
dcc.Store(id="chat-input-rows", data=5),
|
205 |
dbc.Row([
|
206 |
dbc.Col(
|
207 |
dbc.Button("Send", id="btn-send-chat", color="primary", className="mb-3 w-100"),
|
@@ -292,8 +292,8 @@ def get_right_col_content(selected_type, shred_doc, pink_doc, pink_review_doc, r
|
|
292 |
loaded_preview = markdown_narrative_preview(red_doc) if red_doc else html.Div("No Red document loaded.")
|
293 |
elif src == "red_review":
|
294 |
label = "Red Review"
|
295 |
-
store_var =
|
296 |
-
loaded_preview =
|
297 |
elif src == "gold":
|
298 |
label = "Gold Document"
|
299 |
store_var = gold_doc
|
@@ -359,6 +359,7 @@ app.layout = dbc.Container([
|
|
359 |
dcc.Store(id='store-gold-review'),
|
360 |
dcc.Store(id='store-loe'),
|
361 |
dcc.Store(id='store-virtual-board'),
|
|
|
362 |
dbc.Row([
|
363 |
dbc.Col(
|
364 |
html.H2(id='main-title', className="mt-3 mb-2", style={'textAlign': 'center', 'width':'100%'}),
|
@@ -477,22 +478,95 @@ def handle_shred_upload(upload_contents, upload_filenames, existing_files, curre
|
|
477 |
)
|
478 |
], id={'type': 'file-row', 'index': name}, align="center", className="mb-1")
|
479 |
)
|
|
|
480 |
return files_display, new_shred, markdown_table_preview(new_shred), ""
|
481 |
return files_display, new_shred, markdown_table_preview(new_shred) if new_shred else html.Div("No Shred document loaded."), ""
|
482 |
|
483 |
@app.callback(
|
484 |
-
Output(
|
485 |
-
|
486 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
487 |
prevent_initial_call=True
|
488 |
)
|
489 |
-
def
|
490 |
-
|
491 |
-
|
492 |
-
|
493 |
-
|
494 |
-
|
495 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
496 |
|
497 |
if __name__ == '__main__':
|
498 |
print("Starting the Dash application...")
|
|
|
199 |
'overflowY': 'auto'
|
200 |
},
|
201 |
rows=5,
|
202 |
+
wrap='soft',
|
203 |
+
autoFocus=True
|
204 |
),
|
|
|
205 |
dbc.Row([
|
206 |
dbc.Col(
|
207 |
dbc.Button("Send", id="btn-send-chat", color="primary", className="mb-3 w-100"),
|
|
|
292 |
loaded_preview = markdown_narrative_preview(red_doc) if red_doc else html.Div("No Red document loaded.")
|
293 |
elif src == "red_review":
|
294 |
label = "Red Review"
|
295 |
+
store_var = red_review_doc
|
296 |
+
loaded_preview = markdown_table_preview(red_review_doc) if red_review_doc else html.Div("No Red Review document loaded.")
|
297 |
elif src == "gold":
|
298 |
label = "Gold Document"
|
299 |
store_var = gold_doc
|
|
|
359 |
dcc.Store(id='store-gold-review'),
|
360 |
dcc.Store(id='store-loe'),
|
361 |
dcc.Store(id='store-virtual-board'),
|
362 |
+
dcc.Store(id='store-generated-doc'),
|
363 |
dbc.Row([
|
364 |
dbc.Col(
|
365 |
html.H2(id='main-title', className="mt-3 mb-2", style={'textAlign': 'center', 'width':'100%'}),
|
|
|
478 |
)
|
479 |
], id={'type': 'file-row', 'index': name}, align="center", className="mb-1")
|
480 |
)
|
481 |
+
logging.info("Shred document uploaded and stored.")
|
482 |
return files_display, new_shred, markdown_table_preview(new_shred), ""
|
483 |
return files_display, new_shred, markdown_table_preview(new_shred) if new_shred else html.Div("No Shred document loaded."), ""
|
484 |
|
485 |
@app.callback(
|
486 |
+
Output('document-preview', 'children'),
|
487 |
+
Output('store-generated-doc', 'data'),
|
488 |
+
Output('loading-output', 'children'),
|
489 |
+
Input({'type': 'btn-generate-doc', 'index': ALL}, 'n_clicks'),
|
490 |
+
State('selected-doc-type', 'data'),
|
491 |
+
State('store-shred', 'data'),
|
492 |
+
State('store-pink', 'data'),
|
493 |
+
State('store-pink-review', 'data'),
|
494 |
+
State('store-red', 'data'),
|
495 |
+
State('store-red-review', 'data'),
|
496 |
+
State('store-gold', 'data'),
|
497 |
+
State('store-gold-review', 'data'),
|
498 |
+
State('store-loe', 'data'),
|
499 |
+
State('store-virtual-board', 'data'),
|
500 |
prevent_initial_call=True
|
501 |
)
|
502 |
+
def generate_document(n_clicks, selected_type, shred, pink, pink_review, red, red_review, gold, gold_review, loe, virtual_board):
|
503 |
+
ctx = callback_context
|
504 |
+
if not ctx.triggered or not any(n_clicks):
|
505 |
+
raise dash.exceptions.PreventUpdate
|
506 |
+
logging.info(f"Generating document for type: {selected_type}")
|
507 |
+
# Gather necessary documents
|
508 |
+
inputs = {
|
509 |
+
"shred": shred,
|
510 |
+
"pink": pink,
|
511 |
+
"pink_review": pink_review,
|
512 |
+
"red": red,
|
513 |
+
"red_review": red_review,
|
514 |
+
"gold": gold,
|
515 |
+
"gold_review": gold_review,
|
516 |
+
"loe": loe,
|
517 |
+
"virtual_board": virtual_board
|
518 |
+
}
|
519 |
+
prompt = document_types.get(selected_type, "")
|
520 |
+
# Compose context for Gemini
|
521 |
+
context = ""
|
522 |
+
if selected_type in doc_dependencies:
|
523 |
+
for dep in doc_dependencies[selected_type]["source"]:
|
524 |
+
context += f"\n\n{dep.upper()}:\n{inputs.get(dep, '')}"
|
525 |
+
else:
|
526 |
+
context += f"\n\n{inputs.get('shred','')}"
|
527 |
+
full_prompt = f"{prompt}\n\n{context}"
|
528 |
+
# Gemini API call (threaded for responsiveness)
|
529 |
+
result_holder = {}
|
530 |
+
def gemini_thread():
|
531 |
+
try:
|
532 |
+
model = genai.GenerativeModel(GEMINI_MODEL)
|
533 |
+
response = model.generate_content(full_prompt, stream=False)
|
534 |
+
result_holder['result'] = response.text if hasattr(response, 'text') else str(response)
|
535 |
+
logging.info("Gemini document generated successfully.")
|
536 |
+
except Exception as e:
|
537 |
+
logging.error(f"Error with Gemini API: {str(e)}")
|
538 |
+
result_holder['result'] = f"Error generating document: {str(e)}"
|
539 |
+
t = threading.Thread(target=gemini_thread)
|
540 |
+
t.start()
|
541 |
+
t.join(timeout=60)
|
542 |
+
generated_doc = result_holder.get('result', 'Error: No document generated.')
|
543 |
+
# Store and preview
|
544 |
+
if selected_type in spreadsheet_types:
|
545 |
+
preview = markdown_table_preview(generated_doc)
|
546 |
+
else:
|
547 |
+
preview = markdown_narrative_preview(generated_doc)
|
548 |
+
logging.info("Document preview updated.")
|
549 |
+
return preview, generated_doc, ""
|
550 |
+
|
551 |
+
@app.callback(
|
552 |
+
Output("download-document", "data"),
|
553 |
+
Input("btn-download", "n_clicks"),
|
554 |
+
State('selected-doc-type', 'data'),
|
555 |
+
State('store-generated-doc', 'data'),
|
556 |
+
prevent_initial_call=True
|
557 |
+
)
|
558 |
+
def download_document(n_clicks, selected_type, generated_doc):
|
559 |
+
if not generated_doc:
|
560 |
+
logging.warning("No generated document to download.")
|
561 |
+
return dash.no_update
|
562 |
+
if selected_type in spreadsheet_types:
|
563 |
+
xlsx_io = markdown_tables_to_xlsx(generated_doc)
|
564 |
+
logging.info("Spreadsheet document prepared for download.")
|
565 |
+
return dcc.send_bytes(xlsx_io.getvalue(), filename=f"{selected_type}_output.xlsx")
|
566 |
+
else:
|
567 |
+
content = generated_doc.encode('utf-8')
|
568 |
+
logging.info("Narrative document prepared for download.")
|
569 |
+
return dcc.send_bytes(content, filename=f"{selected_type}_output.md")
|
570 |
|
571 |
if __name__ == '__main__':
|
572 |
print("Starting the Dash application...")
|