codex-proxy / CHANGELOG.md
icebear
feat: dashboard login gate for public deployments (#148)
91ee702 unverified
|
raw
history blame
29.6 kB

Changelog

本项目的所有重要变更都将记录在此文件中。

格式基于 Keep a Changelog

[Unreleased]

Fixed

  • 模型列表启动时不更新:token 刷新与 model fetch 存在竞态,初始 fetch 跳过后直接等 1 小时
    • model-fetcher 改为 fast-retry(10s 间隔,最多 12 次),账号就绪后立即拉取
    • config/models.yaml 补回 gpt-5.4/5.4-mini/5.3-codex(3/18 后端已恢复)

Added

  • Dashboard 登录门(#141):当 proxy_api_key 已配置且请求来自非 localhost 时,需输入密码才能访问控制台
    • Cookie-based session,TTL 由 session.ttl_minutes 控制(默认 60 分钟)
    • POST /auth/dashboard-loginPOST /auth/dashboard-logoutGET /auth/dashboard-status 端点
    • API 路由(/v1/*)不受影响,Electron(localhost)自动跳过
    • 简单防暴力:同 IP 5 次/60s 限制
    • HTTPS 自动检测:反代 X-Forwarded-Proto: https 时 cookie 加 Secure flag
    • 远程 session 禁止清空 proxy_api_key(防止误操作导致登录门失效)
    • Header 显示条件性退出按钮
  • 账号封禁检测:上游返回非 Cloudflare 的 403 时自动标记为 banned 状态
    • Dashboard 卡片/表格显示玫红色 Banned/已封禁 状态徽章
    • 状态筛选下拉新增 Banned 选项
    • 被封账号自动跳过(acquire() 仅选 active),请求时自动切换到其他账号
    • 后台额度刷新周期性重试 banned 账号,成功即自动解封
  • 上游 401 token 吊销("token has been invalidated")自动标记过期并切换下一个账号
    • 之前 401 直接透传给客户端,不标记也不重试
  • Usage Stats 页面(#/usage-stats):累计 token 用量汇总 + 时间趋势图
    • 后台每 5 分钟记录用量快照,保留 7 天历史
    • GET /admin/usage-stats/summary 实时累计汇总
    • GET /admin/usage-stats/history?granularity=hourly|daily&hours=N 时间序列增量
    • 纯 SVG 折线图(input/output tokens + 请求数),无外部图表库
    • 支持按小时/按天粒度,24h/3d/7d 时间范围切换
  • Account Management 页面(#/account-management):批量删除、批量改状态(active/disabled)、导入导出
    • POST /auth/accounts/batch-deletePOST /auth/accounts/batch-status 批量端点
    • 状态摘要条可点击筛选,复用 AccountTable 选择/分页/Shift 多选

Fixed

  • 运行时缓存(模型目录同步、版本检测结果)直接写入 git 跟踪的 config/ 文件,导致仓库频繁变脏

    • model-storesyncStaticModels() 改写 data/models-cache.yaml(gitignored)
    • update-checkerapplyVersionUpdate() 改写 data/version-state.json(gitignored)
    • config/ 目录现在对运行时操作只读,仅 admin API 设置变更例外
  • Responses SSE 新事件(response.output_item.added with item.type=messageresponse.content_part.added/done)未被识别,导致 [CodexEvents] Unknown event 日志刷屏

  • 新模型(如 gpt-5.4-mini)无法被动态发现的问题

    • 移除 isCodexCompatibleId() 白名单过滤,信任后端 /codex/models 返回
  • 同一 Team 的多个账号因共享 chatgpt_account_id 只能添加一个的问题(#126)

    • 去重逻辑改为 accountId + userId 组合键,Team 成员各自保留独立条目
    • AccountEntry 新增 userId 字段,持久化层自动回填
  • 额度耗尽账号仍显示「活跃」并接收请求的问题(#115)

    • markQuotaExhausted() 现在可以覆盖 rate_limited 状态(仅延长,不缩短 reset 时间)
    • 后台额度刷新现在同时检查 rate_limited 账号,防止因 429 短暂 backoff 导致漏检
  • /v1/responses 不再强制要求 instructions 字段,未传时默认空字符串(#71)

    • 修复 Cherry 等第三方客户端不传 instructions 时返回 400 的兼容性问题
  • CI 构建修复:WebSocket 传输 instructions 类型不匹配(TS2322)导致 Electron/Docker 编译失败

  • shared/i18n/translations.ts 移除中英文重复 selectAll key(Vite 警告)

  • sync-changelog.yml 推送步骤加 rebase 重试(解决与 bump-electron 并行推送竞态)

Changed

  • 架构重构:降低模块耦合、改善可测试性
    • 提取 codex-types.ts:API 类型定义与类实现分离,20+ 文件只需类型不需类
    • 提取 rotation-strategy.ts:轮换策略从 AccountPool 解耦为纯函数模块(10 新测试)
    • 拆分 web.ts(605 LOC)→ routes/admin/(health/update/connection/settings 4 子路由)
    • 提取 account-persistence.ts:文件系统持久化逻辑从 AccountPool 分离为可注入接口(8 新测试)
    • 拆分 codex-api.ts:SSE 解析(codex-sse.ts)、用量查询(codex-usage.ts)、模型发现(codex-models.ts)独立为纯函数模块(10 新测试)
    • 所有提取模块通过 re-export 保持现有 import 路径兼容

Added

  • Sticky rotation strategy(#107):新增 sticky 账号轮换策略,持续使用同一账号直到限速或额度耗尽
    • src/config.tsrotation_strategy 枚举新增 "sticky" 选项
    • selectByStrategy()last_used 降序排列,优先复用最近使用的账号
    • GET/POST /admin/rotation-settings 端点:读取和更新轮换策略(支持 Bearer auth)
    • Dashboard:RotationSettings 组件(粘滞 vs 轮换两层 radio group)
    • i18n:中英文翻译(策略名称 + 描述)
    • 13 个新测试覆盖 sticky 选择逻辑 + 路由端点
  • POST /admin/refresh-models 端点:手动触发模型列表刷新,解决 model-fetcher ~1h 缓存过时导致新模型不可用的问题;支持 Bearer auth(当配置 proxy_api_key 时)
  • Plan routing integration tests:通过 proxy handler 完整路径验证 free/team 账号的模型路由(7 cases),覆盖 plan map 更新后请求解除阻塞的场景

Changed

  • Electron 桌面端从独立分支迁移为 npm workspace(packages/electron/),消除 master→electron 分支同步冲突;删除 sync-electron.yml,release.yml 改为 workspace 感知构建
  • scripts/setup-curl.ts:加入 GITHUB_TOKEN 认证避免 CI rate limit;Windows DLL 名适配 v1.5+(libcurl-impersonate.dll);tar 解压 bsdtar/GNU tar 自动 fallback

Added

  • Dashboard 额度设置面板:可在 Web UI 直接调整额度刷新间隔、主/次预警阈值、自动跳过耗尽账号开关,无需手动编辑 YAML;API GET/POST /admin/quota-settings 支持鉴权 (#92)

Fixed

  • 删除账号后额度预警横幅未清除:DELETE /auth/accounts/:id 漏调 clearWarnings(),导致已删除账号的 quota warning 残留在前端 (#100)
  • macOS Electron 桌面版登录报 spawn Unknown system error -86:CI 在 arm64 runner 上同时构建 arm64/x64 DMG,但只下载 arm64 的 curl-impersonate,导致 Intel Mac 用户 spawn 失败(EBADARCH);拆分为 per-arch 构建 + setup-curl.ts 支持 --arch 交叉下载;错误提示改为明确的架构不匹配诊断 (#96)
  • 默认关闭 desktop context 注入:之前每次请求注入 ~1500 token 的 Codex Desktop 系统提示,导致 prompt_tokens 虚高;新增 model.inject_desktop_context 配置项(默认 false),需要时可手动开启 (#95)

Added

  • 额度自动刷新 + 分层预警:后台每 5 分钟(可配置)定时拉取所有账号的官方额度,缓存到 AccountEntry 供 Dashboard 即时读取;额度达到阈值(默认 80%/90%,可自定义)时显示 warning/critical 横幅;额度耗尽的账号自动标记为 rate_limited 跳过分配,到期自动恢复 (#92)

  • Docker 镜像自动发布:push master 自动构建多架构(amd64/arm64)镜像到 GHCR(ghcr.io/icebear0828/codex-proxy),docker-compose.yml 切换为预构建镜像,支持 Watchtower 自动更新

  • 双窗口配额显示:Dashboard 账号卡片同时展示主窗口(小时限制)和次窗口(周限制)的用量百分比、进度条和重置时间,后端 secondary_window 不再被忽略

  • 更新弹窗 + 自动重启:点击"有可用更新"弹出 Modal 显示 changelog,一键更新后服务器自动重启、前端自动刷新,零人工干预(git 模式 spawn 新进程、Docker/Electron 显示对应操作指引)

  • Model-aware 多计划账号路由:不同 plan(free/plus/business)的账号自动路由到各自支持的模型,business 账号可继续使用 gpt-5.4 等高端模型 (#57)

  • Structured Outputs 支持:/v1/chat/completions 支持 response_formatjson_object / json_schema),Gemini 端点支持 responseMimeType + responseSchema,自动翻译为 Codex Responses API 的 text.format/v1/responses 直通 text 字段

  • 模型列表自动同步:后端动态 fetch 成功后自动回写 config/models.yaml,静态配置不再滞后;前端每 60s 轮询模型列表,新模型无需刷新页面即可选择

  • Tuple Schema 支持:prefixItems(JSON Schema 2020-12 tuple)自动转换为等价 object schema 发给上游,响应侧还原为数组;OpenAI / Gemini / Responses 三端点统一支持

  • WebSocket 传输 + previous_response_id 多轮支持:/v1/responses 端点自动通过 WebSocket 连接上游,服务端持久化 response,客户端可通过 previous_response_id 引用前轮对话实现增量多轮;WebSocket 失败自动降级回 HTTP SSE (#83)

  • 账号批量导入导出:Dashboard 支持导出全部账号到 JSON 文件(含 token,用于备份/迁移),支持从 JSON 文件批量导入账号,自动去重 (#82)

Fixed

  • 前端缓存问题:index.html 设置 Cache-Control: no-cache 防止浏览器缓存旧页面,/assets/* 设置 immutable 长缓存(Vite content hash)

Changed

  • Light mode 背景色从 #f6f8f6 改为纯白 #ffffff,增大亮/暗主题视觉差异
  • 提取管道强化:extract-fingerprint.ts 新增 fallback 扫描(.vite/build/*.js 全文件回退)和 webview 模型发现(webview/assets/*.js),pattern 失败不再中断整个流程
  • 模型/别名自动添加降级为 semi-auto:后端已通过 isCodexCompatibleId() 自动合并新模型,apply-update.ts 不再自动写入 models.yaml(避免 mutateYaml 破坏 YAML 格式)
  • Codex Desktop 版本更新至 v26.309.31024 (build 962)

Fixed

  • 自动更新重启可靠性:移除 .restart-helper.cjs 临时脚本方案,改为直接 spawn 新进程 + 复用 index.ts 内置 EADDRINUSE 重试(10 次 × 1s);新增 nodeExe 存在性校验防止无声死亡,子进程输出写入 .restart.log 便于排查启动失败

Fixed (pipeline)

  • Prompt 提取括号定位修复:extractPrompts()lastIndexOf("[") 无限回溯导致匹配到无关 [,截取错误代码片段产出乱码;改为 50 字符窗口内搜索
  • Prompt 覆写安全校验:savePrompt()applyAutoChanges() 新增内容验证(最小长度 50 字符、乱码行数 ≤3),拒绝将损坏数据写入 config/prompts/
  • title-generation.md 修复:还原因提取 bug 损坏的 title 生成 prompt(第 17-35 行乱码)

Changed (previous)

  • 模型目录大幅更新:后端移除 free 账号的 gpt-5.4gpt-5.3-codex 全系列(plus 及以上仍可用),新旗舰模型为 gpt-5.2-codexcodex 别名指向此模型)
  • 新增模型:gpt-5.2gpt-5.1-codexgpt-5.1gpt-5-codexgpt-5gpt-oss-120bgpt-oss-20bgpt-5-codex-mini
  • 模型目录从 23 个静态模型精简为 11 个(匹配后端实际返回)

Fixed

  • 429 真实冷却时间:从 429 错误响应体解析 resets_in_seconds / resets_at,账号按后端实际冷却期(如 free 计划 5.5 天)标记限速,不再使用硬编码 60s 默认值 (#65)
  • 429 自动降级:收到 429 后自动尝试下一个可用账号,所有账号耗尽后才返回 429 给客户端 (#65)
  • 调度优先级优化:least_used 策略新增 window_reset_at 二级排序,配额窗口更早重置的账号优先使用 (#65)
  • JSON Schema additionalProperties 递归注入:injectAdditionalProperties() 递归注入 additionalProperties: false 到 JSON Schema 所有 object 节点,覆盖 propertiespatternProperties$defs/definitionsitemsprefixItems、组合器(oneOf/anyOf/allOf)、条件(if/then/else),含循环检测;三个端点(OpenAI/Gemini/Responses passthrough)统一调用 (#64)
  • CONNECT tunnel header 解析:循环跳过中间 header block(CONNECT 200、100 Continue),修复代理模式下 tunnel 的 HTTP/1.1 200 被当作真实状态码导致上游 4xx 错误被掩盖为 502 的问题 (#64)
  • 上游 HTTP 状态码透传:非流式 collect 路径从错误消息提取真实 HTTP 状态码,不再硬编码 502;提取 toErrorStatus() 辅助函数统一 4 处 StatusCode 转换 (#64)
  • Dashboard 中英文切换按钮宽度跳变:StableTextreference 从英文硬编码改为 t() 动态取值,按钮宽度跟随当前语言自适应
  • Dashboard "指纹更新中..." 按钮竖排显示:更新状态按钮添加 whitespace-nowrap,防止 CJK 字符逐字换行
  • CI 版本跳号(v1.0.28 → v1.0.30):sync-electron.ymlcancel-in-progress 改为 false,避免 workflow 被取消后 tag 已推送但版本号未同步回 master;合并两次 git push 为一次减少部分推送窗口
  • 混合 plan 账号路由失败:free 和 team/plus 账号混用时,请求 plan 受限模型(如 gpt-5.4)可能 fallback 到不兼容的 free 账号导致 400 错误,现在严格按 plan 过滤,无匹配账号时返回明确错误而非降级 (#54)
  • cached_tokens / reasoning_tokens 透传:从 Codex API 响应的 input_tokens_detailsoutput_tokens_details 中提取,传递到 OpenAI(prompt_tokens_details)、Anthropic(cache_read_input_tokens)、Gemini(cachedContentTokenCount)三种格式,覆盖流式和非流式模式 (#55, #58)
  • Dashboard 模型选择器使用后端 catalog 的 isDefault 字段,替代硬编码 gpt-5.4
  • Docker 端口修复:锁定容器内 PORT=8080environment 覆盖 env_file),HEALTHCHECK 固定检查 8080,.env 的 PORT 仅控制宿主机暴露端口,修复自定义 PORT 时健康检查失败和端口映射不匹配的问题 (#40)
  • Docker Compose 暴露 OAuth 回调端口 1455,修复容器内登录时 "Operation timed out" 的问题
  • README Docker 快速开始补充 cp .env.example .env 步骤,修复新用户因缺少 .env 文件导致 docker compose up -d 启动失败的问题 (#38)
  • 识别 response.output_item.doneresponse.incompleteresponse.queued Codex SSE 事件,消除 "Unknown event" 日志噪音
  • 剥离 service_tier 字段:Codex 后端不接受请求体中的 service_tier,现在 proxy 在发送前自动移除,修复 -fast 后缀导致 "Unsupported service_tier" 报错
  • 更新 gpt-5.4 推理等级:minimalnone,新增 xhigh(与后端实际支持的值对齐)
  • 添加 OpenAI-Beta 请求头:与 Codex Desktop 保持一致(responses_websockets=2026-02-06
  • 流式 SSE 请求不再设置 --max-time 墙钟超时,修复思考链(reasoning/thinking)在 60 秒处中断的问题;连接保护由 header 超时 + AbortSignal 提供,非流式请求(models、usage)超时不受影响

Added

  • /v1/responses 端点:Codex Responses API 直通,无格式转换,支持原始 SSE 事件流和多账号负载均衡

  • 模型名后缀系统:通过模型名嵌入推理等级和速度模式(如 gpt-5.4-high-fast),CLI 工具(Claude Code、opencode 等)无需额外参数即可控制推理强度和 Fast 模式

  • service_tier 后缀解析:通过 -fast/-flex 模型名后缀解析,保留在 proxy 层元数据中(Codex 后端不接受 service_tier 请求体字段,Desktop 在 app-server 层处理)

  • Dashboard Speed 切换:模型选择器下方新增 Standard / Fast 速度切换按钮

  • 代理分配管理页面(#/proxy-settings):双栏矩阵式布局,批量管理数百账号的代理分配

    • 左栏代理组列表:按 Global/Direct/Auto/各代理分组显示计数徽章,点击筛选
    • 右栏账号表格:搜索、状态筛选、分页(50条/页)、Shift+点击连续多选、每行独立代理下拉
    • 批量操作栏:批量设为指定代理、均匀分配到所有活跃代理(round-robin)、按规则分配
    • 导入导出:导出 JSON 分配文件、导入后预览 diff 再确认应用
    • Hash 路由零依赖切换,Header 导航链接(Dashboard ↔ 代理分配)
    • 后端新增 6 个批量 API:assignments 列表/批量分配/规则分配/导出/导入预览/应用导入
  • 代理池功能:支持为不同账号配置不同的上游代理,实现 IP 多样化和风险隔离

    • 代理 CRUD:添加、删除、启用、禁用代理(HTTP/HTTPS/SOCKS5)
    • 四种分配模式:Global Default(全局代理)、Direct(直连)、Auto(Round-Robin 轮转)、指定代理
    • 健康检查:定时(默认 5 分钟)+ 手动,通过 ipify API 获取出口 IP 和延迟
    • 不可达代理自动标记为 unreachable,不参与自动轮转
    • Dashboard 代理池管理面板:添加/删除/检查/启用/禁用代理
    • AccountCard 代理选择器:每个账号可选择代理或模式
    • 全套 REST API:/api/proxies CRUD + /api/proxies/assign 分配管理
    • 持久化:data/proxies.json(原子写入,与 cookies.json 同模式)
    • Transport 层支持 per-request 代理:TlsTransport 接口新增可选 proxyUrl 参数
  • Dashboard GitHub Star 徽章:Header 新增醒目的 ⭐ Star 按钮(amber 药丸样式),点击跳转 GitHub 仓库页面,方便用户收藏和获取更新

  • Dashboard 检查更新功能:Footer 显示 Proxy 版本+commit 和 Codex Desktop 指纹版本,提供"检查更新"按钮同时检查两种更新

    • Proxy 自更新(CLI 模式):通过 git fetch 检查新提交,自动执行 git pull + npm install + npm run build,完成后提示重启
    • Codex 指纹更新:手动触发现有 appcast 检查,自动应用指纹/模型配置变更
    • Docker 兼容:指纹可自动更新,代理代码提示手动 docker compose up -d --build
    • Electron 兼容:显示版本信息,更新由桌面应用管理
  • GET /admin/update-status 端点:返回 proxy 和 codex 两种更新的当前状态

  • POST /admin/check-update 端点:同时触发 proxy 自检 + codex 指纹检查,自动应用可用更新

  • src/self-update.ts:Proxy 自更新模块(git 子进程实现,支持检查/拉取/构建)

  • GPT-5.4 + Codex Spark 模型支持:新增 gpt-5.4(4 种 effort: minimal/low/medium/high)和 gpt-5.3-codex-spark(minimal/low),codex 别名更新为 gpt-5.4

  • 扩展推理等级:支持 minimalxhigh 等新 effort 值,客户端发送的任意 reasoning_effort 均透传到后端

  • 模型家族矩阵选择器:Dashboard 模型选择从平面下拉改为家族列表 + 推理等级按钮组,通过 /v1/models/catalog 端点获取完整目录

  • 泛化模型识别:isCodexCompatibleId() 同时匹配 gpt-X.Y-codex-* 和裸 gpt-X.Y 格式,确保新模型命名规范变化时自动接入

  • 代码示例动态 reasoning_effort:CodeExamples 组件根据选中的推理等级自动插入 reasoning_effort 参数

  • Reasoning/Thinking 输出支持:始终向 Codex API 发送 summary: "auto" 以获取推理摘要事件;OpenAI 路由在客户端发送 reasoning_effort 时以 reasoning_content 输出;Anthropic 路由在客户端发送 thinking.type: enabled/adaptive 时以 thinking block 输出;未知 SSE 事件记录到 debug 日志以便发现新事件类型

  • 图片输入支持:OpenAI、Anthropic、Gemini 三种格式的图片内容现在可以正确透传到 Codex 后端(input_image + data URI),此前图片被静默丢弃

  • 每窗口使用量计数器:Dashboard 主显示当前窗口内的请求数和 Token 用量,累计总量降为次要灰色小字;窗口过期时自动归零(时间驱动,零 API 开销),后端同步作为双保险校正

  • 窗口时长显示:从后端同步 limit_window_seconds,AccountCard header 显示窗口时长 badge(如 3h),重置时间行追加窗口时长文字

  • Dashboard 账号列表新增手动刷新按钮:点击重新拉取额度数据,刷新中按钮旋转并禁用;独立 refreshing 状态确保刷新时列表不清空;标题行右侧显示"更新于 HH:MM:SS"时间戳(桌面端可见)

  • 空响应计数器:每个账号追踪 empty_response_count,通过 GET /auth/accounts 可查看,窗口重置时自动归零

  • 空响应日志增强:日志中显示账号邮箱(Account xxxx (email) | Empty response),便于定位问题账号

  • 空响应检测 + 自动换号重试:Codex API 返回 HTTP 200 但无内容时,非流式自动切换账号重试(最多 3 次),流式注入错误提示文本

  • 自动提取 Chromium 版本:extract-fingerprint.tspackage.json 读取 Electron 版本,通过 electron-to-chromium 映射为 Chromium 大版本,apply-update.ts 自动更新 chromium_version 和 TLS impersonate profile

  • 动态模型列表:后台从 Codex 后端自动获取模型目录,与静态 YAML 合并(src/models/model-store.tssrc/models/model-fetcher.ts

  • /debug/models 诊断端点,展示模型来源(static/backend)与刷新状态

  • 完整 Codex 模型目录:GPT-5.3/5.2/5.1 全系列 base/high/mid/low/max/mini 变体(23 个静态模型)

  • OpenCode 平台支持(opencode.json 配置文件)

  • Vitest 测试框架(account-pool、codex-api、codex-event-extractor 单元测试)

  • request-id 中间件注入全局请求链路 ID

  • Dockerfile 安全加固(非 root 用户运行、HEALTHCHECK 探针)

Changed

  • Dashboard 模型选择器去重:移除 Anthropic SDK Setup 的独立模型下拉框,统一使用 API Configuration 的 Default Model
  • 模型管理从纯静态 YAML 迁移至静态+动态混合架构(后端优先,YAML 兜底)
  • 默认模型改为 gpt-5.2-codex
  • Dashboard "Claude Code Quick Setup" 重命名为 "Anthropic SDK Setup"
  • /health 端点精简,仅返回 pool 摘要(total / active)

Fixed

  • Anthropic 路由 thinking/redacted_thinking content block 验证失败:Claude Code /compact 发送含 extended thinking 的对话历史时触发 400 Zod 错误,现已添加到 schema
  • Anthropic 路由上下文 token 始终显示 0%:message_delta 事件缺少 input_tokens,Claude Code 无法计算上下文占比,现在从 response.completed 提取后一并返回
  • 工具 schema 缺少 properties 字段导致 400 错误:MCP 工具发送 {"type":"object"}properties 时,Codex 后端拒绝请求;现在所有格式转换器(OpenAI/Anthropic/Gemini)统一注入 properties: {}(PR #22)
  • 额度窗口刷新后 Dashboard 仍显示累计 Token:本地计数器从未按窗口重置,现在 refreshStatus() 每次 acquire/getAccounts 时检查 window_reset_at,过期自动归零窗口计数器
  • 空响应重试循环中账号双重释放:外层 catch 使用原始 entryId 而非当前活跃账号,导致换号重试失败时 double-release(proxy-handler.ts
  • apply-update.ts 模型比较不再误报删除:静态提取只含 2 个硬编码模型,与 YAML 的 24 个比较会产生 22 个假删除,现在只报新增
  • update-checker.ts 子进程超时保护:fork() 添加 5 分钟 kill timer,防止挂起导致 _updateInProgress 永久锁定
  • model-fetcher.ts 初始定时器添加 try/finally,防止异常中断刷新循环
  • apply-update.ts 移除 any 类型(mutateYaml 回调参数)
  • ExtractedFingerprint 接口统一:提取到 scripts/types.ts 共享,extract-fingerprint.tsapply-update.ts 共用
  • 强化提示词注入防护:SUPPRESS_PROMPT 从弱 "ignore" 措辞改为声明式覆盖("NOT applicable"、"standard OpenAI API model"),解决 mini 模型仍泄露 Codex Desktop 身份的问题
  • 非流式请求错误处理:collectTranslator 抛出 generic Error 时返回 502 JSON 而非 500 HTML(proxy-handler.ts
  • desktop-context.md 提取损坏修复:extractPrompts() 的 end marker 从 `; 改为 `[,;)] 正则,防止压缩 JS 代码注入 instructions 导致 tool_calls 失效(#13)
  • 清除 config/prompts/desktop-context.md 中第 71 行起被污染的 ~7KB JS 垃圾代码
  • TLS 伪装 profile 确定性解析:用已知 Chrome profile 列表(KNOWN_CHROME_PROFILES)替代不可靠的 runtime 检测,确保 --impersonate 目标始终有效(如 chrome137chrome136
  • FFI transport 硬编码 "chrome136" 改为使用统一解析的 profile(getResolvedProfile()
  • getModels() 死代码:allModels 作用域修复,消除不可达分支
  • reloadAllConfigs() 异步 lazy import 改为同步直接导入,避免日志时序不准
  • 模型合并 reasoning efforts 判断逻辑从 length > 1 改为显式标志
  • scheduleNext() 添加 try/finally 防止异常中断刷新循环
  • 未认证启动时抑制无意义的 warn 日志
  • getModelCatalog() / getModelAliases() 返回浅拷贝,防止外部意外修改
  • ClaudeCodeSetup.tsx 文件名与导出名不一致,重命名为 AnthropicSetup.tsx
  • Dashboard 模型偏好从硬编码 gpt-5.2-codex 改为使用 codex 别名
  • 构建脚本 vite build --root web 兼容性问题,改用 npm run build:web
  • Docker 容器内代理自动检测失败:detectLocalProxy() 现在同时探测 127.0.0.1(裸机)和 host.docker.internal(Docker 容器→宿主机),零配置即生效

v0.8.0 - 2026-02-24

Added

  • 原生 function_call / tool_calls 支持(所有协议)

Fixed

  • 格式错误的 chat payload 返回 400 invalid_json 错误

v0.7.0 - 2026-02-22

Added

  • developer 角色支持(OpenAI 协议)
  • 数组格式 content 支持
  • tool / function 消息兼容(所有协议)
  • 模型响应中自动过滤 Codex Desktop 指令

Changed

  • 清理无用代码、未使用配置,修复类型违规

Fixed

  • 启动日志显示配置的 proxy_api_key 而非随机哈希
  • 首次 OAuth 登录后 useStatus 未刷新

v0.6.0 - 2026-02-21

Added

  • libcurl-impersonate FFI 传输层,Chrome TLS 指纹
  • pnpm / bun 包管理器支持

Changed

  • README 快速开始按平台重组

Fixed

  • Docker 构建完整修复链(代理配置、BuildKit 冲突、host 网络、源码复制顺序、layer 优化)
  • .env 行内注释被误解析为 JWT token
  • Anthropic / Gemini 代码示例跟随所选模型
  • proxy_api_key 配置未在前端和认证验证中使用
  • 删除按钮始终可见,不被状态徽章遮挡

v0.5.0 - 2026-02-20

Added

  • Dashboard 暗色 / 亮色主题切换
  • 国际化支持(中文 / 英文)
  • 自动代理检测(mihomo / clash / v2ray)
  • 局域网登录分步教程
  • Preact + Vite 前端架构
  • Docker 容器部署支持
  • 共享代理处理器,消除路由重复

Changed

  • Dashboard 重写为 Tailwind CSS
  • 协议 / 语言两级标签页(OpenAI / Anthropic / Gemini × Python / cURL / Node.js)
  • 内联 SVG 图标替换字体图标
  • 系统字体替换 Google Fonts
  • 架构审计修复(P0-P2 稳定性与可靠性)

Fixed

  • 移除所有 any 类型
  • 修复图标文字闪烁(FOUC)
  • 修复未认证时的重定向循环
  • 移除虚假的 Claude / Gemini 模型别名,使用动态目录
  • Dashboard 配置改为只读,修复 HTTP 复制按钮
  • 恢复模型下拉选择器

v0.4.0 - 2026-02-19

Added

  • Anthropic Messages API 兼容路由(POST /v1/messages
  • Google Gemini API 兼容路由
  • 桌面端上下文注入(模拟 Codex Desktop 请求特征)
  • 多轮对话会话管理
  • 自动更新检查管道(Appcast 轮询 + 版本提取)
  • 中英双语 README

v0.3.0 - 2026-02-18

Added

  • curl-impersonate TLS 指纹模拟
  • Chromium 版本自动检测与动态 sec-ch-ua 生成
  • 请求时序 jitter 随机化
  • Dashboard 实时代码示例与配额显示

Fixed

  • curl 请求修复

v0.2.0 - 2026-02-17

Added

  • Dashboard 多账户管理 UI
  • OAuth PKCE 登录流程(固定 localhost:1455 回调)
  • 架构审计:伪装加固、自动更新机制、健壮性提升

Changed

  • 硬编码值提取到配置文件
  • 清理无用代码

v0.1.0 - 2026-02-17

Added

  • OpenAI /v1/chat/completions → Codex Responses API 反向代理核心
  • 配额 API 查询(/auth/accounts?quota=true
  • Cloudflare TLS 指纹绕过
  • SSE 流式响应转换
  • 模型列表端点(GET /v1/models
  • 健康检查端点(GET /health