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