HuntercodeT
18d483c2a1
fix: 分组用量汇总不再全表扫 usage_logs
...
GET /api/v1/admin/groups/usage-summary 在有一定数据量的库上会退化成
usage_logs 全表扫。根因是 getAllGroupUsageSummaryFromRollups 里,tail CTE
的 created_at 下界 state.tail_start 由同一条 SQL 的 state CTE 算出、再用
CROSS JOIN 交给 tail:这个值对 planner 来说要到运行期才知道,既进不了
index cond,也估不准选择性,于是只能顺序扫全表再逐行过滤。
生产实测(1721 万行 usage_logs / PostgreSQL 17):
Nested Loop (actual time=28161..48334 rows=34788)
Join Filter: (ul.created_at >= state_1.tail_start)
Rows Removed by Join Filter: 17178082
-> Seq Scan on usage_logs (actual time=0.030..47567 rows=17212870)
Buffers: shared hit=12863 read=951875
Execution Time: 48720 ms
改成先读一次水位行、在 Go 侧算出 tail_start / closed_before / retained
日期,再把它们当查询参数传进来。同一套数据上:
Index Scan using idx_usage_logs_created_at on usage_logs
Index Cond: (created_at >= $7)
Execution Time: 34 ms
水位有效性的判定(恰好一行、时区名与配置一致、水位不在未来)和无效时
退化成从 epoch 全量重算的行为,与原先 SQL 里 state_values / CASE WHEN
valid 的分支逐条对应,结果口径不变。
另外读取水位的语句不加锁,不参与 #6976 那条 FOR UPDATE / FOR KEY SHARE
的阻塞链。
2026-09-16 10:11:18 +08:00
bitnom
8e34ca5e31
fix(account): keep refreshing OAuth tokens for paused accounts
...
Paused (schedulable=false) active accounts were excluded from the
background token refresh candidates, so their stored access_token
silently expired. The admin usage-window quota probe uses the stored
token verbatim (no token provider / no refresh), so the probe then gets
HTTP 401 UNAUTHENTICATED and the dashboard reports a false "needs
re-auth" for a perfectly healthy account, while Test Connection and live
traffic (which refresh on demand via the token provider) keep working.
Pause is not permanent rejection: error accounts are already excluded by
the status = 'active' filter, and accounts whose refresh genuinely fails
are rate-limited by the retry-cooldown exclusion (10-minute retry-
exhausted cooldown). Refresh success only persists credentials and never
touches schedulable, so a paused account cannot be silently un-paused.
Drop the schedulable filter and update the SQL-filter test, the
integration pagination test, and the service-level candidate fake.
2026-09-15 10:00:26 -04:00
chihao.ou
130ba634ad
fix(clipboard): report errors thrown by the copy fallback
2026-09-15 20:08:45 +08:00
chihao.ou
6a4938bdfb
fix(announcements): preserve successful bulk read results
2026-09-15 20:06:33 +08:00
chihao.ou
14636d2f0e
fix(totp): display normalized API error messages
2026-09-15 20:06:18 +08:00
chihao.ou
0ed735d3ba
fix(proxies): reuse in-flight test guards during batch testing
2026-09-15 20:04:49 +08:00
chihao.ou
21532add46
fix(payment): reset the order page when changing status
2026-09-15 20:04:35 +08:00
xO-ox-ai
d7ee1ab6be
fix(openai): persist response affinity after client cancel
2026-09-15 18:44:50 +08:00
github-actions[bot]
881f320269
chore: sync VERSION to 0.2.5 [skip ci]
2026-09-15 09:02:51 +00:00
HuntercodeT
da74bf13a4
fix(gemini): discover antigravity mappings in native model lists
2026-09-15 16:50:46 +08:00
Wesley Liddick
86f93c28ee
Merge pull request #6977 from alfadb/fix/deepseek-model-name-validation
...
fix(deepseek): 未配置 model_mapping 时按官方模型名单校验,不再透传未知模型名
v0.2.5
2026-09-15 16:20:31 +08:00
Wesley Liddick
30ed40a56a
Merge pull request #7074 from Brisbanehuang/codex/fix-codex-quota-windows
...
fix(scheduler): 按规范 5h/7d 窗口读取 Codex 配额与重置时间
2026-09-15 16:17:37 +08:00
Wesley Liddick
b8275209e8
Merge pull request #7162 from HuntercodeT/fix/antigravity-gemini-sse-separator
...
fix(antigravity): gemini 透传 SSE 事件之间不再多写一个空行(Antigravity CLI invalid stream chunk)
2026-09-15 16:17:25 +08:00
Wesley Liddick
25c21aedda
Merge pull request #7129 from kk-418/fix/grok-build-responses-sequence-number
...
fix(responses): 始终在 Responses SSE 中写出 sequence_number 避免反序列化失败
2026-09-15 15:28:33 +08:00
Wesley Liddick
2d9af8592f
Merge pull request #7153 from hezhaoqian1/codex/upstream-api-key-provider-filter
...
feat: filter API key groups by provider
2026-09-15 15:26:29 +08:00
HuntercodeT
8447bdd368
fix(antigravity): gemini 透传 SSE 事件之间不再多写一个空行
...
handleGeminiStreamingResponse 把上游每条 data 行改写成 "data: ...\n\n",
紧接着又把上游的空分隔行原样透传成第三个 "\n",下游看到的事件之间是
"\n\n\n"。google-genai 的 Go SDK(Antigravity CLI 在用)按 "\n\n" 切事件,
多出的 "\n" 粘到下一个事件开头,前缀变成 "\ndata" 而报
"iterateResponseStream: invalid stream chunk",每条流都在第二个事件中断。
空分隔行不再透传(data 分支已经写过 "\n\n"),附回归测试:两个事件
(LF 与 CRLF 各一)经过后输出必须恰好是一个空行分隔,并按 "\n\n" 切帧
逐个校验前缀。
Fixes #7161
2026-09-15 15:10:45 +08:00
shaw
32682a4f84
chore: update sponsors
2026-09-15 14:01:28 +08:00
hezhaoqian1
55a95d4c67
feat: filter API key groups by provider
2026-09-15 11:16:17 +08:00
alfadb
a939553c87
fix(deepseek): 模型名校验不再默认兜底,未配置映射时按官方名单校验
...
- 未配置 model_mapping 的 DeepSeek 账号不再放行任意模型名,改为官方名单精确匹配
(deepseek-flash / deepseek-v4-pro / deepseek-v4-flash /
deepseek-v4-flash-vision-exp / deepseek-v4-pro-0813)
- 校验前先归一化:剥离 Claude Code 客户端上下文后缀 [1m](含重复形式)并统一小写,
使官方 Claude Code 接入写法 deepseek-flash[1m] 继续可用
- 未知模型名在调度阶段即拒绝,返回 404 model_not_found,避免透传上游后触发
per-(账号,模型) 冷却、并避免上游把不认识的模型名静默兜底成 deepseek-flash
- 出站前剥离泄漏的 [1m] 后缀,仅作用于 DeepSeek 平台
- 配置了 model_mapping 的账号语义不变(映射优先)
2026-09-15 10:42:29 +08:00
Wesley Liddick
badfad8b72
Merge pull request #6257 from 88766lawrence/fix/oauth-promo-code-6216
...
fix(auth): preserve promo codes through OAuth registration
2026-09-15 09:01:39 +08:00
Wesley Liddick
1be482c313
Merge pull request #7148 from Wei-Shaw/revert-7110-codex/bug-batch-image-access-session
...
Revert "fix(batch-image): scope access cache to the current user"
2026-09-15 09:00:23 +08:00
Wesley Liddick
325213ae66
Revert "fix(batch-image): scope access cache to the current user"
2026-09-15 08:59:52 +08:00
Wesley Liddick
0a215c9318
Merge pull request #7110 from ouchihao/codex/bug-batch-image-access-session
...
fix(batch-image): scope access cache to the current user
2026-09-15 08:59:23 +08:00
Wesley Liddick
2061508ad8
Merge pull request #7072 from Brisbanehuang/codex/fix-scheduler-metrics
...
fix(scheduler): 修复选号耗时返回值和粘性命中率重复计数
2026-09-15 08:58:58 +08:00
Wesley Liddick
fb90414c05
Merge pull request #7126 from xO-ox-ai/codex/fix-responses-lite-namespace
...
fix(openai): 保留 Responses Lite namespace 工具调用
2026-09-15 08:58:25 +08:00
Wesley Liddick
9fade3e8c2
Merge pull request #6769 from alfadb/feature/ollama-rate-limit-reset
...
feat(ollama): 根据用量窗口异步更新限流恢复时间
2026-09-15 08:57:43 +08:00
Wesley Liddick
1920a7d687
Merge pull request #7091 from SavitarC/feat/subscription-bulk-actions
...
feat: 支持订阅管理批量操作
2026-09-15 08:57:27 +08:00
Wesley Liddick
a444551a6d
Merge pull request #6654 from ouchihao/codex/issue-2229-register-confirm-password
...
feat(auth): require password confirmation during registration
2026-09-15 08:56:56 +08:00
Wesley Liddick
0bba06d64a
Merge pull request #6691 from yan9651688/feat/api-key-bulk-edit
...
feat(keys): add bulk editing to API key management
2026-09-15 08:56:07 +08:00
Wesley Liddick
150c52b8de
Merge pull request #6689 from tunsuy/fix/antigravity-codex-web-search-mixed-tools
...
fix(antigravity): drop mixed web_search when client tools present
2026-09-15 08:54:40 +08:00
Wesley Liddick
3e4b6a09b2
Merge pull request #6925 from reed-yang/fix/recover-responses-text
...
fix(apicompat): recover Responses text from done and terminal events
2026-09-15 08:54:21 +08:00
Wesley Liddick
dd2e6b3680
Merge pull request #7076 from Shen-An/fix/antigravity-refresh-warning
...
fix(admin): surface partial Antigravity refresh warnings
2026-09-15 08:54:06 +08:00
Wesley Liddick
d4439129a7
Merge pull request #7094 from liuyuzhou666/fix/responses-chat-developer-role-mapping
...
fix(apicompat): 修复 Responses 降级 Chat Completions 时的 system 消息顺序问题
2026-09-15 08:53:50 +08:00
Wesley Liddick
1e1d15cca5
Merge pull request #7082 from ggllzz04/fix/antigravity-token-cache-isolation
...
fix(antigravity): isolate OAuth token cache key by account ID to prevent 429 collision
2026-09-15 08:53:32 +08:00
Wesley Liddick
f7e959ae5f
Merge pull request #7111 from ouchihao/codex/bug-proxy-clear-credentials
...
fix(proxy): allow explicitly clearing stored credentials
2026-09-15 08:52:58 +08:00
Wesley Liddick
008391f699
Merge pull request #7085 from r266-tech/codex/sub2api-f352188cb784
...
fix(openai): strip internal metadata from OAuth input items
2026-09-15 08:52:30 +08:00
Wesley Liddick
a4c517917b
Merge pull request #7073 from Brisbanehuang/codex/fix-batch-image-priority
...
fix(batch-image): 修正批量生图账号优先级排序方向
2026-09-15 08:52:19 +08:00
Wesley Liddick
e9169901d2
Merge pull request #7112 from ouchihao/codex/bug-monitor-refresh-interval
...
fix(monitor): honor the selected auto-refresh interval
2026-09-15 08:52:00 +08:00
xO-ox-ai
13c1d4cde2
test(openai): 覆盖 Lite 命名空间工具回传
2026-09-14 11:46:41 +08:00
cikenerd and Cursor
087987070b
fix(responses): 为 grok-build 始终写出 sequence_number
...
网关合成/重编的 Responses SSE 因 omitempty 或缺字段丢掉 sequence_number,
grok-build 会整轮反序列化失败。合成失败帧、compact 桥接和转换 wire JSON
一律写出该字段,0 也保留。
Fixes #7128
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-14 11:45:53 +08:00
xO-ox-ai
4bd7132ba9
fix(openai): 保留 Responses Lite namespace 调用
2026-09-14 11:35:03 +08:00
chihao.ou
28a4ea914d
fix(proxy): allow explicitly clearing stored credentials
2026-09-13 17:23:24 +08:00
chihao.ou
5ecfaa4837
fix(batch-image): scope access cache to the current user
2026-09-13 17:22:56 +08:00
chihao.ou
06af9f871c
fix(monitor): honor the selected auto-refresh interval
2026-09-13 17:20:56 +08:00
liuyuzhou666
52558381c6
fix(apicompat): merge leading system messages and downgrade mid-conversation system from Responses bridge
...
The Responses to Chat Completions bridge mapped both the instructions field and role developer items to system messages. Codex always sends both, and also injects developer notices mid-conversation when switching models, so the forwarded request contained consecutive leading system messages and mid-conversation system messages. Strict Qwen-family upstreams reject this with HTTP 400 "System message must be at the beginning."
Leading system/developer messages are now merged into a single leading system message, and later system/developer messages are downgraded to user so the content is preserved without violating upstream role ordering.
2026-09-13 14:08:57 +08:00
SavitarC
e3cce574d7
fix: serialize subscription extensions
2026-09-13 12:33:35 +08:00
SavitarC
3d6c207723
feat: 支持订阅管理批量操作
2026-09-13 11:49:03 +08:00
alfadb
a1d5968b24
feat(ollama): async rate-limit reset for Ollama Cloud usage windows
...
Real Ollama Cloud 429s are driven by ollama.com usage windows, not by
response headers that OpenAI/Anthropic/CN rate-limit parsing understands.
Handle them separately: apply a never-shortening temporary cooldown first,
then schedule an async probe that learns the true usage-window reset point
with a controlled, coalesced per-api_key refresh.
- ratelimit_service: route real Ollama Cloud usage accounts to a dedicated
429 path before the CN-provider branch.
- ollama_cloud_usage: add a background probe coordinator (started in Start,
waited by Stop) that fans out model-429 probes to one controlled refresh
per api_key group, reusing the recent group snapshot for coalesced members.
- repository/account_repo: add SetRateLimitedIfUnchanged, a write-back CAS
counterpart to ClearRateLimitIfObserved, so an async reset never overwrites
a newer 429, an admin clear, a re-armed generation, or a key/state change
observed by another writer between read and write.
- wire: inject OllamaCloudUsageService into RateLimitService.
Tests: unit tests for service and repository pass; targeted race tests pass;
build and vet clean; git diff --check clean. The CAS integration test compiles
but is not run (no Docker available).
2026-09-13 10:41:47 +08:00
r266-tech
e5272c130c
test(openai): check input type before metadata assertion
2026-09-13 07:13:31 +08:00
r266-tech
196c15b5cd
fix(openai): strip internal metadata from OAuth input items
2026-09-13 07:00:50 +08:00