架构¶
模块依赖¶
flowchart BT
chat["ai-elements-chat<br/>model · ChatEvent · ChatBackend · ChatController"]
core["ai-elements-core<br/>protocols · model APIs · agent loop · MCP · skills · auth"] --> chat
ui["ai-elements-ui<br/>Compose elements"] --> chat
genui["ai-elements-genui<br/>A2UI · JSX"] --> ui
apps["ai-elements-mcp-apps"] --> ui
apps --> core
a2a["ai-elements-a2a"] --> core
acp["ai-elements-acp"] --> core
koog["ai-elements-koog"] --> core
harness["harness-*"] --> core
ai-elements-chat:与协议无关的聊天模型(类似 AI SDKUIMessage)、ChatEvent、ChatBackend、ChatController(类似useChat);无网络、无 Compose。ai-elements-core:协议客户端(AI SDK、AG-UI)、模型 API、Agent 循环、子 Agent、技能、MCP、OAuth;分别提供ChatBackend或能力。ai-elements-ui:Compose 组件,只依赖 chat,因此可渲染任意 backend,包括自定义实现。- 可选模块:提供更重的依赖或其他运行时,包括基于官方 Java SDK 的 A2A、官方 Kotlin SDK 的 ACP、Koog、应用内 harness 能力、生成式 UI、MCP Apps。
新增协议应在 core 或独立模块中实现 ChatBackend,无需修改 UI。
数据流¶
sequenceDiagram
participant UI as Elements
participant C as ChatController
participant B as ChatBackend
participant A as Agent / model
UI->>C: send("…")
C->>B: stream(history)
B->>A: protocol request
A-->>B: protocol events
B-->>C: ChatEvent (TextDelta, ToolInputAvailable, …)
C-->>UI: ChatState (messages, parts)
B->>C: approver.decide(toolCallId)
C-->>UI: Confirmation
UI->>C: respondToApproval(…)
C-->>B: ToolDecision
ChatController 通过 MessageReducer 将事件归并为消息并发布 ChatState,排队处理运行中发送的消息,保存重新生成回复的分支及 checkpoint,同时实现 backend 所需的 ToolApprover。
UI 与协议无关¶
组件只渲染进程内模型,不导入协议、provider、Agent 或 MCP 代码,也不解释工具名称和协议约定。Part 的含义由上游设置:设备端工具声明或 core 协议映射设置 ToolPart.kind(Function、Delegation、Skill)与 ToolPart.source;共享状态为 DataPart.STATE。LayeringTest 单元测试约束这一分层。
core 包结构¶
chat(controller、event、reducer)、model、protocol.aisdk / protocol.agui、provider.*(模型 API)、http(内部传输辅助)、agent(工具、能力、循环、子 Agent)、mcp、skills、auth、config。依赖向下:protocol 和 provider 使用 chat、agent、http、model,不允许反向依赖。