Fix/画布agent优化 #121

Merged
kdletters merged 7 commits from fix/artagent-rerefine-prompt into master 2026-07-31 13:36:12 +08:00
Member

主要改善:

  • 鸡毛当令箭一直要求用户确认
  • 不从上下文推断引用的参考图
  • 鼓励批量发起工具调用

fix:

  • 删除 强制把上一次生成结果注入上下文, (这不考虑用户是否新上传/新引用/指代更远的历史的图片),
  • 清理过时文档
  • 带附件的空消息不应该接受
主要改善: - 鸡毛当令箭一直要求用户确认 - 不从上下文推断引用的参考图 - 鼓励批量发起工具调用 fix: - 删除 强制把上一次生成结果注入上下文, (这不考虑用户是否新上传/新引用/指代更远的历史的图片), - 清理过时文档 - 带附件的空消息不应该接受
k88936 self-assigned this 2026-07-30 14:58:27 +08:00
k88936 added this to the 美术Agent project 2026-07-30 14:58:27 +08:00
k88936 changed title from Fix/artagent rerefine prompt to Fix/画布agent优化 2026-07-30 15:26:15 +08:00
k88936 requested review from kdletters 2026-07-30 16:08:32 +08:00
kdletters requested changes 2026-07-30 16:31:01 +08:00
Dismissed
kdletters left a comment
Member

结论:请求修改。已按 master b512430e / head 2987a4c6 审查;当前 4 项 CI 全绿,但仍有以下合并阻塞。

  1. [P1] 长对话会丢失可编辑图片的真实 image_id
    server-rs/crates/platform-editor-agent/src/agent/prompt.rs:40-51 删除了从完整历史补入最近完成图片上下文的逻辑,只保留最近 18 条 raw message。build_tool_context 虽仍扫描全量图片,但该映射不会发给 LLM。生成图之后若经过 18 条以上非图片消息,再说“把上一张/之前那张改成蓝色”,模型看不到合法的 sha256:*,无法构造 edit-image.object_image_id。请保留有界图片候选上下文并明确“本轮显式附件优先”,而不是直接删除;同时恢复长对话回归测试。

  2. [P2] 底层前端 hook 仍允许纯附件请求
    src/components/image-editor/EditorAgentConversation/useEditorAgentConversation.ts:451-461 的门禁仍是 (!text && !attachments.length),所以 sendMessage('', [attachment]) 会继续请求已改为必定拒绝它的后端。useEditorAgentConversation.test.tsx:797-834 还明确断言旧行为。面板按钮禁用只能保护当前 UI 入口;请把 hook 门禁改为 !text 即返回,并把该测试改为断言 client 未调用。

  3. [P2] “并行”提示与真实串行执行契约冲突
    platform-editor-agent/src/agent/prompt.rs:26-27 要求“尽量并行/提高并行度”,但 harness 在 run.rs 中逐项 await,测试也锁定数组顺序串行;decision-log.md:4573pitfalls.md:3293 仍明确要求 prompt 不宣称并发。请改为“无依赖调用可在同一 tool_calls[] 批量提交,后端按数组顺序执行”;有前后依赖、需要前一结果 image_id 的操作不能放进同一批。

  4. [P2] 公共 system prompt 拼接缺少分隔
    server-rs/crates/platform-agent-harness/src/prompt.rs:34-38 连续 push_str 没有换行,最终会形成 inside)we will...dependency)Valid...response.- edit-image。这破坏了发给模型的工具协议结构。请补齐空格/换行,并恢复对最终 prompt 形状、串行语义和无工具形状的测试。

  5. [P2] 规划轮次从 3 改到 8,但权威契约仍是 3
    server-rs/crates/api-server/src/editor_agent/api.rs:263 改为 .max_turns(8),而 docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md:84 仍写“最多 3 轮规划”,项目踩坑记录也明确不要用提高轮次掩盖终止问题。非法 JSON/无效工具现在最多会多发 5 次 completion,改变失败延迟和 provider 用量。请恢复 3,或同步权威文档、预算说明和配置级测试。

  6. [P2] 关键契约测试和提交历史不符合仓库门禁
    本 PR 删除了 harness 的 3 个 prompt contract tests 和 editor-agent 的 4 个 prompt/image-context tests;新增 invalid-JSON 纠正流程却没有行为测试,上述第 1/3/4 项因此没有被挡住。请补回相应语义级回归测试。另 base..head 的提交标题多数为英文或中英混合、正文均为空,不符合仓库“中文标题 + 每项变更逐行正文”规则,请整理提交历史。

复核验证:platform-agent-harness 20/20、platform-editor-agent 17/17、module-editor-agent 3/3,前端面板 + hook 40/40 均通过;这些通过结果同时确认当前测试仍锁定了纯附件 hook 的旧契约。git diff --check 通过,临时 worktree 已清理。

结论:请求修改。已按 master `b512430e` / head `2987a4c6` 审查;当前 4 项 CI 全绿,但仍有以下合并阻塞。 1. [P1] 长对话会丢失可编辑图片的真实 image_id `server-rs/crates/platform-editor-agent/src/agent/prompt.rs:40-51` 删除了从完整历史补入最近完成图片上下文的逻辑,只保留最近 18 条 raw message。`build_tool_context` 虽仍扫描全量图片,但该映射不会发给 LLM。生成图之后若经过 18 条以上非图片消息,再说“把上一张/之前那张改成蓝色”,模型看不到合法的 `sha256:*`,无法构造 `edit-image.object_image_id`。请保留有界图片候选上下文并明确“本轮显式附件优先”,而不是直接删除;同时恢复长对话回归测试。 2. [P2] 底层前端 hook 仍允许纯附件请求 `src/components/image-editor/EditorAgentConversation/useEditorAgentConversation.ts:451-461` 的门禁仍是 `(!text && !attachments.length)`,所以 `sendMessage('', [attachment])` 会继续请求已改为必定拒绝它的后端。`useEditorAgentConversation.test.tsx:797-834` 还明确断言旧行为。面板按钮禁用只能保护当前 UI 入口;请把 hook 门禁改为 `!text` 即返回,并把该测试改为断言 client 未调用。 3. [P2] “并行”提示与真实串行执行契约冲突 `platform-editor-agent/src/agent/prompt.rs:26-27` 要求“尽量并行/提高并行度”,但 harness 在 `run.rs` 中逐项 await,测试也锁定数组顺序串行;`decision-log.md:4573` 与 `pitfalls.md:3293` 仍明确要求 prompt 不宣称并发。请改为“无依赖调用可在同一 `tool_calls[]` 批量提交,后端按数组顺序执行”;有前后依赖、需要前一结果 image_id 的操作不能放进同一批。 4. [P2] 公共 system prompt 拼接缺少分隔 `server-rs/crates/platform-agent-harness/src/prompt.rs:34-38` 连续 `push_str` 没有换行,最终会形成 `inside)we will...dependency)Valid...response.- edit-image`。这破坏了发给模型的工具协议结构。请补齐空格/换行,并恢复对最终 prompt 形状、串行语义和无工具形状的测试。 5. [P2] 规划轮次从 3 改到 8,但权威契约仍是 3 `server-rs/crates/api-server/src/editor_agent/api.rs:263` 改为 `.max_turns(8)`,而 `docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md:84` 仍写“最多 3 轮规划”,项目踩坑记录也明确不要用提高轮次掩盖终止问题。非法 JSON/无效工具现在最多会多发 5 次 completion,改变失败延迟和 provider 用量。请恢复 3,或同步权威文档、预算说明和配置级测试。 6. [P2] 关键契约测试和提交历史不符合仓库门禁 本 PR 删除了 harness 的 3 个 prompt contract tests 和 editor-agent 的 4 个 prompt/image-context tests;新增 invalid-JSON 纠正流程却没有行为测试,上述第 1/3/4 项因此没有被挡住。请补回相应语义级回归测试。另 base..head 的提交标题多数为英文或中英混合、正文均为空,不符合仓库“中文标题 + 每项变更逐行正文”规则,请整理提交历史。 复核验证:`platform-agent-harness` 20/20、`platform-editor-agent` 17/17、`module-editor-agent` 3/3,前端面板 + hook 40/40 均通过;这些通过结果同时确认当前测试仍锁定了纯附件 hook 的旧契约。`git diff --check` 通过,临时 worktree 已清理。
Author
Member

第一条我的做法是让llm提示用户重新引用:

  • 我们的滑动窗口上下文有限, 如果你确实无法找到用户的指代(可能被历史截断了), 请说明情况请求用户重新引用(但不是告诉你image_id)
第一条我的做法是让llm提示用户重新引用: - 我们的滑动窗口上下文有限, 如果你确实无法找到用户的指代(可能被历史截断了), 请说明情况请求用户重新引用(但不是告诉你image_id)
kdletters requested changes 2026-07-30 20:03:13 +08:00
Dismissed
kdletters left a comment
Member

复审结论:仍需修改。已按最新 master a36290b2 / head a54f5233 重审;4 项 CI 全绿、无冲突。

上一轮以下意见已清除:纯附件 hook 已修复;system prompt 分隔和 invalid-JSON 行为测试已补;max_turns 已恢复 3;“历史超出 18 条窗口时请求用户重新引用”是作者明确选择,本轮按该产品取舍接受,不再要求恢复 latestGeneratedImage

当前仍有 4 项阻塞:

  1. [P1] 对话里说“确认/取消”可能重复创建付费工具调用
    server-rs/crates/platform-editor-agent/src/agent/prompt.rs:17-29 把基线中“当前消息是在确认/取消匹配的 pending 调用时,引导点击已有卡片按钮、不得重复提交”的规则整体注释掉了;当前有效提示词反而在 29 行要求直接发起工具调用。普通消息 POST 不会确认或取消旧工具卡,只有卡片接口能改变旧调用。模型若针对“确认/可以/取消”重新发出同一工具,会生成另一个 messageId;确认 dedupe key 又包含 messageId,因此两个卡片可分别入队、分别扣费。请恢复只针对匹配 pending 调用的按钮路由和禁止重复提交规则,同时保留 27-28 行“cancelled 不再处理、pending 不阻塞无关新请求”的新语义。

  2. [P1] 内部会议记录链接进入生产源码
    server-rs/crates/platform-editor-agent/src/agent/prompt.rs:17 提交了内部飞书会议记录 URL,并把被临时停用的提示词整段留成注释。仓库绝对约束禁止提交会话记录;资源 token 也不应写进源码历史。请删除该链接和临时死注释,用不包含内部资源标识的正式注释/决策文档说明最终规则。

  3. [P2] 业务提示仍宣称并行,和 runner 串行契约冲突
    同文件第 30 行仍写“多次(尽量并行)调用”,但 harness 在 run.rs 中逐项 await,公共 prompt 明确 sequential,decision-log.md:5661 也规定业务 prompt 不得宣称并发。第 31 行虽限制“无依赖”,仍没有消除前一行的并发承诺。请统一成“同一回复批量列出无依赖调用,运行时按数组顺序执行”,不要使用“并行”。

  4. [P2] 画布业务 prompt 契约测试和提交门禁仍未闭环
    公共 harness 测试已恢复,但 platform-editor-agent/src/agent/prompt.rs 原有的业务 prompt/image-context 测试仍被整体删除,因此第 1/3 项在 CI 中仍是绿的。请至少补回 pending 确认/取消、cancelled 后新调用、无依赖批量但串行、窗口外重新引用、工具路由策略的契约测试。另当前 PR 提交标题仍大量为英文或中英混合,所有提交正文为空,不符合仓库“中文标题 + 每项变更逐行正文”规则,请整理历史。

验证:platform-agent-harness 24/24、platform-editor-agent 17/17、api-server editor_agent 32/32、前端面板 + hook 40/40 全部通过,git diff --check 通过;这些结果确认现有测试门禁通过,但不覆盖上述业务 prompt 语义。临时 worktree 已清理。

复审结论:仍需修改。已按最新 master `a36290b2` / head `a54f5233` 重审;4 项 CI 全绿、无冲突。 上一轮以下意见已清除:纯附件 hook 已修复;system prompt 分隔和 invalid-JSON 行为测试已补;`max_turns` 已恢复 3;“历史超出 18 条窗口时请求用户重新引用”是作者明确选择,本轮按该产品取舍接受,不再要求恢复 `latestGeneratedImage`。 当前仍有 4 项阻塞: 1. [P1] 对话里说“确认/取消”可能重复创建付费工具调用 `server-rs/crates/platform-editor-agent/src/agent/prompt.rs:17-29` 把基线中“当前消息是在确认/取消匹配的 pending 调用时,引导点击已有卡片按钮、不得重复提交”的规则整体注释掉了;当前有效提示词反而在 29 行要求直接发起工具调用。普通消息 POST 不会确认或取消旧工具卡,只有卡片接口能改变旧调用。模型若针对“确认/可以/取消”重新发出同一工具,会生成另一个 messageId;确认 dedupe key 又包含 messageId,因此两个卡片可分别入队、分别扣费。请恢复**只针对匹配 pending 调用**的按钮路由和禁止重复提交规则,同时保留 27-28 行“cancelled 不再处理、pending 不阻塞无关新请求”的新语义。 2. [P1] 内部会议记录链接进入生产源码 `server-rs/crates/platform-editor-agent/src/agent/prompt.rs:17` 提交了内部飞书会议记录 URL,并把被临时停用的提示词整段留成注释。仓库绝对约束禁止提交会话记录;资源 token 也不应写进源码历史。请删除该链接和临时死注释,用不包含内部资源标识的正式注释/决策文档说明最终规则。 3. [P2] 业务提示仍宣称并行,和 runner 串行契约冲突 同文件第 30 行仍写“多次(尽量并行)调用”,但 harness 在 `run.rs` 中逐项 await,公共 prompt 明确 sequential,`decision-log.md:5661` 也规定业务 prompt 不得宣称并发。第 31 行虽限制“无依赖”,仍没有消除前一行的并发承诺。请统一成“同一回复批量列出无依赖调用,运行时按数组顺序执行”,不要使用“并行”。 4. [P2] 画布业务 prompt 契约测试和提交门禁仍未闭环 公共 harness 测试已恢复,但 `platform-editor-agent/src/agent/prompt.rs` 原有的业务 prompt/image-context 测试仍被整体删除,因此第 1/3 项在 CI 中仍是绿的。请至少补回 pending 确认/取消、cancelled 后新调用、无依赖批量但串行、窗口外重新引用、工具路由策略的契约测试。另当前 PR 提交标题仍大量为英文或中英混合,所有提交正文为空,不符合仓库“中文标题 + 每项变更逐行正文”规则,请整理历史。 验证:`platform-agent-harness` 24/24、`platform-editor-agent` 17/17、`api-server editor_agent` 32/32、前端面板 + hook 40/40 全部通过,`git diff --check` 通过;这些结果确认现有测试门禁通过,但不覆盖上述业务 prompt 语义。临时 worktree 已清理。
k88936 added 5 commits 2026-07-31 12:12:39 +08:00
统一系统消息、工具结果与异常响应的消息构造。
补充无效响应纠正、批量工具调用和待确认状态处理。
精简图片上下文提示并完善越界引用回退规则。
补齐运行循环和提示词行为测试。
要求用户消息包含非空文本,附件仅作为消息上下文。
同步后端领域校验、接口错误和请求测试。
禁用前端纯附件发送并更新交互回归测试。
保留发送失败时的草稿与附件恢复行为。
更新后端契约与前端接入文档中的消息输入规则。
记录图片引用、提示词上下文和异常响应处理决策。
补充相关排障经验并移除过期说明。
覆盖确认取消、取消后新调用与无依赖批量串行策略

覆盖消息窗口截断、窗口外重新引用与工具路由矩阵
记录画布Agent待确认提示词边界
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / Backend tests (pull_request) Failing after 7s
Project CI / Frontend tests (pull_request) Failing after 2m2s
Project CI / Native shell tests (pull_request) Successful in 12m10s
3ca96c4cca
专题文档明确匹配pending卡片时使用正向条件化引导

决策记录固化避免全局禁止重发话术的模型实测结论

踩坑记录补充过度泛化的原因、处理与验证方式
k88936 force-pushed fix/artagent-rerefine-prompt from a54f5233a9 to 3ca96c4cca 2026-07-31 12:12:39 +08:00 Compare
k88936 added 1 commit 2026-07-31 12:13:01 +08:00
Merge remote-tracking branch 'origin/master' into fix/artagent-rerefine-prompt
Project CI / Frontend tests (pull_request) Successful in 2m43s
Project CI / Repository checks (pull_request) Successful in 1m7s
Project CI / Backend tests (pull_request) Successful in 3m30s
Project CI / Native shell tests (pull_request) Successful in 11m32s
81911ffbee
kdletters requested changes 2026-07-31 13:09:16 +08:00
Dismissed
kdletters left a comment
Member

复审结论:功能阻塞已全部清除,当前仅剩提交历史门禁,仍需一次小修。

已确认修复:

  • 匹配 pending 卡片时,引导用户点击确认/取消按钮;同时不再阻塞无关新调用。
  • “并行”已改为“无依赖调用批量提交、runner 串行执行”。
  • 内部飞书会议记录链接及临时死注释已从当前树和本 PR 重写后的全部提交历史中清除。
  • 画布业务 prompt 契约测试已恢复,覆盖确认/取消、cancelled/pending 后的新调用、批量串行、窗口截断后重新引用和工具路由。
  • 纯附件拒绝、invalid-JSON 纠正、system prompt 分隔和 max_turns=3 保持正确。

剩余问题:

[P2] 请移除英文、空正文的 merge commit,并 rebase 到最新 master
当前 PR tip 81911ffbMerge remote-tracking branch 'origin/master' into fix/artagent-rerefine-prompt,正文为空,不符合仓库“中文标题 + 每项变更逐行正文”规则。其余 5 个功能提交已经是中文标题并有逐行正文,符合要求。审查期间 master 又从该 merge commit 的第二父节点 0386a5df 前移到 93ed7f2c(“将每日免费泥点纳入后台配置”)。请直接把这 5 个功能提交 rebase 到最新 master 后 force-push,不要再生成 merge commit;CI 重新全绿后即可批准。

验证:

  • platform-agent-harness:24/24
  • platform-editor-agent:23/23
  • api-server editor_agent:32/32
  • 前端面板 + hook:40/40
  • git diff --check:通过
  • 当前 CI:4/4 全绿、无冲突;临时 worktree 已清理。
复审结论:功能阻塞已全部清除,当前仅剩提交历史门禁,仍需一次小修。 已确认修复: - 匹配 pending 卡片时,引导用户点击确认/取消按钮;同时不再阻塞无关新调用。 - “并行”已改为“无依赖调用批量提交、runner 串行执行”。 - 内部飞书会议记录链接及临时死注释已从当前树和本 PR 重写后的全部提交历史中清除。 - 画布业务 prompt 契约测试已恢复,覆盖确认/取消、cancelled/pending 后的新调用、批量串行、窗口截断后重新引用和工具路由。 - 纯附件拒绝、invalid-JSON 纠正、system prompt 分隔和 `max_turns=3` 保持正确。 剩余问题: [P2] 请移除英文、空正文的 merge commit,并 rebase 到最新 master 当前 PR tip `81911ffb` 是 `Merge remote-tracking branch 'origin/master' into fix/artagent-rerefine-prompt`,正文为空,不符合仓库“中文标题 + 每项变更逐行正文”规则。其余 5 个功能提交已经是中文标题并有逐行正文,符合要求。审查期间 master 又从该 merge commit 的第二父节点 `0386a5df` 前移到 `93ed7f2c`(“将每日免费泥点纳入后台配置”)。请直接把这 5 个功能提交 rebase 到最新 master 后 force-push,不要再生成 merge commit;CI 重新全绿后即可批准。 验证: - `platform-agent-harness`:24/24 - `platform-editor-agent`:23/23 - `api-server editor_agent`:32/32 - 前端面板 + hook:40/40 - `git diff --check`:通过 - 当前 CI:4/4 全绿、无冲突;临时 worktree 已清理。
kdletters scheduled this pull request to auto merge when all checks succeed 2026-07-31 13:19:37 +08:00
kdletters approved these changes 2026-07-31 13:19:50 +08:00
Dismissed
kdletters added 1 commit 2026-07-31 13:20:15 +08:00
Merge branch 'master' into fix/artagent-rerefine-prompt
Project CI / Repository checks (pull_request) Successful in 1m0s
Project CI / Native shell tests (pull_request) Successful in 11m35s
Project CI / Frontend tests (pull_request) Successful in 2m54s
Project CI / Backend tests (pull_request) Successful in 3m33s
9951bc573b
kdletters dismissed kdletters's review 2026-07-31 13:20:15 +08:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

kdletters scheduled this pull request to auto merge when all checks succeed 2026-07-31 13:20:22 +08:00
kdletters approved these changes 2026-07-31 13:20:33 +08:00
kdletters merged commit 63e90ec779 into master 2026-07-31 13:36:12 +08:00
kdletters deleted branch fix/artagent-rerefine-prompt 2026-07-31 13:36:12 +08:00
Sign in to join this conversation.