William Drake and Claude Opus 5.5
43f88c99aa
fix(billing): reserve in-flight balance to prevent concurrent overdraft
...
Balance-mode admission only checked cached balance > threshold, so N
concurrent expensive requests could all pass and overdraw the user.
Add a Redis in-flight reservation: at admission estimate a conservative
per-request cost (input estimate + output price x max_tokens, times rate
multiplier) and atomically require cached_balance - inflight >= estimate
(first in-flight request always admitted). Reservations are released via
defer on every path and expire by TTL. Fails open on estimation / Redis
errors. Configurable via billing.inflight_reservation (enabled by default).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com >
2026-09-28 14:20:49 -04:00
github-actions[bot]
9a62841fd1
chore: sync VERSION to 0.2.9 [skip ci]
2026-09-28 03:09:17 +00:00
Wesley Liddick
4c00df2e01
Merge pull request #7638 from Achordchan/fix/anthropic-structured-output-beta
...
fix(anthropic): preserve requested structured outputs beta
v0.2.9
2026-09-28 10:52:52 +08:00
Wesley Liddick
b5298fdde8
Merge pull request #7538 from TouHouQing/fix/claude-thinking-disabled-openai
...
fix(openai): honor disabled thinking in Claude Messages bridge
2026-09-28 10:51:30 +08:00
Wesley Liddick
5a350108c4
Merge pull request #7607 from ResidualBlood/fix/antigravity-malformed-function-call-retry
...
fix(antigravity): trigger failover retry on empty stream caused by MALFORMED_FUNCTION_CALL
2026-09-28 10:50:53 +08:00
Wesley Liddick
1df5c39311
Merge pull request #7562 from william-drakemond/fix/opencode-zen-deepseek-reasoning-placeholder
...
fix(openai): inject DeepSeek reasoning placeholder for OpenCode Zen upstream
2026-09-28 10:50:02 +08:00
Wesley Liddick
b3c7038cf4
Merge pull request #7526 from HuntercodeT/fix/passthrough-model-discovery-merge
...
fix(gateway): let OpenAI passthrough accounts supplement model discovery instead of hiding mapped models
2026-09-28 10:49:01 +08:00
Wesley Liddick
8616d4e036
Merge pull request #7617 from korkin25/fix/responses-beta-upstream
...
fix(openai): preserve caller beta headers for HTTP Responses
2026-09-28 10:48:48 +08:00
Wesley Liddick
93c3da03eb
Merge pull request #7555 from Yukinoshita-Yukino/fix/openai-auto-reset-credit-sched-projection
...
fix(scheduler): keep auto reset-credit fields in the scheduler projection
2026-09-28 10:27:00 +08:00
Achord Chan
68c2f5ae6d
fix(anthropic): preserve requested structured outputs beta
2026-09-28 10:10:47 +08:00
Wesley Liddick
ff6b85e30b
Merge pull request #7615 from UnlastingR/fix/codex-ws-context-rollover-upstream
...
fix(openai): break websocket chain on context rollover
2026-09-28 10:05:05 +08:00
Wesley Liddick
79c18ec836
Merge pull request #7609 from feeeei/fix/client-disconnect-499
...
fix(gateway): 客户端断开统一标记 499,不再被记成 502/200 上游错误
2026-09-28 10:04:07 +08:00
Wesley Liddick
790723e040
Merge pull request #7610 from nhirsama/fix/redis-command-exec-form
...
fix(deploy): redis 启动命令改用 exec 列表,修复密码含 shell 特殊字符时失效
2026-09-28 10:01:15 +08:00
Wesley Liddick
1ff2bd6d95
Merge pull request #7573 from Yukinoshita-Yukino/fix/channel-image-price-inherit-when-unset
...
fix(billing): keep catalog image prices when channel pricing leaves them unset
2026-09-28 09:57:02 +08:00
Wesley Liddick
f592b336a3
Merge pull request #7595 from wucm667/feat/issue-7587-allowlist-glob
...
feat(groups): support wildcards anywhere in model allowlists
2026-09-28 09:55:55 +08:00
Wesley Liddick
37f35b12ea
Merge pull request #7524 from Achordchan/fix/plaza-video-rate
...
fix(model-plaza): apply independent video billing multipliers
2026-09-28 09:55:34 +08:00
Wesley Liddick
e4b34446af
Merge pull request #7619 from SavitarC/fix/account-stats-long-context-billing
...
fix(billing): 账号统计成本按 OpenAI 账号开关计入长上下文价
2026-09-28 09:55:19 +08:00
Wesley Liddick
90ae81e9f8
Merge pull request #7624 from wucm667/fix/issue-7620-future-quota-reset
...
fix(openai): retain quota pause until known future reset
2026-09-28 09:54:52 +08:00
Wesley Liddick
9375e288ba
Merge pull request #7571 from SPHINX998/fix/openai-probe-model-unavailable-inconclusive
...
fix(openai): keep Responses support unknown when the probe model is missing
2026-09-28 09:54:31 +08:00
Wesley Liddick
06f70a6232
Merge pull request #7572 from SPHINX998/fix/openai-alpha-search-require-completion
...
fix(openai): require a successful completion before billing an alpha search fallback
2026-09-28 09:54:12 +08:00
Wesley Liddick
6906062187
Merge pull request #7597 from far5man/codex/opus55-openrouter-alias-main
...
fix: recognize OpenRouter Claude Opus 5.5 alias for billing
2026-09-28 09:53:49 +08:00
Wesley Liddick
dc4874a2f1
Merge pull request #7613 from yujunkim/fix/openai-free-fast-missing-pricing
...
fix(billing): keep zero-cost usage log when Free Fast has no pricing
2026-09-28 09:53:26 +08:00
Wesley Liddick
11608c51f0
Merge pull request #7568 from SPHINX998/fix/apicompat-gpt6-reasoning-models
...
fix(apicompat): treat every GPT generation from 5 on as a reasoning model
2026-09-28 09:53:05 +08:00
Wesley Liddick
8aa7fb8c2d
Merge pull request #7569 from SPHINX998/fix/apicompat-recover-empty-final-text
...
fix(apicompat): recover streamed text when the final output message is empty
2026-09-28 09:52:48 +08:00
Wesley Liddick
00ae7c38e2
Merge pull request #7570 from SPHINX998/fix/apicompat-tool-input-on-block-start
...
fix(apicompat): keep tool arguments sent on content_block_start
2026-09-28 09:52:13 +08:00
Wesley Liddick
51a10e42f7
Merge pull request #7585 from ResidualBlood/fix/antigravity-pdf-inline-data
...
fix(antigravity): forward chat PDF file parts as Gemini inlineData
2026-09-28 09:51:28 +08:00
Wesley Liddick
6655f4ec0e
Merge pull request #7393 from Achordchan/fix/antigravity-string-const
...
fix(antigravity): intersect string const with existing enums
2026-09-28 09:51:04 +08:00
Wesley Liddick
be64b553f9
Merge pull request #7635 from wucm667/fix/issue-7629-responses-message-type
...
fix(apicompat): mark converted Chat role items as Responses messages
2026-09-28 09:50:34 +08:00
Wesley Liddick
66f07efd26
Merge pull request #7549 from helianthus1/fix/ccswitch-usage-v1-path
...
fix(ccswitch): stop usage query from requesting /v1/v1/usage
2026-09-28 09:49:47 +08:00
Wesley Liddick
89e9976950
Merge pull request #7497 from ouchihao/codex/bug-group-modal-cleanup
...
fix(groups): clean up modal listeners and pending searches
2026-09-28 09:42:09 +08:00
Wesley Liddick
99d86e41ac
Merge pull request #7611 from ZeroClover/fix/usage-bar-idle-reset-time
...
fix(ui): show reset countdown for idle usage windows with known reset time
2026-09-28 09:41:52 +08:00
Wesley Liddick
ec334fda2c
Merge pull request #7628 from Sterbennicht/fix/codex-windows-catalog-path
...
fix(keys): use ~/ for the Codex model catalog path on Windows
2026-09-28 09:41:35 +08:00
Wesley Liddick
35d2ef0cbd
Merge pull request #7636 from wucm667/fix/issue-7631-remove-unused-rate-limit
...
fix(setup): omit unused rate limit fields from generated config
2026-09-28 09:41:16 +08:00
wucm667
512aa8bc93
fix(setup): omit obsolete rate limit defaults
2026-09-28 08:50:36 +08:00
Wesley Liddick
f45126c8ec
Merge pull request #7622 from Anti2077/fix/ccswitch-codex-root-endpoint
...
fix(ccswitch): preserve Codex provider root endpoint
2026-09-28 08:48:37 +08:00
wucm667
82d2552360
fix(apicompat): mark converted role items as messages
2026-09-28 08:40:41 +08:00
Sterbennicht
f652d0ed38
fix(keys): use ~/ for the Codex model catalog path on Windows
...
Codex expands a leading ~/ in config.toml paths on every platform but
does not expand %userprofile%. The Windows config generated by the Use
Key dialog wrote model_catalog_json = "%userprofile%\.codex\codex-models.json",
which Codex resolves relative to the config directory
(C:\Users\<user>\.codex\%userprofile%\.codex\codex-models.json), so it
fails to load the config with "The system cannot find the path
specified (os error 3)".
Always write ~/.codex/codex-models.json into config.toml. The download
hint still shows the Windows location to save the file.
2026-09-27 22:58:44 +08:00
ResidualBlood
6b40449c3f
fix(antigravity): exclude Signature-only events from meaningful data check
...
MALFORMED_FUNCTION_CALL responses from upstream contain only
thoughtSignature without any text, thinking, or tool calls.
The previous fix still treated delta.Signature and block.Signature
as meaningful data, so the empty-stream failover was never triggered.
- Remove Signature from isMeaningfulAntigravityCompatEvent checks
- Let hasMeaningfulData() also consult processor.HasContent() as
a secondary guard for edge cases
2026-09-27 13:15:56 +00:00
wucm667
02088be2d1
fix(openai): retain quota pause until known future reset
2026-09-27 14:56:38 +08:00
anti
14483c9254
fix(ccswitch): preserve Codex provider root endpoint
2026-09-27 13:48:39 +08:00
SavitarC
fd7af1d462
fix(billing): honor long-context gate in account stats pricing
2026-09-27 12:12:25 +08:00
korkin25
8b95dc94f8
fix(openai): preserve Responses multi-agent beta
2026-09-27 09:57:51 +08:00
UnlastingR
7626110d0b
fix(openai): break websocket chain on context rollover
2026-09-26 07:45:10 -04:00
Yujun Kim and Claude Opus 5.5
3c5ea297ff
fix(billing): keep zero-cost usage log when Free Fast has no pricing
...
RecordUsage treats a missing price as zero cost on the first pass, but
the Free Fast Standard re-evaluation returned the same pricing error.
Requests in a free_openai_fast group sent at priority/fast tier to a
model without pricing therefore lost their usage log entirely.
Ignore pricing-unavailable errors on the Standard pass and keep the
zero-cost entry, matching the first pass.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com >
2026-09-26 20:11:03 +09:00
Zero Clover
994048e6a4
fix(ui): show reset countdown for idle usage windows with known reset time
...
UsageProgressBar returned 'now' whenever showNowWhenIdle was set and
utilization was 0%, ignoring resetsAt. OpenAI Codex 7d windows at 0%
usage still carry a future reset time, so the admin account list hid it.
Only fall back to 'now' when no reset time is known.
2026-09-26 18:49:51 +08:00
ling
c802c45e37
fix(deploy): 用 exec 列表形式重写 redis command
...
参数逐项传递,不再经 sh 拼接,避免密码含 shell 特殊字符时被展开或截断;
空密码时按 redis 语义不设密码。
2026-09-26 17:56:19 +08:00
feeeei
f4f8ff04db
fix(gateway): 客户端断开统一标记 499,不再被记成 502/200 上游错误
...
客户端在响应提交前断开时,只有排队/换号阶段和 OpenAI 的兜底写入会标 499。
Claude 非流式与 Gemini 的 Chat Completions / Messages / Responses 兼容入口
在等待上游时断开,由 GatewayHandler.ensureForwardErrorResponse 补写 502;
Gemini 原生入口什么都不写,落成 200 并被 ops 记成一条 provider 的
"Recovered upstream error";Antigravity 回写 502。这些行都按上游失败计入
SLA 与上游错误数。
- GatewayHandler.ensureForwardErrorResponse 补客户端断开检查,与 OpenAI 版一致
- GatewayHandler 的 Messages / ChatCompletions / Responses 与 Gemini 原生入口:
首次选号失败时先判断客户端断开;ChatCompletions / Responses 循环开头改用
failoverClientGone,不再直接 return 落成 200
- Gemini 原生入口:forward 失败时补 499 标记;并发槽错误改走
concurrencyErrorResponse 统一映射(断开 499、排队满/超时 429、其余 503)
- Antigravity 上游响应前断开回写 499;googleapi 与 Antigravity 的 Google 错误
格式把 499 映射为 CANCELLED
- OpenAI alpha search 非 failover 错误分支补断开检查
- Claude / Gemini / OpenAI 传输层错误:请求 context 已取消时不记 ops 上游事件
- ops:IgnoreContextCanceled 开启时跳过没有上游错误上下文的 499;带上游错误的
499(上游失败后客户端没等到换号结果就离开)仍按上游失败落库
计费不变:Gemini 流式中途断开的用量处理不在本次范围。新增 handler/service
单测覆盖各入口的断开场景与 ops 过滤规则。
2026-09-26 17:13:10 +08:00
Achord Chan
510b680fca
Merge upstream main and retain upstream scheduler test fix
2026-09-26 15:47:52 +08:00
Achord Chan
afbe51abf8
Merge upstream main and retain string const enum intersection
2026-09-26 15:42:47 +08:00
ResidualBlood
52c2f4cb10
fix(antigravity): trigger failover retry on empty stream caused by MALFORMED_FUNCTION_CALL
2026-09-26 05:29:18 +00:00