# state.py """Shared Gradio state helpers.""" from __future__ import annotations from typing import List, Literal, Optional SearchMode = Literal["all", "single"] AppMode = Literal["qa", "summary", "ocr", "entities", "documents"] MODE_LABELS: dict[AppMode, str] = { "qa": "Finance QA Chatbot", "summary": "Financial Summary", "ocr": "Document OCR", "entities": "Entity Extraction", "documents": "Documents", } def default_search_mode() -> SearchMode: return "all" def default_app_mode() -> AppMode: return "qa" def default_selected_doc_ids() -> List[str]: return [] def default_session_id() -> Optional[str]: return None def mode_label(search_mode: SearchMode) -> str: return "Hybrid RAG" if search_mode == "all" else "Single Document" def center_title(app_mode: AppMode, search_mode: SearchMode) -> str: if app_mode == "qa": return mode_label(search_mode) return MODE_LABELS[app_mode] def footer_hint( search_mode: SearchMode, selected_doc_ids: List[str], doc_count: int | None = None, app_mode: AppMode = "qa", ) -> str: if app_mode == "documents": indexed = doc_count if doc_count is not None else 0 return f"Drop a file above or click Upload & index · {indexed} doc(s) indexed" if app_mode != "qa": return "Tap + to switch features or upload documents" base = "Enter sends · Shift+Enter newline" mode_key = "hybrid" if search_mode == "all" else "single" if search_mode == "single": n = len(selected_doc_ids) if selected_doc_ids else 0 return f"{base} · Mode: {mode_key} · {n} doc(s) selected" if selected_doc_ids: return f"{base} · Mode: {mode_key} · {len(selected_doc_ids)} doc(s) scoped for RAG" indexed = doc_count if doc_count is not None else 0 return f"{base} · Mode: {mode_key} · {indexed} doc(s) indexed" DEFAULT_FOOTER = footer_hint("all", [], 0) WELCOME_MESSAGE = ( "Hello! I'm **FinSight AI**. Upload a financial document and ask me anything about it — " "earnings reports, balance sheets, risk disclosures, or OCR extraction." ) EMPTY_STATE_HTML = """
Upload financial documents and ask questions about revenue, balance sheets, and more.