[BUG] ark-plan-api 不能正确添加提供商,也无法通过base url获取模型列表
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 35/100
- Issue 类型
- 缺陷
- 描述清晰度
- 基本清楚
- 活跃度
- 活跃
- 技术栈
- javascript, node.js
- 领域
- backend
调研方向
Start with the dsh-plugins/ark-plan-api package, especially its cordis.patch.yml and README, then inspect how the plugin’s provider configuration interacts with user patches and how model discovery builds /models requests. Reproduce both reports: a user llm-pi-ai provider patch hides the plugin routes, and the Agent Plan URLs return 404 for model listing while inference works. Done means the provider routes remain available with user configuration and the README explains that these endpoints do not support listing models.
由索引模型根据 Issue 内容生成。
描述
- 仓库:volcengine/ark-cli
- 组件:
dsh-plugins/ark-plan-api(npm:@volcengine/[email protected],当前 registry latest) - 建议标签:
bug
TL;DR
- 插件通过给
llm-pi-ai写一条 行补丁 来注入 5 条 Ark 路由。但 DSH 的行补丁语义是config整体替换、不做深合并,而用户自己的cordis.patch.yml永远最后应用。只要 profile 里已经有一条- id: llm-pi-ai(任何自定义过 provider 的用户都会有),插件的providers就会被整段覆盖 —— 安装成功、bundle 显示ok,但模型页里一条 Ark 路由都不出现,也没有任何警告。 - 即使按 README 手动添加,两个 base URL 也 无法“获取模型列表”:Agent Plan 的推理路由根本没有
/models端点(实测 404),而 DSH 的模型发现固定请求{baseURL}/models或{root}/v1/models。模型清单在方舟侧只能通过管理面(arkcli plans model-list)拿到。
环境
| 项 | 值 |
|---|---|
| DSH | 0.2.1-rc.3(桌面版,desktop profile) |
| dshmarket | 1.70.1 |
| OS | Windows 11 x64 |
| Node | v24.21.0 |
@volcengine/ark-plan-api |
0.1.0 |
问题一:安装后「设置 → 模型」里没有任何 Ark 提供商
期望
README 写的是:安装后 Ark Agent Plan / Coding Plan / 后付费模型 直接出现在 DSH 的模型选择器里,用户只需要贴 API Key。
实际
package.json的dsh.profile.bundles里确实有@volcengine/ark-plan-api,市场也显示 bundleok;- 但「设置 → 模型」里没有
ark-agent-plan-cn/ark-coding-plan-cn/ark-coding-plan-byteplus/ark-cn/ark-byteplus这 5 条路由中的任何一条; - 重启无效,日志里也没有任何相关警告。
根因:DSH 的 patch 是「整体替换 config」,用户层最后应用
DSH 的补丁合成语义(dsh-app-boot):
for (const [key, value] of Object.entries(overrides)) {
if (key === "id") continue;
target[key] = value; // config 整体替换,不是深合并
}
官方文档字符串也明确写了:
Other patches replace supplied fields; config is replaced wholesale, not deep-merged.
A patch config replaces the whole config.
应用顺序是:bundle 层(按 dsh.profile.bundles 顺序)→ 用户 cordis.patch.yml → launcher 层。
插件的 cordis.patch.yml 里这样写:
- id: llm-pi-ai
config:
providers:
ark-agent-plan-cn: ...
ark-coding-plan-cn: ...
# …共 5 条
而它的注释把安全性建立在这个假设上:
A row patch replaces the wholeconfigof the targeted row; dsh-base mountsllm-pi-aiwith no config, so restating onlyprovidershere is safe.
这个假设只在 profile 里没有别的层配置过 llm-pi-ai 时成立。 而用户层永远排在 bundle 层之后,所以只要用户已经写过:
- id: llm-pi-ai
name: "@deepseek-ai/dsh-llm-pi-ai"
config:
providers:
<自己的 provider>: ...
那么最终合成结果里的 llm-pi-ai.config.providers 就是用户那一段,插件的 5 条路由被整段丢弃 —— 静默失败。
这不是个别场景:llm-pi-ai 默认是空配置挂载,用户只要想用任何自定义 provider(自建网关、第三方协议、公司内网模型),就必然要在用户补丁层写这一行。也就是说,对最需要这个插件的用户群,插件默认完全无效。
复现步骤
- 任意 profile,在
~/.dsh/profiles/<name>/cordis.patch.yml里保留一条带providers的- id: llm-pi-ai(哪怕只有一个 provider)。 - 安装插件:
npx -y @deepseek-ai/dsh plugin --profile desktop add @volcengine/ark-plan-api - 重启 DSH,打开「设置 → 模型」。
- 结果:只有用户自己声明的 provider,插件的 5 条
ark-*路由全部缺失;无报错、无警告。
(把用户补丁层里的 llm-pi-ai 行整段删掉后,5 条路由才会出现。这也解释了为什么有人能正常看到、有人完全看不到。)
问题二:按 README 手动添加时,两个协议的 base URL 都「获取模型列表」失败
复现时使用的是文档给出的两个 base URL:
- Anthropic 兼容:
https://ark.cn-beijing.volces.com/api/plan - OpenAI 兼容:
https://ark.cn-beijing.volces.com/api/plan/v3
DSH 侧「获取模型列表」的请求 URL 构造规则(dsh-llm-pi-ai):
function listingUrl(baseURL, api) {
const base = baseURL.replace(/\/+$/, "");
if (api !== "anthropic-messages") return `${base}/models`;
return `${base.endsWith("/v1") ? base.slice(0, -3) : base}/v1/models?limit=${String(ANTHROPIC_MODEL_LIMIT)}`;
}
即:
- OpenAI 协议 →
GET https://ark.cn-beijing.volces.com/api/plan/v3/models - Anthropic 协议 →
GET https://ark.cn-beijing.volces.com/api/plan/v1/models?limit=1000
实测(有效 Agent Plan Key):
| 请求 | 结果 |
|---|---|
GET /api/plan/v3/models(Authorization: Bearer) |
404(空响应体) |
GET /api/plan/v1/models?limit=1000(Authorization: Bearer) |
404(空响应体) |
POST /api/plan/v1/messages(x-api-key 或 Authorization: Bearer) |
200(正常返回 type=message) |
POST /api/plan/v3/responses(Authorization: Bearer) |
200(正常返回 object=response) |
后两行是对照组:同一把 Key、同一批路由,推理接口完全正常,说明 Key 与鉴权都没问题;只有 /models 列表端点在 Agent Plan 路由上不存在。
所以:
- 「获取模型列表」失败不是用户的 Key 或网络问题,也不是前缀拼错;
- Agent Plan 的推理 base URL 不提供模型清单能力;方舟侧查询 Plan 可用模型的入口是管理命令
arkcli plans model-list --plan agent-plan,与推理 base URL 不是同一个面; - 插件 README 却只写「贴 Key 即可,无需额外配置」,没有提示「这两个 base URL 不支持拉取列表,必须手填模型或从
plans model-list导入」。
补充:用 Anthropic 协议、x-api-key 去请求 /api/plan/v1/models 会得到 401 AuthenticationError,而同一个 Key 请求 /api/plan/v1/messages 是 200 —— 这个 401 具有误导性,会让人以为 Key 无效或协议选错,实际原因是该路径不存在。建议至少在文档里点明。
- 主要语言
- jq
- 星标
- 147
- 派生
- 18
- PR 合并指标
- 30 天内没有已合并 PR
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
volcengine/ark-cli 的其他 Issue
-
不支持查询模型单元的数量?未关闭
难度 3/5 半天 新手友好度 22/100
volcengine/ark-cli#33 ·
-
难度 4/5 3-5 天 新手友好度 48/100
volcengine/ark-cli#30 · 1 条评论 ·
-
dsh-plugins/ark-managed-agents: client face crashes DSH Desktop boot on 0.2.0-rc.2 (MCP row is fine)未关闭
难度 3/5 1-2 天 新手友好度 35/100
volcengine/ark-cli#29 · 1 条评论 ·
-
难度 4/5 3-5 天 新手友好度 25/100
volcengine/ark-cli#28 · 2 条评论 ·
-
难度 4/5 3-5 天 新手友好度 48/100
volcengine/ark-cli#27 · 1 个 reaction ·
查看 volcengine/ark-cli 的全部 Issue
相似的 Issue
-
Chip source filter and denial markers miss Storage rows when a Storage activity source is picked未关闭bug
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
desktop linux photos
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
type: dependency-upgrade
难度 1/5 1 小时以内 新手友好度 70/100
spring-projects/spring-security#20053 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
fritzprix/libr-agent#2612 ·
维护者通常 1 天内回复
-
[BUG][UI-REWRITE]: Catalog OAuth form requires authorization and token URLs the server discovers未关闭1.1-Phase-1 bug frontend oauth-oidc ui-rewrite
难度 2/5 1-3 小时 新手友好度 83/100
IBM/mcp-context-forge#7464 ·
维护者通常 3 天内回复