diff --git a/src/plugins/contracts/registry.ts b/src/plugins/contracts/registry.ts index 364bcfc2553..a2a813ffe6c 100644 --- a/src/plugins/contracts/registry.ts +++ b/src/plugins/contracts/registry.ts @@ -4,37 +4,14 @@ import { normalizeLowercaseStringOrEmpty } from "@openclaw/normalization-core/st import { loadBundledCapabilityRuntimeRegistry } from "../bundled-capability-runtime.js"; import { discoverOpenClawPlugins } from "../discovery.js"; import { loadPluginManifestRegistry } from "../manifest-registry.js"; -import { resolveManifestContractPluginIds } from "../plugin-registry.js"; import { resolveBundledExplicitProviderContractsFromPublicArtifacts } from "../provider-contract-public-artifacts.js"; -import type { - ImageGenerationProviderPlugin, - MediaUnderstandingProviderPlugin, - TranscriptSourceProvider, - MusicGenerationProviderPlugin, - ProviderPlugin, - RealtimeTranscriptionProviderPlugin, - RealtimeVoiceProviderPlugin, - SpeechProviderPlugin, - VideoGenerationProviderPlugin, - WebFetchProviderPlugin, - WebSearchProviderPlugin, -} from "../types.js"; +import type { ProviderPlugin, WebFetchProviderPlugin, WebSearchProviderPlugin } from "../types.js"; import { resolveBundledExplicitWebSearchProvidersFromPublicArtifacts } from "../web-provider-public-artifacts.explicit.js"; import { BUNDLED_PLUGIN_CONTRACT_SNAPSHOTS, type BundledPluginContractSnapshot, } from "./inventory/bundled-capability-metadata.js"; import { uniqueStrings } from "./shared.js"; -import { - loadVitestImageGenerationProviderContractRegistry, - loadVitestMediaUnderstandingProviderContractRegistry, - loadVitestTranscriptsSourceProviderContractRegistry, - loadVitestMusicGenerationProviderContractRegistry, - loadVitestRealtimeTranscriptionProviderContractRegistry, - loadVitestRealtimeVoiceProviderContractRegistry, - loadVitestSpeechProviderContractRegistry, - loadVitestVideoGenerationProviderContractRegistry, -} from "./speech-vitest-registry.js"; type BundledCapabilityRuntimeRegistry = ReturnType; type CapabilityContractEntry = { @@ -49,38 +26,9 @@ type WebSearchProviderContractEntry = CapabilityContractEntry & { credentialValue: unknown; }; -type SpeechProviderContractEntry = CapabilityContractEntry; -type RealtimeTranscriptionProviderContractEntry = - CapabilityContractEntry; -type RealtimeVoiceProviderContractEntry = CapabilityContractEntry; -type MediaUnderstandingProviderContractEntry = - CapabilityContractEntry; -type TranscriptsSourceProviderContractEntry = CapabilityContractEntry; -type ImageGenerationProviderContractEntry = CapabilityContractEntry; -type VideoGenerationProviderContractEntry = CapabilityContractEntry; -type MusicGenerationProviderContractEntry = CapabilityContractEntry; type PluginRegistrationContractEntry = BundledPluginContractSnapshot; -type ManifestContractKey = - | "embeddingProviders" - | "speechProviders" - | "realtimeTranscriptionProviders" - | "realtimeVoiceProviders" - | "mediaUnderstandingProviders" - | "transcriptSourceProviders" - | "documentExtractors" - | "imageGenerationProviders" - | "videoGenerationProviders" - | "musicGenerationProviders" - | "webContentExtractors" - | "webFetchProviders" - | "webSearchProviders" - | "migrationProviders" - | "tools"; - -type ManifestRegistryContractKey = "webFetchProviders" | "webSearchProviders"; - function normalizeProviderEnvVars( providerEnvVars: Record | undefined, ): Record { @@ -201,55 +149,6 @@ function resolveBundledProviderContractPluginIds(): string[] { ).toSorted((left, right) => left.localeCompare(right)); } -function resolveBundledManifestContractPluginIds(contract: ManifestRegistryContractKey): string[] { - return resolveManifestContractPluginIds({ - contract, - origin: "bundled", - }); -} - -function resolveBundledManifestPluginIdsForContract(contract: ManifestContractKey): string[] { - return uniqueStrings( - resolveBundledManifestContracts() - .filter((entry) => { - switch (contract) { - case "embeddingProviders": - return entry.embeddingProviderIds.length > 0; - case "speechProviders": - return entry.speechProviderIds.length > 0; - case "realtimeTranscriptionProviders": - return entry.realtimeTranscriptionProviderIds.length > 0; - case "realtimeVoiceProviders": - return entry.realtimeVoiceProviderIds.length > 0; - case "mediaUnderstandingProviders": - return entry.mediaUnderstandingProviderIds.length > 0; - case "transcriptSourceProviders": - return entry.transcriptSourceProviderIds.length > 0; - case "documentExtractors": - return entry.documentExtractorIds.length > 0; - case "imageGenerationProviders": - return entry.imageGenerationProviderIds.length > 0; - case "videoGenerationProviders": - return entry.videoGenerationProviderIds.length > 0; - case "musicGenerationProviders": - return entry.musicGenerationProviderIds.length > 0; - case "webContentExtractors": - return entry.webContentExtractorIds.length > 0; - case "webFetchProviders": - return entry.webFetchProviderIds.length > 0; - case "webSearchProviders": - return entry.webSearchProviderIds.length > 0; - case "migrationProviders": - return entry.migrationProviderIds.length > 0; - case "tools": - return entry.toolNames.length > 0; - } - throw new Error("Unsupported manifest contract key"); - }) - .map((entry) => entry.pluginId), - ).toSorted((left, right) => left.localeCompare(right)); -} - export let providerContractLoadError: Error | undefined; function formatBundledCapabilityPluginLoadError(params: { @@ -360,45 +259,6 @@ function loadProviderContractEntriesForPluginId(pluginId: string): ProviderContr } } -function loadProviderContractRegistry(): ProviderContractEntry[] { - try { - providerContractLoadError = undefined; - const pluginIds = resolveBundledProviderContractPluginIds(); - const publicArtifactEntries = pluginIds.flatMap( - (pluginId) => - resolveBundledExplicitProviderContractsFromPublicArtifacts({ - onlyPluginIds: [pluginId], - }) ?? [], - ); - const coveredPluginIds = new Set(publicArtifactEntries.map((entry) => entry.pluginId)); - const remainingPluginIds = resolveBundledProviderContractPluginIds().filter( - (pluginId) => !coveredPluginIds.has(pluginId), - ); - const runtimeEntries = - remainingPluginIds.length > 0 - ? loadBundledCapabilityRuntimeRegistry({ - pluginIds: remainingPluginIds, - pluginSdkResolution: "dist", - }).providers.map((entry) => ({ - pluginId: entry.pluginId, - provider: entry.provider, - })) - : []; - return [...publicArtifactEntries, ...runtimeEntries]; - } catch (error) { - providerContractLoadError = error instanceof Error ? error : new Error(String(error)); - return []; - } -} - -function loadUniqueProviderContractProviders(): ProviderPlugin[] { - return [ - ...new Map( - loadProviderContractRegistry().map((entry) => [entry.provider.id, entry.provider]), - ).values(), - ]; -} - function loadProviderContractPluginIds(): string[] { return [...resolveBundledProviderContractPluginIds()]; } @@ -436,18 +296,6 @@ function resolveWebFetchCredentialValue(provider: WebFetchProviderPlugin): unkno : "sk-test"; } -function loadWebFetchProviderContractRegistry(): WebFetchProviderContractEntry[] { - const registry = loadBundledCapabilityRuntimeRegistry({ - pluginIds: resolveBundledManifestContractPluginIds("webFetchProviders"), - pluginSdkResolution: "dist", - }); - return registry.webFetchProviders.map((entry) => ({ - pluginId: entry.pluginId, - provider: entry.provider, - credentialValue: resolveWebFetchCredentialValue(entry.provider), - })); -} - export function resolveWebFetchProviderContractEntriesForPluginId( pluginId: string, ): WebFetchProviderContractEntry[] { @@ -466,37 +314,6 @@ export function resolveWebFetchProviderContractEntriesForPluginId( }); } -function loadWebSearchProviderContractRegistry(): WebSearchProviderContractEntry[] { - const pluginIds = resolveBundledManifestContractPluginIds("webSearchProviders"); - const publicArtifactEntries = pluginIds.flatMap((pluginId) => - ( - resolveBundledExplicitWebSearchProvidersFromPublicArtifacts({ - onlyPluginIds: [pluginId], - }) ?? [] - ).map((provider) => ({ - pluginId: provider.pluginId, - provider, - credentialValue: resolveWebSearchCredentialValue(provider), - })), - ); - const coveredPluginIds = new Set(publicArtifactEntries.map((entry) => entry.pluginId)); - const remainingPluginIds = resolveBundledManifestContractPluginIds("webSearchProviders").filter( - (pluginId) => !coveredPluginIds.has(pluginId), - ); - const runtimeEntries = - remainingPluginIds.length > 0 - ? loadBundledCapabilityRuntimeRegistry({ - pluginIds: remainingPluginIds, - pluginSdkResolution: "dist", - }).webSearchProviders.map((entry) => ({ - pluginId: entry.pluginId, - provider: entry.provider, - credentialValue: resolveWebSearchCredentialValue(entry.provider), - })) - : []; - return [...publicArtifactEntries, ...runtimeEntries]; -} - export function resolveWebSearchProviderContractEntriesForPluginId( pluginId: string, ): WebSearchProviderContractEntry[] { @@ -526,102 +343,6 @@ export function resolveWebSearchProviderContractEntriesForPluginId( }); } -function loadSpeechProviderContractRegistry(): SpeechProviderContractEntry[] { - return process.env.VITEST - ? loadVitestSpeechProviderContractRegistry() - : loadBundledCapabilityRuntimeRegistry({ - pluginIds: resolveBundledManifestPluginIdsForContract("speechProviders"), - pluginSdkResolution: "dist", - }).speechProviders.map((entry) => ({ - pluginId: entry.pluginId, - provider: entry.provider, - })); -} - -function loadRealtimeVoiceProviderContractRegistry(): RealtimeVoiceProviderContractEntry[] { - return process.env.VITEST - ? loadVitestRealtimeVoiceProviderContractRegistry() - : loadBundledCapabilityRuntimeRegistry({ - pluginIds: resolveBundledManifestPluginIdsForContract("realtimeVoiceProviders"), - pluginSdkResolution: "dist", - }).realtimeVoiceProviders.map((entry) => ({ - pluginId: entry.pluginId, - provider: entry.provider, - })); -} - -function loadRealtimeTranscriptionProviderContractRegistry(): RealtimeTranscriptionProviderContractEntry[] { - return process.env.VITEST - ? loadVitestRealtimeTranscriptionProviderContractRegistry() - : loadBundledCapabilityRuntimeRegistry({ - pluginIds: resolveBundledManifestPluginIdsForContract("realtimeTranscriptionProviders"), - pluginSdkResolution: "dist", - }).realtimeTranscriptionProviders.map((entry) => ({ - pluginId: entry.pluginId, - provider: entry.provider, - })); -} - -function loadMediaUnderstandingProviderContractRegistry(): MediaUnderstandingProviderContractEntry[] { - return process.env.VITEST - ? loadVitestMediaUnderstandingProviderContractRegistry() - : loadBundledCapabilityRuntimeRegistry({ - pluginIds: resolveBundledManifestPluginIdsForContract("mediaUnderstandingProviders"), - pluginSdkResolution: "dist", - }).mediaUnderstandingProviders.map((entry) => ({ - pluginId: entry.pluginId, - provider: entry.provider, - })); -} - -function loadTranscriptsSourceProviderContractRegistry(): TranscriptsSourceProviderContractEntry[] { - return process.env.VITEST - ? loadVitestTranscriptsSourceProviderContractRegistry() - : loadBundledCapabilityRuntimeRegistry({ - pluginIds: resolveBundledManifestPluginIdsForContract("transcriptSourceProviders"), - pluginSdkResolution: "dist", - }).transcriptSourceProviders.map((entry) => ({ - pluginId: entry.pluginId, - provider: entry.provider, - })); -} - -function loadImageGenerationProviderContractRegistry(): ImageGenerationProviderContractEntry[] { - return process.env.VITEST - ? loadVitestImageGenerationProviderContractRegistry() - : loadBundledCapabilityRuntimeRegistry({ - pluginIds: resolveBundledManifestPluginIdsForContract("imageGenerationProviders"), - pluginSdkResolution: "dist", - }).imageGenerationProviders.map((entry) => ({ - pluginId: entry.pluginId, - provider: entry.provider, - })); -} - -function loadVideoGenerationProviderContractRegistry(): VideoGenerationProviderContractEntry[] { - return process.env.VITEST - ? loadVitestVideoGenerationProviderContractRegistry() - : loadBundledCapabilityRuntimeRegistry({ - pluginIds: resolveBundledManifestPluginIdsForContract("videoGenerationProviders"), - pluginSdkResolution: "dist", - }).videoGenerationProviders.map((entry) => ({ - pluginId: entry.pluginId, - provider: entry.provider, - })); -} - -function loadMusicGenerationProviderContractRegistry(): MusicGenerationProviderContractEntry[] { - return process.env.VITEST - ? loadVitestMusicGenerationProviderContractRegistry() - : loadBundledCapabilityRuntimeRegistry({ - pluginIds: resolveBundledManifestPluginIdsForContract("musicGenerationProviders"), - pluginSdkResolution: "dist", - }).musicGenerationProviders.map((entry) => ({ - pluginId: entry.pluginId, - provider: entry.provider, - })); -} - function createLazyArrayView(load: () => T[]): T[] { return new Proxy([] as T[], { get(_target, prop) { @@ -654,19 +375,6 @@ function createLazyArrayView(load: () => T[]): T[] { }); } -export const providerContractRegistry: ProviderContractEntry[] = createLazyArrayView( - loadProviderContractRegistry, -); -export const uniqueProviderContractProviders: ProviderPlugin[] = createLazyArrayView( - loadUniqueProviderContractProviders, -); -export const providerContractPluginIds: string[] = createLazyArrayView( - loadProviderContractPluginIds, -); -export const providerContractCompatPluginIds: string[] = createLazyArrayView( - loadProviderContractCompatPluginIds, -); - export function requireProviderContractProvider(providerId: string): ProviderPlugin { const pluginIds = resolveBundledProviderContractPluginIdsByProviderId().get(providerId) ?? []; const entries = loadProviderContractEntriesForPluginIds(pluginIds); @@ -732,27 +440,12 @@ export function resolveProviderContractProvidersForPluginIds( ]; } -export const webSearchProviderContractRegistry: WebSearchProviderContractEntry[] = - createLazyArrayView(loadWebSearchProviderContractRegistry); -export const webFetchProviderContractRegistry: WebFetchProviderContractEntry[] = - createLazyArrayView(loadWebFetchProviderContractRegistry); -export const speechProviderContractRegistry: SpeechProviderContractEntry[] = createLazyArrayView( - loadSpeechProviderContractRegistry, +export const providerContractPluginIds: string[] = createLazyArrayView( + loadProviderContractPluginIds, +); +export const providerContractCompatPluginIds: string[] = createLazyArrayView( + loadProviderContractCompatPluginIds, ); -export const realtimeTranscriptionProviderContractRegistry: RealtimeTranscriptionProviderContractEntry[] = - createLazyArrayView(loadRealtimeTranscriptionProviderContractRegistry); -export const realtimeVoiceProviderContractRegistry: RealtimeVoiceProviderContractEntry[] = - createLazyArrayView(loadRealtimeVoiceProviderContractRegistry); -export const mediaUnderstandingProviderContractRegistry: MediaUnderstandingProviderContractEntry[] = - createLazyArrayView(loadMediaUnderstandingProviderContractRegistry); -export const transcriptsSourceProviderContractRegistry: TranscriptsSourceProviderContractEntry[] = - createLazyArrayView(loadTranscriptsSourceProviderContractRegistry); -export const imageGenerationProviderContractRegistry: ImageGenerationProviderContractEntry[] = - createLazyArrayView(loadImageGenerationProviderContractRegistry); -export const videoGenerationProviderContractRegistry: VideoGenerationProviderContractEntry[] = - createLazyArrayView(loadVideoGenerationProviderContractRegistry); -export const musicGenerationProviderContractRegistry: MusicGenerationProviderContractEntry[] = - createLazyArrayView(loadMusicGenerationProviderContractRegistry); function loadPluginRegistrationContractRegistry(): PluginRegistrationContractEntry[] { return resolveBundledManifestContracts();