feat(chat): add workspace chat, attachments and agent delegation
This commit is contained in:
@@ -1594,3 +1594,18 @@ CUDA 组件:`GET /api/local-models/runtime-components/cuda` 返回 status、st
|
||||
`/api/chat` 在 `use_rag=true` 且 Provider 声明 `tool_calling` 时允许最多 3 轮只读补检索。SSE 事件类型不变,只有最终轮发送 `Done`;`Usage` 为模型轮次累计值。`Citation.number` 在同一回复内稳定,新增来源追加编号;候选来源不等于已引用来源,前端按正文 `[n]` 展示。`ToolCallEnd.data.status` 可为 `completed` 或 `failed`,表示执行结果而非参数接收完成。
|
||||
|
||||
工具目录新增 `markdown.catalog`、`markdown.compose`、`notes.patch_markdown`。`notes.read` 输出新增 `content_hash`;局部修改须携带 SHA-256 `expected_content_hash`、唯一匹配的 `old_text` 和替换值 `new_text`,沿用 `notes.write` 权限。详细边界及验证方法见 [聊天按需检索与 Markdown 工具](../development/聊天按需检索与Markdown工具.md)。
|
||||
|
||||
|
||||
## 工作区聊天与智能体委托补充(2026-09-06)
|
||||
|
||||
- `ChatRequest.workspace_context`:可选 `{ file_path, content }`,传递当前编辑器快照,含未保存编辑。内容上限 200 万字符。
|
||||
- `ChatRequest.allow_agent`:默认 `false`;开启且 Provider 支持工具调用时提供 `agent.create` 与 `agent.status`。每个回答最多创建一次,执行仍受原有工具白名单、预算和权限机制约束。
|
||||
- `ChatMessage.workspace_context`:保存发送时的文件快照,列表和版本恢复接口返回同一数据;现有聊天记录接口供工作区浮窗与完整聊天页共享。
|
||||
- `ToolCallEnd.data.result`:智能体工具返回 `{ run_id, status, output?, error? }`,消息工具记录以 JSON 字符串持久化此结果,客户端展示运行入口。
|
||||
|
||||
|
||||
## 聊天附件补充(2026-09-06)
|
||||
|
||||
`/api/media/attachments` 新增允许 DOCX、PPTX、PPT、PNG、JPG/JPEG、WebP 后缀。聊天通过 `ChatRequest.attachments` 提交最多 8 个持久化附件 ID,并通过 `ChatMessage.attachments` 恢复记录。`image_fallback_tools` 最多两个注册工具名,服务端固定 MCP 优先、Plugin 次之,不接受任意命令或远程下载 URL。
|
||||
|
||||
内部模型 `Message.images` 使用有大小限制的 PNG/JPEG/WebP base64 data URI,Provider 适配器转换为各自原生协议。文档和音频提取为参考文本后才交给普通聊天,清除已解析的二进制附件标记,使文本上下文检测仍可工作。附件失败返回 `CHAT_ATTACHMENT_FAILED`,进度与截断提示使用 `ContextStatus`,不将失败附件当作已读取内容。
|
||||
|
||||
@@ -69,3 +69,27 @@ AI 消息提供“重新生成”,用户消息提供“编辑”及“保存
|
||||
验证方法:运行 `test_chat_retrieval.py` 检查模型工具结果不包含内部 ID、来源编号稳定及段落边界;运行 `usedCitations.spec.ts`、`markdownRendering.spec.ts`、`markdownDiagramRendering.spec.ts` 检查历史 ID、相邻数字引用、代码排除、语言标签、图中文字净化、源码切换和剪贴板原文。手动复查原有回答的卡片与正文编号均可定位笔记,新建检索问答使用数字编号。
|
||||
|
||||
聊天代码块改用包含工具栏与代码内容的统一边框容器。纸间时光 1.9.2 将装饰作用于整个容器,语言名称与复制按钮位于框内,底部保留语言标签。Shiki 行间分隔换行从显示 DOM 中移除,真实空行仍由 `.line` 保留,复制始终读取独立保存的原文。`markdownRendering.spec.ts` 覆盖容器、工具栏、空行及原文复制,防止重复行高回归。
|
||||
|
||||
## 工作区浮动聊天与智能体委托
|
||||
|
||||
工作区右下角 AI 按钮按需加载非模态浮窗;标题栏可拖动,也可聚焦后用方向键移动,窗口受视口边界限制。关闭仅隐藏,生成与当前会话继续保留。浮窗与 AI 对话页面复用 ChatView 和 chat store,提供新对话、历史选择及跳转到完整页面。会话创建和消息保存仍使用原有本地数据库 API,不建立第二份聊天记录。
|
||||
|
||||
每次发送从编辑器读取当前路径和完整内容,包括未保存修改。`ChatRequest.workspace_context` 包含 `file_path` 和 `content`,单次最多 200 万字符;模型上下文将其明确标记为参考数据。`chat_messages.workspace_context_json` 新增迁移保存快照,历史消息可展开查看。当在完整聊天页面继续时,复用当前会话最后的文件快照;浮窗继续发送则使用最新文件,没有打开文件时不附带旧文件。重新生成和编辑沿用消息分支规则。
|
||||
|
||||
聊天工具栏新增“允许创建智能体”,默认关闭。开启后,支持工具调用的模型可使用 `agent.create` 和 `agent.status`。每次回答最多创建一个运行,沿用同一 Provider/模型、现有 Agent 持久化及权限处理;工具范围固定为笔记读取与修改、Markdown 格式工具及任务管理,不启用网络,限制 10 步、16000 token 和运行时长。`ToolCallEnd.result` 保存运行 ID、状态与结果,历史工具卡片可跳转至智能体页面查看进度、审批或取消。聊天停止不会自动取消已创建的独立智能体;需进入运行页面取消。此阶段创建的是持久化 Agent 运行,不新增人格模板注册体系。
|
||||
|
||||
验证:`test_chat_agents.py` 检查委托开关、一次创建上限、运行预算、无网络及文件参考数据;`test_chat_versions.py` 检查消息快照和运行链接恢复;`chat.spec.ts` 检查连续发送、文件更新、完整页续聊与无文件清除;`WorkspaceChat.spec.ts` 使用真实 Teleport 检查窗口关闭重开时组件不重建、文件内容实时更新和键盘移动。手动验收:打开文件并进行未保存编辑,从右下角发送问题;关闭重开,切换文件再发送;进入 AI 对话页恢复记录。开启智能体后要求创建任务或修改笔记,通过工具卡片进入运行页处理权限确认。
|
||||
|
||||
## 浮窗配置与聊天附件
|
||||
|
||||
浮窗配置区默认折叠,历史选择保留在外部;完整聊天页将配置区与正文和输入框统一到 820px 内容列。窗口右下角手柄支持鼠标拖动与方向键调整尺寸,边界限制在当前视口内。位置和大小保存到本机 localStorage,重置窗口恢复默认大小与位置。
|
||||
|
||||
附件上传复用 `/api/media/attachments`,聊天请求的 `attachments` 最多包含 8 个已上传 ID,消息通过 `attachments_json` 保存并恢复。文档解析在线程中进行:Markdown/TXT 读取 UTF-8,DOCX/PPTX 提取 XML 段落与幻灯片文本,PPT 使用 olefile 读取 PowerPoint 二进制文本记录;扫描页、图像和嵌入对象不等于提取出的文本,需单独上传图片。文档最大 25 MiB,解压总量限制 64 MiB,单份抽取文本最多 20 万字符并显示截断提示。音频沿用现有持久化转写任务及模型路由;支持的录音和视频后缀与音视频页一致,处理失败在聊天中明确反馈。
|
||||
|
||||
图片支持 PNG/JPEG/WebP,最大 20 MiB。优先读取模型列表与 Provider 已声明的 vision 能力,使用当前 Provider/模型原生图片接口提取与本次问题相关的信息。OpenAI Chat Completions、Responses、Anthropic Messages、Ollama 已接入各自图片请求结构。模型清单不提供能力时须在 Provider 中正确声明,不能仅凭模型名称保证支持。启用纯文本上下文检测的模型仍会拒绝无法可靠估算的原生图片请求,此时进入显式配置的降级链。
|
||||
|
||||
图片降级处理器在聊天设置中选择,表示允许将本次会话图片交给该服务;先尝试已注册 MCP,再尝试 Plugin。仅接受明确命名为 image/vision、权限为无或 network.request 的处理器,拒绝策略仍有效。入参适配支持 prompt/query/question、image_source/image_path/path、image_url、attachment_id,其他必填参数交由工具 Schema 校验,不猜测。MCP 超时或失败会继续尝试插件;没有成功处理器则报错。Plugin 使用同一注册接口,后续社区扩展无需改聊天核心。原生视觉提取是一次独立模型调用,真实厂商费用与支持情况需由对应服务验证。
|
||||
|
||||
内置 `chat-operator` Skill 与 `chat-policy` Plugin 随 Host 注册。Plugin 的 `chat-policy.plan` 使用宿主白名单 handler 校验任务与预算,生成读取、执行和核验步骤,不执行任意插件代码。聊天委托创建运行前调用检查;启用的 Skill 加入聊天系统提示词并作为委托运行的 Skill,权限继续由 Agent 管理。用户禁用扩展后不会自动重新启用。
|
||||
|
||||
新增验证:`test_chat_attachments.py` 覆盖 Office/Markdown 文本抽取、旧 PPT 文本记录、截断、音频任务路由、原生视觉优先及 MCP 超时后 Plugin 降级;浮窗测试覆盖尺寸记忆和重置。浏览器实测折叠设置、上传入口和拖动缩放。未使用真实外部模型或 MCP 服务进行付费调用验收。
|
||||
|
||||
Reference in New Issue
Block a user