diff --git a/memento-note/Dockerfile b/memento-note/Dockerfile index db4b13d..0ea236e 100644 --- a/memento-note/Dockerfile +++ b/memento-note/Dockerfile @@ -20,6 +20,10 @@ RUN npx prisma generate FROM node:22-bookworm-slim AS builder WORKDIR /app +RUN apt-get update && apt-get install -y --no-install-recommends \ + openssl \ + && rm -rf /var/lib/apt/lists/* + COPY --from=deps /app/node_modules ./node_modules COPY . . diff --git a/memento-note/app/(admin)/admin/ai-test/ai-tester.tsx b/memento-note/app/(admin)/admin/ai-test/ai-tester.tsx index 226c2bc..cd13a53 100644 --- a/memento-note/app/(admin)/admin/ai-test/ai-tester.tsx +++ b/memento-note/app/(admin)/admin/ai-test/ai-tester.tsx @@ -1,11 +1,10 @@ 'use client' import { Button } from '@/components/ui/button' -import { Card, CardContent } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { useState, useEffect } from 'react' import { toast } from 'sonner' -import { Loader2, CheckCircle2, XCircle, Clock, Zap, Info } from 'lucide-react' +import { Loader2, CheckCircle2, XCircle, Clock, Zap, Info, Shield, Brain, MessageSquare, Search } from 'lucide-react' import { useLanguage } from '@/lib/i18n' interface TestResult { @@ -65,14 +64,14 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' | 'chat' }) { if (data.success) { toast.success( - `✅ ${t('admin.aiTest.testSuccessToast', { type: type === 'tags' ? 'Tags' : 'Embeddings' })}`, + `${t('admin.aiTest.testSuccessToast', { type: type === 'tags' ? 'Tags' : type === 'chat' ? 'Chat' : 'Embeddings' })}`, { description: `Provider: ${data.provider} | Time: ${endTime - startTime}ms` } ) } else { toast.error( - `❌ ${t('admin.aiTest.testFailedToast', { type: type === 'tags' ? 'Tags' : 'Embeddings' })}`, + `${t('admin.aiTest.testFailedToast', { type: type === 'tags' ? 'Tags' : type === 'chat' ? 'Chat' : 'Embeddings' })}`, { description: data.error || 'Unknown error' } @@ -93,7 +92,7 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' | 'chat' }) { } const getProviderInfo = () => { - if (!config) return { provider: t('admin.aiTest.testing'), model: t('admin.aiTest.testing') } + if (!config) return { provider: '...', model: '...' } if (type === 'tags') { return { @@ -116,127 +115,164 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' | 'chat' }) { const providerInfo = getProviderInfo() return ( -
"{result.chatResponse}"
++ "{result.chatResponse}" +
{t('admin.aiTest.error')}
-{result.error}
- {result.details && ( -
- {JSON.stringify(result.details, null, 2)}
-
- {result.error}
+ + {result.details && ( +
+ {JSON.stringify(result.details, null, 2)}
+
+ - {t('admin.aiTest.testingType', { type: type === 'tags' ? 'tags generation' : 'embeddings' })} -
+- {t('admin.aiTest.description')} -
++ {t('admin.aiTest.description')} +
+Latence: Optimisée
+{t('admin.aiTest.tagsTestDescription')}
+{t('admin.aiTest.embeddingsTestDescription')}
+{t('admin.aiTest.chatTestDescription')}
++ {t('admin.aiTest.tipContent')} +
+💡 {t('admin.aiTest.tipTitle')}
-- {t('admin.aiTest.tipContent')} -
-{t('admin.security.description')}
+{t('admin.ai.description')}
+{t('admin.email.description')}
+{t('admin.tools.description')}
++ {t('mcpSettings.apiKeys.description')} +
++ {t('mcpSettings.apiKeys.description')} +
++ {t('mcpSettings.configInstructions.description')} +
++ {t('mcpSettings.configInstructions.description')} +
+