diff --git a/URGENT-FIX.md b/URGENT-FIX.md new file mode 100644 index 0000000..67ab181 --- /dev/null +++ b/URGENT-FIX.md @@ -0,0 +1,63 @@ +# 🚨 CORRECTION URGENTE - DÉPLOIEMENT IMMÉDIAT + +## Le problème qui a été corrigé +Le formulaire admin ne sauvegardait PAS correctement la configuration AI dans la base de données ! + +## ✅ CORRECTIONS EFFECTUÉES +1. Formulaire admin avec validation et logs +2. Sauvegarde filtre les valeurs vides +3. Script d'initialisation OpenAI créé + +## 🚀 DÉPLOIEMENT MAINTENANT (5 min) + +```bash +# Sur votre serveur Proxmox +cd /path/to/Keep +git pull + +# OPTION 1: Initialiser OpenAI dans la DB (RECOMMANDÉ) +cd keep-notes +npx tsx scripts/setup-openai.ts + +# OU OPTION 2: Configurer via l'interface +# Ouvrez http://192.168.1.190:3000/admin/settings +# Section AI Settings +# - Tags Provider: openai +# - Embeddings Provider: openai +# - OPENAI_API_KEY: sk-proj-... +# Cliquez "Save AI Settings" + +# Redémarrer l'application +cd .. +docker compose down +docker compose up -d + +# Vérifier que ça marche +curl http://192.168.1.190:3000/api/debug/config +``` + +## ✅ RÉSULTAT ATTENDU + +```json +{ + "AI_PROVIDER_TAGS": "openai", + "AI_PROVIDER_EMBEDDING": "openai", + "AI_MODEL_TAGS": "gpt-4o-mini", + "AI_MODEL_EMBEDDING": "text-embedding-3-small", + "OPENAI_API_KEY": "set (hidden)" +} +``` + +## 🧪 TESTS + +Ouvrez http://192.168.1.190:3000 et: +1. Créez une note +2. Testez: Ctrl+M (génération titres) ✅ +3. Testez: Auto-labels ✅ +4. Testez: Clarify/Shorten/Improve Style ✅ + +**PLUS d'erreurs "AI_PROVIDER_TAGS is not configured" !** 🎉 + +## 💤 BONNE NUIT ! + +Une fois le déploiement fait, tout devrait marcher. Dormez tranquille ! 😴 diff --git a/keep-notes/lib/ai/services/auto-label-creation.service.ts b/keep-notes/lib/ai/services/auto-label-creation.service.ts index 4f18fdd..aed9160 100644 --- a/keep-notes/lib/ai/services/auto-label-creation.service.ts +++ b/keep-notes/lib/ai/services/auto-label-creation.service.ts @@ -1,5 +1,6 @@ import { prisma } from '@/lib/prisma' import { getAIProvider } from '@/lib/ai/factory' +import { getSystemConfig } from '@/lib/config' export interface SuggestedLabel { name: string @@ -102,7 +103,8 @@ export class AutoLabelCreationService { const prompt = this.buildPrompt(notes, existingLabelNames) try { - const provider = getAIProvider() + const config = await getSystemConfig() + const provider = getAIProvider(config) const response = await provider.generateText(prompt) // Parse AI response diff --git a/keep-notes/lib/ai/services/batch-organization.service.ts b/keep-notes/lib/ai/services/batch-organization.service.ts index 313b2ac..e89e6a9 100644 --- a/keep-notes/lib/ai/services/batch-organization.service.ts +++ b/keep-notes/lib/ai/services/batch-organization.service.ts @@ -1,5 +1,6 @@ import { prisma } from '@/lib/prisma' import { getAIProvider } from '@/lib/ai/factory' +import { getSystemConfig } from '@/lib/config' export interface NoteForOrganization { id: string @@ -100,7 +101,8 @@ export class BatchOrganizationService { const prompt = this.buildPrompt(notes, notebooks) try { - const provider = getAIProvider() + const config = await getSystemConfig() + const provider = getAIProvider(config) const response = await provider.generateText(prompt) // Parse AI response diff --git a/keep-notes/lib/ai/services/contextual-auto-tag.service.ts b/keep-notes/lib/ai/services/contextual-auto-tag.service.ts index 9261291..7569fe4 100644 --- a/keep-notes/lib/ai/services/contextual-auto-tag.service.ts +++ b/keep-notes/lib/ai/services/contextual-auto-tag.service.ts @@ -6,6 +6,7 @@ import { prisma } from '@/lib/prisma' import { getAIProvider } from '@/lib/ai/factory' +import { getSystemConfig } from '@/lib/config' export interface LabelSuggestion { label: string @@ -73,7 +74,8 @@ export class ContextualAutoTagService { const prompt = this.buildPrompt(noteContent, notebook.name, availableLabels) try { - const provider = getAIProvider() + const config = await getSystemConfig() + const provider = getAIProvider(config) // Use generateText with JSON response const response = await provider.generateText(prompt) @@ -155,7 +157,8 @@ export class ContextualAutoTagService { const prompt = this.buildNewLabelsPrompt(noteContent, notebook.name) try { - const provider = getAIProvider() + const config = await getSystemConfig() + const provider = getAIProvider(config) // Use generateText with JSON response const response = await provider.generateText(prompt) diff --git a/keep-notes/lib/ai/services/embedding.service.ts b/keep-notes/lib/ai/services/embedding.service.ts index 8edcd4d..6cea1b0 100644 --- a/keep-notes/lib/ai/services/embedding.service.ts +++ b/keep-notes/lib/ai/services/embedding.service.ts @@ -5,6 +5,7 @@ */ import { getAIProvider } from '../factory' +import { getSystemConfig } from '@/lib/config' export interface EmbeddingResult { embedding: number[] @@ -28,7 +29,8 @@ export class EmbeddingService { } try { - const provider = getAIProvider() + const config = await getSystemConfig() + const provider = getAIProvider(config) // Use the existing getEmbeddings method from AIProvider const embedding = await provider.getEmbeddings(text) @@ -65,7 +67,8 @@ export class EmbeddingService { } try { - const provider = getAIProvider() + const config = await getSystemConfig() + const provider = getAIProvider(config) // Batch embedding using the existing getEmbeddings method const embeddings = await Promise.all( diff --git a/keep-notes/lib/ai/services/notebook-suggestion.service.ts b/keep-notes/lib/ai/services/notebook-suggestion.service.ts index 9355b13..3deb24d 100644 --- a/keep-notes/lib/ai/services/notebook-suggestion.service.ts +++ b/keep-notes/lib/ai/services/notebook-suggestion.service.ts @@ -1,5 +1,6 @@ import { prisma } from '@/lib/prisma' import { getAIProvider } from '@/lib/ai/factory' +import { getSystemConfig } from '@/lib/config' import type { Notebook } from '@/lib/types' export class NotebookSuggestionService { @@ -31,7 +32,8 @@ export class NotebookSuggestionService { // 3. Call AI try { - const provider = getAIProvider() + const config = await getSystemConfig() + const provider = getAIProvider(config) const response = await provider.generateText(prompt) diff --git a/keep-notes/lib/ai/services/notebook-summary.service.ts b/keep-notes/lib/ai/services/notebook-summary.service.ts index b64fad2..fbe6003 100644 --- a/keep-notes/lib/ai/services/notebook-summary.service.ts +++ b/keep-notes/lib/ai/services/notebook-summary.service.ts @@ -1,5 +1,6 @@ import { prisma } from '@/lib/prisma' import { getAIProvider } from '@/lib/ai/factory' +import { getSystemConfig } from '@/lib/config' export interface NotebookSummary { notebookId: string @@ -124,7 +125,8 @@ ${content}...` const prompt = this.buildPrompt(notesSummary, notebook.name) try { - const provider = getAIProvider() + const config = await getSystemConfig() + const provider = getAIProvider(config) const summary = await provider.generateText(prompt) return summary.trim() } catch (error) {