refactor: finish public plugin sdk boundary seams

This commit is contained in:
Peter Steinberger
2026-03-16 21:33:50 -07:00
parent 73703d977c
commit 0cfc80b81c
42 changed files with 152 additions and 82 deletions

View File

@@ -1,5 +1,7 @@
import { describeImageWithModel } from "../../src/media-understanding/providers/image.js";
import type { MediaUnderstandingProvider } from "../../src/media-understanding/types.js";
import {
describeImageWithModel,
type MediaUnderstandingProvider,
} from "openclaw/plugin-sdk/media-understanding";
export const anthropicMediaUnderstandingProvider: MediaUnderstandingProvider = {
id: "anthropic",

View File

@@ -1,12 +1,12 @@
import {
normalizeAccountId,
patchScopedAccountConfig,
prepareScopedSetupConfig,
} from "../../../src/channels/plugins/setup-helpers.js";
import { setTopLevelChannelDmPolicyWithAllowFrom } from "../../../src/channels/plugins/setup-wizard-helpers.js";
import type { ChannelSetupAdapter } from "../../../src/channels/plugins/types.adapters.js";
import type { OpenClawConfig } from "../../../src/config/config.js";
import type { DmPolicy } from "../../../src/config/types.js";
import { normalizeAccountId } from "../../../src/routing/session-key.js";
setTopLevelChannelDmPolicyWithAllowFrom,
type ChannelSetupAdapter,
type DmPolicy,
type OpenClawConfig,
} from "openclaw/plugin-sdk/setup";
import { applyBlueBubblesConnectionConfig } from "./config-apply.js";
const channel = "bluebubbles" as const;

View File

@@ -1,18 +1,15 @@
import { normalizeGoogleModelId } from "../../src/agents/model-id-normalization.js";
import { parseGeminiAuth } from "../../src/infra/gemini-auth.js";
import { describeImageWithModel } from "../../src/media-understanding/providers/image.js";
import { normalizeGoogleModelId, parseGeminiAuth } from "openclaw/plugin-sdk/google";
import {
assertOkOrThrowHttpError,
describeImageWithModel,
normalizeBaseUrl,
postJsonRequest,
} from "../../src/media-understanding/providers/shared.js";
import type {
AudioTranscriptionRequest,
AudioTranscriptionResult,
MediaUnderstandingProvider,
VideoDescriptionRequest,
VideoDescriptionResult,
} from "../../src/media-understanding/types.js";
type AudioTranscriptionRequest,
type AudioTranscriptionResult,
type MediaUnderstandingProvider,
type VideoDescriptionRequest,
type VideoDescriptionResult,
} from "openclaw/plugin-sdk/media-understanding";
export const DEFAULT_GOOGLE_AUDIO_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
export const DEFAULT_GOOGLE_VIDEO_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";

View File

@@ -1,5 +1,4 @@
import { createPatchedAccountSetupAdapter } from "../../../src/channels/plugins/setup-helpers.js";
import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js";
import { createPatchedAccountSetupAdapter, DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/setup";
const channel = "googlechat" as const;

View File

@@ -1,10 +1,10 @@
import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core";
import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth";
import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog";
import {
createKilocodeWrapper,
isProxyReasoningUnsupported,
} from "openclaw/plugin-sdk/provider-stream";
import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js";
import { applyKilocodeConfig, KILOCODE_DEFAULT_MODEL_REF } from "./onboard.js";
import { buildKilocodeProviderWithDiscovery } from "./provider-catalog.js";

View File

@@ -1,7 +1,9 @@
import { prepareScopedSetupConfig } from "../../../src/channels/plugins/setup-helpers.js";
import type { ChannelSetupAdapter } from "../../../src/channels/plugins/types.adapters.js";
import { normalizeSecretInputString } from "../../../src/config/types.secrets.js";
import { normalizeAccountId } from "../../../src/routing/session-key.js";
import {
normalizeAccountId,
normalizeSecretInputString,
prepareScopedSetupConfig,
type ChannelSetupAdapter,
} from "openclaw/plugin-sdk/setup";
import type { CoreConfig } from "./types.js";
const channel = "matrix" as const;

View File

@@ -1,5 +1,7 @@
import { describeImageWithModel } from "../../src/media-understanding/providers/image.js";
import type { MediaUnderstandingProvider } from "../../src/media-understanding/types.js";
import {
describeImageWithModel,
type MediaUnderstandingProvider,
} from "openclaw/plugin-sdk/media-understanding";
export const minimaxMediaUnderstandingProvider: MediaUnderstandingProvider = {
id: "minimax",

View File

@@ -1,4 +1,4 @@
import type { ModelDefinitionConfig } from "../../src/config/types.models.js";
import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-models";
export const DEFAULT_MINIMAX_BASE_URL = "https://api.minimax.io/v1";
export const MINIMAX_API_BASE_URL = "https://api.minimax.io/anthropic";

View File

@@ -1,5 +1,7 @@
import { transcribeOpenAiCompatibleAudio } from "../../src/media-understanding/providers/openai-compatible-audio.js";
import type { MediaUnderstandingProvider } from "../../src/media-understanding/types.js";
import {
transcribeOpenAiCompatibleAudio,
type MediaUnderstandingProvider,
} from "openclaw/plugin-sdk/media-understanding";
const DEFAULT_MISTRAL_AUDIO_BASE_URL = "https://api.mistral.ai/v1";
const DEFAULT_MISTRAL_AUDIO_MODEL = "voxtral-mini-latest";

View File

@@ -1,4 +1,4 @@
import type { ModelDefinitionConfig } from "../../src/config/types.models.js";
import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-models";
export const MISTRAL_BASE_URL = "https://api.mistral.ai/v1";
export const MISTRAL_DEFAULT_MODEL_ID = "mistral-large-latest";

View File

@@ -1,4 +1,4 @@
import type { ModelDefinitionConfig } from "../../src/config/types.models.js";
import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-models";
export const MODELSTUDIO_CN_BASE_URL = "https://coding.dashscope.aliyuncs.com/v1";
export const MODELSTUDIO_GLOBAL_BASE_URL = "https://coding-intl.dashscope.aliyuncs.com/v1";

View File

@@ -1,14 +1,12 @@
import { describeImageWithModel } from "../../src/media-understanding/providers/image.js";
import {
assertOkOrThrowHttpError,
describeImageWithModel,
normalizeBaseUrl,
postJsonRequest,
} from "../../src/media-understanding/providers/shared.js";
import type {
MediaUnderstandingProvider,
VideoDescriptionRequest,
VideoDescriptionResult,
} from "../../src/media-understanding/types.js";
type MediaUnderstandingProvider,
type VideoDescriptionRequest,
type VideoDescriptionResult,
} from "openclaw/plugin-sdk/media-understanding";
export const DEFAULT_MOONSHOT_VIDEO_BASE_URL = "https://api.moonshot.ai/v1";
const DEFAULT_MOONSHOT_VIDEO_MODEL = "kimi-k2.5";

View File

@@ -1,5 +1,5 @@
import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core";
import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js";
import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog";
import { buildNvidiaProvider } from "./provider-catalog.js";
const PROVIDER_ID = "nvidia";

View File

@@ -1,13 +1,14 @@
import { describeImageWithModel } from "../../src/media-understanding/providers/image.js";
import { transcribeOpenAiCompatibleAudio } from "../../src/media-understanding/providers/openai-compatible-audio.js";
import type { MediaUnderstandingProvider } from "../../src/media-understanding/types.js";
import {
describeImageWithModel,
transcribeOpenAiCompatibleAudio,
type AudioTranscriptionRequest,
type MediaUnderstandingProvider,
} from "openclaw/plugin-sdk/media-understanding";
export const DEFAULT_OPENAI_AUDIO_BASE_URL = "https://api.openai.com/v1";
const DEFAULT_OPENAI_AUDIO_MODEL = "gpt-4o-mini-transcribe";
export async function transcribeOpenAiAudio(
params: import("../../src/media-understanding/types.js").AudioTranscriptionRequest,
) {
export async function transcribeOpenAiAudio(params: AudioTranscriptionRequest) {
return await transcribeOpenAiCompatibleAudio({
...params,
defaultBaseUrl: DEFAULT_OPENAI_AUDIO_BASE_URL,

View File

@@ -1,6 +1,6 @@
import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core";
import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth";
import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js";
import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog";
import { applyQianfanConfig, QIANFAN_DEFAULT_MODEL_REF } from "./onboard.js";
import { buildQianfanProvider } from "./provider-catalog.js";

View File

@@ -1,18 +1,20 @@
import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from";
import {
createScopedAccountConfigAccessors,
createScopedChannelConfigBase,
} from "openclaw/plugin-sdk/channel-config-helpers";
import {
formatDocsLink,
hasConfiguredSecretInput,
patchChannelConfigForAccount,
type OpenClawConfig,
} from "openclaw/plugin-sdk/setup";
import {
buildChannelConfigSchema,
getChatChannelMeta,
SlackConfigSchema,
type ChannelPlugin,
} from "openclaw/plugin-sdk/slack";
import { patchChannelConfigForAccount } from "../../../src/channels/plugins/setup-wizard-helpers.js";
import type { OpenClawConfig } from "../../../src/config/config.js";
import { hasConfiguredSecretInput } from "../../../src/config/types.secrets.js";
import { formatAllowFromLowercase } from "../../../src/plugin-sdk/allow-from.js";
import {
createScopedAccountConfigAccessors,
createScopedChannelConfigBase,
} from "../../../src/plugin-sdk/channel-config-helpers.js";
import { formatDocsLink } from "../../../src/terminal/links.js";
import { inspectSlackAccount } from "./account-inspect.js";
import {
listSlackAccountIds,

View File

@@ -1,6 +1,6 @@
import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core";
import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth";
import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js";
import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog";
import { applySyntheticConfig, SYNTHETIC_DEFAULT_MODEL_REF } from "./onboard.js";
import { buildSyntheticProvider } from "./provider-catalog.js";

View File

@@ -1,11 +1,12 @@
import {
DEFAULT_ACCOUNT_ID,
normalizeAccountId,
patchScopedAccountConfig,
prepareScopedSetupConfig,
} from "../../../src/channels/plugins/setup-helpers.js";
import type { ChannelSetupAdapter } from "../../../src/channels/plugins/types.adapters.js";
import type { ChannelSetupInput } from "../../../src/channels/plugins/types.core.js";
import type { OpenClawConfig } from "../../../src/config/config.js";
import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../../../src/routing/session-key.js";
type ChannelSetupAdapter,
type ChannelSetupInput,
type OpenClawConfig,
} from "openclaw/plugin-sdk/setup";
import { buildTlonAccountFields } from "./account-fields.js";
import { resolveTlonAccount } from "./types.js";

View File

@@ -1,6 +1,6 @@
import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core";
import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth";
import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js";
import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog";
import { applyTogetherConfig, TOGETHER_DEFAULT_MODEL_REF } from "./onboard.js";
import { buildTogetherProvider } from "./provider-catalog.js";

View File

@@ -1,6 +1,6 @@
import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core";
import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth";
import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js";
import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog";
import { applyVeniceConfig, VENICE_DEFAULT_MODEL_REF } from "./onboard.js";
import { buildVeniceProvider } from "./provider-catalog.js";

View File

@@ -1,6 +1,6 @@
import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core";
import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth";
import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js";
import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog";
import { applyVercelAiGatewayConfig, VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF } from "./onboard.js";
import { buildVercelAiGatewayProvider } from "./provider-catalog.js";

View File

@@ -9,4 +9,4 @@ export {
export { loginWeb } from "./login.js";
export { startWebLoginWithQr, waitForWebLogin } from "./login-qr.js";
export { whatsappSetupWizard } from "./setup-surface.js";
export { monitorWebChannel } from "../../../src/channels/web/index.js";
export { monitorWebChannel } from "openclaw/plugin-sdk/whatsapp";

View File

@@ -1,4 +1,4 @@
import type { ModelDefinitionConfig } from "../../src/config/types.models.js";
import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-models";
export const XAI_BASE_URL = "https://api.x.ai/v1";
export const XAI_DEFAULT_MODEL_ID = "grok-4";

View File

@@ -1,7 +1,7 @@
import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core";
import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth";
import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog";
import { PROVIDER_LABELS } from "openclaw/plugin-sdk/provider-usage";
import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js";
import { applyXiaomiConfig, XIAOMI_DEFAULT_MODEL_REF } from "./onboard.js";
import { buildXiaomiProvider } from "./provider-catalog.js";

View File

@@ -1,5 +1,7 @@
import { describeImageWithModel } from "../../src/media-understanding/providers/image.js";
import type { MediaUnderstandingProvider } from "../../src/media-understanding/types.js";
import {
describeImageWithModel,
type MediaUnderstandingProvider,
} from "openclaw/plugin-sdk/media-understanding";
export const zaiMediaUnderstandingProvider: MediaUnderstandingProvider = {
id: "zai",

View File

@@ -1,4 +1,4 @@
import type { ModelDefinitionConfig } from "../../src/config/types.models.js";
import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-models";
export const ZAI_CODING_GLOBAL_BASE_URL = "https://api.z.ai/api/coding/paas/v4";
export const ZAI_CODING_CN_BASE_URL = "https://open.bigmodel.cn/api/coding/paas/v4";

View File

@@ -1,5 +1,4 @@
import { createPatchedAccountSetupAdapter } from "../../../src/channels/plugins/setup-helpers.js";
import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js";
import { createPatchedAccountSetupAdapter, DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/setup";
const channel = "zalo" as const;

View File

@@ -1,4 +1,4 @@
import { createPatchedAccountSetupAdapter } from "../../../src/channels/plugins/setup-helpers.js";
import { createPatchedAccountSetupAdapter } from "openclaw/plugin-sdk/setup";
const channel = "zalouser" as const;

View File

@@ -338,6 +338,10 @@
"types": "./dist/plugin-sdk/provider-auth.d.ts",
"default": "./dist/plugin-sdk/provider-auth.js"
},
"./plugin-sdk/provider-catalog": {
"types": "./dist/plugin-sdk/provider-catalog.d.ts",
"default": "./dist/plugin-sdk/provider-catalog.js"
},
"./plugin-sdk/provider-models": {
"types": "./dist/plugin-sdk/provider-models.d.ts",
"default": "./dist/plugin-sdk/provider-models.js"
@@ -358,6 +362,14 @@
"types": "./dist/plugin-sdk/provider-web-search.d.ts",
"default": "./dist/plugin-sdk/provider-web-search.js"
},
"./plugin-sdk/media-understanding": {
"types": "./dist/plugin-sdk/media-understanding.d.ts",
"default": "./dist/plugin-sdk/media-understanding.js"
},
"./plugin-sdk/google": {
"types": "./dist/plugin-sdk/google.d.ts",
"default": "./dist/plugin-sdk/google.js"
},
"./plugin-sdk/request-url": {
"types": "./dist/plugin-sdk/request-url.d.ts",
"default": "./dist/plugin-sdk/request-url.js"

View File

@@ -74,11 +74,14 @@
"json-store",
"keyed-async-queue",
"provider-auth",
"provider-catalog",
"provider-models",
"provider-onboard",
"provider-stream",
"provider-usage",
"provider-web-search",
"media-understanding",
"google",
"request-url",
"runtime-store",
"speech",

View File

@@ -1,5 +1,6 @@
import type { AgentToolResult } from "@mariozechner/pi-agent-core";
import type { OpenClawConfig } from "../../config/config.js";
import { resolveSlackAccount } from "../../plugin-sdk/account-resolution.js";
import {
deleteSlackMessage,
downloadSlackFile,
@@ -20,7 +21,6 @@ import {
parseSlackBlocksInput,
parseSlackTarget,
recordSlackThreadParticipation,
resolveSlackAccount,
resolveSlackChannelId,
} from "../../plugin-sdk/slack.js";
import { withNormalizedTimestamp } from "../date-time.js";

View File

@@ -1,8 +1,8 @@
import { createActionGate, jsonResult, readStringParam } from "../../../agents/tools/common.js";
import { resolveSignalAccount } from "../../../plugin-sdk/account-resolution.js";
import {
listEnabledSignalAccounts,
removeReactionSignal,
resolveSignalAccount,
resolveSignalReactionLevel,
sendReactionSignal,
} from "../../../plugin-sdk/signal.js";

View File

@@ -22,13 +22,13 @@ import {
normalizeTrustedSafeBinDirs,
} from "../infra/exec-safe-bin-trust.js";
import { readChannelAllowFromStore } from "../pairing/pairing-store.js";
import { resolveTelegramAccount } from "../plugin-sdk/account-resolution.js";
import {
fetchTelegramChatId,
inspectTelegramAccount,
isNumericTelegramUserId,
listTelegramAccountIds,
normalizeTelegramAllowFromEntry,
resolveTelegramAccount,
} from "../plugin-sdk/telegram.js";
import {
formatChannelAccountsDefaultPath,

View File

@@ -10,6 +10,22 @@ export {
normalizeOptionalAccountId,
} from "../routing/session-key.js";
export { normalizeE164, pathExists, resolveUserPath } from "../utils.js";
export {
resolveDiscordAccount,
type ResolvedDiscordAccount,
} from "../../extensions/discord/src/accounts.js";
export {
resolveSlackAccount,
type ResolvedSlackAccount,
} from "../../extensions/slack/src/accounts.js";
export {
resolveTelegramAccount,
type ResolvedTelegramAccount,
} from "../../extensions/telegram/src/accounts.js";
export {
resolveSignalAccount,
type ResolvedSignalAccount,
} from "../../extensions/signal/src/accounts.js";
/** Resolve an account by id, then fall back to the default account when the primary lacks credentials. */
export function resolveAccountWithDefaultFallback<TAccount>(params: {

View File

@@ -61,7 +61,6 @@ export {
createDiscordActionGate,
listDiscordAccountIds,
resolveDefaultDiscordAccountId,
resolveDiscordAccount,
} from "../../extensions/discord/src/accounts.js";
export { inspectDiscordAccount } from "../../extensions/discord/src/account-inspect.js";
export {

4
src/plugin-sdk/google.ts Normal file
View File

@@ -0,0 +1,4 @@
// Public Google-specific helpers used by bundled Google plugins.
export { normalizeGoogleModelId } from "../agents/model-id-normalization.js";
export { parseGeminiAuth } from "../infra/gemini-auth.js";

View File

@@ -0,0 +1,21 @@
// Public media-understanding helpers and types for provider plugins.
export type {
AudioTranscriptionRequest,
AudioTranscriptionResult,
ImageDescriptionRequest,
ImageDescriptionResult,
MediaUnderstandingProvider,
VideoDescriptionRequest,
VideoDescriptionResult,
} from "../media-understanding/types.js";
export { describeImageWithModel } from "../media-understanding/providers/image.js";
export { transcribeOpenAiCompatibleAudio } from "../media-understanding/providers/openai-compatible-audio.js";
export {
assertOkOrThrowHttpError,
normalizeBaseUrl,
postJsonRequest,
postTranscriptionRequest,
requireTranscriptionText,
} from "../media-understanding/providers/shared.js";

View File

@@ -0,0 +1,9 @@
// Public provider catalog helpers for provider plugins.
export type { ProviderCatalogContext, ProviderCatalogResult } from "../plugins/types.js";
export {
buildPairedProviderApiKeyCatalog,
buildSingleProviderApiKeyCatalog,
findCatalogTemplate,
} from "../plugins/provider-catalog.js";

View File

@@ -21,8 +21,10 @@ export { normalizeE164, pathExists } from "../utils.js";
export {
applyAccountNameToChannelSection,
applySetupAccountConfigPatch,
createPatchedAccountSetupAdapter,
migrateBaseNameToDefaultAccount,
patchScopedAccountConfig,
prepareScopedSetupConfig,
} from "../channels/plugins/setup-helpers.js";
export {
addWildcardAllowFrom,

View File

@@ -47,7 +47,6 @@ export {
listEnabledSignalAccounts,
listSignalAccountIds,
resolveDefaultSignalAccountId,
resolveSignalAccount,
} from "../../extensions/signal/src/accounts.js";
export { resolveSignalReactionLevel } from "../../extensions/signal/src/reaction-level.js";
export {

View File

@@ -50,7 +50,6 @@ export {
listEnabledSlackAccounts,
listSlackAccountIds,
resolveDefaultSlackAccountId,
resolveSlackAccount,
resolveSlackReplyToMode,
} from "../../extensions/slack/src/accounts.js";
export { isSlackInteractiveRepliesEnabled } from "../../extensions/slack/src/interactive-replies.js";

View File

@@ -65,7 +65,6 @@ export {
listTelegramAccountIds,
resolveDefaultTelegramAccountId,
resolveTelegramPollActionGateState,
resolveTelegramAccount,
} from "../../extensions/telegram/src/accounts.js";
export { inspectTelegramAccount } from "../../extensions/telegram/src/account-inspect.js";
export {