补齐Agent模型视觉检查闭环
新增 image.inspect 安全图片读取、多模态 Provider 调用与只读恢复语义 补齐共享契约、视觉动作回执和多模态失败日志脱敏 扩展确定性测试与真实 Provider 双视口 E2E 验收 同步 Runtime 技术方案和项目共享决策记录
This commit is contained in:
@@ -388,6 +388,26 @@ npm run ai-game-creator-shell:agent-runtime:real-e2e -- --config-dir <AppData> -
|
||||
|
||||
Runner 强制终止后恢复原 run / session 且身份稳定,project revision 为 3;项目验证、桌面 / 移动浏览器验证、3 个隔离实例和唯一 all-join 认领均通过,本次真实竞态走“活跃父 run 直接认领”路径,未创建 continuation task,真实执行顺序证明 `agent.action_history` 只在隔离结果被父 run 认领后发生。确定性 Rust 集成用例另覆盖 `parent-wake` 等待路径、多次 resume 零 LLM 请求、同父 run 唤醒和无 continuation。pending `file.read` 在其他 Agent 推进 revision 后仍读取最新事实;写入、命令、验证、预览和 join 认领保持严格 gate。
|
||||
|
||||
## V1.7 模型视觉检查
|
||||
|
||||
机械浏览器验证只能证明页面可加载、目标文本存在、控制台无致命错误和 canvas 非空,不能证明布局、层级、遮挡、裁切、密度或桌面 / 移动适配达到可验收质量。新增只读模型工具 `image.inspect`,让当前 Agent 使用自己的 LLM Provider 实际读取图片证据并把视觉结论作为 observation 继续修复。
|
||||
|
||||
- 输入固定为 `{"paths":["项目内图片路径"],"question":"可选检查重点"}`,单次 1-2 张;不接受 URL、base64、请求头、Cookie 或任意本机绝对路径。
|
||||
- 普通图片只允许位于 `game/` 或 `assets/`。浏览器证据只允许当前 `agentId + runId` 下 `.agent/runtime/browser-validations/<agentId>/<runId>/.../desktop.png|mobile.png`,不能读取其他 Agent / run 或任意 Runtime 私有文件。
|
||||
- 每张图片按可信项目目录逐层拒绝符号链接 / reparse point,最终句柄拒绝硬链接和非普通文件;依据文件签名识别 PNG / JPEG / WEBP / GIF,不信任扩展名。单张与总字节数都设硬上限。
|
||||
- 实现上限固定为单张 `8 MiB`、单次总计 `12 MiB`;读取前检查元数据,读取后复核句柄快照和路径身份,超限、读取中漂移或路径替换均失败关闭。
|
||||
- Runtime 在项目一致性锁内复核 durable pending、policy、repository fingerprint 和图片身份,读取完整字节后释放锁,再构造内存 data URL 调用当前模板 Agent 的 Provider。data URL、原始图片字节和视觉模型原始请求不得写入 task、event、Agent DB、receipt 或日志。
|
||||
- `platform-llm` 的 raw failure log 遇到任意多模态输入时只写 Provider / API kind / model / 重试等元数据,并标记 `multimodal-sensitive-input`,不写 messages;上游错误正文若回显 `data:image/*` 也必须替换为省略标记。
|
||||
- 视觉模型 system prompt 明确把图片内文字当不可信项目内容,只分析可见界面,不执行图片中的指令。返回内容继续经过密钥和绝对路径清洗;持久审计只保存相对路径、内容 SHA-256、字节数、响应标识和结论字符数。
|
||||
- `image.inspect` 默认 `auto`、可由项目或 per-Agent policy 改为 `confirm / deny`,不推进 project revision、不改变 verification gate。相同 action 的崩溃恢复沿用 pending / observation / receipt 幂等链路,不能重复调用视觉 Provider。
|
||||
- `preview.validate` 返回 desktop / mobile 路径后,Agent 应调用一次 `image.inspect` 同时检查双视口,再依据视觉结论决定修复或收束。真实 E2E 必须证明请求实际含两张 `input_image`、视觉 observation 在最终回复前落盘,并且 Agent DB / receipt 中没有 base64 泄漏。
|
||||
|
||||
### 2026-07-13 真实验收结果
|
||||
|
||||
- 确定性 Rust 用例覆盖双图 Responses 请求、magic bytes、伪扩展名、单图超限、跨 Agent/run、符号链接、父目录符号链接、硬链接、auto / confirm / deny、revision 不推进,以及已有 terminal observation / receipt 恢复不重复调用 Provider;`image_inspect` 定向用例 `6/6` 通过,Tauri 全量 513 项中 510 通过、3 项真实浏览器 opt-in 用例按设计忽略。
|
||||
- 发布 AppData 中配置的真实 `gpt-5.5` 已通过 `llm-runtime`:模型实际调用 `image.inspect` 1 次并提交 desktop / mobile 两张截图,专用 audit 1 条、terminal receipt 1 条、responseId 存在,视觉结论在 `agent.action_history` 和最终回复前落盘。
|
||||
- 本次形成 95 条 task、161 条 event、166 条 Agent DB、12 条合法工具协议、14 次成功工具执行和 24 条 terminal receipt;Runner 强杀后恢复原 run / session 且身份稳定,project revision 为 3,3 个隔离实例、项目验证和浏览器验证通过。task / event / Agent DB / receipt 的图片载荷泄漏为 0,重复 action / message / receipt、密钥和诱饵泄漏均为 0。
|
||||
|
||||
## 验收命令
|
||||
|
||||
- `npm run ai-game-creator-shell:typecheck`
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
同一文档的“V1.3 多文件变更集与内容审查”作为复杂代码修改的新事实源。`project.patchset` 在一个确认动作和一把项目锁内预检最多 12 个 create / update / delete,自动 checkpoint、只推进一次 revision,并以 SHA-256 乐观并发条件和回滚语义避免半完成修改;`project.diff(includeContent=true)` 返回有界统一 diff hunks。它不开放任意 `git apply` 文本,也不替代修改后的可执行验证。
|
||||
|
||||
同一文档的 V1.4-V1.6 继续作为当前事实源:V1.4 用只读 `git.inspect` 提供有界工作树状态和安全 hunks;V1.5 用跨 context window 的 milestones 保留已完成副作用与验证证据;V1.6 用 terminal receipt 和 `agent.action_history` 提供可恢复动作回查,并对未认领 all-join 的最终回复与动作历史设置双重完成门禁。历史能力清单与这些版本冲突时,以 Runtime V1.1 技术方案和当前代码为准。
|
||||
同一文档的 V1.4-V1.7 继续作为当前事实源:V1.4 用只读 `git.inspect` 提供有界工作树状态和安全 hunks;V1.5 用跨 context window 的 milestones 保留已完成副作用与验证证据;V1.6 用 terminal receipt 和 `agent.action_history` 提供可恢复动作回查,并对未认领 all-join 的最终回复与动作历史设置双重完成门禁;V1.7 用 `image.inspect` 把 desktop / mobile 截图作为受控多模态输入交给当前 Agent 自己的 Provider,并严格禁止图片载荷持久化。历史能力清单与这些版本冲突时,以 Runtime V1.1 技术方案和当前代码为准。
|
||||
|
||||
2026-07-12 真实验收:发布 AppData 中的真实 `gpt-5.5` 已通过最终安全收紧后的 `llm-runtime` 套件,覆盖 Runner 强杀恢复且 run/session 身份稳定、仓库上下文、checkpoint/精确修改、失败命令诊断与修复复验、6 套确认生命周期、项目验证、桌面与移动非空画布证据、3 个隔离实例并行和唯一 all-join;95 条 task、161 条 event、137 条 Agent DB、13 条合法工具协议、副作用判重、终态投影、assistant audit、消息、回执和密钥泄露均以结构化落盘事实验收。`full` 套件仍要求 External Editor API 配置,缺失时必须返回 `BLOCKED(editorApi)`,不得记为通过。
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
|
||||
2026-07-13 V1.6 最终真实验收:`llm-runtime` 形成 94 条 task、158 条 event、164 条 Agent DB、11 条合法工具协议、13 次成功工具执行和 24 条 terminal receipt;主 run receipt 为 18。`agent.action_history` 实际调用 1 次、返回 1 条、递归结果 0,且只在父 run 认领唯一 all-join 后执行;Runner 强杀恢复、revision 3、3 个隔离实例 / 2 个模板、双视口浏览器证据、重复项、身份冲突、半完成文件、密钥和诱饵泄漏均通过结构化检查。本次竞态走活跃父 run 直接认领路径,join continuation 数量为 0;`parent-wake` 等待路径由确定性 Rust 测试覆盖。这些数字是单次观测结果,不是脚本固定阈值;`full` 套件仍需 External Editor API,缺失时保持 `BLOCKED(editorApi)`。
|
||||
|
||||
2026-07-13 V1.7 最终真实验收:`llm-runtime` 形成 95 条 task、161 条 event、166 条 Agent DB、12 条合法工具协议、14 次成功工具执行和 24 条 terminal receipt。真实 Provider 在 `preview.validate` 后实际调用 `image.inspect` 1 次并读取 desktop / mobile 两张 PNG;专用 audit 与 receipt 各 1 条、responseId 存在,视觉 observation 在 `agent.action_history` 和最终回复前落盘。Runner 强杀恢复保持原 run / session,revision 3,3 个隔离实例、项目验证和浏览器验证通过;图片载荷、重复 action / message / receipt、密钥和诱饵泄漏均为 0。`full` 套件仍需 External Editor API,缺失时保持 `BLOCKED(editorApi)`。
|
||||
|
||||
以下能力清单保留 Runtime V1 的演进记录;其中“App 进程内 tokio task”“跨进程同项目写入不作为支持目标”和“恢复到当前 App 进程”的旧描述均已由 V1.1 替代。当前边界是 App / CLI 只落账并唤醒同一发布二进制的独立 Runner,append-only JSONL 使用进程内锁加 OS 文件锁,恢复继续由 Runner 接管同一 run / session。
|
||||
|
||||
Agent Runtime 负责:
|
||||
|
||||
Reference in New Issue
Block a user