Skip to content

feat(prism): bridge 6.1 Sol client tools and Responses events - #278

Merged
ranxi2001 merged 4 commits into
productionfrom
feat/prism-sol61-tools
Oct 2, 2026
Merged

ranxi2001 merged 4 commits into
productionfrom
feat/prism-sol61-tools

Conversation

@ranxi2001

@ranxi2001 ranxi2001 commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

问题与行为变化

在已开启 Prism 的 OAuth 账号上,gpt-6.1-sol 文本已经可用,但客户端携带 tools、additional_tools 或工具结果时适配器仍返回 422;Go 网关也只接受文本终态。这个 PR 同时补充客户端工具桥和 Responses 工具事件校验,使工具仍由客户端在其权限系统下执行。

  • 适配 function、custom、嵌套 namespace、两种 additional_tools 入口和完整历史中的 call/result。
  • 模型通过带本轮标记的受控文本协议请求客户端工具。校验全部完成后才生成 function_call/custom_tool_call;不猜测或自动包装裸 shell,不在网关执行代码,也不把上游沙箱操作当作客户端执行结果。
  • 校验 function JSON Schema 与 custom text/regex/Lark;拒绝外部引用、未知/重复调用、非法参数、格式不匹配和不完整工具结果。校验子进程有时间、CPU、大小和 Linux 地址空间上限。
  • 调用绑定已认证 API Key、账号、会话。结果占用与已消费状态持久化,未知结局重启后也不会被重放;数据库只保存摘要与身份,不保存参数、结果正文或 OAuth 凭据。
  • SSE 输出已验证的 item/arguments/input done 事件,Go 网关核对事件、终态与本次客户端工具目录一致。usage 保持 null。

默认关闭,服务端 PRISM_ADAPTER_CLIENT_TOOLS_ENABLED=true 后试用;本轮工具模型固定 gpt-6.1-sol。其他三个模型保留原文本路径。必须同时升级 Go 网关与适配器,不要求用户修改 Codex 请求或增加私有头。

关联与来源

Refs #256,承接已合并 #269。从 owner production 开发,已整合最新 production 的 Key 撤销与删除后结算修复;保留原提交。

参考 issue #256 的工具权限、start/status、turn_state 和未知结局不可重放结论。对照官方 Responses function/custom/namespace 协议独立实现;未复制没有明确许可证的 oai-prism 源码,未复用其裸 shell 自动包装路径。

验收与边界

  1. 开启服务端试用开关,以原有 API Key 和标准会话身份请求 6.1 Sol。
  2. 声明 function/custom,接收工具事件,由客户端执行合成工具后回传对应 call_id;至少两轮后得到最终文本。
  3. 修改参数、换 Key/账号/会话、重复结果、并发提交同一个结果、未知状态重启,均应在再次提交模型前拒绝。
  4. 普通文本、四模型原名、effort 校验、并发 journal 和未知 usage 不回归。

工具回合保留同一客户端会话的锁和 pending 作用域,但每次使用新的 Prism 空白项目,避免原生复用页面第三轮无法就绪。本轮采用完整历史续接;不支持 previous_response_id、工具图片结果、主动终止上游生成、未知回合自动恢复、持久化完整会话或 WebSocket。响应仍缓冲到上游终态,不宣称逐 token 流或实时心跳。Hosted 工具不能由本桥执行:有客户端工具时,在提示和响应 metadata 明确列出不可用类型;只有 hosted 工具或强制选择它们时拒绝。

实际验证

检查 结果与边界
Python 3.12 / Playwright 1.63.0 单元测试 62 项通过;schema/grammar、命名空间、强制工具、原样 custom input、调用方隔离、结果占用、重启、竞争续接、HTTP/SSE 三回合均覆盖。
smoke_client_tools.py Mac 实际 Chromium + HTTP + 本地模拟 Prism:3 次 start、3 个独立项目,1 个 function call、1 个 custom call、最终文本完成,pending=0;不是实际模型推理。
Go service 定向测试 TestPrismBrowser / TestPrismClientTool / TestPrismCaller / TestAccountUsesPrism 通过,覆盖凭据边界、调用方头不可伪造、命名空间、工具终态、SSE 参数与 item 冲突。
同组 Go race 测试 通过。初次普通测试遇到共享 Go cache 文件缺失,改用独立 GOCACHE 后通过;未在服务器编译。
真实 6.1 Sol 工具往返 候选工具层经生产已有文本适配器完成 function → 客户端随机结果 → custom → 客户端确认结果 → final 三轮;34.896/28.203/27.866 秒,每轮 start_count=1,pending=0。未替换生产 Go 主程序、未打开对用户的工具开关;v1/v2 第三轮 waiting_editor 失败,修正版以每轮空白项目解决。详见运维仓库试用记录。
当前 head CI 4376ef590 的 push/PR 两组完整 CI 均通过:16 项 SUCCESS、2 项 CLA SKIPPED,无失败或待运行检查;此前 66991304c 修复两处 errcheck。

真实 Codex CLI 0.156.1 也已通过本地模拟上游的 function/custom 工具事件与客户端执行闭环,CLI 无需改代码;这不等于完整生产 Go 通道已经上线。

配置、资源与回滚

  • 适配器新增固定版本 jsonschema 4.26.0、Lark 1.3.1,依赖仅使用预构建 wheel。
  • 新增 tools/v1.sqlite3,0600、父目录0700;不修改 PostgreSQL schema。记录上限50000,未知占用不会自动删除。
  • 每次最多96个工具、8个调用、完整历史最多64个调用;准备和浏览器资源继续使用原有并发限制。
  • Go 仅向数字回环适配器传入网关派生的 X-Prism-Caller-ID,外部同名头不参与计算。原 OAuth 出口隔离、禁止重定向保持。
  • 未替换生产主二进制,也未改变线上工具开关。候选 Python 工具层在独立的 96 MiB 限额进程中复用已有 Prism 文本适配器完成真实后端测试;正式部署前需要固定源码构建的 Go 二进制与匹配适配器,生产机不得编译。
  • 回滚时关闭工具开关并保留 tool DB / pending;有未知续接时不能删除状态后重试。

文档

prism-adapter/README.md 记录试用开关、协议语义、资源上限、数据保存及未支持范围。本 PR 不新增 UI 组件。

Agent 使用声明

  • Agent:Codex;源码调研、实现、测试和 PR 文档;未使用子 Agent。
  • 模型:GPT-6;更具体模型 ID 未提供。
  • 推理强度:未知,未提供配置值。

@ranxi2001
ranxi2001 marked this pull request as ready for review October 2, 2026 15:17
@ranxi2001
ranxi2001 merged commit 87bc36c into production Oct 2, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant