Randark
ebcae03afd
fix(lint): 补齐 setting_public.go 与配额 fetcher 测试的 gofmt 对齐
2026-08-18 06:29:43 +00:00
jaxxjj
a9514a68d2
perf(usage): aggregate stats in one scan
...
Reduce filtered admin usage statistics from four scans to one GROUPING SETS query so every breakdown shares the exact same filters. Add concurrent expression indexes for requested and upstream model filters on large usage_logs tables.
2026-08-18 14:26:19 +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
Randark
7376f4a48c
fix(lint): gofmt 对齐 + 移除未使用的 isSupportedProvider
...
- 三个文件补 gofmt 规范对齐(结构体尾部注释、const 块字段对齐)
- isSupportedProvider 在 validateProvider 改用能力集合后无引用,删除
2026-08-18 05:57:41 +00: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
Randark
302a10b886
test(monitor-ui): 配额视图渲染与开关门控用例
...
- 新增 MonitorQuotaView.spec:tier window/label 的 i18n 映射与未知
token 透出、阈值配色(≥90 红/≥75 黄/其余绿)、进度条宽度钳制、
多币种余额与单余额回退、plan_level 徽章、错误截断与失败态不渲染 tiers
- 新增 MonitorCard.quota.spec:latest_quota 受系统开关门控,
无快照或开关关闭时不渲染
- 既有工厂/断言补 check_mode、account_id;provider 网格断言 4→8
2026-08-18 05:10:10 +00:00
Randark
a20e1c00cc
feat(monitor-ui): 配额模式表单、用量快照视图与 8 平台支持
...
管理端:
- MonitorFormDialog:新增检查方式三态分段控件(探活/配额/探活+配额),
provider 网格扩展至 8 平台(+antigravity/kimi/zhipu/deepseek),
国产平台默认 endpoint 预填、antigravity 强制 quota-only;配额模式
显示关联账号选择器(复用 adminAPI.accounts.list 按平台过滤),
隐藏 endpoint/api_key/模型等探活专属字段
- 新建共用 MonitorQuotaView:用量窗口进度条(阈值/样式对齐账号页
CNProviderQuotaCell)、多币种余额、plan_level 徽章与错误态;
window/label 机器 token 走 i18n,未知 token 原样透出(前向兼容)
- 列表主模型单元格内联 latest_quota;运行结果弹窗逐行展示配额;
筛选栏/模板管理/格式化 composable 同步 8 平台(配色对齐
utils/platformColors.ts);ProviderIcon 搬运 4 家官方 SVG
用户端:
- MonitorCard 支持 latest_quota,渲染受 channel_monitor_show_quota
系统开关(isChannelMonitorQuotaVisible)控制,服务端剥离为第一道防线
设置与 i18n:
- 管理设置页新增「向用户展示渠道用量/余额」开关(默认关闭);
zh/en 全量补充 providers/checkMode/quota 文案
2026-08-18 05:09:58 +00: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
Randark
c51fd7d0b3
test(channel-monitor): adapt checker body test to 3-arg normalizeMonitorPrimaryModel
2026-08-18 04:51:06 +00:00
Randark
7ab6d3db66
test(channel-monitor): quota mode unit/integration/migration coverage
...
- fetcher:海外/CN coding/CN payg 分派、账号缺失、凭据失效标记、
TTL 命中与失败不缓存、UsageInfo→tiers 全窗口归一、状态推导矩阵
- quota mode:RunCheck 三分派(quota 单行 / quota_probe 仅挂主行 /
probe 不变)、配额失败不翻探活状态、校验矩阵、关联账号复核
(quota 报错 probe 自动解绑)、quota→probe 切换强制重填 key、
Duplicate 空明文重加密
- settings:channel_monitor_show_quota 缺省关闭 + 仅 "true" 开启
- 迁移内容断言(仿 176 grok 迁移测试)
- repo 集成测试:check_mode/account_id 往返、quota JSONB 回读、
探活旧行 NULL 兼容(testcontainers PG 实跑迁移 226)
- 修复 Fetch 在 nil receiver 上的 panic(缓存查询先于原 nil 守卫)
2026-08-18 04:51:02 +00:00
Randark
41344c20ff
feat(monitor): wire quota fetcher & expose check_mode in handlers
...
- handler DTO: create/update 接收 check_mode/account_id,provider oneof 扩至 8 家,
endpoint/api_key 改为 omitempty(条件必填下沉 service 校验);
monitor/checkResult/historyItem 响应透传 check_mode/account_id/quota
- 用户端 latest_quota 由 channel_monitor_show_quota 控制,关闭时服务端剥离
- wire: NewChannelMonitorQuotaFetcher 以具体服务类型收参(窄接口包内保留供
stub),ProvideChannelMonitorRunner 注入后 SetQuotaFetcher
2026-08-18 04:14:15 +00:00
Randark
6a6fd304f6
feat(settings): channel_monitor_show_quota public setting (default off)
...
- 新增公开设置 key(迁移 226 已插入默认 false),控制用户端监控页
是否展示配额/余额;管理端不受影响
- 解析 fail-closed:仅字面 "true" 视为开启(对齐 available_channels_enabled
语义,而非 hide_throughput 的 fail-open)
- 全链路贯通:domain key 常量 → setting_public(公开读取 + ChannelMonitorRuntime
.ShowQuota + 注入 payload)→ settings_view/parse/update → handler DTO
(admin/user 响应 + admin 更新请求)→ api_contract_test 两个 wantJSON 块
2026-08-18 04:06:18 +00:00
Randark
c44711ac98
feat(channel-monitor): quota mode service layer (fetcher + dispatch + repo)
...
- 常量:MonitorProvider{Antigravity,Kimi,Zhipu,Deepseek}、MonitorCheckMode 三态、
配额缓存/告警阈值参数;新增 check_mode 相关业务错误
- 校验:monitorProviders(8)/probeCapableProviders(7) 集合替代 adapter 表判定,
validateCheckMode 矩阵(antigravity 仅 quota);quota 模式 primary_model
默认占位 "quota",endpoint/api_key 条件必填
- checker:kimi/deepseek 复用 /v1/chat/completions、zhipu 走
/api/paas/v4/chat/completions;merge 黑名单与 replace 校验同步扩容
- ChannelMonitorQuotaFetcher:窄接口聚合账号侧三个用量服务 + 账号加载,
归一为 domain.MonitorQuotaSnapshot;成功快照 5min TTL 缓存防配额端点风暴;
Fetch 永不返回 error(失败降级 Success=false 快照);状态推导
operational/degraded(≥90% 或余额耗尽/账号未关联)/failed(401/403)/error
- RunCheck 按 check_mode 分派:quota 单行结果、quota_probe 探活+配额挂主行、
probe 不变;Update 组合校验 + 关联账号复核(probe 自动解绑失效账号);
Duplicate 拷贝新字段且 quota 模式空明文重加密(防 runner 误停摆)
- repo:Create/Update/entToServiceMonitor 透传 check_mode/account_id;
InsertHistoryBatch 写 quota;ListLatestForMonitorIDs 裸 SQL 加 quota 列 +
scanMonitorQuota JSONB 解包(NULL 安全);ListHistory 透传 quota
2026-08-18 04:03:13 +00:00
Randark
615e6901ea
feat(channel-monitor): add quota mode schema (migration 226 + ent)
...
- 迁移 226:provider CHECK 扩到 8 平台(monitors + request_templates)、
channel_monitors 加 check_mode/account_id(FK ON DELETE SET NULL)、
channel_monitor_histories 加 quota JSONB、插入公开设置
channel_monitor_show_quota(默认 false)
- ent schema 同步:provider 枚举 +4、endpoint 去 NotEmpty(quota 模式存空串)、
新增 check_mode/account_id 字段、history 加 quota JSON 快照
- domain 新增归一化配额快照类型 MonitorQuotaSnapshot/Tier/Balance
(放 domain 是因为 ent schema 需要引用,service 会造成 import cycle)
2026-08-18 03:50:01 +00: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
Randark
7e45634df9
chore: remove leftover Sora references after platform removal
...
PR #1463 removed the Sora platform, but some references survived:
- README/README_CN/README_JA kept the 'Sora status (temporarily
unavailable)' sections and gateway.sora_* docs that the removal PR
never touched.
- deploy/config.example.yaml still documented ~130 lines of sora_*
gateway keys, the top-level sora: direct-client/storage block, and
token_refresh.sync_linked_sora_accounts - none of which map to any
field in the config structs anymore.
- The OIDC login PR (02a66a01c , branched off pre-removal main and
merged 4 days after #1463 ) re-added the dead
PublicSettings.SoraClientEnabled field, which no code ever sets.
- A release sync (748a84d87 ) re-introduced sora i18n keys that the
later i18n split (d9e514f98 ) faithfully carried into
locales/{zh,en}/admin/{overview,settings}.ts. No component references
any of these keys.
This drops all of the above. Pure deletions, no behavior change.
2026-08-18 00:51:30 +00: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
lbyxiaolizi
401dd43b4b
fix(apicompat): 链式工具调用回放本轮 reasoning_content
...
codex 0.147.0 真实 resume 历史复现:DeepSeek 每轮只在开头流式产生一次
reasoning,reasoning → call A → output A → call B 的链式调用中 call B 前
没有 reasoning item,其 assistant 消息缺 reasoning_content,DeepSeek
thinking mode 400 整个历史。
buildChatMessagesFromItems 新增 lastTurnReasoning:记录本轮最近一次
reasoning,跨 tool output 存活,仅被 user 侧 item 清除;assistant 消息
(文本或 tool_calls)在 pendingReasoning 为空时回放本轮 reasoning。
2026-08-17 18:51:17 +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
lbyxiaolizi
612436a5a7
fix(openai-compat): Responses→Chat 桥接按 reasoning item id 缓存回注 reasoning_content
...
修复 #5520:Codex 经 force_chat_completions 桥接到 DeepSeek thinking 上游时,
历史中的 encrypted-only reasoning item(summary 为空 + 不透明 encrypted_content,
远程 compaction / 跨会话恢复后常见)取不出明文,后续 assistant 消息缺
reasoning_content,DeepSeek 400 "The reasoning_content in the thinking mode
must be passed back to the API",客户端仅看到通用 502。
reasoning item 的 id 一定会被客户端回传,以其为 key 做服务端缓存:
- GatewayCache 新增 Set/GetReasoningContent(Redis,默认 TTL 7 天)
- 响应侧:流式扫 response.output_item.done、非流式扫 output,把 reasoning
全文按 item id 写缓存;客户端断连后 drain 期间用 detached ctx 仍会写完
- 请求侧:apicompat 新增 ResponsesToChatCompletionsRequestWithOptions 与
ReasoningContentByID 钩子,encrypted-only item 查缓存补回 pendingReasoning;
缓存 miss/出错一律 fail-open 维持原行为
- 自愈:历史里带明文 summary 的 reasoning item 顺手刷新缓存,覆盖 Redis
flush / 跨实例漂移
测试:apicompat(命中恢复/miss 保持原样/明文优先)、service 端到端(流式
写缓存、请求侧回注+自愈)、repository miniredis 存取。
2026-08-17 16:48:36 +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