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
chensunlai
ed12ea7163
fix(frontend): authenticate Codex API key mode inline
...
让 Codex API Key 模式在配置文件中正确发送 Bearer 鉴权并保留图像工具授权。
2026-08-29 17:29:26 +08:00
Ryan Chou
eb4237a2b0
fix(billing): 渠道定价对带后缀的模型名不再被官方兜底价覆盖
...
修复带后缀模型无法命中渠道自定义定价的问题。
2026-08-29 17:29:21 +08:00
Brisbanehuang
706b5676a6
fix(groups): show API error messages on create and update
...
保存分组失败时显示标准化 API 错误信息。
2026-08-29 17:28:20 +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
Wesley Liddick
987588eaa1
Merge pull request #6358 from Wei-Shaw/fix/openai-spark-model-429-rate-limit
...
fix(openai): scope Spark quota 429 to model
2026-08-29 15:44:37 +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
604360d1cc
Merge PR #6328
...
fix(frontend): 批量编辑显式提交 codex_fingerprint_mode=off,修复无法关闭指纹收敛
2026-08-29 09:02:25 +08:00
Wesley Liddick
25dc5742ea
Merge PR #6332
...
fix(monitor): 配额抓取在 singleflight 执行体内重查缓存,消除重复上游查询
2026-08-29 09:01:15 +08:00
Wesley Liddick
1136e290fd
Merge PR #6334
...
fix(payment): show selected currency in recharge rate
2026-08-29 09:01:06 +08:00
Wesley Liddick
6506c0ea68
Merge PR #6343
...
fix(gateway): preserve Anthropic tool arguments
2026-08-29 09:00:56 +08:00
Wesley Liddick
1323d1645d
Merge PR #6346
...
fix(keys): preserve Claude attribution headers
2026-08-29 09:00:46 +08:00
Wesley Liddick
f1d845c630
fix(grok): honor prompt cache key for side calls
...
fix(grok): honor client prompt_cache_key over X-Grok-Conv-Id so grok-build side-calls share the main-turn cache
2026-08-29 09:00:06 +08:00
RayWangX
5688bcba91
fix(openai): honor Claude Code session for messages sticky routing
2026-08-29 08:31:15 +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
c037766040
fix(keys): preserve Claude attribution headers
2026-08-28 20:42:58 +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
wucm667
02eee39ddf
fix(payment): show selected currency in recharge rate
2026-08-28 16:54:33 +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
li
0756c98102
fix(frontend): 批量编辑显式提交 codex_fingerprint_mode=off,修复无法关闭指纹收敛
...
批量编辑选「关闭(默认)」时,buildUpdatePayload 先 ensureExtra() 建出 extra
再 delete 掉唯一的键,payload 退化成 {account_ids, extra:{}},被后端
len(req.Extra) > 0 判为空更新,直接 400 "No updates provided";device/session/full
则正常。即便后端放行空 extra 也无济于事:批量更新走 JSONB 顶层合并
(extra = COALESCE(extra,'{}') || payload),删掉 payload 里的键只表示
「本次不更新该键」,清不掉账号上已有的 device/session/full。
根因是把 Create/Edit 的写法直接搬到了 Bulk:那两个表单提交完整 extra 对象、
后端 SetExtra 整体覆盖,删键确实等于清除;批量接口只合并增量键,两种持久化
语义不能共用同一套写法。
改为 off 也显式落键,与本函数里其它「关闭/清除」字段一致——codex_cli_only
直接落 false(EditAccountModal 相邻注释已写明「关闭时显式写 false,避免 extra
为空被后端忽略导致旧值无法清除」)、load_factor 落 0、proxy_id 落 0。
读取侧完全等价,不改变 #5610 定下的语义:codexFingerprintModeFromExtra 对
空值/非法值走 default 回落 off,对 "off" 命中同一分支;
ShouldEnsureCodexFingerprintSeedForExtraUpdates 也只在 device/session/full
时要种子,显式 off 不会触发种子创建。
顺带给「编辑该项」勾选框补 id(同区域 Select 早有 data-testid,兄弟开关
codex_cli_only 也有 id),否则新增用例无法定位该控件。
新增 3 条用例:主复现(默认 off + 勾选编辑 ⇒ 提交 codex_fingerprint_mode=off,
并断言 extra 非空以钉死 400 那个形状)、显式 opt-in 仍原样提交、未勾选时不写入该键。
Fixes #6327
2026-08-28 16:20:14 +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
423f895755
Merge pull request #6227 from OG-Wang/codex/promo-code-oauth-signup
...
fix(auth): pass registration promo codes to OAuth signup
2026-08-28 15:58:09 +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
Wesley Liddick
e866ff6ec4
Merge pull request #6303 from akihitohyh/feat/per-user-public-group-access
...
feat(admin): 支持为单个用户限制可访问的公开分组
2026-08-28 13:19:11 +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
Wesley Liddick
9b61c1bdd9
Merge pull request #6263 from zenor0/fix/openai-reset-usage-sync
...
fix(openai): refresh usage after quota reset
2026-08-28 13:08:33 +08:00
Wesley Liddick
add86cc3bc
Merge branch 'main' into fix/openai-reset-usage-sync
2026-08-28 12:57:48 +08:00
Wesley Liddick
dc332d141c
Merge pull request #6260 from feeeei/fix/anthropic
...
fix(gateway): Anthropic/Bedrock 传输层错误转 failover + 持久故障临时摘除账号
2026-08-28 12:57:41 +08:00
Wesley Liddick
59bb131df4
Merge branch 'main' into fix/anthropic
2026-08-28 12:47:15 +08:00
Wesley Liddick
443537daae
Merge pull request #6293 from specialpointcentral/fix/ws-v2-passthrough-cyber
...
fix(openai): detect cyber policy in ws v2 passthrough
2026-08-28 12:47:07 +08:00