Codex 反代网关:分组筛选支持未分组/屏蔽分组、spark 模型生图工具注入修复、缺失 type 的工具定义兼容、usage log 写入失败重试与热路径性能优化
Features
- 分组筛选支持「未分组」与「屏蔽分组」(#229):账号页的分组筛选从单选下拉升级为三态筛选面板——每个分组可在「只看 → 屏蔽 → 取消」间切换,并新增「未分组」快捷项。账号较多时可以快速找出未分组或不属于某些分组的账号,全选后批量分组。表格视图的分组列改为默认显示。
Fixes
gpt-5.3-codex-spark不再被注入默认生图工具(#230):Responses 转换层此前会给普通文本请求自动注入 hostedimage_generation工具及桥接 instructions,而 spark 是纯文本模型,上游直接拒绝带 hosted 生图工具的请求,导致 HTTP 上游路径下 spark 文本请求必然失败。现在对 spark 跳过默认注入,用户显式自带的生图工具仍正常保留。- 缺失
type字段的工具定义不再导致请求失败(#219):部分客户端发送的工具定义省略type(或为null),此前被原样转发,上游对整个请求返回 400Unsupported tool type: None。现在 Chat Completions 与 Responses 两条路径都会按 OpenAI SDK 惯例将 function 形态的工具(嵌套function对象或顶层name)补全为type:"function";完全无法识别形态的工具被剔除而不是拖垮整个请求。 - usage log 写入失败回队列重试(#233):批量写入失败的 usage log 不再直接丢弃,而是放回缓冲区前部等待下轮 flush 重试;SQLite 与 PostgreSQL 均将日志插入与 API Key 配额更新放入同一事务,任一失败整体回滚,保证用量统计与配额数据一致。
- 降低 Redis token 刷新等待的 timer 分配(#231):
WaitForRefreshComplete改用可复用的 ticker + 超时 timer,替代每 200ms 轮询新建一个 timer(30 秒超时下最多约 150 个),减少刷新竞争场景下的堆分配与 GC 压力。
Performance
- 请求体单次读取复用(#232):
RequestSizeLimiter读取并校验请求体后直接缓存,后续中间件与所有 JSON 代理入口(responses / compact / chat completions / messages / images)复用缓存,热路径上最多减少约 2/3 的请求体重复 buffer 分配,降低大请求与高并发场景的内存峰值与 GC 压力。
Contributors
感谢以下贡献者对本版本的贡献:
- @huangye123 — usage log 写入失败回队列重试(#233)、请求体单次读取复用(#232)、Redis 刷新等待 timer 优化(#231)三个 PR
- @sailstudio — 报告 spark 模型生图工具注入问题并提供详细分析与修复方案(#230)
- @WEP-56 — 提出分组筛选「屏蔽分组」的功能建议(#229)
- @oneadms — 报告工具 type 缺失导致的
Unsupported tool type: None问题(#219)
Installation
Docker
docker pull ghcr.io/james-6-23/codex2api:2.3.2
# or
docker pull ghcr.io/james-6-23/codex2api:latestManual Downloads
见下方 Assets,提供 Linux / macOS / Windows 的 amd64 与 arm64 预编译产物及 SHA256SUMS。
Full Changelog: v2.3.1...v2.3.2