fix: Auto-discover Ollama models without requiring API key (#4544)

Ollama is a local service that doesn't require authentication, but the code
was only enabling the Ollama provider if an API key was configured. This
caused locally installed Ollama models to show as 'missing' even when they
were available.

Changes:
- Modified resolveImplicitProviders() to auto-discover Ollama models
- Add provider if models are found, using 'local' as placeholder API key
- Falls back to configured API key if one exists
- Updated test to reflect new auto-discovery behavior

Fixes #4544
This commit is contained in:
spiceoogway 2026-01-30 08:50:30 -05:00
parent 7150268f84
commit 73af69bd21
2 changed files with 12 additions and 5 deletions

View File

@ -5,11 +5,12 @@ import { join } from "node:path";
import { tmpdir } from "node:os";
describe("Ollama provider", () => {
it("should not include ollama when no API key is configured", async () => {
it("should not include ollama in test environment (no local discovery)", async () => {
const agentDir = mkdtempSync(join(tmpdir(), "openclaw-test-"));
const providers = await resolveImplicitProviders({ agentDir });
// Ollama requires explicit configuration via OLLAMA_API_KEY env var or profile
// In test environments, Ollama discovery is skipped and no API key is configured,
// so the provider should not be included
expect(providers?.ollama).toBeUndefined();
});
});

View File

@ -446,12 +446,18 @@ export async function resolveImplicitProviders(params: {
providers.xiaomi = { ...buildXiaomiProvider(), apiKey: xiaomiKey };
}
// Ollama provider - only add if explicitly configured
// Ollama provider - auto-discover local models, no API key needed
const ollamaKey =
resolveEnvApiKeyVarName("ollama") ??
resolveApiKeyFromProfiles({ provider: "ollama", store: authStore });
if (ollamaKey) {
providers.ollama = { ...(await buildOllamaProvider()), apiKey: ollamaKey };
const ollamaProvider = await buildOllamaProvider();
// Add provider if models are discovered OR if explicitly configured with API key
if (ollamaProvider.models.length > 0 || ollamaKey) {
providers.ollama = {
...ollamaProvider,
// Use configured key if available, otherwise use placeholder for local auth
apiKey: ollamaKey ?? "local",
};
}
return providers;