Wesley Liddick
9517f12cdd
Merge pull request #6510 from wall-wxk/fix/release-session-slot-on-forward-failure
...
fix(gateway): 转发失败的请求立即释放会话槽,不再占用整个空闲超时窗口
2026-09-05 16:05:06 +08:00
Wesley Liddick
40f4d450be
Merge pull request #6507 from wucm667/fix/issue-6501-glm53-thinking-effort
...
fix(gateway): normalize GLM-5.3 thinking effort
2026-09-05 16:04:16 +08:00
Wesley Liddick
620eb3fd00
Merge pull request #6581 from r266-tech/r266/forward-opencode-session
...
fix(openai): scope OpenCode session forwarding
2026-09-05 16:03:57 +08:00
Wesley Liddick
c6ff69fd12
Merge pull request #6542 from wucm667/fix/issue-6530-gateway-concurrency-origin
...
fix(handler): distinguish gateway admission rejections
2026-09-05 16:03:17 +08:00
Wesley Liddick
7b271bbee9
Merge pull request #6529 from wucm667/fix/issue-6521-preserve-passthrough-reasoning
...
fix(openai): preserve reasoning effort in API-key passthrough
2026-09-05 16:02:56 +08:00
Wesley Liddick
68f099707e
Merge pull request #6553 from wucm667/fix/issue-6547-heartbeat-bootstrap
...
fix(openai): normalize automation heartbeat bootstrap
2026-09-05 16:02:36 +08:00
Wesley Liddick
07bf8b92fd
Merge pull request #6550 from weiness/fix/alipay-payment-reconciliation
...
修复支付宝回调延迟或丢失,已支付订单可能长时间停留在待支付状态的问题
2026-09-05 15:08:56 +08:00
Wesley Liddick
63dc24b5e8
Merge pull request #6626 from wucm667/feat/issue-6624-none-reasoning-mapping
...
feat(openai): allow none as reasoning mapping source
2026-09-05 15:06:32 +08:00
Wesley Liddick
8f1d6af3ed
Merge pull request #6531 from wucm667/fix/issue-6524-continuation-unavailable-recovery
...
fix(openai): recover unavailable continuation responses
2026-09-05 15:06:02 +08:00
Wesley Liddick
85f431a072
Merge pull request #6620 from wucm667/fix/issue-6615-astra-messages-cache
...
fix(openai): enable Astra messages prompt caching
2026-09-05 15:04:13 +08:00
Wesley Liddick
d7fb9b5d35
Merge pull request #6593 from wucm667/fix/issue-6584-chat-tool-discovery
...
fix(apicompat): preserve discovered tools in chat fallback
2026-09-05 15:03:52 +08:00
Wesley Liddick
eba6ea5639
Merge pull request #6590 from wucm667/fix/issue-6582-search-tool-capability
...
fix(codex): advertise search capability for bridged routes
2026-09-05 15:03:31 +08:00
Wesley Liddick
2ad6e8fb75
Merge pull request #6599 from wucm667/fix/issue-6598-gemini-custom-models-list
...
fix(gemini): apply custom list to native models endpoint
2026-09-05 15:03:08 +08:00
Wesley Liddick
570bd084c2
Merge pull request #6594 from wucm667/fix/issue-6592-preserve-zero-system-metrics
...
fix(ops): preserve zero-valued system metrics
2026-09-05 15:02:40 +08:00
Wesley Liddick
15278fe2f9
Merge pull request #6580 from OG-Wang/fix/sidebar-collapse-when-active
...
fix(frontend): allow collapsing sidebar groups while a child route is active
2026-09-05 15:02:30 +08:00
Wesley Liddick
c4e6dcfd80
Merge pull request #6602 from ZeroClover/feat/codex-manifest-pinned-accounts
...
feat(codex): pinned-accounts Codex model manifest for OpenAI groups
2026-09-05 14:51:17 +08:00
Wesley Liddick
701f844755
Merge pull request #6555 from feeeei/feat/usage-upstream-request-id
...
feat(usage): 用量记录落库直接上游的请求 ID,并支持按账户配置响应头名
2026-09-05 14:36:07 +08:00
Wesley Liddick
91cf660377
Merge pull request #6397 from feeeei/fix/openai-ws-replay-oom-6382
...
fix(openai-ws): eliminate O(T²) replay copying and invalid_encrypted_content retry storms
2026-09-05 14:32:11 +08:00
Wesley Liddick
78e1aaedb9
Merge pull request #6535 from feeeei/feat/pricing-custom-file-hot-reload
...
feat(pricing): fallback/override 定价文件按内容哈希热重载,改动无需重启生效
2026-09-05 14:31:09 +08:00
shaw
708b85a6a4
fix: complete upstream request id handling
2026-09-05 14:18:13 +08:00
shaw
1cab4d8c22
fix: make custom pricing reload coherent
2026-09-05 14:18:13 +08:00
Wesley Liddick
d8b9a83f8c
Merge pull request #6492 from feeeei/main
...
fix(gateway): 负载感知调度补齐渠道模型限制的逐账号检查
2026-09-05 14:06:21 +08:00
wucm667
7969751f1f
feat(openai): allow none as reasoning mapping source
2026-09-05 12:32:30 +08:00
wucm667
4aaf5cb73b
fix(openai): enable Astra messages prompt caching
2026-09-05 10:58:05 +08:00
Zero Clover
1e28ef5942
feat(codex): pinned-accounts Codex model manifest for OpenAI groups
2026-09-05 00:10:24 +08:00
wucm667
28f673e4cd
fix(gemini): honor custom native models list
2026-09-04 22:29:36 +08:00
wucm667
9ddf69698d
fix(ops): preserve zero-valued system metrics
2026-09-04 18:51:24 +08:00
wucm667
51631d0324
fix(apicompat): preserve discovered tools in chat fallback
2026-09-04 18:33:23 +08:00
wucm667
c7538cd256
fix(codex): advertise search capability for bridged routes
2026-09-04 16:43:15 +08:00
r266-tech
6cf645f87c
fix(openai): scope OpenCode session forwarding
2026-09-04 12:45:06 +08:00
Rick
aa556c372f
fix(frontend): allow collapsing sidebar groups while a child route is active
...
A collapsible sidebar group was force-expanded whenever the active route
was one of its children, so clicking the chevron did nothing: the toggle
only updated the internal set while isGroupActive() kept reporting the
group as expanded. Any click that produces no visible change reads as a
bug to users.
Track per-group expand/collapse overrides instead. A group without an
entry keeps the automatic behavior (expanded while active, so context is
not lost on load or navigation), but a chevron click records the user's
choice and that choice wins, letting an active group be collapsed and
re-expanded at will.
2026-09-04 12:42:20 +08:00
wucm667
f5ae32e53f
fix(gateway): normalize GLM-5.3 thinking effort
2026-09-04 08:15:41 +08:00
feeeei
de27905e88
feat(usage): 用量记录落库上游请求标识并支持按账户配置响应头名
...
- usage_logs 新增 upstream_request_id 列(迁移 232)与仅索引非空行的 CONCURRENTLY 部分索引(迁移 233,runner 登记失效索引清理)
- 账户 extra.upstream_request_id_header 指定要读取的上游响应头,只读该头;留空不记录;创建/更新/批量入口校验头名合法且不超过 64 字节
- ForwardResult/OpenAIForwardResult 携带 UpstreamHeaders,中央计费按账户解析落库,WS 轮次保持 NULL
- 管理端用量明细新增默认隐藏的"上游ID"列,带与请求ID列一致的复制按钮,并同步导出
- 创建/编辑账户弹窗新增"上游ID"输入(UpstreamRequestIdHeaderField),提示按接入类型与平台分条列出常见头名
- HelpTooltip 悬停模式下指针移入提示框时保持打开,便于选中复制提示内容
2026-09-03 18:02:15 +08:00
wucm667
28dde982cb
fix(openai): normalize automation heartbeat bootstrap
2026-09-03 17:29:04 +08:00
weiness
de8d756afa
fix(payment): reconcile pending Alipay orders
2026-09-03 16:33:30 +08:00
shaw
b1748c4ea9
chore: update sponsors
2026-09-03 15:40:51 +08:00
Wesley Liddick
432ebc498c
Merge pull request #6179 from wwcchh0123/codex/upstream-error-proxy-attribution
...
fix(ops): preserve event-time proxy attribution for upstream errors
2026-09-03 15:34:59 +08:00
Wei-Shaw
abc07bb079
test(ops): satisfy errcheck and gofmt in proxy attribution tests
2026-09-03 15:23:22 +08:00
Wei-Shaw
4c1f920d58
fix(ops): close proxy attribution gaps and bound queued upstream events
...
Follow-up to the event-time proxy snapshot: every upstream attempt now
carries attribution, the direct/unknown contract is enforced everywhere,
and the queued upstream_errors array has hard bounds again.
Attribution coverage
- compact fallback retry helper and the streaming compact failover event
now stamp proxy_id/proxy_name; the non-streaming SSE compact retry
previously dropped its first attempt on `continue` and now records it
- raw chat-completions stream truncation events (new on main) attributed
- Anthropic/Bedrock transport errors get attribution inside the shared
handleUpstreamTransportError helper, so all five callers inherit it
- OpenAI first-output timeout takes attribution from the caller: HTTP
callers pass the HTTP rule, the WS passthrough relay passes the WS rule
(no managed proxy => unknown, never direct, because http.DefaultClient
may honor environment proxies)
Contract hardening
- single opsUpstreamProxyAttribution returns (id, name) from one decision;
a hydrated Proxy without a durable ID is unknown, not id=null+name
- both normalizers (struct at append time, JSON on detail reads) enforce
proxy_id==null <=> sentinel name; blank managed name => "proxy"
- detail-read normalization edits only the attribution keys via sjson, so
keys from older struct versions and stored key order are preserved
Queue bounds
- keep at most 256 attempts and ~512 KiB serialized per entry, newest
first; the oldest retained event records dropped_earlier_attempts
- attempts outside the 16-event body window trim url/message to 512 bytes
- restore the empty-event drop rule, judged before the body window clears
detail so older real attempts survive
Tests cover each site above (managed proxy, direct, WS unknown), the
normalizer invariants, key/order preservation, and the count/byte bounds.
2026-09-03 15:11:36 +08:00
wwcchh0123
e9e3c46cb7
fix(ops): snapshot proxy on upstream errors
2026-09-03 14:20:39 +08:00
wucm667
62198286e9
[verified] fix(handler): distinguish gateway admission rejections
2026-09-03 12:48:02 +08:00
feeeei
fdc2ec17e6
feat(pricing): fallback/override 定价文件按内容哈希随定时器热重载
...
PricingService 的定时器(hash_check_interval_minutes,默认 10 分钟)每轮先做
远程目录哈希同步,再比对 fallback_file/override_file 两个文件内容的联合 sha256
(customFilesHash),变化时从本地 model_pricing.json 重建叠加层,只替换内存数据
与指纹,不改远程同步锚点 localHash。只配置了自定义文件而 remote_url 为空时
调度器同样启动。
- 三条重建路径(启动加载、远程下载、热重载)统一走 buildPricingData,指纹在合并
读取之前采样,并发改文件只会落后于数据、下一轮补重建
- 删除文件视为该层清空,下一轮生效;文件存在但不可读或不是 JSON 对象时保留旧数据、
不更新指纹,每轮重试并告警
- config.example.yaml 同步生效说明;新增 pricing_service_hot_reload_test.go
2026-09-03 10:35:20 +08:00
wucm667
b6740c937f
fix(openai): recover unavailable continuation responses
2026-09-03 10:26:12 +08:00
wucm667
10c8f523c4
fix(openai): preserve passthrough reasoning effort
2026-09-03 09:42:50 +08:00
wall-wxk and Claude Opus 4.6
9be9c0b68c
fix(gateway): 转发失败的请求立即释放会话槽,不再占用整个空闲超时窗口
...
会话数量限制(max_sessions)此前只有空闲超时自动过期,没有任何主动释放
机制:请求在选号阶段注册会话后,即使转发失败(上游错误/客户端断开/换号
耗尽),该 session hash 也会占住槽位直到空闲超时(默认 5 分钟),导致
max_sessions 受限的账号在窗口内拒绝所有新会话。
修复:
- SessionLimitCache 新增 UnregisterSession(Redis ZREM),立即移除会话注册
- GatewayService 新增 ReleaseAccountSession,适用条件与 checkAndRegisterSession 对齐
- Messages 主路径:记录 failover 链上注册过会话槽的账号,请求最终失败时
统一释放;failover continue / profit veto / 兜底分组切换时按次即时释放;
成功及"上游已计量部分结果"(#5148)保持既有空闲超时语义
- CountTokens:转发失败时同样释放选号时注册的会话槽
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-09-02 18:45:20 +08:00
feeeei
9ad3865690
fix(gateway): 负载感知调度补齐渠道模型限制的逐账号检查
...
渠道 billing_model_source=upstream 时,限制模型只能按账号映射后的上游模型
逐账号判定。GatewayService.SelectAccountWithLoadAwareness 的负载感知各层
(模型路由候选、路由内粘性 gate、无路由粘性 gate、负载感知候选及其兜底)
此前都没有这一判定,load_batch_enabled 默认开启,anthropic/gemini/antigravity
分组的渠道白名单实际不生效。
现在入口算一次 needsUpstreamChannelRestrictionCheck,各层共用同一判定;
候选因渠道限制筛空时记 warn 并返回带 channel pricing restriction 的
ErrNoAvailableAccounts,与预检路径一致。
2026-09-02 11:46:37 +08:00
github-actions[bot]
5097b31457
chore: sync VERSION to 0.2.0 [skip ci]
2026-09-02 03:24:57 +00:00
Wesley Liddick
aa23648835
Merge pull request #6480 from Wei-Shaw/fix/group-model-pricing-ui
...
fix(frontend): 优化分组模型定价弹窗布局
v0.2.0
2026-09-02 11:09:55 +08:00
shaw
1a33dc8cc4
fix(frontend): 优化分组模型定价弹窗布局
2026-09-02 10:40:21 +08:00
Wesley Liddick
3510aa22b5
Merge pull request #6425 from DuskLin/feat/openai-reasoning-effort-model-scope
...
feat(group): OpenAI 推理强度映射支持按模型名/前缀/后缀匹配
2026-09-02 10:18:07 +08:00