状态:已交付(2026-08-30) 依据:用户指令「内嵌一个可对话 AI 界面,例如 DeepSeek Web / 豆包电脑端这类」+「直接抄 DeepSeek Harness 就行(本地有源码)」+「目前只做纯聊天」+「精修对话能在 AI 对话中查看(提示词和回答 + 可跳转引用)」(2026-08-30) 蓝本:DeepSeek Harness(MIT,本地源码
D:\Program own\aicode\dpharness\deepseek-harness) 前置:v0.11.6 AI 平台化(Provider 抽象 + 能力声明 + BYOK)· ADR-010(补缝式上传授权契约)
应用内新增 💬「AI 对话」页:纯文本多轮聊天,流式输出、可停止、可重发/编辑重发、会话侧栏管理、每会话模型选择——交互范式照抄 DSH Web GUI,模型供给与密钥/审计/成本全部复用现有 BYOK AI 平台;不做工具调用/子代理/工作流/上下文注入。
- 现状:AI 平台(v0.11.6)已具备多 Provider(SiliconFlow/DeepSeek/OpenRouter/Ollama 预设)、DPAPI per-provider 密钥、六类错误归一、配额/缓存/审计、成本落库——但只有"任务型"能力(精修/补充/过滤),没有对话型能力;REQ-024「AI 多轮问答」长期 P2 挂起
- 用户诉求:像 DeepSeek Web/豆包电脑端那样"打开就能聊"的可对话 AI 界面;采集增强(AI 实时理解/智能切片)后续再议(本版登记不进范围)
- 选材:DSH 全套为 Agent Harness(宿主 Node ≥22 + Cordis 插件 + WebSocket + 工具/子代理/工作流/目标/计划/技能),核心价值在 agent 循环不在聊天;许可 MIT 可抄
| 议题 | 裁决 |
|---|---|
| "内嵌 AI"含义 | ① 内嵌可对话 AI 界面(DeepSeek Web/豆包形态)② AI 加强采集(抖音智能剪辑范式) |
| 思考范围 | 不受已有项目束缚,重新思考 |
| AI 对话路线 | 轻量复刻(A 档):交互范式照抄 DSH,模型走现有 BYOK 平台,会话入 SQLite;不做整包内嵌(Node sidecar 分发体积/权限冲突),不借视觉不抄内部(C 档) |
| 对话范围 | 纯聊天——不做会话/笔记/概念库上下文注入(L1–L4 ↓ 登记后续),不做图片输入,不做工具调用 |
| 精修整合 | AI 精修/补充的"对话"在 AI 对话页可查看:需看到提示词与回答全文(轨迹深度 B),任务对话带可跳转引用(来源会话/笔记/工作台)——REQ-230 |
| AI 增强采集 | 后续再议(本版只登记 REQ-229,不进范围) |
| REQ | 内容 |
|---|---|
| REQ-224 | AI 对话页(纯聊天):新顶部 Tab「AI 对话」+ 多轮文本聊天 + 消息落 SQLite(会话/消息两表)+ markdown 渲染(复用 react-markdown + GFM + KaTeX) |
| REQ-225 | 流式输出 + 停止 + 重发/编辑重发 + 错误重试:SSE 流式(stream: true → ureq into_reader 逐行解析 → Tauri 2 Channel 推送 delta);状态机 preparing → streaming → done/aborted/failed;全局单活跃流 |
| REQ-226 | 聊天会话管理:侧栏列表(新建/重命名/删除/搜索)+ 会话切换(保留挂载,TD-004 同模式) |
| REQ-227 | 每会话模型选择:复用 AI Provider 预设(默认 = 设置页默认 Provider/模型)+ 消息模型标签 |
| REQ-228 | 授权/成本/审计:AiSettings.content_gate(enabled+authorized 双闸门,默认关)+ 空态引导(一键去设置页 / 测试连接)+ 每消息 token/成本展示 + 调用审计与用量落库(复用现链) |
| REQ-230 | AI 任务对话视图(精修/补充轨迹):AI 对话页侧栏「🤖 AI 任务」段——refine/enrich 任务以只读对话展示,完整轨迹可看(每片提示词 system+user 原文、模型回答原文,可展开滚动)、任务卡带可跳转引用(来源会话/笔记/工作台;失败可重试);ai_tasks 加 trajectory_json 列([{turn, system, user, response}],旧任务无轨迹诚实提示) |
- 工具调用 / 子代理 / 工作流 / 计划 / 目标 / 技能(DSH harness 排除)
- 上下文注入:L0 纯聊天 → 后续 L1 当前会话 / L2 当前笔记 / L3 全库检索 / L4 概念库("AI 知道你在学什么、忘了什么")——登记为 REQ-231(后续)
- 图片/附件输入;流式之外增量
- AI 增强采集(REQ-229 待议)
前端 ChatPage/侧栏/列表/输入框
│ invoke(Tauri 2 Channel 流式)
▼
commands_ai_chat.rs ── content_gate(enabled+authorized,默认关)
│ ── resolve 默认 Provider + per-provider 密钥(现链)
▼
ai_chat.rs(新增,≤300 行)
├── 纯函数:history→OpenAI messages 组装 · SSE 行解析(data: / [DONE] / 畸形行)
├── 流式:ureq into_reader 逐 chunk → Channel::send(Chunk{delta})
└── CancellationFlag(Arc<AtomicBool>)—— chat_cancel 短路
▼
db_ai_chat.rs(新增)── ai_chat_sessions / ai_chat_messages 两表(db_migrations 幂等)
▼
审计/用量复用 db_ai_usage / ai_cost / ai_guardrails
- 数据流:
chat_send(session_id, content, channel)→ gate → 存 user 消息 → 流式调用 → 逐 delta 推送 → 结束存 assistant 消息(content+usage)→ 推送Done{usage, cost};chat_cancel(session_id)置取消标志 → 流循环退出 → 消息标status=aborted - 错误复用
AiClientError六类(Auth/Network/Balance/Quota/Server/Parse)→ 前端映射 + 重试按钮;失败不静默(v0.8 U5 纪律)
- 存储:
ai_tasks加列trajectory_json TEXT(ensure_column 幂等迁移)——[{turn, system, user, response}](每片 LLM 调用一条;system=提示词模板构建结果,user=请求 JSON,response=模型原始回答)。精修链路(ai_refine_task.rs各片调用处)收集轨迹,终态时随finish_ai_task写入;旧任务 NULL → 对话视图显示"升级前任务无轨迹存档"(诚实降级) - 展示:AI 对话页侧栏「🤖 AI 任务」段(refine/enrich 列表,复用
ai_task_history);点开 = 只读对话——任务卡(类型/标题/模型/片数/成本/状态/时间)+ 逐 turn 对话(用户=提示词,AI=回答,正文可展开滚动) + 可跳转引用 chips:来源会话 → 会话页(onOpenSessions现链)、来源笔记 → 笔记页(onOpenNote现链)+ 成功结果展开预览(result_json → refined/enriched markdown);失败任务带"重试"(精修=复用ai_refine_start;补充=笔记页手动) - 工作台跳转说明(审查核对 2026-08-30):精修工作台(RefineWorkbench)深链需跨页路由传递,本版未做——结果预览已在任务对话视图内展开(等价可见),工作台深链登记为后续增强项
- enrich 轨迹同步接入(
ai_note_enrich.rs同理收集);text_filter 轨迹暂不展示(YAGNI,审计可见化已覆盖)
- 消息:markdown 渲染(代码块/表格/公式——依赖已在)、时间戳、模型标签、复制按钮、失败态重试、编辑后重发
- 流式:打字效果 + 停止按钮(同一时刻仅一条活跃流,新消息需等待/停止)
- 会话:侧栏列表(新建/重命名/删除/搜索),历史落库重启可回看
- 空态:未授权/无密钥 → 引导卡("开启 AI 对话" → 设置页 AiProviderSettings 一键测试连接);首次发送前一次性提示"对话内容将发送至 {Provider} 云端"
- 授权闸门:与现有 AI 能力同规——enabled + authorized 双条件,默认关;空态引导不静默
- 上传透明:聊天文本上行,首次发送明确提示(授权语义,延续 ADR-010)
- 本地兜底:聊天是增强层不阻塞主链路——失败/离线 → 错误态 + 重试;Ollama Provider 预设天然提供本地端点选项(BYOK 用户自选)
- 密钥/审计/成本:密钥仍 DPAPI per-provider;每消息 usage 落库 + 审计可查
- Rust:SSE 解析器(多 chunk / chunk 跨行 /
[DONE]/ 畸形行 / 空 delta)、history→payload 组装(含 role 白名单/空 history)、gate 路径、db CRUD + 级联删除、取消标志短路——纯函数 AAA 先写测试 - 前端 Vitest:流式追加/停止态、composer 快捷键(Ctrl+Enter 发送/类 DSH)、侧栏 CRUD 交互(mock invoke)
- 回归:cargo test / clippy / vitest / tsc(现有基线全绿)
| M | 内容 | 预估 |
|---|---|---|
| M1 | 两表迁移 + ai_tasks.trajectory_json 列迁移 + db_ai_chat CRUD + 轨迹收集纯函数 + 命令骨架 |
1.5 天 |
| M2 | chat_send(流式 SSE + Channel)+ 停止 + 重发/编辑重发 + 错误重试 + ChatPage(列表/输入/markdown)→ "能聊" |
2.5 天 |
| M3 | 侧栏会话管理 + 模型选择 + token/成本展示 + 空态引导 | 1.5 天 |
| M4 | 任务对话视图:refine/enrich 轨迹回填接线 + list_ai_task_conversations + 前端任务段(轨迹展开/引用跳转/工作台/重试) |
2 天 |
| M5 | 全量回归(cargo test / clippy / vitest / tsc)+ 文档收尾 | 0.5 天 |
- 设置页启用 AI 并授权 → AI 对话页可发起多轮聊天,流式输出不卡 UI,可随时停止
- 停止/失败后消息状态正确(aborted/failed 可见,failed 可重试);重发/编辑重发正确替换旧消息
- 侧栏可新建/重命名/删除/搜索会话;重启应用历史消息可回看
- 每会话可选择模型(预设下拉);消息显示所用模型与 token/成本
- AI 任务段可见精修/补充任务对话:提示词与回答全文可展开查看;引用 chips 可跳转来源会话/笔记;成功结果可展开预览;失败任务可一键重试(精修)
- 未授权/无密钥时显示空态引导而非死界面;首次发送有云端提示
- 全量回归通过(cargo test / clippy / vitest / tsc)
- 蓝本:DeepSeek Harness Web GUI(交互范式;MIT 保留版权声明)
- 复用:v0.11.6 AI 平台化(Provider/密钥/错误/审计/成本)· ADR-010(上传授权契约)· v0.8 信任基建(任务状态机/溯源/降级)
- 后续:REQ-229(AI 增强采集)· REQ-231(聊天上下文注入 L1–L4)· REQ-024(问我的笔记,与 L3 上下文同源)
Rust:ai_chat.rs(纯函数:消息组装/SSE 行解析/轨迹序列化/取消标志,11 测)· ai_chat_stream.rs(ureq SSE 流式 + 取消短路 + 六类错误归一,7 测含本地 TCP 假服务端)· db_ai_chat.rs(chat_sessions/chat_messages 双表 CRUD + 级联删除,6 测;ai_tasks.trajectory_json 幂等迁移随表补列——时序:表建于 init_schema 后,经 ensure_column 提 pub(crate) 解决)· commands_ai_chat.rs(10 命令:会话 CRUD/模型/发送/重发/停止 + ai_task_conversation)· ai_refine_task.rs/commands_ai_enrich.rs(refine/enrich 每片 LLM 调用收集 AiTurn,终态随 finish 写 trajectory_json;vision 只记图数占位——base64 不入库)· lib.rs 注册 + AppState.chat_cancels 取消表
前端:pages/ChatPage.tsx(双段:💬对话 + 🤖AI 任务,流式信道处理/单活跃流/跨页跳转)· ChatSidebar(会话 CRUD + 任务列表)· ChatMessageList(流式打字/停止态/失败重试/编辑重发/token 展示)· ChatComposer(Ctrl+Enter/停止按钮)· TaskConversationView(任务卡/可跳转引用 chips/逐 turn 轨迹展开/结果预览/失败重试)· ChatMessageMarkdown(GFM+KaTeX 轻量渲染)· types/chat.ts + App.tsx 导航「💬 AI 对话」
回归:cargo test 1864 通过(新增 23 测 + 修复 1 条过期断言:from_settings_resolves_default_provider_when_set 硬编码 SiliconFlow 默认链,v0.12.0 已切 DeepSeek——改为断言被选 Provider 自身 base_url);预存基线 2 失败(note_filter session29_live_ui_excluded_from_points / ocr_points_exclude_watermark_junk_and_dupes——自 2026-08-23 起与本次改动无关,登记为技术债:note_filter 行为漂移后未同步夹具断言);clippy 零新警告 / vitest 438 通过(新增 7 测)/ tsc 零错误
- 开箱供给决策:内置直连 + 免费额度(听悟模式)vs 严格 BYOK——当前按 BYOK 实施,充值/计费体系待规模验证后另议(
ai_quota_*桩保留) - 聊天上下文注入(L1 会话 / L2 笔记 / L3 全库 / L4 概念库)优先级评估——纯聊天先行
- 流式重试语义:流中断后"从断点续流"不做(重试=整体重发),实录验证再议