File size: 1,916 Bytes
e1624f5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 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