Files
openclaw/src/plugins/embedding-provider-runtime-shared.ts
Joseph Krug daab68efc8 fix(plugins): load memory embedding provider owners at startup
Gateway startup now includes plugin owners for explicit memorySearch.provider and memorySearch.fallback values, including custom models.providers API owners and generic embedding provider contracts.

Sentinel and disabled paths keep existing startup behavior for auto, local, none, disabled memory search, and disabled memory slots.

Adds post-runtime-load diagnostics for configured memory embedding providers that remain unregistered.

Closes #89651

Co-authored-by: Joseph Krug <5925937+joeykrug@users.noreply.github.com>
2026-06-07 00:44:06 +08:00

75 lines
2.6 KiB
TypeScript

/** Shared runtime helpers for embedding provider lookup across core and plugin capabilities. */
import { normalizeProviderId } from "@openclaw/model-catalog-core/provider-id";
import type { OpenClawConfig } from "../config/types.openclaw.js";
import {
resolvePluginCapabilityProvider,
resolvePluginCapabilityProviders,
} from "./capability-provider-runtime.js";
type EmbeddingProviderCapabilityKey = "embeddingProviders" | "memoryEmbeddingProviders";
type RegisteredAdapterEntry<TAdapter> = {
adapter: TAdapter;
};
/** Builds lookup ids for embedding providers, including configured API aliases. */
export function resolveRuntimeEmbeddingProviderLookupIds(params: {
id: string;
cfg?: OpenClawConfig;
resolveConfiguredProviderId: (id: string, cfg?: OpenClawConfig) => string | undefined;
}): string[] {
const ids = [params.id];
const configuredProviderId = params.resolveConfiguredProviderId(params.id, params.cfg);
if (
configuredProviderId &&
!ids.some((candidate) => normalizeProviderId(candidate) === configuredProviderId)
) {
ids.push(configuredProviderId);
}
return ids;
}
/** Lists registered and plugin-contributed embedding provider adapters for a capability key. */
export function listRuntimeEmbeddingProviderAdapters<TAdapter extends { id: string }>(params: {
key: EmbeddingProviderCapabilityKey;
cfg?: OpenClawConfig;
registered: TAdapter[];
}): TAdapter[] {
const merged = new Map(params.registered.map((adapter) => [adapter.id, adapter]));
const capabilityAdapters = resolvePluginCapabilityProviders({
key: params.key,
cfg: params.cfg,
}) as unknown as TAdapter[];
for (const adapter of capabilityAdapters) {
if (!merged.has(adapter.id)) {
merged.set(adapter.id, adapter);
}
}
return [...merged.values()];
}
/** Resolves one embedding provider adapter from registered providers before plugin capabilities. */
export function getRuntimeEmbeddingProviderAdapter<TAdapter extends { id: string }>(params: {
key: EmbeddingProviderCapabilityKey;
cfg?: OpenClawConfig;
lookupIds: string[];
getRegisteredProvider: (id: string) => RegisteredAdapterEntry<TAdapter> | undefined;
}): TAdapter | undefined {
for (const candidateId of params.lookupIds) {
const registered = params.getRegisteredProvider(candidateId);
if (registered) {
return registered.adapter;
}
}
for (const candidateId of params.lookupIds) {
const provider = resolvePluginCapabilityProvider({
key: params.key,
providerId: candidateId,
cfg: params.cfg,
}) as TAdapter | undefined;
if (provider) {
return provider;
}
}
return undefined;
}