feeeei
64331a9792
ui(gemini): Vertex 显示名改为 Agent Platform (Vertex)
...
Google 已将 Vertex AI 更名为 Gemini Enterprise Agent Platform。
账号类型按钮、平台徽章、Vertex 相关提示、配额文档链接与批量生图报错文案
统一显示为 Agent Platform (Vertex);创建账号弹窗的 Vertex 按钮改用 i18n 文案。
2026-10-10 23:37:48 +08:00
feeeei
3abd646582
fix(ops): Gemini 原生路由的网关本地错误按错误类型归类
...
Google 格式错误体没有 type 字段,ops 一律记为 api_error,客户端参数错误、
引用不存在的缓存等都被归为平台内部错误。
- googleError 写出时按状态码向 ops 登记错误类型:400/413 invalid_request_error、
401 authentication_error、403 permission_error、404 not_found_error,
429 与 5xx 不登记
- 计费、并发与风控拦截沿用 Claude / OpenAI 格式错误的类型与错误码,归类口径一致
- 存储价未配置、显式缓存未启用改用 googlePlatformError,仍按平台错误统计;
错误透传规则改写的上游错误不登记本地类型
- 上游返回的缓存不存在标记为请求级失败:按客户端请求错误分类,
上游原始错误保留为明细但不参与上游归因
2026-10-10 23:37:48 +08:00
feeeei
d5a802f84a
feat(gemini): 支持显式上下文缓存(AI Studio / Vertex / 自建网关上游)
...
新增 /v1beta/cachedContents 的创建、列表、查询、更新有效期与删除接口。
参与账号:官方地址的 AI Studio API Key 账号、Vertex service account 账号,
以及开启"上游支持显式缓存"的自定义地址 API Key 账号。
- 网关自发缓存 ID,绑定上游资源名、持有账号与创建它的 API Key
(迁移 243 gemini_cached_contents);list/get 只读本地记录
- 引用缓存的 generateContent / streamGenerateContent / countTokens
改写为上游资源名,只发往持有缓存的账号,不参与会话粘性、不换号;
拒绝重复键与 snake_case 写法;在持有账号上重试耗尽后,
上游 429 / 5xx 原样透传,401 / 403 映射为 502
- 计费:创建时一次性收取缓存 token 输入费与整个有效期的存储费;
延长按库中实际推进的时长收费,纯存储费不算一次请求;缩短与删除不退费
- 存储单价随计费模型取价,来自定价覆盖文件字段
cache_storage_cost_per_token_per_hour,未配置的模型拒绝创建;
存储费同时计入账号统计成本,渠道按 token 重算成本时叠加且不重复计入
- 扣费前校验:创建在上游建成后按确定金额校验余额 / 订阅额度 /
API Key 额度并登记不封顶的在途预留,不足时删除上游缓存、只收输入费;
延长在调用上游前按增量时长校验
- 有效期上限 gateway.gemini_cached_content_max_ttl_seconds,默认 86400,
有效期向上取整到秒;创建请求保留数字原文、兼容 snake_case 元数据字段
- 上游调用与落库同客户端连接脱钩;2xx 不可用响应不换号并删除已建缓存
- 缓存不存在:AI Studio 的 403、Vertex 生成请求的 400 与缓存资源接口的
404 统一识别;原生转发(含流式)不重试、不换号、不改账号状态,
向客户端返回标准 403,不暴露上游缓存资源 ID,上游原始错误登记到 ops;
PATCH 遇上游 404 移除本地记录并返回 403,DELETE 视为成功
- 自建网关上游:账号开关 explicit_cache_upstream,缓存接口发往账号自身
base_url;可选 explicit_cache_upstream_max_ttl_seconds 对齐上游 TTL 上限,
显式 TTL 超限时创建跳过该账号(全部超限返回 400),未显式时按上限创建,
PATCH 取本站与账号上限的较小值;绑定缓存的请求在网关账号上收到
429 / 5xx 时不重试、不限流该账号;前端创建 / 编辑账号弹窗新增开关与上限输入框
- 用量与 ops 端点统计:带缓存 ID 的路径归一化为 /v1beta/cachedContents,
缓存操作的上游端点记为 /v1beta/cachedContents
2026-10-10 23:37:47 +08:00
feeeei
3bfd40f5af
fix(gemini): 引用缓存不存在的 403 不再停用账号并换号
...
上游对不存在、已过期、已删除或不属于当前项目的 cachedContent 一律返回
403 "CachedContent not found (or permission denied)"。原生转发路径在错误
策略之前识别该响应,原样返回客户端,不标记账号错误、不临时停调度、
不重试、不换号;其余 403 处理不变。
2026-10-10 23:36:17 +08:00
github-actions[bot]
3a6fd1c9db
chore: sync VERSION to 0.2.15 [skip ci]
2026-10-09 03:36:07 +00:00
Wesley Liddick
f2669c8cf6
Merge pull request #7939 from IrisRainbowNeko/fix/issue-7927-web-search-history-tool
...
fix(openai): declare web_search when OAuth history replays web_search_call
v0.2.15
2026-10-09 11:19:17 +08:00
shaw
85e3110953
fix(lint): check type assertions in web_search history helper and test
2026-10-09 11:10:11 +08:00
IrisRainbowNeko
64caa9af8b
fix(openai): declare web_search via additional_tools for Responses Lite
...
Responses Lite rejects hosted tools at the top level ("responses Lite does
not support top-level tool type web_search"), so Lite requests now carry the
injected web_search tool in an input additional_tools item: extend the
caller's first additional_tools item, or insert one before a trailing
compaction_trigger so the v2 compaction wire keeps the trigger last.
The HTTP passthrough path also runs the shared compatibility normalizer on
/responses/compact; thread the compact flag through so that endpoint is
left untouched, and drop the now-redundant call from the passthrough OAuth
body normalizer.
2026-10-09 11:03:13 +08:00
IrisRainbowNeko
dab3b87ea2
fix(openai): declare web_search when OAuth history replays web_search_call
...
ChatGPT's Codex endpoint now rejects requests whose input replays a hosted
web_search_call item unless tools declares web_search, failing the stream
with "response protection is unavailable". Codex local context compaction
sends the full history with tools:[], so every compaction after a web search
fails and the session gets stuck in a reconnect loop.
For OAuth transform, passthrough and WebSocket paths, append a cached-only
web_search tool when the history contains web_search_call and no web_search
tool is declared. When the caller offered no tools, pin tool_choice to
"none" so the injected tool cannot be invoked. The /responses/compact wire
shape is left untouched.
Fixes #7927
2026-10-09 11:03:13 +08:00
Wesley Liddick
d0392edf06
Merge pull request #7618 from SavitarC/feat/provider-profile
...
feat(platform): 平台与多协议供应商改为数据驱动,并接入 Command Code 与 Cline
2026-10-09 11:01:09 +08:00
SavitarC
d85cebecc4
fix(ci): 升级 schema 导入器支持 Go 1.27.2 导出格式
2026-10-09 10:40:59 +08:00
SavitarC
5f93bb3b3f
fix(ci): 升级 lint 支持 Go 1.27.2 并保留 HTTP2 兼容检查
2026-10-09 10:38:48 +08:00
SavitarC
c61f6ebaa8
fix(security): 升级 Go 1.27.2 与 x/net 修复安全扫描
2026-10-09 10:25:25 +08:00
SavitarC
387ee20ed1
test(platform): 补录制路由基准与平台约束迁移防护
2026-10-09 10:11:06 +08:00
SavitarC
7ca08d521f
fix(frontend): 按平台能力展示模型同步入口并同步 Zen 规则
2026-10-09 10:11:06 +08:00
SavitarC
9264414612
fix(provider): 修复 Claude 计费与钱包冷却并隔离模型目录缓存
2026-10-09 10:11:06 +08:00
SavitarC and Claude Opus 5.5
874871a25a
feat(platform): 接入 Cline 平台
...
Cline API(https://api.cline.bot/api/v1)是 OpenAI 兼容的多模型聚合端点,
只提供 Chat Completions(Cline 自己的客户端同样只走该端点),模型名带厂商
前缀。同一个 API Key 下有两个互不影响的额度来源,由模型名决定扣哪一边:
cline-pass/* 走 ClinePass 订阅(5 小时 / 7 天 / 30 天滚动上限),其余付费
模型扣账户积分;cline-free/* 免费模型只有逐模型的每日额度。
转发:
- 平台清单与 provider profile 新增 cline:按入站协议分流,只登记 Chat
Completions 端点,Responses / Anthropic 入站由现有转换链转为 Chat
Completions,无需新增转发代码。
- 只有一个接入模式,不需要选择账号类型。
- 连接测试未指定模型时使用 profile 默认模型(固定 Chat Completions 的账号
此前落到不带厂商前缀的通用默认模型);订阅了 ClinePass 的账号改用订阅
模型,不消耗积分,ClinePass 冷却中时仍用按量模型。
用量与余额:API Key 调 /api/v1/users/me/plan/usage-limits(三档窗口的已用
百分比与重置时间,未订阅时 404)与 /api/v1/users/me、/users/{id}/balance
(余额单位为百万分之一积分,1 积分 = 1 美元),兼容 {success, data} 信封,
只查官方主机。复用额度探测与周期检测:账号列表显示 ClinePass 窗口与积分
余额;窗口用满时 ClinePass 模型冷却到重置时间,未订阅时不调度 ClinePass
模型,积分低于阈值时冷却付费模型;数据显示恢复后自动解除,但只解除探测能
证明已恢复的原因(窗口用满、未订阅、积分不足),组织账户、所需订阅档位、推理
额度与花费上限的冷却到期后由请求重新确认。周期检测中走账号接口探测的平台
改为登记表(平台、支持判定、检测函数一一对应),按账号所属平台分派。
上游错误(依据 docs.cline.bot/api/errors 与 Cline 客户端的错误分类,按文案
识别):积分不足(含其他 402)、组织花费上限、推理额度上限、ClinePass 超限、
未订阅 ClinePass / 组织账户、免费模型每日额度。两边的超限只冷却请求模型所属
的一边(模型级冷却键 cline:pass / cline:credits,调度按请求模型检查),不停
整个账号;免费模型只限该模型,冷却到文案中的 "try again in …"。ClinePass
超限冷却到快照中对应窗口的重置时间,没有快照时 5 小时窗口 1 小时、7 天
6 小时、30 天 24 小时。普通频率限制走默认 429 逻辑。402 的冷却写入失败时
也不落入默认分支永久置 error(探测只覆盖激活账号,置 error 后无法自动恢复)。
余额类冷却时长抽为 cnBalanceCheckCooldown 共用。
上游计费探测的官方域名加入 cline.bot。
前端:官方标志(机器人头像)、violet 配色(品牌紫)、复用额度与余额单元格
(同样只对官方主机上的 API Key 账号显示);接入模式展示名抽为共用函数,编辑
弹窗不再显示原始模式值。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-09 10:11:06 +08:00
SavitarC and Claude Opus 5.5
e2939cd8fa
feat(platform): 接入 Command Code 平台
...
转发:
- 平台清单与 provider profile 新增 command_code:按模型分流,Chat
Completions / Responses 基址 https://api.commandcode.ai/provider/v1 ,
Anthropic 基址 https://api.commandcode.ai/provider;内置规则 claude-* →
Anthropic、gpt-* → Responses(也支持 Chat Completions)。
- 原生 Anthropic 端点的版本感知拼接改按分流方式判断,转发与连接测试共用
(Anthropic 基址带 /v1 时连接测试不再误报为配置错误)。
按模型的协议集合(模型支持入站协议时直通,免去协议转换):
- 分流规则可带协议集合 protocols(首项为首选协议):入站协议在集合中时同
协议直通,否则走首选协议;只有一个协议时与原规则相同,OpenCode 行为不变。
- profile 新增 model_catalog:Command Code 的 /models 为每个模型给出
supported_endpoints。官方默认地址的目录按地址全进程共享,自定义上游按账号
隔离;目录请求的 UA 收敛与账号请求头覆写与转发一致。目录缓存 30 分钟、后台
刷新,失败退避 5 分钟;从未加载成功时首批请求最多等 2 秒,冷启动也按目录
分流。账号规则未命中的模型按目录取协议集合;目录不可用时回落内置规则(账号
未配置规则时)或 Chat Completions。
- 三个入站入口共用的 resolveUpstreamProtocol 增加目录参数。
- 前端分流规则编辑器可为每条规则勾选"也支持"的协议;提供模型目录的平台,
兜底行改为说明按上游模型列表选协议。
连接测试:
- 按模型分流的平台共用一条测试路径(协议与网关同一判定,含模型目录;默认
测试模型取自 profile),不再落入 Claude 测试路径。
- 首个分支由"国产厂商"改为"按入站协议分流";adaptive 测试跳过 profile 未
提供的 Anthropic 端点。现有国产厂商行为不变。
- 连接测试是 OpenCode 专属分流入口的最后一个调用方,改走统一判定后删除
ResolveOpenCodeGoUpstreamProtocol、openCodeGoNativeProtocol,以及此前就只剩
测试使用的 OpenCodeGoModelProtocol;路由矩阵的旧行为基准改为测试内独立复述。
额度与余额(/alpha/whoami、billing/credits、billing/subscriptions、
usage/summary):
- 额度探测写入 5 小时 / 每周窗口(限额套餐)与还原出的月度窗口,同时写入
积分余额;余额探测只取积分。仅对官方主机上的 API Key 账号生效。
- 订阅周期或本周期用量取数失败时保留上一次的月度快照,不当作没有月度窗口
清掉;窗口尚未开始(没有重置时间)时清掉上一个窗口的重置时间。
- whoami 取不到时探测整体失败,不按个人账户继续(组织账号会查到成员的个人
钱包,并据此按余额停调)。
- 阈值停调与定时检测纳入 Command Code;有充值积分时上游跳过窗口检查,窗口
快照不参与停调与冷却;积分低于余额阈值时临时停调。
- 上游计费探测的官方域名加入 commandcode.ai,不把 Key 发往官方主机上并不
存在的中转计费接口。
上游错误(依据 commandcode.ai/docs/troubleshooting/errors,按文案分类,
402 / 403 / 429 同样处理):
- 5 小时 / 每周窗口用满:带原因的临时停调,到文案中的 "Resets in …",解析
不出时回落额度快照;充值积分不受窗口限制,额度 / 余额探测发现充值积分后
只解除这一类停调。
- 积分耗尽(含 usage_exceeded):可恢复的临时停调,积分恢复后由周期检测
解除,不再永久置为 error。
- 组织花费上限:文案指明模型("set for <模型>")且请求模型已知时只写模型级
限流;成员总额度或作用域不明时整个账号冷却,最长一小时。
- 普通频率限制走默认 429 逻辑,不再冷却到窗口重置点。
前端:
- 账号列表显示额度窗口与积分余额,阈值设置增加 command_code。单元格可见性
改为按账号判定,与后端一致:只对官方主机上的 API Key 账号显示,自定义中转
显示占位符,不再每次打开列表都探测出一行报错。
- 使用官网的官方标志(圆角方块内镂空 ⌘);配色为中性灰(品牌黑色已由
Grok 使用)。
测试基准中原先用作"仅服务端登记"示例的 command_code 改为虚构的 acme_router;
新增的前端测试加入 CI 前端关键测试列表。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-09 10:11:05 +08:00
SavitarC and Claude Opus 5.5
7ffa38a8ae
feat(frontend): 平台列表与多协议账号表单改由平台清单驱动
...
后端新增 BuildPlatformCatalog:平台清单加上多协议供应商 profile(接入模式、
各协议默认基址、内置分流规则),由测试 TestFrontendBuiltinPlatformCatalogInSync
写成前端内置清单 constants/platformCatalog.builtin.json 并校验一致。前端随后端
一同构建发布,直接使用该清单,取代 credentialsBuilder.ts 中需要手工同步的默认
端点与 OpenCode 分流规则。
改为读取平台清单:
- 平台选项 CONCRETE_PLATFORM_OPTIONS / GROUP_PLATFORM_OPTIONS、平台展示名
platformLabel 以及各处 i18n 平台名的默认值;
- 渠道定价平台与组合分组平台、用户平台额度、上游模型同步可用平台;
- 多协议供应商判断、原生协议能力、各接入模式的默认端点与内置分流规则、
请求头覆写资格;
- 系统默认额度与各登录方式默认额度:此前前端只列出 5 个平台(新增国产厂商
与 OpenCode 时漏改),后端一直支持全部平台,现在按清单列出全部平台。
没有专属界面的多协议供应商走通用表单:创建弹窗列出其按钮,接入模式、可选
协议、默认端点与分流规则都来自 profile(按模型分流的供应商显示分流规则编辑
器);编辑弹窗同样适用。未登记专属图标 / 配色的平台使用通用图标与中性配色。
平台按钮分三行:国际平台、国产厂商、多模型聚合平台(OpenCode 与平台清单中
登记的其他多协议供应商)。没有内置模型列表的供应商不预填模型白名单(此前
回落 Claude 模型列表,新账号只接受这些模型),API Key 输入框也不再显示
Claude 的占位符与说明。
AccountPlatform / GroupPlatform 类型放宽为"内置平台 | 任意字符串"。新登记
平台只需重新生成内置清单,无需修改前端代码。
另修正编辑弹窗两处遗漏 MiniMax 的默认端点回退(清空 Base URL 时曾回落到
Anthropic 默认地址)。
测试:credentialsBuilder 以改动前实现为基准,逐一比较全部平台 × 接入模式 ×
协议的默认端点与各判断;替换清单后平台选项、展示名、额度列表随之更新;创建 /
编辑弹窗对走通用表单的供应商(按模型 / 按入站两种分流)提交的凭证。更新了
两个固定旧列表写法的测试。平台清单与账号表单的测试加入 CI 前端关键测试列表
(FRONTEND_CRITICAL_VITEST)。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-09 10:10:33 +08:00
SavitarC and Claude Opus 5.5
c556aee8fd
refactor(platform): 多协议供应商的转发与探测判断改查 profile
...
平台清单之外,后端还有几处用"国产厂商"或"国产厂商 ∪ OpenCode"表示
多协议供应商,新登记的供应商会被漏掉(例如上游模型同步直接报不支持)。
- 适用于全部多协议供应商的判断改用 IsMultiProtocolAPIKey:上游模型同步与
模型目录基址、Anthropic count_tokens 本地估算、HTML 403 豁免与累计计数、Claude 型号
计费候选过滤;
- 新增 RoutesProtocolByInbound(profile 分流方式为按入站协议),替换原来
只针对国产厂商、实际描述"按入站协议分流"的判断:Responses 直转回退、
Responses 能力标记(含创建 / 更新后的异步探测调度)、上游计费探测的
adaptive 基址、Anthropic API Key 鉴权方式、OpenAI 输入 token 本地估算。
按模型分流的供应商(OpenCode)仍走 routesByModel 分支。
依赖各家额度 / 余额接口的逻辑(Coding Plan 窗口、余额不足冷却等)仍按平台
显式判断。现有平台上两组判断与改动前逐一相同(测试覆盖全部平台与非法值);
另测试临时登记的新供应商按分流方式分别获得国产厂商与 OpenCode 的行为。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-09 10:10:33 +08:00
SavitarC and Claude Opus 5.5
eefa7dd9dc
refactor(platform): 平台白名单由数据库约束改为应用层校验
...
新增迁移 242 删除 user_platform_quotas_platform_check 与
composite_model_routes_target_platform_check(DROP ... IF EXISTS,可重入)。
此后新增平台只需在平台清单中登记,不再需要改约束的迁移;此前 Grok、国产
厂商、MiniMax、OpenCode 共写过 5 次。
平台合法性改由应用层保证,与原约束的拒绝范围相同:
- user_platform_quotas 用原生 SQL 写入,不经过 ent Validate,repository 在
BulkInsertInitial / UpsertForUser 写入前校验平台,非法值在发出任何 SQL 前
返回错误(此前由数据库拒绝并回滚);
- ent schema 的 platform / target_platform 校验改查平台清单,组合路由新增
target_platform 校验(service 层与 admin 接口的原有校验保留)。
渠道监控的 provider 约束表示已实现的探测能力,不属于平台清单,保留不动。
集成测试(真实 PostgreSQL):在还原旧约束的库上重复执行迁移、约束被移除、
渠道监控约束保留、数据库层可写入未来的新平台值;repository 拒绝未登记平台
且不产生副作用(去掉校验后该测试失败)。全部仓储集成测试通过。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-09 10:10:33 +08:00
SavitarC and Claude Opus 5.5
3b89cc08dd
refactor(platform): 后端平台列表改由平台清单派生
...
新增 domain/platforms.go 作为具体平台的单一数据来源:每个平台一条登记,
写明展示名、所走网关(anthropic / openai / gemini / antigravity)、是否国产
单一厂商、定价目录 provider 名,顺序即展示顺序。
以下列表与判断改为查平台清单:
- "全部具体平台":用户平台额度白名单、错误透传规则平台列表、组合路由目标
校验、上游计费探测资格、调度快照遍历、组合分组的定价 / 模型映射回退、
组合分组默认模型列表;
- "OpenAI 网关族":IsOpenAICompatible、NormalizeOpenAICompatiblePlatform、
Responses 兼容路由判断、count_tokens 分发、组合分组的 OpenAI 文本目标;
- 国产厂商判断、渠道定价同步的 provider 映射;
- 多协议 API Key 供应商相关的请求头覆盖资格、凭证测试、OpenAI 基址回退改用
IsMultiProtocolAPIKeyProvider;
- 分组平台与组合路由目标的请求校验改为自定义校验标签 group_platform /
concrete_platform,拒绝规则不变(大小写、首尾空格、别名一律拒绝)。
组合分组的逐平台回退是先命中者生效,CompositePrecedencePlatformIDs 保持
原有顺序 anthropic、gemini、openai,其余按登记顺序追加。依赖具体实现的
能力(OAuth、渠道监控、调度阈值、余额 / 用量窗口、Codex 模型目录等)仍在
各自代码中显式列出。
等价性测试把改动前的每个列表与 switch 原样保留为基准,逐一比较派生结果
(含顺序),谓词覆盖全部平台、composite 与非法值 × 全部账号类型。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-09 10:10:33 +08:00
SavitarC and Claude Opus 5.5
105c955c88
fix(gateway): /v1/responses 转 Anthropic 时统一以去空白的请求模型兜底映射
...
forwardResponsesViaNativeAnthropic 的 defaultMappedModel 是账号 model_mapping
未命中时的兜底模型。此前按模型分流的账号(OpenCode)传空串、其余账号传
reqModel,源自两处分支各自实现。映射未命中且请求模型带首尾空白时,前者的
计费模型名保留空白(上游模型名因 normalizeOpenAIModelForUpstream 已去空白,
两者不一致,定价查找可能落空),后者为去空白的名字。
统一传 reqModel,并移除入口里最后一处 routesByModel 分支。仅影响按模型
分流账号收到带首尾空白模型名的请求:计费模型名改为去空白后的名字;发往
上游的请求不变。新增测试覆盖 OpenCode 与 Kimi 两类账号。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-09 10:10:32 +08:00
SavitarC and Claude Opus 5.5
8ac2936a3d
refactor(gateway): 三个入站入口的上游协议分流收敛为 resolveUpstreamProtocol
...
此前 /v1/responses、/v1/chat/completions、/v1/messages 各自用一串 if 决定
上游协议:OpenCode 按模型规则、国产 adaptive 按入站、显式 api_protocol、
Responses 探针四个来源的优先级靠语句先后隐式决定,且每个入口都有
IsOpenCodeGo 特判。
- provider profile 新增 Routing(by_inbound / by_model),OpenCode 登记为
by_model;routesByModel 取代转发路径与 GetAPIProtocol 默认值中的
IsOpenCodeGo 判断。
- 新增 upstream_protocol_routing.go:resolveUpstreamProtocol 以单一函数给出
上游协议(按模型分流 → adaptive 按入站 → 显式 anthropic → CC 直转条件
→ Responses),resolveModelRoutedProtocol 以 profile 规则泛化 OpenCode
的规则解析;三个入口改为 switch 该结果选择既有转换路径,Responses 形状
请求体的转换合并为 convertResponsesShapedChatBody。
转换函数本身不变。新增分流矩阵测试经真实入口遍历 平台 × api_protocol ×
探针 × 账号类型 × 接入模式 × protocol_rules × 入站 × 模型(2045 组),
与改动前逐条 diff 仅 6 条不同:智谱 adaptive 的非 API Key 账号(UI 无法
创建)在 /v1/responses 入站时由 Responses 改为回落 CC,与
/v1/chat/completions 入口一致;这 6 组前后都在发出上游请求前报错。
协议规则与映射模型相关的类型、函数已被所有按模型分流的供应商共用,同时去掉
OpenCode 前缀(OpenCodeGoProtocolRule → ProtocolRule、matchOpenCodeGoProtocolRules
→ matchProtocolRules、NormalizeOpenCodeGoProtocolRulesCredentials →
NormalizeProtocolRulesCredentials、resolveOpenCodeGoMappedModel →
resolveMappedUpstreamModel 等),并删除收敛后已无调用方的
defaultOpenCodeProtocolRules。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-09 10:10:32 +08:00
SavitarC and Claude Opus 5.5
3f8eea0807
refactor(provider): profile 端点改为按协议登记,Responses 路径约定并入 profile
...
ProviderEndpoints 由 ChatBaseURL + AnthropicBaseURL 改为以协议为键的
BaseURLs(chat_completions / responses / anthropic),与账号凭证
api_base_urls、前端 defaultCNAdaptiveBaseUrls 的结构一致:
- 某协议没有条目即表示不提供该原生端点,SupportsNativeCNResponses 改为
由 responses 条目推导,去掉单独的 NativeResponses 布尔值;
- DeepSeek 的 Responses 路径例外(/responses,无 /v1)从
buildOpenAIResponsesURLForPlatform 的平台硬编码移入 profile.ResponsesPath。
运行时行为不变。唯一的函数级差异:智谱 adaptive 账号的
GetCNProtocolBaseURL(responses) 默认值由 CC 基址变为空串;所有运行时调用方
均先经 UsesNativeCNResponses / SupportsNativeCNResponses 守卫,智谱不会走到,
TestAdaptiveProtocolBaseURLs 的对应期望随之更新。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-09 09:17:41 +08:00
SavitarC and Claude Opus 5.5
c063a4016e
refactor(provider): 以 provider profile 收敛多协议供应商默认端点表
...
多协议 API Key 供应商(kimi/zhipu/deepseek/minimax/opencode_go)的默认端点
此前在 account.go 的 GetOpenAIBaseURL / defaultCNProtocolBaseURL /
GetAnthropicProtocolBaseURL / GetOpenAIFormatBaseURL 中按平台 switch 重复了
四遍,Responses 能力与 OpenCode 内置分流表也各自散落。
新增 provider_profile.go 作为单一数据来源:每个供应商登记各接入模式的
Chat/Anthropic 默认基址、内置 protocol_rules 与原生 Responses 能力;
上述函数、SupportsNativeCNResponses、IsMultiProtocolAPIKeyProvider 与
defaultOpenCodeProtocolRules 改为查表。纯重构,行为不变:新增测试以旧
switch 逻辑为基准,逐一核对平台 × account_mode × 协议的全部组合。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-09 09:17:41 +08:00
Wesley Liddick
5fc0e486c3
Merge pull request #7916 from wucm667/fix/issue-7914-monitor-request-sample
...
fix(channel-monitor): require request samples before health scoring
2026-10-08 13:52:34 +08:00
Wesley Liddick
3e69643392
Merge pull request #7721 from ouchihao/codex/bug-fractional-byte-rate
...
fix(ops): retain byte units for sub-byte throughput
2026-10-08 13:51:52 +08:00
Wesley Liddick
3a012ac0ce
Merge pull request #7725 from ouchihao/codex/bug-select-disabled-open
...
fix(ui): close selectors when they become disabled
2026-10-08 13:51:40 +08:00
Wesley Liddick
80dd7288a6
Merge pull request #7728 from ouchihao/codex/bug-oauth-code-unmount
...
fix(auth): avoid starting OAuth code cooldowns after unmount
2026-10-08 13:51:30 +08:00
Wesley Liddick
5a6e826f83
Merge pull request #7716 from ouchihao/codex/bug-scaled-price-exponent
...
fix(pricing): preserve exponents when trimming scaled prices
2026-10-08 13:51:19 +08:00
Wesley Liddick
d068b866f3
Merge pull request #7718 from ouchihao/codex/bug-bulk-user-error-message
...
fix(users): show normalized errors when bulk updating limits
2026-10-08 13:51:05 +08:00
Wesley Liddick
a618338987
Merge pull request #7719 from ouchihao/codex/bug-notify-email-timers
...
fix(profile): ignore obsolete notification email code responses
2026-10-08 13:50:54 +08:00
Wesley Liddick
b0c2c4d623
Merge pull request #7720 from ouchihao/codex/bug-usage-zero-rate
...
fix(usage): preserve zero user multipliers in cost details
2026-10-08 13:50:39 +08:00
Wesley Liddick
9663b5ccf0
Merge pull request #7722 from ouchihao/codex/bug-announcement-read-failure
...
fix(announcements): report failed read confirmations accurately
2026-10-08 13:50:19 +08:00
Wesley Liddick
6cfa0f4ef8
Merge pull request #7723 from ouchihao/codex/bug-batch-image-access-retry
...
fix(batch-image): allow access lookup retries after request failures
2026-10-08 13:50:08 +08:00
Wesley Liddick
3149d62851
Merge pull request #7724 from ouchihao/codex/bug-cleanup-task-race
...
fix(usage): ignore obsolete cleanup task list responses
2026-10-08 13:49:58 +08:00
Wesley Liddick
0b51cbe15d
Merge pull request #7729 from ouchihao/codex/bug-backup-polling-unmount
...
fix(backup): prevent polling from restarting after navigation
2026-10-08 13:49:48 +08:00
Wesley Liddick
3dc2a9c371
Merge pull request #7731 from ouchihao/codex/bug-dialog-escape-stack
...
fix(ui): limit Escape to the most recently opened dialog
2026-10-08 13:49:34 +08:00
Wesley Liddick
2c13fb595e
Merge pull request #7764 from ouchihao/codex/bug-plugin-config-session-race
...
fix(plugins): ignore obsolete configuration UI sessions
2026-10-08 13:49:23 +08:00
Wesley Liddick
068239305e
Merge pull request #7765 from ouchihao/codex/bug-compliance-reset-race
...
fix(auth): keep cleared compliance state isolated from pending requests
2026-10-08 13:49:13 +08:00
Wesley Liddick
9e46f2d77e
Merge pull request #7732 from ouchihao/codex/bug-step-up-concurrent-prompts
...
fix(auth): share pending step-up verification prompts
2026-10-08 13:48:52 +08:00
Wesley Liddick
2eb7ccb6d2
Merge pull request #7703 from wucm667/fix/issue-7700-thinking-signature
...
fix(openai): recover rejected encrypted reasoning signatures
2026-10-08 13:48:33 +08:00
Wesley Liddick
745ff1d3ca
Merge pull request #7911 from lyy0709/codex/usage-output-tps
...
feat(usage): add output TPS to usage logs and ops dashboard
2026-10-08 11:40:15 +08:00
Wesley Liddick
8e2c4fad32
Merge pull request #7793 from wucm667/fix/issue-7784-composite-route-model-list
...
fix(models): list composite exact route aliases
2026-10-08 11:39:51 +08:00
Wesley Liddick
0ac774e378
Merge pull request #7853 from wucm667/feat/issue-7847-compact-account-filters
...
feat(accounts): compact account search and filters
2026-10-08 11:39:40 +08:00
Wesley Liddick
ba3af61251
Merge pull request #7897 from wucm667/fix/issue-7894-long-context-marker
...
fix(usage): replace misleading long-context multiplier badge
2026-10-08 11:37:40 +08:00
Wesley Liddick
48c647b5d2
Merge pull request #7833 from ShanYi-Hui/fix/preserve-email-binding-draft
...
fix(profile): preserve email binding draft during user refresh
2026-10-08 11:37:25 +08:00
Wesley Liddick
b94974467b
Merge pull request #7818 from ouchihao/codex/bug-custom-page-request-race
...
fix(custom-pages): ignore obsolete Markdown responses
2026-10-08 11:37:11 +08:00
Wesley Liddick
4747827e35
Merge pull request #7819 from ouchihao/codex/bug-stripe-payment-unmount
...
fix(payment): stop late Stripe callbacks after leaving the page
2026-10-08 11:36:59 +08:00