refactor: share plugin capability provider resolution

This commit is contained in:
Peter Steinberger
2026-03-27 13:59:25 +00:00
parent f1503bd5c7
commit 07df59287a
4 changed files with 46 additions and 25 deletions

View File

@@ -1,8 +1,8 @@
import { normalizeProviderId } from "../agents/model-selection.js";
import type { OpenClawConfig } from "../config/config.js";
import { isBlockedObjectKey } from "../infra/prototype-keys.js";
import { loadOpenClawPlugins } from "../plugins/loader.js";
import { getActivePluginRegistry, getActivePluginRegistryKey } from "../plugins/runtime.js";
import { resolvePluginCapabilityProviders } from "../plugins/capability-provider-runtime.js";
import { getActivePluginRegistryKey } from "../plugins/runtime.js";
import type { ImageGenerationProviderPlugin } from "../plugins/types.js";
const BUILTIN_IMAGE_GENERATION_PROVIDERS: readonly ImageGenerationProviderPlugin[] = [];
@@ -23,12 +23,12 @@ function isSafeImageGenerationProviderId(id: string | undefined): id is string {
function resolvePluginImageGenerationProviders(
cfg?: OpenClawConfig,
): ImageGenerationProviderPlugin[] {
const active = getActivePluginRegistry();
const registry =
(active?.imageGenerationProviders?.length ?? 0) > 0 || getActivePluginRegistryKey() || !cfg
? active
: loadOpenClawPlugins({ config: cfg });
return registry?.imageGenerationProviders?.map((entry) => entry.provider) ?? [];
return resolvePluginCapabilityProviders({
key: "imageGenerationProviders",
cfg,
useActiveRegistryWhen: (active) =>
(active?.imageGenerationProviders?.length ?? 0) > 0 || Boolean(getActivePluginRegistryKey()),
});
}
function buildProviderMaps(cfg?: OpenClawConfig): {

View File

@@ -1,6 +1,5 @@
import type { OpenClawConfig } from "../config/config.js";
import { loadOpenClawPlugins } from "../plugins/loader.js";
import { getActivePluginRegistry } from "../plugins/runtime.js";
import { resolvePluginCapabilityProviders } from "../plugins/capability-provider-runtime.js";
import { normalizeMediaProviderId } from "./provider-id.js";
import type { MediaUnderstandingProvider } from "./types.js";
@@ -27,13 +26,11 @@ export function buildMediaUnderstandingRegistry(
cfg?: OpenClawConfig,
): Map<string, MediaUnderstandingProvider> {
const registry = new Map<string, MediaUnderstandingProvider>();
const active = getActivePluginRegistry();
const pluginRegistry =
(active?.mediaUnderstandingProviders?.length ?? 0) > 0 || !cfg
? active
: loadOpenClawPlugins({ config: cfg });
for (const entry of pluginRegistry?.mediaUnderstandingProviders ?? []) {
mergeProviderIntoRegistry(registry, entry.provider);
for (const provider of resolvePluginCapabilityProviders({
key: "mediaUnderstandingProviders",
cfg,
})) {
mergeProviderIntoRegistry(registry, provider);
}
if (overrides) {
for (const [key, provider] of Object.entries(overrides)) {

View File

@@ -0,0 +1,27 @@
import type { OpenClawConfig } from "../config/config.js";
import { loadOpenClawPlugins } from "./loader.js";
import type { PluginRegistry } from "./registry.js";
import { getActivePluginRegistry } from "./runtime.js";
type CapabilityProviderRegistryKey =
| "speechProviders"
| "mediaUnderstandingProviders"
| "imageGenerationProviders";
type CapabilityProviderForKey<K extends CapabilityProviderRegistryKey> =
PluginRegistry[K][number] extends { provider: infer T } ? T : never;
export function resolvePluginCapabilityProviders<K extends CapabilityProviderRegistryKey>(params: {
key: K;
cfg?: OpenClawConfig;
useActiveRegistryWhen?: (active: PluginRegistry | undefined) => boolean;
}): CapabilityProviderForKey<K>[] {
const active = getActivePluginRegistry();
const shouldUseActive =
params.useActiveRegistryWhen?.(active) ?? (active?.[params.key].length ?? 0) > 0;
const registry =
shouldUseActive || !params.cfg ? active : loadOpenClawPlugins({ config: params.cfg });
return (registry?.[params.key] ?? []).map(
(entry) => entry.provider,
) as CapabilityProviderForKey<K>[];
}

View File

@@ -1,6 +1,5 @@
import type { OpenClawConfig } from "../config/config.js";
import { loadOpenClawPlugins } from "../plugins/loader.js";
import { getActivePluginRegistry } from "../plugins/runtime.js";
import { resolvePluginCapabilityProviders } from "../plugins/capability-provider-runtime.js";
import type { SpeechProviderPlugin } from "../plugins/types.js";
import type { SpeechProviderId } from "./provider-types.js";
@@ -16,12 +15,10 @@ export function normalizeSpeechProviderId(
}
function resolveSpeechProviderPluginEntries(cfg?: OpenClawConfig): SpeechProviderPlugin[] {
const active = getActivePluginRegistry();
const registry =
(active?.speechProviders?.length ?? 0) > 0 || !cfg
? active
: loadOpenClawPlugins({ config: cfg });
return registry?.speechProviders?.map((entry) => entry.provider) ?? [];
return resolvePluginCapabilityProviders({
key: "speechProviders",
cfg,
});
}
function buildProviderMaps(cfg?: OpenClawConfig): {