diff --git a/src/commands/doctor-memory-search.test.ts b/src/commands/doctor-memory-search.test.ts index f3118469ec5..8d480b70f84 100644 --- a/src/commands/doctor-memory-search.test.ts +++ b/src/commands/doctor-memory-search.test.ts @@ -394,6 +394,37 @@ describe("noteMemorySearchHealth", () => { expect(note).not.toHaveBeenCalled(); }); + it("does not warn for ollama when gateway probe is ready without CLI API key", async () => { + resolveMemorySearchConfig.mockReturnValue({ + provider: "ollama", + local: {}, + remote: {}, + }); + + await noteMemorySearchHealth(cfg, { + gatewayMemoryProbe: { checked: true, ready: true }, + }); + + expect(note).not.toHaveBeenCalled(); + expect(resolveApiKeyForProvider).not.toHaveBeenCalled(); + }); + + it("warns for ollama when gateway probe reports embeddings are not ready", async () => { + resolveMemorySearchConfig.mockReturnValue({ + provider: "ollama", + local: {}, + remote: {}, + }); + + await noteMemorySearchHealth(cfg, { + gatewayMemoryProbe: { checked: true, ready: false, error: "connection refused" }, + }); + + const message = String(note.mock.calls[0]?.[0] ?? ""); + expect(message).toContain('provider "ollama" is configured'); + expect(message).toContain("embeddings are not ready"); + }); + it("warns when lmstudio gateway probe reports embeddings are not ready", async () => { resolveMemorySearchConfig.mockReturnValue({ provider: "lmstudio", diff --git a/src/commands/doctor-memory-search.ts b/src/commands/doctor-memory-search.ts index 1b836a18e9d..c8ba2560579 100644 --- a/src/commands/doctor-memory-search.ts +++ b/src/commands/doctor-memory-search.ts @@ -128,6 +128,10 @@ function resolveSuggestedRemoteMemoryProvider(): string | undefined { )?.providerId; } +function isKeyOptionalMemoryProvider(providerId: string): boolean { + return providerId === "local" || providerId === "ollama" || providerId === "lmstudio"; +} + async function resolveRuntimeMemoryAuditContext( cfg: OpenClawConfig, ): Promise { @@ -402,7 +406,7 @@ export async function noteMemorySearchHealth( ); return; } - if (resolved.provider === "lmstudio") { + if (isKeyOptionalMemoryProvider(resolved.provider)) { if (opts?.gatewayMemoryProbe?.checked && opts.gatewayMemoryProbe.ready) { return; } @@ -410,8 +414,8 @@ export async function noteMemorySearchHealth( note( [ gatewayProbeWarning - ? 'Memory search provider "lmstudio" is configured, but the gateway reports embeddings are not ready.' - : 'Memory search provider "lmstudio" is configured, but the gateway could not confirm embeddings are ready.', + ? `Memory search provider "${resolved.provider}" is configured, but the gateway reports embeddings are not ready.` + : `Memory search provider "${resolved.provider}" is configured, but the gateway could not confirm embeddings are ready.`, gatewayProbeWarning, `Verify: ${formatCliCommand("openclaw memory status --deep")}`, ]