1
0

2 Commits 675e8d65f8 ... 734cd2835f

Autor SHA1 Nachricht Datum
  WangKang 734cd2835f docs: 完善 FastGPT 接入技术方案 vor 1 Monat
  WangKang 91d4555bcf 整理感知动线视频脚本与本地工具配置 vor 1 Monat

+ 7 - 0
.gitignore

@@ -63,3 +63,10 @@ openspec
 
 back-info/*
 .env
+
+reasonix.toml
+.reasonix
+video
+
+.cursor
+.codegraph

+ 43 - 0
CLAUDE.md

@@ -0,0 +1,43 @@
+<!-- superpowers-zh:begin (do not edit between these markers) -->
+# Superpowers-ZH 中文增强版
+
+本项目已安装 superpowers-zh 技能框架(20 个 skills)。
+
+## 核心规则
+
+1. **收到任务时,先检查是否有匹配的 skill** — 哪怕只有 1% 的可能性也要检查
+2. **设计先于编码** — 收到功能需求时,先用 brainstorming skill 做需求分析
+3. **测试先于实现** — 写代码前先写测试(TDD)
+4. **验证先于完成** — 声称完成前必须运行验证命令
+
+## 可用 Skills
+
+Skills 位于 `.claude/skills/` 目录,每个 skill 有独立的 `SKILL.md` 文件。
+
+- **brainstorming**: 在任何创造性工作之前必须使用此技能——创建功能、构建组件、添加功能或修改行为。在实现之前先探索用户意图、需求和设计。
+- **chinese-code-review**: 中文 review 沟通参考——话术模板、分级标注(必须修复/建议修改/仅供参考)、国内团队常见反模式应对。仅在用户显式 /chinese-code-review 时调用,不要根据上下文自动触发。
+- **chinese-commit-conventions**: 中文 commit 与 changelog 配置参考——Conventional Commits 中文适配、commitlint/husky/commitizen 中文模板、conventional-changelog 中文配置。仅在用户显式 /chinese-commit-conventions 时调用,不要根据上下文自动触发。
+- **chinese-documentation**: 中文文档排版参考——中英文空格、全半角标点、术语保留、链接格式、中文文案排版指北约定。仅在用户显式 /chinese-documentation 时调用,不要根据上下文自动触发。
+- **chinese-git-workflow**: 国内 Git 平台配置参考——Gitee、Coding.net、极狐 GitLab、CNB 的 SSH/HTTPS/凭据/CI 接入差异与镜像同步配置。仅在用户显式 /chinese-git-workflow 时调用,不要根据上下文自动触发。
+- **dispatching-parallel-agents**: 当面对 2 个以上可以独立进行、无共享状态或顺序依赖的任务时使用
+- **executing-plans**: 当你有一份书面实现计划需要在单独的会话中执行,并设有审查检查点时使用
+- **finishing-a-development-branch**: 当实现完成、所有测试通过、需要决定如何集成工作时使用——通过提供合并、PR 或清理等结构化选项来引导开发工作的收尾
+- **mcp-builder**: MCP 服务器构建方法论 — 系统化构建生产级 MCP 工具,让 AI 助手连接外部能力
+- **receiving-code-review**: 收到代码审查反馈后、实施建议之前使用,尤其当反馈不明确或技术上有疑问时——需要技术严谨性和验证,而非敷衍附和或盲目执行
+- **requesting-code-review**: 完成任务、实现重要功能或合并前使用,用于验证工作成果是否符合要求
+- **subagent-driven-development**: 当在当前会话中执行包含独立任务的实现计划时使用
+- **systematic-debugging**: 遇到任何 bug、测试失败或异常行为时使用,在提出修复方案之前执行
+- **test-driven-development**: 在实现任何功能或修复 bug 时使用,在编写实现代码之前
+- **using-git-worktrees**: 当需要开始与当前工作区隔离的功能开发或执行实现计划之前使用——创建具有智能目录选择和安全验证的隔离 git 工作树
+- **using-superpowers**: 在开始任何对话时使用——确立如何查找和使用技能,要求在任何响应(包括澄清性问题)之前调用 Skill 工具
+- **verification-before-completion**: 在宣称工作完成、已修复或测试通过之前使用,在提交或创建 PR 之前——必须运行验证命令并确认输出后才能声称成功;始终用证据支撑断言
+- **workflow-runner**: 在 Claude Code / OpenClaw / Cursor 中直接运行 agency-orchestrator YAML 工作流——无需 API key,使用当前会话的 LLM 作为执行引擎。当用户提供 .yaml 工作流文件或要求多角色协作完成任务时触发。
+- **writing-plans**: 当你有规格说明或需求用于多步骤任务时使用,在动手写代码之前
+- **writing-skills**: 当创建新技能、编辑现有技能或在部署前验证技能是否有效时使用
+
+## 如何使用
+
+当任务匹配某个 skill 时,使用 `Skill` 工具加载对应 skill 并严格遵循其流程。绝不要用 Read 工具读取 SKILL.md 文件。
+
+如果你认为哪怕只有 1% 的可能性某个 skill 适用于你正在做的事情,你必须调用该 skill 检查。
+<!-- superpowers-zh:end -->

+ 134 - 0
docs/superpowers/specs/2026-06-05-perception-journey-video-script.md

@@ -0,0 +1,134 @@
+# 医梦 AI 未来医院 · 感知动线视频脚本 v2
+
+| 项目 | 内容 |
+| --- | --- |
+| 视频标题 | 医梦 AI 未来医院 — 感知驱动、动线引领、服务主动找人 |
+| 时长 | 约 55 秒 |
+| 风格 | 三屏分屏叙事(护士站 25% + 统一入口客户端 50% + 诊室屏 25%),黑边分隔 |
+| 品牌色 | 深色 `#2b1f99`、浅色 `#3ad4d8` |
+| 患者名称 | 医小梦(核心患者,全流程追踪) |
+| 医院 | 空海医院 |
+| 目标科室 | 神经内科(301 诊室) |
+| 目标医生 | 李明(主任医师) |
+
+## 三个屏幕的角色定义
+
+### 护士站(左屏 25%)
+科室共用设备,显示全院门诊患者总览。
+- **静态患者**(全程不变):王建国(神经内科,就诊中)、李秀英(呼吸内科,候诊中)、赵大伟(神经内科,候诊中)、钱晓红(消化内科,候诊中)
+- **核心患者 医小梦**:随流程更新状态
+
+### 统一入口客户端(中屏 50%)
+患者端主交互界面,三栏布局。参照 idle-v2.html 原型。
+
+### 诊室屏(右屏 25%)
+神经内科诊区共用电子屏(301 诊室),不是某位医生的个人设备。
+- **标题**:神经内科诊区 · 301诊室
+- **静态患者**(全程不变):王建国(A018,就诊中)、李秀英(A019,候诊)、赵大伟(A020,候诊)、钱晓红(A021,候诊)
+- **核心患者 医小梦**:仅在挂号神经内科后才出现在列表中,随流程更新状态
+- **底部**:当前就诊患者
+
+---
+
+## 第一幕:开场亮相(0:00 - 0:05)
+
+三屏同时从全黑淡入。
+
+### 中央主屏
+患者未识别,感知 L0。快捷入口灰色不可用。底部 CTA「绑定设备,开启感知服务」。右侧动线区仅「入院」高亮。
+
+### 护士站
+标题「门诊患者总览」。列表显示 4 位静态患者。底部统计:在线设备 0 · 今日接诊 4。
+
+### 诊室屏
+标题「神经内科诊区 · 301诊室」。列表显示 4 位静态患者(王建国就诊中,其余候诊)。医小梦不在列表中。底部显示当前就诊:王建国。
+
+**旁白**:患者来到医院门诊大厅,打开统一入口客户端。此时系统尚不知道他是谁,感知等级为 L0。护士站和诊室屏上已有其他患者,一切正常运转。
+
+---
+
+## 第二幕:感知绑定(0:05 - 0:14)
+
+### 中央主屏
+NFC 碰一碰 → 身份识别 → 感知 L0→L1。患者名更新为「医小梦」。快捷入口点亮。AI 推送问候卡片。
+
+### 护士站
+医小梦插入列表(顶部,带青色左边条高亮):已入院 · 门诊大厅。静态患者不变。在线设备:1 · 今日接诊:5。
+
+### 诊室屏
+医小梦**不在列表中**(未挂神经内科)。右上角弹出小通知「新患者入院 · 医小梦」,2 秒后消失。静态患者不变。
+
+**旁白**:医小梦 NFC 碰一碰,身份绑定。感知从 L0 升级到 L1。统一数字身份在全院设备间同步——护士站收到入院事件,诊室屏感知到新患者但暂不加入本科室列表。
+
+---
+
+## 第三幕:AI 多轮导诊挂号(0:14 - 0:32)
+
+### 阶段 3.1:症状输入 & AI 追问(0:14 - 0:19)
+- 中央主屏:患者输入"我头疼三天,还有点恶心" → AI 追问"有没有伴随发热、视物模糊?"
+- 护士站:医小梦 → 导诊中
+
+### 阶段 3.2:患者回应(0:19 - 0:22)
+- 中央主屏:患者"没有发热,就是头疼恶心想吐"
+- 护士站:医小梦 → AI 分析症状中
+
+### 阶段 3.3:科室推荐(0:22 - 0:26)
+- 中央主屏:AI 弹出科室选择卡——推荐「神经内科(专长头痛眩晕)」,备选「普通内科(综合初筛)」;患者点击「神经内科」
+- 护士站:医小梦 → 选择科室:神经内科
+
+### 阶段 3.4:医生选择(0:26 - 0:29)
+- 中央主屏:AI 列出神经内科可约医生——李明 主任医师(10:30 有号)、王芳 副主任医师(11:00 有号);患者点击「李明 主任医师」
+- 护士站:医小梦 → 选择医生:李明
+
+### 阶段 3.5:确认挂号(0:29 - 0:32)
+- 中央主屏:确认卡——神经内科 · 李明 主任医师 · 10:30 · 301诊室 · ¥25;点击确认 → 🎉 挂号成功
+- 护士站:医小梦 → 已挂号 · A023 · 10:30
+- **诊室屏**:医小梦首次出现在患者列表中(带青色左边条高亮)——`医小梦 · 李明 · A023 · 10:30 · 待签到`
+
+**旁白**:医小梦说出症状。AI 多轮追问后,给出科室和医生建议,医小梦自主选择。挂号完成——医小梦正式加入神经内科队列,诊室屏首次出现她的名字。
+
+---
+
+## 第四幕:动线推进 → 诊区签到(0:32 - 0:43)
+
+### 阶段 4.1:位置感知触发(0:32 - 0:36)
+- 中央主屏:位置感知变化 → "已进入神经内科诊区"
+- 护士站:医小梦位置 → 神经内科诊区
+- 诊室屏:医小梦标记「已到达诊区」
+
+### 阶段 4.2:主动签到(0:36 - 0:40)
+- 中央主屏:系统推送签到卡片 → 患者点击「一键签到」 → 签到成功
+- 护士站:医小梦 → 候诊中 · 第 23 位
+- 诊室屏:医小梦 → 候诊中 A023。底部当前就诊更新。
+
+### 阶段 4.3:候诊就绪(0:40 - 0:43)
+- 中央主屏:显示候诊卡——当前叫号 019,预计等候 15 分钟
+- 三屏稳定显示候诊状态
+
+**旁白**:动线推进到诊区签到。系统感知位置,主动推送签到卡片。护士站和诊室屏同步刷新——医小梦已在队列中。
+
+---
+
+## 第五幕:结尾定版(0:43 - 0:55)
+
+三屏汇聚缩小、淡出。品牌理念文字淡入:「感知 → 动线 → AI 调度 → 服务外显」。「患者少找路、少找窗口、少找设备」。EMOON · 医梦 Logo 淡入定版。
+
+**旁白**:感知知道谁在、在哪、该做什么。动线判断下一步该去哪里。AI 中台调度智能体。统一入口客户端让一切服务外显。医梦 AI 未来医院——服务主动找人,患者少走一步。
+
+---
+
+## 三屏联动总表
+
+| 时间 | 统一入口客户端 | 护士站(医小梦) | 诊室屏(医小梦) |
+|------|--------------|----------------|-----------------|
+| 0-5s | 未识别,L0 | (不在列表中) | (不在列表中) |
+| 6.5s | NFC绑定,身份=医小梦 | 已入院 · 门诊大厅 | 不在列表中(通知浮现后消失) |
+| 14-19s | AI追问症状 | 导诊中 | 不在列表中 |
+| 19-22s | 患者回应 | AI分析中 | 不在列表中 |
+| 22-26s | 科室选择 → 神经内科 | 选择科室:神经内科 | 不在列表中 |
+| 26-29s | 医生选择 → 李明 | 选择医生:李明 | 不在列表中 |
+| 29-32s | 确认挂号成功 A023 | 已挂号 · A023 · 10:30 | 加入列表:A023 · 待签到 |
+| 32-36s | 位置感知:已到诊区 | 位置→神经内科诊区 | 已到达诊区 |
+| 36-40s | 一键签到成功 | 候诊中 · 第23位 | 候诊中 A023 |
+| 40-43s | 候诊卡显示 | 候诊中 | 候诊中 |
+| 43-55s | 品牌定版 | — | — |

+ 563 - 0
docs/superpowers/specs/perception-journey-demo.html

@@ -0,0 +1,563 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>医梦 AI 未来医院 · 感知动线故事板</title>
+<style>
+:root {
+  --accent: #2b1f99; --accent-light: #3ad4d8;
+  --bg: #f5f3fb; --surface: #ffffff; --fg: #1a1835; --muted: #7a7698; --border: #e6e3f0;
+  --warn: #f0a020; --warn-bg: #fff8e8; --warn-text: #735b14;
+  --radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; --radius-pill: 9999px;
+}
+*{margin:0;padding:0;box-sizing:border-box}
+html{-webkit-text-size-adjust:100%}
+body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC',system-ui,sans-serif;font-size:14px;background:#0a0a14;color:var(--fg);overflow:hidden;height:100vh;display:flex;flex-direction:column}
+
+.timeline-bar{height:26px;background:var(--accent);display:flex;align-items:center;padding:0 14px;gap:8px;flex-shrink:0}
+.tl-act{font-size:9px;color:rgba(255,255,255,.65);font-weight:500;letter-spacing:.03em;white-space:nowrap}
+.tl-steps{display:flex;gap:3px;flex:1}
+.tl-step{flex:1;height:3px;border-radius:2px;background:rgba(255,255,255,.2);transition:all .4s}
+.tl-step.active{background:#fff;box-shadow:0 0 6px rgba(255,255,255,.4)}
+.tl-step.done{background:rgba(255,255,255,.5)}
+.tl-time{font-size:9px;color:rgba(255,255,255,.65);font-weight:500;font-variant-numeric:tabular-nums}
+
+.app-shell{display:grid;grid-template-columns:21% 58% 21%;flex:1;min-height:0;padding:4px 6px 6px 6px;gap:5px;background:var(--bg)}
+.panel{border-radius:var(--radius-md);overflow:hidden;border:1px solid var(--border);background:var(--surface);display:flex;flex-direction:column;min-height:0}
+.ph{height:32px;display:flex;align-items:center;padding:0 10px;border-bottom:1px solid var(--border);flex-shrink:0;gap:5px}
+.ph .pi{width:16px;height:16px;border-radius:4px;display:grid;place-items:center;font-size:9px;flex-shrink:0}
+.ph .pt{font-size:10px;font-weight:600;color:var(--fg)}
+.ph .ps{font-size:8px;color:var(--muted);margin-left:auto}
+
+.pb{padding:8px;flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:6px;background:var(--bg);font-size:10px}
+
+.ns-stats{display:flex;gap:4px}
+.ns-stat{flex:1;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);padding:6px;text-align:center}
+.ns-num{font-size:14px;font-weight:700;color:var(--accent)}
+.ns-lbl{font-size:7px;color:var(--muted);margin-top:1px}
+.ns-sec{font-size:8px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin-top:2px}
+.ns-patient{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);padding:6px 8px;display:flex;flex-direction:column;gap:2px;transition:all .5s}
+.ns-patient.highlight{border-color:var(--accent-light);box-shadow:0 0 0 1px var(--accent-light)}
+.np-row{display:flex;align-items:center;gap:5px}
+.np-name{font-size:11px;font-weight:600}
+.np-tag{font-size:7px;padding:1px 5px;border-radius:var(--radius-pill);font-weight:500}
+.np-tag.w{background:color-mix(in oklch,var(--warn) 12%,transparent);color:var(--warn-text)}
+.np-tag.ok{background:color-mix(in oklch,var(--accent-light) 12%,transparent);color:var(--accent)}
+.np-tag.done{background:color-mix(in oklch,var(--accent) 8%,transparent);color:var(--accent)}
+.np-detail{font-size:8px;color:var(--muted);display:flex;gap:6px;flex-wrap:wrap}
+.ns-notif{font-size:8px;padding:4px 7px;border-radius:var(--radius-sm);background:color-mix(in oklch,var(--accent) 5%,transparent);color:var(--accent);display:flex;align-items:center;gap:4px;border-left:2px solid var(--accent-light);animation:fadeUp .4s}
+
+.center-body{flex:1;display:flex;flex-direction:column;min-height:0;background:var(--surface);position:relative}
+.uc-topbar{height:34px;display:flex;align-items:center;padding:0 12px;border-bottom:1px solid var(--border);gap:6px;flex-shrink:0}
+.uc-logo{font-size:10px;font-weight:600;color:var(--accent);display:flex;align-items:center;gap:4px;white-space:nowrap}
+.uc-div{width:1px;height:14px;background:var(--border)}
+.uc-id{font-size:9px;color:var(--muted);display:flex;align-items:center;gap:3px}
+.uc-scene{padding:1px 6px;border-radius:var(--radius-pill);font-size:7px;font-weight:600;background:color-mix(in oklch,var(--accent) 8%,transparent);color:var(--accent)}
+.uc-perc{display:flex;align-items:center;gap:4px;margin-left:auto;font-size:7px}
+.ptag{border-radius:var(--radius-pill);padding:1px 5px;font-weight:500}
+.ptag.l0{background:color-mix(in oklch,var(--warn) 12%,transparent);color:var(--warn-text)}
+.ptag.l1{background:color-mix(in oklch,var(--accent) 8%,transparent);color:var(--accent)}
+.ptag.off{background:color-mix(in oklch,var(--muted) 8%,transparent);color:var(--muted)}
+
+.uc-main{flex:1;display:flex;min-height:0}
+.uc-left{width:170px;border-right:1px solid var(--border);padding:10px 8px;display:flex;flex-direction:column;gap:8px;overflow-y:auto;flex-shrink:0;background:var(--surface)}
+.uc-avatar{width:40px;height:40px;border-radius:50%;background:var(--accent);display:grid;place-items:center;margin:0 auto}
+.uc-avatar svg{width:22px;height:22px;stroke:#fff;stroke-width:2;fill:none}
+.uc-assist-info{text-align:center;font-size:10px}
+.uc-assist-name{font-weight:600;font-size:11px}
+.uc-assist-tag{font-size:8px;color:var(--muted);margin-top:1px}
+.uc-sep{height:0;border-top:1px solid var(--border);margin:0 -2px}
+.uc-label{font-size:7px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-weight:600}
+.uc-ex{font-size:9px;padding:4px 6px;background:var(--bg);border-radius:var(--radius-sm);color:var(--muted)}
+.uc-qbtn{font-size:9px;padding:4px 7px;border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--muted);display:flex;align-items:center;gap:4px;transition:all .2s}
+.uc-qbtn.on{color:var(--fg)}
+.uc-bind{padding:7px;border:1px dashed var(--accent);border-radius:var(--radius-md);background:color-mix(in oklch,var(--accent) 4%,transparent);text-align:center;margin-top:auto}
+.uc-bind .ub-title{font-size:9px;font-weight:500;color:var(--accent)}
+.uc-bind .ub-desc{font-size:7px;color:var(--muted);margin:3px 0 5px 0;line-height:1.3}
+.btn-sm{font-size:8px;padding:4px 10px;border-radius:var(--radius-pill);font-weight:500;cursor:pointer;transition:all .15s}
+.btn-primary{background:var(--accent);color:#fff;border:none}
+.btn-secondary{border:1px solid var(--border);color:var(--muted);background:var(--surface)}
+
+.uc-center{flex:1;display:flex;flex-direction:column;min-height:0;background:var(--bg)}
+.uc-chat-h{height:28px;display:flex;align-items:center;padding:0 10px;border-bottom:1px solid var(--border);flex-shrink:0;background:var(--surface);font-size:9px;color:var(--muted);gap:5px}
+.uc-chat-h .dot{width:5px;height:5px;border-radius:50%;background:var(--accent-light)}
+.uc-msgs{flex:1;padding:10px 14px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;overflow-y:auto}
+.uc-empty{display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center}
+.uc-empty-icon{width:42px;height:42px;border-radius:50%;background:color-mix(in oklch,var(--accent) 10%,transparent);display:grid;place-items:center}
+.uc-empty-text{font-size:14px;font-weight:600;color:var(--fg)}
+.uc-empty-hint{font-size:10px;color:var(--muted);max-width:260px;line-height:1.5}
+.uc-empty-chips{display:flex;gap:4px;flex-wrap:wrap;justify-content:center;margin-top:2px}
+.uc-chip{padding:3px 8px;border-radius:var(--radius-pill);font-size:9px;color:var(--accent);background:color-mix(in oklch,var(--accent) 10%,transparent);border:1px solid color-mix(in oklch,var(--accent) 15%,transparent)}
+
+.uc-chat-content{display:none;flex-direction:column;gap:6px;width:100%;overflow-y:auto;flex:1;padding:4px 0}
+.uc-input-bar{height:38px;display:flex;align-items:center;padding:0 10px;border-top:1px solid var(--border);flex-shrink:0;background:var(--surface);gap:4px}
+.uc-input-bar .ub-inp{flex:1;height:28px;padding:0 10px;border:1px solid var(--border);border-radius:var(--radius-pill);font-size:10px;background:var(--bg);color:var(--fg);outline:none}
+.ub-send{width:28px;height:28px;border-radius:50%;background:var(--accent);color:#fff;display:grid;place-items:center;font-size:11px}
+
+.uc-right{width:170px;border-left:1px solid var(--border);padding:10px 8px;display:flex;flex-direction:column;gap:8px;overflow-y:auto;flex-shrink:0;background:var(--surface)}
+.ur-dev{font-size:9px;padding:5px 7px;border:1px solid var(--border);border-radius:var(--radius-sm);display:flex;align-items:center;gap:5px;background:var(--bg)}
+.ur-dev .ud-icon{width:20px;height:20px;border-radius:4px;display:grid;place-items:center;font-size:8px;flex-shrink:0}
+.ur-dev .ud-info{flex:1;min-width:0}
+.ur-dev .ud-name{font-size:9px;font-weight:500}
+.ur-dev .ud-sub{font-size:7px;color:var(--muted)}
+.ud-tag{font-size:7px;padding:1px 5px;border-radius:var(--radius-pill);font-weight:500}
+.ud-tag.unbound{background:color-mix(in oklch,var(--warn) 12%,transparent);color:var(--warn-text)}
+.ud-tag.bound{background:color-mix(in oklch,var(--accent-light) 12%,transparent);color:var(--accent)}
+
+.ur-journey{padding-left:16px;position:relative}
+.ur-journey::before{content:'';position:absolute;left:5px;top:5px;bottom:5px;border-left:1.5px dotted var(--border)}
+.ur-jn{position:relative;padding:2px 0 2px 7px;font-size:8px;color:var(--muted);line-height:1.3;transition:all .4s}
+.ur-jn::before{content:'';position:absolute;left:-12px;top:4px;width:5px;height:5px;border-radius:50%;background:var(--border);border:1.5px solid var(--surface);z-index:1;transition:all .4s}
+.ur-jn.current{color:var(--accent);font-weight:600}
+.ur-jn.current::before{background:var(--accent);box-shadow:0 0 0 3px color-mix(in oklch,var(--accent) 15%,transparent)}
+.ur-jn.done{color:var(--fg)}
+.ur-jn.done::before{background:var(--accent-light)}
+
+.ur-next{border:1px solid var(--accent);border-radius:var(--radius-md);padding:7px;background:color-mix(in oklch,var(--accent) 4%,transparent)}
+.ur-next .un-badge{font-size:7px;font-weight:600;color:var(--accent);text-transform:uppercase;letter-spacing:.03em}
+.ur-next .un-title{font-size:9px;font-weight:500;margin:2px 0}
+.ur-next .un-desc{font-size:7px;color:var(--muted);line-height:1.4}
+.ur-next .un-acts{display:flex;gap:3px;margin-top:4px}
+.ur-perc-grid{display:grid;grid-template-columns:1fr 1fr;gap:3px}
+.ur-perc{padding:3px 5px;border:1px solid var(--border);border-radius:var(--radius-sm);display:flex;flex-direction:column;gap:1px;background:var(--surface)}
+.ur-perc .up-l{font-size:6px;color:var(--muted);text-transform:uppercase;letter-spacing:.03em}
+.ur-perc .up-v{font-size:8px;font-weight:500}
+.up-v.on{color:var(--accent)} .up-v.off{color:var(--muted)} .up-v.warn{color:var(--warn-text)}
+.ur-hint{padding:5px 7px;background:color-mix(in oklch,var(--accent-light) 6%,transparent);border-radius:var(--radius-sm);font-size:7px;color:var(--muted);line-height:1.3;display:flex;gap:4px}
+
+.dr-info{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);padding:7px}
+.dr-name{font-size:12px;font-weight:700}
+.dr-dept{font-size:8px;color:var(--muted);margin-top:1px}
+.dr-stats{font-size:8px;display:flex;gap:8px;color:var(--muted);margin-top:2px}
+.dr-patient{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);padding:5px 7px;display:flex;flex-direction:column;gap:2px;transition:all .5s}
+.dr-patient.highlight{border-color:var(--accent-light)}
+.dp-row{display:flex;align-items:center;gap:5px}
+.dp-name{font-size:10px;font-weight:500}
+.dp-time{font-size:7px;color:var(--muted);margin-left:auto}
+.dp-tag{font-size:7px;padding:0 5px;border-radius:var(--radius-pill);font-weight:500}
+.dp-tag.pending{background:color-mix(in oklch,var(--warn) 12%,transparent);color:var(--warn-text)}
+.dp-tag.ok{background:color-mix(in oklch,var(--accent-light) 12%,transparent);color:var(--accent)}
+.dp-tag.tmr{background:color-mix(in oklch,var(--accent) 8%,transparent);color:var(--accent)}
+.dr-notif{font-size:8px;padding:3px 6px;border-radius:var(--radius-sm);background:color-mix(in oklch,var(--accent-light) 8%,transparent);color:var(--accent);display:flex;align-items:center;gap:3px;border-left:2px solid var(--accent-light);animation:fadeUp .4s}
+
+.bottombar{height:28px;background:var(--surface);border-top:1px solid var(--border);display:flex;align-items:center;padding:0 14px;gap:8px;flex-shrink:0}
+.bbl{font-size:8px;color:var(--muted);font-weight:500;white-space:nowrap}
+.bbn{display:flex;align-items:center;gap:4px;padding:2px 7px;border-radius:var(--radius-pill);font-size:7px;white-space:nowrap;background:color-mix(in oklch,var(--accent) 10%,transparent);color:var(--accent)}
+.bbn .b-dot{width:3px;height:3px;border-radius:50%;background:currentColor;opacity:.6}
+
+@DataFlow{0%{background-position:200% 0}100%{background-position:-200% 0}}
+.data-flow{position:absolute;height:2px;background:linear-gradient(90deg,transparent,var(--accent-light),transparent);background-size:200% 100%;animation:DataFlow 1s linear infinite;opacity:.4;pointer-events:none;z-index:5;display:none}
+
+@keyframes fadeUp{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}
+@keyframes fadeIn{from{opacity:0}to{opacity:1}}
+@keyframes slideUp{from{transform:translateY(15px);opacity:0}to{transform:translateY(0);opacity:1}}
+@keyframes ripple{0%{transform:scale(.4);opacity:.7}100%{transform:scale(2.6);opacity:0}}
+@keyframes breathe{0%,100%{opacity:1}50%{opacity:.5}}
+@keyframes glow{0%,100%{box-shadow:0 0 4px rgba(58,212,216,.2)}50%{box-shadow:0 0 12px rgba(58,212,216,.5)}}
+</style>
+</head>
+<body>
+
+<div class="timeline-bar" id="tlBar">
+  <span class="tl-act" id="tlAct">第一幕 · 开场亮相</span>
+  <div class="tl-steps" id="tlSteps">
+    <div class="tl-step active"></div><div class="tl-step"></div><div class="tl-step"></div><div class="tl-step"></div><div class="tl-step"></div>
+  </div>
+  <span class="tl-time" id="tlTime">0:00</span>
+</div>
+
+<div class="app-shell" id="appShell">
+  <!-- LEFT: Nurse Station -->
+  <div class="panel"><div class="ph"><span class="pi" style="background:color-mix(in oklch,var(--accent-light) 15%,transparent)">🏥</span><span class="pt">护士站 · 患者总览</span><span class="ps" id="nsStatus">等待患者</span></div>
+  <div class="pb" id="nsBody">
+    <div class="ns-stats"><div class="ns-stat"><div class="ns-num" id="nsOnline">0</div><div class="ns-lbl">在线设备</div></div><div class="ns-stat"><div class="ns-num" id="nsToday">0</div><div class="ns-lbl">今日接诊</div></div><div class="ns-stat"><div class="ns-num" id="nsTomorrow">0</div><div class="ns-lbl">明日预约</div></div></div>
+    <div class="ns-sec">患者队列</div>
+    <div id="nsQueue"><div style="padding:16px;text-align:center;color:var(--muted);font-size:10px">等待患者入院</div></div>
+    <div id="nsNotifs"></div>
+  </div></div>
+
+  <!-- CENTER: Unified Entry Client -->
+  <div class="panel" style="position:relative;overflow:hidden">
+    <div class="data-flow" id="dataFlow" style="top:0;left:0;right:0"></div>
+    <div class="center-body">
+      <div class="uc-topbar">
+        <span class="uc-logo"><svg width="12" height="12" viewBox="0 0 24 24"><rect x="2" y="2" width="20" height="20" rx="4" fill="none" stroke="currentColor" stroke-width="1.5"/><line x1="8" y1="2" x2="8" y2="22" stroke="currentColor" stroke-width="1.5"/></svg>空海医院</span>
+        <span class="uc-div"></span>
+        <span class="uc-id"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><circle cx="12" cy="8" r="4"/><path d="M4 20c0-4 4-7 8-7s8 3 8 7"/></svg><span id="ucPatient">患者:<strong>—</strong></span></span>
+        <span class="uc-scene">门诊</span>
+        <span class="uc-perc" id="ucPerc"><span class="ptag l0">L0</span><span class="ptag off">NFC 待触发</span><span class="ptag off">BLE 未连接</span></span>
+      </div>
+      <div class="uc-main">
+        <div class="uc-left">
+          <div class="uc-avatar"><svg viewBox="0 0 24 24"><rect x="2" y="2" width="20" height="20" rx="4"/><line x1="12" y1="2" x2="12" y2="22"/><line x1="2" y1="12" x2="22" y2="12"/></svg></div>
+          <div class="uc-assist-info"><div class="uc-assist-name">空海医院医疗助手</div><div class="uc-assist-tag" id="ucAssistTag">感知您的状态,主动推送服务</div></div>
+          <div class="uc-sep"></div>
+          <div class="uc-label">你可以这样说</div>
+          <div class="uc-ex">我头疼三天,想挂号</div>
+          <div class="uc-ex">找神经内科李明医生</div>
+          <div class="uc-sep"></div>
+          <div class="uc-label">高频功能</div>
+          <div class="uc-qbtn">📋 挂号预约</div>
+          <div class="uc-qbtn">🧭 科室导诊</div>
+          <div class="uc-qbtn">💳 门诊缴费</div>
+          <div class="uc-qbtn">📊 查报告</div>
+          <div class="uc-sep"></div>
+          <div class="uc-label">设备与服务</div>
+          <div class="uc-qbtn">📱 NFC 碰一碰</div>
+          <div class="uc-qbtn">🤖 呼叫机器人</div>
+          <div class="uc-bind" id="ucBind">
+            <div class="ub-title">绑定设备,开启感知</div>
+            <div class="ub-desc">NFC碰一碰或扫码绑定,系统自动感知身份和位置</div>
+            <button class="btn-sm btn-primary" style="width:100%">NFC 碰一碰绑定</button>
+          </div>
+        </div>
+        <div class="uc-center">
+          <div class="uc-chat-h"><span class="dot"></span>空海医院医疗助手 · 在线</div>
+          <div class="uc-msgs" id="ucMsgs">
+            <div class="uc-empty" id="ucEmpty">
+              <div class="uc-empty-icon"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="var(--accent)" stroke-width="1.6"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg></div>
+              <div class="uc-empty-text">您好,我是门诊助手</div>
+              <div class="uc-empty-hint" id="ucEmptyHint">请说出您的就诊需求。绑定设备后可自动识别身份。</div>
+              <div class="uc-empty-chips"><span class="uc-chip">我头疼想挂号</span><span class="uc-chip">找神经内科</span></div>
+            </div>
+            <div class="uc-chat-content" id="ucChat"></div>
+          </div>
+          <div class="uc-input-bar"><input class="ub-inp" placeholder="请说出您的就诊需求…" readonly><div class="ub-send">➤</div></div>
+        </div>
+        <div class="uc-right">
+          <div class="uc-label">设备绑定</div>
+          <div class="ur-dev"><div class="ud-icon" style="background:color-mix(in oklch,var(--accent-light) 12%,transparent)">⌚</div><div class="ud-info"><div class="ud-name">华为手表</div><div class="ud-sub">未检测到</div></div><span class="ud-tag unbound" id="udTag1">未绑定</span></div>
+          <div class="ur-dev"><div class="ud-icon" style="background:color-mix(in oklch,var(--accent) 10%,transparent)">📱</div><div class="ud-info"><div class="ud-name">Mate 60 Pro</div><div class="ud-sub">未检测到</div></div><span class="ud-tag unbound" id="udTag2">未绑定</span></div>
+          <div class="uc-sep"></div>
+          <div class="uc-label">就诊动线</div>
+          <div class="ur-journey" id="urJourney">
+            <div class="ur-jn current" data-jn="0">入院</div>
+            <div class="ur-jn" data-jn="1">身份绑定</div>
+            <div class="ur-jn" data-jn="2">任务加载</div>
+            <div class="ur-jn" data-jn="3">挂号/分诊</div>
+            <div class="ur-jn" data-jn="4">诊区签到</div>
+            <div class="ur-jn" data-jn="5">候诊→就诊</div>
+            <div class="ur-jn" data-jn="6">缴费→离院</div>
+          </div>
+          <div class="uc-sep"></div>
+          <div class="uc-label">下一步</div>
+          <div class="ur-next" id="urNext">
+            <div class="un-badge" id="unBadge">⟳ 待完成</div>
+            <div class="un-title" id="unTitle">绑定设备与身份</div>
+            <div class="un-desc" id="unDesc">请使用手机 NFC 碰一碰自助终端感应区完成绑定。</div>
+            <div class="un-acts" id="unActs"><button class="btn-sm btn-primary" style="flex:1;text-align:center">NFC 碰一碰</button><button class="btn-sm btn-secondary" style="flex:1;text-align:center">扫码绑定</button></div>
+          </div>
+          <div class="uc-sep"></div>
+          <div class="uc-label">感知状态</div>
+          <div class="ur-perc-grid" id="urPercGrid">
+            <div class="ur-perc"><span class="up-l">身份</span><span class="up-v on">已识别</span></div>
+            <div class="ur-perc"><span class="up-l">设备</span><span class="up-v off" id="percDev">未绑定</span></div>
+            <div class="ur-perc"><span class="up-l">位置</span><span class="up-v warn" id="percLoc">L0 手动</span></div>
+            <div class="ur-perc"><span class="up-l">业务</span><span class="up-v off" id="percBiz">无任务</span></div>
+          </div>
+          <div class="ur-hint"><span>💡</span><span id="urHint">设备绑定后进入 L1 感知模式。</span></div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+  <!-- RIGHT: Doctor Station -->
+  <div class="panel"><div class="ph"><span class="pi" style="background:color-mix(in oklch,var(--accent-light) 15%,transparent)">🩺</span><span class="pt">医生工作站</span><span class="ps" id="drStatus">待诊中</span></div>
+  <div class="pb" id="drBody">
+    <div class="dr-info"><div class="dr-name">李明 <span style="font-size:10px;font-weight:400;color:var(--muted)">主任医师</span></div><div class="dr-dept">神经内科 · 门诊三楼 301 诊室</div><div class="dr-stats"><span id="drQCount">候诊 0 人</span><span id="drTodayCount">今日接诊 0 人</span></div></div>
+    <div class="ns-sec" id="drListLabel">今日待诊</div>
+    <div id="drList"><div style="padding:16px;text-align:center;color:var(--muted);font-size:10px">等待患者到诊</div></div>
+    <div id="drNotifs"></div>
+  </div></div>
+</div>
+
+<footer class="bottombar" id="bottomBar">
+  <span class="bbl">服务通知</span>
+  <div id="bottomNotifs"><span class="bbn"><span class="b-dot"></span>系统就绪 — 等待患者操作</span></div>
+</footer>
+
+<script>
+const $=id=>document.getElementById(id);
+function delay(ms){return new Promise(r=>setTimeout(r,ms))}
+
+// ─── helpers ───
+function addNotif(contId, txt){
+  const el=document.createElement('div');
+  el.className=contId==='nsNotifs'?'ns-notif':'dr-notif';
+  el.textContent=txt;
+  $(contId).appendChild(el);
+  setTimeout(()=>el.remove(),5000);
+}
+function setBottom(txt){$('bottomNotifs').innerHTML=`<span class="bbn"><span class="b-dot"></span>${txt}</span>`}
+
+function addMsg(role, txt){
+  return new Promise(r=>setTimeout(()=>{
+    const cc=$('ucChat'), d=document.createElement('div');
+    d.style.cssText='display:flex;gap:6px;align-items:flex-start;animation:fadeUp .3s ease;margin-bottom:2px';
+    d.innerHTML=`<span style="font-size:10px;font-weight:600;color:${role==='ai'?'var(--accent)':'var(--fg)'};flex-shrink:0;width:24px">${role==='ai'?'🤖':'👤'}</span><span style="font-size:10px;color:var(--fg);line-height:1.5">${txt}</span>`;
+    cc.appendChild(d);cc.scrollTop=cc.scrollHeight; r();
+  },0));
+}
+function typeMsg(role, txt, chDelay=25, stDelay=0){
+  return new Promise(r=>{setTimeout(()=>{
+    const cc=$('ucChat'), d=document.createElement('div');
+    d.style.cssText='display:flex;gap:6px;align-items:flex-start;animation:fadeUp .3s ease;margin-bottom:2px';
+    const sp=document.createElement('span');
+    sp.style.cssText=`font-size:10px;font-weight:600;color:${role==='ai'?'var(--accent)':'var(--fg)'};flex-shrink:0;width:24px`;
+    sp.textContent=role==='ai'?'🤖':'👤';
+    const ts=document.createElement('span');
+    ts.style.cssText='font-size:10px;color:var(--fg);line-height:1.5';
+    d.appendChild(sp);d.appendChild(ts);cc.appendChild(d);
+    let i=0;
+    function type(){if(i<txt.length){ts.innerHTML=txt.slice(0,i+1);cc.scrollTop=cc.scrollHeight;i++;setTimeout(type,chDelay)}else r()}
+    type();
+  },stDelay)});
+}
+
+function setJourney(n){
+  for(let i=0;i<=6;i++){const el=document.querySelector(`[data-jn="${i}"]`);el.classList.remove('current','done');
+    if(i<n)el.classList.add('done');else if(i===n)el.classList.add('current')}
+}
+function setPerc(tagId, txt, cls){const el=$(tagId);el.textContent=txt;el.className='up-v '+cls}
+
+// ─── ACTS ───
+async function act0(){
+  // reset everything
+  $('nsOnline').textContent='0';$('nsToday').textContent='0';$('nsTomorrow').textContent='0';
+  $('nsQueue').innerHTML='<div style="padding:16px;text-align:center;color:var(--muted);font-size:10px">等待患者入院</div>';
+  $('nsNotifs').innerHTML='';$('nsStatus').textContent='等待患者';
+  $('drList').innerHTML='<div style="padding:16px;text-align:center;color:var(--muted);font-size:10px">等待患者到诊</div>';
+  $('drNotifs').innerHTML='';$('drQCount').textContent='候诊 0 人';$('drTodayCount').textContent='今日接诊 0 人';
+  $('drListLabel').textContent='今日待诊';$('drStatus').textContent='待诊中';
+  $('ucPatient').innerHTML='患者:<strong>—</strong>';
+  $('ucPerc').innerHTML='<span class="ptag l0">L0</span><span class="ptag off">NFC 待触发</span><span class="ptag off">BLE 未连接</span>';
+  $('ucEmpty').style.display='flex';$('ucChat').style.display='none';$('ucChat').innerHTML='';
+  $('ucAssistTag').textContent='感知您的状态,主动推送服务';
+  $('udTag1').textContent='未绑定';$('udTag1').className='ud-tag unbound';
+  $('udTag2').textContent='未绑定';$('udTag2').className='ud-tag unbound';
+  setJourney(0);
+  $('unBadge').textContent='⟳ 待完成';$('unTitle').textContent='绑定设备与身份';
+  $('unDesc').textContent='请使用手机 NFC 碰一碰自助终端感应区完成绑定。';
+  $('unActs').innerHTML='<button class="btn-sm btn-primary" style="flex:1;text-align:center">NFC 碰一碰</button><button class="btn-sm btn-secondary" style="flex:1;text-align:center">扫码绑定</button>';
+  setPerc('percDev','未绑定','off');setPerc('percLoc','L0 手动','warn');setPerc('percBiz','无任务','off');
+  $('urHint').textContent='设备绑定后进入 L1 感知模式。';
+  $('ucBind').innerHTML='<div class="ub-title">绑定设备,开启感知</div><div class="ub-desc">NFC碰一碰或扫码绑定,系统自动感知身份和位置</div><button class="btn-sm btn-primary" style="width:100%">NFC 碰一碰绑定</button>';
+  document.querySelectorAll('.uc-qbtn').forEach(b=>b.classList.remove('on'));
+  setBottom('系统就绪 — 等待患者操作');
+  $('dataFlow').style.display='none';
+  $('appShell').style.display='grid';$('appShell').style.opacity='1';
+  $('tlBar').style.display='flex';$('bottomBar').style.display='flex';
+  const ending=document.querySelector('[data-ending]');if(ending)ending.remove();
+}
+
+async function act1(){
+  setJourney(0);
+  $('ucEmpty').style.display='flex';$('ucChat').style.display='none';$('ucChat').innerHTML='';
+
+  // NFC animation
+  const overlay=document.createElement('div');
+  overlay.id='nfcOverlay';overlay.style.cssText='position:absolute;top:47%;left:50%;transform:translate(-50%,-50%);z-index:10;pointer-events:none;text-align:center';
+  overlay.innerHTML=`<div style="position:relative;width:70px;height:70px;margin:0 auto"><div style="position:absolute;inset:0;border-radius:50%;border:2px solid var(--accent-light);animation:ripple 1.2s ease-out infinite"></div><div style="position:absolute;inset:0;border-radius:50%;border:2px solid var(--accent-light);animation:ripple 1.2s ease-out infinite;animation-delay:.4s"></div><div style="position:absolute;inset:0;border-radius:50%;border:2px solid var(--accent-light);animation:ripple 1.2s ease-out infinite;animation-delay:.8s"></div><div style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:24px">📱</div></div><div style="font-size:9px;color:var(--accent-light);margin-top:4px;font-weight:500">碰一碰连接中…</div>`;
+  document.querySelector('.center-body').appendChild(overlay);
+  await delay(2500);
+  const nfo=document.getElementById('nfcOverlay');if(nfo)nfo.remove();
+
+  // Identity bound
+  $('ucPatient').innerHTML='患者:<strong>医小梦</strong>';
+  $('ucPerc').innerHTML='<span class="ptag l1">L1</span><span class="ptag l1">NFC 已连接</span><span class="ptag l1">BLE 在线</span>';
+  setPerc('percDev','已绑定','on');setPerc('percLoc','L1 门诊大厅','on');
+  $('udTag1').textContent='已绑定';$('udTag1').className='ud-tag bound';
+  $('udTag2').textContent='已绑定';$('udTag2').className='ud-tag bound';
+  $('ucBind').innerHTML='<div style="font-size:9px;color:var(--accent);font-weight:500">✅ 已绑定 · Mate 60 Pro</div>';
+  $('ucAssistTag').textContent='医小梦您好!欢迎来到空海医院';
+  document.querySelectorAll('.uc-qbtn').forEach(b=>b.classList.add('on'));
+  setJourney(2);
+
+  // Nurse
+  $('nsOnline').textContent='1';$('nsToday').textContent='1';
+  $('nsQueue').innerHTML='<div class="ns-patient highlight" style="animation:fadeUp .4s"><div class="np-row"><span class="np-name">医小梦</span><span class="np-tag ok">已入院</span></div><div class="np-detail"><span>📍 门诊大厅</span><span>📱 设备已绑定</span></div></div>';
+  $('nsStatus').textContent='1 名患者';
+  addNotif('nsNotifs','📋 设备绑定事件 · 医小梦');
+
+  // Doctor
+  $('drList').innerHTML='<div class="dr-patient" style="animation:fadeUp .4s"><div class="dp-row"><span class="dp-name">医小梦</span><span class="dp-time">— 未挂号</span></div><div style="font-size:7px;color:var(--muted);display:flex;gap:4px;margin-top:1px"><span>📍 门诊大厅</span><span>还未挂号</span></div></div>';
+  $('drQCount').textContent='候诊 1 人';$('drStatus').textContent='有患者';
+  addNotif('drNotifs','📋 新患者入院 · 医小梦');
+
+  // Chat greeting
+  $('ucEmpty').style.display='none';$('ucChat').style.display='flex';
+  await typeMsg('ai','医小梦您好!欢迎来到空海医院。已为您自动加载信息。检测到您还没有挂号,需要帮您看看挂哪个科室吗?',22,300);
+  await delay(500);
+  const btnRow=document.createElement('div');
+  btnRow.style.cssText='display:flex;gap:5px;margin-top:2px;animation:fadeUp .4s';
+  btnRow.innerHTML='<button class="btn-sm btn-primary" style="flex:1;text-align:center">我要挂号</button><button class="btn-sm btn-secondary" style="flex:1;text-align:center">科室导诊</button>';
+  $('ucChat').appendChild(btnRow);
+
+  $('unBadge').textContent='⬆ 下一步';
+  $('unTitle').textContent='选择服务';
+  $('unDesc').textContent='是否要挂号或查询科室信息?';
+  $('unActs').innerHTML='<button class="btn-sm btn-primary" style="flex:1;text-align:center">我要挂号</button>';
+  $('urHint').textContent='已进入 L1 感知模式,系统可自动识别身份和位置。';
+  setBottom('📱 设备绑定成功 · 感知 L1 · 门诊大厅');
+
+  $('dataFlow').style.display='block';await delay(1500);$('dataFlow').style.display='none';
+}
+
+async function act2(){
+  $('ucChat').style.display='flex';
+  setJourney(3);setPerc('percBiz','AI 导诊中','warn');
+
+  await addMsg('user','我头疼三天,还有点恶心');
+  await delay(1000);
+  await typeMsg('ai','好的,我来了解一下。请问有没有伴随发热、视物模糊呢?',25,300);
+  await delay(2000);
+  await addMsg('user','没有发热,就是头疼恶心想吐');
+  await delay(1200);
+  await typeMsg('ai','明白了。根据您的症状描述,建议优先选择神经内科。李明主任医师今天上午有号,需要帮您预约吗?',22,500);
+  await delay(800);
+
+  const rec=document.createElement('div');
+  rec.style.cssText='background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:10px 12px;animation:slideUp .4s;max-width:260px';
+  rec.innerHTML='<span style="display:inline-block;font-size:7px;padding:1px 5px;border-radius:var(--radius-pill);background:var(--accent-light);color:#fff;font-weight:600;margin-bottom:4px">🏆 推荐</span><div style="font-size:12px;font-weight:700">神经内科 · 李明 主任医师</div><div style="font-size:9px;color:var(--muted);margin:2px 0">今天 10:30 · ¥25(模拟)</div><div style="display:flex;gap:5px;margin-top:5px"><button class="btn-sm btn-primary" style="flex:1;text-align:center">确认挂号</button><button class="btn-sm btn-secondary" style="flex:1;text-align:center">换医生看看</button></div>';
+  $('ucChat').appendChild(rec);
+
+  // Nurse
+  $('nsQueue').innerHTML='<div class="ns-patient highlight" style="animation:fadeUp .4s"><div class="np-row"><span class="np-name">医小梦</span><span class="np-tag ok">导诊完成</span></div><div class="np-detail"><span>🏥 推荐:神经内科</span><span>👨‍⚕️ 李明</span></div></div>';
+  addNotif('nsNotifs','📋 导诊完成 · 医小梦 → 神经内科');
+
+  // Doctor
+  $('drList').innerHTML='<div class="dr-patient highlight" style="animation:fadeUp .4s"><div class="dp-row"><span class="dp-name">医小梦</span><span class="dp-tag pending">推荐中</span><span class="dp-time">10:30</span></div><div style="font-size:7px;color:var(--muted);margin-top:1px"><span>🏥 神经内科 · 李明</span></div></div>';
+  addNotif('drNotifs','📋 导诊完成 · 医小梦 → 神经内科');
+
+  setBottom('📋 推荐科室:神经内科 · 李明 主任医师');
+  await delay(2500);
+
+  // Loading
+  const ld=document.createElement('div');
+  ld.id='loading';ld.style.cssText='text-align:center;padding:6px;animation:fadeIn .3s';
+  ld.innerHTML='<span style="font-size:9px;color:var(--muted)">⏳ 正在锁定号源…</span>';
+  $('ucChat').appendChild(ld);
+  await delay(1500);
+  const ldEl=document.getElementById('loading');if(ldEl)ldEl.remove();
+
+  // Success
+  const suc=document.createElement('div');
+  suc.style.cssText='background:linear-gradient(135deg,color-mix(in oklch,var(--accent-light) 10%,var(--surface)),var(--surface));border:1px solid var(--accent-light);border-radius:var(--radius-md);padding:12px;animation:slideUp .4s;max-width:260px';
+  suc.innerHTML='<div style="font-size:28px;text-align:center">🎉</div><div style="font-size:14px;font-weight:700;text-align:center">挂号成功!</div><div style="font-size:10px;color:var(--muted);text-align:center;line-height:1.6;margin:4px 0">神经内科 · 李明 主任医师<br>今天 10:30 · 门诊三楼 301 诊室<br>预约号:<strong>A023</strong><br>请前往诊区,到达后自动引导签到</div><div style="text-align:center;margin-top:4px"><button class="btn-sm btn-primary">查看我的就诊动线</button></div>';
+  $('ucChat').appendChild(suc);
+
+  setJourney(4);
+  setPerc('percBiz','已挂号 · A023','on');
+
+  // Nurse
+  $('nsTomorrow').textContent='1';
+  $('nsQueue').innerHTML='<div class="ns-patient" style="border-color:var(--accent-light);animation:fadeUp .4s"><div class="np-row"><span class="np-name">医小梦</span><span class="np-tag done">✅ 已挂号</span></div><div class="np-detail"><span>🏥 神经内科</span><span>👨‍⚕️ 李明</span><span>⏰ 10:30</span><span>#A023</span></div></div>';
+  addNotif('nsNotifs','✅ 医小梦 已挂号 · 10:30 神经内科');
+
+  // Doctor
+  $('drList').innerHTML='<div class="dr-patient highlight" style="animation:fadeUp .4s"><div class="dp-row"><span class="dp-name">医小梦</span><span class="dp-tag ok">已挂号</span><span class="dp-time">10:30</span></div><div style="font-size:7px;color:var(--muted);margin-top:1px"><span>预约号 A023</span></div></div>';
+  $('drQCount').textContent='候诊 1 人';$('drTodayCount').textContent='今日接诊 1 人';$('drStatus').textContent='待诊中';
+  addNotif('drNotifs','📋 +1 预约 · 医小梦 10:30');
+
+  $('unBadge').textContent='⬆ 下一步';
+  $('unTitle').textContent='前往诊区签到';
+  $('unDesc').textContent='请前往三楼神经内科301诊室。到达后系统自动感知并推送签到。';
+  $('unActs').innerHTML='';
+  setBottom('📋 预约号 A023 · 10:30 · 神经内科 · 请前往诊区签到');
+
+  $('dataFlow').style.display='block';await delay(1500);$('dataFlow').style.display='none';
+}
+
+async function act3(){
+  // Location update
+  $('ucPerc').innerHTML='<span class="ptag l1">L1</span><span class="ptag l1">神经内科诊区</span><span class="ptag l1">BLE 在线</span>';
+  setPerc('percLoc','L1 神经内科诊区','on');
+  setBottom('📍 位置感知:已进入神经内科诊区');
+  await delay(1500);
+
+  // Active check-in card
+  $('ucChat').innerHTML='';
+  await typeMsg('ai','检测到您已到达神经内科诊区——',22,0);
+  await delay(500);
+
+  const chk=document.createElement('div');
+  chk.style.cssText='background:var(--surface);border:2px solid var(--accent);border-radius:var(--radius-md);padding:12px;animation:slideUp .4s;max-width:260px';
+  chk.innerHTML='<div style="font-size:13px;font-weight:700;margin-bottom:6px">📍 主动签到</div><div style="display:flex;justify-content:space-between;font-size:10px;padding:3px 0"><span style="color:var(--muted)">预约号</span><span><strong>A023</strong></span></div><div style="display:flex;justify-content:space-between;font-size:10px;padding:3px 0"><span style="color:var(--muted)">当前叫号</span><span>第 018 号</span></div><div style="font-size:9px;color:var(--accent);font-weight:500;margin:6px 0">⚡ 无需找签到机,点击即可签到</div><button class="btn-sm btn-primary" style="width:100%;text-align:center;margin-top:4px">一键签到</button>';
+  $('ucChat').appendChild(chk);
+
+  $('unBadge').innerHTML='⚡ 服务找人';
+  $('unBadge').style.color='var(--accent)';
+  $('unTitle').textContent='系统主动推送签到';
+  $('unDesc').textContent='感知到位于神经内科诊区,无需寻找签到机——系统正在主动为您服务。';
+  setBottom('📍 检测到诊区到达 · 推送主动签到');
+
+  // Nurse station location update
+  $('nsQueue').querySelector('.np-detail span:first-child').textContent='📍 神经内科诊区';
+
+  await delay(2500);
+
+  // Check-in success
+  $('ucChat').innerHTML='';
+  await typeMsg('ai','检测到您已到达神经内科诊区——',22,0);
+  await delay(200);
+  const suc=document.createElement('div');
+  suc.style.cssText='background:linear-gradient(135deg,color-mix(in oklch,var(--accent-light) 10%,var(--surface)),var(--surface));border:1px solid var(--accent-light);border-radius:var(--radius-md);padding:12px;animation:slideUp .4s;max-width:260px';
+  suc.innerHTML='<div style="font-size:24px;text-align:center">✅</div><div style="font-size:14px;font-weight:700;text-align:center;color:var(--accent-light)">签到成功!</div><div style="font-size:10px;color:var(--muted);text-align:center;line-height:1.6;margin:4px 0">预约号 A023 · 当前叫号 019<br>前面还有 <strong>4 位</strong>患者<br>预计等候约 15 分钟</div>';
+  $('ucChat').appendChild(suc);
+
+  setJourney(5);
+  setPerc('percBiz','候诊中 · 第23位','on');
+
+  $('unBadge').textContent='⏳ 候诊中';$('unBadge').style.color='var(--accent)';
+  $('unTitle').textContent='当前叫号 019 · 第 23 位';
+  $('unDesc').textContent='预计等候 15 分钟。请留意叫号屏和手机通知。';
+  $('unActs').innerHTML='';
+  setBottom('✅ 签到成功 · 候诊中 · 当前叫号 019 · 第 23 位');
+
+  // Nurse
+  $('nsQueue').innerHTML='<div class="ns-patient" style="border-color:var(--accent-light);animation:fadeUp .4s"><div class="np-row"><span class="np-name">医小梦</span><span class="np-tag ok">候诊中</span></div><div class="np-detail"><span>📍 神经内科诊区</span><span>🔢 第 23 位</span><span>⏳ 约 15 分钟</span></div></div>';
+
+  // Doctor
+  $('drList').innerHTML='<div class="dr-patient" style="animation:fadeUp .4s"><div class="dp-row"><span class="dp-name">019 · 赵丽华</span><span style="font-size:7px;color:var(--muted)">候诊中</span></div></div><div class="dr-patient highlight" style="animation:fadeUp .4s"><div class="dp-row"><span class="dp-name">A023 · 医小梦</span><span class="dp-tag pending">候诊中</span><span class="dp-time">第23位</span></div></div>';
+  $('drQCount').textContent='候诊 5 人';$('drStatus').textContent='候诊中';
+}
+
+async function act4(){
+  await delay(500);
+  $('appShell').style.transition='all .8s ease';$('appShell').style.opacity='0';
+  await delay(800);$('appShell').style.display='none';$('tlBar').style.display='none';$('bottomBar').style.display='none';
+
+  const ending=document.createElement('div');
+  ending.setAttribute('data-ending','');
+  ending.style.cssText='position:fixed;inset:0;background:var(--accent);display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:100;animation:fadeIn .6s';
+  ending.innerHTML='<div style="text-align:center;animation:slideUp .6s"><div style="font-size:26px;font-weight:700;color:var(--accent-light);letter-spacing:.02em;margin-bottom:8px">感知 <span style="color:rgba(255,255,255,.35)">→</span> 动线 <span style="color:rgba(255,255,255,.35)">→</span> AI 调度 <span style="color:rgba(255,255,255,.35)">→</span> 服务外显</div><div style="font-size:15px;color:#fff;margin-bottom:4px;opacity:.8">患者少找路、少找窗口、少找设备</div><div style="width:100px;height:2px;background:var(--accent-light);margin:14px auto;border-radius:1px"></div><div style="font-size:18px;color:#fff;font-weight:600;letter-spacing:.04em">EMOON · 医梦</div><div style="font-size:11px;color:rgba(255,255,255,.45);margin-top:4px;letter-spacing:.05em">AI 未来医院 · 服务主动找人</div></div>';
+  document.body.appendChild(ending);
+}
+
+// ─── AUTO-ADVANCE ───
+const ACTS=[
+  {name:'第一幕 · 开场亮相',  start:0,  dur:5000,  fn:act0},
+  {name:'第二幕 · 感知绑定',  start:5,  dur:9000,  fn:act1},
+  {name:'第三幕 · AI 导诊挂号',start:14, dur:15000, fn:act2},
+  {name:'第四幕 · 诊区签到',  start:29, dur:10000, fn:act3},
+  {name:'第五幕 · 结尾定版',  start:39, dur:7000,  fn:act4},
+];
+let cur=-1, timer=null;
+
+function fmt(s){return Math.floor(s/60)+':'+(s%60).toString().padStart(2,'0')}
+
+async function go(idx){
+  clearTimeout(timer);cur=idx;
+  document.querySelectorAll('.tl-step').forEach((e,i)=>{e.classList.toggle('active',i===idx);e.classList.toggle('done',i<idx)});
+  $('tlAct').textContent=ACTS[idx].name;$('tlTime').textContent=fmt(ACTS[idx].start);
+  query('.scene-label',true).forEach(e=>e.remove());
+  await ACTS[idx].fn();
+  if(idx+1<ACTS.length) timer=setTimeout(()=>go(idx+1),ACTS[idx].dur);
+}
+function query(s,all){return all?document.querySelectorAll(s):document.querySelector(s)}
+
+document.addEventListener('DOMContentLoaded',()=>go(0));
+</script>
+</body>
+</html>

+ 2033 - 0
docs/架构文档/FastGPT接入技术方案.md

@@ -0,0 +1,2033 @@
+# 医梦 AI 中台接入 FastGPT 设计与技术方案
+
+| 项目 | 内容 |
+| --- | --- |
+| 文档定位 | 公司评审版设计 + 技术方案 |
+| 适用范围 | 医梦 AI 开放平台、AI Agent、FastGPT Adapter、MCP Gateway、Card Runtime、File Service、知识库运行副本、计量审计 |
+| 目标读者 | 公司管理层、商务谈判团队、架构评审人员、后端开发、初级工程师 |
+| FastGPT 源码基线 | `/Users/destiny/dev/emoon/projects/FastGPT`,本地 checkout `ga6885b339`(基于 `v4.15.0-beta`,上游 `Latest` 稳定 release 为 `v4.14.24`;另有 `v4.15.0-beta4` 预发布) |
+| emoon 工程基线 | Java 17 / Spring Boot 3 / Maven 多模块,AI 能力按 `emoon-ai-*` 分层模块落位 |
+| 版本 | v2.0 |
+| 更新时间 | 2026-06-13 |
+
+## 0. 阅读结论
+
+本方案的核心结论是:
+
+```text
+FastGPT 可以作为医梦 AIAgent 的实现层之一接入,
+但不能替代医梦 AI 中台,也不能成为医院业务系统的入口。
+```
+
+正确架构是:
+
+```text
+外部入口 / 终端 / 医生端 / 患者端 / 医院系统
+        ↓
+医梦 OpenPlatform + 医疗智能体应用控制层
+        ↓
+医梦 FastGPT Adapter
+        ↓
+FastGPT AI 能力层
+```
+
+错误架构是:
+
+```text
+外部入口 / 医生端 / 患者端 / HIS / LIS / EMR / 设备
+        ↓
+FastGPT
+```
+
+FastGPT 在本项目中的定位是“后方 AI 能力底座”,主要承接:
+
+- LLM 生成;
+- Workflow 子流程;
+- RAG 检索;
+- OCR / 多模态理解;
+- Embedding / Rerank;
+- 知识库运行副本;
+- AI 调用日志和资源消耗数据。
+
+医梦必须保留并强化:
+
+- 外部入口和统一鉴权;
+- 医疗场景路由;
+- 任务状态机;
+- 卡片运行时;
+- 医梦 MCP Gateway;
+- HIS / LIS / EMR / PACS / 支付 / 叫号等医院系统适配;
+- 文件源资产和敏感数据控制;
+- 医生反馈闭环;
+- 知识库源资产管理;
+- 计量、账本、审计、合同和运营闭环。
+
+## 1. 本文修正 Claude 初稿的关键点
+
+Claude 初稿提供了有价值的方向,但有几处需要在公司评审前修正。
+
+| 初稿说法 | 本文修正 | 原因 |
+| --- | --- | --- |
+| FastGPT 版本口径混用 | 本地 checkout `ga6885b339`,基于 `v4.15.0-beta`;上游 `Latest` 稳定 release 为 `v4.14.24`,另有 `v4.15.0-beta4` 预发布 | 文档必须同时标注本地源码基线、稳定版能力和 beta 能力差异 |
+| `~/dev/emoon/project/FastGPT` | `/Users/destiny/dev/emoon/projects/FastGPT` | 实际目录为 `projects`,不是 `project` |
+| Dify 尚未进入代码,切换成本极低 | emoon 已存在 `DifyAgentEngine`、`DifyKnowledgeEngine`、Dify 意图识别和多处 `dify` 硬编码 | 切换不是零成本,需要双引擎并存和逐步迁移 |
+| FastGPT OpenAI-compatible,可直接复用 DirectLLM 协议 | 只能复用部分请求/流式解析思想,不能完全当作 OpenAI API | FastGPT `model/temperature` 等参数由编排决定,API 参数不按 OpenAI 语义生效 |
+| FastGPT `usage` 可直接用于计量 | 不可信任默认 `usage` | v1 接口默认 `usage` 为占位值,需要 `detail=true.responseData` 或日志归集 |
+| FastGPT 社区版能力完整 | 必须区分社区版、商业版、云服务版 | 运行日志看板、应用评测、内容审核、SSO、多租户等能力与商业版相关 |
+| 很多 emoon 模块无需修改 | 对外入口不改,但知识库、意图识别、引擎配置、计量归集、健康探活都需要适配 | 当前代码存在 Dify 语义绑定 |
+
+## 2. 背景与决策问题
+
+### 2.1 业务背景
+
+甲方本周明确提出希望底层 AI 中台替换为 FastGPT。考虑到 FastGPT 与 Dify 都提供通用 AI 应用构建、Workflow、RAG、工具调用和模型编排能力,医梦不能把二期和三期规划整体推倒重来。
+
+更合理的理解是:
+
+```text
+Dify / FastGPT / DirectLLM / Mock
+都是 AgentEngine 的实现层。
+医梦 AI 中台的医疗业务控制层不能被替换。
+```
+
+### 2.2 评审要回答的问题
+
+本方案需要回答四类问题:
+
+1. FastGPT 现有能力是什么,哪些能力可用,哪些能力有版本或商业限制;
+2. Dify 与 FastGPT 在产品、工程接入、医疗业务闭环上的差异;
+3. 相比原 Dify 规划,接入 FastGPT 会产生哪些限制和新问题;
+4. emoon 应如何分阶段接入 FastGPT,并控制风险、边界和工程复杂度。
+
+### 2.3 总体建议
+
+建议采用“FastGPT 主接入 + Dify 过渡保留”的策略:
+
+- 新增 `engineType=fastgpt`,不要删除 `engineType=dify`;
+- 新项目优先验证 FastGPT;
+- 已经跑通的 Dify 链路不立即强拆;
+- 管理后台、Agent 配置、知识库配置、意图识别配置逐步从硬编码 `dify` 改为可配置引擎;
+- 计量、审计、卡片、文件和 MCP 网关坚持由 emoon 控制。
+
+## 3. FastGPT 能力全景
+
+本节基于本地 FastGPT 源码和文档目录校准,不默认把商业版能力算入 P0。
+
+### 3.1 产品定位
+
+FastGPT 是一个 AI 应用构建平台,核心能力包括:
+
+- 应用编排;
+- 智能体对话;
+- Workflow;
+- 知识库;
+- MCP 工具集;
+- HTTP 工具集;
+- OpenAPI 调用;
+- 分享和嵌入;
+- 模型配置;
+- 部署运维。
+
+技术栈:
+
+- Node.js / TypeScript;
+- Next.js;
+- MongoDB;
+- Docker / Sealos 部署体系。
+
+### 3.2 应用类型
+
+本地源码中 `AppTypeEnum` 关键值如下:
+
+| 类型 | 源码枚举值 | 说明 | emoon 用法 |
+| --- | --- | --- | --- |
+| 简易对话 | `simple` | FAQ、普通问答 | P0 可用 |
+| 对话智能体 | `chatAgent` | 带工具和上下文的对话 | P0 可用 |
+| Workflow | `advanced` | 高级编排 | P0/P1 主能力 |
+| Workflow Tool | `plugin` | 可复用插件流程 | P1 可用 |
+| MCP ToolSet | `toolSet` | MCP 工具集 | P1 重点验证 |
+| HTTP ToolSet | `httpToolSet` | HTTP 工具集 | P1/P2 可选 |
+| 文件夹 | `folder` / `toolFolder` | 管理组织结构 | 管理后台可见 |
+
+初级工程师注意:
+
+```text
+FastGPT 的 workflow 类型在源码枚举中叫 advanced。
+不要只看 UI 文案写死字符串。
+```
+
+### 3.3 对话能力
+
+核心接口:
+
+```text
+POST /api/v1/chat/completions
+POST /api/v2/chat/completions
+POST /api/v2/chat/stop
+```
+
+本文 P0 建议先接 `v1`,原因是现有文档和源码中的兼容性说明更充分。后续可在 P1 评估 v2。
+
+`v1` 请求关键字段:
+
+```json
+{
+  "chatId": "emoon-conversation-id",
+  "stream": true,
+  "detail": true,
+  "responseChatItemId": "emoon-message-id",
+  "variables": {
+    "traceId": "trace_xxx",
+    "sceneCode": "OUTPATIENT_TRIAGE"
+  },
+  "messages": [
+    {
+      "role": "user",
+      "content": "我头疼应该挂什么科"
+    }
+  ]
+}
+```
+
+重要差异:
+
+| 点 | 说明 | emoon 影响 |
+| --- | --- | --- |
+| `model` | FastGPT v1 文档说明 `model` 等参数无效,实际应用由鉴权和编排决定 | 不要用 `model` 表达 FastGPT App ID 的唯一来源 |
+| `temperature` | 由 FastGPT 编排配置决定 | emoon 不应在运行时假设可覆盖 |
+| `chatId` | 不传时不使用 FastGPT 上下文;传入时 FastGPT 会按 chatId 取历史 | emoon 应传自己的会话 ID 或映射 ID |
+| `detail` | 返回节点执行过程和 responseData | 计量、审计、调试建议开启或按环境开启 |
+| `usage` | v1 默认响应里可能是占位值 | 不能直接入账 |
+
+### 3.4 流式 SSE 能力
+
+FastGPT `stream=true` 时返回 SSE。普通增量类似:
+
+```text
+data: {"choices":[{"delta":{"content":"您"},"finish_reason":null}]}
+data: {"choices":[{"delta":{"content":"好"},"finish_reason":null}]}
+data: [DONE]
+```
+
+当 `detail=true` 时,还会出现流程节点结果事件。emoon 需要做两层归一化:
+
+1. FastGPT SSE → `AgentResponse`;
+2. `AgentResponse` → OpenPlatform 对外 SSE 事件。
+
+emoon 对外仍保持:
+
+```text
+message_delta
+message_completed
+journey_updated
+task_updated
+card_created
+completed
+error
+```
+
+FastGPT 原始 SSE 事件不能直接暴露给终端厂商。
+
+### 3.5 知识库能力
+
+FastGPT 知识库能力包括:
+
+- 创建知识库;
+- 查询知识库列表和详情;
+- 文件集合管理;
+- 文档导入;
+- 分段管理;
+- 检索测试;
+- 训练订单;
+- 图片和多模态相关增强能力。
+
+需要区分版本:
+
+| 能力 | 社区版 | 商业版/云服务版 | emoon 建议 |
+| --- | --- | --- | --- |
+| 基础知识库 | 支持 | 支持 | P1 可接 |
+| 文档导入 | 支持 | 支持 | P1 可接 |
+| 知识库索引增强 | 受限 | 支持 | 不作为 P0 承诺 |
+| Web 站点同步 | 受限 | 支持 | 不作为 P0 承诺 |
+| 第三方知识库同步 | 受限 | 支持 | 商务确认后再排期 |
+| 图片知识库 | 受限 | 支持 | 医疗影像/舌象不能直接依赖 |
+
+医梦的原则:
+
+```text
+emoon 保存知识库源资产。
+FastGPT 保存运行副本。
+医生反馈先进入 emoon,再决定是否更新 FastGPT 知识库。
+```
+
+### 3.6 MCP 能力
+
+FastGPT 源码中 `packages/service/core/app/mcp.ts` 使用:
+
+- `@modelcontextprotocol/sdk`;
+- `StreamableHTTPClientTransport`;
+- `SSEClientTransport`;
+- `listTools`;
+- `callTool`;
+- 工具调用超时约 300 秒;
+- `isInternalAddress()` 内网地址防护;
+- JSON Schema `$ref` 解析时禁用 file/http,降低 SSRF 风险。
+
+这是 FastGPT 相比 Dify 的重要优势,但也带来边界风险。
+
+医梦规定:
+
+```text
+FastGPT MCP Client 只能连 emoon MCP Gateway。
+FastGPT 不能直接连 HIS / LIS / EMR / PACS / 支付 / 叫号 / 设备平台。
+```
+
+### 3.7 版本能力
+
+FastGPT 源码存在:
+
+```text
+/api/core/app/version/list
+/api/core/app/version/publish
+/api/core/app/version/detail
+/api/core/app/version/latest
+/api/core/app/version/update
+```
+
+能力可用于版本列表、发布、详情、最新版本和更新。但 emoon 不应完全依赖 FastGPT 作为医疗场景版本事实源。
+
+emoon 需要额外保存:
+
+- `agentId`;
+- `fastgptAppId`;
+- `fastgptVersionId`;
+- FastGPT App 快照;
+- emoon 输出 Schema 版本;
+- 生效状态;
+- 灰度策略;
+- 回滚指针。
+
+### 3.8 运营和日志能力
+
+FastGPT 可提供应用运行数据和模型调用数据,但公司评审要注意:
+
+| 能力 | 风险 |
+| --- | --- |
+| 运行日志看板 | 商业版能力,不应默认进入 P0 |
+| 应用评测 | 商业版/云服务版能力更完整 |
+| 内容审核 | 商业版能力,不应替代 emoon 医疗安全规则 |
+| 模型日志 | 可用于辅助对账,但不能替代 emoon 计量账本 |
+| 用户反馈 | 可用作辅助标注,但医生反馈主链路必须在 emoon |
+
+### 3.9 emoon 主调用 FastGPT API 清单
+
+完整 FastGPT route 明细见 [附录 A](#附录-a-fastgpt-当前源码-api-明细)。正文只保留 emoon 需要纳入架构评审、接口设计和工程排期的主调用接口族;这些接口必须经由 `FastGPT Adapter` 封装,业务模块不得直接散落调用 FastGPT。
+
+| 功能域 | 接口 | 主要功能介绍 | emoon 是否需要对接 | 当前系统环境是否需要对接 |
+|--------|------|--------------|--------------------|--------------------------|
+| 对话运行 | `POST /api/v1/chat/completions` | FastGPT OpenAI 风格主对话入口,支持同步/流式输出、`chatId`、`variables`、`detail` 等运行参数 | 是,P0 | 是,作为 `FastGptAgentEngine` 主入口 |
+| 对话运行 | `POST /api/v2/chat/completions` | v2 对话入口,能力随 FastGPT 版本演进,适合后续评估替换 v1 | 暂不 P0 | 否,先以 v1 稳定接入为准 |
+| 对话运行 | `POST /api/v2/chat/stop` | 停止运行中的会话任务,用于前端取消生成或超时熔断 | 是,P1 | 需要,SSE/长任务体验完善后接入 |
+| 对话详情 | `POST /api/core/chat/getResData` | 获取运行详情、节点响应、引用数据等,用于弥补默认 `usage` 占位问题 | 是,P0 | 是,计量、审计、问题排查必须使用 |
+| 对话详情 | `POST /api/core/chat/record/getResData` | 按历史记录查询单次响应明细 | 是,P1 | 需要,用于医生反馈回放和审计抽查 |
+| 对话记录 | `POST /api/core/chat/getPaginationRecords` | 查询会话分页记录 | 可选 | 当前不作为事实源,仅用于排查 |
+| 对话记录 | `POST /api/core/chat/record/getPaginationRecords` | 查询记录级分页列表 | 可选 | 当前不作为事实源,仅用于后台诊断 |
+| 对话恢复 | `POST /api/core/chat/resume` | 恢复中断的对话运行 | 可选 | 仅在 FastGPT 工作流存在人工中断/恢复场景时接入 |
+| 文件上传 | `POST /api/core/chat/file/presignChatFilePostUrl` | 获取聊天文件上传预签名地址 | 谨慎对接 | 仅允许 emoon File Service 代办,医生端/患者端不得直传 FastGPT |
+| 文件下载 | `POST /api/core/chat/file/presignChatFileGetUrl` | 获取聊天文件下载预签名地址 | 谨慎对接 | 仅用于受控回放和审计,不作为长期文件地址 |
+| 反馈 | `POST /api/core/chat/feedback/updateUserFeedback` | 写入用户反馈、点赞点踩或纠错信息 | 是,P1 | 需要,但医生反馈仍须先落 emoon 反馈表 |
+| 应用详情 | `POST /api/core/app/detail` | 获取 FastGPT 应用完整配置详情 | 是,P0 | 是,用于配置校验和版本映射 |
+| 应用信息 | `POST /api/core/app/getBasicInfo` | 获取应用基础信息 | 是,P0 | 是,用于健康检查和后台展示 |
+| 应用权限 | `POST /api/core/app/getPermission` | 查询应用访问权限 | 是,P1 | 需要,用于发布前校验 |
+| 应用列表 | `GET /api/core/app/list` | 查询应用列表 | 可选 | 管理后台可用,运行链路不依赖 |
+| 应用版本 | `GET /api/core/app/version/list` | 查询应用版本列表 | 是,P0 | 是,支撑 emoon 版本映射和回滚 |
+| 应用版本 | `GET /api/core/app/version/detail` | 查询指定应用版本详情 | 是,P0 | 是,发布审计和差异比对需要 |
+| 应用版本 | `GET /api/core/app/version/latest` | 查询最新版本 | 是,P0 | 是,但不能自动替换 emoon 生效版本 |
+| 应用发布 | `POST /api/core/app/version/publish` | 发布 FastGPT 应用版本 | 谨慎对接 | 仅允许 emoon 管理后台受控触发,不允许运营直接绕过版本映射 |
+| 应用日志 | `POST /api/core/app/logs/list` | 查询应用运行日志 | 是,P1 | 需要,用于联调、灰度和线上问题定位 |
+| 应用日志 | `POST /api/core/app/logs/exportLogs` | 导出应用日志 | 可选 | 审计导出场景需要,默认不进入 P0 |
+| MCP 工具 | `POST /api/core/app/mcpTools/getTools` | 查询应用可用 MCP 工具 | 是,P1 | 需要,用于验证 FastGPT 只能看到 emoon MCP Gateway 暴露的工具 |
+| MCP 工具 | `POST /api/core/app/mcpTools/getChildren` | 查询 MCP 工具子级/明细 | 是,P1 | 需要,用于工具权限巡检 |
+| MCP 工具 | `POST /api/core/app/mcpTools/create` | 在 FastGPT 内创建 MCP ToolSet 应用,绑定远端 MCP Server URL、请求头密钥和工具列表 | 是,P1 | 需要,但只能注册 emoon MCP Gateway 或其受控代理地址 |
+| MCP 工具 | `POST /api/core/app/mcpTools/update` | 更新 FastGPT MCP ToolSet 的 URL、密钥和工具列表 | 是,P1 | 需要,必须由 emoon 发布流程触发并记录版本 |
+| MCP 工具 | `POST /api/core/app/mcpTools/runTool` | 通过 FastGPT 临时调用远端 MCP 工具,常用于配置验证和调试 | 谨慎对接 | 当前只用于验收测试,不进入生产业务主链路 |
+| MCP Server | `GET /api/support/mcp/list` | 查询 FastGPT 对外暴露的 MCP Server 配置 | 可选,P2 | 当前不作为医梦医疗工具入口,只用于评估 FastGPT 应用被外部调用 |
+| MCP Server | `POST /api/support/mcp/create` | 将若干 FastGPT 应用包装成 MCP Server 工具对外暴露 | 可选,P2 | 非 P0;不能替代 emoon 医疗工具网关 |
+| MCP Server | `PUT /api/support/mcp/update` | 更新 FastGPT MCP Server 名称和绑定应用列表 | 可选,P2 | 非 P0;如使用必须纳入版本审计 |
+| MCP Server | `DELETE /api/support/mcp/delete` | 删除 FastGPT MCP Server 配置 | 可选,P2 | 非 P0 |
+| MCP Server | `POST /api/mcp/app/[key]/mcp` | FastGPT 提供的 MCP 协议端点,外部 MCP Client 可通过 key 调用被绑定的 FastGPT 应用工具 | 可选,P2 | 只适合把 FastGPT 应用暴露给 emoon 或内部工具,不面向医院系统 |
+| OpenAPI Key | `POST /api/support/openapi/create` | 创建 FastGPT OpenAPI Key | 谨慎对接 | 建议由部署/运维初始化,生产运行不频繁调用 |
+| OpenAPI Key | `GET /api/support/openapi/list` | 查询 OpenAPI Key 列表 | 是,P1 | 需要,用于配置巡检和密钥轮换检查 |
+| 健康探活 | `GET /api/support/openapi/health` | OpenAPI 健康检查 | 是,P0 | 是,作为 Adapter 健康探活基础接口 |
+| 知识库 | `GET /api/core/dataset/list` | 查询知识库列表 | 是,P0 | 是,用于运行副本映射和配置校验 |
+| 知识库 | `POST /api/core/dataset/create` | 创建知识库 | 是,P1 | 需要,限管理后台/交付工具调用 |
+| 知识库 | `GET /api/core/dataset/detail` | 查询知识库详情 | 是,P0 | 是,用于副本状态核验 |
+| 知识库 | `POST /api/core/dataset/update` | 更新知识库配置 | 是,P1 | 需要,但必须由 emoon 知识资产发布流程触发 |
+| 知识检索 | `POST /api/core/dataset/searchTest` | 对知识库执行检索测试 | 是,P1 | 需要,用于验收、召回质量评测和排障 |
+| 知识集合 | `POST /api/core/dataset/collection/create/fileId` | 基于已上传文件创建知识集合 | 是,P1 | 需要,前提是文件先进入 emoon File Service 并完成脱敏/审计 |
+| 知识集合 | `POST /api/core/dataset/collection/list` | 查询知识集合列表 | 是,P1 | 需要,用于同步状态和问题排查 |
+| 知识分段 | `POST /api/core/dataset/data/list` | 查询知识分段数据 | 是,P1 | 需要,用于抽检、医生纠错和知识治理 |
+| 训练队列 | `GET /api/core/dataset/training/getDatasetTrainingQueue` | 查询知识库训练队列 | 是,P1 | 需要,用于发布进度展示和失败重试 |
+| 训练错误 | `GET /api/core/dataset/training/getTrainingError` | 查询训练错误 | 是,P1 | 需要,用于运维告警和交付排障 |
+| 模型配置 | `GET /api/core/ai/model/list` | 查询 FastGPT 可用模型 | 是,P1 | 需要,用于环境验收,不作为业务模型事实源 |
+| 模型测试 | `POST /api/core/ai/model/test` | 测试模型连通性 | 是,P1 | 需要,用于部署验收和健康诊断 |
+
+对正文主调用接口的结论:P0 只覆盖对话主链路、应用版本映射、健康探活和知识库状态核验;P1 再补充文件受控流转、日志、反馈、训练队列、MCP ToolSet 注册、MCP 工具巡检和模型验收;FastGPT 自身的 MCP Server 暴露能力不进入医疗工具 P0,附录中大量用户、团队、市场、插件、初始化、迁移、商业版管理接口不应由 emoon 业务运行链路直接依赖。
+
+### 3.10 emoon 调用 FastGPT 的功能价值评估
+
+| 功能域 | emoon 是否调用 | 优先级 | 调用价值 | 边界与注意事项 |
+| --- | --- | --- | --- | --- |
+| 对话生成 `/v1/chat/completions` | 是 | P0 | 替代 Dify 承接 Agent 推理和 Workflow 子流程 | 只由 `FastGptAgentEngine` 调用,不暴露给终端 |
+| SSE 流式 | 是 | P0 | 支撑统一入口客户端实时反馈 | 必须归一成 emoon SSE 事件 |
+| `detail=true.responseData` | 是 | P0 | 获取节点级用量和调试信息 | 默认 usage 不可信,需二次归集 |
+| 应用详情/探活 | 是 | P0/P1 | 验证 FastGPT App 和 API Key 可用 | 不作为业务配置事实源 |
+| 应用版本 | 是 | P1 | 支撑灰度、回滚、审计 | emoon 仍保存版本映射和快照 |
+| 应用日志 | 可选 | P1 | traceId 排障和计量对账辅助 | 不能替代 emoon 审计 |
+| 知识库 CRUD | 是 | P1 | 同步知识库运行副本 | emoon 保存源资产,FastGPT 只运行检索副本 |
+| 知识库检索测试 | 是 | P1 | 验证 RAG 效果 | 不直接面向医院用户 |
+| MCP 工具集 | 可选 | P1 | 验证 FastGPT 能调用 emoon MCP Gateway | 不允许连接医院原始系统 |
+| OpenAPI Key 管理 | 可选 | P1 | 交付和运维时创建/检查 Key | 生产运行建议用预置密钥和 emoon 配置管理 |
+| 用户/团队 | 否 | - | FastGPT 平台内部能力 | emoon 自己维护医院项目和授权 |
+| 外链发布 | 否 | - | FastGPT 自有发布渠道 | 医生端、患者端、终端入口必须走 emoon |
+| 插件市场 | 否 | P2/P3 | 远期模板参考 | 医疗工具必须经 emoon 安全审查 |
+| 沙箱/Skill | 否 | P2/P3 | 开发增强 | 不承载医疗生产业务代码 |
+| FastGPT 文件接口 | 谨慎 | P1/P2 | 只用于 FastGPT 内部临时文件 | 医疗敏感文件必须先入 emoon File Service |
+
+### 3.11 emoon 模块依赖 FastGPT 接口族架构图
+
+下面的图只表达接口依赖关系,不表示所有接口都会进入 P0。实线是运行主链路,虚线是管理、运维、验证或后续增强链路。
+
+```mermaid
+flowchart TB
+    Open["emoon-openplatform\n外部 API / SSE / 鉴权"]
+    Agent["emoon-ai-agent\nFastGptAgentEngine / OutputNormalizer"]
+    System["emoon-system / emoon-admin\n引擎配置 / 管理后台"]
+    File["emoon-ai-file\n文件事实源 / 短期 URL"]
+    Card["emoon-ai-card\nCard Runtime / Card Action"]
+    Mcp["emoon-ai-mcp\nMCP Gateway / HIS Adapter"]
+    Meter["emoon-ai-meter / billing\nUsage 归集 / 账本"]
+    Audit["Audit / Operation\n审计 / 运营分析"]
+
+    ChatApi["FastGPT 对话接口\n/v1/chat/completions"]
+    ChatRead["FastGPT 会话/记录接口\n/core/chat/*"]
+    AppApi["FastGPT 应用/版本/日志接口\n/core/app/*"]
+    DatasetApi["FastGPT 知识库接口\n/core/dataset/*"]
+    McpApi["FastGPT MCP/OpenAPI 接口\n/support/mcp/* /support/openapi/*"]
+    PlatformApi["FastGPT 平台接口\nuser/team/outLink/plugin/admin/common/system"]
+
+    Open --> Agent
+    Agent --> ChatApi
+    Agent -.断线恢复/排障.-> ChatRead
+    System -.配置校验/版本映射.-> AppApi
+    Agent -.应用版本/日志辅助.-> AppApi
+    System -.知识库运行副本管理.-> DatasetApi
+    Agent -.RAG 效果验证.-> DatasetApi
+    File -.短期 URL / 脱敏摘要.-> Agent
+    Agent --> Card
+    Card --> Mcp
+    ChatApi -.工具调用只能经网关.-> Mcp
+    System -.OpenAPI Key / MCP 配置验证.-> McpApi
+    McpApi -.只允许指向.-> Mcp
+    Agent --> Meter
+    ChatApi -.responseData / usage 明细.-> Meter
+    Agent --> Audit
+    AppApi -.运行日志辅助对账.-> Audit
+    PlatformApi -.默认不接入医梦生产链路.-> System
+```
+
+模块依赖结论:
+
+- `emoon-ai-agent` 是运行时唯一直接调用 FastGPT 对话接口的模块;
+- `emoon-system / emoon-admin` 只做配置、探活、版本映射和知识库运行副本管理;
+- `emoon-ai-file` 不调用 FastGPT,只给 Agent 提供可控文件引用;
+- `emoon-ai-card` 不调用 FastGPT,只消费 Agent 归一后的卡片建议;
+- `emoon-ai-mcp` 是 FastGPT 工具调用唯一可达的医院系统网关;
+- `emoon-ai-meter / billing` 不读取 FastGPT 默认 usage 扣费,只消费 Adapter 提取后的节点用量和 emoon 自身事件;
+- FastGPT 用户、团队、外链、插件市场、初始化迁移接口不进入当前医梦医疗生产链路。
+
+## 4. Dify vs FastGPT 对比
+
+### 4.1 产品能力对比
+
+| 能力 | Dify | FastGPT | 结论 |
+| --- | --- | --- | --- |
+| Workflow | 成熟,生态大 | 支持 advanced Workflow | 基本对等 |
+| Agent | 支持 | 支持 chatAgent | 基本对等 |
+| RAG | 成熟 | 成熟,中文文档友好 | 基本对等 |
+| MCP | 非原生或需适配 | 原生 MCP ToolSet | FastGPT 优势 |
+| HTTP 工具 | 支持 | 支持 httpToolSet | 基本对等 |
+| OpenAPI 调用 | 自有协议 | OpenAI-like | FastGPT 工程接入更接近标准 |
+| 版本管理 | 发布/回滚语义较完整 | 有版本 API,但需校准 | Dify 更成熟 |
+| 社区生态 | 更大 | 国内中文生态较强 | 取决于客户偏好 |
+| 部署 | 依赖更多组件 | MongoDB 为主,部署相对轻 | FastGPT 部署较轻 |
+| 开源协议 | Apache 2.0 | Apache 2.0 + 附加条件 | Dify 更宽松 |
+
+### 4.2 工程接入对比
+
+| 维度 | Dify 接入 | FastGPT 接入 | emoon 决策 |
+| --- | --- | --- | --- |
+| 对话请求 | `/v1/chat-messages` | `/api/v1/chat/completions` | 新增 `FastGptAgentEngine` |
+| 输入变量 | `inputs` | `variables` | `AgentRequest.inputs` 映射到 `variables` |
+| 会话 ID | Dify `conversation_id` | FastGPT `chatId` | emoon conversationId 仍为事实源 |
+| 流式格式 | Dify 自有事件 | OpenAI-like SSE + detail 事件 | 统一由 Adapter 归一 |
+| 用量 | metadata.usage | v1 usage 默认占位 | FastGPT 需特殊归集 |
+| 知识库 API | 已有 `DifyKnowledgeEngine` | 需新增 `FastGptKnowledgeEngine` | P1 做 |
+| 健康探活 | `/parameters` 可探 | 无统一稳定 health 端点 | 用最小对话或应用详情探活 |
+| 意图识别 | 已有 `DifyIntentClient` | 需抽象成可配置 Intent Client | P1 做 |
+
+### 4.3 医疗业务影响对比
+
+| 医梦能力 | 使用 Dify | 使用 FastGPT | 是否改变 emoon 责任 |
+| --- | --- | --- | --- |
+| OpenPlatform 鉴权 | emoon 控制 | emoon 控制 | 不变 |
+| 设备场景 | emoon 控制 | emoon 控制 | 不变 |
+| TaskState | emoon 控制 | emoon 控制 | 不变 |
+| Card Runtime | emoon 控制 | emoon 控制 | 不变 |
+| MCP Gateway | emoon 控制 | emoon 控制 | 不变 |
+| 计量账本 | emoon 控制 | emoon 控制 | 不变,但 FastGPT usage 解析更复杂 |
+| 医生反馈 | emoon 控制 | emoon 控制 | 不变 |
+| 知识库源资产 | emoon 控制 | emoon 控制 | 不变 |
+| Workflow 子流程 | Dify 执行 | FastGPT 执行 | 实现层改变 |
+
+## 5. emoon 当前 Dify 接入现状
+
+### 5.1 已存在的 Dify 代码
+
+当前工程已经不是“尚未接入 Dify”的状态。已发现的关键点:
+
+| 类型 | 位置 | 说明 |
+| --- | --- | --- |
+| 对话引擎 | `emoon-ai-agent` 中 `DifyAgentEngine` | 已实现同步和 SSE |
+| 知识库引擎 | `emoon-ai-agent` 中 `DifyKnowledgeEngine` | 已实现知识库、文档、分段、检索等大量 API |
+| 意图识别 | `DifyIntentClient` | AgentRouter 可调用 Dify 意图智能体 |
+| 管理后台连通性 | `AiEngineConnectivityClient` | 当前支持 `mock` 和 `dify` |
+| OpenPlatform 旧客户端 | `emoon-openplatform/dify/*` | 仍有 DifyApiClient 和领域对象 |
+| 知识库调用 | `KnowledgeBaseServiceImpl` / `KnowledgeBaseController` | 多处硬编码 `dify` |
+| 应用对话服务 | `AgentChatApplicationServiceImpl` | 存在固定 Dify Agent ID 和 `getEngine("dify")` |
+
+### 5.2 当前切换成本判断
+
+切换成本不是零,但仍可控。
+
+低成本部分:
+
+- `AgentEngine` 已是可插拔接口;
+- `AgentRequest` / `AgentResponse` 可以复用;
+- `AgentEngineFactory` 可自动收集新实现;
+- Card Runtime、Device、MCP、Meter 的目标边界已经存在;
+- Maven 模块分层已为新实现预留位置。
+
+中等成本部分:
+
+- 知识库接口大量 Dify 语义需要抽象;
+- 意图识别需要从 `DifyIntentClient` 泛化;
+- 连通性测试和配置脱敏需要支持 FastGPT;
+- OpenPlatform 中固定 Dify 逻辑需要迁移到领域层或配置层;
+- FastGPT usage 不能直接入账。
+
+高风险部分:
+
+- 如果让 FastGPT 直接连接医院系统,会破坏医梦中台边界;
+- 如果把 FastGPT Workflow 当作医疗主状态机,会导致审计、计量、回滚、人工确认不可控;
+- 如果直接删除 Dify,会影响已有联调链路。
+
+## 6. 目标架构与边界
+
+### 6.1 五层架构
+
+```mermaid
+flowchart TB
+    Entry["外部入口层\n小程序 / 医生端 / 终端 / 医院门户 / 第三方系统"]
+    Open["医梦 OpenPlatform\n鉴权 / 限流 / 签名 / SSE / 对外契约"]
+    Control["医梦医疗智能体应用控制层\n路由 / TaskState / Card / File / Meter / Audit"]
+    Adapter["FastGPT Adapter\n输入裁剪 / API 调用 / SSE 归一 / 输出校验"]
+    FastGPT["FastGPT AI 能力层\nLLM / Workflow / RAG / OCR / MCP Client"]
+    Mcp["医梦 MCP Gateway\nHIS / LIS / EMR / PACS / 支付 / 叫号适配"]
+    Hospital["医院业务系统\nHIS / LIS / EMR / PACS / 支付 / 叫号 / 物联平台"]
+
+    Entry --> Open
+    Open --> Control
+    Control --> Adapter
+    Adapter --> FastGPT
+    Control --> Mcp
+    FastGPT -.仅允许调用.-> Mcp
+    Mcp --> Hospital
+```
+
+### 6.2 正确职责划分
+
+| 层级 | 归属 | 职责 |
+| --- | --- | --- |
+| 外部入口 | emoon / 医院入口接 emoon | 用户入口、终端入口、医生端入口 |
+| OpenPlatform | emoon | 鉴权、签名、SSE、幂等、traceId、对外接口 |
+| 医疗控制层 | emoon | 场景、任务、卡片、文件、工具、计量、审计 |
+| FastGPT Adapter | emoon | 适配 FastGPT API,控制输入输出 |
+| AI 能力层 | FastGPT / 深信服 | Workflow、RAG、OCR、模型调用 |
+| 医院系统层 | 医院 / 厂商,经 emoon 接入 | HIS、LIS、EMR、支付、叫号等 |
+
+### 6.3 禁止事项
+
+以下行为禁止:
+
+- 终端、医生端、患者端直接调用 FastGPT;
+- FastGPT 直接调用 HIS / LIS / EMR / PACS / 支付 / 叫号;
+- FastGPT 直接持有医院系统密钥;
+- FastGPT Workflow 直接执行挂号、支付、签到、写 EMR 等高风险动作;
+- 将医疗主状态只保存在 FastGPT;
+- 将完整病历、身份证、舌象原图等敏感数据无控制地传给 FastGPT;
+- 用 FastGPT 默认 `usage` 直接扣费;
+- 在 `emoon-openplatform` 新增 FastGPT 业务实现逻辑。
+
+### 6.4 emoon-backend 内部系统与 FastGPT 调用关系
+
+FastGPT 在 emoon-backend 中只有一个直接调用入口:
+
+```text
+emoon-ai-agent / FastGPT Adapter
+```
+
+其他模块通过 emoon 内部 API、Facade、领域服务与 `emoon-ai-agent` 协作,不直接调用 FastGPT。
+
+```mermaid
+flowchart LR
+    subgraph Entry["入口模块"]
+        Open["emoon-openplatform\nOpenAPI / SSE / 鉴权 / 幂等"]
+        Admin["emoon-admin\n管理后台入口"]
+    end
+
+    subgraph Api["API 契约层"]
+        AgentApi["emoon-ai-agent-api\nAgentRequest / AgentResponse"]
+        CardApi["emoon-ai-card-api"]
+        DeviceApi["emoon-ai-device-api"]
+        FileApi["emoon-ai-file-api"]
+        MeterApi["emoon-ai-meter-api"]
+        McpApi["emoon-ai-mcp-api"]
+        SystemApi["emoon-system-api\nAiAgentEngineConfig"]
+    end
+
+    subgraph Domain["医梦 AI 领域实现层"]
+        Agent["emoon-ai-agent\nAgentRouter / TaskState / FastGptAgentEngine"]
+        FastAdapter["FastGPT Adapter\n输入裁剪 / SSE 归一 / 输出校验 / Usage 提取"]
+        Card["emoon-ai-card\nCard Runtime / Card Action"]
+        Device["emoon-ai-device\nDevice Registry / Scene Profile"]
+        File["emoon-ai-file\n文件元数据 / 短期 URL / 审计"]
+        Meter["emoon-ai-meter\nMeterEvent / Usage 归集"]
+        Billing["emoon-ai-billing\n账单 / 能力值"]
+        Audit["审计日志\ntraceId / 输入输出摘要"]
+        Mcp["emoon-ai-mcp\nMCP Gateway / HIS Adapter"]
+        System["emoon-system\n引擎配置 / 管理后台 CRUD"]
+    end
+
+    FastGPT["FastGPT\nWorkflow / RAG / OCR / LLM / MCP Client"]
+    Hospital["医院系统\nHIS / LIS / EMR / PACS / 支付 / 叫号 / 物联"]
+
+    Open --> AgentApi --> Agent
+    Admin --> SystemApi --> System
+    System --> Agent
+    Agent --> FastAdapter --> FastGPT
+    Agent --> CardApi --> Card
+    Agent --> DeviceApi --> Device
+    Agent --> FileApi --> File
+    Agent --> MeterApi --> Meter
+    Meter --> Billing
+    Agent --> Audit
+    Card --> McpApi --> Mcp
+    FastGPT -.仅允许工具调用.-> Mcp
+    Mcp --> Hospital
+    File -.短期受控 URL / 脱敏摘要.-> FastAdapter
+    FastAdapter -.节点 usage / responseData.-> Meter
+```
+
+调用顺序按一次终端对话请求拆解如下:
+
+| 顺序 | 发起方 | 接收方 | 调用内容 | 说明 |
+| --- | --- | --- | --- | --- |
+| 1 | 终端 / 医生端 / 患者端 | `emoon-openplatform` | `/agent/chat/stream` 等 P0 接口 | 外部只接 emoon,不接 FastGPT |
+| 2 | `emoon-openplatform` | `emoon-ai-agent-api` | 统一 Agent 命令 | 入口层只做鉴权、签名、SSE、幂等 |
+| 3 | `emoon-ai-agent` | `emoon-ai-device` | 查询设备场景和允许能力 | 限定 allowedAgents / allowedCards |
+| 4 | `emoon-ai-agent` | `emoon-ai-file` | 获取短期文件 URL 或脱敏摘要 | FastGPT 不接收文件事实源 |
+| 5 | `emoon-ai-agent` | `FastGPT Adapter` | 组装 FastGPT 请求 | 裁剪输入,注入 traceId、任务、动线、设备上下文 |
+| 6 | `FastGPT Adapter` | FastGPT | `/api/v1/chat/completions` | 唯一直接调用 FastGPT 的运行链路 |
+| 7 | FastGPT | `emoon-ai-mcp` | MCP 工具调用,可选 | 只能调用 emoon MCP Gateway |
+| 8 | `emoon-ai-mcp` | 医院系统 | HIS/LIS/EMR/PACS/支付/叫号适配 | 医院系统不感知 FastGPT |
+| 9 | FastGPT | `FastGPT Adapter` | SSE / JSON / responseData | Adapter 做输出校验和 usage 提取 |
+| 10 | `emoon-ai-agent` | `emoon-ai-card` | 创建卡片实例 | FastGPT 只返回卡片建议 |
+| 11 | `emoon-ai-agent` | `emoon-ai-meter` / Audit | 写计量事件和审计摘要 | 不使用 FastGPT 默认 usage 直接扣费 |
+| 12 | `emoon-openplatform` | 外部终端 | `message_delta` / `card_created` / `completed` | 对外事件格式保持 emoon 稳定契约 |
+
+各内部系统与 FastGPT 的关系:
+
+| emoon 内部系统 | 是否直接调用 FastGPT | 与 FastGPT 的关系 | 关键注意事项 |
+| --- | --- | --- | --- |
+| `emoon-openplatform` | 否 | 入口层通过 Agent API 间接触发 | 不写 FastGPT HTTP 客户端,不保存 FastGPT 业务状态 |
+| `emoon-admin` | 否 | 管理后台配置引擎、Agent、知识库映射 | 只调用 emoon 管理服务,不绕过领域层 |
+| `emoon-system` | 有限 | 可做 FastGPT 配置校验、App/版本元数据读取 | 只做管理面,不进入运行主链路 |
+| `emoon-ai-agent` | 是 | 唯一运行时直接调用 FastGPT 的领域模块 | 放置 `FastGptAgentEngine`、输出归一、usage 提取 |
+| `emoon-ai-card` | 否 | 消费 FastGPT 归一后的卡片建议 | 卡片实例和动作状态仍在 emoon |
+| `emoon-ai-device` | 否 | 提供设备和场景上下文给 Agent | 不把设备配置同步给 FastGPT 做事实源 |
+| `emoon-ai-file` | 否 | 提供短期 URL 或脱敏摘要 | 医疗敏感文件事实源在 emoon |
+| `emoon-ai-mcp` | 被 FastGPT 间接调用 | 作为 FastGPT MCP Client 唯一可连工具网关 | 工具风险分级、鉴权、幂等、审计必须在此层 |
+| `emoon-ai-meter` | 否 | 消费 FastGPT 节点用量和 emoon 调用事件 | 默认 usage 不可信,账本以 emoon 归集为准 |
+| `emoon-ai-billing` | 否 | 基于 Meter 事件生成账单 | 不读取 FastGPT 账单作为事实源 |
+| `emoon-ai-operation` | 否 | 运营统计可引用 FastGPT 日志摘要 | 指标口径以 emoon 事件为准 |
+
+## 7. 模块级接入设计
+
+### 7.1 模块归属
+
+遵循 `AI中台工程约束.md`:
+
+| 能力 | 落位模块 | 说明 |
+| --- | --- | --- |
+| FastGPT 对话引擎 | `emoon-ai-agent` | 新增 `FastGptAgentEngine` |
+| FastGPT 输出归一 | `emoon-ai-agent` | 新增 `FastGptOutputNormalizer` |
+| FastGPT 知识库运行副本 | `emoon-ai-agent` 或后续独立知识库适配 | 新增 `FastGptKnowledgeEngine` |
+| FastGPT 配置管理 | `emoon-system` + API 契约 | 扩展 `AiAgentEngineConfig` 语义 |
+| Card Runtime | `emoon-ai-card` | 不放到 FastGPT |
+| MCP Gateway | `emoon-ai-mcp` | 医院系统唯一工具网关 |
+| 文件事实源 | `emoon-ai-file` | 敏感文件先入 emoon |
+| 计量账本 | `emoon-ai-meter` / `billing` | 不信任 FastGPT 默认 usage |
+| 对外入口 | `emoon-openplatform` | 只做入口适配,不写 FastGPT 业务逻辑 |
+
+### 7.2 新增 `engineType=fastgpt`
+
+`ai_agent_engine_config.engine_type` 增加:
+
+```text
+fastgpt
+```
+
+建议配置结构:
+
+```json
+{
+  "baseUrl": "http://fastgpt:3000",
+  "apiKey": "fastgpt-xxxx",
+  "appId": "fastgpt-app-id",
+  "detailMode": "metering",
+  "timeout": {
+    "connectMs": 10000,
+    "readMs": 120000,
+    "sseIdleMs": 300000
+  },
+  "fallbackPolicy": {
+    "onTimeout": "preset_reply",
+    "onError": "preset_reply",
+    "presetReply": "AI 服务暂时不可用,请稍后再试"
+  },
+  "outputSchemaVersion": "emoon-card-output-v1"
+}
+```
+
+字段说明:
+
+| 字段 | 必填 | 说明 |
+| --- | --- | --- |
+| `baseUrl` | 是 | FastGPT 服务地址,不含末尾 `/` |
+| `apiKey` | 是 | FastGPT 应用级 API Key |
+| `appId` | 建议 | 用于 emoon 侧映射和审计;实际调用可能由 API Key 鉴权决定 |
+| `detailMode` | 是 | `off` / `debug` / `metering`,控制是否请求 `detail=true` |
+| `timeout` | 是 | 连接、读取、SSE 空闲超时 |
+| `fallbackPolicy` | 是 | 超时或异常时的降级策略 |
+| `outputSchemaVersion` | 是 | FastGPT 输出必须满足的 emoon Schema |
+
+### 7.3 `FastGptAgentEngine`
+
+新增实现:
+
+```text
+emoon-infra/emoon-modules/emoon-ai/emoon-ai-agent
+└── src/main/java/com/emoon/ai/agent/infrastructure/fastgpt/
+    ├── FastGptAgentEngine.java
+    ├── FastGptApiClient.java
+    ├── FastGptEngineConfig.java
+    ├── FastGptOutputNormalizer.java
+    └── FastGptUsageExtractor.java
+```
+
+职责:
+
+- 实现 `AgentEngine`;
+- `getEngineType()` 返回 `fastgpt`;
+- 同步对话调用 `/api/v1/chat/completions`;
+- 流式对话解析 FastGPT SSE;
+- `AgentRequest.inputs` 映射到 FastGPT `variables`;
+- `conversationId` 映射到 FastGPT `chatId`;
+- 将 FastGPT 输出归一成 `AgentResponse`;
+- 将节点用量写入 metadata,供计量层消费。
+
+不要做:
+
+- 不在 Engine 内创建卡片实例;
+- 不在 Engine 内直接调 MCP;
+- 不在 Engine 内写计量账本;
+- 不在 Engine 内操作 HIS;
+- 不把 FastGPT 原始异常直接暴露给终端。
+
+### 7.4 请求映射
+
+`AgentRequest` 到 FastGPT 请求映射:
+
+| `AgentRequest` | FastGPT 字段 | 说明 |
+| --- | --- | --- |
+| `agentId` | metadata / variables | 用于追踪,不直接依赖 `model` |
+| `conversationId` | `chatId` | emoon 会话 ID 或外部映射 ID |
+| `query` | `messages[-1].content` | 用户输入 |
+| `userId` | `customUid` / variables | 视 FastGPT 鉴权方式决定 |
+| `inputs` | `variables` | 场景、设备、任务、动线、traceId 等 |
+| `files` | message content 中的 `image_url` / `file_url` | 只能传 emoon File Service 生成的受控 URL |
+
+示例请求:
+
+```json
+{
+  "chatId": "conv_20260613_0001",
+  "stream": true,
+  "detail": true,
+  "responseChatItemId": "msg_20260613_0001",
+  "variables": {
+    "traceId": "trace_20260613_0001",
+    "projectId": "1",
+    "deviceType": "kiosk",
+    "sceneCode": "OUTPATIENT_TRIAGE",
+    "taskType": "TRIAGE",
+    "journeyStage": "WAITING_CHECKIN"
+  },
+  "messages": [
+    {
+      "role": "user",
+      "content": "我头疼、发烧,应该挂什么科?"
+    }
+  ]
+}
+```
+
+### 7.5 输出 Schema
+
+FastGPT Workflow 最终输出必须满足 emoon 输出 Schema。建议 P0 使用:
+
+```json
+{
+  "reply": "建议您优先挂发热门诊或全科门诊,由医生进一步判断。",
+  "cards": [
+    {
+      "cardKey": "department-selection",
+      "cardData": {
+        "departments": [
+          {
+            "deptId": "dept_fever",
+            "name": "发热门诊",
+            "reason": "存在发热症状"
+          }
+        ]
+      }
+    }
+  ],
+  "riskLevel": "MEDICAL_ADVICE",
+  "scenarioCode": "OUTPATIENT_TRIAGE"
+}
+```
+
+归一化规则:
+
+- 如果输出是纯文本,全部作为 `reply`;
+- 如果输出是 JSON,必须校验 `reply/cards/riskLevel/scenarioCode`;
+- `cardKey` 必须在 emoon 卡片定义中存在;
+- `cardData` 必须通过卡片 Schema 校验;
+- `riskLevel` 为高风险时,必须触发人工确认或降级;
+- 输出中不得包含未脱敏身份证、手机号、完整病历原文、接口密钥。
+
+## 8. 数据、文件与隐私设计
+
+### 8.1 数据最小化
+
+FastGPT 只接收完成当前 AI 子任务所需的最小上下文。
+
+错误示例:
+
+```json
+{
+  "patientName": "张三",
+  "idCard": "4403...",
+  "phone": "138...",
+  "fullEmrText": "完整病历原文..."
+}
+```
+
+正确示例:
+
+```json
+{
+  "age": 45,
+  "gender": "FEMALE",
+  "chiefComplaint": "头痛伴发热 1 天",
+  "abnormalItems": [
+    {
+      "code": "WBC",
+      "name": "白细胞计数",
+      "value": "12.3",
+      "flag": "HIGH"
+    }
+  ]
+}
+```
+
+### 8.2 文件处理原则
+
+所有医疗敏感文件必须先进入 emoon File Service。
+
+```text
+终端 / 医生端 / 患者端
+        ↓
+emoon /files/upload
+        ↓
+emoon 文件元数据、审计、脱敏、访问控制
+        ↓
+短期受控 URL 或脱敏摘要
+        ↓
+FastGPT
+```
+
+原因:
+
+- 文件上传需要幂等;
+- 文件删除需要审计;
+- 舌象、面诊、报告、身份证等属于敏感数据;
+- FastGPT 不能成为文件源资产;
+- 后续医生反馈和知识库更新需要引用 emoon 文件 ID。
+
+### 8.3 FastGPT 文件 URL 注意事项
+
+FastGPT 对话文档示例支持 `image_url` 和 `file_url`,但这不代表可以直接传长期公网 URL。
+
+要求:
+
+- URL 必须短期有效;
+- URL 必须可审计;
+- URL 不应暴露真实 OSS bucket 结构;
+- URL 不应包含永久 token;
+- URL 最好绑定 traceId / fileId / projectId;
+- 高敏文件应优先传结构化摘要,不传原文件。
+
+## 9. 知识库设计
+
+### 9.1 源资产与运行副本
+
+医梦知识库分两层:
+
+| 层级 | 事实源 | 职责 |
+| --- | --- | --- |
+| 知识库源资产 | emoon | 原始文件、医生反馈、审核状态、版本、发布记录 |
+| 知识库运行副本 | FastGPT | 向量化、RAG 检索、Workflow 引用 |
+
+原则:
+
+```text
+医生反馈不能直接写入 FastGPT 知识库。
+必须先进入 emoon 审核,再同步到 FastGPT 运行副本。
+```
+
+### 9.2 新增 `FastGptKnowledgeEngine`
+
+当前已有 `DifyKnowledgeEngine`,FastGPT 接入需要新增:
+
+- list datasets;
+- get dataset;
+- create dataset;
+- update dataset;
+- upload document;
+- update document;
+- delete document;
+- list segments;
+- create / update / delete segments;
+- retrieve / searchTest;
+- indexing status。
+
+### 9.3 迁移策略
+
+不要一次性把所有知识库从 Dify 迁移到 FastGPT。
+
+建议步骤:
+
+1. 选一个非生产知识库验证创建、上传、检索;
+2. 建立 emoon 本地知识库 ID 与 FastGPT datasetId 的映射;
+3. 只同步已审核文档;
+4. 验证同一问题在 Dify 和 FastGPT 中的检索效果;
+5. 再切换单个 Agent 的知识库运行副本;
+6. 保留 Dify 副本一段时间,支持回退。
+
+## 10. MCP 与医院系统设计
+
+### 10.1 总原则
+
+你的总体设计思路是合理的,并且应作为本文档的正式边界:
+
+```text
+FastGPT 负责“AI 怎么调用工具”。
+医梦负责“工具到底是什么、能不能调、调哪些数据、是否需要医生确认、调用结果如何进入医疗业务闭环”。
+```
+
+FastGPT 的 MCP 能力是优势,但必须被医梦约束。无论深信服交付的 FastGPT 版本是否包含完整 MCP Server 构建能力,医院系统都不能直接暴露给 FastGPT。医梦必须统一对接各家医院,把 HIS、LIS、EMR、PACS、慢病平台、物联平台、支付、叫号等系统封装成标准化、可鉴权、可审计、可限流、可脱敏、可幂等的医疗工具 API。
+
+允许:
+
+```text
+FastGPT Workflow / Agent
+        ↓
+FastGPT MCP ToolSet / HTTP ToolSet
+        ↓
+emoon MCP Gateway / Tool Server
+        ↓
+HIS / LIS / EMR / PACS / 慢病平台 / 物联平台 / 支付 / 叫号
+```
+
+禁止:
+
+```text
+FastGPT → HIS / LIS / EMR / PACS
+FastGPT → 支付 / 挂号 / 叫号原始接口
+FastGPT → 设备平台原始接口
+```
+
+### 10.2 FastGPT 当前 MCP 能力
+
+基于本地源码 `/Users/destiny/dev/emoon/projects/FastGPT`,当前 FastGPT MCP 能力需要分成两类理解。
+
+| 能力 | 本地源码证据 | 作用 | 对医梦的意义 | 是否进入 P0 |
+| --- | --- | --- | --- | --- |
+| MCP Client / MCP ToolSet | `packages/service/core/app/mcp.ts`、`/api/core/app/mcpTools/*` | FastGPT 作为 MCP Client 连接外部 MCP Server,执行 `listTools` 和 `callTool` | 可把 emoon MCP Gateway 注册成 FastGPT 工具集,让 Workflow/Agent 调用受控医疗工具 | 是,作为工具调用主方案 |
+| Streamable HTTP + SSE 兼容 | `MCPClient` 先尝试 `StreamableHTTPClientTransport`,失败后回退 `SSEClientTransport` | 支持两类 MCP 传输方式 | emoon MCP Gateway 应优先实现 Streamable HTTP,同时可提供 SSE 兼容端点 | 是,联调需验证 |
+| 工具列表读取 | `/api/core/app/mcpTools/getTools` | 按 URL 和 headerSecret 拉取远端 MCP 工具 schema | emoon 可用于注册前校验 FastGPT 看到的工具是否被裁剪 | 是,P1 |
+| MCP ToolSet 创建/更新 | `/api/core/app/mcpTools/create`、`/api/core/app/mcpTools/update` | 在 FastGPT 内创建或更新 MCP ToolSet 应用 | emoon 管理后台可受控注册项目级工具集 | 是,P1 |
+| MCP 工具试运行 | `/api/core/app/mcpTools/runTool` | 直接通过 FastGPT 调用远端 MCP 工具 | 只适合联调验收,不应成为生产业务调用入口 | 否,生产不走 |
+| Workflow/Agent 工具调用 | `dispatch/child/runTool.ts`、`dispatch/ai/agent/sub/tool/*` | FastGPT Workflow/Agent 在运行中调用已绑定 MCP 工具 | AI 编排层可决定何时调用工具,但不能绕过 emoon 权限 | 是 |
+| 私网地址防护 | `assertMCPUrlNotInternal(url)` | 阻止 MCP URL 指向内网地址 | emoon Gateway 需要提供 FastGPT 可访问且受控的域名,或由部署方案明确放行代理 | 是,部署风险 |
+| FastGPT MCP Server | `/api/support/mcp/*`、`/api/mcp/app/[key]/mcp` | 把 FastGPT 应用包装成 MCP Server,对外暴露为工具 | 可供 emoon 或内部平台调用 FastGPT 应用,但不能替代医疗工具网关 | 否,P2 |
+| MCP Server 绑定限制 | `McpAppsBodySchema` 最多 50 个应用,创建端限制每团队最多 100 个 MCP 服务 | 限制 FastGPT 对外暴露工具规模 | 不适合承载医院全量工具目录 | 否,P2 |
+
+结论:
+
+- FastGPT 具备“调用外部 MCP Server”的能力,这正好适合调用 emoon MCP Gateway。
+- FastGPT 也具备“把自身应用暴露成 MCP Server”的能力,但它暴露的是 FastGPT 应用,不是医院业务系统适配层。
+- 医疗工具 API 的定义、授权、脱敏、幂等、审计、确认和业务闭环必须在医梦完成。
+- 如果深信服交付版本裁剪掉 MCP ToolSet,则医梦仍提供 Tool Server,FastGPT 通过 HTTP ToolSet 调用;如果连 HTTP ToolSet 也不可用,则工具动作退化为 FastGPT 输出结构化意图,由 emoon Card Runtime 执行。
+
+### 10.3 推荐架构
+
+```mermaid
+flowchart TD
+    Doctor["医生端 / 患者端 / 终端设备"] --> Open["emoon-openplatform\n统一入口 / 鉴权 / SSE"]
+    Open --> Control["医疗智能体应用控制层\n场景路由 / 会话 / 卡片 / 任务状态"]
+    Control --> Adapter["FastGPT Adapter\nengineType=fastgpt"]
+    Adapter --> FastGPT["FastGPT\nAgent / Workflow / RAG / MCP ToolSet"]
+
+    FastGPT -->|"listTools / callTool\n只允许访问受控地址"| Mcp["emoon MCP Gateway / Tool Server\n工具目录 / 鉴权 / 脱敏 / 限流 / 审计 / 幂等"]
+    Mcp --> His["HIS"]
+    Mcp --> Lis["LIS"]
+    Mcp --> Emr["EMR"]
+    Mcp --> Pacs["PACS"]
+    Mcp --> Chronic["慢病平台"]
+    Mcp --> Iot["物联平台"]
+    Mcp --> Pay["支付 / 叫号"]
+
+    FastGPT -.禁止.-> His
+    FastGPT -.禁止.-> Lis
+    FastGPT -.禁止.-> Emr
+    FastGPT -.禁止.-> Iot
+
+    Mcp --> Audit["emoon Audit / Meter / Tool Ledger"]
+    Mcp --> Card["Card Runtime\n人工确认 / 业务闭环"]
+```
+
+这张图表达三个事实:
+
+1. FastGPT 可以编排工具,但不能拥有医院接口主权。
+2. 医梦 MCP Gateway 是医院系统唯一可达的 AI 工具网关。
+3. L3 以上写动作必须回到 Card Runtime 或医生确认流程,不能由模型直接提交。
+
+### 10.4 三种交付模式
+
+| 模式 | 前提 | 调用方式 | 医梦职责 | FastGPT 职责 | 适用优先级 |
+| --- | --- | --- | --- | --- | --- |
+| A. FastGPT MCP ToolSet 主方案 | 深信服交付版本保留 `/core/app/mcpTools/*` 和 Workflow MCP 工具调用 | FastGPT MCP Client → emoon MCP Gateway | 提供 MCP Server、工具目录、权限、审计、脱敏、幂等、确认策略 | 注册 MCP ToolSet,在 Workflow/Agent 中选择工具 | P0/P1 主方案 |
+| B. HTTP ToolSet 兜底 | FastGPT 无 MCP ToolSet,但保留 HTTP ToolSet | FastGPT HTTP ToolSet → emoon Tool Server REST API | 提供 REST Tool Server,接口能力与 MCP 工具一致 | 在 Workflow 中配置 HTTP 工具调用 | P1 兜底 |
+| C. 结构化意图兜底 | FastGPT 无 MCP/HTTP 工具能力或医院环境不允许 FastGPT 主动访问工具 | FastGPT 输出 JSON 意图 → emoon 解析 → Card Action/Tool Executor | 执行全部工具动作和闭环 | 只生成建议、参数和解释 | P0 安全兜底 |
+
+公司评审应以 A 为目标、B 为技术兜底、C 为安全兜底。不能因为 FastGPT 支持 MCP,就把医院接口直接交给 FastGPT 配置。
+
+### 10.5 医梦 MCP Gateway 职责
+
+emoon MCP Gateway 需要提供:
+
+| 能力 | 说明 |
+| --- | --- |
+| 工具目录 | 按租户、医院、项目、科室、设备、Agent 场景返回可见工具 |
+| 工具 schema | 为 FastGPT 提供稳定的 inputSchema、description、枚举、必填项、示例 |
+| 鉴权 | 校验 FastGPT Adapter 签发的 token、租户、项目、Agent、会话、设备、医生或患者身份 |
+| 授权 | 决定当前场景能否看到工具、能否调用工具、是否需要人工确认 |
+| 限流 | 按租户、项目、工具、设备、会话限流,防止模型循环调用 |
+| 脱敏 | 请求进入医院系统前做最小化,响应返回 FastGPT 前去除非必要敏感字段 |
+| 幂等 | 对写动作要求 `idempotencyKey`,防重复签到、重复挂号、重复支付 |
+| 审计 | 记录 traceId、requestId、conversationId、agentVersion、toolName、参数摘要、结果摘要、耗时、调用人、确认人 |
+| 错误归一 | 把 HIS/LIS/EMR/PACS 等异构错误转成统一错误码和可解释文本 |
+| 降级 | 医院系统不可用时返回可恢复错误,不让 FastGPT 编造结果 |
+| 确认编排 | 对 L3 以上动作返回 `requiresConfirmation=true`,交由 Card Runtime 创建确认卡片 |
+
+MCP Gateway 的工具命名建议使用稳定业务语义,不暴露医院厂商或表结构:
+
+```text
+hospital.schedule.search
+hospital.queue.status.get
+patient.report.summary.get
+patient.emr.summary.get
+appointment.intent.prepare
+appointment.confirmed.create
+device.vital.latest.get
+chronic.followup.plan.suggest
+```
+
+### 10.6 工具风险分级
+
+| 风险等级 | 示例 | FastGPT 是否可直接调用 | 控制方式 |
+| --- | --- | --- | --- |
+| L0 公共查询 | 科室介绍、楼层位置 | 可通过 emoon Gateway | 审计 + 限流 |
+| L1 普通业务查询 | 排班、候诊状态 | 可通过 emoon Gateway | 项目授权 + 脱敏 |
+| L2 敏感查询 | 报告、病历摘要 | 谨慎开放 | 身份授权 + 最小化 |
+| L3 业务写入 | 签到、锁号、挂号 | 不允许模型直接执行 | Card Action 人工确认 |
+| L4 财务动作 | 支付、退款 | P0 不开放 | 专项风控 |
+| L5 医疗正式写入 | EMR、处方、诊断 | 不开放自动写 | 医生确认 + 审计 |
+
+补充约束:
+
+- L0/L1 可以让 FastGPT 在 Workflow 中直接调用,但结果仍要进入 emoon 审计。
+- L2 必须最小化返回,优先返回摘要、结论、引用 ID,不返回完整病历或完整报告原文。
+- L3 不能由模型直接完成,FastGPT 最多生成“待确认动作建议”,由 Card Runtime 创建确认卡片。
+- L4/L5 默认不开放;确需开放时必须单独 ADR、安全评审、医院书面确认和专项风控。
+
+### 10.7 FastGPT MCP 配置规则
+
+FastGPT 侧只能注册医梦提供的 MCP/Tool 地址:
+
+```text
+允许:
+https://ai-gateway.{hospital-domain}/mcp/{tenant}/{project}
+https://ai-gateway.{hospital-domain}/tools/http/{tenant}/{project}
+
+禁止:
+http://his.internal.local
+http://lis.xxx.hospital
+http://emr-service:8080
+http://device-platform.private
+```
+
+配置要求:
+
+| 配置项 | 要求 |
+| --- | --- |
+| URL | 只能是 emoon MCP Gateway 或 emoon Tool Server 的受控域名;如果 FastGPT 私网地址防护阻断,需要通过受控公网/专线代理解决,不允许关闭边界控制后直连 HIS |
+| Header Secret | 由 emoon 管理后台生成短期或可轮换 token,不能手工散落在 FastGPT 多个应用中 |
+| ToolList | 由 emoon 生成项目级裁剪结果,再写入 FastGPT MCP ToolSet |
+| Workflow 使用 | FastGPT Workflow 可以选择工具,但不能新增未授权工具 |
+| 版本映射 | MCP ToolSet 配置必须纳入 emoon agentVersion / FastGPT appVersion 映射 |
+| 漂移检测 | 定期比对 FastGPT ToolSet 中的 URL、toolName、schema 与 emoon 发布快照 |
+
+### 10.8 标准调用流程
+
+查询类工具:
+
+```mermaid
+sequenceDiagram
+    participant FG as FastGPT Workflow
+    participant MCP as emoon MCP Gateway
+    participant Auth as emoon Auth/Policy
+    participant HIS as Hospital System
+    participant Audit as Audit/Meter
+
+    FG->>MCP: callTool(toolName, params, trace headers)
+    MCP->>Auth: 校验租户/项目/Agent/会话/身份/工具风险
+    Auth-->>MCP: allow + dataScope
+    MCP->>HIS: 调用医院系统适配器
+    HIS-->>MCP: 原始结果
+    MCP->>MCP: 脱敏 / 摘要 / 错误归一
+    MCP->>Audit: 写工具调用审计
+    MCP-->>FG: 返回受控结果
+```
+
+写入类工具:
+
+```mermaid
+sequenceDiagram
+    participant FG as FastGPT Workflow
+    participant MCP as emoon MCP Gateway
+    participant Card as Card Runtime
+    participant User as 医生/患者
+    participant HIS as Hospital System
+    participant Audit as Audit/Meter
+
+    FG->>MCP: callTool(appointment.intent.prepare, params)
+    MCP-->>FG: requiresConfirmation=true + cardSuggestion
+    FG-->>Card: 输出卡片建议
+    Card->>User: 展示确认卡片
+    User->>Card: 确认
+    Card->>MCP: confirmed action + idempotencyKey
+    MCP->>HIS: 执行业务写入
+    HIS-->>MCP: 写入结果
+    MCP->>Audit: 写确认人、幂等键、结果
+    MCP-->>Card: 业务闭环结果
+```
+
+### 10.9 医梦 MCP 工具 API 契约
+
+所有医疗工具都必须具备统一元数据:
+
+| 字段 | 说明 |
+| --- | --- |
+| `toolName` | 稳定工具名,例如 `hospital.queue.status.get` |
+| `riskLevel` | L0-L5 风险等级 |
+| `tenantId/projectId/hospitalId` | 多租户和医院边界 |
+| `agentId/agentVersion` | AI 应用版本 |
+| `conversationId/requestId/traceId` | 全链路追踪 |
+| `operatorType/operatorId` | 医生、患者、设备、系统任务 |
+| `idempotencyKey` | L3 以上写动作必填 |
+| `dataScope` | 数据授权范围 |
+| `requiresConfirmation` | 是否需要卡片确认 |
+| `expiresAt` | 工具调用上下文过期时间 |
+
+工具返回值必须避免把医院原始响应直接交给模型:
+
+```json
+{
+  "success": true,
+  "toolName": "patient.report.summary.get",
+  "riskLevel": "L2",
+  "traceId": "trace-xxx",
+  "data": {
+    "summary": "血常规提示白细胞略高,需结合症状判断。",
+    "references": [
+      {
+        "type": "report",
+        "refId": "report-123",
+        "displayName": "血常规",
+        "sensitive": false
+      }
+    ]
+  },
+  "requiresConfirmation": false,
+  "auditId": "audit-xxx"
+}
+```
+
+### 10.10 FastGPT MCP Server 能力的边界
+
+FastGPT 的 `/support/mcp/*` 和 `/mcp/app/[key]/mcp` 可以把 FastGPT 应用包装成 MCP Server。这个能力的定位是:
+
+- 让 emoon 或内部平台把某个 FastGPT 应用当作 AI 工具调用;
+- 让多个 FastGPT 应用之间复用“AI 应用工具”;
+- 为非医疗生产链路提供 AI 能力封装。
+
+它不能承担:
+
+- 医院 HIS/LIS/EMR/PACS 的统一适配;
+- 医疗工具的最终鉴权和审计;
+- 医生确认和业务写入闭环;
+- 多医院接口差异治理;
+- 医疗数据脱敏与最小化授权。
+
+因此,即使 FastGPT 有 MCP Server 构建能力,医梦仍要建设 MCP Gateway / Tool Server。FastGPT MCP Server 只作为“AI 应用对外工具化”的可选能力,不作为“医院工具网关”的实现。
+
+## 11. 卡片与任务状态设计
+
+### 11.1 FastGPT 不创建卡片实例
+
+FastGPT 只返回卡片建议:
+
+```json
+{
+  "cardKey": "department-selection",
+  "cardData": {
+    "departments": []
+  }
+}
+```
+
+真正创建卡片实例的是 emoon Card Runtime:
+
+```text
+FastGPT 输出卡片建议
+        ↓
+FastGPTOutputNormalizer 校验
+        ↓
+Card Runtime 创建 ai_card_instance
+        ↓
+OpenPlatform SSE 发送 card_created
+        ↓
+终端执行 Card Action
+        ↓
+emoon 执行业务动作
+```
+
+### 11.2 FastGPT 不维护医疗主状态
+
+医疗任务状态保存在 emoon:
+
+- `conversationId`;
+- `taskId`;
+- `taskType`;
+- `currentStep`;
+- `journeyState`;
+- `cardInstanceId`;
+- `traceId`;
+- `toolInvokeId`;
+- `auditId`。
+
+FastGPT 可辅助判断下一步,但不能成为状态事实源。
+
+## 12. 计量、账本与审计设计
+
+### 12.1 不能信任默认 usage
+
+FastGPT v1 响应 Schema 中 `usage` 可能固定为:
+
+```json
+{
+  "prompt_tokens": 1,
+  "completion_tokens": 1,
+  "total_tokens": 1
+}
+```
+
+这只是占位值,不能进入能力值扣费。
+
+### 12.2 FastGPT 用量归集策略
+
+P0 建议:
+
+- 对需要计量的请求设置 `detail=true`;
+- 从 `responseData` 中提取各节点 `tokens`、`price`、`model`、`moduleName`;
+- 归一成 emoon `MeterEvent`;
+- 同时记录 FastGPT 原始 `responseData` 摘要,便于排障;
+- 计费仍由 emoon 账本决定。
+
+P1 增强:
+
+- 对接 FastGPT 应用日志或模型日志;
+- 建立 traceId 对账;
+- 增加差异告警;
+- 形成项目、设备、智能体、场景维度统计。
+
+### 12.3 审计字段
+
+每次 FastGPT 调用至少记录:
+
+| 字段 | 说明 |
+| --- | --- |
+| `traceId` | 全链路追踪 ID |
+| `projectId` | 项目 |
+| `tenantId` | 租户 |
+| `agentId` | emoon 智能体 ID |
+| `engineType` | `fastgpt` |
+| `fastgptAppId` | FastGPT 应用 ID |
+| `fastgptVersionId` | FastGPT 版本 ID |
+| `conversationId` | emoon 会话 ID |
+| `fastgptChatId` | FastGPT chatId |
+| `messageId` | emoon 消息 ID |
+| `fastgptResponseItemId` | FastGPT 响应 ID |
+| `inputSummary` | 脱敏输入摘要 |
+| `outputSummary` | 脱敏输出摘要 |
+| `usageDetail` | 节点用量摘要 |
+| `errorCode` | 错误码 |
+| `durationMs` | 耗时 |
+
+## 13. 版本、灰度与回滚
+
+### 13.1 版本事实源
+
+FastGPT 有版本能力,但 emoon 必须维护医疗场景发布事实。
+
+建议新增或扩展映射数据:
+
+```text
+agentId
+engineType
+fastgptAppId
+fastgptVersionId
+emoonOutputSchemaVersion
+snapshotJson
+status
+grayPolicy
+publishedBy
+publishedAt
+rollbackFrom
+```
+
+### 13.2 发布流程
+
+```text
+1. FastGPT 中完成 Workflow 调整
+2. FastGPT 发布版本
+3. emoon 拉取版本详情或保存快照
+4. emoon 执行测试问题集
+5. 输出 Schema 校验
+6. 工具权限校验
+7. 计量字段校验
+8. 灰度到指定项目/设备/Agent
+9. 监控错误率与人工反馈
+10. 全量切换或回滚
+```
+
+### 13.3 回滚策略
+
+优先级:
+
+1. 切回上一 FastGPT versionId;
+2. 切回上一 emoon AgentEngine 配置;
+3. 切回 Dify;
+4. 切回 Mock / 模板回复;
+5. 关闭高风险能力,只保留导诊 FAQ。
+
+## 14. 分阶段落地计划
+
+### 阶段 0:技术验证与商务边界确认
+
+目标:
+
+- 确认 FastGPT 部署版本;
+- 确认社区版/商业版能力边界;
+- 确认许可证和 LOGO/版权要求;
+- 验证 `/api/v1/chat/completions`;
+- 验证 `detail=true` 的用量字段;
+- 验证 MCP 能否连接 emoon Gateway;
+- 验证知识库创建、上传、检索。
+
+交付物:
+
+- FastGPT API 验证报告;
+- 社区版/商业版能力清单;
+- 接口样例;
+- 风险确认表。
+
+### 阶段 1:FastGptAgentEngine
+
+目标:
+
+- 新增 `engineType=fastgpt`;
+- 打通同步对话;
+- 打通 SSE;
+- 支持 FastGPT 输出归一;
+- 支持卡片建议;
+- 支持基础异常降级;
+- 支持连通性测试。
+
+验收:
+
+- `/agent/chat` 可通过 FastGPT 返回文本;
+- `/agent/chat/stream` 可返回 `message_delta` 和 `completed`;
+- FastGPT 返回卡片 JSON 后,emoon 创建卡片实例;
+- 异常时返回统一错误,不泄露 FastGPT 内部错误。
+
+### 阶段 2:FastGptKnowledgeEngine
+
+目标:
+
+- 新增 FastGPT 知识库运行副本;
+- 建立 emoon 知识库 ID 与 FastGPT datasetId 映射;
+- 支持文档上传和检索;
+- 保持 emoon 为知识源资产。
+
+验收:
+
+- 指定 Agent 可引用 FastGPT 知识库;
+- 同一问题可对比 Dify/FastGPT 检索效果;
+- 删除或回滚不丢失 emoon 源资产。
+
+### 阶段 3:MCP Gateway 接入
+
+目标:
+
+- 建设 emoon MCP Gateway / Tool Server,封装 HIS、LIS、EMR、PACS、慢病平台、物联平台、支付、叫号等医院系统;
+- FastGPT MCP ToolSet 只注册 emoon MCP Gateway 或受控代理地址;
+- 如果深信服交付版本不支持 MCP ToolSet,则降级为 FastGPT HTTP ToolSet 调 emoon Tool Server;
+- 如果 MCP/HTTP 工具均不可用,则 FastGPT 只输出结构化工具意图,由 emoon Card Runtime / Tool Executor 执行;
+- 工具目录按租户、项目、医院、设备、Agent 场景和风险等级裁剪;
+- L0/L1 查询工具可跑通;
+- L2 工具只返回脱敏摘要和引用 ID;
+- L3 以上写工具必须通过 Card Action 和幂等键确认。
+
+验收:
+
+- FastGPT 不能拿到医院原始系统地址;
+- FastGPT ToolSet 中只能看到 emoon 发布快照内的工具;
+- 未授权工具不可见且不可调用;
+- MCP ToolSet 的 URL、headerSecret、toolList 能被 emoon 巡检和漂移告警;
+- L3 以上动作不能由模型直接执行;
+- 工具调用有审计记录,并能关联 requestId、conversationId、agentVersion、toolName、riskLevel、operatorId、idempotencyKey。
+
+### 阶段 4:Dify/FastGPT 并存灰度
+
+目标:
+
+- 同一 emoon Agent 可配置 Dify 或 FastGPT;
+- 按项目、设备、场景灰度;
+- 低风险场景先切;
+- 保留 Dify 回退路径;
+- 灰度期间并行埋点 usage、日志、版本映射和健康状态,精细计量不作为首批灰度切流的前置阻塞项。
+
+验收:
+
+- 导诊 FAQ、轻分诊、报告解读入口至少一个场景完成灰度;
+- FastGPT 异常可切回 Dify 或模板;
+- 指标包括成功率、平均耗时、卡片创建率、人工接管率、用户反馈、计量差异;
+- 灰度过程不改变 emoon 会话、卡片、任务状态事实源。
+
+### 阶段 5:计量、审计、版本与健康探活补强
+
+目标:
+
+- `detail=true.responseData` 用量归集;
+- FastGPT 调用审计;
+- 应用版本映射;
+- 回滚指针;
+- 健康探活;
+- 错误率监控;
+- 在扩大灰度范围前完成计量账本、审计报表和版本漂移告警闭环。
+
+验收:
+
+- 不再使用 FastGPT 默认 usage 扣费;
+- 可按 traceId 回放输入、输出、卡片、工具、计量;
+- 版本切换可回滚;
+- FastGPT 不可用时可降级;
+- FastGPT 管理后台配置漂移能够被发现、告警并进入人工复核。
+
+### 阶段 6:公司评审、联调验收、上线准入
+
+目标:
+
+- 公司内评审通过;
+- 商务边界确认;
+- 医院联调环境验证;
+- 上线准入清单完成。
+
+验收:
+
+- 架构边界无争议;
+- P0 能力和非 P0 能力明确;
+- 合同/报价不默认包含商业版能力;
+- 初级工程师能按任务拆解执行。
+
+## 15. 风险矩阵
+
+| 编号 | 风险 | 概率 | 影响 | 等级 | 应对 |
+| --- | --- | --- | --- | --- | --- |
+| R1 | FastGPT usage 为占位值导致错误扣费 | 高 | 高 | 高 | P0 禁止直接用默认 usage,必须从 detail 或日志归集 |
+| R2 | FastGPT 直连医院系统导致边界失控 | 中 | 高 | 高 | 只允许连接 emoon MCP Gateway,工具按风险分级 |
+| R3 | 商业版能力被误认为社区版能力 | 中 | 高 | 高 | 文档、报价、验收清单中明确版本边界 |
+| R4 | Dify 已有代码被直接删除导致回归 | 中 | 高 | 高 | 双引擎并存,灰度迁移 |
+| R5 | FastGPT Workflow 输出格式不稳定 | 中 | 中 | 中 | OutputNormalizer + JSON Schema + 降级 |
+| R6 | 文件 URL 泄露敏感数据 | 中 | 高 | 高 | File Service 生成短期受控 URL,优先传摘要 |
+| R7 | MongoDB 运维经验不足 | 中 | 中 | 中 | 部署前补备份、监控、恢复演练 |
+| R8 | MCP 内网地址被 FastGPT SSRF 防护阻断 | 中 | 中 | 中 | 用服务名、网关域名或明确放行策略 |
+| R9 | FastGPT 版本升级 API 不兼容 | 中 | 中 | 中 | 锁版本,建立兼容测试 |
+| R10 | 医疗主状态落入 FastGPT | 低 | 高 | 高 | TaskState、Card、Audit 均以 emoon 为事实源 |
+| R11 | 运营人员绕过 emoon 版本映射直接修改 FastGPT 应用或 Workflow | 中 | 高 | 高 | FastGPT 管理后台只允许交付/运维角色操作;生产发布必须回写 emoon 版本映射和快照;定期比对 FastGPT versionId/snapshot 与 emoon 生效配置,发现漂移自动告警 |
+
+## 16. 初级工程师实现指南
+
+### 16.1 为什么不能让 FastGPT 直连 HIS
+
+因为 HIS 调用不是普通工具调用。它涉及:
+
+- 医院接口密钥;
+- 患者身份;
+- 业务状态;
+- 写操作幂等;
+- 审计;
+- 失败补偿;
+- 医疗风险;
+- 商业计量。
+
+FastGPT 只能做 AI 推理和工具编排,不能成为医院系统网关。
+
+### 16.2 为什么不能相信 FastGPT 默认 usage
+
+FastGPT v1 接口默认 `usage` 可能固定为 1。这个值只是 OpenAI-compatible 响应格式的占位,不代表真实 token 或成本。
+
+正确做法:
+
+- 开启 `detail=true`;
+- 解析 `responseData`;
+- 提取节点级 tokens / price / model;
+- 由 emoon 计量模块归集;
+- 由 emoon 账本扣费。
+
+### 16.3 为什么文件必须先进入 emoon File Service
+
+医疗文件属于敏感数据。emoon File Service 提供:
+
+- 上传幂等;
+- 文件元数据;
+- 删除审计;
+- 保留策略;
+- 权限控制;
+- traceId;
+- 短期访问 URL;
+- 后续医生反馈引用。
+
+FastGPT 只能拿到运行所需的短期 URL 或脱敏摘要。
+
+### 16.4 为什么卡片动作必须由 emoon 执行
+
+卡片动作通常是确定性业务动作,例如:
+
+- 挂号;
+- 签到;
+- 建档;
+- 支付引导;
+- 报告确认;
+- 医生审核。
+
+这些动作需要:
+
+- 用户确认;
+- 幂等键;
+- 状态机;
+- 审计;
+- 失败处理;
+- 权限校验。
+
+FastGPT 可以建议创建卡片,不能执行卡片动作。
+
+### 16.5 为什么 Dify 和 FastGPT 要先并存
+
+因为当前工程已有 Dify 代码和配置:
+
+- 对话引擎;
+- 知识库引擎;
+- 意图识别;
+- 管理后台连通性;
+- OpenPlatform 历史客户端;
+- 知识库 Controller 硬编码。
+
+直接删除 Dify 会造成不可控回归。正确做法是:
+
+```text
+新增 fastgpt → 小场景验证 → 灰度切换 → 保留回滚 → 稳定后再清理旧链路
+```
+
+## 17. 公司评审问题清单
+
+评审前需要明确以下问题。
+
+### 17.1 商务与合作边界
+
+- 深信服提供的是 FastGPT 平台、模型、算力和运维,还是还包括医疗场景实施?
+- 社区版、商业版、云服务版分别进入报价的哪些部分?
+- 是否允许私有化商用?
+- 多租户 SaaS 场景是否需要 FastGPT 商业授权?
+- FastGPT 控制台 LOGO 和版权信息是否能保留或修改?
+
+### 17.2 产品与交付范围
+
+- P0 是否只承诺对话、SSE、卡片输出和基础 RAG?
+- 图片知识库、Web 同步、应用评测、内容审核是否属于 P1/P2?
+- 医生端反馈闭环是否由 emoon 完整承接?
+- FastGPT 是否只作为运行副本,不保存医梦知识源资产?
+
+### 17.3 技术与安全边界
+
+- FastGPT 是否部署在医院内网、深信服环境还是医梦环境?
+- FastGPT 如何访问 emoon MCP Gateway?
+- 是否允许 FastGPT 访问内网服务名?
+- 文件 URL 有效期和访问审计如何做?
+- FastGPT 日志中是否会保存敏感输入输出?
+
+### 17.4 运维与上线
+
+- MongoDB 谁负责备份、监控、恢复?
+- FastGPT 版本谁负责升级?
+- API 不兼容时谁负责修复?
+- FastGPT 不可用时是否允许切回 Dify?
+- 上线前是否完成压测和断线恢复测试?
+
+## 18. 后续 ADR 建议
+
+建议后续新增 ADR:
+
+| ADR | 决策 |
+| --- | --- |
+| ADR-014 | FastGPT 作为 AIAgent 实现层接入,而非替代医梦 AI 中台 |
+| ADR-015 | FastGPT Adapter 落位 `emoon-ai-agent`,OpenPlatform 不沉淀实现逻辑 |
+| ADR-016 | FastGPT MCP 只能连接 emoon MCP Gateway |
+| ADR-017 | FastGPT usage 不直接用于扣费,计量由 emoon 归集 |
+| ADR-018 | 知识库源资产在 emoon,FastGPT 只保存运行副本 |
+| ADR-019 | Dify 与 FastGPT 过渡期并存,按 Agent/项目灰度 |
+
+## 19. 最终结论
+
+FastGPT 接入是可行的,而且在中文生态、MCP 原生支持、私有化部署轻量化方面有优势。但公司评审必须坚持以下底线:
+
+1. FastGPT 是 AI 能力层,不是医疗业务控制层;
+2. 医梦继续掌握入口、状态、卡片、工具、文件、反馈、计量和审计;
+3. 医院业务系统只接医梦 MCP Gateway;
+4. 医疗敏感文件和知识源资产不交给 FastGPT 做事实源;
+5. FastGPT 默认 usage 不能用于计费;
+6. 社区版与商业版能力要在合同和验收中分清;
+7. Dify 不立即删除,先与 FastGPT 并存灰度。
+
+按这个边界推进,FastGPT 可以成为医梦 AI 中台的可插拔 AgentEngine,实现甲方偏好的同时,不牺牲医梦在医疗业务闭环中的核心控制权。
+
+## 附录 A FastGPT 当前源码 API 明细
+
+本节接口清单来自本地源码:
+
+```text
+/Users/destiny/dev/emoon/projects/FastGPT/projects/app/src/pages/api
+```
+
+说明:
+
+- 下表按 Next.js API route 路径枚举,路径中的 `[token]`、`[key]`、`[...path]` 表示动态参数;
+- 本节不展开参数和返回值,只说明主要功能、emoon 是否需要对接、当前系统环境是否需要对接;
+- “emoon 是否需要对接”表示长期方案是否有接入价值;
+- “当前系统环境是否需要对接”表示在现阶段 FastGPT 接入、二三期中台建设和公司评审范围内是否应进入实施计划;
+- 对 FastGPT 用户、团队、外链、插件市场、初始化迁移等平台内部接口,默认不进入医梦医疗生产链路。
+
+### A.1 对话、语音与会话
+
+| 接口 | 主要功能介绍 | emoon 是否需要对接 | 当前系统环境是否需要对接 |
+| --- | --- | --- | --- |
+| `/core/chat/chatTest` | 测试对话 FastGPT 会话。 | 否,P2 | 当前不接 |
+| `/core/chat/clearHistories` | 清空历史 FastGPT 会话。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/delHistory` | 删除历史 FastGPT 会话。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/feedback/adminUpdate` | 管理员更新 FastGPT 对话反馈,用于点赞、差评、管理员标记或反馈闭环。 | 可选,P1/P2 | 当前不作为事实源,只做反馈副本评估 |
+| `/core/chat/feedback/closeCustom` | 关闭自定义反馈 FastGPT 对话反馈,用于点赞、差评、管理员标记或反馈闭环。 | 可选,P1/P2 | 当前不作为事实源,只做反馈副本评估 |
+| `/core/chat/feedback/getFeedbackRecordIds` | 查询反馈记录 ID FastGPT 对话反馈,用于点赞、差评、管理员标记或反馈闭环。 | 可选,P1/P2 | 当前不作为事实源,只做反馈副本评估 |
+| `/core/chat/feedback/updateFeedbackReadStatus` | 更新反馈已读状态 FastGPT 对话反馈,用于点赞、差评、管理员标记或反馈闭环。 | 可选,P1/P2 | 当前不作为事实源,只做反馈副本评估 |
+| `/core/chat/feedback/updateUserFeedback` | 提交用户反馈 FastGPT 对话反馈,用于点赞、差评、管理员标记或反馈闭环。 | 可选,P1/P2 | 当前不作为事实源,只做反馈副本评估 |
+| `/core/chat/file/presignChatFileGetUrl` | 生成对话文件读取预签名 URL FastGPT 对话侧文件临时访问。 | 谨慎,P1/P2 | 当前不直接用于医疗文件,优先 emoon File Service |
+| `/core/chat/file/presignChatFilePostUrl` | 生成对话文件上传预签名 URL FastGPT 对话侧文件临时访问。 | 谨慎,P1/P2 | 当前不直接用于医疗文件,优先 emoon File Service |
+| `/core/chat/getHistories` | 查询历史列表 FastGPT 会话。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/getPaginationRecords` | 分页查询记录 FastGPT 会话。 | 可选,P1 | 当前可作为排障/断线恢复储备 |
+| `/core/chat/getResData` | 查询响应详情 FastGPT 会话。 | 可选,P1 | 当前可作为排障/断线恢复储备 |
+| `/core/chat/helperBot/completions` | 发起对话 FastGPT 辅助机器人数据。 | 否,P2 | 当前不接 |
+| `/core/chat/helperBot/deleteRecord` | 删除记录 FastGPT 辅助机器人数据。 | 否,P2 | 当前不接 |
+| `/core/chat/helperBot/getFilePresign` | 获取文件预签名 FastGPT 辅助机器人数据。 | 否,P2 | 当前不接 |
+| `/core/chat/helperBot/getFilePreviewUrl` | 获取文件预览 URL FastGPT 辅助机器人数据。 | 否,P2 | 当前不接 |
+| `/core/chat/helperBot/getRecords` | 处理 FastGPT 辅助机器人数据。 | 否,P2 | 当前不接 |
+| `/core/chat/history/batchDelete` | 批量删除 FastGPT 会话历史。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/history/clearHistories` | 清空历史 FastGPT 会话历史。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/history/delHistory` | 删除历史 FastGPT 会话历史。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/history/getHistories` | 查询历史列表 FastGPT 会话历史。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/history/getHistoryStatus` | 查询历史状态 FastGPT 会话历史。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/history/markRead` | 标记已读 FastGPT 会话历史。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/history/updateHistory` | 更新历史 FastGPT 会话历史。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/init` | 初始化 FastGPT 会话。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/inputGuide/countTotal` | 统计总数 FastGPT 输入引导。 | 否,P2 | 当前不接 |
+| `/core/chat/inputGuide/create` | 创建 FastGPT 输入引导。 | 否,P2 | 当前不接 |
+| `/core/chat/inputGuide/delete` | 删除 FastGPT 输入引导。 | 否,P2 | 当前不接 |
+| `/core/chat/inputGuide/deleteAll` | 删除全部 FastGPT 输入引导。 | 否,P2 | 当前不接 |
+| `/core/chat/inputGuide/list` | 查询列表 FastGPT 输入引导。 | 否,P2 | 当前不接 |
+| `/core/chat/inputGuide/query` | 查询 FastGPT 输入引导。 | 否,P2 | 当前不接 |
+| `/core/chat/inputGuide/update` | 更新 FastGPT 输入引导。 | 否,P2 | 当前不接 |
+| `/core/chat/outLink/init` | 初始化 FastGPT 会话。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/recentlyUsed` | 查询最近使用 FastGPT 会话。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/record/delete` | 删除 FastGPT 对话记录、引用、响应详情或语音结果。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/record/getCollectionQuote` | 查询集合引用 FastGPT 对话记录、引用、响应详情或语音结果。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/record/getPaginationRecords` | 分页查询记录 FastGPT 对话记录、引用、响应详情或语音结果。 | 可选,P1 | 当前可作为排障/断线恢复储备 |
+| `/core/chat/record/getQuote` | 查询引用 FastGPT 对话记录、引用、响应详情或语音结果。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/record/getRecords_v2` | 查询新版记录 FastGPT 对话记录、引用、响应详情或语音结果。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/record/getResData` | 查询响应详情 FastGPT 对话记录、引用、响应详情或语音结果。 | 可选,P1 | 当前可作为排障/断线恢复储备 |
+| `/core/chat/record/getSpeech` | 查询语音结果 FastGPT 对话记录、引用、响应详情或语音结果。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/resume` | 恢复会话 FastGPT 会话。 | 可选,P1 | 当前可作为排障/断线恢复储备 |
+| `/core/chat/team/init` | 初始化 FastGPT 会话。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/core/chat/updateHistory` | 更新历史 FastGPT 会话。 | 可选,P1 | 当前优先 emoon 会话事实源,必要时用于补偿查询 |
+| `/v1/audio/transcriptions` | 执行音频转文字,面向语音输入场景。 | 可选,P2 | 当前不接,终端语音能力后置 |
+| `/v1/chat/completions` | 发起 FastGPT v1 对话,触发应用编排、Workflow、RAG、模型生成和流式输出,是 emoon P0 主链路。 | 是,P0 | 当前必须规划并优先接入 |
+| `/v2/chat/completions` | 发起 FastGPT v2 对话,属于新版协议候选,需在 v1 稳定后评估。 | 后续评估 | 当前不接,待 v1 稳定后评估 |
+| `/v2/chat/stop` | 停止 v2 对话生成任务,用于中断长回答或异常生成。 | 后续评估 | 当前不接,待 v1 稳定后评估 |
+
+### A.2 应用、Workflow 与版本
+
+| 接口 | 主要功能介绍 | emoon 是否需要对接 | 当前系统环境是否需要对接 |
+| --- | --- | --- | --- |
+| `/core/app/copy` | 复制 FastGPT 应用配置、基础信息、权限或工作流。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/create` | 创建 FastGPT 应用配置、基础信息、权限或工作流。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/del` | 删除 FastGPT 应用配置、基础信息、权限或工作流。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/detail` | 查询详情 FastGPT 应用配置、基础信息、权限或工作流。 | 可选,P0/P1 | 当前用于配置校验和探活评估 |
+| `/core/app/folder/create` | 创建 FastGPT 应用文件夹或路径。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/folder/path` | 查询路径 FastGPT 应用文件夹或路径。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/getBasicInfo` | 查询基础信息 FastGPT 应用配置、基础信息、权限或工作流。 | 可选,P0/P1 | 当前用于配置校验和探活评估 |
+| `/core/app/getPermission` | 查询权限 FastGPT 应用配置、基础信息、权限或工作流。 | 可选,P0/P1 | 当前用于配置校验和探活评估 |
+| `/core/app/httpTools/create` | 创建 FastGPT HTTP 工具集。 | 可选,P1 | 当前仅交付验证,不进入业务主链路 |
+| `/core/app/httpTools/getApiSchemaByUrl` | 按 URL 解析 API Schema FastGPT HTTP 工具集。 | 可选,P1 | 当前仅交付验证,不进入业务主链路 |
+| `/core/app/httpTools/runTool` | 运行工具 FastGPT HTTP 工具集。 | 可选,P1 | 当前仅交付验证,不进入业务主链路 |
+| `/core/app/httpTools/update` | 更新 FastGPT HTTP 工具集。 | 可选,P1 | 当前仅交付验证,不进入业务主链路 |
+| `/core/app/list` | 查询列表 FastGPT 应用配置、基础信息、权限或工作流。 | 可选,P0/P1 | 当前用于配置校验和探活评估 |
+| `/core/app/logs/exportLogs` | 处理 FastGPT 应用运行日志,用于排障、审计辅助和对账。 | 可选,P1 | 当前用于审计对账辅助评估 |
+| `/core/app/logs/getLogKeys` | 处理 FastGPT 应用运行日志,用于排障、审计辅助和对账。 | 可选,P1 | 当前用于审计对账辅助评估 |
+| `/core/app/logs/getUsers` | 处理 FastGPT 应用运行日志,用于排障、审计辅助和对账。 | 可选,P1 | 当前用于审计对账辅助评估 |
+| `/core/app/logs/list` | 查询列表 FastGPT 应用运行日志,用于排障、审计辅助和对账。 | 可选,P1 | 当前用于审计对账辅助评估 |
+| `/core/app/logs/updateLogKeys` | 处理 FastGPT 应用运行日志,用于排障、审计辅助和对账。 | 可选,P1 | 当前用于审计对账辅助评估 |
+| `/core/app/mcpTools/create` | 创建 FastGPT MCP 工具集。 | 可选,P1 | 当前仅交付验证,不进入业务主链路 |
+| `/core/app/mcpTools/getChildren` | 获取子工具 FastGPT MCP 工具集。 | 可选,P1 | 当前仅交付验证,不进入业务主链路 |
+| `/core/app/mcpTools/getTools` | 获取工具列表 FastGPT MCP 工具集。 | 可选,P1 | 当前仅交付验证,不进入业务主链路 |
+| `/core/app/mcpTools/runTool` | 运行工具 FastGPT MCP 工具集。 | 可选,P1 | 当前仅交付验证,不进入业务主链路 |
+| `/core/app/mcpTools/update` | 更新 FastGPT MCP 工具集。 | 可选,P1 | 当前仅交付验证,不进入业务主链路 |
+| `/core/app/resumeInheritPermission` | 恢复继承权限 FastGPT 应用配置、基础信息、权限或工作流。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/template/detail` | 查询详情 FastGPT 应用模板。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/template/list` | 查询列表 FastGPT 应用模板。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/tool/getPreviewNode` | 获取预览节点 FastGPT 工具节点、系统工具模板或路径。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/tool/getSystemToolTemplates` | 获取系统工具模板 FastGPT 工具节点、系统工具模板或路径。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/tool/path` | 查询路径 FastGPT 工具节点、系统工具模板或路径。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/transitionWorkflow` | 转换工作流 FastGPT 应用配置、基础信息、权限或工作流。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/update` | 更新 FastGPT 应用配置、基础信息、权限或工作流。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/app/version/detail` | 查询详情 FastGPT 应用版本,用于发布、回滚、灰度和版本映射。 | 是,P1 | 当前需要纳入版本映射设计 |
+| `/core/app/version/latest` | 查询最新版本 FastGPT 应用版本,用于发布、回滚、灰度和版本映射。 | 是,P1 | 当前需要纳入版本映射设计 |
+| `/core/app/version/list` | 查询列表 FastGPT 应用版本,用于发布、回滚、灰度和版本映射。 | 是,P1 | 当前需要纳入版本映射设计 |
+| `/core/app/version/publish` | 发布 FastGPT 应用版本,用于发布、回滚、灰度和版本映射。 | 是,P1 | 当前需要纳入版本映射设计 |
+| `/core/app/version/update` | 更新 FastGPT 应用版本,用于发布、回滚、灰度和版本映射。 | 是,P1 | 当前需要纳入版本映射设计 |
+| `/core/workflow/debug` | 调试 FastGPT Workflow。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/workflow/getSandboxPackages` | 查询沙箱包 FastGPT Workflow。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+| `/core/workflow/optimizeCode` | 优化代码 FastGPT Workflow。 | 可选,P2 | 当前不自动化管理 FastGPT 应用 |
+
+### A.3 知识库、集合、分段与训练
+
+| 接口 | 主要功能介绍 | emoon 是否需要对接 | 当前系统环境是否需要对接 |
+| --- | --- | --- | --- |
+| `/core/dataset/apiDataset/getCatalog` | 查询目录 FastGPT API 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/apiDataset/getPathNames` | 查询路径名称 FastGPT API 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/apiDataset/list` | 查询列表 FastGPT API 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/apiDataset/listExistId` | 查询已存在 ID FastGPT API 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/create` | 创建 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/create/apiCollection` | 创建 API 集合 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/create/apiCollectionV2` | 创建 API 集合 V2 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/create/backup` | 创建备份集合 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/create/fileId` | 按文件 ID 创建 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/create/images` | 按图片创建 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/create/link` | 按链接创建 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/create/localFile` | 按本地文件创建 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/create/reTrainingCollection` | 重训集合 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/create/template` | 按模板创建 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/create/text` | 按文本创建 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/delete` | 删除 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/detail` | 查询详情 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/export` | 导出 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/list` | 查询列表 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/listV2` | 处理 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/paths` | 查询路径 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/read` | 读取 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/scrollList` | 滚动查询列表 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/sync` | 同步 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/trainingDetail` | 查询训练详情 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/collection/update` | 更新 FastGPT 知识库集合。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/create` | 创建 FastGPT 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/createWithFiles` | 通过文件创建 FastGPT 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/delete` | 删除 FastGPT 知识库分段数据。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/detail` | 查询详情 FastGPT 知识库分段数据。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/getQuoteData` | 查询引用数据 FastGPT 知识库分段数据。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/index/create` | 创建 FastGPT 知识库分段索引。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/index/delete` | 删除 FastGPT 知识库分段索引。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/index/update` | 更新 FastGPT 知识库分段索引。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/insertData` | 插入数据 FastGPT 知识库分段数据。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/insertImages` | 插入图片数据 FastGPT 知识库分段数据。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/list` | 查询列表 FastGPT 知识库分段数据。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/pushData` | 推送数据 FastGPT 知识库分段数据。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/update` | 更新 FastGPT 知识库分段数据。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/data/v2/list` | 查询列表 FastGPT 知识库分段数据。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/delete` | 删除 FastGPT 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/detail` | 查询详情 FastGPT 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/exportAll` | 导出全部 FastGPT 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/file/getPreviewChunks` | 获取文件预览分块 FastGPT 知识库文件上传、预览或检索测试。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/file/getSearchTestImagePreviewUrls` | 获取检索测试图片预览 URL FastGPT 知识库文件上传、预览或检索测试。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/file/presignDatasetFilePostUrl` | 生成知识库文件上传预签名 URL FastGPT 知识库文件上传、预览或检索测试。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/file/presignSearchTestImage` | 生成检索测试图片预签名 URL FastGPT 知识库文件上传、预览或检索测试。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/folder/create` | 创建 FastGPT 知识库文件夹。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/getPermission` | 查询权限 FastGPT 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/list` | 查询列表 FastGPT 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/paths` | 查询路径 FastGPT 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/resumeInheritPermission` | 恢复继承权限 FastGPT 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/searchTest` | 检索测试 FastGPT 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/training/deleteTrainingData` | 删除训练数据 FastGPT 知识库训练任务。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/training/getDatasetTrainingQueue` | 查询训练队列 FastGPT 知识库训练任务。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/training/getTrainingDataDetail` | 查询训练数据详情 FastGPT 知识库训练任务。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/training/getTrainingError` | 查询训练错误 FastGPT 知识库训练任务。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/training/rebuildEmbedding` | 重建向量索引 FastGPT 知识库训练任务。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/training/updateTrainingData` | 更新训练数据 FastGPT 知识库训练任务。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/core/dataset/update` | 更新 FastGPT 知识库。 | 是,P1 | 当前需要用于知识库运行副本设计 |
+| `/support/wallet/usage/createTrainingUsage` | 创建训练用量订单 FastGPT 知识库训练成本归集。 | 可选,P1 | 当前仅用于训练成本对账参考 |
+
+### A.4 AI 模型、Skill 与沙箱
+
+| 接口 | 主要功能介绍 | emoon 是否需要对接 | 当前系统环境是否需要对接 |
+| --- | --- | --- | --- |
+| `/core/ai/agent/createQuestionGuide` | 生成问题引导 FastGPT 应用问题引导。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/agent/v2/createQuestionGuide` | 生成问题引导 FastGPT 应用问题引导。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/model/delete` | 删除 FastGPT 模型配置。 | 可选,P1 | 当前用于环境能力展示/连通性验证 |
+| `/core/ai/model/detail` | 查询详情 FastGPT 模型配置。 | 可选,P1 | 当前用于环境能力展示/连通性验证 |
+| `/core/ai/model/getConfigJson` | 查询配置 JSON FastGPT 模型配置。 | 可选,P1 | 当前用于环境能力展示/连通性验证 |
+| `/core/ai/model/getDefaultConfig` | 查询默认配置 FastGPT 模型配置。 | 可选,P1 | 当前用于环境能力展示/连通性验证 |
+| `/core/ai/model/getMyModels` | 查询我的模型 FastGPT 模型配置。 | 可选,P1 | 当前用于环境能力展示/连通性验证 |
+| `/core/ai/model/list` | 查询列表 FastGPT 模型配置。 | 可选,P1 | 当前用于环境能力展示/连通性验证 |
+| `/core/ai/model/test` | 测试 FastGPT 模型配置。 | 可选,P1 | 当前用于环境能力展示/连通性验证 |
+| `/core/ai/model/update` | 更新 FastGPT 模型配置。 | 可选,P1 | 当前用于环境能力展示/连通性验证 |
+| `/core/ai/model/updateDefault` | 更新默认配置 FastGPT 模型配置。 | 可选,P1 | 当前用于环境能力展示/连通性验证 |
+| `/core/ai/model/updateWithJson` | 用 JSON 更新 FastGPT 模型配置。 | 可选,P1 | 当前用于环境能力展示/连通性验证 |
+| `/core/ai/optimizePrompt` | 优化 Prompt FastGPT AI 辅助能力。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/record/getRecord` | 查询 AI 记录 FastGPT AI 调用记录。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/sandbox/checkExist` | 检查是否存在 FastGPT 沙箱资源。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/sandbox/download` | 下载 FastGPT 沙箱资源。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/sandbox/fileOp` | 执行文件操作 FastGPT 沙箱资源。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/sandbox/getHtmlPreviewLink` | 获取 HTML 预览链接 FastGPT 沙箱资源。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/sandbox/list` | 查询列表 FastGPT 沙箱资源。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/sandbox/listRecursive` | 处理 FastGPT 沙箱资源。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/sandbox/read` | 读取 FastGPT 沙箱资源。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/sandbox/write` | 写入 FastGPT 沙箱资源。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/apps` | 查询 Skill 应用 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/copy` | 复制 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/create` | 创建 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/debugChat` | 处理 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/debugSession/chatItem/delete` | 删除 FastGPT Skill 调试会话。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/debugSession/delete` | 删除 FastGPT Skill 调试会话。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/debugSession/list` | 查询列表 FastGPT Skill 调试会话。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/debugSession/records` | 处理 FastGPT Skill 调试会话。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/debugSession/stop` | 停止 FastGPT Skill 调试会话。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/delete` | 删除 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/detail` | 查询详情 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/edit` | 编辑 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/export` | 导出 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/folder/create` | 创建 FastGPT Skill 文件夹或路径。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/folder/path` | 查询路径 FastGPT Skill 文件夹或路径。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/import` | 导入 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/list` | 查询列表 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/resumeInheritPermission` | 恢复继承权限 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/save-deploy` | 保存并部署 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/update` | 更新 FastGPT Skill 应用。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/version/list` | 查询列表 FastGPT Skill 版本。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/version/switch` | 切换 FastGPT Skill 版本。 | 否,P2/P3 | 当前不进入医疗主链路 |
+| `/core/ai/skill/version/update` | 更新 FastGPT Skill 版本。 | 否,P2/P3 | 当前不进入医疗主链路 |
+
+### A.5 插件、市场与模板
+
+| 接口 | 主要功能介绍 | emoon 是否需要对接 | 当前系统环境是否需要对接 |
+| --- | --- | --- | --- |
+| `/core/plugin/admin/installWithUrl` | 通过 URL 安装 FastGPT 插件管理资源。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/pkg/confirm` | 确认 FastGPT 插件包。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/pkg/upload` | 上传 FastGPT 插件包。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/app/create` | 创建 FastGPT 插件工具关联应用。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/app/systemApps` | 查询系统应用 FastGPT 插件工具关联应用。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/app/update` | 更新 FastGPT 插件工具关联应用。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/delete` | 删除 FastGPT 插件工具。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/detail` | 查询详情 FastGPT 插件工具。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/list` | 查询列表 FastGPT 插件工具。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/runtimeConfig/detail` | 查询详情 FastGPT 插件工具运行配置。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/runtimeConfig/reset` | 重置 FastGPT 插件工具运行配置。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/runtimeConfig/update` | 更新 FastGPT 插件工具运行配置。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/tag/create` | 创建 FastGPT 插件工具标签。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/tag/delete` | 删除 FastGPT 插件工具标签。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/tag/update` | 更新 FastGPT 插件工具标签。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/tag/updateOrder` | 更新排序 FastGPT 插件工具标签。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/update` | 更新 FastGPT 插件工具。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/updateOrder` | 更新排序 FastGPT 插件工具。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/admin/tool/versions` | 查询版本 FastGPT 插件工具。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/team/toggleInstall` | 切换安装状态 团队 FastGPT 插件工具。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/team/tool/detail` | 查询详情 团队 FastGPT 插件工具。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/team/tool/list` | 查询列表 团队 FastGPT 插件工具。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/team/tool/versions` | 查询版本 团队 FastGPT 插件工具。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/core/plugin/toolTag/list` | 查询列表 FastGPT 插件工具标签。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/marketplace/[...path]` | 访问 FastGPT 市场资源代理。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+| `/support/marketing/fetchWorkflow` | 处理 FastGPT 市场工作流模板。 | 否,P2/P3 | 当前不接,医疗插件须经 emoon 审查 |
+
+### A.6 MCP、OpenAPI Key 与外链发布
+
+| 接口 | 主要功能介绍 | emoon 是否需要对接 | 当前系统环境是否需要对接 |
+| --- | --- | --- | --- |
+| `/mcp/app/[key]/mcp` | 提供 FastGPT MCP 协议访问端点。 | 可选,P2 | 仅用于把 FastGPT 应用暴露给 emoon 或内部平台,不作为医院工具网关 |
+| `/support/mcp/create` | 创建 FastGPT MCP Server 配置。 | 可选,P2 | 非医疗工具主链路;不能替代 emoon MCP Gateway |
+| `/support/mcp/delete` | 删除 FastGPT MCP Server 配置。 | 可选,P2 | 非医疗工具主链路;按需用于清理 FastGPT 应用工具暴露 |
+| `/support/mcp/list` | 查询列表 FastGPT MCP Server 配置。 | 可选,P2 | 非医疗工具主链路;按需用于配置巡检 |
+| `/support/mcp/server/toolCall` | 调用工具 FastGPT MCP Server 工具。 | 可选,P2 | 仅用于 FastGPT 应用工具暴露验证,不进入医院系统调用路径 |
+| `/support/mcp/server/toolList` | 查询工具列表 FastGPT MCP Server 工具。 | 可选,P2 | 仅用于 FastGPT 应用工具暴露验证,不进入医院系统调用路径 |
+| `/support/mcp/update` | 更新 FastGPT MCP Server 配置。 | 可选,P2 | 非医疗工具主链路;如启用必须纳入 emoon 版本审计 |
+| `/support/openapi/create` | 创建 FastGPT OpenAPI Key。 | 可选,P1 | 当前由运维/交付配置,不进运行链路 |
+| `/support/openapi/delete` | 删除 FastGPT OpenAPI Key。 | 可选,P1 | 当前由运维/交付配置,不进运行链路 |
+| `/support/openapi/health` | 健康检查 FastGPT OpenAPI Key。 | 可选,P1 | 当前可作为 OpenAPI Key 健康检查 |
+| `/support/openapi/list` | 查询列表 FastGPT OpenAPI Key。 | 可选,P1 | 当前由运维/交付配置,不进运行链路 |
+| `/support/openapi/update` | 更新 FastGPT OpenAPI Key。 | 可选,P1 | 当前由运维/交付配置,不进运行链路 |
+| `/support/outLink/create` | 创建 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/delete` | 删除 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/dingtalk/[token]` | 处理 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/feishu/[token]` | 处理 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/list` | 查询列表 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/offiaccount/[token]` | 处理 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/playground/config` | 处理 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/playground/update` | 更新 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/update` | 更新 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/wechat/logout` | 处理 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/wechat/qrcode/generate` | 处理 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/wechat/qrcode/status` | 处理 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+| `/support/outLink/wecom/[token]` | 处理 FastGPT 外链发布渠道。 | 否 | 当前不接,外部入口必须走 emoon |
+
+### A.7 用户、团队与额度
+
+| 接口 | 主要功能介绍 | emoon 是否需要对接 | 当前系统环境是否需要对接 |
+| --- | --- | --- | --- |
+| `/support/user/account/checkPswExpired` | 检查密码过期 FastGPT 用户账号。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/account/loginByPassword` | 密码登录 FastGPT 用户账号。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/account/loginout` | 退出登录 FastGPT 用户账号。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/account/preLogin` | 登录前检查 FastGPT 用户账号。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/account/resetExpiredPsw` | 重置过期密码 FastGPT 用户账号。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/account/tokenLogin` | Token 登录 FastGPT 用户账号。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/account/update` | 更新 FastGPT 用户账号。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/account/updatePasswordByOld` | 用旧密码改密 FastGPT 用户账号。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/team/limit/datasetSizeLimit` | 查询知识库容量限制 FastGPT 团队、套餐、额度或第三方能力。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/team/limit/exportDatasetLimit` | 查询知识库导出限制 FastGPT 团队、套餐、额度或第三方能力。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/team/limit/webSyncLimit` | 查询 Web 同步限制 FastGPT 团队、套餐、额度或第三方能力。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/team/plan/getTeamPlanStatus` | 查询团队套餐状态 FastGPT 团队、套餐、额度或第三方能力。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/team/thirtdParty/checkUsage` | 检查使用量 FastGPT 团队、套餐、额度或第三方能力。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/support/user/team/update` | 更新 FastGPT 团队、套餐、额度或第三方能力。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+
+### A.8 文件、系统与通用资源
+
+| 接口 | 主要功能介绍 | emoon 是否需要对接 | 当前系统环境是否需要对接 |
+| --- | --- | --- | --- |
+| `/common/file/presignAvatarPostUrl` | 生成头像上传预签名 URL FastGPT 通用文件资源。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/common/file/presignTempFilePostUrl` | 生成临时文件上传预签名 URL FastGPT 通用文件资源。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/common/file/read/[filename]` | 处理 FastGPT 通用文件资源。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/common/system/getInitData` | 处理 FastGPT 通用系统任务。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/common/system/unlockTask` | 解锁任务 FastGPT 通用系统任务。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/common/tracks/push` | 上报埋点 FastGPT 埋点数据。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/invoke/fileUpload` | 文件上传 FastGPT invoke 资源。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/invoke/userInfo` | 查询用户信息 FastGPT invoke 资源。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/system/file/[jwt]` | 处理 FastGPT 系统文件。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/system/file/download/[token]` | 处理 FastGPT 系统文件。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/system/file/upload/[token]` | 处理 FastGPT 系统文件。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/system/img/[...id]` | 读取 FastGPT 系统图片资源。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+| `/system/plugin/[...path]` | 读取 FastGPT 插件静态资源。 | 否 | 当前不接,emoon 自有用户/团队/文件体系 |
+
+### A.9 初始化、迁移与管理运维
+
+| 接口 | 主要功能介绍 | emoon 是否需要对接 | 当前系统环境是否需要对接 |
+| --- | --- | --- | --- |
+| `/admin/clearInvalidData` | 清理无效数据 FastGPT 初始化、迁移或管理维护任务。 | 否 | 当前仅 FastGPT 运维升级使用 |
+| `/admin/initFeedbackFlags` | 初始化反馈标记 FastGPT 初始化、迁移或管理维护任务。 | 否 | 当前仅 FastGPT 运维升级使用 |
+| `/admin/initv4132` | 处理 FastGPT 初始化、迁移或管理维护任务。 | 否 | 当前仅 FastGPT 运维升级使用 |
+| `/admin/initv4140` | 处理 FastGPT 初始化、迁移或管理维护任务。 | 否 | 当前仅 FastGPT 运维升级使用 |
+| `/admin/initv4141` | 处理 FastGPT 初始化、迁移或管理维护任务。 | 否 | 当前仅 FastGPT 运维升级使用 |
+| `/admin/initv4143` | 处理 FastGPT 初始化、迁移或管理维护任务。 | 否 | 当前仅 FastGPT 运维升级使用 |
+| `/admin/initv4144` | 处理 FastGPT 初始化、迁移或管理维护任务。 | 否 | 当前仅 FastGPT 运维升级使用 |
+| `/admin/initv4145` | 处理 FastGPT 初始化、迁移或管理维护任务。 | 否 | 当前仅 FastGPT 运维升级使用 |
+| `/admin/initv41451` | 处理 FastGPT 初始化、迁移或管理维护任务。 | 否 | 当前仅 FastGPT 运维升级使用 |
+| `/admin/initv4147` | 处理 FastGPT 初始化、迁移或管理维护任务。 | 否 | 当前仅 FastGPT 运维升级使用 |
+| `/admin/support/appRegistration/create` | 创建 FastGPT 初始化、迁移或管理维护任务。 | 否 | 当前仅 FastGPT 运维升级使用 |
+
+### A.10 代理、兼容与文档
+
+| 接口 | 主要功能介绍 | emoon 是否需要对接 | 当前系统环境是否需要对接 |
+| --- | --- | --- | --- |
+| `/aiproxy/[...path]` | 处理 FastGPT AI Proxy 代理能力。 | 否 | 当前不进入医疗生产链路 |
+| `/aiproxy/api/createChannel` | 创建代理渠道 FastGPT AI Proxy 代理能力。 | 否 | 当前不进入医疗生产链路 |
+| `/devapidoc.json` | 导出 FastGPT 开发 API 文档描述。 | 否 | 当前不进入医疗生产链路 |
+| `/lafApi/[...path]` | FastGPT 兼容或专业版代理转发接口。 | 否 | 当前不进入医疗生产链路 |
+| `/openapi.json` | 导出 FastGPT OpenAPI 描述文件。 | 否 | 当前不进入医疗生产链路 |
+| `/proApi/[...path]` | FastGPT 兼容或专业版代理转发接口。 | 否 | 当前不进入医疗生产链路 |

+ 0 - 100
reasonix.toml

@@ -1,100 +0,0 @@
-# Reasonix configuration.
-# Resolution order: flag > ./reasonix.toml > ~/.config/reasonix/config.toml > built-in defaults.
-# Secrets come from the environment via api_key_env; never put keys here.
-
-default_model = "deepseek-flash"
-language      = "zh"   # ui/model language; empty = auto-detect from $LANG / $REASONIX_LANG
-
-[ui]
-theme = "auto"   # auto|dark|light; CLI colors only; REASONIX_THEME can override per run
-# theme_style = "graphite"   # graphite|ember|aurora|midnight|sandstone|porcelain|linen|glacier
-
-[network]
-proxy_mode = "auto"   # auto|env|custom|off; auto currently uses env proxy
-# proxy_url  = "socks5://127.0.0.1:7890"   # optional custom override
-# no_proxy   = "localhost,127.0.0.1,.local"   # honored for proxy_mode = "custom"
-
-[network.proxy]
-type = "socks5"   # http|https|socks5|socks5h
-# server = "127.0.0.1"
-# port = 7890
-# username = ""
-# password = "${REASONIX_PROXY_PASSWORD}"   # optional; supports ${VAR} expansion
-
-[agent]
-system_prompt = """
-You are Reasonix, a coding agent focused on executing code tasks.
-Use the provided tools to read and write files and run shell commands.
-Principles: understand the request before acting; verify with tools instead of
-guessing; keep changes minimal and correct; briefly summarize what you did.
-When the request leaves a real choice to the user — which approach or library,
-the scope, or a consequential or ambiguous decision — call the ask tool to offer
-2-4 concrete options rather than guessing or burying the question in prose. Skip
-it when there's an obvious default; don't ask just to confirm.
-For multi-step work, track progress with the todo_write tool: lay out the steps,
-keep exactly one in_progress, and flip each to completed as you finish it — update
-the list as you go, not just at the end.
-In plan mode the harness blocks writer tools: do read-only research, then write a
-concise plan as your reply and stop. The user is asked to approve before anything
-is changed; once approved, work through the steps, updating the task list as you go."""
-# system_prompt_file = "prompts/system.md"   # overrides system_prompt when set
-max_steps   = 0
-temperature = 0.0
-auto_plan   = "ask"   # off|ask|on; ask/on auto-enter plan mode for complex tasks
-# auto_plan_classifier = "deepseek-flash"   # optional; only used for borderline tasks
-# planner_model = "mimo"   # optional: enable two-model collaboration
-# subagent_model = "deepseek-pro"   # optional default for runAs=subagent skills
-# subagent_models = { review = "deepseek-pro", security_review = "deepseek-pro" }   # per-skill overrides
-# output_style = "explanatory"   # explanatory | learning | concise | custom; empty = default
-
-[[providers]]
-name        = "deepseek-flash"
-kind        = "openai"
-base_url    = "https://api.deepseek.com"
-models      = ["deepseek-v4-flash"]
-default     = "deepseek-v4-flash"
-api_key_env = "DEEPSEEK_API_KEY"
-balance_url = "https://api.deepseek.com/user/balance"   # optional; wallet-balance endpoint shown in the status bar
-context_window = 1000000   # tokens; compaction triggers near this limit
-price       = { cache_hit = 0.02, input = 1, output = 2, currency = "¥" }   # per 1M tokens
-
-[tools]
-enabled = []   # empty = all built-in tools
-
-[skills]
-# paths = ["~/my-skills", "../shared/skills"]   # extra custom skill roots
-
-[permissions]
-# Per-call gating. mode = writer fallback when no rule matches: ask|allow|deny.
-# Readers always default to allow. Precedence: deny > ask > allow > fallback.
-# Rules are "ToolName" or "ToolName(glob)"; '*' matches any run, '?' one char.
-mode  = "ask"
-# deny = ["bash(rm -rf*)", "bash(git push*)"]   # hard-blocked in every mode
-# allow = ["bash(go test*)", "bash(git status*)"]   # never prompted
-# ask = ["write_file"]   # force a prompt even if otherwise allowed
-
-[sandbox]
-# Confine tool blast radius. File-writers (write_file/edit_file/multi_edit)
-# may only write under workspace_root (empty = current dir) + allow_write.
-# bash = "enforce" (default) jails each command in an OS sandbox (macOS now;
-# graceful fallback elsewhere); "off" disables it. network allows egress.
-# workspace_root = ""            # default: current working directory
-# allow_write = ["/tmp"]          # extra dirs writers may also modify
-bash    = "enforce"
-network = true
-
-[statusline]
-# A custom status line: a command whose first stdout line replaces the built-in
-# data row. It receives {"model","contextUsed","contextWindow"} as JSON on stdin.
-# command = "my-statusline.sh"
-
-# External MCP servers. type: "stdio" (default, a subprocess) | "http" | "sse".
-# ${VAR} / ${VAR:-default} are expanded from the environment in command/args/env/url/headers.
-# [[plugins]]
-# name    = "example"
-# command = "reasonix-plugin-example"
-# [[plugins]]                                  # a remote server over Streamable HTTP
-# name    = "stripe"
-# type    = "http"
-# url     = "https://mcp.stripe.com"
-# headers = { Authorization = "Bearer ${STRIPE_KEY}" }