From 841025da66e00e9f4d881e32cfebd5764fb4f8ea Mon Sep 17 00:00:00 2001 From: Gustavo Madeira Santana Date: Mon, 16 Mar 2026 12:46:04 +0000 Subject: [PATCH] Plugin SDK: add narrow setup subpaths --- extensions/ollama/index.ts | 2 +- extensions/sglang/index.ts | 2 +- extensions/vllm/index.ts | 2 +- package.json | 8 +++++++ src/plugin-sdk/ollama-setup.ts | 17 ++++++++++++++ src/plugin-sdk/self-hosted-provider-setup.ts | 23 +++++++++++++++++++ src/plugin-sdk/subpaths.test.ts | 19 +++++++++++++++ .../contracts/discovery.contract.test.ts | 17 ++++++++++++++ 8 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 src/plugin-sdk/ollama-setup.ts create mode 100644 src/plugin-sdk/self-hosted-provider-setup.ts diff --git a/extensions/ollama/index.ts b/extensions/ollama/index.ts index f19c4cfbc0a..9f4e7eef1ea 100644 --- a/extensions/ollama/index.ts +++ b/extensions/ollama/index.ts @@ -13,7 +13,7 @@ const PROVIDER_ID = "ollama"; const DEFAULT_API_KEY = "ollama-local"; async function loadProviderSetup() { - return await import("openclaw/plugin-sdk/provider-setup"); + return await import("openclaw/plugin-sdk/ollama-setup"); } const ollamaPlugin = { diff --git a/extensions/sglang/index.ts b/extensions/sglang/index.ts index 38ecf508b07..fc7522ef15b 100644 --- a/extensions/sglang/index.ts +++ b/extensions/sglang/index.ts @@ -13,7 +13,7 @@ import { const PROVIDER_ID = "sglang"; async function loadProviderSetup() { - return await import("openclaw/plugin-sdk/provider-setup"); + return await import("openclaw/plugin-sdk/self-hosted-provider-setup"); } const sglangPlugin = { diff --git a/extensions/vllm/index.ts b/extensions/vllm/index.ts index 8ab11b9f1bc..938fb78c9bd 100644 --- a/extensions/vllm/index.ts +++ b/extensions/vllm/index.ts @@ -13,7 +13,7 @@ import { const PROVIDER_ID = "vllm"; async function loadProviderSetup() { - return await import("openclaw/plugin-sdk/provider-setup"); + return await import("openclaw/plugin-sdk/self-hosted-provider-setup"); } const vllmPlugin = { diff --git a/package.json b/package.json index 4f1c502b586..a0b5e9581df 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,10 @@ "types": "./dist/plugin-sdk/compat.d.ts", "default": "./dist/plugin-sdk/compat.js" }, + "./plugin-sdk/ollama-setup": { + "types": "./dist/plugin-sdk/ollama-setup.d.ts", + "default": "./dist/plugin-sdk/ollama-setup.js" + }, "./plugin-sdk/provider-setup": { "types": "./dist/plugin-sdk/provider-setup.d.ts", "default": "./dist/plugin-sdk/provider-setup.js" @@ -58,6 +62,10 @@ "types": "./dist/plugin-sdk/sandbox.d.ts", "default": "./dist/plugin-sdk/sandbox.js" }, + "./plugin-sdk/self-hosted-provider-setup": { + "types": "./dist/plugin-sdk/self-hosted-provider-setup.d.ts", + "default": "./dist/plugin-sdk/self-hosted-provider-setup.js" + }, "./plugin-sdk/routing": { "types": "./dist/plugin-sdk/routing.d.ts", "default": "./dist/plugin-sdk/routing.js" diff --git a/src/plugin-sdk/ollama-setup.ts b/src/plugin-sdk/ollama-setup.ts new file mode 100644 index 00000000000..5b6fd732774 --- /dev/null +++ b/src/plugin-sdk/ollama-setup.ts @@ -0,0 +1,17 @@ +export type { + OpenClawPluginApi, + ProviderAuthContext, + ProviderAuthMethodNonInteractiveContext, + ProviderAuthResult, + ProviderDiscoveryContext, +} from "../plugins/types.js"; + +export { + OLLAMA_DEFAULT_BASE_URL, + OLLAMA_DEFAULT_MODEL, + configureOllamaNonInteractive, + ensureOllamaModelPulled, + promptAndConfigureOllama, +} from "../commands/ollama-setup.js"; + +export { buildOllamaProvider } from "../agents/models-config.providers.discovery.js"; diff --git a/src/plugin-sdk/self-hosted-provider-setup.ts b/src/plugin-sdk/self-hosted-provider-setup.ts new file mode 100644 index 00000000000..950bbbb953e --- /dev/null +++ b/src/plugin-sdk/self-hosted-provider-setup.ts @@ -0,0 +1,23 @@ +export type { + OpenClawPluginApi, + ProviderAuthContext, + ProviderAuthMethodNonInteractiveContext, + ProviderAuthResult, + ProviderDiscoveryContext, +} from "../plugins/types.js"; + +export { + applyProviderDefaultModel, + configureOpenAICompatibleSelfHostedProviderNonInteractive, + discoverOpenAICompatibleSelfHostedProvider, + promptAndConfigureOpenAICompatibleSelfHostedProvider, + promptAndConfigureOpenAICompatibleSelfHostedProviderAuth, + SELF_HOSTED_DEFAULT_CONTEXT_WINDOW, + SELF_HOSTED_DEFAULT_COST, + SELF_HOSTED_DEFAULT_MAX_TOKENS, +} from "../commands/self-hosted-provider-setup.js"; + +export { + buildSglangProvider, + buildVllmProvider, +} from "../agents/models-config.providers.discovery.js"; diff --git a/src/plugin-sdk/subpaths.test.ts b/src/plugin-sdk/subpaths.test.ts index 813d3e28e1e..eff2820af79 100644 --- a/src/plugin-sdk/subpaths.test.ts +++ b/src/plugin-sdk/subpaths.test.ts @@ -11,8 +11,10 @@ import * as imessageSdk from "openclaw/plugin-sdk/imessage"; import * as lineSdk from "openclaw/plugin-sdk/line"; import * as msteamsSdk from "openclaw/plugin-sdk/msteams"; import * as nostrSdk from "openclaw/plugin-sdk/nostr"; +import * as ollamaSetupSdk from "openclaw/plugin-sdk/ollama-setup"; import * as providerSetupSdk from "openclaw/plugin-sdk/provider-setup"; import * as sandboxSdk from "openclaw/plugin-sdk/sandbox"; +import * as selfHostedProviderSetupSdk from "openclaw/plugin-sdk/self-hosted-provider-setup"; import * as signalSdk from "openclaw/plugin-sdk/signal"; import * as slackSdk from "openclaw/plugin-sdk/slack"; import * as telegramSdk from "openclaw/plugin-sdk/telegram"; @@ -62,6 +64,23 @@ describe("plugin-sdk subpath exports", () => { ); }); + it("exports narrow self-hosted provider setup helpers", () => { + expect(typeof selfHostedProviderSetupSdk.buildVllmProvider).toBe("function"); + expect(typeof selfHostedProviderSetupSdk.buildSglangProvider).toBe("function"); + expect(typeof selfHostedProviderSetupSdk.discoverOpenAICompatibleSelfHostedProvider).toBe( + "function", + ); + expect( + typeof selfHostedProviderSetupSdk.configureOpenAICompatibleSelfHostedProviderNonInteractive, + ).toBe("function"); + }); + + it("exports narrow Ollama setup helpers", () => { + expect(typeof ollamaSetupSdk.buildOllamaProvider).toBe("function"); + expect(typeof ollamaSetupSdk.configureOllamaNonInteractive).toBe("function"); + expect(typeof ollamaSetupSdk.ensureOllamaModelPulled).toBe("function"); + }); + it("exports sandbox helpers from the dedicated subpath", () => { expect(typeof sandboxSdk.registerSandboxBackend).toBe("function"); expect(typeof sandboxSdk.runPluginCommandWithTimeout).toBe("function"); diff --git a/src/plugins/contracts/discovery.contract.test.ts b/src/plugins/contracts/discovery.contract.test.ts index a7576acdd5c..072e657616e 100644 --- a/src/plugins/contracts/discovery.contract.test.ts +++ b/src/plugins/contracts/discovery.contract.test.ts @@ -32,6 +32,23 @@ vi.mock("openclaw/plugin-sdk/provider-setup", async () => { }; }); +vi.mock("openclaw/plugin-sdk/self-hosted-provider-setup", async () => { + const actual = await vi.importActual("openclaw/plugin-sdk/self-hosted-provider-setup"); + return { + ...actual, + buildVllmProvider: (...args: unknown[]) => buildVllmProviderMock(...args), + buildSglangProvider: (...args: unknown[]) => buildSglangProviderMock(...args), + }; +}); + +vi.mock("openclaw/plugin-sdk/ollama-setup", async () => { + const actual = await vi.importActual("openclaw/plugin-sdk/ollama-setup"); + return { + ...actual, + buildOllamaProvider: (...args: unknown[]) => buildOllamaProviderMock(...args), + }; +}); + const qwenPortalPlugin = (await import("../../../extensions/qwen-portal-auth/index.js")).default; const githubCopilotPlugin = (await import("../../../extensions/github-copilot/index.js")).default; const ollamaPlugin = (await import("../../../extensions/ollama/index.js")).default;