Skip to content

Releases: AI-Routing-Research-Institute/codex-provider-hub

Codex 本地中转 v1.11.0

Choose a tag to compare

@github-actions github-actions released this 07 Sep 01:23
20b4492

Codex 本地中转 v1.11.0

本次更新 9 项改进。

✨ 新功能

  • 请求调试上下文留存:为每个逻辑中转请求保留可定位问题的完整调试上下文,使卡住、重试、接管、上游报错和进程重启后的请求都能通过 request…

🐞 问题修复

  • DeepSeek DSML 工具调用适配:让返回 DSML 文本形式工具调用的供应商仍然能被 Codex 识别并执行
  • 请求生命周期取消清理:确保请求在连接、首包等待、SSE 预检、流式转发和协议终止后的任意取消时机都能可靠结束
  • Codex 显式模型选择在无映射时原样透传:Codex 桌面端、CLI 或 IDE 已在 Responses 请求体中明确选择模型时,本地中转只在当前供应商存在精确…
  • DeepSeek 兼容转换默认关闭:按用户要求,将 DeepSeek 兼容转换开关的默认值改为关闭
  • DeepSeek 与 GPT 切换时的历史和工具协议兼容:定位已有 Codex 任务从本地映射的 DeepSeek 切回 GPT 后出现 HTTP 400 的具体输入因素,修复已…
  • DeepSeek 转换开关与工具、流式消息修复:修复 DeepSeek 参数错误被表现为流断开重连、中间说明覆盖和消息生命周期不完整的问题
  • 修复 DeepSeek 转换开关保存后回退:修复运行设置勾选 DeepSeek 兼容转换后保存自动取消的问题,保持默认关闭和显式选择可保存

🛠️ 其他改进

  • README 全面刷新并加入 Linux.do 社区入口:README 与项目当前功能对齐(用量趋势六图型、今日战报分享卡片、模型映射、在线更新等近期功能此前均未收录),整体观感…

技术细节

Codex 本地中转 v1.10.3

Choose a tag to compare

@github-actions github-actions released this 04 Sep 03:46
3b4b29c

Codex 本地中转 v1.10.3

本次更新 2 项改进。

🐞 问题修复

  • 模型映射优先于供应商单值模型重写:在 Codex CLI 里切换模型不再被供应商的固定模型设置改回旧模型

🛠️ 其他改进

  • 版本与更新版本号上下居中:“版本与更新”行的版本号与右侧按钮文字上下居中对齐,不再偏上

技术细节

Codex 本地中转 v1.10.2

Choose a tag to compare

@github-actions github-actions released this 03 Sep 17:57
cded4f3

Codex 本地中转 v1.10.2

本次更新 2 项改进。

🐞 问题修复

  • Release 摘要 headline 不再被冒号截断:修正更新摘要里人工一句话被冒号截断的问题,现在完整保留

🛠️ 其他改进

  • Release 信息改为通俗简短的用户摘要:版本更新说明改为一眼看懂的简短摘要:按新功能、问题修复分组,每条一句话

技术细节

Codex 本地中转 v1.10.1

Choose a tag to compare

@github-actions github-actions released this 03 Sep 17:26
dd31efc

Codex Provider Hub v1.10.1

本版本由已验证的功能变更说明自动生成。

2026-09-03-usage-chart-catalog

  • 类型:feature
  • 发布级别:patch
  • 目标:按用户选择把用量趋势扩展为六种差异化图型(同一数据多种回答),视觉规范参考 Lieflat Charts(手写 SVG 复刻,不复制其 PolyForm NC 代码):
  1. 趋势(保留,动画画入)
  2. 日历(重做热力):今天/24h 保留"日×24 小时"方格;≥7 天改为 GitHub 风格"周×星期"圆点日历(L17 Calendar Heat:点面积=当日 tokens、最忙日虚线环标注、月份刻度)
  3. 累计(保留,冲击线+滚动大数字)
  4. 节律(新增,G14 Punch Card):星期×24 小时点阵,点半径=消耗量,看工作日/周末节律
  5. 构成(新增,G4 Dot Waffle):100 枚圆点(1 点≈1%)按供应商占比着色 + 排名榜
  6. 发丝线(新增,L3 Barcode):每个分桶一根发丝线+圆点,安静桶也有短线

并修复图例布局:图例移出图表卡片,独立成下方单行(色块项 nowrap、说明文字右对齐),不再与 SVG 抢空间导致换行错乱。

  • 实际改动:- local_proxy/core.pyUsageStore.weekday_hour()——按本地时区星期×24 小时聚合(SQL strftime('%w'/'%H', recorded_at, 'unixepoch', 'localtime'),周一=0 行),字段与 timeline 一致,空库/allstart_at=null;新端点 GET /control/api/usage-weekday-hour(默认 30d、custom 限 90 天、provider 404/参数 422/store 503/数据库 503/no-store)。
  • local_proxy/server.py_register_control_routes 同步注册 {prefix}/api/usage-weekday-hour(处理器与 core 层口径一致)。
  • proxy_static/src/components/UsageTrendView.vue:图型选择器扩为 趋势/日历/累计/节律/构成/发丝线 六项(旧值映射:heat→calendar、area/line/bars→trend);日历图在 ≥7 天窗口渲染"周×星期"圆点阵(半径=√(tokens/max)、最忙日虚线环、月份/星期刻度、stagger 入场),今天/24h 保留小时方格;节律图消费 weekday-hour 端点渲染 7×24 点阵;构成图请求 /api/status 并经 buildShareCardData(providerLimit=8) 渲染 10×10 waffle 点阵;发丝线逐桶线+圆点(安静桶保留短基线,线宽随桶数压缩);图例移出图表卡片为下方单行(色块项 nowrap、说明文字右对齐,窄屏换行);指标药丸与轮播仅在趋势/累计显示;30 秒自动刷新经 document.hidden 门控并在节律/构成激活时同步刷新辅助数据。
  • proxy_static/src/styles.css.usage-legend-row(含 900px 断点换行)、.usage-cal-dot/.usage-punch-dot/.usage-waffle-dot stagger 动画、.usage-cal-peak-ring.usage-waffle-1..4.usage-barcode-line(.is-empty)/.usage-barcode-dot;reduced-motion 降级扩展到全部新动画。
  • 测试:tests/test_proxy_core.py 新增 weekday_hour 矩阵落位/provider 过滤/空库/非法窗口与 90 天上限 2 个用例;tests/test_server.py 新增双服务 usage-weekday-hour 200/隔离/跨服务 404 用例;tests/local_proxy_vue_ui.test.js 图型断言扩为六图型并新增图例行结构断言。
  • proxy_static/dist/:重建(index-D6mAsM1S.js / index-CIs_K6wk.css)。
  • 兼容性:- 后端纯新增端点与查询,request_usage 无 schema 变更;timeline 行为不变。dist 重建。
  • 发布级别经用户确认由 minor 调整为 patch:本轮功能跨度有限,不足以提升第二位版本号。
  • 风险:1. weekday_hour 聚合在超大时间范围(all)下为单查询分组聚合,量级可控;custom 限 90 天。
  1. all 窗口发丝线桶数可达数千:发丝线按桶数压缩线宽(最小 1px),超过 400 桶时抽稀绘制并保持首尾。
  2. 两层端点注册遗漏(#78 教训):server 层注册与测试同时提交。
  • 验证结果:- python -m unittest tests.test_proxy_core.UsageTests → 26 项通过;tests.test_server → 19 项通过;全量 python -m unittest discover -s tests -p "test_*.py" → 558 项全部通过(2026-09-03 23:28)。
  • node --test tests/*.test.js 全部通过(Vue UI 27/27,含六图型与图例断言)。
  • 组件 stub 数值抽查:30 天日历 26px 单元 178×212、punch 7×24=168 点半径合规、发丝线 30 桶 x 递增、waffle 恰 100 点按占比 70/30 分布。
  • 浏览器 harness 截图:六图型全部正常渲染(日历月刻度+最忙日虚线环、节律工作日/周末纹理、waffle、发丝线、累计、趋势);npm run build --prefix proxy_static 构建成功。
  • PR:#84

2026-09-04-share-card-dark-backdrop

  • 类型:fix
  • 发布级别:patch
  • 目标:复制/下载的战报卡片粘贴到微信(含暗色模式)时不再出现白色填充角。导出图自带 #0b0d10 深色底板(原设计稿的页面底色),卡片以圆角浮于底板之上,整图无任何透明像素——微信压平 alpha 也不再可能出白。
  • 实际改动:- proxy_static/src/share-card.jsterminalCardTheme() 新增 backdrop: '#0b0d10'backdropMargin: 12
  • proxy_static/src/components/ShareCardDialog.vuedrawCard() 先整幅填充深色底板,再 translate(margin, margin) 于卡片原点做既有圆角裁剪/内容/描边/扫描线绘制;模板画布属性 384×664。
  • tests/share_card.test.jstests/local_proxy_vue_ui.test.js:主题与画布断言更新(384×664、底板填充、平移、无透明)。
  • tests/test_proxy_core.py:修复 test_timeline_today... 既有时间敏感缺陷——原测试用 time.time() 且在 now-3h 插数据,0-3 点运行时该记录落入昨天导致断言漂移;改为固定当天 12:30。
  • proxy_static/dist/:重建(index-5Qz3Zn17.js)。
  • 兼容性:- 纯前端视觉;导出文件名不变;dist 重建。
  • 风险:- 底板边仅 12px,若用户期望"完全满幅无边"可能有出入:底板为原设计稿页面底色,视觉上是"深色卡片置于深色页面"的完整构图。
  • 验证结果:- node --test tests/share_card.test.js tests/local_proxy_vue_ui.test.js → 36/36 通过(2026-09-04 00:39)。
  • 浏览器实测(2026-09-04 00:41):预览环境打开分享对话框,导出画布四角/底板边/卡片内像素均为不透明 rgba(11,13,16,255),无任何透明像素——微信压平 alpha 后不可能出现白色。
  • 全量 python -m unittest discover -s tests -p "test_*.py" → 558 项全部通过(含修复后的时间敏感用例,凌晨运行验证);node --test tests/*.test.js 全部通过;npm run build 构建成功(2026-09-04 00:46)。
  • PR:#85

Codex 本地中转 v1.10.0

Choose a tag to compare

@github-actions github-actions released this 03 Sep 12:15
86935c2

Codex Provider Hub v1.10.0

本版本由已验证的功能变更说明自动生成。

2026-09-03-share-card-phone-ratio

  • 类型:fix
  • 发布级别:patch
  • 目标:1. 导出的战报 PNG 不再带外围白边:去掉画布四周 28px 透明边距与烘焙阴影,卡片满幅导出(透明区在聊天工具白底上显示为白边,即用户所见)。
  1. 卡片改为手机屏比例 9:19.5(逻辑 360×780,3× 导出恰为 1080×2340,主流手机屏幕分辨率)。
  • 实际改动:- proxy_static/src/share-card.jsterminalCardTheme() 改为 cardWidth: 360cardHeight: 640(9:16)、新增 cornerRadius: 16、移除 margin(满幅导出)。
  • proxy_static/src/components/ShareCardDialog.vue:画布属性 360×640;整卡圆角裁剪绘制(标题栏顶部圆角、扫描线随裁剪、restore 后圆角描边);hero 数字 56px 带超宽自适应缩号;新增"今日时段分布"小节——数据来自 GET /api/usage-timeline?usage_window=today(Promise.all 并入,失败降级占位),24 个小时位渐变细条(高度∝该小时 tokens)、右上"峰值 X · HH:00"、00/06/12/18/23 刻度;页脚锚定底部。
  • proxy_static/src/styles.css.share-card-canvas-terminal 圆角 16px、max-width 340px,与导出图一致。
  • 测试:tests/share_card.test.js 主题断言更新;tests/local_proxy_vue_ui.test.js 画布 360×640、时段分布、today 时间线请求、无烘焙阴影断言。
  • proxy_static/dist/:重建(index-BAE2UGRC.js / index-DtB-Aow- 为本轮构建产物)。
  • 兼容性:- 纯前端视觉;导出文件名不变;dist 重建。
  • 风险:- today 时间线接口偶发失败:降级为占位文案,不影响其余卡面。
  • 验证结果:- node --test tests/share_card.test.js tests/local_proxy_vue_ui.test.js → 36/36 通过(2026-09-03 19:22)。
  • 假数据 harness 浏览器截图逐项核对:满幅圆角无白边、9:16 紧凑比例、hero 大数字、输入/输出/缓存、构成条、时段分布(渐变细条+峰值 5.2M · 10:00+刻度)、页脚光标,全部正常无重叠溢出(2026-09-03 19:25)。
  • node --test tests/*.test.js 全部通过;python -m unittest discover -s tests -p "test_*.py" → 555 项全部通过;npm run build --prefix proxy_static 构建成功(2026-09-03 19:27)。
  • PR:pending

2026-09-03-usage-chart-toggle-width

  • 类型:fix
  • 发布级别:patch
  • 目标:用量趋势视图右上角"趋势/热力/累计"图表类型切换按钮在空间不足时文字被压成两行("趋/势"),视觉拥挤;加宽按钮并禁止换行。
  • 实际改动:- proxy_static/src/styles.css.usage-chart-toggle 增加 flex-shrink: 0.usage-chart-toggle-button 增加 min-width: 48px; white-space: nowrap,内边距 12→14px。
  • tests/local_proxy_vue_ui.test.js:新增 "usage trend chart toggle stays on one line" 断言。
  • proxy_static/dist/:随本轮重建。
  • 兼容性:- 纯 CSS;dist 重建。
  • 风险:- 极窄屏(<380px)下工具行可能溢出:按钮 nowrap 后整组约 160px,加上时间范围选择器仍在常见手机宽度内。
  • 验证结果:- node --test tests/local_proxy_vue_ui.test.js → 26/26 通过(含新增断言)(2026-09-03 19:22)。
  • node --test tests/*.test.js 全部通过;python -m unittest discover -s tests -p "test_*.py" → 555 项全部通过(2026-09-03 19:27)。
  • PR:pending

2026-09-03-usage-trend-animated-charts

  • 类型:feature
  • 发布级别:minor
  • 目标:按用户确认的需求重构用量趋势视图:
  1. 尺寸与比例修复:图表区紧凑固定高度(约 240–280px),热力图等比缩放居中、列少时不再被拉伸成竖构图巨图;整体留白收紧。
  2. 图型差异化:去掉同质的面积/折线/柱状三选一,换成三个不同家族的图型——时序趋势图(面积+合计线合一,动画版)、日历热力/时段矩阵、累计冲击线+大数字(G18 Draw-in + Counter 风格)。
  3. 动画:入场画入(quarticOut 快进快停)、热力格 stagger 依次出现、大数字滚动;悬停图表重播;指标轮播(tokens ↔ 请求数 ↔ 成功率,5 秒自动切换、悬停暂停、可手动切换);prefers-reduced-motion 自动降级为静态且不轮播。零新增依赖(rAF + CSS)。
  • 实际改动:- proxy_static/src/components/UsageTrendView.vue:图表区整体重写——
    • 图型改为 趋势/热力/累计 三项(normalizeChart 将旧持久化值 line/bars/area 映射到 trend);
    • 趋势图按指标维度渲染(tokens=输入/输出堆叠面积+合计线;requests=请求面积+线;success=成功率线),路径改 <path>
    • 热力图 finishHeatGeom:按可用宽高等比计算 cell(clamp 10–26px)、SVG 显式宽高居中不再拉伸(修复 7 天窗口竖构图巨图 bug)、格子 stagger 入场(每格 12ms、总延迟上限 600ms);
    • 累计冲击线:cumulativeLinePath/cumulativeAreaPath 桶累计曲线 + 右上角大数字滚动(counterDisplay);
    • 动画引擎:quarticOut 缓动 + rAF 画入(DRAW_MS=900,strokeDashoffset 绑定)、scheduleHoverReplay(最小间隔 1.5s)、prefers-reduced-motion 全降级;
    • 指标轮播:CAROUSEL_MS=5000 自动切换(悬停/隐藏暂停、热力图不轮播)、指标药丸可手动切换;
    • 30 秒自动刷新只更新数据并重播入场。
  • proxy_static/src/styles.css.usage-chart 固定 260px 高并居中;.usage-heat-svg/.usage-chart-heatusage-heat-pop 关键帧与 stagger;.usage-metric-pill(.is-active).usage-cumulative-number/label(大数字 24px Space Grotesk);@media (prefers-reduced-motion: reduce) 关闭动画;清理旧 mean/bar/拉伸规则;小字号用 calc(var(--font-meta) - 1px) 维持全库小字号治理约束。
  • tests/local_proxy_vue_ui.test.js:图型断言重写(三图型、METRICS、quarticOut、reduced-motion、轮播、热力 clamp、固定高度 CSS、旧图型不残留)。
  • proxy_static/dist/:重建(index-D7SZ50xP.js / index-Cxx8pZPt.css)。
  • 兼容性:- 纯前端;localStorage 图表键沿用,旧值映射兼容;30 秒自动刷新改为仅更新数据不重播入场。
  • 风险:1. 动画在大量桶(如 all 窗口数百天)下性能:stagger 总时长封顶、画入用单 path 一次 rAF。
  1. 轮播打扰读数:默认 5 秒、悬停即停、药丸常显当前指标;reduced-motion 不轮播。
  2. 热力列数极多(all 多年)时 cell 到下限 10px:容器内横向滚动兜底。
  • 验证结果:- 组件脚本 stub 数值抽查(2026-09-03 18:29):7 天热力 96×210(紧凑不再放大)、24 小时 668×54 单行、30 天 174×210;累计曲线单调递增、路径 7 点 x 递增且终点贴右边界;指标元数据 tokens/requests/success 就绪。
  • node --test tests/local_proxy_vue_ui.test.js → 25/25 通过(含重写图型断言);node --test tests/*.test.js 全部通过。
  • python -m unittest discover -s tests -p "test_*.py" → 555 项全部通过;npm run build --prefix proxy_static 构建成功(2026-09-03 18:30)。
  • PR:#81

2026-09-03-usage-view-padding

  • 类型:fix
  • 发布级别:patch
  • 目标:用量趋势视图与供应商/请求等视图一致,具备左右页面边距和 surface-soft 背景内容区,不再左右顶格。
  • 实际改动:- proxy_static/src/styles.css.usage-view 补齐 padding: 18px 20px 20px; background: var(--surface-soft),子元素 width: min(1520px, 100%); margin-inline: auto 限宽居中(与 .requests-view 同一口径);窄屏媒体查询补 .usage-view { padding: 16px 12px; }
  • tests/local_proxy_vue_ui.test.js:新增 "usage trend view matches the shared page padding and content width" 样式断言。
  • proxy_static/dist/:重建(index-BF0iKsD1.js / index-BTBZCZE2.css)。
  • 兼容性:- 纯 CSS 视觉修复;dist 重建。
  • 风险:- 限宽 1520px 后超宽屏下图表变窄:与请求视图同一内容宽度,观感一致,属预期。
  • 验证结果:- node --test tests/local_proxy_vue_ui.test.js → 26/26 通过(含新增断言)(2026-09-03 18:54)。
  • 浏览器实测(2026-09-03 18:56):从源码启动的服务加载新构建,用量趋势视图标题/汇总卡/图表均与请求视图一致出现左右边距与浅色背景区,不再顶格。
  • node --test tests/*.test.js 全部通过;python -m unittest discover -s tests -p "test_*.py" → 555 项全部通过;npm run build --prefix proxy_static 构建成功(2026-09-03 18:57)。
  • PR:#82

Codex 本地中转 v1.9.0

Choose a tag to compare

@github-actions github-actions released this 03 Sep 10:00
955760b

Codex Provider Hub v1.9.0

本版本由已验证的功能变更说明自动生成。

2026-09-03-share-card-terminal-restyle

  • 类型:feature
  • 发布级别:minor
  • 目标:按用户提供的设计稿(C:\Users\Kane\Documents\token_report_card.html,"今日 Token 战报"终端风卡片)一比一复刻战报海报:macOS 窗口红绿灯标题栏 + codex — today's-usage.log 路径、$ 日期行、ember 渐变大数字、昨日对比行、输入/输出/缓存三行统计、请求元信息、消耗构成条(第一名供应商)、"最晚一战"页脚与光标块,全部接真实数据。
  • 实际改动:- proxy_static/src/components/ShareCardDialog.vuedrawCard 整体重写为终端风卡片(逻辑 380px 宽 + 28px 阴影边距,3× 缩放导出 PNG):标题栏(红黄绿圆点 + codex — today's-usage.log,服务名取自 controlBase)、$ 日期行、Space Grotesk 46px 渐变大数字(linear-gradient(100deg, #ff5f2e, #ffb020))、▼/▲ 昨日对比(绿)、输入/输出/缓存三行(右对齐数值)、请求元信息、消耗构成条(90° 渐变 #ff5f2e→#c893ff,宽度=第一名占比;多家显示"共 N 家 · X 领跑")、"最晚一战/你正在敲代码"页脚 + 绿色光标块、静态扫描线;绘制前 document.fonts.ready(1.2s 超时竞速);对话按钮换 .share-terminal-button(主按钮 ember 渐变)。
  • proxy_static/src/share-card.js:删除 posterStars/posterLayout(旧星空海报专用),新增 terminalCardTheme()(色板/字体栈/间距单一来源)。
  • proxy_static/src/styles.css:Google Fonts @import(JetBrains Mono + Space Grotesk)、.share-card-canvas-terminal.share-card-actions-terminal.share-terminal-button(.primary)
  • tests/share_card.test.jsposterStars/posterLayout 两个用例替换为 terminalCardTheme 色板与度量断言。
  • tests/local_proxy_vue_ui.test.js:海报用例重写为终端卡断言(画布 436×509、字体、扫描线、渐变、文案、旧布局工具不残留)。
  • proxy_static/dist/:重建(index-CmG0ijTb.js / index-c2vqW2_1.css)。
  • 兼容性:- 纯前端视觉重构;下载文件名、复制行为、空数据提示保持。dist 重建。
  • 风险:1. webfont 离线不可用导致字形差异:回退等宽栈 + 布局不依赖具体字宽(右侧数值统一右对齐)。
  1. 长供应商名/长数字溢出:fitText 截断加省略号。
  2. 对比语义:设计稿箭头与百分比均为主色绿(--good),如实复刻(升/降同为绿);持平/首日用中性灰。
  • 验证结果:- node --test tests/share_card.test.js tests/local_proxy_vue_ui.test.js → 34/34 通过(2026-09-03 17:49)。
  • 真实渲染可视化验证(2026-09-03 17:50):以设计稿同数值的假数据驱动 verbatim 提取的绘制代码,浏览器截图逐项比对——标题栏圆点与路径、$ 2026-09-03 周四、渐变大数字 11,654,341、▼ 77.6% 较昨日全天、三行统计(11.6M/54.62K/10.85M)、构成条 100% baicai copy + 独揽今日全部用量最晚一战 17:00 + 你正在敲代码 光标块全部与设计稿一致,无重叠/溢出。
  • python -m unittest discover -s tests -p "test_*.py" → 555 项全部通过;node --test tests/*.test.js 全部通过;node --check(classic/src/provider_status)、npm run build --prefix proxy_static 全部通过(2026-09-03 17:52)。
  • PR:#80

2026-09-03-usage-trend-chart-gallery

  • 类型:feature
  • 发布级别:minor
  • 目标:把用量趋势视图的单一样式图表升级为多种可切换的图型,视觉与编码规范参考开源 Skill Lieflat Charts(Mono 灰阶保底、诚实编码、结论式摘要、图型按数据形状选择),继续零新增依赖(手写 SVG)。
  • 实际改动:- proxy_static/src/components/UsageTrendView.vue:重写图表区为四图型画廊——新增图型切换按钮组(面积/折线/柱状/热力,持久化 local-proxy-usage-trend-chart,默认 area);新增合计折线 + meanValue 窗口均值虚线;新增 barRects 零基线堆叠柱(输入/输出两档灰度);新增 heatLayout/heatCells/heatLevel 热力矩阵(小时粒度=日期×24 小时、天粒度=星期×周,值=合计 token 五档灰阶,格级 hoverCell 悬停明细);汇总卡第一项改结论式(conclusionLabel = "窗口合计 → N tokens");图例按图型切换并标注编码含义("虚线=窗口均值;y 轴从 0 开始"、"零基线 · 不断轴")。
  • proxy_static/src/styles.css:新增 --usage-mono-1..4/--usage-mono-ink/--usage-heat-0 灰阶变量(明暗两套主题取反方向);图表配色由 teal/amber 彩色系切换为 Mono 单色系;新增图型切换按钮、均值线、堆叠柱、热力格与热力图例样式。
  • tests/local_proxy_vue_ui.test.js:新增 "usage trend view offers selectable mono chart types" 源断言测试(四图型选项与持久化键、meanValue/barRects/heatCells/heatLevel/conclusionLabel 渲染分支、灰阶 CSS 变量与新样式存在)。
  • proxy_static/dist/npm run build 重建(index-DqQoFmZx.js / index-ytPSDIQN.css)。
  • 另安装了用户级 Skill C:\Users\Kane\.agents\skills\lieflat-charts(克隆自上游仓库,仅作为设计规范参考,未复制其代码,仓库内无其任何文件)。
  • 兼容性:- 纯前端展示层变更;旧 localStorage 时间范围键沿用,新增图表类型键缺失时默认 area。dist 重建。
  • 风险:1. 热力矩阵在 all 长跨度(周数多)下格子过小:限制最大列数标签抽稀、格子最小尺寸,超宽时仅标注首末周。
  1. 图型切换与自动刷新竞态:切换只改渲染,不触发重新请求,数据流不变。
  2. 灰阶在暗色主题对比度不足:灰阶变量在暗色主题取反方向(浅→深),图例同步。
  • 验证结果:- node --test tests/local_proxy_vue_ui.test.js → 25/25 通过(含新增 1 项)(2026-09-03 17:35)。
  • 组件脚本 stub 执行几何抽查:天粒度热力 7 格分档单调(levels 4122334)、柱状堆叠底边落在零基线、24 小时热力 24 格单行且列宽越界检查通过(2026-09-03 17:36)。
  • python -m unittest discover -s tests -p "test_*.py" → 555 项全部通过;node --test tests/*.test.js 全部通过;node --check(classic/src/provider_status)、npm ci + npm run build --prefix proxy_static 全部通过(2026-09-03 17:36)。
  • PR:#79

Codex 本地中转 v1.8.1

Choose a tag to compare

@github-actions github-actions released this 03 Sep 09:07
9dada42

Codex Provider Hub v1.8.1

本版本由已验证的功能变更说明自动生成。

2026-09-03-hook-encoding

  • 类型:fix
  • 发布级别:none
  • 目标:git-bash 下触发门禁失败时,中文 policy 报错在终端清晰可读,不再显示 ����
  • 实际改动:- .githooks/commit-msg、pre-commit、pre-push:各加 export PYTHONIOENCODING=utf-8 + export LC_ALL=C.UTF-8
  • scripts/team_policy.py:新增 _ensure_utf8_stdio() 并在 main() 入口调用,stdio 重配 UTF-8(backslashreplace,异常吞掉降级)。
  • 新增本说明 docs/changes/2026-09-03-hook-encoding.md
  • proxy_static/dist/index.html:归一 #74 带入的 CRLF(含 1 行 \r\r\n)为 LF。
  • 兼容性:无。仅输出编码,行为与接口不变;none 不触发发版。
  • 风险:- 老环境 Python 若不支持 reconfigure:已 try 包裹降级,无影响。
  • 缓解:回归跑 tests/test_team_policy.py
  • 验证结果:- A/B 对照(同终端同坏消息):旧代码输出 policy error: commit �������ʹ��ǰ�� emoji��Conventional Commit �ͼ�����������;新代码经钩子输出 policy error: commit 标题必须使用前置 emoji、Conventional Commit 和简体中文描述,清晰可读。
  • python -m unittest tests.test_team_policy:25 tests OK。
  • dist 归一验证:去 CR 后与基线字节完全一致(零语义);入库 blob CR=0。
  • 编辑后全文件换行符检查通过(team_policy.py 还原为 LF,diff 仅 +20 行)。
  • PR:pending

2026-09-03-usage-timeline-server-route

  • 类型:fix
  • 发布级别:patch
  • 目标:让"用量趋势"视图在正式启动的服务(/control/{codex|claude}/)下正常返回数据,消除 GET /control/codex/api/usage-timeline → 404 Not Found
  • 实际改动:- local_proxy/server.py
    • local_proxy.core 导入 TIMELINE_MAX_CUSTOM_SECONDS
    • _register_control_routes 新增 control_usage_timeline 处理器(usage_window 默认 24h、custom 上限 90 天、可选 provider_id 不存在 404、usage_store 缺失 503、参数错误 422、数据库错误 503、Cache-Control: no-store,与 core.py 端点及 usage-history 口径一致);
    • 注册 GET {prefix}/api/usage-timeline(紧跟 usage-history 之后)。
  • tests/test_server.py:新增 test_usage_timeline_is_served_per_service_console——直接请求 /control/codex/api/usage-timeline/control/claude/api/usage-timeline,断言 200、按小时分桶、桶求和与 total 一致、双服务数据隔离(7/14 tokens)、跨服务 provider 404、Cache-Control: no-store
  • 兼容性:- 纯补注册,无行为迁移;create_proxy_app 单应用端点保持不变。
  • 风险:- server.py 处理器与 core.py 端点行为不一致:通过镜像 usage-history 的实现方式并新增双服务隔离测试控制。
  • 验证结果:- python -m unittest tests.test_server → 18 项全部通过(含新增 1 项,2026-09-03 16:30)。
  • python -m unittest tests.test_proxy_core → 144 项全部通过(既有 timeline 用例无回归)。
  • python -m unittest discover -s tests -p "test_*.py" → 555 项全部通过(2026-09-03 16:31)。
  • node --test tests/*.test.jsnode --check(classic/src/provider_status)、npm ci + npm run build --prefix proxy_static → 全部通过(2026-09-03 16:31)。
  • PR:#78

2026-09-03-verification-baseline-manual-release

  • 类型:chore
  • 发布级别:none
  • 目标:降低交付门禁的时间与 Agent token 成本,并让发版回归人工确认:
  1. 删除依赖真实桌面环境的 GUI 冒烟测试(GuiSmokeTests)。
  2. pre-push 全量验证改为基线对比:失败集合是 merge-base(origin/main)基线子集时放行、不排查;只拦截本次改动新增的失败。
  3. 发版从合并后自动触发改为人工确认:Agent 汇总待发布内容并向用户确认后,手动触发发版协调工作流创建标签并派发双平台发布。
  • 实际改动:- scripts/team_policy.py
    • 新增失败解析(UNITTEST_FAILURE_RENODE_FAILURE_REparse_unittest_failuresparse_node_failures)与哨兵常量(套件非零退出但解析不到失败 ID 时保守拦截);
    • run_full_verification() 重构:npm cinpm run buildnode --check 全部为硬门禁;Python unittest 与逐文件 node --test 改为"可比对套件",失败集合与 merge-base 基线比对,子集放行(打印忽略数量),新增失败复跑一次确认后仍失败才阻止;
    • 新增基线设施:run_comparable_suitesdiff_new_failures_baseline_cache_path.git/policy-baselines/<merge-base>.json)、read_baseline_cache/write_baseline_cache(写入时清理旧缓存)、collect_baseline(临时 worktree 检出 merge-base 跑可比对套件,不跑 npm)、load_or_build_baseline_confirm_new_failures
  • tests/test_probe_codex_gui.py:删除 GuiSmokeTests 及其专用 import(json/os/subprocess/sys/Path/ROOT/GUI_SCRIPT);保留两个纯单元测试类。
  • .github/workflows/auto-release.yml 重命名为 release.yml:名称改为 Manual Release,触发改为 workflow_dispatch;计划计算、标签创建与双平台派发逻辑不变。
  • AGENTS.md:Git 与 PR 增加基线对比条款;"自动版本与自动发版"改为"版本与人工确认发版"(合并后不自动发版,Agent 汇总并向用户确认后触发 release.yml);硬停止条件改为"本地全量验证未运行,或出现基线之外的新增失败"。
  • .agents/skills/git-commit-helper/SKILL.md:第 8/9/10 步与停止条件同步新口径(基线对比、无自动发版、用户同意后 gh workflow run release.yml --ref main)。
  • tests/test_team_policy.py:治理断言更新(AGENTS/skill 新文案、release.yml 手动触发且 auto-release.yml 不存在);新增 VerificationBaselineTests 6 项(unittest/TAP 失败解析、去重、子集放行与新增项判定、哨兵、基线缓存 roundtrip 与旧缓存清理)。
  • 兼容性:- 无产品运行时影响,仅改交付工具链;release_bump = "none",不产生产品版本发布。
  • 基线缓存位于 .git/(不提交、不进版本库),旧缓存条目在写入新基线时清理。
  • 已有 release-plan / release-notes CLI 与函数不变,发版工作流复用。
  • 风险:1. 基线对比对偶发失败(flaky)不免疫:新增失败复跑一次确认后仍失败才拦截;基线侧偶发失败会进缓存导致放行偏松(可接受方向:宁松勿卡)。
  1. node 逐文件失败按测试名集合比对,个别 reporter 格式变化可能解析不到 → 解析为空集合等同"无既有失败",退化为严格模式(安全方向)。
  2. 基线在临时 worktree 跑 Python 套件依赖本机环境(如 fake-IP DNS):基线与 HEAD 在同一台机器运行,环境性失败同时出现在两侧,自动对消——这正是本设计要解决的问题。
  3. 自动发版取消后,若 Agent 忘记询问用户,改动会滞留在 main 未发布:由 skill 步骤强制要求合并后必须给出"发版或跳过"的提议收尾。
  • 验证结果:- python -m unittest tests.test_team_policy tests.test_probe_codex_gui tests.test_project_documentation → 39 项全部通过(2026-09-03)。
  • 端到端演练基线机制(2026-09-03 15:10):HEAD 可比对套件 18.6s 失败 0;merge-base(5f06e6e)基线 17.9s 失败 1(main 上仍存在的冒烟测试在本机 cc-switch 无供应商时失败);diff_new_failures 为空 → 按新规则应放行且无需排查,行为符合设计;基线缓存已写入 .git/policy-baselines/
  • python -m unittest discover -s tests -p "test_*.py" → 554 项全部通过(2026-09-03)。
  • node --test tests/*.test.jsnode --check(classic/src/provider_status)、npm ci + npm run build --prefix proxy_static → 全部通过(2026-09-03)。
  • 实际推送本分支时由新版 pre-push 钩子执行真实基线对比(见 PR 与推送记录)。
  • PR:#76

Codex 本地中转 v1.8.0

Choose a tag to compare

@github-actions github-actions released this 03 Sep 06:30
c0e627a

Codex Provider Hub v1.8.0

本版本由已验证的功能变更说明自动生成。

2026-09-03-dist-index-eol

  • 类型:chore
  • 发布级别:none
  • 目标:消除 proxy_static/dist/index.html 入库 blob 中的孤立 CRLF,使工作区在该文件上保持干净,不再出现永久 M 噪音。
  • 实际改动:- proxy_static/dist/index.htmlgit add --renormalize 将入库唯一 CRLF 行归一为 LF(1+/1-)。
  • 新增本说明 docs/changes/2026-09-03-dist-index-eol.md
  • 兼容性:无。纯换行符归一,渲染与构建产物语义不变。
  • 风险:- 若归一后 diff 含除换行符外的内容,立即停止(说明文件被意外改动)。
  • 缓解:提交前用 git diff --cached --ignore-cr-at-eol 强制校验为空。
  • 验证结果:- 入库后 blob:CRLF=0(13 行全 LF);忽略换行符后与父提交内容完全一致(零语义改动)。
  • git status 干净,常驻 M 消除。
  • 推送门禁会自动执行既有全量校验。
  • PR:pending

2026-09-03-token-usage-trend

  • 类型:feature
  • 发布级别:minor
  • 目标:在新版控制台新增"用量趋势"视图:以时间曲线展示选定范围内 token 消耗(输入/输出/合计)随时间的变化,按小时或按天分桶,附请求量与成功/失败汇总,帮助用户直观看到消耗节奏、定位异常时段。
  • 实际改动:- local_proxy/core.py
    • 新增常量 TIMELINE_MAX_CUSTOM_SECONDS(90 天)、TIMELINE_HOURLY_SPAN_SECONDS(48 小时)、TIMELINE_BUCKET_FIELDS
    • 新增辅助函数 _timeline_granularity(跨度 ≤ 48 小时按小时,否则按天)、_timeline_bucket_seconds_align_timeline_start(小时取整点、天取本地 0 点);
    • UsageStore 新增 timeline():按窗口解析边界(all 取库内最早记录),SQL 按桶索引分组聚合,空桶补零,total 由桶求和得出;
    • create_proxy_app 新增 GET /control/api/usage-timeline 路由(usage_window 参数默认 24h、custom 上限 90 天、可选 provider_id 校验、422/404/503 错误口径与 usage-history 一致)。
  • proxy_static/src/components/UsageTrendView.vue(新增):"用量趋势"视图:时间范围选择(今天/近 24 小时/近 7 天/近 30 天/全部/自定义)、汇总卡片(合计/输入/输出/请求/成功/失败)、手写 SVG 图表(输入/输出堆叠面积 + 合计折线、自适应 y 轴、悬停竖线与明细浮层、图例)、30 秒自动刷新、窗口选择持久化到 localStorage。
  • proxy_static/src/components/ViewTabs.vue:新增"用量趋势"标签(usage),随 usageEnabled 属性与 usage_history 功能开关联动。
  • proxy_static/src/App.vue:挂载 UsageTrendView(受 features.usage_history 门控),存储视图回退逻辑扩展到 usage
  • proxy_static/src/styles.css:新增 .usage-* 图表与面板样式(坐标轴字号使用 var(--font-meta),暗色主题经既有 CSS 变量自动适配)。
  • proxy_static/dist/npm run build 重建产物(index-LOpJNy1t.js)。
  • 测试:tests/test_proxy_core.py 新增 5 个 timeline 存储测试(today 小时分桶与零填充、24h 整点对齐与供应商过滤、7d 本地天对齐、all 起点与空库、custom 粒度与边界校验)和 1 个端点测试(200/过滤/422/404/503/默认窗口);tests/local_proxy_vue_ui.test.js 更新共享视图清单并新增"usage trend view renders a time-bucketed token curve"源断言测试。
  • 兼容性:- 纯新增:新查询方法、新端点、新视图;request_usage 无 schema 变更、无迁移;现有 summary/history 行为不变。
  • 风险:1. all 窗口桶数随历史增长:按天分桶且以库内最早记录为起点,桶数上限由数据保留策略天然约束;custom 限 90 天。
  1. 时区与对齐错误导致曲线偏移:与 _usage_window_cutoff 相同的本地时区规则,单测覆盖跨天/跨小时边界。
  2. 手写 SVG 在窄屏的可用性:响应式宽度、最小高度、悬停按桶索引对齐,不做像素级悬停。
  • 验证结果:- python -m unittest discover -s tests -p "test_*.py" → Ran 549 tests:新增 6 个测试全部通过;4 个失败/错误为本轮改动前即存在的本机环境问题(fake-IP DNS 将 .example 保留域解析为非公网地址 ×3、本机 cc-switch 无 Codex API 供应商 ×1),与在 origin/main 上复现的结果一致(2026-09-03)。
  • node --test tests/*.test.js → 全部通过(含新增用例;Vue UI 测试 24/24)(2026-09-03)。
  • npm run build --prefix proxy_static → 构建成功,产物 index-LOpJNy1t.js
  • PR:#74

Codex 本地中转 v1.7.3

Choose a tag to compare

@github-actions github-actions released this 03 Sep 05:13
7d4284f

Codex Provider Hub v1.7.3

本版本由已验证的功能变更说明自动生成。

2026-09-03-update-version-check

  • 类型:fix
  • 发布级别:patch
  • 目标:开发环境“版本与更新”同时展示当前运行版本与检测到的最新版本;检查更新不再误报“已是最新”,可正确提示发现新版本(含不支持就地更新时的手动下载指引)。
  • 实际改动:- local_proxy/updater.pyUpdateInfo 新增 newer_available(远端有新版),has_update 保持“新版且本机有可用产物”的语义;无产物时 has_update=Falsenewer_available=True
  • local_proxy/application.pyUpdateController 新增 _refresh_current_version()status()/check() 每次重算 resolve_app_version() 并同步 current_versionstatus() 同时返回 has_update 与别名 update_available,并透传 newer_available
  • local_proxy/server.py:无 controller 时的降级 payload 补齐 update_available/newer_available/latest_version/release_url/notes
  • proxy_static/src/components/RuntimeView.vue:版本行只显示当前版本号;兼容读取 update_available ?? has_update;检查文案三分支(可更新/手动下载/已是最新);更新按钮仅 有更新且 supported 时显示。
  • proxy_static/classic/index.html + proxy_static/classic/app.js:同上口径,版本行只显示当前版本,check 兼容两字段并区分手动下载分支,更新按钮沿用 has_update && supported(兼容别名)。
  • tests/test_updater.py:新增无产物时 newer_available=True 断言、newer_available 跟踪用例、UpdateController 契约用例(别名/刷新/透传)。
  • tests/test_server.pyFakeUpdateController 对齐新契约,check 与无 controller 用例追加新字段断言。
  • proxy_static/dist:随 pre-push 门禁重新构建并同步提交,生产包包含本次界面修复(含显示修正后的二次构建)。
  • 显示修正:版本行只显示当前版本号(右侧 225px 列放不下双号文本会被省略号截断);最新版本号在“检查更新”后的结果提示行展示(发现新版本 X / 手动下载 / 已是最新),不改动样式布局。
  • 兼容性:- 接口加字段(update_availablenewer_available),保留 has_update,旧客户端不受影响。
  • current_version 仍为纯三段 SemVer 字符串,无配置、数据库或迁移变化。
  • 风险:- 开发机无 Git/无标签/浅克隆时 resolve_app_version() 必须回退而不阻塞启动;已捕获 OSError/SubprocessError 并校验严格 tag 格式。
  • Linux 开发机无可用产物时需走手动下载分支,避免再次误报最新。
  • GitHub API 失败时 check 返回 502,前端显示检查失败而非最新。
  • 验证结果:- .venv\Scripts\python.exe -m unittest tests.test_updater tests.test_version tests.test_server:36 tests OK。
  • .venv\Scripts\python.exe -m unittest discover -s tests -p "test_*.py":534 tests OK(33s)。
  • node --check proxy_static/classic/app.js:通过;RuntimeView.vue script 段抽取为 .mjsnode --check:通过。
  • Get-ChildItem tests -Filter *.test.js | ForEach-Object { node --test $_.FullName }:全部通过,0 fail。
  • 行为核验:resolve_app_version('0.1.7')1.6.2;模拟 v1.6.2 发布包:1.6.1→has_update True/newer True(提示发现新版本),1.6.2→False/False(已是最新),无产物→has False/newer True(手动下载分支)。
  • 显示修正后复验:全量 534 单测 OK(38s),JS 全量 0 fail,版本行恢复单行当前版、无截断风险(样式未动)。
  • rebase 到 origin/main b99fd2f#68)后复验:全量 543 单测 OK,JS 全量 0 fail;dist 在新基线上重新构建并验证 bundle 含修复。
  • PR:pending

Codex 本地中转 v1.7.2

Choose a tag to compare

@github-actions github-actions released this 03 Sep 04:42
421f423

Codex Provider Hub v1.7.2

本版本由已验证的功能变更说明自动生成。

2026-09-03-portable-launcher-path-tests

  • 类型:fix
  • 发布级别:patch
  • 目标:修复源码模式静默启动测试在不同操作系统和 CI 运行器上因路径别名或规范化差异产生的误报,确保发布工作流的全量测试稳定通过。
  • 实际改动:- tests/test_local_proxy_app.py 先解析测试注入的 Python 可执行文件路径,再构造 pythonw.exe、脚本和平台启动器命令。
  • 保留 Windows 隐藏启动链和非 Windows 直接 Python 启动命令的结构断言。
  • 兼容性:仅影响测试代码和交付说明,无运行时接口、配置、数据库或迁移变化。
  • 风险:如果测试解析规则与产品实现不一致,可能隐藏真实的启动命令回归。通过复用相同的 Path.resolve() 语义,并保留平台专用命令结构断言降低风险。
  • 验证结果:- python -m unittest tests.test_local_proxy_app:25 项通过。
  • python -m unittest discover -s tests -p "test_*.py":541 项通过,耗时 80.339 秒。
  • JavaScript 测试:18 个文件、91 项通过。
  • npm run build --prefix proxy_static:Vite 生产构建通过,转换 29 个模块。
  • python -m compileall -q provider_status local_proxy scripts tests:通过。
  • Node JavaScript 语法检查:通过。
  • git diff --check:通过。
  • PR:#71