From 240934da3af1a41863f6c87e675df119ef139a25 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 25 May 2026 00:17:56 +0300 Subject: [PATCH] feat(provider): add Ollama/local provider + LAT_LLM_BASE_URL/MODEL overrides MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add support for local OpenAI-compatible embedding providers: - LAT_LLM_KEY="ollama" — uses Ollama at http://localhost:11434/v1 with nomic-embed-text (768-dim). No API key required. - LAT_LLM_KEY="local" — alias for ollama. - LAT_LLM_BASE_URL — overrides apiBase for any provider (openai, vercel, ollama). - LAT_LLM_MODEL — overrides model name for any provider. Usage: export LAT_LLM_KEY=ollama # optionally: export LAT_LLM_BASE_URL=http://localhost:11434/v1 export LAT_LLM_MODEL=nomic-embed-text ollama pull nomic-embed-text --- src/search/provider.ts | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) 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).`, ); }