#region AgentChat.UxDecisions [C:3] [TYPE ADR] [SEMANTICS ux,decisions,agent-chat,native-stack]
@defgroup Ux UX design decisions — revised for LangChain v1 native stack + Gradio native features. Replaces prior decisions.md.
Screen: Agent Chat Panel
Phase 1 — Screen Decomposition
| Decision |
Choice |
Rationale |
| Navigation |
C — Гибрид: drawer 420px + кнопка «Развернуть» → /agent |
Быстрые вопросы в drawer; сложные на /agent |
| Layout |
B — Две колонки на /agent, одно колоночное в drawer |
Структурированно для /agent, drawer компактный |
| Data density |
B — Infinite scroll для сообщений и диалогов + поиск |
Для активного оператора с 50+ диалогами |
Phase 2 — State Exhaustion
| Decision |
Choice |
Rationale |
| Чипсы примеров |
A — Только в новом пустом диалоге |
Welcome-зона. Gradio examples рендерит их нативно |
| Cancel |
A — Единая кнопка Stop с момента отправки. submission.cancel() |
Нативный Gradio cancel |
| Confirmation timeout |
A — Карточка остаётся, кнопки заблокированы, «Повторить» |
Явный контроль |
| Reconnect |
A — 5×5s, затем disconnected_permanent + ручная кнопка |
Предсказуемо |
| Ошибка истории |
A — Сразу ошибка, без кэша |
Консистентность |
| Multi-tab |
A — Client-side gate: GET /api/agent/conversations/{id}/active перед отправкой. Отклоняет вторую вкладку |
Просто, без server-push. concurrency_limit=1 на Gradio исключает гонки |
Phase 3 — Interaction Design
| Decision |
Choice |
Rationale |
| Отправка |
Gradio submit() с additional_inputs=[conversation_id] |
Нативный механизм. RunnableWithMessageHistory загружает историю автоматически |
| Stop |
submission.cancel() — optimistic UI |
Нативный Gradio cancel. Частичный текст сохранён |
| Подтверждение |
Second submit() с __resume__ + __action__. In-memory pending interrupts в handler |
Два submit() к одному стриму. HumanInTheLoopMiddleware + чекпоинт |
Phase 4 — API Design
| Decision |
Choice |
Rationale |
| Транспорт |
Gradio submit() через nginx proxy. Structured JSON metadata (ChatMessage.metadata.type) |
Нулевой custom код. LangGraph события → структурированные объекты |
| Диалоги REST |
Плоский список с сервера, группировка на клиенте |
API не зависит от визуализации |
Rejected Alternatives
- Custom WebSocket protocol — rejected: @gradio/client не raw WebSocket
- REST confirmation endpoints — rejected: HumanInTheLoopMiddleware + resume protocol проще
- Ручная передача history — rejected: RunnableWithMessageHistory делает автоматически
- Active/follower multi-tab — rejected: client-side gate + concurrency_limit=1 достаточно
- @assistant_tool registry для новых тулов — rejected: нативные @tool функции LangChain
#endregion AgentChat.UxDecisions