diff --git a/keep-notes/app/(main)/admin/settings/admin-settings-form.tsx b/keep-notes/app/(main)/admin/settings/admin-settings-form.tsx index 211b869..3ae69d0 100644 --- a/keep-notes/app/(main)/admin/settings/admin-settings-form.tsx +++ b/keep-notes/app/(main)/admin/settings/admin-settings-form.tsx @@ -300,7 +300,12 @@ export function AdminSettingsForm({ config }: { config: Record }

AI provider for semantic search embeddings. Recommended: OpenAI (best quality).

- + +

+ Config value: {config.AI_PROVIDER_EMBEDDING || 'Not set (defaults to ollama)'} +

{/* Ollama Embeddings Config */} diff --git a/keep-notes/lib/ai/factory.ts b/keep-notes/lib/ai/factory.ts index 18fa670..a439ae8 100644 --- a/keep-notes/lib/ai/factory.ts +++ b/keep-notes/lib/ai/factory.ts @@ -6,7 +6,16 @@ import { AIProvider } from './types'; type ProviderType = 'ollama' | 'openai' | 'custom'; function createOllamaProvider(config: Record, modelName: string, embeddingModelName: string): OllamaProvider { - let baseUrl = config?.OLLAMA_BASE_URL || process.env.OLLAMA_BASE_URL || 'http://localhost:11434'; + let baseUrl = config?.OLLAMA_BASE_URL || process.env.OLLAMA_BASE_URL + + // Only use localhost as fallback for local development (not in Docker) + if (!baseUrl && process.env.NODE_ENV !== 'production') { + baseUrl = 'http://localhost:11434' + } + + if (!baseUrl) { + throw new Error('OLLAMA_BASE_URL is required when using Ollama provider') + } // Ensure baseUrl doesn't end with /api, we'll add it in OllamaProvider if (baseUrl.endsWith('/api')) { diff --git a/keep-notes/lib/ai/providers/ollama.ts b/keep-notes/lib/ai/providers/ollama.ts index 3955650..ae22e5f 100644 --- a/keep-notes/lib/ai/providers/ollama.ts +++ b/keep-notes/lib/ai/providers/ollama.ts @@ -5,7 +5,10 @@ export class OllamaProvider implements AIProvider { private modelName: string; private embeddingModelName: string; - constructor(baseUrl: string = 'http://localhost:11434', modelName: string = 'llama3', embeddingModelName?: string) { + constructor(baseUrl: string, modelName: string = 'llama3', embeddingModelName?: string) { + if (!baseUrl) { + throw new Error('baseUrl is required for OllamaProvider') + } // Ensure baseUrl ends with /api for Ollama API this.baseUrl = baseUrl.endsWith('/api') ? baseUrl : `${baseUrl}/api`; this.modelName = modelName; diff --git a/keep-notes/lib/ai/services/paragraph-refactor.service.ts b/keep-notes/lib/ai/services/paragraph-refactor.service.ts index b93927b..cdc5119 100644 --- a/keep-notes/lib/ai/services/paragraph-refactor.service.ts +++ b/keep-notes/lib/ai/services/paragraph-refactor.service.ts @@ -84,7 +84,12 @@ export class ParagraphRefactorService { const userPrompt = this.getUserPrompt(mode, content, language) // Get AI provider response using fetch - let baseUrl = process.env.OLLAMA_BASE_URL || 'http://localhost:11434' + let baseUrl = process.env.OLLAMA_BASE_URL + + if (!baseUrl) { + throw new Error('OLLAMA_BASE_URL environment variable is required') + } + // Remove /api suffix if present to avoid double /api/api/... if (baseUrl.endsWith('/api')) { baseUrl = baseUrl.slice(0, -4) @@ -185,7 +190,12 @@ Original language: ${language} IMPORTANT: Provide all 3 versions in ${language}. No English, no explanations.` // Get AI provider response using fetch - let baseUrl = process.env.OLLAMA_BASE_URL || 'http://localhost:11434' + let baseUrl = process.env.OLLAMA_BASE_URL + + if (!baseUrl) { + throw new Error('OLLAMA_BASE_URL environment variable is required') + } + // Remove /api suffix if present to avoid double /api/api/... if (baseUrl.endsWith('/api')) { baseUrl = baseUrl.slice(0, -4)