mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-16 17:51:42 +00:00
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>
61 lines
2.3 KiB
TypeScript
61 lines
2.3 KiB
TypeScript
import { normalizeProviderId } from "@openclaw/model-catalog-core/provider-id";
|
|
import type { OpenClawConfig } from "../config/types.openclaw.js";
|
|
|
|
type ConfiguredModelProvider = NonNullable<
|
|
NonNullable<OpenClawConfig["models"]>["providers"]
|
|
>[string];
|
|
const OPENAI_COMPATIBLE_EMBEDDING_PROVIDER_ID = "openai-compatible";
|
|
const OPENAI_COMPATIBLE_MODEL_APIS = new Set(["openai-completions", "openai-responses"]);
|
|
|
|
function resolveConfiguredProviderConfig(
|
|
providerId: string,
|
|
cfg?: OpenClawConfig,
|
|
): ConfiguredModelProvider | undefined {
|
|
const providers = cfg?.models?.providers;
|
|
if (!providers) {
|
|
return undefined;
|
|
}
|
|
const normalized = normalizeProviderId(providerId);
|
|
return (
|
|
providers[providerId] ??
|
|
Object.entries(providers).find(
|
|
([candidateId]) => normalizeProviderId(candidateId) === normalized,
|
|
)?.[1]
|
|
);
|
|
}
|
|
|
|
/** Reads a configured provider's backing API id when runtime lookup should follow an alias. */
|
|
export function readConfiguredProviderApiId(params: {
|
|
providerId: string;
|
|
cfg?: OpenClawConfig;
|
|
resolveApiProviderId?: (normalizedApiId: string) => string | undefined;
|
|
resolveMissingApiProviderId?: (providerConfig: ConfiguredModelProvider) => string | undefined;
|
|
}): string | undefined {
|
|
const providerConfig = resolveConfiguredProviderConfig(params.providerId, params.cfg);
|
|
if (!providerConfig) {
|
|
return undefined;
|
|
}
|
|
const normalized = normalizeProviderId(params.providerId);
|
|
const api = providerConfig.api?.trim();
|
|
const resolvedProviderId = api
|
|
? (params.resolveApiProviderId?.(normalizeProviderId(api)) ?? normalizeProviderId(api))
|
|
: params.resolveMissingApiProviderId?.(providerConfig);
|
|
return resolvedProviderId && resolvedProviderId !== normalized ? resolvedProviderId : undefined;
|
|
}
|
|
|
|
export function resolveConfiguredGenericEmbeddingProviderId(
|
|
providerId: string,
|
|
cfg?: OpenClawConfig,
|
|
): string | undefined {
|
|
return readConfiguredProviderApiId({
|
|
providerId,
|
|
cfg,
|
|
resolveApiProviderId: (normalizedApiId) =>
|
|
OPENAI_COMPATIBLE_MODEL_APIS.has(normalizedApiId)
|
|
? OPENAI_COMPATIBLE_EMBEDDING_PROVIDER_ID
|
|
: normalizedApiId,
|
|
resolveMissingApiProviderId: (providerConfig) =>
|
|
providerConfig.baseUrl?.trim() ? OPENAI_COMPATIBLE_EMBEDDING_PROVIDER_ID : undefined,
|
|
});
|
|
}
|