'use client' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { useState, useEffect } from 'react' import { toast } from 'sonner' import { Loader2, CheckCircle2, XCircle, Clock, Zap, Info, Shield, Brain, MessageSquare, Search } from 'lucide-react' import { useLanguage } from '@/lib/i18n' interface TestResult { success: boolean provider?: string model?: string responseTime?: number tags?: Array<{ tag: string; confidence: number }> embeddingLength?: number firstValues?: number[] chatResponse?: string error?: string details?: any } export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' | 'chat' }) { const { t } = useLanguage() const [isLoading, setIsLoading] = useState(false) const [result, setResult] = useState(null) const [config, setConfig] = useState(null) useEffect(() => { fetchConfig() }, []) const fetchConfig = async () => { try { const response = await fetch('/api/ai/config') const data = await response.json() setConfig(data) if (data.previousTest) { setResult(data.previousTest[type] || null) } } catch (error) { console.error('Failed to fetch config:', error) } } const runTest = async () => { setIsLoading(true) const startTime = Date.now() try { const response = await fetch(`/api/ai/test-${type}`, { method: 'POST', headers: { 'Content-Type': 'application/json' } }) const endTime = Date.now() const data = await response.json() setResult({ ...data, responseTime: endTime - startTime }) if (data.success) { toast.success( `${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' : type === 'chat' ? 'Chat' : 'Embeddings' })}`, { description: data.error || 'Unknown error' } ) } } catch (error: any) { const endTime = Date.now() const errorResult = { success: false, error: error.message || 'Network error', responseTime: endTime - startTime } setResult(errorResult) toast.error(t('admin.aiTest.testError', { error: error.message })) } finally { setIsLoading(false) } } const getProviderInfo = () => { if (!config) return { provider: '...', model: '...' } if (type === 'tags') { return { provider: config.AI_PROVIDER_TAGS || 'ollama', model: config.AI_MODEL_TAGS || 'granite4:latest' } } else if (type === 'chat') { return { provider: config.AI_PROVIDER_CHAT || config.AI_PROVIDER_TAGS || 'ollama', model: config.AI_MODEL_CHAT || 'granite4:latest' } } else { return { provider: config.AI_PROVIDER_EMBEDDING || 'ollama', model: config.AI_MODEL_EMBEDDING || 'embeddinggemma:latest' } } } const providerInfo = getProviderInfo() return (
{/* Current Config Summary */}
{type === 'tags' ? : type === 'embeddings' ? : } {t('admin.aiTest.provider')}
{t('admin.aiTest.provider')} {providerInfo.provider}
{t('admin.aiTest.model')} {providerInfo.model}
{/* Run Test Action */} {/* Result Display */} {result && (
{/* Status Header */}
{result.success ? (
) : (
)} {result.success ? t('admin.aiTest.testPassed') : t('admin.aiTest.testFailed')}
{result.responseTime && (
{result.responseTime}ms
)}
{/* Response Content - Tags */} {type === 'tags' && result.success && result.tags && (
{t('admin.aiTest.generatedTags')}
{result.tags.map((tag, idx) => (
{tag.tag} {Math.round(tag.confidence * 100)}%
))}
)} {/* Response Content - Chat */} {type === 'chat' && result.success && result.chatResponse && (
Modèle Réponse

"{result.chatResponse}"

)} {/* Response Content - Embeddings */} {type === 'embeddings' && result.success && result.embeddingLength && (
{result.embeddingLength}
{t('admin.aiTest.vectorDimensions')}
Active Vector
{result.firstValues && result.firstValues.length > 0 && (
{t('admin.aiTest.first5Values')}
{result.firstValues.slice(0, 5).map((v, i) => ( {v.toFixed(4)} ))}
)}
)} {/* Error Details */} {!result.success && result.error && (
Détails de l'erreur

{result.error}

{result.details && (
{t('admin.aiTest.technicalDetails')}
                          {JSON.stringify(result.details, null, 2)}
                        
)}
)}
)}
) }