Skip to content

Commit 4548310

Browse files
authored
Merge pull request #611 from yrooogerg/feat/volcengine-providers
feat(providers): add Volcengine Ark presets Adds canonical presets for the three Ark billing routes: pay-as-you-go, Coding Plan, and Agent Plan. Credential-destination evidence gate settled from opened primary sources; ledger in the PR comment thread. Volcengine publishes a first-party Codex CLI integration guide and lists Claude Code / OpenCode / OpenClaw as supported clients, and each user supplies their own plan key, so this is documented client use rather than aggregation. Both Plan presets disclose the coding-tools-only restriction and its account-ban consequence, resolved by destination so a preset saved under a custom name keeps the warning. Outstanding: named maintenance owner for the static catalogs.
2 parents 7b6f4f4 + 688fd77 commit 4548310

30 files changed

Lines changed: 706 additions & 34 deletions

docs-site/src/content/docs/guides/providers.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ selectors, then retry. Signing in from a machine with no existing `kiro-cli` ses
190190

191191
## 3. API-key catalog
192192

193-
opencodex ships 62 built-in presets: 51 key-based, seven OAuth, three local, and the default
193+
opencodex ships 65 built-in presets: 54 key-based, seven OAuth, three local, and the default
194194
ChatGPT-forward preset. The dashboard's **Add provider** picker opens a key provider's dashboard,
195195
validates the key, and stores it. Notable entries:
196196

@@ -219,6 +219,7 @@ validates the key, and stores it. Notable entries:
219219
| Qwen Cloud | Token plan (default): `https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1` · Pay as you go: `https://dashscope.aliyuncs.com/compatible-mode/v1` · or Custom |
220220
| Tencent Cloud Coding Plan | `https://api.lkeap.cloud.tencent.com/coding/v3` |
221221
| SiliconFlow | `https://api.siliconflow.cn/v1` |
222+
| Volcengine Ark · Coding Plan · Agent Plan | `https://ark.cn-beijing.volces.com/api/v3` · `https://ark.cn-beijing.volces.com/api/coding/v3` · `https://ark.cn-beijing.volces.com/api/plan/v3` |
222223
| Xiaomi MiMo | `https://api.xiaomimimo.com/anthropic` |
223224
| Kilo | `https://api.kilo.ai/api/gateway` |
224225
| GitLab Duo | `https://cloud.gitlab.com/ai/v1/proxy/openai/v1` |
@@ -227,6 +228,24 @@ validates the key, and stores it. Notable entries:
227228

228229
Most use the `openai-chat` adapter with a bearer key; a few that expose only an Anthropic-compatible
229230
endpoint (e.g. **Xiaomi MiMo**) use the `anthropic` adapter (`x-api-key`).
231+
Volcengine Agent Plan uses its native Responses endpoint through `openai-responses`.
232+
233+
> **Three Volcengine billing routes:** `volcengine` is the pay-as-you-go Ark API,
234+
> `volcengine-coding-plan` consumes Coding Plan quota, and `volcengine-agent-plan` consumes Agent
235+
> Plan quota. Use the key and endpoint issued for the same product; the ordinary `/api/v3` endpoint
236+
> can incur pay-as-you-go charges even when a Plan subscription exists.
237+
> The presets use curated static model catalogs because Ark's `/models` response also includes
238+
> embedding, image, video, and 3D resources, the Coding gateway returns that same broad catalog,
239+
> and the Agent Plan gateway has no `/models` resource. Pay-as-you-go defaults to
240+
> `doubao-seed-2-1-pro-260628`; its curated catalog also includes current DeepSeek and GLM text
241+
> models. Coding Plan defaults to `ark-code-latest`, while Agent Plan defaults to
242+
> `deepseek-v4-pro`.
243+
244+
> **Volcengine Plan usage restriction:** Volcengine documents Coding Plan and Agent Plan quota as
245+
> valid only inside supported AI coding tools, and warns that using a plan key for general API
246+
> calls may suspend the subscription or ban the account. Routing Codex or Claude Code through
247+
> opencodex is the documented use; pointing other automation at a plan key is not. The
248+
> pay-as-you-go `volcengine` route carries no such restriction.
230249
231250
**DeepInfra discovery.** The key-based `deepinfra` OpenAI Chat Completions provider uses the
232251
`openai-chat` adapter with a Bearer API key. Its registry-owned model-list URL keeps only rows tagged

docs-site/src/content/docs/ja/guides/providers.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ Kiro のログインには Kiro CLI が必要です。Unix では `curl -fsSL ht
119119

120120
## 3. API キーカタログ
121121

122-
opencodex には組み込みプリセットが 62 個含まれています。キー方式 51、OAuth 7、ローカル 3、
122+
opencodex には組み込みプリセットが 65 個含まれています。キー方式 54、OAuth 7、ローカル 3、
123123
デフォルト ChatGPT 転送プリセット 1 です。ダッシュボードの **Add provider** ピッカーはキー発行ページを開き、
124124
入力したキーを検証した後保存します。主な項目は以下のとおりです:
125125

@@ -148,6 +148,7 @@ opencodex には組み込みプリセットが 62 個含まれています。キ
148148
| Qwen Cloud | トークンプラン(デフォルト): `https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1` · 従量課金: `https://dashscope.aliyuncs.com/compatible-mode/v1` · またはカスタム |
149149
| Tencent Cloud Coding Plan | `https://api.lkeap.cloud.tencent.com/coding/v3` |
150150
| SiliconFlow | `https://api.siliconflow.cn/v1` |
151+
| Volcengine Ark · Coding Plan · Agent Plan | `https://ark.cn-beijing.volces.com/api/v3` · `https://ark.cn-beijing.volces.com/api/coding/v3` · `https://ark.cn-beijing.volces.com/api/plan/v3` |
151152
| Xiaomi MiMo | `https://api.xiaomimimo.com/anthropic` |
152153
| Kilo | `https://api.kilo.ai/api/gateway` |
153154
| GitLab Duo | `https://cloud.gitlab.com/ai/v1/proxy/openai/v1` |
@@ -156,6 +157,18 @@ opencodex には組み込みプリセットが 62 個含まれています。キ
156157

157158
大半は bearer キーと共に `openai-chat` アダプターを使い、Anthropic 互換エンドポイントのみを公開する一部
158159
(例: **Xiaomi MiMo**)は `anthropic` アダプター(`x-api-key`)を使います。
160+
Volcengine Agent Plan は `openai-responses` アダプターでネイティブ Responses エンドポイントを使用します。
161+
162+
> **Volcengine の 3 つの課金経路:** `volcengine` は従量課金 Ark API、
163+
> `volcengine-coding-plan` は Coding Plan の割り当て、`volcengine-agent-plan` は Agent Plan
164+
> の割り当てを使用します。同じ製品で発行されたキーとエンドポイントを組み合わせてください。
165+
> Plan 契約があっても通常の `/api/v3` 呼び出しには従量課金が発生する場合があります。
166+
> 3 つの preset は選別済みの静的モデルカタログを使用します。Ark の `/models` はテキストに加えて
167+
> Embedding、画像、動画、3D リソースも返し、Coding ゲートウェイも同じ広範なカタログを返します。
168+
> Agent Plan ゲートウェイには `/models` リソースがありません。従量課金のデフォルトは
169+
> `doubao-seed-2-1-pro-260628` で、静的カタログには現在の DeepSeek と GLM のテキストモデルも
170+
> 含まれます。Coding Plan のデフォルトは `ark-code-latest`、Agent Plan は
171+
> `deepseek-v4-pro` です。
159172
160173
**DeepInfra の discovery:** キー方式の OpenAI Chat Completions プロバイダー `deepinfra` は、
161174
`openai-chat` アダプターと Bearer API キーを使います。registry が所有する DeepInfra のモデル一覧 URL から

docs-site/src/content/docs/ko/guides/providers.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ Kiro 로그인에는 Kiro CLI가 필요합니다. Unix에서는 `curl -fsSL http
119119

120120
## 3. API 키 카탈로그
121121

122-
opencodex에는 빌트인 프리셋이 62개 들어 있습니다. 키 방식 51개, OAuth 7개, 로컬 3개,
122+
opencodex에는 빌트인 프리셋이 65개 들어 있습니다. 키 방식 54개, OAuth 7개, 로컬 3개,
123123
기본 ChatGPT 포워드 프리셋 1개입니다. 대시보드의 **Add provider** 선택기는 키 발급 페이지를 열고,
124124
입력한 키를 검증한 뒤 저장합니다. 주요 항목은 다음과 같습니다:
125125

@@ -148,6 +148,7 @@ opencodex에는 빌트인 프리셋이 62개 들어 있습니다. 키 방식 51
148148
| Qwen Cloud | Token plan(기본): `https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1` · 종량제: `https://dashscope.aliyuncs.com/compatible-mode/v1` · 또는 사용자 지정 |
149149
| Tencent Cloud Coding Plan | `https://api.lkeap.cloud.tencent.com/coding/v3` |
150150
| SiliconFlow | `https://api.siliconflow.cn/v1` |
151+
| Volcengine Ark · Coding Plan · Agent Plan | `https://ark.cn-beijing.volces.com/api/v3` · `https://ark.cn-beijing.volces.com/api/coding/v3` · `https://ark.cn-beijing.volces.com/api/plan/v3` |
151152
| Xiaomi MiMo | `https://api.xiaomimimo.com/anthropic` |
152153
| Kilo | `https://api.kilo.ai/api/gateway` |
153154
| GitLab Duo | `https://cloud.gitlab.com/ai/v1/proxy/openai/v1` |
@@ -156,6 +157,17 @@ opencodex에는 빌트인 프리셋이 62개 들어 있습니다. 키 방식 51
156157

157158
대부분은 bearer 키와 함께 `openai-chat` 어댑터를 사용하며, Anthropic 호환 엔드포인트만 노출하는 일부
158159
(예: **Xiaomi MiMo**)는 `anthropic` 어댑터(`x-api-key`)를 사용합니다.
160+
Volcengine Agent Plan은 `openai-responses` 어댑터로 네이티브 Responses 엔드포인트를 사용합니다.
161+
162+
> **Volcengine의 세 가지 과금 경로:** `volcengine`은 종량제 Ark API,
163+
> `volcengine-coding-plan`은 Coding Plan 할당량, `volcengine-agent-plan`은 Agent Plan
164+
> 할당량을 사용합니다. 같은 상품에서 발급된 키와 엔드포인트를 함께 사용해야 하며, Plan 구독이
165+
> 있어도 일반 `/api/v3` 엔드포인트 호출에는 종량제 요금이 발생할 수 있습니다.
166+
> 세 preset은 선별된 정적 모델 카탈로그를 사용합니다. Ark의 `/models`는 텍스트와 함께
167+
> Embedding, 이미지, 비디오, 3D 리소스도 반환하고 Coding 게이트웨이도 같은 광범위한 카탈로그를
168+
> 반환합니다. Agent Plan 게이트웨이에는 `/models` 리소스가 없습니다. 종량제 기본값은
169+
> `doubao-seed-2-1-pro-260628`이며 정적 카탈로그에는 현재 DeepSeek와 GLM 텍스트 모델도
170+
> 포함됩니다. Coding Plan의 기본값은 `ark-code-latest`, Agent Plan은 `deepseek-v4-pro`입니다.
159171
160172
**DeepInfra 검색:** 키 기반 OpenAI Chat Completions 제공자인 `deepinfra``openai-chat` 어댑터와
161173
Bearer API 키를 사용합니다. registry가 소유하는 DeepInfra 모델 목록 URL에서 `chat` 태그가 있는 행만

docs-site/src/content/docs/ru/guides/providers.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ OAuth-провайдеры, чьи учётные данные содержат
126126

127127
## 3. Каталог API-ключей
128128

129-
opencodex поставляется с 62 встроенными пресетами: 51 на основе ключей, семь OAuth, три локальных и
129+
opencodex поставляется с 65 встроенными пресетами: 54 на основе ключей, семь OAuth, три локальных и
130130
пресет ChatGPT-форварда по умолчанию. Селектор **Add provider** в дашборде открывает страницу
131131
выдачи ключей провайдера, проверяет ключ и сохраняет его. Наиболее заметные записи:
132132

@@ -155,6 +155,7 @@ opencodex поставляется с 62 встроенными пресетам
155155
| Qwen Cloud | Token plan (по умолчанию): `https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1` · Pay as you go: `https://dashscope.aliyuncs.com/compatible-mode/v1` · или Custom |
156156
| Tencent Cloud Coding Plan | `https://api.lkeap.cloud.tencent.com/coding/v3` |
157157
| SiliconFlow | `https://api.siliconflow.cn/v1` |
158+
| Volcengine Ark · Coding Plan · Agent Plan | `https://ark.cn-beijing.volces.com/api/v3` · `https://ark.cn-beijing.volces.com/api/coding/v3` · `https://ark.cn-beijing.volces.com/api/plan/v3` |
158159
| Xiaomi MiMo | `https://api.xiaomimimo.com/anthropic` |
159160
| Kilo | `https://api.kilo.ai/api/gateway` |
160161
| GitLab Duo | `https://cloud.gitlab.com/ai/v1/proxy/openai/v1` |
@@ -164,6 +165,18 @@ opencodex поставляется с 62 встроенными пресетам
164165
Большинство использует адаптер `openai-chat` с bearer-ключом; немногие провайдеры, предоставляющие
165166
только Anthropic-совместимую конечную точку (например, **Xiaomi MiMo**), используют адаптер
166167
`anthropic` (`x-api-key`).
168+
Volcengine Agent Plan использует нативную конечную точку Responses через адаптер `openai-responses`.
169+
170+
> **Три маршрута тарификации Volcengine:** `volcengine` — Ark API с оплатой по факту,
171+
> `volcengine-coding-plan` расходует квоту Coding Plan, а `volcengine-agent-plan` — квоту Agent
172+
> Plan. Используйте ключ и конечную точку одного продукта; обычный `/api/v3` может тарифицироваться
173+
> отдельно даже при активной подписке Plan.
174+
> Все три preset используют отобранные статические каталоги моделей. Ark `/models` возвращает
175+
> текстовые, embedding-, графические, видео- и 3D-ресурсы, а шлюз Coding выдаёт тот же широкий
176+
> каталог. У шлюза Agent Plan ресурса `/models` нет. Для pay-as-you-go модель по умолчанию —
177+
> `doubao-seed-2-1-pro-260628`; его статический каталог также включает актуальные текстовые модели
178+
> DeepSeek и GLM. Для Coding Plan модель по умолчанию — `ark-code-latest`, для Agent Plan —
179+
> `deepseek-v4-pro`.
167180
168181
**Discovery для DeepInfra.** `deepinfra` — провайдер OpenAI Chat Completions с аутентификацией по
169182
ключу; он использует адаптер `openai-chat` и Bearer API-ключ. Принадлежащий registry URL списка

docs-site/src/content/docs/zh-cn/guides/providers.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ Kiro 登录需要 Kiro CLI:Unix 使用 `curl -fsSL https://cli.kiro.dev/instal
111111

112112
## 3. API 密钥目录
113113

114-
opencodex 内置 62 个预设:51 个密钥预设、7 个 OAuth 预设、3 个本地预设,以及默认的
114+
opencodex 内置 65 个预设:54 个密钥预设、7 个 OAuth 预设、3 个本地预设,以及默认的
115115
ChatGPT 转发预设。仪表盘的 **Add provider** 选择器会打开密钥提供商的控制台,验证并保存密钥。
116116
主要条目包括:
117117

@@ -140,13 +140,24 @@ ChatGPT 转发预设。仪表盘的 **Add provider** 选择器会打开密钥提
140140
| Qwen Cloud | Token plan(默认): `https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1` · 按量付费: `https://dashscope.aliyuncs.com/compatible-mode/v1` · 或自定义 |
141141
| 腾讯云 Coding Plan | `https://api.lkeap.cloud.tencent.com/coding/v3` |
142142
| SiliconFlow | `https://api.siliconflow.cn/v1` |
143+
| 火山方舟 · Coding Plan · Agent Plan | `https://ark.cn-beijing.volces.com/api/v3` · `https://ark.cn-beijing.volces.com/api/coding/v3` · `https://ark.cn-beijing.volces.com/api/plan/v3` |
143144
| Xiaomi MiMo | `https://api.xiaomimimo.com/anthropic` |
144145
| Kilo | `https://api.kilo.ai/api/gateway` |
145146
| GitLab Duo | `https://cloud.gitlab.com/ai/v1/proxy/openai/v1` |
146147
| Cloudflare AI Gateway | `https://gateway.ai.cloudflare.com/v1/{account-id}/{gateway}/anthropic` |
147148
| ……以及更多 | opencode zen、Vercel AI Gateway、Venice、NanoGPT、Synthetic、Qianfan、Alibaba、Parallel、ZenMux、LiteLLM |
148149

149150
大多数使用带 bearer 密钥的 `openai-chat` adapter;少数仅暴露 Anthropic 兼容端点的提供商(例如 **Xiaomi MiMo**)使用 `anthropic` adapter(`x-api-key`)。
151+
火山方舟 Agent Plan 通过 `openai-responses` adapter 使用原生 Responses 端点。
152+
153+
> **三条火山方舟计费线路:**`volcengine` 是按量付费方舟 API,`volcengine-coding-plan`
154+
> 消耗 Coding Plan 额度,`volcengine-agent-plan` 消耗 Agent Plan 额度。密钥与端点需要属于
155+
> 同一产品;已经订阅 Plan 时调用普通 `/api/v3` 端点仍可能产生按量费用。
156+
> 三个 preset 使用经过筛选的静态模型目录:方舟 `/models` 同时返回文本、Embedding、图片、
157+
> 视频和 3D 资源,Coding 网关也会返回这份宽泛目录,Agent Plan 网关没有 `/models` 资源。
158+
> 按量付费默认使用 `doubao-seed-2-1-pro-260628`,静态目录还包含当前 DeepSeek 和 GLM
159+
> 文本模型。Coding Plan 默认使用 `ark-code-latest`,Agent Plan 默认使用
160+
> `deepseek-v4-pro`
150161
151162
**DeepInfra 发现:**`deepinfra` 是使用 `openai-chat` adapter 和 Bearer API 密钥的密钥型
152163
OpenAI Chat Completions 提供商。registry 固定的 DeepInfra 模型列表 URL 仅保留带 `chat` 标签的记录,

gui/src/components/AddProviderModal.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ export default function AddProviderModal({
142142
baseUrl: p.baseUrlChoices?.length
143143
? baseUrlForChoice(p.baseUrlChoices, choiceId, p.baseUrl)
144144
: p.baseUrl,
145+
responsesPath: p.responsesPath,
145146
authMode: p.auth,
146147
apiKey: "",
147148
apiKeyTransport: undefined,

gui/src/components/provider-catalog/provider-presets.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface CatalogPreset {
1515
label: string;
1616
adapter: string;
1717
baseUrl: string;
18+
responsesPath?: string;
1819
defaultModel?: string;
1920
/** "oauth": account login · "forward": ChatGPT passthrough · "key": API key · "local": local scaffold. */
2021
auth: "oauth" | "forward" | "key" | "local";
@@ -67,4 +68,3 @@ export function filterPresets(presets: CatalogPreset[], query: string): CatalogP
6768
if (!q) return presets;
6869
return presets.filter(p => p.label.toLowerCase().includes(q) || p.id.toLowerCase().includes(q));
6970
}
70-

gui/src/components/provider-workspace/ProviderDetails.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ export default function ProviderDetails({
151151
<ProviderIcon name={item.name} adapter={item.adapter} baseUrl={item.baseUrl} cls="pws-detail-icon" />
152152
<div className="pws-detail-title-wrap">
153153
<h2 className="pws-detail-title">
154-
{formatProviderDisplayName(item.name)}
154+
{formatProviderDisplayName(item.name, t)}
155155
{local && <span className="pwi-rail-badge pwi-rail-badge--local">{t("modal.badge.local")}</span>}
156156
{!local && free && <span className="pwi-rail-badge pwi-rail-badge--free">{t("modal.badge.free")}</span>}
157157
</h2>

gui/src/components/provider-workspace/ProviderOverviewDashboard.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export default function ProviderOverviewDashboard({
127127
>
128128
<ProviderIcon name={item.name} adapter="" baseUrl="" cls="pws-dashboard-row-icon" />
129129
<div className="pws-dashboard-row-info">
130-
<span className="pws-dashboard-row-name">{formatProviderDisplayName(item.name)}</span>
130+
<span className="pws-dashboard-row-name">{formatProviderDisplayName(item.name, t)}</span>
131131
<span className="pws-dashboard-row-meta muted">{localizeAttentionReason(item.reason)}</span>
132132
</div>
133133
<IconChevron className="pws-dashboard-row-chevron" aria-hidden="true" />
@@ -155,7 +155,7 @@ export default function ProviderOverviewDashboard({
155155
>
156156
<ProviderIcon name={item.name} adapter={item.adapter} baseUrl={item.baseUrl} cls="pws-dashboard-row-icon" />
157157
<div className="pws-dashboard-row-info">
158-
<span className="pws-dashboard-row-name">{formatProviderDisplayName(item.name)}</span>
158+
<span className="pws-dashboard-row-name">{formatProviderDisplayName(item.name, t)}</span>
159159
<span className="pws-dashboard-row-meta muted">
160160
{t("pws.dashboard.checkedAgo", { time: formatRelativeTime(report.updatedAt, timeLabels) })}
161161
</span>
@@ -209,7 +209,7 @@ export default function ProviderOverviewDashboard({
209209
onClick={() => onSelectProvider(provider.name)}
210210
>
211211
<ProviderIcon name={provider.name} adapter="" baseUrl="" cls="pws-dashboard-row-icon" />
212-
<span className="pws-dashboard-row-name">{formatProviderDisplayName(provider.name)}</span>
212+
<span className="pws-dashboard-row-name">{formatProviderDisplayName(provider.name, t)}</span>
213213
<span className="pws-dashboard-row-count muted">
214214
{t("pws.dashboard.requests", { count: formatRequestCount(provider.requests, locale) })}
215215
</span>

gui/src/components/provider-workspace/ProviderRail.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export function RailRow({ item, selected, tabbable, modelCount, isDefault, showC
7575
const free = isFreeProvider(item);
7676
const local = isLocalProvider(item);
7777
const status = statusLabel(item, t);
78-
const displayName = formatProviderDisplayName(item.name);
78+
const displayName = formatProviderDisplayName(item.name, t);
7979
const nameTitle = showConfigId ? `${displayName} (${item.name})` : displayName;
8080
const suffix = `${isDefault ? t("pws.rail.suffixDefault") : ""}${local ? t("pws.rail.suffixLocal") : free ? t("pws.rail.suffixFree") : ""}`;
8181
const countLabel = modelCount !== undefined && modelCount > 0

0 commit comments

Comments
 (0)