| |
| """Financial summary panel.""" |
|
|
| from __future__ import annotations |
|
|
| import gradio as gr |
|
|
| from core.bootstrap import get_summarizer_service |
|
|
| SUMMARY_TYPES = [ |
| ("Financial", "financial"), |
| ("Executive", "executive"), |
| ("Risk", "risk"), |
| ] |
| TYPE_MAP = {label: value for label, value in SUMMARY_TYPES} |
|
|
|
|
| def run_summary(document_id: str | None, summary_type: str) -> str: |
| if not document_id: |
| return "Select a document first." |
| result = get_summarizer_service().summarize( |
| document_id=document_id, |
| summary_type=summary_type, |
| ) |
| if "error" in result: |
| return f"**Error:** {result['error']}" |
| return result.get("summary", "") |
|
|
|
|
| def build_summary_panel() -> dict: |
| with gr.Column(elem_classes=["fs-modal-card", "fs-summary-card"]): |
| gr.HTML( |
| """ |
| <div class="fs-modal-header"> |
| <div> |
| <h2>Financial Summary</h2> |
| <p>Generate executive, financial, or risk summaries</p> |
| </div> |
| </div> |
| """, |
| padding=False, |
| ) |
| doc_dropdown = gr.Dropdown(label="Document", choices=[], interactive=True) |
| summary_type = gr.Radio( |
| label=None, |
| show_label=False, |
| choices=[label for label, _ in SUMMARY_TYPES], |
| value=SUMMARY_TYPES[0][0], |
| elem_classes=["fs-pill-radio"], |
| ) |
| run_btn = gr.Button("Generate Summary", elem_classes=["fs-gold-btn", "fs-full-btn"]) |
| output = gr.Markdown(label=None, elem_classes=["fs-summary-output"]) |
|
|
| run_btn.click( |
| lambda doc_id, label: run_summary(doc_id, TYPE_MAP.get(label, "financial")), |
| inputs=[doc_dropdown, summary_type], |
| outputs=[output], |
| queue=True, |
| ) |
|
|
| return { |
| "doc_dropdown": doc_dropdown, |
| "summary_type": summary_type, |
| "output": output, |
| "run_btn": run_btn, |
| } |
|
|