v0.5.0#252
Merged
Merged
Conversation
- 防御性 tool_use.input 序列化: 非 dict 类型(None/字符串等)降级为空字典, 避免向 copilot 发送非 JSON 对象的 arguments 字段 - 识别 zhipu 500 'ClaudeContentBlockToolResult' 错误为格式不兼容, 不计入熔断器, 确保干净的故障转移到 copilot - 扩展 _is_likely_request_format_error 覆盖结构化 400 响应中 invalid_tool_call_format 错误码的检测 - 新增对应单元测试: input 类型降级、zhipu 格式错误检测、结构化 400 检测 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
OpenAI 和 Gemini 的 SSE 流式响应解析中,model_served 仅写入证据记录而未赋值 到主 usage 字典,导致 Native API 流式路径下模型名称回退为 "unknown"。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
…误; (#215) 新增 _inject_tool_result_id_for_zhipu 辅助函数,在所有 targeting zhipu 的转换通道 (copilot→zhipu、anthropic→zhipu、zhipu self-cleanup)末尾统一注入 tool_result.id, 解决 zhipu 后端错误访问 .id 属性导致的 'ClaudeContentBlockToolResult' object has no attribute 'id' 级联故障转移问题。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(vendor-channels): 移除 zhipu 目标转换中的有害步骤,修复 500 级联故障; 从 prepare_copilot_to_zhipu、prepare_anthropic_to_zhipu、prepare_zhipu_self_cleanup 三个通道中移除 enforce_anthropic_tool_pairing(tool_result 搬迁触发 zhipu 500)、 _inject_tool_result_id_for_zhipu(zhipu 类不读取 JSON id,注入无效)、 _strip_cache_control(GLM-5 原生支持 cache_control)。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(vendor-channels): 修复 zhipu 移除 id 注入后遗留测试断言错误; 6 处测试的断言仍检查旧行为(id 被注入 / cache_control 被移除 / tool_result 被搬迁), 导致 KeyError 或 AssertionError。统一更新为验证新语义:id 不注入、cache_control 保留、 inline tool_result 保留在 assistant 原位。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(vendor-channels): 移除 zhipu 目标转换中的有害步骤,修复 500 级联故障; 从 prepare_copilot_to_zhipu、prepare_anthropic_to_zhipu、prepare_zhipu_self_cleanup 三个通道中移除 enforce_anthropic_tool_pairing(tool_result 搬迁触发 zhipu 500)、 _inject_tool_result_id_for_zhipu(zhipu 类不读取 JSON id,注入无效)、 _strip_cache_control(GLM-5 原生支持 cache_control)。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(vendor-channels): 修复 zhipu 移除 id 注入后遗留测试断言错误; 6 处测试的断言仍检查旧行为(id 被注入 / cache_control 被移除 / tool_result 被搬迁), 导致 KeyError 或 AssertionError。统一更新为验证新语义:id 不注入、cache_control 保留、 inline tool_result 保留在 assistant 原位。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(vendor-channels): 在 tier 门控层主动跳过含 tool_result 的 zhipu 请求; 修正前两次诊断:zhipu 500 发生于所有含 tool_result 块的请求(非仅 tool pairing 后)。 根因是 zhipu 后端 ClaudeContentBlockToolResult 类缺少 id 属性且 JSON 注入无效。 通过 RequestCapabilities.has_tool_results 门控,在发送请求前跳过 zhipu tier, 消除「尝试 → 500 → failover」的无效延迟。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(vendor-channels): 将 tool_use/tool_result 展平为 text 块,彻底修复 zhipu 500 错误 zhipu 后端的 ClaudeContentBlockToolResult 类缺少 id 属性, 无法通过 JSON 注入修复。改用在转换通道中将所有 tool_use 和 tool_result 块转为 text 块的策略,让 zhipu 仅看到纯文本对话。 - 新增 _flatten_tool_blocks 辅助函数 - 三个 zhipu 目标通道均调用展平逻辑 - 移除 ZhipuVendor.supports_request 中的 tool_result 门控 - 更新全部相关测试用例 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
….id 400 错误 (#218) * revert(vendor-channels): 还原至 v0.3.0 基线,修复 failover 级联 server_tool_use.id 400 错误; - 还原 vendor_channels.py 至 v0.3.0(移除 _flatten_tool_blocks、_inject_tool_result_id_for_zhipu、 _enforce_pairing_sanity_pass、zhipu 自清理通道、anthropic→zhipu 通道等 v0.3.0 后引入的特殊处理) - 修复 _determine_source_vendor Priority 1 逻辑:仅当 failed_tier 有已注册转换通道时才返回, 否则降级到 session history / body inference,确保 copilot→anthropic failover 时能通过 session 找到 zhipu 源并正确清理 server_tool_use 块 - 还原 model/vendor.py(移除 TOOL_RESULTS capability) - 部分还原 error_classifier.py(保留 CN 语义拒绝标记,移除 has_tool_results) - 还原 executor.py(移除 zhipu 500 特殊检测,保留 invalid_tool_call_format 检测) - 同步更新测试用例,全部 1399 测试通过 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * docs(issue): 恢复与 vendor-channels 回退无关的 Issue #1 文档; 回退 vendor-channels 至 v0.3.0 基线时误删了 docs/issue.md 全部内容, 其中 Issue #1(streaming usage parse failed)描述的 null 防护修复 仍保留在 usage_parser.py 中,属于无关文档,不应被连带删除。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* feat(session-policy): 新增 Session 级别路由策略与会话活动面板; - 新增 SessionPolicy 配置模型(Pydantic),支持按 session_key / client_category 匹配并覆盖 vendor 优先级 - 新增 SessionPolicyResolver 解析引擎,启动时构建索引实现 O(1) 查找 - 为 usage_log 表新增 session_key 列及索引,含幂等迁移逻辑 - 新增 query_recent_sessions / query_session_profile 聚合查询方法 - executor 路由流式/非流式请求时按 Session Policy 动态重排 tier 顺序 - Dashboard 新增 Recent Active Sessions 面板,展示近期会话聚合数据 - 新增 /api/dashboard/sessions API 端点 - 新增完整测试覆盖(schema、迁移、策略解析、tier 重排、聚合查询) 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(session-policy): 修复 Dashboard XSS 风险并标注 client_category 为预留字段; - 新增 escapeHtml() 工具函数,对所有用户可控数据(session_key、models、vendors、categories)插入 innerHTML 前进行 HTML 实体转义 - title 属性中的 session_key 同样使用转义后的值 - 在 SessionPolicyMatch.client_category 字段描述和 config.default.yaml 中明确标注该条件为预留功能,当前版本暂未生效 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
- 顶部新增 Tab 导航(Overview / Recent Active Sessions),用 `?tab=` 同步 URL 状态,F5 与书签可保留页签; - 将 refresh() 拆为 refreshOverview() + refreshSessions() + 分发器,⟳ 按钮与 10 分钟 setInterval 均仅刷新当前页签; - 页签切换采用懒加载(首次切到才请求,再切回不重复请求),降低无关 API 调用; - refresh() 加入循环补刷快照机制,防止 await 期间用户切页签导致 tabLoaded 标记错位; - 沿用既有 CSS 变量与暗色主题,新增 .tabs / .tab-btn / .tab-pane 样式。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
* feat(session-vendor): 新增 Session 级别运行时 vendor 绑定能力 - SessionPolicyResolver 支持运行时 upsert/remove/list 操作,无需重启服务 - 新增 PUT/DELETE/GET /api/session-vendor API 端点 - Dashboard Sessions 表新增 "Vendor Bind" 下拉选择器,即时绑定 vendor - CLI 新增 session 子命令组(bind/unbind/list) 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(session-vendor): 修复 CLI unbind URL 编码与 list_runtime_bindings 类型标注; - session_unbind 中 key 参数使用 urllib.parse.quote 进行 URL 编码,防止特殊字符导致路由匹配失败 - 修正 list_runtime_bindings 返回类型为 dict[str, str | list[str]],准确反映 session_key 为 str、vendors 为 list[str] 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(session-vendor): 修复 Dashboard bind 变更响应检查与 XSS 防护; - handleBindChange 增加 resp.ok 检查,失败时 revert select 并输出错误日志 - buildBindSelect 改用 data-session-key 属性 + 事件委托替代 inline onchange,消除字符串拼接注入风险 - resolve() docstring 补充 SessionPolicy 不可变约束说明 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(session-vendor): 修复运行时绑定覆盖配置策略与 Dashboard 容错; - upsert 时备份被覆盖的配置策略,remove 时自动恢复,避免配置策略永久丢失 - Dashboard updateSessions 改用 Promise.allSettled,bind/status 请求失败时降级而不阻塞表格渲染 - 新增 test_runtime_remove_restores_config_policy 测试用例覆盖恢复路径 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(session-vendor): 修复 API JSON 解析异常处理与 Dashboard 多绑定显示; - routes: request.json() 添加 try/except,malformed JSON 返回 400 而非 500 - routes: 区分 "非 JSON" 与 "非 JSON Object" 两种错误消息 - dashboard: buildBindSelect 多 vendor 绑定时显示 (+N) 后缀提示 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(dashboard): 优化 Recent Active Sessions 表格 UI,消除滚动条并新增分页; - 解析 session_key JSON,分别展示 session_id(首列完整显示)、device_id 与 account_uuid(紧凑副文本) - 采用 table-layout: fixed + colgroup 固定列宽比例,消除底部水平滚动条 - 新增客户端分页(默认 30 行/页,显示总行数与页码),消除右侧垂直滚动条 - 后端 API limit 上限从 100 调整到 200,支持前端拉取更多数据 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(dashboard): 提升 session-key 样式选择器优先级,确保覆盖通用 td 规则; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
- 重分配列宽:Session ID 22%→16%,Client 6%→10%,Vendor Bind 8%→10%, Models 14%→16%,Vendors 12%→14%,解决 Client/Vendor Bind 每行溢出问题 - 供应商标签去文本前缀,改用颜色区分 API(蓝)/CC(绿) 类型,节省约 40% 列宽 - Models/Vendors 列允许标签换行,解除全局 nowrap 约束 - Models 显示上限 2→3,"+N" 标签添加 title tooltip 显示完整列表 - Vendors 增加上限 4,超出部分 "+N" + tooltip 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
* fix(dashboard): 优化 Recent Active Sessions 表格列显示,消除内容截断 - 重分配列宽:Session ID 22%→16%,Client 6%→10%,Vendor Bind 8%→10%, Models 14%→16%,Vendors 12%→14%,解决 Client/Vendor Bind 每行溢出问题 - 供应商标签去文本前缀,改用颜色区分 API(蓝)/CC(绿) 类型,节省约 40% 列宽 - Models/Vendors 列允许标签换行,解除全局 nowrap 约束 - Models 显示上限 2→3,"+N" 标签添加 title tooltip 显示完整列表 - Vendors 增加上限 4,超出部分 "+N" + tooltip 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(dashboard): 优化 Session 表格显示 — 禁止换行、添加 Tooltip 与 Copy 按钮 - 移除 cell-tags 换行样式,所有单元格统一 nowrap + ellipsis,行高统一 48px - Session ID 列缩窄至 12%,添加 ⧉ Copy 按钮一键拷贝 Session Key - Models/Vendors 单元格添加 title tooltip,鼠标悬停显示完整标签列表 - 修复 Success 列 "..." 问题:添加 cell-success 类禁用 ellipsis(进度条复合内容) - 进一步优化列宽:Vendors 14%→12%、Client/Vendor Bind 10%→12%、Models 16%→17% 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(dashboard): Avg Latency 列使用可读时长单位(ms/s/min)自动换算 - <1s 显示毫秒(如 234ms) - 1s~60s 显示秒(如 2.3s、15s) - >=60s 显示分钟+秒(如 2min 30s、5min) 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * feat(dashboard): 支持点击行展开详情卡片,显示完整字段内容 - 点击任意数据行展开/收起 detail-card(手风琴模式,仅展开一行) - 卡片以 grid 布局展示全部字段完整值:Session ID、Device、Account、 Models(全量标签)、Vendors(全量标签)、Avg Latency、Success Rate、Client - Session ID 列和 Vendor Bind 列点击事件隔离(stopPropagation), 避免误触展开 - 新增 toggleRow 函数,切换 .row-detail.open 类控制显隐 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * chore(gitignore): 添加 .playwright-mcp/ 到忽略规则 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(dashboard): 优化 Recent Active Sessions 表格列显示,消除内容截断 - 重分配列宽:Session ID 22%→16%,Client 6%→10%,Vendor Bind 8%→10%, Models 14%→16%,Vendors 12%→14%,解决 Client/Vendor Bind 每行溢出问题 - 供应商标签去文本前缀,改用颜色区分 API(蓝)/CC(绿) 类型,节省约 40% 列宽 - Models/Vendors 列允许标签换行,解除全局 nowrap 约束 - Models 显示上限 2→3,"+N" 标签添加 title tooltip 显示完整列表 - Vendors 增加上限 4,超出部分 "+N" + tooltip 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(dashboard): 优化 Session 表格显示 — 禁止换行、添加 Tooltip 与 Copy 按钮 - 移除 cell-tags 换行样式,所有单元格统一 nowrap + ellipsis,行高统一 48px - Session ID 列缩窄至 12%,添加 ⧉ Copy 按钮一键拷贝 Session Key - Models/Vendors 单元格添加 title tooltip,鼠标悬停显示完整标签列表 - 修复 Success 列 "..." 问题:添加 cell-success 类禁用 ellipsis(进度条复合内容) - 进一步优化列宽:Vendors 14%→12%、Client/Vendor Bind 10%→12%、Models 16%→17% 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(dashboard): Avg Latency 列使用可读时长单位(ms/s/min)自动换算 - <1s 显示毫秒(如 234ms) - 1s~60s 显示秒(如 2.3s、15s) - >=60s 显示分钟+秒(如 2min 30s、5min) 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * feat(dashboard): 支持点击行展开详情卡片,显示完整字段内容 - 点击任意数据行展开/收起 detail-card(手风琴模式,仅展开一行) - 卡片以 grid 布局展示全部字段完整值:Session ID、Device、Account、 Models(全量标签)、Vendors(全量标签)、Avg Latency、Success Rate、Client - Session ID 列和 Vendor Bind 列点击事件隔离(stopPropagation), 避免误触展开 - 新增 toggleRow 函数,切换 .row-detail.open 类控制显隐 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * chore(gitignore): 添加 .playwright-mcp/ 到忽略规则 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(dashboard): 修复 Copy 按钮导致 JS 报错、展开卡片样式不可读及版本号显示异常 - 将 copyText 内联值改为 copyFromParent 从 data-key 属性读取,避免 JSON 双引号在 onclick 中导致 JS 解析失败 - 优化展开卡片样式:渐变背景、蓝色边框、阴影、增大间距与圆角 - 页面初始化时立即加载版本号,修复直接进入 Sessions tab 时版本显示为 v-.-.- 的问题 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * style(dashboard): 重命名页签「Recent Active Sessions」为「Sessions」 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * style(dashboard): 增强 Success 列进度条底色对比度 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
将 Session 详情卡片的扁平网格布局重构为身份信息行 + 指标网格两层结构, 分离 Session ID/Device/Account 等身份字段与指标字段的展示区域, 新增 title 属性提供完整值悬浮提示,消除窄屏下的内容重叠与截断。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
- 调整 identity-row flex 比例,首项 2 其余 3,改善空间分配 - 将 Success Rate 与 Client 合并为 inline-pair 横向排列,减少纵向高度 - 移除 Sessions 卡片冗余标题(Tab 已提供上下文) - 修复 success-bar-fill display 属性确保正确渲染 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
移除 switchTab() 中的 tabLoaded 条件守卫,使每次在 Overview 与 Sessions 页签间切换时都触发 refresh(),而非仅首次访问时加载数据。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
- 身份行(Session ID/Device/Account)长值不再折行,超长部分以省略号截断 - 指标网格改为固定 8 列布局,确保所有指标在一行中均匀排列 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
将 Documentation Standards (Mermaid) 与 Reference Specifications (IEEE) 从 AGENTS.md 独立为术层内联引用,分别指向独立文件维护; 新增 docs/agents/reference-specifications.md 承载 IEEE 引用格式规范; 循证工程原则补充「最新」限定词,强调文献时效性。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* chore(logging): 将默认日志文件路径从项目根目录迁移至 .logs/ 子目录; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * docs(logging): 同步文档中的默认日志路径至 .logs/coding-proxy.log; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
- src/coding/proxy/logging/db.py: query_recent_sessions / query_session_profile 两条按 session_key 分组的聚合 SQL 中, 将 total_tokens 由 SUM(input + output) 修正为 SUM(input + output + cache_creation + cache_read), 与同文件 query_total_tokens_by_vendor / query_usage 已使用的全口径对齐, 消除 Sessions 页与 Overview 页之间的统计口径分裂; - tests/test_session_aware.py: test_query_recent_sessions_basic / test_query_session_profile_found 中追加 cache_creation_tokens 与 cache_read_tokens 入参及完整口径断言, 锁定回归; - docs/issue.md: 追加 Issue 档案, 记录 SQL 聚合层 SSOT 缺失导致的口径漂移, 沉淀向 usage_log 增列后必须审计所有 SUM 表达式的防范经验. 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* docs(structure): 梳理清减 docs/ 结构并兑现 AGENTS.md 引用承诺; - 修复 docs/arch/vendors.md 第 4 行的 framework.md 断链路径(./ → ../) - 补全 docs/agents/knowledge-map.md 占位为真正的项目文档索引(兑现 AGENTS.md L51 承诺) - 新建 docs/agents/browser-validation.md 完整浏览器验证协议(兑现 AGENTS.md L49 承诺) - 迁移 docs/ci-cd.md 至 docs/ops/ 子目录,建立运维向正交分类 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(docs): 移除不可导航的 #L<行号> 锚点链接; GitHub Markdown 渲染视图不为列表项生成行号锚点,#L49/#L51 等后缀无法定位到目标位置。 统一改为 §名称 前缀 + 纯文件链接,保留人眼可读性。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* feat(zhipu): 为 429 Rate Limit 添加指数退避重试挽回机制; ZhipuVendor 遇到 HTTP 429 时自动重试最多 5 次(1 初始 + 4 重试), 采用指数退避 + Full Jitter 策略(1s → 2s → 4s → 8s), 优先尊重 server retry-after header 提供的恢复时间建议。 重试对 executor 完全透明,仅在全部重试耗尽后才触发 failover。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(zhipu): 修复 send_message_stream yield-in-try-except 及测试死代码; - 将 send_message_stream 中 yield 移至 try/except 外部,避免 async generator 意外捕获外部 athrow 抛入的 HTTPStatusError; - 删除 test_stream_429_retries_and_succeeds 中未生效的首段 mock 代码。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* fix(zhipu): 修复首选 tier 语义拒绝降级问题,剥离 GLM 不支持的 Anthropic 扩展参数; 根因:zhipu 作为首选 tier 时 source_vendor=None,不触发跨供应商转换通道, 原始请求体含 cache_control/thinking/reasoning_effort 等 GLM 不支持的参数, 导致 400 invalid_request_error 降级到 copilot 浪费 token。 改动: - 新增 normalize_for_zhipu() 共享清洗函数作为 zhipu 兼容性单一事实源 - ZhipuVendor._prepare_request() 覆写应用 GLM 兼容性清洗 - 重构 prepare_copilot_to_zhipu() 委托给 normalize_for_zhipu() 消除重复 - 增强 execute_message 语义拒绝日志输出 error_message 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * revert(zhipu): 回退错误的 _prepare_request 参数清洗,实测验证 GLM 原生支持 thinking 并静默忽略 cache_control/reasoning_effort; 通过 curl 实证测试确认 zhipu Anthropic 兼容端点对以下参数的处理: - thinking 参数:200 OK,GLM 原生支持并返回 thinking content block - cache_control 字段:200 OK,被静默忽略(GLM 使用隐式自动缓存) - reasoning_effort 参数:200 OK,被静默忽略 - extended_thinking 参数:200 OK,被静默忽略 - redacted_thinking block:200 OK,被静默忽略 - 空 messages:400 invalid_request_error [1214][输入不能为空] 根因需进一步诊断:保留 normalize_for_zhipu 共享函数和 executor 日志增强, 待收集到 zhipu 返回的完整错误响应体后定位真正的 400 原因。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](${S}) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * docs(vendor-channels): 修正 normalize_for_zhipu 注释与 docstring,消除与 zhipu.py 实测结论的矛盾; _ZHIPU_UNSUPPORTED_PARAMS 注释错误声称参数会导致 400 错误,实际 GLM 原生支持 thinking 并静默忽略其余参数; docstring 声称服务于"首选 tier 场景"但无此类调用方,已更正为仅描述跨供应商转换通道的实际用途。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
在 execute_message 和 execute_stream 的 semantic rejection 日志中 附加请求体参数快照(thinking/extended_thinking/reasoning_effort 顶层参数、 会话历史中 thinking blocks 数量、cache_control 存在情况、模型名、消息数), 用于定位 zhipu glm-4.7 [1210] 参数校验拒绝的具体祸根参数。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* feat(session): 从首个用户消息提取 Session 标题并在 Dashboard 展示 - 新增 session_meta 表持久化 session 级标题元数据 - 检测新 session 时从首个 user 消息提取文本截取前 30 字作为标题 - get_or_create_record() 返回 is_new 标志标识首次会话 - Dashboard Sessions 列表新增 Title 列,展开详情同步展示 - 更新相关测试适配返回值变更 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(test): 补全 get_or_create_record 返回类型变更遗漏的测试调用点; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
Claude Code 会在首条 user 消息 content 中拼接多个 <system-reminder> / <user-preferences> 等系统注入块,导致原 _extract_session_title 抽取出的 标题在不同会话间高度同质,丧失辨识度。 - 新增 _sanitize_user_text,基于白名单剥离 system-reminder、user-preferences、 local-command-stdout/stderr、bash-input/stdout/stderr、ide_selection、 stdin、system_instruction 等 CC 注入标签,折叠空白后返回真实用户输入; - 优先识别 slash command (<command-name>/<command-args>),合成"命令 + 参数" 式标题,避免命令式会话标题为空; - 重写 _extract_session_title,跳过清洗后为空的 user 文本 part,自动 fallback 到下一个有真实内容的 part; - 补充 20 个单元测试覆盖噪声剥离、slash command、空白折叠、截断、边界场景。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* diag(executor): 为语义拒绝路径增加请求体可疑参数诊断日志; 在 execute_message 和 execute_stream 的 semantic rejection 日志中 附加请求体参数快照(thinking/extended_thinking/reasoning_effort 顶层参数、 会话历史中 thinking blocks 数量、cache_control 存在情况、模型名、消息数), 用于定位 zhipu glm-4.7 [1210] 参数校验拒绝的具体祸根参数。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * diag(executor): 扩展语义拒绝诊断日志覆盖范围至 system/tools/sampling/metadata/content_types 等维度 PR #244 部署后的诊断日志反转了原推断:失败请求均不含 thinking/cache_control, 说明祸根在更细粒度的参数。扩展 _build_semantic_rejection_diagnostic 函数: 新增维度(仅存在时输出): - system 形态(string/blocks + cache_control 计数) - tools 数量 + tool_choice 形态 - 采样参数(max_tokens/temperature/top_p/top_k/stop_sequences) - stream / metadata_keys - messages.content 类型分布(含 string content) - 请求体字节数估算(json.dumps) 新增 14 个单元测试(TestBuildSemanticRejectionDiagnostic)覆盖各字段组合 与真实失败请求形态。所有测试通过(1478 passed)。 * docs(agents): 记录 zhipu [1210] 诊断阶段进展(证据反转 + Step 1 v2) * build(version): 版本号升级至 0.4.1a6;
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* feat(zhipu): 新增每模型并发限制,默认 3 个并行请求 FIFO 排队; - 新增 ZhipuConcurrencyConfig 与 ModelConcurrencyLimiter,按映射后模型名(如 glm-5v-turbo / glm-5.1 / glm-4.5-air)维护独立 asyncio.Semaphore,槽位满时新请求 FIFO 排队等待; - ZhipuVendor 流式与非流式入口共用同一信号量,并与既有 429 重试机制兼容(重试期间持续占用槽位); - VendorConfig 新增 concurrency 字段,由工厂转发至 ZhipuConfig,未配置时回退默认 default=3,concurrency=None 完全禁用限流; - 同步更新 docs/arch/config-reference.md 与 CHANGELOG.md,新增 18 项专项测试(含配置层、限制器单元、流式/非流式集成与异常释放)。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(zhipu): 将 concurrency 注册到 _ZHIPU_FIELDS 独占字段集合,确保非 zhipu 供应商误配时触发 warning; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* diag(executor): 为语义拒绝路径增加请求体可疑参数诊断日志; 在 execute_message 和 execute_stream 的 semantic rejection 日志中 附加请求体参数快照(thinking/extended_thinking/reasoning_effort 顶层参数、 会话历史中 thinking blocks 数量、cache_control 存在情况、模型名、消息数), 用于定位 zhipu glm-4.7 [1210] 参数校验拒绝的具体祸根参数。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * diag(executor): 扩展语义拒绝诊断日志覆盖范围至 system/tools/sampling/metadata/content_types 等维度 PR #244 部署后的诊断日志反转了原推断:失败请求均不含 thinking/cache_control, 说明祸根在更细粒度的参数。扩展 _build_semantic_rejection_diagnostic 函数: 新增维度(仅存在时输出): - system 形态(string/blocks + cache_control 计数) - tools 数量 + tool_choice 形态 - 采样参数(max_tokens/temperature/top_p/top_k/stop_sequences) - stream / metadata_keys - messages.content 类型分布(含 string content) - 请求体字节数估算(json.dumps) 新增 14 个单元测试(TestBuildSemanticRejectionDiagnostic)覆盖各字段组合 与真实失败请求形态。所有测试通过(1478 passed)。 * docs(agents): 记录 zhipu [1210] 诊断阶段进展(证据反转 + Step 1 v2) * build(version): 版本号升级至 0.4.1a6; * fix(zhipu): 兼容转换 thinking.type=adaptive 为 GLM 支持的 enabled 格式,修复 [1210] 语义拒绝 基于 2026-05-26 16:30–16:31 日志证据(8 次连续拒绝均含 thinking.type=adaptive), 在 ZhipuVendor._prepare_request 中实现兼容转换: - adaptive → enabled(budget=16000):保留 thinking 能力,使用 GLM 原生确认支持的格式 - 新增 _build_zhipu_request_snapshot 诊断快照(成功/失败统一格式,可 diff 对比) - 扩展语义拒绝日志错误体截断(200→500 字符),保留完整字段级诊断 - metadata 暂不处理,待进一步诊断确认兼容性 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(executor): 删除旧版重复定义的 _build_semantic_rejection_diagnostic 函数 Step 1 v2 扩展版本与 Step 1 旧版本同名重复定义,Python 运行时后者覆盖前者 不报错但旧版成为死代码。删除旧版仅保留扩展版本。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
* feat(concurrency): 支持运行时动态修改每模型并行度 (#251) 重构 ModelConcurrencyLimiter,以自定义 _ConcurrencySlot 替代 asyncio.Semaphore, 支持 set_limit() 动态调整上限。新增 PUT /api/concurrency 端点,Dashboard Model Calling 模块中 limit 数字可直接点击编辑(1-20),无需重启进程。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com> * fix(dashboard): 修复 Escape 取消编辑后仍提交并行度的问题 Escape 取消时 restore() 移除 input 元素会触发浏览器 blur 事件, 导致 blur handler 通过 setTimeout 在 50ms 后调用 submit() 将已取消 的值发送到服务端。引入 _cancelled 标志在 Escape 时置位,submit 入口 及 blur 回调中双重守卫,确保取消操作不被忽略。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
11 个冲突文件全部解决: - 10 个文件采用 feature/1.x.x 版本(CHANGELOG、pyproject.toml、vendor_channels.py、 db.py、dashboard.py、test_router_executor.py、test_session_aware.py、 test_vendor_channels.py、uv.lock、docs/issue.md) - AGENTS.md 手动合入 master 新增的"深入贴近事实"条目 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
v0.5.0 - 2026-05-27
Important
🚀 Model Calling 实时状态!
模型并发与排队深度一目了然,运行时动态调整每个模型并行度,预防 vendor 侧的 429 幺蛾子。
✨ 核心亮点
🔧 更多特性