Wesley Liddick
26cb59df05
Merge pull request #5764 from hansnow/fix/ws-http-bridge-custom-tools
...
fix(openai): 补齐 WS HTTP bridge 的客户端工具适配
2026-08-18 15:47:59 +08:00
Wesley Liddick
58ea46e894
Merge pull request #5661 from wucm667/fix/issue-5659-openai-custom-tools
...
fix(openai): restore API-key custom tool calls
2026-08-18 15:47:50 +08:00
Wesley Liddick
685455985b
Merge pull request #5765 from IanShaw027/feat/grok-from-personal-main
...
feat(grok): 用量条补齐本站 24h/7d/30d 聚合,并隐藏空预付与 0 限额已用
2026-08-18 15:35:42 +08:00
Wesley Liddick
1ed3b6aef6
Merge pull request #5760 from spongehah/feature/unify-codex-outbound-identity
...
fix(Fingerprint): 将 Codex 非推理出站身份统一到推理解析链
2026-08-18 15:35:34 +08:00
Wesley Liddick
f211a630c8
Merge pull request #5720 from tamseno/fix/invitation-code-toctou-race
...
fix(auth): make invitation code consumption atomic with user creation
2026-08-18 15:35:16 +08:00
Wesley Liddick
37732dcd34
Merge pull request #5725 from tamseno/fix/gemini-include-server-side-tool-invocations
...
fix(gemini): support includeServerSideToolInvocations in GeminiToolConfig
2026-08-18 15:35:01 +08:00
yaxin
a341239596
fix(fingerprint): align credential-face identity with the real client and de-drift models version
...
- Replace ApplyCodexCanonicalIdentity with CodexCanonicalAuthIdentity /
ApplyCodexCanonicalAuthIdentity: the credential face (auth.openai.com
token exchange / refresh / PAT whoami) now sends the originator +
canonical User-Agent pair and no version header, matching codex-rs
default_headers(); the version gate (#3901 ) only exists on the
/backend-api/codex inference face. whoami keeps its original header
shape (originator + UA) with the canonical UA source.
- Token exchange and refresh send the full pair instead of a bare UA,
eliminating the half-identity (UA without originator) combination no
real client ever emits.
- Codex models manifest: the Version header now follows the client's
own client_version when it is valid and >= the upstream floor (same
source as the query param, restoring the pre-refactor consistency),
falling back to the canonical version otherwise; the query param
keeps its verbatim passthrough contract.
- Drop the now-unreferenced openAICodexProbeVersion constant and its
vacuous consistency assertions; probes resolve their version through
resolveCodexOutboundIdentity at runtime.
2026-08-18 15:20:08 +08:00
yaxin
1ba92449c7
fix(gemini): wire includeServerSideToolInvocations into the typed transform path
...
The struct field alone never reached the wire: the raw passthrough
pipeline is covered by enableMixedGeminiToolInvocations (#5711 ), but
TransformClaudeToGeminiWithOptions builds GeminiToolConfig from scratch
and never set the flag, so gemini-* models entering through the Claude
format gateway could still hit the upstream 400 from issue #5709 .
- Set IncludeServerSideToolInvocations=true when the built tool
declarations mix functionDeclarations with googleSearch, matching the
raw-path injection semantics.
- Replace the marshal-roundtrip-only test with behavior tests that
drive TransformClaudeToGeminiWithOptions: mixed tools set the flag,
function-only and web-search-only requests leave it unset.
2026-08-18 15:05:54 +08:00
yaxin
9617775f9a
fix(repo): tolerate ErrTxStarted for tx-bound clients and harden test stubs
...
- user_repo.create(): keep the TxFromContext fast path, but restore
tolerance for dbent.ErrTxStarted in the self-owned-transaction branch.
ent's Client.Tx only inspects the driver type, so a repository built
from a tx-bound client (client-injected transactions, e.g. the
integration fixture testEntTx + tx.Client()) hits ErrTxStarted; reuse
that client instead of failing. Fixes the two red integration tests in
allowed_groups_contract_integration_test.go.
- createUserAndClaimInvitation: roll back via defer (matching the OAuth
registration precedent) so a panic inside the transaction cannot leak
the connection.
- settingRepoStub: guard call counters and state with a mutex; the new
concurrency regression test exercises it from multiple goroutines and
the unsynchronized counters were flagged by -race.
2026-08-18 15:02:25 +08:00
IanShaw027
fd42d3722d
fix: hide Grok prepaid and used/limit when they are empty
...
Skip the prepaid chip without a positive balance, and skip used/limit when monthly limit is 0.
2026-08-18 14:55:08 +08:00
Wesley Liddick
1870b58c1d
Merge pull request #5721 from lyy0709/codex/bulk-openai-settings
...
fix(openai): complete bulk account settings
2026-08-18 14:53:55 +08:00
IanShaw027
269fbcac0e
feat: Grok 用量条补齐本站 24h/7d/30d 聚合
...
把已有的本地窗口统计接到 Free 24h 与付费 7d/30d 进度条,避免只显示官方百分比。
2026-08-18 14:50:57 +08:00
hansnow
7e579cb28d
fix(openai): adapt client tools in WS HTTP bridge
2026-08-18 14:42:30 +08:00
Wesley Liddick
938f1868ae
Merge pull request #5714 from wucm667/fix/issue-2733-current-main
...
fix(ops): avoid single-insert fallback after batch failure
2026-08-18 14:11:42 +08:00
Wesley Liddick
4d19836189
Merge pull request #5716 from wucm667/fix/issue-2695-current-main
...
fix: skip expiry reminders without SMTP config
2026-08-18 14:06:32 +08:00
Wesley Liddick
c792b44bb2
Merge pull request #5712 from xiaobo121388/main
...
feat: add Ollama Cloud usage query action
2026-08-18 14:05:27 +08:00
Wesley Liddick
1ea4150bf0
Merge pull request #5581 from wucm667/fix/issue-5574-passthrough-model-discovery
...
fix(gateway): align passthrough model discovery
2026-08-18 13:56:02 +08:00
Wesley Liddick
ed2da82396
Merge pull request #5711 from wucm667/fix/issue-5709-antigravity-tool-config
...
fix(antigravity): preserve mixed Gemini tool config
2026-08-18 13:55:24 +08:00
Wesley Liddick
6259940ef2
Merge pull request #5669 from feeeei/main
...
feat(openai): OpenAI Team 联动熔断
2026-08-18 13:54:32 +08:00
Wesley Liddick
baaf59d417
Merge pull request #5755 from feeeei/feat/gemini
...
fix(gemini): Skipped 错误策略对齐 OpenAI,上游 4xx 不再硬改 500
2026-08-18 13:54:06 +08:00
Wesley Liddick
c0325d24f9
Merge pull request #5759 from o2e/codex/fix-codex-usage-probe-model-clean
...
[codex] 修复部分账号 Codex 额度查询 400
2026-08-18 13:53:49 +08:00
Wesley Liddick
c76ff55997
Merge pull request #2148 from feitianbubu/pr/ops-error-detail-support-custom-time
...
feat: ops 错误详情弹窗支持自定义时间区间
2026-08-18 13:52:34 +08:00
Wesley Liddick
5c12960285
Merge pull request #4005 from feitianbubu/fix/header-role-i18n
...
fix(ui): localize user role label in app header
2026-08-18 13:52:15 +08:00
Wesley Liddick
f6d6613ec6
Merge pull request #4006 from feitianbubu/fix/native-controls-dark-mode
...
fix(ui): adapt native form controls to dark mode via color-scheme
2026-08-18 13:51:57 +08:00
Wesley Liddick
5dfac8bffa
Merge pull request #4049 from feitianbubu/fix/dashboard-token-cache-breakdown
...
fix(dashboard): include cache tokens in token card breakdown
2026-08-18 13:51:42 +08:00
Wesley Liddick
632b4f4faa
Merge pull request #4053 from feitianbubu/fix/announcements-empty-state-copy
...
fix(announcements): use proper empty-state copy instead of error message
2026-08-18 13:51:21 +08:00
Wesley Liddick
3d9a0a71bd
Merge pull request #4057 from feitianbubu/fix/ops-sla-zero-window
...
fix(ops): show neutral SLA card when window has no requests
2026-08-18 13:51:09 +08:00
Wesley Liddick
1a3ecd2b94
Merge pull request #5004 from wucm667/fix/issue-4990-deferred-tool-cache-control
...
fix(claude): strip cache control from deferred tools
2026-08-18 13:50:57 +08:00
Wesley Liddick
8532344745
Merge pull request #5715 from wucm667/fix/issue-3917-current-main
...
fix(frontend): isolate AccountsView helper data loading
2026-08-18 13:50:39 +08:00
Wesley Liddick
cddb03c0f1
Merge pull request #5609 from wucm667/fix/issue-5607-auth-pricing-snapshot
...
fix: preserve group pricing in auth snapshots
2026-08-18 13:50:13 +08:00
Wesley Liddick
a7a321232f
Merge pull request #5567 from wucm667/fix/issue-5563-anthropic-sse-overload
...
fix(gateway): handle Anthropic SSE overload errors
2026-08-18 13:49:59 +08:00
o2e
16e4f7ecc3
修复 Codex 额度探针模型兼容性
2026-08-18 13:08:28 +08:00
spongehah
bb6c3b4f6a
fix: unify Codex OAuth outbound identity onto the inference resolver
...
Token exchange, PAT whoami, models, probes, and pre-writes now follow
the same UA/version chain as Codex inference instead of hardcoded
codex-cli/0.91.0 or compile-time constants.
2026-08-18 13:03:22 +08:00
feeeei
ab0fcd1a0e
fix(gemini): Skipped 错误策略对齐 OpenAI,上游 4xx 不再硬改 500
...
ErrorPolicySkipped(池模式、或自定义错误码未命中)原来在响应写出上
自成一派:v1beta 原生把上游 4xx 硬改 500 后原文透传,/v1/messages
硬传 500 进映射(客户端拿到 502)。下游网关据此把请求级错误当可重
试的服务端故障反复换号,耗尽后改写成 All available accounts
exhausted(2026-08-17 gemini 生产事故链)。现对齐 OpenAI 路径语义:
- Skipped 只豁免账号状态标记,不豁免换号:可 failover 状态码一律
返回 UpstreamFailoverError(poolModeSkippedFailoverError 泛化为
skippedErrorPolicyFailoverError,同账号重试标记仍仅池模式携带)
- 池模式的不可 failover 4xx 保真:v1beta 原码+原文透传(新
writeGeminiNativeUpstreamError 与 ErrorPolicyNone 共用同一写出,
并补记 ops 事件),/v1/messages 与 chat completions 按真实状态
码映射
- 自定义错误码未命中且不可 failover:三路径统一 500 + "Upstream
gateway error" 固定文案,上游细节仅记 ops 错误日志
- 400 属确定性请求错误:mapped 写出回传脱敏后的上游 message,客户
端可据此定位非法字段
2026-08-18 11:24:39 +08:00
Wesley Liddick
8869775ed3
Merge pull request #5636 from feitianbubu/fix/proxy-status-expired-i18n-key
...
fix(i18n): add missing expired key to account status block used by proxy list
2026-08-18 10:06:56 +08:00
Wesley Liddick
f66a42c40e
Merge pull request #5697 from feitianbubu/fix/ops-error-distribution-legend-labels
...
fix(admin): show category labels in ops error distribution legend
2026-08-18 10:05:39 +08:00
Wesley Liddick
7d633f5fc3
Merge pull request #5742 from heathermhuang/codex/fix-grok-response-model-audit
...
fix: normalize Grok response model audit aliases
2026-08-18 10:03:26 +08:00
Wesley Liddick
b2d1c3859a
Merge pull request #5738 from okbexx/fix/codex-identity-snapshot
...
fix(openai): make Codex convergence identity consistent
2026-08-18 09:57:05 +08:00
Wesley Liddick
5253bb72b0
Merge pull request #5737 from lyen1688/feat/channel-time-pricing
...
功能:支持渠道模型分时倍率定价(支持峰谷定价)
2026-08-17 22:38:41 +08:00
shaw
6bf335965a
merge main 并修复与 #5730 的语义冲突
...
main 侧 #5730 新增的 openai_gateway_cn_fixes_test.go 按旧 11 参签名调用
calculateOpenAIRecordUsageCost;本分支为该函数新增了第 12 个参数
pricingAt。文本无冲突但 test build 会失败,此处按本分支对同类测试
调用点的既有处理方式补传 time.Time{}。
2026-08-17 22:27:22 +08:00
Heatherm Huang
c46d07ca07
fix: normalize Grok response model audit aliases
2026-08-17 21:15:12 +08:00
Wesley Liddick
ab28a2d10b
Merge pull request #5730 from Wei-Shaw/fix/cn-provider-group-entry-and-correctness
...
fix: 打通 CN 平台分组入口并修复五项功能缺陷(调度闸门 403/计费误计/断开漏记/count_tokens/403 处置)
2026-08-17 20:29:54 +08:00
Jarl
6793d5ac85
fix(openai): make Codex convergence identity consistent
2026-08-17 20:25:28 +08:00
lyen1688
9f24a55305
功能:支持渠道模型分时倍率定价
2026-08-17 19:45:07 +08:00
shaw
c38c5beef8
fix(i18n): CN 余额单元格误引 grokBalance 键致渲染原始 key
...
CNProviderBalanceCell 无快照占位标签引用 admin.accounts.grokBalance,
但该键实际嵌套在 admin.accounts.usageWindow 下,未命中时 DeepSeek/Kimi
payg 账号的用量窗口列直接显示原始键名。
- cnProviders 块新增自有占位键 balance(zh: '余额 --' / en: 'Balance --'),
单元格改引该键
- 用 esbuild 实际加载模块对 zh/en 全部 admin 语言包做键路径深度比对:
除本处外 CN 相关键(静态 14 个 + 动态拼接 accountMode/apiProtocol 系列)
双语全部对齐;唯一存量漂移是 claudeMaxSimulation 块(zh 嵌套于
modelRouting 下/en 为 groups 直属),全源码零消费方属死键,不在本次
范围内处理
2026-08-17 17:44:33 +08:00
shaw
10c8b70203
fix(cn-providers): 修复 CN 分组五项功能缺陷(调度闸门/计费/断开漏记/count_tokens/403)
...
对已合并 PR #5666 + 分组入口放行后的全量功能审计发现的 P0/P1 修复,
全部先经代码与厂商文档实证再实施:
1. /v1/messages 调度闸门(P0):sanitizeGroupMessagesDispatchFields 对非
openai 平台恒置 AllowMessagesDispatch=false,而闸门豁免名单只有 grok,
CN 分组经正常途径创建后恒 403——原生 Anthropic 直通(Claude Code 主用例)
完全不可达。修复:闸门对 CN 与 grok 同语义豁免;count_tokens 处的内联
裸检查统一走同一 helper;ResolveMessagesDispatchModel 对 CN 早退,避免
openai 专属的 gpt-5.x 默认映射发给 CN 上游。
2. 计费候选链(P0):候选链兜底含客户端原始模型名,配合 getFallbackPricing
的 claude→Sonnet 统一兜底,映射的 CN 模型无价时 CN 流量会按 Claude 原价
(数倍~数十倍)静默误计,且 usage 日志显示 claude-* 名无从察觉。修复:
CN 账号的 claude-* 候选仅在显式分组/渠道定价时放行;候选全滤空时按
ErrModelPricingUnavailable 走零成本+告警落账(顺带修复原空候选错误会
丢弃整条 usage 记录的次生问题)。
3. 断开/中断漏记(P0,#5148 对齐,惠及 openai 平台):messages/responses/
chat_completions 三个 handler 的错误路径此前在 err!=nil 时丢弃携带的
部分 result——客户端断开排水后的完整 usage 被丢,payg 上游照常计费而
平台漏记(anthropic 网关早有同修复,openai 网关缺失)。修复:错误路径
result 非空时照常提交 usage;failover 错误恒 result=nil 无重复计费。
Responses×anthropic 流式转换器同时改为断开后继续排水至流自然结束
(末尾 message_delta 的 output_tokens 不再丢),finalize 帧补工具名反转
与客户端工具还原、仅在客户端仍连接时写出。
4. count_tokens(P1,证据修正):经实证三家 Anthropic 兼容层均无
/v1/messages/count_tokens(DeepSeek 官方文档无此端点且注明
anthropic-version 被忽略;OpenModel 标注该端点 Anthropic only),
anthropic 协议转发上游=常态 404,且错误处置缺模型上下文会把不计费的
探测放大成整账号停调。修复:CN 全协议一律本地 tiktoken 估算(与 Grok
同方案),删除上游转发死代码。
5. 403 处置(P1):CN 此前落入通用 handleAuthError,单次 HTML 403(CDN/
代理拦截页)即永久禁用,且 403 在 failover 集里会逐账号重放连环禁用
整组。修复:CN 与 openai 同口径——HTML 豁免 + 3 次累计 + 临时冷却。
新增回归测试 8 项:闸门豁免(含 openai 仍受控断言)、CN 调度映射空返回、
候选过滤三态、空候选零成本落账、断开排水 usage 完整性、HTML-403 零处罚、
结构化 403 首次临时停调。handler/service 全包测试通过。
2026-08-17 17:28:53 +08:00
shaw
7cdca9e495
feat(groups): 放行 kimi/zhipu/deepseek 平台分组创建入口
...
PR #5666 引入 CN 平台后,路由/调度/前端类型均已支持 CN 平台分组,但分组
创建入口两头缺失:后端 Create/UpdateGroupRequest 的 platform oneof 白名单
与前端 GroupsView 平台选项都没有三平台,导致 CN 账号「无可用分组」、整条
流量链路不通(composite 不能作为替代:CN 不可为 composite 路由目标)。
- group_handler.go: 两处 oneof 加 kimi/zhipu/deepseek;composite 路由目标
白名单有意不动(DetectModelPlatform/isConcreteRequestPlatform 均无 CN 分支)
- GroupsView: platformOptions/platformFilterOptions 补三项;两处徽章配色链
按 platformColors.ts 色系补 CN 分支
- i18n: admin.groups.platforms 补 kimi/zhipu/deepseek 键(zh/en),缺键时
分组徽章/GroupRPM/RateMultipliers 弹窗/ChannelsView 会渲染原始 key
- GroupBadge: badgeClass/labelClass 补 CN 配色
- 新增表驱动测试:9 平台 Create/Update 全放行、非法值(别名/大小写/空格)
全拒绝、composite target 对 CN 保持拒绝的守卫
2026-08-17 17:28:51 +08:00
wucm667
971544570d
test(antigravity): check tool config assertions
2026-08-17 17:11:33 +08:00
Tamseno
3c3bb2fa19
fix(gemini): support includeServerSideToolInvocations in GeminiToolConfig
...
- Add IncludeServerSideToolInvocations field to GeminiToolConfig to prevent dropping client tool settings.
- Fix HTTP 400 error when mixing built-in tools (e.g. Google Search) with function calling on Gemini 3.6/3.7 models.
- Add serialization/deserialization unit test TestGeminiToolConfig_IncludeServerSideToolInvocations.
Fixes #5709
2026-08-17 15:23:49 +08:00
Wesley Liddick
e330c243a8
Merge pull request #5666 from Randark-JMT/feat/cn-providers-kimi-zhipu-deepseek
...
feat: 国产供应商多协议支持(Kimi/Zhipu/DeepSeek 原生 Anthropic 直通 + DeepSeek Responses)与配额/余额监控
2026-08-17 14:55:20 +08:00