Wesley Liddick
03ab687686
Merge pull request #5866 from wucm667/fix/issue-5863-scope-monitor-groups
...
fix: scope channel monitor groups by user access
2026-08-31 11:15:13 +08:00
Wesley Liddick
fbc69322af
Merge pull request #6254 from wucm667/fix/issue-6249-configurable-image-cooldown
...
feat(openai): configure image tool cooldown
2026-08-31 11:13:52 +08:00
Wesley Liddick
414489d152
Merge pull request #5469 from wucm667/fix/issue-5467-passthrough-http-bridge
...
fix(openai-ws): bridge oversized passthrough requests
2026-08-31 11:13:35 +08:00
Wesley Liddick
50a9dd7a64
Merge pull request #6386 from wucm667/fix/issue-6383-isolate-passthrough-ws
...
fix(openai): isolate passthrough websocket sessions
2026-08-31 11:13:16 +08:00
Wesley Liddick
a4156eea10
Merge pull request #6385 from wucm667/fix/issue-6381-preserve-quota-limits
...
fix(admin): preserve quota limits on partial group updates
2026-08-31 11:12:56 +08:00
wucm667
897faea333
fix(account): reset quota cooldown atomically
2026-08-31 09:12:09 +08:00
feeeei
0e08c39999
fix(openai-ws): remember rejected encrypted content across turns
...
invalid_encrypted_content 恢复此前只清理当次请求体:同一失效密文随客户
端维护的会话历史在后续每一轮重新出现,反复触发"整包被拒→剥离→重试/
重连"(#6382 生产观测 2h 内 251 次 recovery、273 次 WS 重连),既是
QoS 放大器也是内存压力放大器。
按会话记录被上游拒绝过的 encrypted_content SHA-256 摘要(lineage):
- OpenAIWSStateStore 新增会话级摘要绑定,TTL 复用 session sticky,
单会话 512 摘要为存储自保护,超出仅退化为既有单次 recovery
- 写点覆盖 forward WSv2 recovery、forward 非 WS 400 重试、ingress
error 事件、bridge 400/流内 error;读点在 forward 进场与 ingress/
bridge turn 循环入口按摘要预剥离,新密文摘要不同不受影响
- 只收剥离端可处理的项类型(reasoning/compaction/compaction_summary),
避免记入永远剥不掉的摘要后每轮空转解码
- replay 历史序列同步剥离,避免与已剥离的当前 input 项错位导致
prefix 复用失配
含端到端集成测试:turn1 上游拒绝即记录,turn2 上游收到的请求不再携带
失效密文且 reasoning 骨架保留。
2026-08-31 01:02:13 +08:00
feeeei
ca9b4d73f2
fix(openai-ws): share immutable replay bodies to stop O(T²) copying
...
OpenAI Responses WS/HTTP-bridge 的 replay 历史此前每轮对全部正文做多次
深拷贝(构建、双份序列、保存点各一遍),长会话累计分配 O(T²),实测
128 turn x 10KiB 达 160MB+,是 #6382 内存持续增长直至 OOM 的主因。
改为共享不可变正文所有权:
- extract 经零拷贝 string 视图 + gjson Index 直接切 payload 子切片,
并以 json.Valid 保持对断裂数组的既有错误语义
- 序列构建/sanitize/collector/保存点全部只传引用;跨持有者保存经
combineOpenAIWSReplayItems 新建头数组,正文不复制
- bridge 每轮一次解析,正常 replay 与 account-failover 序列共享正文
- 前缀比较增加字节级快路径,避免逐轮全历史 decode+encode
- strict 状态可用时不再整包保留上一轮 payload
新增 128 turn 分配回归测试锚定上界(实测 2.5MB,深拷贝回归会击穿),
以及正文共享的所有权断言。
2026-08-31 01:01:20 +08:00
qiujun and Claude Opus 5
9eabd2a5b7
fix(billing): apply model pricing policies to account stats cost
...
resolveAccountStatsCost 的优先级 3 维护了第二份"单价 × token 数"实现,每加一个
定价特性都要手工镜像:service tier 与长上下文分别由 9261dd77、25e6688a 补齐,
而 b5827cfd 引入的 DeepSeek 官方峰谷一直没有生效,高峰时段账号成本最多低估一半。
改为复用 CalculateCostWithServiceTier。channelPricing 仍为 nil,优先级 3 的语义
不变:只取模型定价文件、不引入渠道自定义定价;低谷时段结果与原算式完全一致。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-30 22:57:53 +08:00
wucm667
d5a0124637
fix(openai): isolate passthrough websocket sessions
2026-08-30 16:49:01 +08:00
alfadb
30b29e51e8
feat(ollama): 用量窗口支持挂在国产三家平台下的 Ollama Cloud 账号
...
Ollama Cloud 用量窗口(浏览器会话、5h/7d 快照、自动刷新、同 key 组共享)此前
只认 platform ∈ {openai, anthropic} 的 apikey 账号。但网关对 kimi/zhipu/deepseek
的 apikey 账号同样按 credentials.base_url 转发,用户把 Ollama Cloud 的 key 挂在
这三个平台下跑 Ollama Cloud 托管的 glm/kimi/deepseek 模型时,请求转发正常,用量
窗口却完全不可用。
- 平台白名单放开到 {openai, anthropic, kimi, zhipu, deepseek};type='apikey'
与官方 ollama.com base_url 的限制不变
- Go 侧收敛为 isOllamaCloudUsagePlatform,SQL 侧收敛为
ollamaCloudUsagePlatformsSQL,6 处白名单只引用单一来源,并补两侧互为镜像的
漂移守卫测试
- CN 周期余额/额度探测跳过 ollama 用量账号:其探测端点由 base_url 衍生,对
ollama.com 会被出站 URL 白名单拒绝,每轮都白跑并产生噪声
- 前端账号列表 CN 分支在 eligible 时改渲染 Ollama 用量窗口,并跳过 CN 额度/
余额子单元格(同上,渲染出来只会是一行探测报错)
2026-08-30 16:38:11 +08:00
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