
























@@ -11,6 +11,7 @@ import {
1111import { getMemoryEmbeddingProvider } from "../plugins/memory-embedding-providers.js";
1212import { clampInt, clampNumber, resolveUserPath } from "../utils.js";
1313import { resolveAgentConfig } from "./agent-scope.js";
14+import { findNormalizedProviderValue, normalizeProviderId } from "./provider-id.js";
14151516export type ResolvedMemorySearchConfig = {
1617enabled: boolean;
@@ -147,7 +148,29 @@ function resolveStorePath(agentId: string, raw?: string): string {
147148return resolveUserPath(withToken);
148149}
149150151+function getConfiguredMemoryEmbeddingProvider(
152+providerId: string,
153+cfg: OpenClawConfig,
154+): ReturnType<typeof getMemoryEmbeddingProvider> {
155+const directAdapter = getMemoryEmbeddingProvider(providerId);
156+if (directAdapter) {
157+return directAdapter;
158+}
159+const providerConfig = findNormalizedProviderValue(cfg.models?.providers, providerId);
160+const ownerApi = providerConfig?.api?.trim();
161+if (!ownerApi) {
162+return undefined;
163+}
164+const normalizedProvider = normalizeProviderId(providerId);
165+const normalizedOwner = normalizeProviderId(ownerApi);
166+if (!normalizedOwner || normalizedOwner === normalizedProvider) {
167+return undefined;
168+}
169+return getMemoryEmbeddingProvider(normalizedOwner);
170+}
171+150172function mergeConfig(
173+cfg: OpenClawConfig,
151174defaults: MemorySearchConfig | undefined,
152175overrides: MemorySearchConfig | undefined,
153176agentId: string,
@@ -156,12 +179,15 @@ function mergeConfig(
156179const sessionMemory =
157180overrides?.experimental?.sessionMemory ?? defaults?.experimental?.sessionMemory ?? false;
158181const provider = overrides?.provider ?? defaults?.provider ?? "auto";
159-const primaryAdapter = provider === "auto" ? undefined : getMemoryEmbeddingProvider(provider);
182+const primaryAdapter =
183+provider === "auto" ? undefined : getConfiguredMemoryEmbeddingProvider(provider, cfg);
160184const defaultRemote = defaults?.remote;
161185const overrideRemote = overrides?.remote;
162186const fallback = overrides?.fallback ?? defaults?.fallback ?? "none";
163187const fallbackAdapter =
164-fallback && fallback !== "none" ? getMemoryEmbeddingProvider(fallback) : undefined;
188+fallback && fallback !== "none"
189+ ? getConfiguredMemoryEmbeddingProvider(fallback, cfg)
190+ : undefined;
165191const hasRemoteConfig = Boolean(
166192overrideRemote?.baseUrl ||
167193overrideRemote?.apiKey ||
@@ -402,15 +428,17 @@ export function resolveMemorySearchConfig(
402428): ResolvedMemorySearchConfig | null {
403429const defaults = cfg.agents?.defaults?.memorySearch;
404430const overrides = resolveAgentConfig(cfg, agentId)?.memorySearch;
405-const resolved = mergeConfig(defaults, overrides, agentId);
431+const resolved = mergeConfig(cfg, defaults, overrides, agentId);
406432if (!resolved.enabled) {
407433return null;
408434}
409435const multimodalActive = isMemoryMultimodalEnabled(resolved.multimodal);
410436const multimodalProvider =
411-resolved.provider === "auto" ? undefined : getMemoryEmbeddingProvider(resolved.provider);
412-// Config resolution is a startup/doctor hot path; only validate adapters
413-// already registered by the active runtime instead of cold-loading plugins.
437+resolved.provider === "auto"
438+ ? undefined
439+ : getConfiguredMemoryEmbeddingProvider(resolved.provider, cfg);
440+// Custom provider ids can map to a memory adapter through models.providers.<id>.api.
441+// Keep multimodal validation on that config-aware adapter, not the raw id.
414442if (
415443multimodalActive &&
416444multimodalProvider &&
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。