|
|
@@ -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
|