bug: BYOK 配置的自定义模型在模型选择器中不显示(桌面端 Windows + 移动端 iOS 均存在,v0.1.22)
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 401
- Avg merge
- 21h 48m
- Merged PRs (30d)
- 776
Description
### 问题描述 / What happened
我已在「设置 → 模型供应商」中配置了 BYOK(Bring Your Own Key)自定义 API 提供商,endpoint 为 `https://api.laxa.com`。配置已保存成功,子代理模型设置中也能识别并选择该提供商下的模型(如 `bytedance-seed/seed-2.1-pro`,见 `subagent-model-settings.json`),但**在新建对话的模型选择器下拉列表中,始终看不到该 BYOK 提供商提供的任何模型**。
此问题在**桌面端(Windows 10)**和**移动端(iOS)**均一致复现,两端都是最新版本 v0.1.22。
### 期望行为 / Expected behavior
已配置的 BYOK 自定义提供商及其模型应出现在「新建对话」的模型选择器可用模型列表中,用户可以在新建对话时直接选用。
### 实际行为 / Actual behavior
模型选择器中只显示 Cindy 官方预置/网关内置的模型,通过 BYOK 配置的自定义模型完全不出现,无法在对话中选用。设置页模型列表中可以看到,子代理模型设置也可以选,但主对话模型选择器缺失。
### 复现步骤 / Steps to reproduce
1. 打开 Cindy 桌面端(Windows 10,v0.1.22)或移动端(iOS,最新版)
2. 进入「设置 → 模型供应商」
3. 添加一个自定义 API 提供商(BYOK),配置 endpoint(如 OpenAI 兼容接口 `https://api.laxa.com`)并保存
4. 返回主界面,新建对话,打开模型选择器下拉列表
5. 观察列表中是否有 BYOK 提供商的模型 → **找不到**
6. 进入「设置 → 子代理模型设置」,可以看到 `bytedance-seed/seed-2.1-pro` 等模型是可选的,说明配置本身已生效
### 可能原因假设 / Suspected root cause
根据近期 PR #905(`fix(model-providers): mode 优先分类 + chat 准入过滤`)的变更描述:
> "`deriveAvailableModels` 按 `isChatEligible` 过滤,非聊天模型不进两个 runtime 的 `availableModels`,仍在设置页完整可见。"
怀疑 BYOK 自定义模型因上游未返回 `mode` 元数据(LiteLLM 常见值),被 `isChatEligible` 判定为非 chat-eligible 而被过滤掉,从而不出现在对话模型选择器(消费 `availableModels`)中。但设置页和子代理模型设置使用的是未过滤/不同的数据源,因此仍可见可选。
相关联的近期问题:
- #1047 「cindy账号登录后,会把已有提供商清除」
- #1028 「Scheduled Codex tasks lose provider binding and fail with Invalid model name」
- #1025 「自定义第三方 API 提供商时,模型设置缺少上下文窗口输入框」
- #995 / #942 关于自定义 Provider 模型 contextWindow 的相关讨论
这些问题均集中在 `@cindy/model-providers` 模块近期重构后出现,可能是同类回归。建议检查 BYOK 自定义模型在 `deriveAvailableModels` → `isChatEligible` 链路中是否因为缺少 `mode` 字段或错误分类而被误过滤。
### 环境 / Environment
- Cindy 版本: **v0.1.22**(2026-07-30 最新版,桌面端 + iOS 移动端一致)
- 桌面端平台: Windows 10 Home 10.0.19045
- 移动端平台: iOS
- 安装方式: Windows exe 安装包
- BYOK 配置: endpoint `https://api.laxa.com`,`source: "server"`
- 本地配置文件已验证存在:`model-access-credentials.json` 与 `subagent-model-settings.json`
### 日志与截图 / Logs & screenshots
本地配置验证:
- `model-access-credentials.json`: `{"source":"server","endpoint":"https://api.laxa.com"}`
- `subagent-model-settings.json`: `{"claudeCode": "bytedance-seed/seed-2.1-pro"}`
说明 BYOK 配置已被应用正确写入且子代理能识别,但主对话模型选择器未呈现。
Contributor guide
Research direction
Start in the @cindy/model-providers flow at deriveAvailableModels and isChatEligible, comparing the availableModels source used by the conversation selector with the settings and subagent model sources. Check how BYOK models without mode metadata are classified. Done means a configured custom provider model appears in the new-conversation selector on both desktop and mobile without hiding valid built-in models.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- backend, frontend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100