feat: AI provider testing page + multi-provider support + UX design spec

- Add AI Provider Testing page (/admin/ai-test) with Tags and Embeddings tests
- Add new AI providers: CustomOpenAI, DeepSeek, OpenRouter
- Add API routes for AI config, models listing, and testing endpoints
- Add UX Design Specification document for Phase 1 MVP AI
- Add PRD Phase 1 MVP AI planning document
- Update admin settings and sidebar navigation
- Fix AI factory for multi-provider support
This commit is contained in:
2026-01-10 11:23:22 +01:00
parent 640fcb26f7
commit fc2c40249e
21 changed files with 5971 additions and 138 deletions

View File

@@ -1,13 +1,20 @@
import { openai } from '@ai-sdk/openai';
import { createOpenAI } from '@ai-sdk/openai';
import { generateObject, embed } from 'ai';
import { z } from 'zod';
import { AIProvider, TagSuggestion } from '../types';
export class OpenAIProvider implements AIProvider {
private model: any;
private embeddingModel: any;
constructor(apiKey: string, modelName: string = 'gpt-4o-mini') {
this.model = openai(modelName);
constructor(apiKey: string, modelName: string = 'gpt-4o-mini', embeddingModelName: string = 'text-embedding-3-small') {
// Create OpenAI client with API key
const openaiClient = createOpenAI({
apiKey: apiKey,
});
this.model = openaiClient(modelName);
this.embeddingModel = openaiClient.embedding(embeddingModelName);
}
async generateTags(content: string): Promise<TagSuggestion[]> {
@@ -20,7 +27,7 @@ export class OpenAIProvider implements AIProvider {
confidence: z.number().min(0).max(1).describe('Le niveau de confiance entre 0 et 1')
}))
}),
prompt: `Analyse la note suivante et suggère entre 1 et 5 tags pertinents.
prompt: `Analyse la note suivante et suggère entre 1 et 5 tags pertinents.
Contenu de la note: "${content}"`,
});
@@ -34,7 +41,7 @@ export class OpenAIProvider implements AIProvider {
async getEmbeddings(text: string): Promise<number[]> {
try {
const { embedding } = await embed({
model: openai.embedding('text-embedding-3-small'),
model: this.embeddingModel,
value: text,
});
return embedding;