Wesley Liddick
0236b97d49
Merge pull request #1134 from yasu-dev221/fix/openai-compat-prompt-cache-key
...
fix(openai): add fallback prompt_cache_key for compat codex OAuth requests
2026-03-19 22:02:08 +08:00
Wesley Liddick
26f6b1eeff
Merge pull request #1142 from StarryKira/fix/failover-exhausted-upstream-status-code
...
fix: record original upstream status code when failover exhausted (#1128)
2026-03-19 21:56:58 +08:00
Wesley Liddick
dc447ccebe
Merge pull request #1153 from hging/main
...
feat: add ungrouped filter to account
2026-03-19 21:55:28 +08:00
Wesley Liddick
7ec29638f4
Merge pull request #1147 from DaydreamCoding/feat/persisted-page-size
...
feat(frontend): 分页 pageSize 持久化到 localStorage,刷新后自动恢复
2026-03-19 21:53:54 +08:00
Wesley Liddick
4c9562af20
Merge pull request #1148 from weak-fox/ci/sync-version-file-after-release
...
ci: sync VERSION file back to default branch after release
2026-03-19 21:46:45 +08:00
Wesley Liddick
71942fd322
Merge pull request #1132 from touwaeriol/pr/virtual-scroll
...
perf(frontend): add virtual scrolling to DataTable
2026-03-19 21:46:16 +08:00
Wesley Liddick
550b979ac5
Merge pull request #1146 from DaydreamCoding/fix/test-403-error-status
...
fix(test): 测试连接收到 403 时将账号标记为 error 状态
2026-03-19 21:44:57 +08:00
Wesley Liddick
3878a5a46f
Merge pull request #1164 from GuangYiDing/fix/normalize-tool-parameters-schema
...
fix: Anthropic tool schema 转换时补充缺失的 properties 字段
2026-03-19 21:44:18 +08:00
Rose Ding
e443a6a1ea
fix: 移除 staticcheck S1005 警告的多余 blank identifier
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-19 21:14:29 +08:00
Rose Ding
963494ec6f
fix: Anthropic tool schema 转 Responses API 时补充缺失的 properties 字段
...
当 Claude Code 发来的 MCP tool 的 input_schema 为 {"type":"object"} 且缺少
properties 字段时,OpenAI Codex 后端会拒绝并报错:
Invalid schema for function '...': object schema missing properties.
新增 normalizeToolParameters 函数,在 convertAnthropicToolsToResponses 中
对每个 tool 的 InputSchema 做规范化处理后再赋给 Parameters。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-19 21:08:20 +08:00
shaw
525cdb8830
feat: Anthropic 账号被动用量采样,页面默认展示被动数据
...
从上游 /v1/messages 响应头被动采集 5h/7d utilization 并存储到
Account.Extra,页面加载时直接读取本地数据而非调用外部 Usage API。
用户可点击"查询"按钮主动拉取最新数据,主动查询结果自动回写被动缓存。
后端:
- UpdateSessionWindow 合并采集 5h + 7d headers 为单次 DB 写入
- 新增 GetPassiveUsage 从 Extra 构建 UsageInfo (复用 estimateSetupTokenUsage)
- GetUsage 主动查询后 syncActiveToPassive 回写被动缓存
- passive_usage_ 前缀注册为 scheduler-neutral
前端:
- Anthropic 账号 mount/refresh 默认 source=passive
- 新增"被动采样"标签和"查询"按钮 (带 loading 动画)
2026-03-19 17:42:59 +08:00
shaw
a6764e82f2
修复 OAuth/SetupToken 转发请求体重排并增加调试开关
2026-03-19 16:56:18 +08:00
Hg
8027531d07
feat: add ungrouped filter to account
2026-03-19 15:42:21 +08:00
weak-fox
30706355a4
ci: sync VERSION file back to default branch after release
2026-03-19 12:53:28 +08:00
QTom
dfe99507b8
feat(frontend): 分页 pageSize 持久化到 localStorage,刷新后自动恢复
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 12:44:03 +08:00
QTom
c1717c9a6c
fix(test): 测试连接收到 403 时将账号标记为 error 状态
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 12:36:40 +08:00
haruka
1fd1a58a7a
fix: record original upstream status code when failover exhausted ( #1128 )
...
When all failover accounts are exhausted, handleFailoverExhausted maps
the upstream status code (e.g. 403) to a client-facing code (e.g. 502)
but did not write the original code to the gin context. This caused ops
error logs to show the mapped code instead of the real upstream code.
Call SetOpsUpstreamError before mapUpstreamError in all failover-
exhausted paths so that ops_error_logger captures the true upstream
status code and message.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 11:15:02 +08:00
jimmy-coder
fad07507be
fix(openai): inject stable compat prompt_cache_key for codex oauth chat-completions path
2026-03-19 03:24:31 +08:00
erio
a20c211162
perf(frontend): add virtual scrolling to DataTable
...
Replace direct row rendering with @tanstack/vue-virtual. The table
now only renders visible rows (~20) via padding <tr> placeholders,
eliminating the rendering bottleneck when displaying 100+ rows with
heavy cell components.
Key changes:
- DataTable.vue: integrate useVirtualizer (always-on), virtual row
template with measureElement for variable row heights, defineExpose
virtualizer/sortedData for external access, overflow-y/flex CSS
- useSwipeSelect.ts: dual-mode support via optional
SwipeSelectVirtualContext — data-driven row index lookup and
selection range when virtualizer is present, original DOM-based
path preserved for callers that don't pass virtualContext
2026-03-18 23:11:49 +08:00
Wesley Liddick
9f6ab6b817
Merge pull request #1090 from laukkw/main
...
fix(setup): align install validation and expose backend errors
v0.1.103
2026-03-18 16:23:06 +08:00
shaw
bf3d6c0e6e
feat: add 529 overload cooldown toggle and duration settings in admin gateway page
...
Move 529 overload cooldown configuration from config file to admin
settings UI. Adds an enable/disable toggle and configurable cooldown
duration (1-120 min) under /admin/settings gateway tab, stored as
JSON in the settings table.
When disabled, 529 errors are logged but accounts are no longer
paused from scheduling. Falls back to config file value when DB
is unreachable or settingService is nil.
2026-03-18 16:22:19 +08:00
Wesley Liddick
241023f3fc
Merge pull request #1097 from Ethan0x0000/pr/upstream-model-tracking
...
feat(usage): 新增 upstream_model 追踪,支持按模型来源统计与展示
2026-03-18 15:36:00 +08:00
Wesley Liddick
1292c44b41
Merge pull request #1118 from touwaeriol/worktree-fix/anti_mapping
...
feat: map claude-haiku-4-5 variants to claude-sonnet-4-6
2026-03-18 15:13:19 +08:00
Wesley Liddick
b4fce47049
Merge pull request #1116 from wucm667/fix/inject-site-title-in-html
...
fix: 直接访问或刷新页面时浏览器标签页显示自定义站点名称
2026-03-18 15:12:07 +08:00
Wesley Liddick
e7780cd8c8
Merge pull request #1117 from alfadb/fix/empty-text-block-retry
...
fix: 修复空 text block 导致上游 400 错误未被重试捕获的问题
2026-03-18 15:10:46 +08:00
erio
af96c8ea53
feat: map claude-haiku-4-5 variants to claude-sonnet-4-6
...
Update model mapping target for claude-haiku-4-5 and
claude-haiku-4-5-20251001 from claude-sonnet-4-5 to claude-sonnet-4-6.
Includes migration script, default constants, and test updates.
2026-03-18 15:03:24 +08:00
alfadb
7d26b81075
fix: address review - add missing whitespace patterns and narrow error matching
2026-03-18 14:31:57 +08:00
alfadb
b8ada63ac3
fix: strip empty text blocks in retry filter and fix error pattern matching
...
Empty text blocks ({"type":"text","text":""}) cause Anthropic upstream to
return 400: "text content blocks must be non-empty". This was not caught
by the existing error detection pattern in isThinkingBlockSignatureError,
nor handled by FilterThinkingBlocksForRetry.
- Add empty text block stripping to FilterThinkingBlocksForRetry
- Fix isThinkingBlockSignatureError to match new Anthropic error format
- Add fast-path byte patterns to avoid unnecessary JSON parsing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 14:20:00 +08:00
Ethan0x0000
cfaac12af1
Merge upstream/main into pr/upstream-model-tracking
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-03-18 14:16:50 +08:00
wucm667
6028efd26c
test: 添加 injectSiteTitle 函数的单元测试
2026-03-18 14:13:52 +08:00
shaw
62a566ef2c
fix: 修复 config.yaml 以只读方式挂载时容器启动失败 ( #1113 )
...
entrypoint 中 chown -R /app/data 在遇到 :ro 挂载的文件时报错退出,
添加错误容忍处理;同时去掉 compose 文件注释中的 :ro 建议。
2026-03-18 14:11:51 +08:00
wucm667
94419f434c
fix: 直接访问或刷新页面时浏览器标签页显示自定义站点名称
...
后端 HTML 注入时同步替换 <title> 标签为自定义站点名称,
前端 fetchPublicSettings 完成后重新设置 document.title,
解决路由守卫先于设置加载导致标题回退为默认值的时序问题。
2026-03-18 14:02:00 +08:00
Wesley Liddick
21f349c032
Merge pull request #1095 from LvyuanW/lvyuan/dev
...
fix(admin/accounts): reset edit modal state on reopen
v0.1.102
2026-03-18 11:37:07 +08:00
Wesley Liddick
28e36f7925
Merge pull request #1096 from Ethan0x0000/pr/fix-idle-usage-windows
...
fix(ui): 会话窗口空闲时显示“现在”,避免重置时间缺失
2026-03-18 11:32:50 +08:00
Wesley Liddick
6c02076333
Merge pull request #1106 from geminiwen/feat/subscription-platform-filter
...
feat: add platform type filter to subscription management
2026-03-18 11:32:35 +08:00
shaw
7414bdf0e3
fix: 修复 hotpath 测试中 metadata.user_id 格式不合法导致 CI 失败
...
测试数据使用的 session ID "abc-123" 不符合 ParseMetadataUserID
要求的 36 字符 UUID 格式,替换为合法 UUID。
2026-03-18 11:31:32 +08:00
Wesley Liddick
e6326b2929
Merge pull request #1108 from DaydreamCoding/feat/admin-group-capacity-and-usage
...
feat(admin): 分组管理列表新增用量、账号分类与容量列
2026-03-18 11:12:43 +08:00
Wesley Liddick
17cdcebd04
Merge pull request #1109 from GuangYiDing/feat/subscription-guide
...
feat(subscriptions): 订阅管理页面添加教程指南弹窗
2026-03-18 11:12:33 +08:00
shaw
a14babdc73
fix: 兼容 Claude Code v2.1.78+ 新 JSON 格式 metadata.user_id
...
Claude Code v2.1.78 起将 metadata.user_id 从拼接字符串改为 JSON:
旧: user_{hex}_account_{uuid}_session_{uuid}
新: {"device_id":"...","account_uuid":"...","session_id":"..."}
新增集中解析/格式化模块 metadata_userid.go:
- ParseMetadataUserID: 自动识别两种格式,提取 DeviceID/AccountUUID/SessionID
- FormatMetadataUserID: 根据 UA 版本输出对应格式(>= 2.1.78 输出 JSON)
- ExtractCLIVersion: 从 UA 提取版本号,消除与 ClaudeCodeValidator.ExtractVersion 的重复
修改消费者统一使用新模块:
- claude_code_validator: 用 ParseMetadataUserID 替代只匹配旧格式的 userIDPattern
- identity_service: RewriteUserID/WithMasking 增加 fingerprintUA 参数,
解析用 ParseMetadataUserID,输出用 FormatMetadataUserID(版本感知)
- gateway_service: GenerateSessionHash 用 ParseMetadataUserID 提取 session_id,
buildOAuthMetadataUserID 用 FormatMetadataUserID 输出版本匹配格式,
两处 RewriteUserIDWithMasking 调用传入 fp.UserAgent
- account_test_service: generateSessionString 改用 FormatMetadataUserID,
自动跟随 DefaultHeaders UA 版本
删除三个旧正则: userIDPattern, userIDRegex, sessionIDRegex
统一 hex 匹配为 [a-fA-F0-9],修复旧 userIDRegex 只匹配小写的不一致
2026-03-18 11:08:58 +08:00
Rose Ding
aadc6a763a
feat(subscriptions): 订阅管理页面添加教程指南弹窗
...
在订阅管理页面工具栏添加教程指南按钮(? 图标),点击弹出模态框,
引导管理员完成订阅功能的完整使用流程:
- 步骤一:创建订阅分组(含跳转分组管理链接)
- 步骤二:分配订阅给用户(搜索用户、选择分组、设置有效期)
- 步骤三:管理已有订阅(调整/重置配额/撤销操作说明表格)
- 底部提示:说明下拉列表为空时的解决方案
弹窗样式参照 BackupView 的 R2 Guide 模态框实现,保持 UI 一致性。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-18 10:49:41 +08:00
Rose Ding
f16af8bf88
feat(i18n): 添加订阅管理教程指南英文翻译
...
在 en.ts 中为订阅管理页面新增 guide 相关翻译词条,
与中文翻译保持结构一致,支持中英文切换。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-18 10:49:32 +08:00
Rose Ding
5ceaef4500
feat(i18n): 添加订阅管理教程指南中文翻译
...
在 zh.ts 中为订阅管理页面新增 guide 相关翻译词条,包括:
- 教程弹窗标题与副标题
- 三步操作引导文案(创建分组、分配订阅、管理订阅)
- 操作说明表格(调整/重置配额/撤销)
- 底部提示信息
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-18 10:49:13 +08:00
Gemini Wen
1ac7219a92
fix: add missing platform parameter to List calls in integration tests
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 10:35:03 +08:00
QTom
d4cc9871c4
feat(admin): 分组管理新增容量列(并发/会话/RPM 实时聚合)
...
复用 GroupCapacityService,在 admin 分组列表中添加容量列,
显示每个分组的实时并发/会话/RPM 使用量和上限。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 10:06:35 +08:00
QTom
961c30e7c0
feat(admin): 分组管理列表新增用量列与账号数分类
...
分组管理列表增强:
1. 今日/累计用量列:
- 新增独立端点 GET /admin/groups/usage-summary
- 一次查询返回所有分组的今日费用和累计费用(actual_cost)
- 前端异步加载后合并显示在分组列表中
2. 账号数区分可用/限流/总量:
- 将账号数列从单一总量改为 badge 内多行展示
- 可用: active + schedulable 的账号数(绿色)
- 限流: rate_limit/overload/temp_unschedulable 的账号数(橙色,无限流时隐藏)
- 总量: 全部关联账号数
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 10:06:35 +08:00
Gemini Wen
13e85b3147
fix: update remaining test stubs for List interface signature
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 09:35:08 +08:00
Gemini Wen
50a3c7fa0b
feat: add platform type filter to subscription management page
...
Add a platform filter dropdown to the admin subscriptions view, allowing
filtering subscriptions by platform (Anthropic, OpenAI, Gemini, etc.)
through the group association.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 09:23:19 +08:00
Ethan0x0000
bd9d2671d7
chore(deps): go mod tidy to remove stale indirect dependencies
2026-03-17 20:46:12 +08:00
Ethan0x0000
62b40636e0
feat(frontend): display upstream model in usage table and distribution charts
...
Show upstream model mapping (requested -> upstream) in UsageTable with arrow notation. Add requested/upstream/mapping source toggle to ModelDistributionChart with lazy loading — only fetches data when user switches tab, with per-source cache invalidation on filter changes. Include upstream_model column in Excel export and i18n for en/zh.
2026-03-17 19:26:48 +08:00
Ethan0x0000
eeff451bc5
test(backend): add tests for upstream model tracking and model source filtering
...
Cover IsValidModelSource/NormalizeModelSource, resolveModelDimensionExpression SQL expressions, invalid model_source 400 responses on both GetModelStats and GetUserBreakdown, upstream_model in scan/insert SQL mock expectations, and updated passthrough/billing test signatures.
2026-03-17 19:26:30 +08:00