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
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
lyy0709
8d82bb069c
fix(openai): expose bulk account settings
2026-08-17 13:56:16 +08:00