diff --git a/src/search/provider.ts b/src/search/provider.ts index 16ee2b6..6c8ad33 100644 --- a/src/search/provider.ts +++ b/src/search/provider.ts @@ -28,6 +28,17 @@ const vercel: EmbeddingProvider = { }), }; +function applyEnvOverrides(provider: EmbeddingProvider): EmbeddingProvider { + const baseUrl = process.env.LAT_LLM_BASE_URL; + const model = process.env.LAT_LLM_MODEL; + if (!baseUrl && !model) return provider; + return { + ...provider, + ...(baseUrl ? { apiBase: baseUrl } : {}), + ...(model ? { model } : {}), + }; +} + export function detectProvider(key: string): EmbeddingProvider { if (key.startsWith('REPLAY_LAT_LLM_KEY::')) { const replayUrl = key.slice('REPLAY_LAT_LLM_KEY::'.length); @@ -44,9 +55,19 @@ export function detectProvider(key: string): EmbeddingProvider { "Anthropic doesn't offer an embedding model. Set LAT_LLM_KEY to an OpenAI (sk-...) or Vercel AI Gateway (vck_...) key.", ); } - if (key.startsWith('vck_')) return vercel; - if (key.startsWith('sk-')) return openai; + if (key.startsWith('vck_')) return applyEnvOverrides(vercel); + if (key.startsWith('sk-')) return applyEnvOverrides(openai); + // Ollama and other local OpenAI-compatible providers (no auth required) + if (key === 'ollama' || key === 'local') { + return { + name: 'ollama', + apiBase: process.env.LAT_LLM_BASE_URL ?? 'http://localhost:11434/v1', + model: process.env.LAT_LLM_MODEL ?? 'nomic-embed-text', + dimensions: 768, + headers: () => ({ 'Content-Type': 'application/json' }), + }; + } throw new Error( - `Unrecognized LAT_LLM_KEY prefix. Supported: OpenAI (sk-...), Vercel AI Gateway (vck_...).`, + `Unrecognized LAT_LLM_KEY prefix. Supported: OpenAI (sk-...), Vercel AI Gateway (vck_...), Ollama (ollama).`, ); }