Releases: AI-Routing-Research-Institute/codex-provider-hub
Releases · AI-Routing-Research-Institute/codex-provider-hub
Release list
Codex 本地中转 v1.11.0
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
Codex 本地中转 v1.10.3
本次更新 2 项改进。
🐞 问题修复
- 模型映射优先于供应商单值模型重写:在 Codex CLI 里切换模型不再被供应商的固定模型设置改回旧模型
🛠️ 其他改进
- 版本与更新版本号上下居中:“版本与更新”行的版本号与右侧按钮文字上下居中对齐,不再偏上
技术细节
Codex 本地中转 v1.10.2
Codex 本地中转 v1.10.2
本次更新 2 项改进。
🐞 问题修复
- Release 摘要 headline 不再被冒号截断:修正更新摘要里人工一句话被冒号截断的问题,现在完整保留
🛠️ 其他改进
- Release 信息改为通俗简短的用户摘要:版本更新说明改为一眼看懂的简短摘要:按新功能、问题修复分组,每条一句话
技术细节
Codex 本地中转 v1.10.1
Codex Provider Hub v1.10.1
本版本由已验证的功能变更说明自动生成。
2026-09-03-usage-chart-catalog
- 类型:feature
- 发布级别:patch
- 目标:按用户选择把用量趋势扩展为六种差异化图型(同一数据多种回答),视觉规范参考 Lieflat Charts(手写 SVG 复刻,不复制其 PolyForm NC 代码):
- 趋势(保留,动画画入)
- 日历(重做热力):今天/24h 保留"日×24 小时"方格;≥7 天改为 GitHub 风格"周×星期"圆点日历(L17 Calendar Heat:点面积=当日 tokens、最忙日虚线环标注、月份刻度)
- 累计(保留,冲击线+滚动大数字)
- 节律(新增,G14 Punch Card):星期×24 小时点阵,点半径=消耗量,看工作日/周末节律
- 构成(新增,G4 Dot Waffle):100 枚圆点(1 点≈1%)按供应商占比着色 + 排名榜
- 发丝线(新增,L3 Barcode):每个分桶一根发丝线+圆点,安静桶也有短线
并修复图例布局:图例移出图表卡片,独立成下方单行(色块项 nowrap、说明文字右对齐),不再与 SVG 抢空间导致换行错乱。
- 实际改动:-
local_proxy/core.py:UsageStore.weekday_hour()——按本地时区星期×24 小时聚合(SQLstrftime('%w'/'%H', recorded_at, 'unixepoch', 'localtime'),周一=0 行),字段与 timeline 一致,空库/all时start_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-dotstagger 动画、.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 天。
all窗口发丝线桶数可达数千:发丝线按桶数压缩线宽(最小 1px),超过 400 桶时抽稀绘制并保持首尾。- 两层端点注册遗漏(#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.js:terminalCardTheme()新增backdrop: '#0b0d10'、backdropMargin: 12。 proxy_static/src/components/ShareCardDialog.vue:drawCard()先整幅填充深色底板,再translate(margin, margin)于卡片原点做既有圆角裁剪/内容/描边/扫描线绘制;模板画布属性 384×664。tests/share_card.test.js、tests/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
Codex Provider Hub v1.10.0
本版本由已验证的功能变更说明自动生成。
2026-09-03-share-card-phone-ratio
- 类型:fix
- 发布级别:patch
- 目标:1. 导出的战报 PNG 不再带外围白边:去掉画布四周 28px 透明边距与烘焙阴影,卡片满幅导出(透明区在聊天工具白底上显示为白边,即用户所见)。
- 卡片改为手机屏比例 9:19.5(逻辑 360×780,3× 导出恰为 1080×2340,主流手机屏幕分辨率)。
- 实际改动:-
proxy_static/src/share-card.js:terminalCardTheme()改为cardWidth: 360、cardHeight: 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
- 目标:按用户确认的需求重构用量趋势视图:
- 尺寸与比例修复:图表区紧凑固定高度(约 240–280px),热力图等比缩放居中、列少时不再被拉伸成竖构图巨图;整体留白收紧。
- 图型差异化:去掉同质的面积/折线/柱状三选一,换成三个不同家族的图型——时序趋势图(面积+合计线合一,动画版)、日历热力/时段矩阵、累计冲击线+大数字(G18 Draw-in + Counter 风格)。
- 动画:入场画入(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-heat;usage-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。
- 轮播打扰读数:默认 5 秒、悬停即停、药丸常显当前指标;reduced-motion 不轮播。
- 热力列数极多(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
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.vue:drawCard整体重写为终端风卡片(逻辑 380px 宽 + 28px 阴影边距,3× 缩放导出 PNG):标题栏(红黄绿圆点 +codex — today's-usage.log,服务名取自controlBase)、$日期行、Space Grotesk46px 渐变大数字(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.js:posterStars/posterLayout两个用例替换为terminalCardTheme色板与度量断言。tests/local_proxy_vue_ui.test.js:海报用例重写为终端卡断言(画布 436×509、字体、扫描线、渐变、文案、旧布局工具不残留)。proxy_static/dist/:重建(index-CmG0ijTb.js / index-c2vqW2_1.css)。- 兼容性:- 纯前端视觉重构;下载文件名、复制行为、空数据提示保持。dist 重建。
- 风险:1. webfont 离线不可用导致字形差异:回退等宽栈 + 布局不依赖具体字宽(右侧数值统一右对齐)。
- 长供应商名/长数字溢出:fitText 截断加省略号。
- 对比语义:设计稿箭头与百分比均为主色绿(--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长跨度(周数多)下格子过小:限制最大列数标签抽稀、格子最小尺寸,超宽时仅标注首末周。
- 图型切换与自动刷新竞态:切换只改渲染,不触发重新请求,数据流不变。
- 灰阶在暗色主题对比度不足:灰阶变量在暗色主题取反方向(浅→深),图例同步。
- 验证结果:-
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
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.js、node --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 成本,并让发版回归人工确认:
- 删除依赖真实桌面环境的 GUI 冒烟测试(
GuiSmokeTests)。 - pre-push 全量验证改为基线对比:失败集合是 merge-base(origin/main)基线子集时放行、不排查;只拦截本次改动新增的失败。
- 发版从合并后自动触发改为人工确认:Agent 汇总待发布内容并向用户确认后,手动触发发版协调工作流创建标签并派发双平台发布。
- 实际改动:-
scripts/team_policy.py:- 新增失败解析(
UNITTEST_FAILURE_RE、NODE_FAILURE_RE、parse_unittest_failures、parse_node_failures)与哨兵常量(套件非零退出但解析不到失败 ID 时保守拦截); run_full_verification()重构:npm ci、npm run build、node --check全部为硬门禁;Python unittest 与逐文件node --test改为"可比对套件",失败集合与 merge-base 基线比对,子集放行(打印忽略数量),新增失败复跑一次确认后仍失败才阻止;- 新增基线设施:
run_comparable_suites、diff_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 不存在);新增VerificationBaselineTests6 项(unittest/TAP 失败解析、去重、子集放行与新增项判定、哨兵、基线缓存 roundtrip 与旧缓存清理)。- 兼容性:- 无产品运行时影响,仅改交付工具链;
release_bump = "none",不产生产品版本发布。 - 基线缓存位于
.git/(不提交、不进版本库),旧缓存条目在写入新基线时清理。 - 已有
release-plan/release-notesCLI 与函数不变,发版工作流复用。 - 风险:1. 基线对比对偶发失败(flaky)不免疫:新增失败复跑一次确认后仍失败才拦截;基线侧偶发失败会进缓存导致放行偏松(可接受方向:宁松勿卡)。
- node 逐文件失败按测试名集合比对,个别 reporter 格式变化可能解析不到 → 解析为空集合等同"无既有失败",退化为严格模式(安全方向)。
- 基线在临时 worktree 跑 Python 套件依赖本机环境(如 fake-IP DNS):基线与 HEAD 在同一台机器运行,环境性失败同时出现在两侧,自动对消——这正是本设计要解决的问题。
- 自动发版取消后,若 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.js、node --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
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.html:git 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 天。
- 时区与对齐错误导致曲线偏移:与
_usage_window_cutoff相同的本地时区规则,单测覆盖跨天/跨小时边界。 - 手写 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
Codex Provider Hub v1.7.3
本版本由已验证的功能变更说明自动生成。
2026-09-03-update-version-check
- 类型:fix
- 发布级别:patch
- 目标:开发环境“版本与更新”同时展示当前运行版本与检测到的最新版本;检查更新不再误报“已是最新”,可正确提示发现新版本(含不支持就地更新时的手动下载指引)。
- 实际改动:-
local_proxy/updater.py:UpdateInfo新增newer_available(远端有新版),has_update保持“新版且本机有可用产物”的语义;无产物时has_update=False但newer_available=True。 local_proxy/application.py:UpdateController新增_refresh_current_version(),status()/check()每次重算resolve_app_version()并同步current_version;status()同时返回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.py:FakeUpdateController对齐新契约,check与无 controller 用例追加新字段断言。proxy_static/dist:随 pre-push 门禁重新构建并同步提交,生产包包含本次界面修复(含显示修正后的二次构建)。- 显示修正:版本行只显示当前版本号(右侧 225px 列放不下双号文本会被省略号截断);最新版本号在“检查更新”后的结果提示行展示(发现新版本 X / 手动下载 / 已是最新),不改动样式布局。
- 兼容性:- 接口加字段(
update_available、newer_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.vuescript 段抽取为.mjs后node --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
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