Skip to content

[功能] 裸模型名支持跨域回退(pool.cross_domain_fallback,默认关闭) - #232

Merged
linguo2625469 merged 1 commit into
linguo2625469:mainfrom
zkmydgth:feat/pool-cross-domain-fallback-135
Oct 21, 2026
Merged

linguo2625469 merged 1 commit into
linguo2625469:mainfrom
zkmydgth:feat/pool-cross-domain-fallback-135

Conversation

@zkmydgth

Copy link
Copy Markdown
Contributor

背景

关联 issue #135。当前 internal/server/resolve_model.go 把「模型名的域前缀」当作路由协议:不含 : 的裸模型名 realm 固定为 cn,随后 PickExcludingForRealm(tried, bare, realm) 按域过滤账号。于是裸名实际等价于 cn:<模型>——即使 global 账号能服务该模型,裸名请求也只会被送到 CN 号(典型表现:上游 11102 service info not found),而很多 OpenAI 兼容客户端一条供应商记录只存一个模型名、无法按失败切换模型名。

issue 里给了三种可选实现,本 PR 取第 1 种(新增开关、默认关闭),并额外覆盖第 3 种语义中的「另一域兜底」。

修改内容

  • 新增 pool.cross_domain_fallback(默认 false,零回归):cmd/server/config.go 加字段,main.go 启动与配置热更新两处注入 pool.SetCrossDomainFallback,config.example.json 与 README 参数表同步说明。
  • 区分「裸名」与「显式前缀」:resolve_model.go 新增 resolveModelDetail 返回 realmExplicit;resolveModel / ResolveModel 保持原有两返回值语义,既有调用方零改动。
  • 选号回退:handler.go 轮转循环里,裸名 + 开关开启时先看首选域是否有真正可服务的号(新增 pool.ServableForModelRealm,口径与 pick 候选一致,但不含全冷却兜底),没有则改用另一域;该域也选不到时再退回一次,仍由 MaxRotate 封顶,不会两域之间无限往返。
  • 会话粘性:裸名 + 开关开启时,粘性号允许落在任一域(否则回退成功后会被 realm 校验立刻解绑,退化成每轮重新选号)。
  • 用量/账本口径:回退命中后 modelRate 按实际服务域取值,账本与 /status 记的是真实域,而不是请求前缀声明的域。

行为边界

  • 显式 cn: / global: 前缀永不回退,写哪个域就只用哪个域。
  • 默认关闭;开启后跨域会消耗另一个域的额度,属显式策略选择。
  • 两个 realm 对同一模型的思考档位/上下文/输出上限可能不同,跨域回退后行为不完全一致(issue 里已提示,本 PR 不作归一)。

验证

  • go build ./...、go vet ./... 通过。
  • go test ./... 全量 15 个包全绿(含 internal/server、internal/pool、cmd/server)。
  • 新增测试:
    • internal/server/cross_domain_fallback_test.go:裸名 11102 后回退 global 成功;开关缺省关闭时保持 400 model_unavailable 且不跨域;显式 cn: 前缀零回退;首选域整域冷却时裸名回退另一域成功。
    • cmd/server/cross_domain_fallback_config_test.go:默认 false、配置文件覆盖为 true 生效。

说明

  • 不改 /v1/models 输出(不新增 auto: 之类别名),客户端无需改动即可受益。
  • 未使用 force push,未修改 Issue 状态。

@zkmydgth
zkmydgth marked this pull request as ready for review October 19, 2026 15:37
shinny-xionghongwei added a commit to shinny-xionghongwei/workbuddy2api-panel that referenced this pull request Oct 20, 2026
@linguo2625469
linguo2625469 merged commit b4714a0 into linguo2625469:main Oct 21, 2026
linguo2625469 added a commit that referenced this pull request Oct 21, 2026
冲突解决:main.go 两个 setter 并存(#232 跨域回退 + #158 调度);
frontend_test.go 保留三组备注/折叠测试与地区表单测试。
maintell added a commit to maintell/workbuddy2api-panel that referenced this pull request Oct 21, 2026
吸收的上游修复(均为 bug fix):
- linguo2625469#233 国际版 11-128 通道校验分流 + 始终发送 X-Conversation-ID(取代本地 linguo2625469#190 旧实现;11-128 不再硬禁用账号)
- linguo2625469#159 剥离 content 里的 reasoning_text 片段,修 Codex 转换后 11101
- linguo2625469#185 6021 queue.full 归为渠道级繁忙(不轮转、不罚号,503 upstream_busy)
- linguo2625469#217 同账号 refresh 单飞,避免 RT 复用撞 12153 掉登录
- linguo2625469#162 识别企业切换会话 token_source=enterprise_switch
- linguo2625469#199 缓存告警假阳性:miss 显式存在时对称反推 hit
另含 linguo2625469#138 linguo2625469#143 linguo2625469#144 linguo2625469#158 linguo2625469#178 linguo2625469#196 linguo2625469#205 linguo2625469#213 linguo2625469#220 linguo2625469#221 linguo2625469#223 linguo2625469#225 linguo2625469#230 linguo2625469#232 等功能更新。
本地改动:README 停维护声明改写为本 fork 口径;版本号 1.14.0-panel。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants