Magent 过程展示改进计划

状态:已实施并完成确定性验证。最后更新:2026-09-21。

已确定的方向

以用户提供的 Codex / agent-shell 截图为参照:

  • 简短的进度正文直接显示,说明已发现的事实和下一步。
  • 活动分组、标题、展开与折叠完全由 agent-shell 控制,沿用用户现有配置。 Magent 只负责提供类型正确、顺序完整的正文、思考和工具事件。
  • 最终答复独立保留。第一版采用主模型自然输出进度的路线;模型未输出 进度正文时展示实际活动状态,不增加额外摘要模型或强制阶段请求。
  • 进度采用里程碑节奏:获得影响结论、改变方向、开始修改或验证失败时 更新一至两句;没有新结论时不逐条播报工具调用,但连续六次工具调用 仍无正文时应补充一次真实的阶段进度。
  • 任何需要调用工具的任务都先输出一句简短开场,说明首先要确认什么; 即使只需一次读取也保留开场。无需工具的纯问答不强制开场进度。
  • 工具或测试失败仅在改变判断、改变后续方案或形成阻塞时立即说明。 可预期的探测失败等形成结论后再更新,避免把试探过程写成流水账。
  • 进度正文只包含影响判断的关键对象、事实和下一步,不复述完整命令、 参数或工具输出;这些执行细节继续由 agent-shell 的活动组展示。
  • 进度正文作为正常 assistant 消息持久化;恢复会话时按原始顺序重放。 活动细节及其折叠仍由 agent-shell 管理。
  • 进度正文固定使用无标题、无项目符号的普通短段落,通常一至两句; 即使同时有多个要点也不改成列表,保持连续的阅读节奏。
  • 一至两句是提示词约束和测试目标。模型偶尔输出更长内容时,Magent 原样保留,不在运行时截断或改写;若实际长期偏长,再根据观察收紧提示。
  • 用户在执行中改变要求且影响当前方案时,下一次工具调用前先用一句正文 确认新方向;不影响方案的补充信息并入下一次自然进度。
  • “连续六次工具调用内更新”是对主模型的提示目标,不是运行时硬保证。 模型未输出正文时不伪造进度,也不增加补写请求;agent-shell 仍显示 真实活动状态。
  • 模型暂时没有输出正文、但工具活动仍在继续时,界面显示固定文案 “进行中”。这是运行状态提示,不作为模型进度正文,也不冒充新结论; Magent 只提供准确的生命周期状态,具体呈现仍由 agent-shell 负责。 该提示只在运行期间存在,任务完成、失败或取消后立即消失,不进入 会话历史。

用户已明确:本任务不设计或修改 agent-shell 展示偏好,也不添加 Magent 专属的折叠配置。截图用于说明进度正文与执行细节分离后的阅读体验。

已核实的依据

DeepSeek 支持正文与工具调用并存

官方 Thinking Mode 文档 的工具示例在同一 assistant 消息中返回 reasoning_content~、~content 和 tool_calls~,也展示了 ~content 为空的工具步骤。支持这类输出不等于 每一步都会生成进度正文。

DeepSeek-V4-Pro 官方解析实现 分别提取思考、工具调用前的正文和工具调用。当前文档的示例模型是 deepseek-flash~;用户当前 ~deepseek-v4-pro 路由的实际行为仍需实测。

思考折叠只改变展示。带 tools 的后续请求必须遵守服务端对 reasoning_content 完整回传的要求。

本地已有基础

  • prompts/system.org 已要求开场与阶段进度,强调正文和思考分离。
  • magent-agent.el 将工具调用前的助手消息归为 ~commentary~。
  • magent-acp.el 将正文和思考分别发为 agent_message_chunk 和 ~agent_thought_chunk~。
  • 当前 agent-shell 已提供活动分组、描述性标题和 latest 自动折叠行为。
  • 只读检查时,思考、工具与活动组的展开默认值均为 nil;没有活动的 agent-shell buffer,尚未获得问题会话的现场输出证据。

已确认并修复的适配缺口

当前 gptel OpenAI 流式解析器在保存工具调用 assistant 消息时使用 ~:content :null~,导致同轮生成的进度正文不进入原生续传历史。Magent 现在 在 gptel 适配边界把已经流向界面的真实正文写回该消息;不生成、截断或改写 正文。真实 gptel 流解析回归测试覆盖了这个缺口。

实施顺序

  1. 用确定性流式样例覆盖“思考 → 正文 → 工具 → 思考 → 正文 → 工具 → 最终答复”,另覆盖工具步骤无正文的情形。检查实时展示和续传历史。
  2. 在隔离 Emacs daemon 中,通过现有 gptel 路由测试 ~deepseek-v4-pro~, 区分模型没有生成正文、适配层丢失正文、ACP 消息边界不完整三种情况。
  3. 依据复现修正必要边界:传输适配留在 ~magent-sampling-gptel.el~, ACP 投影留在 ~magent-acp.el~,由 agent-shell 按现有配置负责展示。 保留 ~gptel-request~,不重写 HTTP/SSE 或新增渲染层。
  4. 若需调整提示词,仅强化有证据的简短进度和输出位置。配置加载时需 检查 magent-system-prompt 是旧的已加载默认值还是用户定制值, 避免覆盖用户定制。
  5. 验证流式输出、续传、历史恢复、错误、取消与普通无工具问答;运行 与改动相称的 ERT、编译、lint 和隔离 live smoke,更新用户文档。

验收标准

  • 正文按时间顺序直接可见,不混入 Thinking 块、不重复、不丢失。
  • 正文、思考与工具事件保持正确类型和顺序,供 agent-shell 原生展示。
  • 不修改 agent-shell 展示配置;不改变权限、工具执行次数或最终完成判断。
  • 对无正文的工具步骤不伪造模型进度,不增加补写请求。
  • 工具运行且暂无进度正文时可见“进行中”,并且它不进入 assistant 历史。
  • 恢复会话保持消息和活动顺序;失败或取消仍有可检查的状态。
  • 明确区分确定性测试通过与当前 DeepSeek 路由的实际观察结果。

后续调查

当前没有未决的产品选择。确定性复现确认:gptel 的 OpenAI-compatible Chat 流会把工具调用前正文发给界面,但在原生 assistant tool-call 续接消息里固定 保存为 null。Magent 现已在适配边界把模型真实输出写回该消息,并用真实 gptel 流解析器覆盖“正文 → 工具调用”的回归测试。

隔离 agent-shell/ACP smoke 已通过。隔离 daemon 中配置的 deepseek-v4-pro 真实请求在 sampling 开始前即被现有诊断环境标为失败,没有产生 assistant、 tool 或 provider 事件,因此该次运行不能用于判断模型是否遵守进度提示;没有 把这一环境问题归因于本次改动。