From b2b62b2e1e0f65615cc836044bc1154f1838af30 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Fri, 31 Jul 2026 21:28:01 +0800 Subject: [PATCH] feat(plugins): externalize Volcengine provider (#116854) --- docs/plugins/plugin-inventory.md | 8 +-- docs/plugins/reference/volcengine.md | 2 +- docs/providers/volcengine.md | 8 ++- extensions/volcengine/README.md | 13 ++++ extensions/volcengine/package.json | 26 ++++++- package.json | 1 + .../official-external-provider-catalog.json | 69 +++++++++++++++++++ src/cli/plugins-location-bridges.test.ts | 1 + .../official-external-plugin-catalog.test.ts | 26 +++++++ .../bundled-plugin-build-entries.test.ts | 8 +++ 10 files changed, 153 insertions(+), 9 deletions(-) create mode 100644 extensions/volcengine/README.md diff --git a/docs/plugins/plugin-inventory.md b/docs/plugins/plugin-inventory.md index f49327f19354..c2bb6c7a166d 100644 --- a/docs/plugins/plugin-inventory.md +++ b/docs/plugins/plugin-inventory.md @@ -51,7 +51,7 @@ Each entry lists the package, distribution route, and description. ## Core npm package -63 plugins +62 plugins - **[admin-http-rpc](/plugins/reference/admin-http-rpc)** (`@openclaw/admin-http-rpc`) - included in OpenClaw. OpenClaw admin HTTP RPC endpoint. @@ -167,8 +167,6 @@ Each entry lists the package, distribution route, and description. - **[vllm](/plugins/reference/vllm)** (`@openclaw/vllm-provider`) - included in OpenClaw. Adds vLLM model provider support to OpenClaw. -- **[volcengine](/plugins/reference/volcengine)** (`@openclaw/volcengine-provider`) - included in OpenClaw. Adds Volcengine, Volcengine Plan model provider support to OpenClaw. - - **[web-readability](/plugins/reference/web-readability)** (`@openclaw/web-readability-plugin`) - included in OpenClaw. Extract readable article content from local HTML web fetch responses. - **[webhooks](/plugins/reference/webhooks)** (`@openclaw/webhooks`) - included in OpenClaw. Authenticated inbound webhooks that bind external automation to OpenClaw TaskFlows. @@ -181,7 +179,7 @@ Each entry lists the package, distribution route, and description. ## Official external packages -82 plugins +83 plugins - **[acpx](/plugins/reference/acpx)** (`@openclaw/acpx`) - npm; ClawHub. OpenClaw ACP runtime backend with plugin-owned session and transport management. @@ -333,6 +331,8 @@ Each entry lists the package, distribution route, and description. - **[voice-call](/plugins/reference/voice-call)** (`@openclaw/voice-call`) - npm; ClawHub. OpenClaw voice-call plugin for Twilio, Telnyx, and Plivo phone calls. +- **[volcengine](/plugins/reference/volcengine)** (`@openclaw/volcengine-provider`) - npm; ClawHub: `clawhub:@openclaw/volcengine-provider`. Adds Volcengine, Volcengine Plan model provider support to OpenClaw. + - **[voyage](/plugins/reference/voyage)** (`@openclaw/voyage-provider`) - npm; ClawHub: `clawhub:@openclaw/voyage-provider`. Adds memory embedding provider support. - **[vydra](/plugins/reference/vydra)** (`@openclaw/vydra-provider`) - npm; ClawHub: `clawhub:@openclaw/vydra-provider`. Adds Vydra model provider support to OpenClaw. diff --git a/docs/plugins/reference/volcengine.md b/docs/plugins/reference/volcengine.md index 17e5109064bb..e4bbd0db0f69 100644 --- a/docs/plugins/reference/volcengine.md +++ b/docs/plugins/reference/volcengine.md @@ -12,7 +12,7 @@ Adds Volcengine, Volcengine Plan model provider support to OpenClaw. ## Distribution - Package: `@openclaw/volcengine-provider` -- Install route: included in OpenClaw +- Install route: npm; ClawHub: `clawhub:@openclaw/volcengine-provider` ## Surface diff --git a/docs/providers/volcengine.md b/docs/providers/volcengine.md index c31d5c34266a..c62d56ed85ed 100644 --- a/docs/providers/volcengine.md +++ b/docs/providers/volcengine.md @@ -7,7 +7,7 @@ read_when: - You want to use Volcengine Speech text-to-speech --- -The Volcengine provider gives access to Doubao models and third-party models hosted on Volcano Engine, with separate endpoints for general and coding workloads. The same bundled plugin also registers Volcengine Speech as a TTS provider. +The Volcengine provider gives access to Doubao models and third-party models hosted on Volcano Engine, with separate endpoints for general and coding workloads. The same official plugin also registers Volcengine Speech as a TTS provider. | Detail | Value | | ---------- | ---------------------------------------------------------- | @@ -19,6 +19,12 @@ The Volcengine provider gives access to Doubao models and third-party models hos ## Getting started + + ```bash + openclaw plugins install @openclaw/volcengine-provider + openclaw gateway restart + ``` + Run interactive onboarding: diff --git a/extensions/volcengine/README.md b/extensions/volcengine/README.md new file mode 100644 index 000000000000..264f3dfaef22 --- /dev/null +++ b/extensions/volcengine/README.md @@ -0,0 +1,13 @@ +# OpenClaw Volcengine Provider + +Official OpenClaw provider plugin for Volcengine models, the Volcengine coding +plan, and Volcengine Speech text-to-speech. + +Install from OpenClaw: + +```bash +openclaw plugins install @openclaw/volcengine-provider +openclaw gateway restart +``` + +See for model and speech setup. diff --git a/extensions/volcengine/package.json b/extensions/volcengine/package.json index c9f1ff25d24d..c98b3e2b1a69 100644 --- a/extensions/volcengine/package.json +++ b/extensions/volcengine/package.json @@ -1,8 +1,11 @@ { "name": "@openclaw/volcengine-provider", "version": "2026.7.2", - "private": true, - "description": "OpenClaw Volcengine provider plugin", + "description": "OpenClaw Volcengine provider plugin.", + "repository": { + "type": "git", + "url": "https://github.com/openclaw/openclaw" + }, "type": "module", "devDependencies": { "@openclaw/plugin-sdk": "workspace:*" @@ -10,6 +13,23 @@ "openclaw": { "extensions": [ "./index.ts" - ] + ], + "install": { + "clawhubSpec": "clawhub:@openclaw/volcengine-provider", + "npmSpec": "@openclaw/volcengine-provider", + "defaultChoice": "npm", + "minHostVersion": ">=2026.7.2" + }, + "compat": { + "pluginApi": ">=2026.7.2" + }, + "build": { + "openclawVersion": "2026.7.2", + "bundledDist": false + }, + "release": { + "publishToClawHub": true, + "publishToNpm": true + } } } diff --git a/package.json b/package.json index 65b0b90f8caa..6977b4672f7b 100644 --- a/package.json +++ b/package.json @@ -316,6 +316,7 @@ "!dist/extensions/venice/**", "!dist/extensions/vercel-ai-gateway/**", "!dist/extensions/voice-call/**", + "!dist/extensions/volcengine/**", "!dist/extensions/voyage/**", "!dist/extensions/vydra/**", "!dist/extensions/whatsapp/**", diff --git a/scripts/lib/official-external-provider-catalog.json b/scripts/lib/official-external-provider-catalog.json index 22d2137992a3..44b6d098c740 100644 --- a/scripts/lib/official-external-provider-catalog.json +++ b/scripts/lib/official-external-provider-catalog.json @@ -1804,6 +1804,75 @@ } } }, + { + "name": "@openclaw/volcengine-provider", + "description": "OpenClaw Volcengine provider plugin.", + "source": "official", + "kind": "provider", + "openclaw": { + "plugin": { + "id": "volcengine", + "label": "Volcengine" + }, + "providers": [ + { + "id": "volcengine", + "aliases": [ + "volcengine-plan" + ], + "name": "Volcengine", + "docs": "/providers/volcengine", + "categories": [ + "cloud", + "llm" + ], + "envVars": [ + "VOLCANO_ENGINE_API_KEY" + ], + "authChoices": [ + { + "method": "api-key", + "choiceId": "volcengine-api-key", + "choiceLabel": "Volcano Engine API key", + "groupId": "volcengine", + "groupLabel": "Volcano Engine", + "groupHint": "API key", + "optionKey": "volcengineApiKey", + "cliFlag": "--volcengine-api-key", + "cliOption": "--volcengine-api-key ", + "cliDescription": "Volcano Engine API key", + "onboardingScopes": [ + "text-inference" + ] + } + ] + }, + { + "id": "volcengine-plan", + "name": "Volcengine Plan", + "docs": "/providers/volcengine", + "categories": [ + "cloud", + "llm" + ], + "envVars": [ + "VOLCANO_ENGINE_API_KEY" + ] + } + ], + "contracts": { + "speechProviders": [ + "volcengine" + ] + }, + "install": { + "clawhubSpec": "clawhub:@openclaw/volcengine-provider", + "npmSpec": "@openclaw/volcengine-provider", + "defaultChoice": "npm", + "minHostVersion": ">=2026.7.2" + } + } + }, { "name": "@openclaw/stepfun-provider", "description": "OpenClaw StepFun provider plugin.", diff --git a/src/cli/plugins-location-bridges.test.ts b/src/cli/plugins-location-bridges.test.ts index dc519e5641ce..aeba06cc563d 100644 --- a/src/cli/plugins-location-bridges.test.ts +++ b/src/cli/plugins-location-bridges.test.ts @@ -168,6 +168,7 @@ describe("listPersistedBundledPluginLocationBridges", () => { ["duckduckgo", "@openclaw/duckduckgo-plugin", false], ["synthetic", "@openclaw/synthetic-provider", true], ["teams-meetings", "@openclaw/teams-meetings", true], + ["volcengine", "@openclaw/volcengine-provider", true], ["voyage", "@openclaw/voyage-provider", true], ["vydra", "@openclaw/vydra-provider", true], ["zoom-meetings", "@openclaw/zoom-meetings", true], diff --git a/src/plugins/official-external-plugin-catalog.test.ts b/src/plugins/official-external-plugin-catalog.test.ts index 0d45808ae313..8e9db871abb9 100644 --- a/src/plugins/official-external-plugin-catalog.test.ts +++ b/src/plugins/official-external-plugin-catalog.test.ts @@ -2039,6 +2039,32 @@ describe("official external plugin catalog", () => { }); }); + it("lists Volcengine model and speech providers as one official external plugin", () => { + const entry = expectCatalogEntry("volcengine"); + const manifest = getOfficialExternalPluginCatalogManifest(entry); + const volcengine = manifest?.providers?.find((provider) => provider.id === "volcengine"); + + expect(resolveOfficialExternalPluginId(entry)).toBe("volcengine"); + expect(getOfficialExternalPluginCatalogEntry("volcengine-plan")).toBe(entry); + expect(resolveOfficialExternalPluginInstall(entry)).toEqual({ + clawhubSpec: "clawhub:@openclaw/volcengine-provider", + npmSpec: "@openclaw/volcengine-provider", + defaultChoice: "npm", + minHostVersion: ">=2026.7.2", + }); + expect(volcengine?.aliases).toEqual(["volcengine-plan"]); + expect(volcengine?.authChoices?.[0]).toMatchObject({ + choiceId: "volcengine-api-key", + optionKey: "volcengineApiKey", + onboardingScopes: ["text-inference"], + }); + expect(manifest?.providers?.map((provider) => provider.id)).toEqual([ + "volcengine", + "volcengine-plan", + ]); + expect(manifest?.contracts?.speechProviders).toEqual(["volcengine"]); + }); + it.each([ ["teams-meetings", "@openclaw/teams-meetings", "teams_meetings", "teams"], ["zoom-meetings", "@openclaw/zoom-meetings", "zoom_meetings", "zoom"], diff --git a/test/scripts/bundled-plugin-build-entries.test.ts b/test/scripts/bundled-plugin-build-entries.test.ts index 4aed9b00f132..fb4f9fb1619d 100644 --- a/test/scripts/bundled-plugin-build-entries.test.ts +++ b/test/scripts/bundled-plugin-build-entries.test.ts @@ -391,6 +391,14 @@ describe("bundled plugin build entries", () => { expect(artifacts).not.toContain("dist/extensions/voyage/package.json"); }); + it("excludes the externalized Volcengine provider from bundled artifacts", () => { + const artifacts = listBundledPluginPackArtifacts(); + + expect(artifacts).not.toContain("dist/extensions/volcengine/index.js"); + expect(artifacts).not.toContain("dist/extensions/volcengine/openclaw.plugin.json"); + expect(artifacts).not.toContain("dist/extensions/volcengine/package.json"); + }); + it("keeps bundled channel secret contracts on packed top-level sidecars", () => { const artifacts = listBundledPluginPackArtifacts(); const excludedPackageDirs = collectRootPackageExcludedExtensionDirs();