From 66701d5a1e1656e77e721f02d3df1ea197379934 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Tue, 14 Apr 2026 16:47:49 +0100 Subject: [PATCH] fix(plugin-sdk): share opencode catalog auth helper --- .../.generated/plugin-sdk-api-baseline.sha256 | 4 +- extensions/opencode-go/index.ts | 20 ++------- extensions/opencode/index.ts | 20 ++------- package.json | 4 ++ scripts/lib/plugin-sdk-doc-metadata.ts | 3 ++ scripts/lib/plugin-sdk-entrypoints.json | 1 + src/plugin-sdk/opencode.test.ts | 32 ++++++++++++++ src/plugin-sdk/opencode.ts | 44 +++++++++++++++++++ 8 files changed, 94 insertions(+), 34 deletions(-) create mode 100644 src/plugin-sdk/opencode.test.ts diff --git a/docs/.generated/plugin-sdk-api-baseline.sha256 b/docs/.generated/plugin-sdk-api-baseline.sha256 index dc50c76ede1..a6afbcdb88f 100644 --- a/docs/.generated/plugin-sdk-api-baseline.sha256 +++ b/docs/.generated/plugin-sdk-api-baseline.sha256 @@ -1,2 +1,2 @@ -6eaa32f7af20ef87952510a09f400f3c48acf25db408f067eea4ea9b86d70514 plugin-sdk-api-baseline.json -d4276644b0bd99bd37a54d1498ec3487375d20fde6906fb0bfa146d91f352d1d plugin-sdk-api-baseline.jsonl +57ae55ced0f486941716dcfc569af480e964421ae50f0304665bd6ce2fa77521 plugin-sdk-api-baseline.json +6b3e30a125af7d4ae061c288c8f7bc268b676c1dcd602dec56fbd66bfef2ca72 plugin-sdk-api-baseline.jsonl diff --git a/extensions/opencode-go/index.ts b/extensions/opencode-go/index.ts index d8eba215e7d..e378ff76030 100644 --- a/extensions/opencode-go/index.ts +++ b/extensions/opencode-go/index.ts @@ -1,5 +1,5 @@ +import { createOpencodeCatalogApiKeyAuthMethod } from "openclaw/plugin-sdk/opencode"; import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; -import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth-api-key"; import { PASSTHROUGH_GEMINI_REPLAY_HOOKS } from "openclaw/plugin-sdk/provider-model-shared"; import { applyOpencodeGoConfig, OPENCODE_GO_DEFAULT_MODEL_REF } from "./api.js"; @@ -15,32 +15,20 @@ export default definePluginEntry({ docsPath: "/providers/models", envVars: ["OPENCODE_API_KEY", "OPENCODE_ZEN_API_KEY"], auth: [ - createProviderApiKeyAuthMethod({ + createOpencodeCatalogApiKeyAuthMethod({ providerId: PROVIDER_ID, - methodId: "api-key", label: "OpenCode Go catalog", - hint: "Shared API key for Zen + Go catalogs", optionKey: "opencodeGoApiKey", flagName: "--opencode-go-api-key", - envVar: "OPENCODE_API_KEY", - promptMessage: "Enter OpenCode API key", - profileIds: ["opencode:default", "opencode-go:default"], defaultModel: OPENCODE_GO_DEFAULT_MODEL_REF, - expectedProviders: ["opencode", "opencode-go"], applyConfig: (cfg) => applyOpencodeGoConfig(cfg), noteMessage: [ "OpenCode uses one API key across the Zen and Go catalogs.", "Go focuses on Kimi, GLM, and MiniMax coding models.", "Get your API key at: https://opencode.ai/auth", ].join("\n"), - noteTitle: "OpenCode", - wizard: { - choiceId: "opencode-go", - choiceLabel: "OpenCode Go catalog", - groupId: "opencode", - groupLabel: "OpenCode", - groupHint: "Shared API key for Zen + Go catalogs", - }, + choiceId: "opencode-go", + choiceLabel: "OpenCode Go catalog", }), ], ...PASSTHROUGH_GEMINI_REPLAY_HOOKS, diff --git a/extensions/opencode/index.ts b/extensions/opencode/index.ts index fcefd59b891..c7ba3e8f8d9 100644 --- a/extensions/opencode/index.ts +++ b/extensions/opencode/index.ts @@ -1,5 +1,5 @@ +import { createOpencodeCatalogApiKeyAuthMethod } from "openclaw/plugin-sdk/opencode"; import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; -import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth-api-key"; import { matchesExactOrPrefix, PASSTHROUGH_GEMINI_REPLAY_HOOKS, @@ -29,18 +29,12 @@ export default definePluginEntry({ docsPath: "/providers/models", envVars: ["OPENCODE_API_KEY", "OPENCODE_ZEN_API_KEY"], auth: [ - createProviderApiKeyAuthMethod({ + createOpencodeCatalogApiKeyAuthMethod({ providerId: PROVIDER_ID, - methodId: "api-key", label: "OpenCode Zen catalog", - hint: "Shared API key for Zen + Go catalogs", optionKey: "opencodeZenApiKey", flagName: "--opencode-zen-api-key", - envVar: "OPENCODE_API_KEY", - promptMessage: "Enter OpenCode API key", - profileIds: ["opencode:default", "opencode-go:default"], defaultModel: OPENCODE_ZEN_DEFAULT_MODEL, - expectedProviders: ["opencode", "opencode-go"], applyConfig: (cfg) => applyOpencodeZenConfig(cfg), noteMessage: [ "OpenCode uses one API key across the Zen and Go catalogs.", @@ -48,14 +42,8 @@ export default definePluginEntry({ "Get your API key at: https://opencode.ai/auth", "Choose the Zen catalog when you want the curated multi-model proxy.", ].join("\n"), - noteTitle: "OpenCode", - wizard: { - choiceId: "opencode-zen", - choiceLabel: "OpenCode Zen catalog", - groupId: "opencode", - groupLabel: "OpenCode", - groupHint: "Shared API key for Zen + Go catalogs", - }, + choiceId: "opencode-zen", + choiceLabel: "OpenCode Zen catalog", }), ], ...PASSTHROUGH_GEMINI_REPLAY_HOOKS, diff --git a/package.json b/package.json index 71015e17168..e732ecbb965 100644 --- a/package.json +++ b/package.json @@ -934,6 +934,10 @@ "types": "./dist/plugin-sdk/provider-model-shared.d.ts", "default": "./dist/plugin-sdk/provider-model-shared.js" }, + "./plugin-sdk/opencode": { + "types": "./dist/plugin-sdk/opencode.d.ts", + "default": "./dist/plugin-sdk/opencode.js" + }, "./plugin-sdk/volc-model-catalog-shared": { "types": "./dist/plugin-sdk/volc-model-catalog-shared.d.ts", "default": "./dist/plugin-sdk/volc-model-catalog-shared.js" diff --git a/scripts/lib/plugin-sdk-doc-metadata.ts b/scripts/lib/plugin-sdk-doc-metadata.ts index d3692cd2817..96dad22d235 100644 --- a/scripts/lib/plugin-sdk-doc-metadata.ts +++ b/scripts/lib/plugin-sdk-doc-metadata.ts @@ -77,6 +77,9 @@ export const pluginSdkDocMetadata = { "provider-onboard": { category: "provider", }, + opencode: { + category: "provider", + }, "runtime-store": { category: "runtime", }, diff --git a/scripts/lib/plugin-sdk-entrypoints.json b/scripts/lib/plugin-sdk-entrypoints.json index 13c8131216d..b55448ef5f2 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -221,6 +221,7 @@ "provider-http", "provider-model-types", "provider-model-shared", + "opencode", "volc-model-catalog-shared", "provider-onboard", "provider-stream-family", diff --git a/src/plugin-sdk/opencode.test.ts b/src/plugin-sdk/opencode.test.ts new file mode 100644 index 00000000000..77f62167378 --- /dev/null +++ b/src/plugin-sdk/opencode.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from "vitest"; +import { createOpencodeCatalogApiKeyAuthMethod } from "./opencode.js"; + +describe("createOpencodeCatalogApiKeyAuthMethod", () => { + it("locks the shared OpenCode auth contract", () => { + const method = createOpencodeCatalogApiKeyAuthMethod({ + providerId: "opencode-go", + label: "OpenCode Go catalog", + optionKey: "opencodeGoApiKey", + flagName: "--opencode-go-api-key", + defaultModel: "opencode-go/kimi-k2.5", + applyConfig: (cfg) => cfg, + noteMessage: "OpenCode uses one API key across the Zen and Go catalogs.", + choiceId: "opencode-go", + choiceLabel: "OpenCode Go catalog", + }); + + expect(method).toMatchObject({ + id: "api-key", + label: "OpenCode Go catalog", + hint: "Shared API key for Zen + Go catalogs", + kind: "api_key", + wizard: { + choiceId: "opencode-go", + choiceLabel: "OpenCode Go catalog", + groupId: "opencode", + groupLabel: "OpenCode", + groupHint: "Shared API key for Zen + Go catalogs", + }, + }); + }); +}); diff --git a/src/plugin-sdk/opencode.ts b/src/plugin-sdk/opencode.ts index 01b9ab45a2e..b2f8fe694cd 100644 --- a/src/plugin-sdk/opencode.ts +++ b/src/plugin-sdk/opencode.ts @@ -1 +1,45 @@ +import { createProviderApiKeyAuthMethod, type OpenClawConfig } from "./provider-auth-api-key.js"; + export { applyOpencodeZenModelDefault, OPENCODE_ZEN_DEFAULT_MODEL } from "./provider-onboard.js"; + +const OPENCODE_SHARED_PROFILE_IDS = ["opencode:default", "opencode-go:default"] as const; +const OPENCODE_SHARED_HINT = "Shared API key for Zen + Go catalogs"; +const OPENCODE_SHARED_WIZARD_GROUP = { + groupId: "opencode", + groupLabel: "OpenCode", + groupHint: OPENCODE_SHARED_HINT, +} as const; + +export function createOpencodeCatalogApiKeyAuthMethod(params: { + providerId: string; + label: string; + optionKey: string; + flagName: `--${string}`; + defaultModel: string; + applyConfig: (cfg: OpenClawConfig) => OpenClawConfig; + noteMessage: string; + choiceId: string; + choiceLabel: string; +}) { + return createProviderApiKeyAuthMethod({ + providerId: params.providerId, + methodId: "api-key", + label: params.label, + hint: OPENCODE_SHARED_HINT, + optionKey: params.optionKey, + flagName: params.flagName, + envVar: "OPENCODE_API_KEY", + promptMessage: "Enter OpenCode API key", + profileIds: [...OPENCODE_SHARED_PROFILE_IDS], + defaultModel: params.defaultModel, + expectedProviders: ["opencode", "opencode-go"], + applyConfig: params.applyConfig, + noteMessage: params.noteMessage, + noteTitle: "OpenCode", + wizard: { + choiceId: params.choiceId, + choiceLabel: params.choiceLabel, + ...OPENCODE_SHARED_WIZARD_GROUP, + }, + }); +}