wucm667
9f1effd71c
fix(admin): preserve quota limits on partial group updates
2026-08-30 16:36:13 +08:00
Long Li
57c76584a6
fix(codex): advertise priority tier for fast models
2026-08-30 14:21:08 +09:00
Ritel-T
82105f260a
fix(billing): resolve shadow credential tier contract
2026-08-30 13:40:37 +09:00
Ritel-T
50ad6e2e50
fix(billing): narrow Codex OAuth default exception
2026-08-30 13:40:19 +09:00
Ritel-T
f323d84644
test(billing): cover Codex OAuth usage pricing
2026-08-30 13:07:33 +09:00
Ritel-T
3a9070359b
fix(billing): scope Codex OAuth tier trust
2026-08-30 13:07:21 +09:00
Ritel-T
d39fc491ec
test(openai): cover websocket tier separation
2026-08-30 13:07:07 +09:00
Ritel-T
2b8cb628b6
fix(openai): preserve tiers in messages chat fallback
2026-08-30 13:06:45 +09:00
Ritel-T
8b4b3f4a94
fix(openai): preserve tiers in responses chat fallback
2026-08-30 13:06:32 +09:00
Ritel-T
624e4eef64
fix(openai): separate outbound and observed tiers
2026-08-30 13:06:11 +09:00
wucm667
a3bbf33c05
fix(monitor): scope groups by user access
2026-08-30 09:28:40 +08:00
wucm667
7c616db07a
fix(openai-ws): bridge oversized passthrough requests
2026-08-30 08:41:08 +08:00
Clansty
5fea83dcae
fix: 修复429未耗尽额度仍触发账号退避
...
- 关闭429默认回避时不再创建OAuth运行时冷却
- 仅在x-codex窗口达到100%时使用上游重置时间
- 补充未耗尽额度和关闭开关的回归测试
2026-08-30 00:02:14 +08:00
alfadb
b5827cfd54
fix(pricing): align DeepSeek billing with official peak/off-peak rates
...
同步 DeepSeek 官方峰谷价格与模型定价。
2026-08-29 17:30:23 +08:00
m11y
ea4291a92c
fix(anthropic): scope Fable scheduling threshold to Fable models
...
让 Fable 7d_oi 调度阈值仅限制 Fable 模型族,不暂停整个 Anthropic 账号。
2026-08-29 17:30:18 +08:00
101Harry
32ac921f24
fix(anthropic): avoid Fable OAuth system prompt refusal
...
修复 Fable OAuth 请求因系统提示词形态导致空响应的问题。
2026-08-29 17:29:30 +08:00
Ryan Chou
eb4237a2b0
fix(billing): 渠道定价对带后缀的模型名不再被官方兜底价覆盖
...
修复带后缀模型无法命中渠道自定义定价的问题。
2026-08-29 17:29:21 +08:00
wucm667
c31fe2ed9e
fix(admin): preserve saved SMTP TLS mode in test endpoints
...
保留测试邮件端点已保存的 SMTP TLS 配置,区分省略与显式 false。
2026-08-29 17:28:00 +08:00
shaw
804679d996
fix(openai): preserve model scope on stream failover
2026-08-29 15:25:10 +08:00
shaw
571d1e1d9b
fix(openai): isolate websocket semantic rate limits
2026-08-29 11:14:54 +08:00
shaw
3c22e78af0
fix(openai): preserve Spark quota reset semantics
2026-08-29 11:08:01 +08:00
shaw
5d9c7abed5
fix(openai): scope Spark quota 429 to model
2026-08-29 09:57:08 +08:00
Wesley Liddick
ac18c588c8
Merge PR #6165
...
修复上游倍率探测导致账号列表整页刷新的问题
2026-08-29 09:12:05 +08:00
Wesley Liddick
b83284071a
Merge PR #5348
...
fix(subscription): 周/月窗口展示的重置时间与实际推进锚点对齐
2026-08-29 09:10:07 +08:00
Wesley Liddick
fd13c72e95
Merge PR #6330
...
feat(zhipu): support team GLM Coding Plan usage query
2026-08-29 09:08:42 +08:00
Wesley Liddick
3c2e9a43b9
Merge PR #5860
...
fix(antigravity): preserve mixed built-in chat tools
2026-08-29 09:07:27 +08:00
Wesley Liddick
ca319d09f2
Merge PR #6280
...
fix(update): strip hyphenated pre-release/custom suffix in version comparison
2026-08-29 09:06:10 +08:00
Wesley Liddick
46598dd491
Merge PR #6306
...
fix(openai): emit pre-output SSE keepalive on the /v1/responses passthrough path
2026-08-29 09:04:46 +08:00
Wesley Liddick
3045b3ade1
Merge PR #6316
...
fix(openai): honor Claude Code session id for messages sticky routing
2026-08-29 09:03:14 +08:00
Wesley Liddick
25dc5742ea
Merge PR #6332
...
fix(monitor): 配额抓取在 singleflight 执行体内重查缓存,消除重复上游查询
2026-08-29 09:01:15 +08:00
Wesley Liddick
6506c0ea68
Merge PR #6343
...
fix(gateway): preserve Anthropic tool arguments
2026-08-29 09:00:56 +08:00
RayWangX
5688bcba91
fix(openai): honor Claude Code session for messages sticky routing
2026-08-29 08:31:15 +08:00
Jarl
1a61eb7151
test(usage): update compaction API contracts
2026-08-28 23:32:11 +08:00
Jarl
1cc6999ada
feat(usage): track native compaction requests
2026-08-28 23:32:11 +08:00
风起
88cb79d8b3
fix(grok): honor client prompt_cache_key over X-Grok-Conv-Id for cache identity
...
grok-build CLI recap-style side-calls (turn-summary / title-refresh) send
a fresh per-call X-Grok-Conv-Id label but set body prompt_cache_key to
the parent session id, so a direct xAI connection shares the main turn's
server-side prompt cache prefix.
sub2api's explicitGrokCacheSeed preferred X-Grok-Conv-Id over the body
key, which fragmented the cache identity on every side-call and forced a
full-price replay of the whole conversation (~300K+ tokens each, ~2.3%
cache hit rate observed over 44 side-calls / 4.9M input tokens in 7
days — about a third of all grok-4.6 input).
Priority is now: CC session > generic session headers > body
prompt_cache_key > X-Grok-Conv-Id > explicitKey > previous_response_id.
IDE header-stability tests updated; new regression test locks in the
side-call/parent key-sharing contract.
2026-08-28 21:56:22 +08:00
Ryan Chou and Claude Opus 5
32ad1dcdce
fix(subscription): 周/月窗口展示的重置时间与实际推进锚点对齐
...
订阅首窗初始化在开通日零点时,automaticWindowStartAt 会把实际推进锚点修正为
StartsAt,但展示层(calculateProgress / WeeklyResetTime / MonthlyResetTime)
仍按窗口起点+周期计算,导致仪表盘显示的重置时间早于实际重置时间(差值 =
StartsAt 的时分秒)。用户在显示的重置时间过后请求仍会收到 429
WEEKLY_LIMIT_EXCEEDED。
抽出 windowResetAnchor 供推进与展示共用,保证两者恒一致。非 legacy 锚点
(手动重置或已推进过的窗口)保持权威,不做修正。
日窗口不在本 PR 范围内:#5380 已把日额度改为按日历日对齐(DailyResetTime =
窗口起点所在日的次日 0 点),与周/月的期限对齐滚动窗口语义不同,不共用本修正。
附一个守护用例钉死这条边界。
Fixes #5348
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 21:46:44 +08:00
wucm667
da10822d7d
fix(gateway): preserve Anthropic tool arguments
2026-08-28 19:08:26 +08:00
wucm667
5345881b1d
Merge remote-tracking branch 'upstream/main' into fix/issue-5843-antigravity-mixed-tools
...
# Conflicts:
# backend/internal/repository/group_usage_rollup_trigger_integration_test.go
2026-08-28 17:36:43 +08:00
wucm667
c5ff640dff
test(repository): pin rollup trigger session timezone
2026-08-28 17:34:42 +08:00
li
e652f6e20a
fix(monitor): 配额抓取在 singleflight 执行体内重查缓存,消除重复上游查询
...
ChannelMonitorQuotaFetcher.Fetch 顶部的 cachedSnapshot 与随后的 flight.DoChan
之间存在一个窗口:goroutine A 判定缓存未命中之后、真正入队之前,goroutine B 的
flight 可能已经跑完、写好缓存,并且它的 singleflight key 也已被摘掉。A 于是不会
并入 B 的那次飞行,而是另起一个新 flight,对同一账号再打一次上游——正是
singleflight 想要消除的重复查询。
多个监控可以关联同一账号,interval 最小 15s,国产配额服务自身无缓存,
这条路径的全部意义就是防止打爆上游配额端点(见文件头注释)。
修复:把 flight 执行体提为具名方法 fetchShared,开头重查一次缓存。
这次重查必然命中,所以合并是确定的而非尽力而为:storeSnapshot 发生在执行体
返回之前,singleflight 删 key 发生在返回之后,因此「能新起一次飞行」必然蕴含
「上一次的快照已经可见」。
该窗口也是主线 CI 上 TestQuotaFetcher_ConcurrentFetchesShareSingleFlight
间歇性失败(expected: 1, actual: 2)的成因,本地 -count=900 复现 3 次(约 0.33%),
带修复后 -count=1700 零失败。
新增两条确定性用例:既有并发用例只能以约 1/300 的概率撞上该窗口,故直接钉住
窗口本身——fetchShared 就是 flight 的执行体,直接调用它等价于「已越过顶层缓存
判定、拿到属于自己的那次飞行」这一状态。另一条守住重查不得退化成无条件短路:
缓存过期后必须照常回源。
2026-08-28 16:49:49 +08:00
wall-wxk
c4e46c3be8
feat(zhipu): support team GLM Coding Plan usage query
...
Team GLM Coding Plan accounts fail the quota probe with
"当前用户不存在coding plan" because the personal-plan query path
does not carry team context.
- quota probe: when credentials contain zhipu_organization, switch the
Zhipu quota endpoint to the team variant (?type=2 + bigmodel-organization
/ bigmodel-project headers); personal plans keep the existing path
- account create/edit modals: optional organization/project ID inputs for
zhipu coding-plan accounts, persisted in credentials; edit modal
backfills them and clears back to personal plan when emptied
- add a click-to-open tooltip tutorial (zh/en) explaining how to grab the
IDs from the bigmodel.cn web console via the /api/biz/v1/organization
network request, with a sample URL mapping org-/proj_ segments to fields
2026-08-28 16:36:30 +08:00
Wesley Liddick
7b693ae429
Merge pull request #6188 from JialinLiu-codedance/feat/usage-requested-reasoning-effort
...
feat(usage): 使用记录展示映射前的推理强度
2026-08-28 16:18:50 +08:00
Wesley Liddick
d4754c211a
Merge pull request #6291 from Whisper-stark/fix/grok-codex-responses
...
fix(grok): sanitize Codex Responses requests
2026-08-28 15:58:39 +08:00
Wesley Liddick
c8a6e93f33
Merge pull request #6310 from fengshao1227/fix/nonstreaming-terminal-failure-failover-v2
...
fix(openai): 非流式路径按流式同一套判定处理 HTTP 200 终止失败事件
2026-08-28 15:57:39 +08:00
Wesley Liddick
446042e518
Merge pull request #6309 from fengshao1227/fix/easypay-resolve-relative-payurl-qrcode
...
fix(payment): EasyPay 补全 mapi.php 回传的相对 payurl/qrcode
2026-08-28 15:57:10 +08:00
Wesley Liddick
1e6926cb9c
Merge pull request #6312 from fengshao1227/fix/openai-ws-client-close-not-account-failure
...
fix(openai): 入站 WS 的客户端正常关闭与断开不再计为账号故障
2026-08-28 15:56:34 +08:00
251392463
b4b5371640
fix(grok): preserve Responses vision tool output images
2026-08-28 15:38:04 +08:00
spongehah
6d339ec93b
fix: honor persisted cooldown when dropping in-process account blocks
...
- Treat TempUnschedulableUntil/RateLimitResetAt/OverloadUntil as source of truth during account selection
- Drop stale local account-level runtime blocks with generation+deadline CAS
- Leave model-scoped transient and Grok quota blocks unchanged
2026-08-28 14:38:15 +08:00
li
c83dced4ba
fix(openai): 入站 WS 的客户端正常关闭与断开不再计为账号故障
...
ingress WebSocket 收尾处只把 *service.OpenAIWSClientCloseError 且状态码为 1000
的情况认作正常关闭,其余全部落到 shouldReportOpenAIWSProxyAccountFailure ——
而它只排除 model-switch 与 session-preempted 两种。两种完全正常的结束因此被
误判为上游/账号故障:
- 客户端干净关闭:coder/websocket 直接回裸 coderws.CloseError{Code: 1000},
ReadOpenAIWSClientMessage 把 conn.Read 的错误原样返回,没有任何一层把它包成
*OpenAIWSClientCloseError,所以 errors.As 对该类型必然为假。
- 客户端中途断开:ReadOpenAIWSClientMessage 在 controlCtx.Done() 分支用
StatusGoingAway(1001) 收尾并以 context.Canceled 为 cause,「只认 1000」匹配不到。
两者都会走到 ReportOpenAIAccountScheduleResult(success=false),进而喂给
ObserveOpenAIAPIKeyHealthFailure 与 scheduler.ReportResult,累积到阈值即把上游
账号熔断出调度池——客户端按一次 Ctrl-C 就在扣上游账号的健康分。
同文件的 summarizeWSCloseErrorForLog 一直用 coderws.CloseStatus 读关闭码,就在
该判断之后 12 行被调用,于是同一条 WARN 会打印
close_status=1000(StatusNormalClosure) 的同时把账号记为故障。
失败归因的政策仓库早有明文:同包 failover_loop.go 的 failoverClientGone 写着
「客户端断开后 failover 必须静默终止……并被误报成账号耗尽」。本次把 WS ingress
补齐到同一条规矩。
判定收窄:只豁免 1000 与 context.Canceled。1001 不整类放行——网关也会因自身原因
用 GoingAway 收场,客户端取消那一支已由 context.Canceled 覆盖;
context.DeadlineExceeded 同样不放行,空闲超时那条本就被包成 1000 走前一个判据,
其余 deadline 是真实停滞。
Fixes #6105
2026-08-28 13:17:43 +08:00
Wesley Liddick
d674a04f2a
Merge branch 'main' into feat/per-user-public-group-access
2026-08-28 13:08:41 +08:00