| # ADR-005: LangGraph Streaming Migration & ChatGPT-style UI |
|
|
| **Date:** 2026-05-08 |
| **Status:** Accepted |
| **Deciders:** Máximo López Chenlo |
|
|
| ## Context |
|
|
| The OncoAgent UI was a static, one-shot dashboard using `agent_graph.invoke()` which blocked the Gradio event loop for the entire multi-agent pipeline duration (Router → RAG → Specialist ↔ Critic → Formatter). This caused: |
|
|
| 1. **UI freezing** during inference (10-60s depending on model tier and RAG complexity) |
| 2. **No conversational iteration** — oncologists could not ask follow-up questions |
| 3. **Dropdown transparency bug** in Gradio's dark theme making model selection unreadable |
| 4. **Monolithic CSS** embedded in `app.py` hurting maintainability |
|
|
| ## Decision |
|
|
| 1. **Replace `invoke()` with `stream(stream_mode="updates")`**: LangGraph's streaming API emits `{node_name: output_dict}` events as each node completes, enabling real-time progress display. |
| |
| 2. **ChatGPT-style layout**: Sidebar (session controls, KPIs, evidence tabs) + main chat area, following modern AI assistant conventions. |
| |
| 3. **CSS module extraction**: Moved all styling to `ui/styles.py` for separation of concerns. |
| |
| 4. **Dropdown fix**: Added 30+ explicit CSS selectors targeting Gradio's internal dropdown classes with solid backgrounds. |
| |
| ## Consequences |
| |
| ### Positive |
| - Zero perceived latency — UI updates node-by-node |
| - Conversational memory enables iterative clinical dialogue |
| - Cleaner code architecture (styles separated from logic) |
| - Fixed visual accessibility bug in model selector |
| |
| ### Negative |
| - Streaming requires generator functions, slightly more complex handler logic |
| - More CSS selectors to maintain for Gradio version upgrades |
| |
| ## Alternatives Considered |
| |
| - **WebSocket-based streaming**: Too complex for Gradio's architecture |
| - **Polling-based progress**: Higher latency, more server load |
| - **Streamlit migration**: Would require full rewrite of all UI logic |
| |