Przeglądaj źródła

docs: README 补 CHANGELOG(按日期分节)与对话接口对接说明

- CHANGELOG 由"只有一个飞书链接"改为按日期分节逐条记录改动
  (20260914 接口迁移 / 20260915 顺序与渲染修复 / 20260916 补问状态与问卷形态),
  历史版本仍保留飞书链接
- 新增「对话接口对接说明」:POST /api/chat 的请求参数与事件流、
  interrupt 四种 kind+status 形态、VITE_CHAT_API 环境变量
- 修正指向未入库文件的链接:docs/reference、harness、CLAUDE.md 改为纯文本说明
  (这些按 .gitignore 约定本机维护、不入库,缺失属正常)
- 补充常见坑:请求体只收两个字段、前端经适配层不直接渲染协议、
  不要用后端文案做判断

Co-Authored-By: Claude Code <noreply@anthropic.com>
gongtianxiao 4 dni temu
rodzic
commit
a41eec8709
1 zmienionych plików z 94 dodań i 31 usunięć
  1. 94 31
      README.md

+ 94 - 31
README.md

@@ -25,20 +25,20 @@
   会话与消息持久化到 `localStorage`
 - **流式**:`@microsoft/fetch-event-source`(旧协议,保留未用)与原生 `fetch` + `ReadableStream`(现行)
 - **Markdown**:`marked`;**3D/语音**:Three.js、`alloyfinger`
+  (Three.js 用于粒子背景与语音识别,**项目内没有 3D 虚拟人渲染**)
 
 ### 对话接口的关键约束
 
-当前使用**新接口** `POST /api/chat`(SSE)。两条最容易踩的规则:
+当前使用接口 `POST /api/chat`(SSE)。三条最容易踩的规则:
 
 1. **请求体只接受 `{thread_id, question}` 两个字段,多一个返回 422。**
    旧协议的 `transmission.files / file_pos` 发不出去(这是"文件上传"功能待定的原因)。
-2. **前端不直接渲染新协议**。`src/components/api-chat-coordinator.ts` 是**协议适配层**,
-   把新协议的 SSE 事件翻译成既有渲染组件能识别的内容标记:
+2. **前端不直接渲染接口协议。** `src/components/api-chat-coordinator.ts` 是**协议适配层**,
+   把 SSE 事件翻译成既有渲染组件能识别的内容标记:
    `<scope>` / `<!-- POLICY_TABLE -->` / `<ref_links>` / `<question-cards>`。
    渲染层(BusinessRecord / PolicyMatch / QuestionCard / ScopeContent)不需要感知新协议。
-
-**接口契约与字段释义见 [`docs/reference/`](docs/reference/)**(索引在该目录 README)。
-其中 `legacy/API.md` 是**交接时的代码快照,不是规格、不会更新**,不要照着它实现新功能。
+3. **不要用后端文案做判断。** 例如补问的形态由 `kind` + `status` 字段决定,
+   而不是拿 `input_help` 的中文措辞做正则——后端改一个字判定就会失效。
 
 ## 开发与构建
 
@@ -50,7 +50,6 @@ npm run build          # 生产构建(提交前必过)
 npm run build:test     # 测试环境构建
 npm run build:qingpu   # 青浦环境构建 + 打包 zip
 npm run test           # jest(可选)
-bash harness/init.sh   # 安装依赖 + 基础验证 + 打印启动命令
 ```
 
 开发环境注意:
@@ -65,7 +64,7 @@ bash harness/init.sh   # 安装依赖 + 基础验证 + 打印启动命令
 | 变量 | 用途 |
 |---|---|
 | `VITE_API` | 主业务 API 网关 |
-| `VITE_CHAT_API` | **对话接口**。兼容两种写法:服务前缀(`/chat-api`、`http://host:8000`)会自动追加 `/api/chat`;已是完整地址则原样使用 |
+| `VITE_CHAT_API` | **对话接口**。兼容两种写法:服务前缀(`/chat-api`、`http://host:8000`)会自动追加 `/api/chat`;已是完整地址则原样使用 |
 | `VITE_MODEL_SERVER` | 模型服务 |
 | `VITE_ASR` / `VITE_STREAM_SERVER` | 语音识别 / 流媒体 |
 
@@ -74,28 +73,20 @@ bash harness/init.sh   # 安装依赖 + 基础验证 + 打印启动命令
 ```
 src/
 ├── components/
-│   ├── Chat/                    消息渲染、政策卡片、问卷等
+│   ├── Chat/                    消息渲染、政策卡片、补问问卷等
 │   ├── Common/                  通用组件(MediaViewer、ScrollList、Toast…)
-│   ├── business-assistant/      对话编排(useBusinessAssistantChat 等)
-│   ├── api-chat-coordinator.ts  ★ 协议适配层
+│   ├── business-assistant/      对话编排(useBusinessAssistantChat、上传、滚动等)
+│   ├── api-chat-coordinator.ts  ★ 协议适配层(现行)
 │   └── stream-message-coordinator.ts  旧协议实现(保留未用,勿改)
-├── network/api/                 接口封装(chat-sessions、enterprise、assistant-statistics
+├── network/api/                 接口封装(chat-sessions、enterprise、assistant-statistics、card
 ├── types/                       TypeScript 类型定义
 ├── utils/                       工具(runtime-config、stream-xml-filter、scope-record-rows…)
-└── three-libs/                  Three.js 相关(ASR 等)
-
-harness/                         agent 长时开发的工作流文件(见下)
-docs/reference/                  接口契约与参考资料
+└── three-libs/asr/              语音识别
 ```
 
-## Agent 工作流(harness)
-
-本仓库用 `harness/` 管理长时开发状态,解决多轮会话的上下文断裂、半成品、假完成等问题。
-**这些文件不会自动维护**,规则写在 [`CLAUDE.md`](CLAUDE.md) 的「Harness 工作流」一节:
-
-- 开工先读 `harness/claude-progress.md` 与 `harness/feature_list.json`
-- 同一时间只做一个功能;没有可运行证据不得声称完成
-- **每次改动完成后立刻更新记录**,不要攒到会话结束
+> 本机另有 `docs/reference/`(接口契约与参考资料)、`harness/`(开发工作流文件)、
+> `CLAUDE.md` / `agents.md`(agent 指令)。这些按 `.gitignore` 约定**不入库**,
+> 缺失属正常。
 
 ## 后续新增改动的参考规范
 
@@ -162,14 +153,86 @@ docs/reference/                  接口契约与参考资料
 > (对话状态在 `useBusinessAssistantChat` 里)。上文的分层与 Pinia 改造适用于多页面小程序形态,
 > 本项目是否需要照搬,应按实际规模判断,不要为了对齐而引入用不上的依赖。
 
-## 相关文档
+## 对话接口对接说明
 
-| 位置 | 内容 |
-|---|---|
-| [`CLAUDE.md`](CLAUDE.md) | 项目架构说明 + agent 工作流规则 |
-| [`docs/reference/`](docs/reference/) | 接口契约(现行 `api-chat.md`、字段对照、legacy 快照) |
-| [`harness/`](harness/) | 进度日志、功能清单、启动脚本、评审表 |
+### 接口:POST `/api/chat`
+
+- **接口说明**:提交问题并流式返回回答;同一 `thread_id` 复用同一会话窗口
+- **请求头**:`Content-Type: application/json`
+- **请求参数**:
+
+| 参数 | 类型 | 说明 |
+|---|---|---|
+| `thread_id` | string | 会话窗口 ID,复用同一 ID 即接续上下文 |
+| `question` | string | 用户本轮输入。**只能是这两个字段**,多余字段返回 422 |
+
+- **返回**:`text/event-stream`,命名事件流
+  `accepted` → `progress`… → `answer` → `source`… → `item`… → `summary` → `result` → `done`
+  (补问流程为 `… → interrupt → result → done(status=needs_input)`)
+- **每个事件的 data 统一封装**:`{thread_id, request_id, data}`
+- **注意**:`answer.text` 与 `result.response` 内容相同,**只能展示一次**(result 是快照)
+
+### 补问(interrupt)的形态
+
+补问用 `kind` + `status` 描述,**四种情况**:
+
+| kind | status | 含义 | 前端形态 |
+|---|---|---|---|
+| `company_selection` | `found` | 有候选待选择 | 候选列表 + 查看更多 / 取消公司查询 |
+| `company_need` | `not_found` | 未找到候选,需补充信息 | 上方常驻输入框 + 跳过公司查询 |
+| `company_need` | `failed` | 查询服务失败 | 上方常驻输入框 + 跳过公司查询(文案须说明是失败) |
+| `company_need` | 无 `status` | 初次询问是否需要公司信息 | 上方常驻输入框 + 不需要公司信息 |
+
+**空候选与查询失败必须分别展示**,不能把失败说成"查无公司"。
+
+### 环境变量:新增 `VITE_CHAT_API`
+
+- 说明:对话接口地址。服务前缀(`/chat-api`、`http://host:8000`)会自动追加 `/api/chat`;
+  已是完整接口地址则原样使用
+- 开发环境默认:`/chat-api`(走 vite 同源代理,见 `vite.config.ts`)
 
 ## CHANGE LOG
 
-https://awbm.feishu.cn/docx/O2mVdW5q3oqhLGxzEdbcniIKnYb
+### 20260916
+
+- 公司补问改为按 `status` 字段判定形态(`found` / `not_found` / `failed` / 无 `status`),
+  替掉原先靠"候选数是否为 0"和 `input_help` 文案正则的猜测式判断
+  - `failed`(查询服务失败)此前会落进 `not_found` 分支,文案被填成"未查询到匹配的公司",
+    等于把失败说成查无公司,已改为独立分支并说明失败原因
+  - 无 `status`(初次询问是否需要公司信息)此前给"跳过公司查询",改为"不需要公司信息"
+- 补问卡片:输入框移到选项上方并常驻(原来在选项之后、需点击才展开)
+- 补问卡片:修复选项序号错乱——输入框在最上却拿 B、选项在下面却拿 A,现输入框取 A、选项顺延
+- 补问卡片:正文里已展示过的同一段文字不再在卡片内重复
+- 「跳过公司查询」由发送 `/skip` 改为发送选项文本「跳过公司查询」
+- 问卷提交:修复只取第一题(多题丢失)、多选只取第一项、以及数字开头选项被静默改写成纯数字
+- README 补充项目概述与对话接口对接说明;修正 `CLAUDE.md` 中与仓库实际不符的描述
+  (端口、状态管理、不存在的文件与目录等)
+
+### 20260915
+
+- 修复回答内容顺序:正文 → 政策卡片 → 综合说明 → **参考资料**(参考资料移到最下方)
+- 修复换行丢失:块级 markdown 下单个换行会被折叠,导致列表后紧跟的说明行被并进上一条列表项
+- 修复复制功能:复制结果剔除协议标记,不再把 `<scope>`、`<!-- POLICY_TABLE -->`、
+  `<ref_links>` 等原始标记一起复制出来
+- 修复卡片顺序与「更多」列表不一致:卡片改为按接口 `priority.rank` 排序
+- 「更多」面板的列表改为复用卡片数据,不再拉取与卡片无关的公共政策库
+- 部门筛选还原为最初的 15 个固定部门与字面匹配(此前一度改为按接口数据动态生成)
+- 新增惠企政策库来源标识(来自惠企政策库的卡片在右上角打标)
+- 政策详情面板新增「条件核验 / 匹配依据 / 原文引用」三个区块
+- 建立 `harness/` 开发工作流文件与 `docs/reference/` 接口参考
+
+### 20260914
+
+- AI 对话迁移到接口 `POST /api/chat`(SSE)
+  - 新增协议适配层 `src/components/api-chat-coordinator.ts`,把 SSE 事件翻译成既有渲染组件
+    可识别的内容标记,渲染层无需感知新协议
+  - 请求体严格只发 `{thread_id, question}`;`answer` 与 `result.response` 只展示一次;
+    未收到 `done`/`error` 即断流时按连接中断处理,不自动重试
+  - 旧协议实现 `src/components/stream-message-coordinator.ts` 保留未用
+- 新增环境变量 `VITE_CHAT_API`,新增 dev 代理 `/chat-api` → `http://192.168.2.23:8000`
+- 政策卡片、政策详情、参考资料、公司补问与候选确认接入新协议
+- 错误码翻译:把 HTTP 与 SSE 错误码转成中文提示(如 `thread_busy` → 该问题还在处理中)
+
+### 历史版本
+
+变更记录见飞书文档:https://awbm.feishu.cn/docx/O2mVdW5q3oqhLGxzEdbcniIKnYb