doc_id: ODS-202606-002 feature_id: FEAT-202606-006-agent-semantic-interaction type: outline-design title: Agent 语义交互与命令治理概要设计 status: reviewing owner: 医梦研发团队 created_at: 2026-06-29 updated_at: 2026-07-02 reviewers:
本设计替代“模型输出 cardData、CardInstance 按 nextCard 推进业务”的链式架构。
MVP 只保留三个核心运行时概念:TaskState、可信 QueryResult 和 Command。
SemanticResponse、Presentation 都是传输/展示结构,不升级为独立业务子系统。
模型需要生成 cardKey/cardData,Card Runtime 再通过 nextCard 串联科室、医生、时段和确认。
Card 类型同时影响展示、任务推进与业务动作,查询和写操作也混在 Card Action 中。
新运行时以 TaskState 作为任务事实源;FastGPT 只规划经过 ToolCatalog 过滤的 MCP 只读查询; 查询结果形成 ResultSnapshot,并通过 SemanticResponse 完整返回文本/语音。所有副作用进入 Command Runtime,Card 只保留为可选 Presentation。
| 维度 | 改造前 | 改造后 |
|---|---|---|
| 流程驱动 | Card 类型与 nextCard |
TaskState 与业务完成条件 |
| 模型输出 | 严格 cardKey/cardData |
自然语言流 + 只读 Tool Call |
| 查询 | 固定卡片步骤 | ToolCatalog + MCP 灵活查询 |
| 写操作 | Card Action 混合执行 | Command Runtime 统一治理 |
| Card 定位 | 流程节点和状态信号 | 可选 Presentation |
| 后续 Agent | 复制卡片链 | 复用统一任务、查询和命令协议 |
flowchart TD
U["用户文本、语音或 interaction"] --> O["OpenPlatform"]
O --> T["TaskStateService"]
T --> F["FastGPT Adapter"]
F -->|"自然语言流"| A["AgentApplicationService"]
F -->|"只读 Tool Call"| M["MCP Gateway"]
M --> R["QueryResult / ResultSnapshot"]
R --> A
A --> S["SemanticResponse DTO"]
S --> P["PresentationPolicy"]
P -->|"可选"| V["无状态 Presentation"]
S -->|"需要副作用"| Q["Command Runtime"]
Q -->|"内部写工具"| M
S --> E["SSE v2"]
V --> E
Q --> E
总体原则:
本设计是后续业务智能体的公共运行时基线。新智能体必须从业务目标和状态开始设计,不从页面或 Card 开始设计:
业务目标与完成条件
→ TaskState 与约束
→ 只读 ToolCatalog/MCP
→ 有副作用的 Command 与风险策略
→ 完整文本/语音交互
→ 可选 Presentation/Card
只读型智能体无需定义业务 Command;包含锁号、挂号、缴费、取消等动作的事务型智能体必须进入 Command Runtime。两类智能体都不得创建独立的卡片工作流。
Card 是 Presentation 的一种终端表现,不是中台领域对象或 Agent 编排原语:
| Card 可以承担 | Card 不得承担 |
|---|---|
| 候选结果对比与信息分组 | 定义 Agent 步骤和先后顺序 |
| 快捷选择入口 | 作为 TaskState 或完成条件 |
| Command 确认摘要的可视化 | 生成或携带可信 Command 参数 |
| 执行结果和状态展示 | 成为文本/语音之外的唯一业务通道 |
领域 ViewModel 只能投影 ResultSnapshot 或 Command 摘要。Card 点击必须转换为标准 interaction 或 Command 确认请求,再进入与自然语言相同的后端校验链路。
| 模块 | 职责 | 不负责 |
|---|---|---|
emoon-openplatform |
对外 v2 入口、鉴权、SSE、命令确认入口 | 不保存领域状态,不直连 HIS |
emoon-ai-agent |
TaskState、FastGPT Adapter、查询结果引用、响应组装、简单展示决策 | 不直接写 HIS,不保存最终账务事实 |
emoon-ai-command(目标) |
命令状态机、风险、确认、幂等、过期、审计 | 不做模型推理,不负责普通展示 |
emoon-ai-mcp |
只读/写工具注册、权限、调用、审计和 HIS Adapter | 不处理 UI,不决定任务流程 |
emoon-system |
Agent、工具授权、场景和命令策略配置 | 不执行运行时业务 |
emoon-terminal-client |
文本/语音展示、无状态 UI、确认交互 | 不创建命令,不判断风险 |
| FastGPT | 自然语言生成、只读工具规划、RAG/Workflow 子流程 | 不持有业务事实,不执行写命令 |
当前 emoon-ai-card 在实施阶段一次性迁移为 emoon-ai-command。
用户输入
→ TaskState 提取已知约束
→ FastGPT 选择只读 MCP 工具
→ MCP 返回结构化结果
→ 保存短期 ResultSnapshot
→ 后端生成 SemanticResponse
→ SSE 先返回文本/semantic_result
→ PresentationPolicy 可选生成 presentation
自然语言“选第二个”或点击 candidate
→ interaction 解析 resultRef/version/candidateId
→ 校验候选版本、租户、患者、会话
→ 实时复核号源
→ L1 明确选择即授权
→ Command Runtime 创建并执行短期锁号
→ command_completed + task_updated
后端根据已锁号 TaskState 准备 L2 REGISTER_APPOINTMENT
→ command_prepared 返回确认摘要
→ 用户通过卡片/文本/语音确认
→ Command Runtime 复核身份、版本、有效期和幂等
→ MCP 写工具执行
→ command_completed + task_updated
| 数据 | 来源 | 保存位置 | 使用者 | 生命周期 |
|---|---|---|---|---|
| TaskState | 后端验证后的模型建议与命令事实 | ai_task_instance |
Agent、Command | 任务周期 |
| ResultSnapshot | 只读 MCP 结果的最小快照 | ai_result_snapshot |
文本、展示、交互解析 | 短期 |
| Presentation | ResultSnapshot 的无状态投影 | 不持久化或仅留审计摘要 | 终端 | 单次响应 |
| CommandInstance | 后端准备的确定性命令 | ai_command_instance |
Command Runtime、终端 | 命令周期 |
| CommandAudit | 确认、拒绝、执行与结果 | ai_command_audit_log |
审计、排障 | 按合规策略 |
PresentationPolicy 综合终端能力、结果数量、领域类型、数据完整性、风险和用户偏好。 信息展示无状态;只有命令确认会创建 CommandInstance。
MVP 不建设动态模板系统。挂号候选和挂号确认采用代码内版本化的领域 ViewModel; 场景配置只决定是否展示和终端能力,不允许上传任意 Schema 或动作脚本。
Agent 启动或配置发布时,由医梦后端从 MCP Tool Registry 生成只读 ToolCatalog:
MCP Tool Registry
→ 过滤 riskLevel=READ_ONLY
→ 校验 tenant/project/agent/scene 授权
→ 输出 name/description/inputSchema/timeout/dataClassification
→ FastGPT Adapter 注册或注入目标 App/Workflow
FastGPT 目标版本如何承载 ToolCatalog 必须先通过能力验证确定;无论采用 MCP ToolSet、 HTTP ToolSet 还是 Workflow 工具节点,写工具都不会进入该目录。
精确查询为空时,按医院配置的允许范围生成替代查询。替代结果必须显式标注放宽了哪个条件, 且只能推荐,不能自动进入命令。
每个会话只允许一个前台可变更任务。无状态问答可以插入;切换业务任务时暂停原任务。 暂停不延长锁号有效期。
| 风险 | 控制 |
|---|---|
| FastGPT 工具调用不稳定 | 引擎能力门禁、Schema 校验、只读权限、文本降级 |
| 展示与文本不一致 | 两者引用同一 ResultSnapshot |
| 号源过期 | 锁号前重新查询,ResultSnapshot 不作为执行凭证 |
| 命令重复执行 | commandId + 幂等键 + HIS 状态查询 |
| 终端伪造命令 | 命令只能由后端准备,终端只能确认/拒绝 |
| 配置降低安全要求 | 平台固定风险下限,租户只能收紧 |
本设计改变模块边界、接口主版本、数据模型和 FastGPT/MCP 权限边界,必须由
ADR-202606-001 记录并在开发前批准。