Releases: james-6-23/codex2api
v1.5.0
🚀 v1.5.0 Release Notes
🔴 Bug 修复
#49 内存泄漏修复(高优先级)
容器运行一段时间后内存持续增长直至 OOM 的问题已修复,涉及三处泄漏源:
keyLocks sync.Map永不清理 —evictExpired()现在同步清理不再关联存活连接的 keyLocks 条目,RemoveConnection()同步删除response_cache缓存过大 — 条目上限从 10,000 降至 2,000,新增单条最大 200 items 截断,避免长对话历史吞噬内存- 内存 token 缓存惰性清理不足 —
MemoryTokenCache新增 60s 定时清理 goroutine,主动回收已过期 token 和锁
#43 Mac Codex 502 Bad Gateway(高优先级)
WebSocket 连接复用导致的 502 错误已修复:
- 复用缓存连接前发送 Ping 探活,死连接立即淘汰重建
- executor 发送失败后重试次数从 1 次增加到 2 次,每次间加指数退避(200ms × attempt)
#44 SQLite 异常
高并发下 SQLite 写入超时导致数据不更新的问题已缓解:
busy_timeout从 5,000ms 增加到 15,000msInsertAccountEventAsync超时从 5s 增至 10s,失败后最多重试 3 次(间隔递增)
#45 账号导入不进去(~130 个账号)
删除过的账号阻止重新导入的问题已修复:
GetAllRefreshTokens/GetAllAccessTokens查询增加WHERE status <> 'deleted'- 导入流程增加解析数量和去重结果的日志输出,便于排查
✨ 新功能
#46 OAuth 自动回调捕获
OAuth 登录不再需要手动复制粘贴回调 URL:
GET /auth/callback— 新增无鉴权回调端点,OpenAI 授权完成后自动 code → token 兑换 → 账号入库 → AT 刷新GET /api/admin/oauth/poll-callback— 前端轮询端点,返回waiting/processing/completed状态redirect_uri自动推导 — 不再硬编码localhost:1455,从请求 Host 自动推导,适配任意部署环境- 回调成功后展示简洁 HTML 结果页,用户可直接关闭窗口
账号状态重置
新增手动重置异常账号状态的能力:
POST /api/admin/accounts/:id/reset-status— 单个账号重置POST /api/admin/accounts/batch-reset-status— 批量重置,body:{"ids": [1,2,3]}- 前端每行操作栏新增 ↻ 重置状态按钮
- 批量选择后出现 批量重置按钮
- 测试连接成功(200)时仍自动恢复正常状态
📦 变更文件统计
13 files changed, 448 insertions(+), 32 deletions(-)
| 模块 | 文件 |
|---|---|
| 后端核心 | admin/handler.go, admin/oauth.go |
| 连接池 | proxy/wsrelay/manager.go, proxy/wsrelay/executor.go |
| 缓存 | proxy/response_cache.go, cache/memory.go |
| 数据库 | database/postgres.go, database/sqlite.go |
| 前端 | frontend/src/pages/Accounts.tsx, frontend/src/api.ts |
| 国际化 | frontend/src/locales/zh.json, frontend/src/locales/en.json |
| 测试 | proxy/wsrelay/manager_test.go |
🔄 升级说明
直接拉取最新镜像或代码即可,无需数据库迁移。SQLite 用户将自动受益于更长的 busy_timeout。
What's Changed
- feat(proxy): 增强 Codex 会话连续性与请求头一致性 by @DeliciousBuding in #41
Full Changelog: v1.4.0...v1.5.0
What's Changed
- feat(proxy): 增强 Codex 会话连续性与请求头一致性 by @DeliciousBuding in #41
Full Changelog: v1.4.0...v1.5.0
What's Changed
- feat(proxy): 增强 Codex 会话连续性与请求头一致性 by @DeliciousBuding in #41
Full Changelog: v1.4.0...v1.5.0
What's Changed
- feat(proxy): 增强 Codex 会话连续性与请求头一致性 by @DeliciousBuding in #41
Full Changelog: v1.4.0...v1.5.0
What's Changed
- feat(proxy): 增强 Codex 会话连续性与请求头一致性 by @DeliciousBuding in #41
Full Changelog: v1.4.0...v1.5.0
v1.4.0
🚀 v1.4.0 — 支持 Claude Code 通过 /v1/messages 使用 Codex 模型
这是一个重大版本更新,新增了完整的 Anthropic Messages API 兼容层,让 Claude Code 客户端可以无缝接入 Codex 模型。同时大幅增强了管理后台,新增使用文档、API Reference、模型映射配置等功能。
✨ 核心功能
/v1/messages 端点(Anthropic 兼容)
- 请求翻译:Anthropic Messages → Codex Responses,支持系统提示、多轮对话、工具调用(tool_use/tool_result)、thinking/reasoning
- 流式响应:Codex SSE 状态机实时翻译为 Anthropic SSE 格式(message_start → content_block_delta → message_stop)
- 非流式响应:缓冲所有事件后组装完整 Anthropic JSON 响应
- 认证兼容:同时支持
Authorization: Bearer、x-api-key、anthropic-auth-token三种认证方式 - 模型映射:Claude 模型名自动映射为 Codex 模型名(如
claude-opus-4-6→gpt-5.4),可在系统设置中自定义
路由兼容
- 所有端点同时注册
/v1/*和根路径/*,Codex CLI 的base_url带不带/v1都可正常使用
📖 管理后台新增
使用文档页面(Docs)
- Codex CLI 配置:完整的
config.toml+auth.json示例,macOS/Linux 和 Windows Tab 切换 - Claude Code 配置:环境变量和
settings.json两种方式,带复制按钮的代码块 - 认证方式说明、模型映射说明、curl 请求示例
- 所有 URL 自动使用当前服务地址
API Reference 页面
- 11 个端点完整文档:
/v1/responses、/v1/chat/completions、/v1/messages、/v1/models、/health、账号管理 6 个接口 - 每个端点:方法标签 + cURL 示例 + 多状态码响应示例(200/400/401/429 Tab 切换)
- 滑动导航栏:固定悬浮,点击跳转,IntersectionObserver 自动高亮
- Try it 测试面板:左右分栏,Authorization + Request Body 编辑器,API Key 下拉选择,实时发送请求查看响应
系统设置增强
- 模型映射编辑器:可视化增删改 Anthropic ↔ Codex 模型映射条目,预填 7 条默认映射
- API Key 显示优化:眼睛图标切换显示/隐藏完整密钥
使用统计增强
- 端点筛选添加
/v1/messages选项 - Claude 模型名后显示蓝色
→ gpt-5.4映射标签
🔧 Claude Code 快速接入
export ANTHROPIC_BASE_URL=http://your-server:8080
export ANTHROPIC_AUTH_TOKEN=YOUR_API_KEY或编辑 ~/.claude/settings.json:
{
"env": {
"ANTHROPIC_BASE_URL": "http://your-server:8080",
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY"
}
}📋 默认模型映射
| Anthropic 模型 | Codex 模型 |
|---|---|
| claude-opus-4-6 | gpt-5.4 |
| claude-haiku-4-5-20251001 | gpt-5.4-mini |
| claude-sonnet-4-6 | gpt-5.3-codex |
| claude-sonnet-4-5-20250929 | gpt-5.2-codex |
| claude-opus-4-5-20251101 | gpt-5.3-codex |
映射可在管理后台「系统设置 → 模型映射」中自定义修改。
Full Changelog: v1.3.3...v1.4.0
v1.3.3
新功能
- 账号锁定保护 (#38) — 锁定重要账号,自动清理时跳过。RT 刷新后自动锁定 free 以上套餐账号(pro/plus/team 等)。支持单个/批量锁定解锁、已锁定筛选标签
- 系统时区选择 — 系统设置新增时区下拉,支持 23 个常用时区,存储在浏览器本地
- 文件夹导入 — 导入弹窗新增"选择文件夹"选项,递归扫描 .txt/.json 文件。拖放区域也支持拖入文件夹
- 限流/封禁冷却倒计时 — 账号状态旁显示冷却剩余时间
- JSON 导入 AT 兼容 — JSON 导入无 refresh_token 时回退 access_token
优化
- JSON 序列化全链路优化 — 移植 CLIProxyAPI 架构模式,提升代理性能
- 快速调度器 Rebuild 优化 — 批量插入后统一排序,修复大号池启动卡死
- 批量过期清理 + 非阻塞启动 — 支持 xhigh 推理强度
- 主题切换动画 — 改为 View Transition 圆形扩散动画
修复
- 时间字段迁移为 TIMESTAMPTZ,修复导入时间显示偏差
- plus/teamplus 计划也显示 5h 用量窗口
- tools 超过 128 个时静默截断,不再拒绝请求
- 账号增删趋势图只统计用户操作,排除系统自动清理事件
- Free 账号用量 ≥100% 时标记为不可用
- HTTP/HTTPS 代理在 UTLS 传输层失效的问题
- 401 重试优先换新账号 + 立即清理封禁账号
- usage_exhausted 状态显示改为限流中样式
Full Changelog: v1.3.2...v1.3.3
v1.3.2
Full Changelog: v1.3.1...v1.3.2
v1.3.1
Full Changelog: v1.2.2...v1.3.1
v1.4.0
🐛 Bug Fixes
调度器:用量耗尽账号不再参与调度
- Free 账号 7d 用量 ≥ 100% 时标记为
usage_exhausted,前端显示"用量耗尽"(橙色标签) - 调度器完全跳过这些账号,不再触发无意义的 429
- 批量测试 / 用量探针返回 200 时检查用量数据,≥ 100% 不重置状态
仪表盘:账号增删趋势图修正
- 趋势图"删除账号"仅统计用户手动删除,排除系统自动清理(auto_clean / clean_full_usage / clean_expired)产生的虚假数据
代理:tools 数量超限不再报错 (#29)
- 上游 Codex API 限制 tools 最多 128 个,之前直接返回 400 拒绝
- 现在在转发前静默截断到 128 个,兼容 OpenCode 等发送大量工具定义的客户端
Full Changelog: v1.3.0...v1.2.2
v1.3.0
🚀 性能优化
本版本对 JSON 序列化和流式处理链路进行全面优化,移植 CLIProxyAPI 二开版的架构模式,消除热路径上的冗余序列化操作。
🙏 致谢
本次优化的核心思路源自 CassiopeiaCode/CLIProxyAPI 项目,包括 Unmarshal→map→Marshal 序列化模式、LRU 请求解析缓存、struct 化 chunk 构建等关键设计。感谢 CPA 二开项目提供的优秀架构参考!
✨ 核心改进
请求翻译层
TranslateRequest重写为 Unmarshal→map→Marshal 模式(~100 次 sjson → 1 次 Marshal)- 新增 256 条目 LRU 请求解析缓存(SHA256 key),重试场景直接命中缓存
PrepareResponsesBody统一 Responses API 路径(14+ 次 sjson → 1 次 Marshal)handler.go彻底移除 sjson 依赖
响应翻译层
- 所有 chunk builder 改为 struct 化单次 json.Marshal(每帧 ~8 次 sjson → 1 次)
StreamTranslator内置 Created 时间戳,消除 handler 后处理开销- 新增
BuildCompactResponse替代内联 sjson 构建(~15 次 → 1 次) extractUsageFromResult变体避免重复解析已解析的 JSON
SSE 流处理
- 4 处 SSE 回调改为 一次
gjson.ParseBytes复用 Result(每事件 3-5 次扫描 → 1 次) - SSE 读取缓冲区 8KB → 64KB,适配 reasoning 模型的大 thinking block
- 新增
sseLineBufPool行缓冲池化 + 自动缩容,降低 GC 压力
连接层
utls_transport连接等待改为循环重试模式,修复虚假唤醒(spurious wakeup)风险
📊 性能收益一览
| 热路径 | 优化前 | 优化后 |
|---|---|---|
| Chat 请求翻译 | ~100 次 sjson | 1 次 Marshal + LRU 缓存 |
| Responses 请求准备 | ~30 次 sjson/gjson | 1 次 Unmarshal + 1 次 Marshal |
| SSE chunk 构建(每帧) | ~8 次 sjson + 后处理 | 1 次 struct Marshal |
| SSE 事件解析(每帧) | 3-5 次 gjson.GetBytes | 1 次 ParseBytes |
| 非流式响应构建 | ~15 次 sjson | 1 次 struct Marshal |
| SSE 读缓冲区 | 8KB,lineBuf 无池化 | 64KB + 池化 + 自动缩容 |
📁 变更文件
proxy/translator.go— 翻译层全面重写(结构体定义、LRU 缓存、Unmarshal→Marshal)proxy/handler.go— 移除 sjson 依赖,SSE 回调 gjson 去重,PrepareResponsesBodyproxy/executor.go— SSE 缓冲区扩容、lineBuf 池化与缩容proxy/utls_transport.go— 连接等待循环修复proxy/translator_test.go— 适配 NewStreamTranslator 签名变更
Full Changelog: v1.2.1...v1.3.0
v1.2.1
🐛 修复
- 账号列表请求统计显示 0/0 —
GetAccountRequestCounts全表聚合共享 5s 超时被挤占导致静默失败,现独立 15s 超时 + 错误日志记录 - HTTP/HTTPS 代理在 UTLS 传输层完全失效 — 修复代理连接问题
⚡ 优化
- 新增
idx_usage_logs_account_status(account_id, status_code)复合索引,提升请求统计聚合性能 - JSON 导入支持 AT 兼容路径,无
refresh_token时自动回退access_token
📖 文档
- 补全 Token 上传接口和管理 API 文档(Closes #28)
- 新增
POST /api/admin/accounts/at(AT-only 账号添加)完整文档 - 补充导入接口
at_txt格式及去重边界说明 - 重写 OAuth 接口文档(PKCE 流程、完整请求/响应格式)
api/README.md添加全部 35 个管理 API 端点速查表
- 新增
- README 和 API 文档添加 RT 添加、AT 添加、文件批量导入的 curl 示例
完整变更: v1.2.0...v1.2.1
Full Changelog: v1.1.9...v1.2.1
v1.1.9
新增
- 主题切换圆形扩散动画 — 使用 View Transition API + clip-path,从点击位置向外扩散切换主题(500ms),不支持的浏览器自动降级
Full Changelog: v1.1.8...v1.1.9
v1.1.8
修复
- reasoning_effort 验证放开 —
reasoning_effort(Chat Completions)和reasoning.effort(Responses API)不再限制枚举值,由翻译层clampReasoningEffort统一处理,避免客户端传入新值时被拦截
新增
- 运维面板显示进程内存 — 系统运维内存卡片新增本进程内存占用显示(
runtime.MemStats.Sys),格式:使用 X GB / Y GB · 本进程 Z MB
Full Changelog: v1.1.7...v1.1.8