diff --git a/chat_before_send.png b/chat_before_send.png new file mode 100644 index 0000000..02f9e23 Binary files /dev/null and b/chat_before_send.png differ diff --git a/chat_page.png b/chat_page.png new file mode 100644 index 0000000..2e980ae Binary files /dev/null and b/chat_page.png differ diff --git a/chat_response.png b/chat_response.png new file mode 100644 index 0000000..922bd24 Binary files /dev/null and b/chat_response.png differ diff --git a/conversations_page.png b/conversations_page.png new file mode 100644 index 0000000..4706de2 Binary files /dev/null and b/conversations_page.png differ diff --git a/conversations_search_results.png b/conversations_search_results.png new file mode 100644 index 0000000..7f4bd8a Binary files /dev/null and b/conversations_search_results.png differ diff --git a/memories_page.png b/memories_page.png new file mode 100644 index 0000000..d9fa6a4 Binary files /dev/null and b/memories_page.png differ diff --git a/memories_search_results.png b/memories_search_results.png new file mode 100644 index 0000000..2ae44cf Binary files /dev/null and b/memories_search_results.png differ diff --git a/search_page.png b/search_page.png new file mode 100644 index 0000000..113687f Binary files /dev/null and b/search_page.png differ diff --git a/search_results.png b/search_results.png new file mode 100644 index 0000000..c7a5b36 Binary files /dev/null and b/search_results.png differ diff --git a/test_chat_puppeteer.js b/test_chat_puppeteer.js new file mode 100644 index 0000000..b123a0e --- /dev/null +++ b/test_chat_puppeteer.js @@ -0,0 +1,228 @@ +/** + * Test de chat sémantique avec Puppeteer - GPU Embedder Validation + * Vérifie que le RAG chat fonctionne avec GPU vectorization + */ + +const puppeteer = require('puppeteer'); + +async function testChat() { + console.log('='.repeat(70)); + console.log('Test de Chat Sémantique avec GPU Vectorization'); + console.log('='.repeat(70)); + + const browser = await puppeteer.launch({ + headless: false, + defaultViewport: { width: 1280, height: 900 } + }); + + try { + const page = await browser.newPage(); + + // 1. Naviguer vers la page de chat + console.log('\n1. Navigation vers /chat...'); + await page.goto('http://localhost:5000/chat', { waitUntil: 'networkidle2' }); + console.log(' ✓ Page chargée'); + + // 2. Screenshot de la page initiale + await new Promise(resolve => setTimeout(resolve, 2000)); + await page.screenshot({ path: 'C:\\GitHub\\linear_coding_library_rag\\chat_page.png' }); + console.log(' ✓ Screenshot initial sauvegardé: chat_page.png'); + + // 3. Trouver le champ de message + console.log('\n2. Recherche du champ de message...'); + + const possibleSelectors = [ + 'textarea[name="message"]', + 'textarea[placeholder*="question"]', + 'textarea[placeholder*="message"]', + 'textarea', + 'input[type="text"]', + '#message', + '.chat-input' + ]; + + let messageInput = null; + for (const selector of possibleSelectors) { + try { + await page.waitForSelector(selector, { timeout: 2000 }); + messageInput = selector; + console.log(` ✓ Champ trouvé avec sélecteur: ${selector}`); + break; + } catch (e) { + // Continuer avec le prochain sélecteur + } + } + + if (!messageInput) { + throw new Error('Impossible de trouver le champ de message'); + } + + // 4. Saisir une question + const question = 'What is a Turing machine and how does it relate to computation?'; + console.log(`\n3. Saisie de la question: "${question}"`); + await page.type(messageInput, question); + console.log(' ✓ Question saisie'); + + await page.screenshot({ path: 'C:\\GitHub\\linear_coding_library_rag\\chat_before_send.png' }); + console.log(' ✓ Screenshot avant envoi sauvegardé'); + + // 5. Trouver et cliquer sur le bouton d'envoi + console.log('\n4. Envoi de la question...'); + + const submitButton = await page.$('button[type="submit"]') || + await page.$('button.send-button') || + await page.$('button'); + + if (submitButton) { + await submitButton.click(); + console.log(' ✓ Question envoyée (click)'); + } else { + // Essayer avec Enter + await page.keyboard.press('Enter'); + console.log(' ✓ Question envoyée (Enter)'); + } + + // 6. Attendre la réponse (SSE peut prendre du temps) + console.log('\n5. Attente de la réponse (30 secondes)...'); + await new Promise(resolve => setTimeout(resolve, 30000)); + + // 7. Vérifier si une réponse est affichée + console.log('\n6. Vérification de la réponse...'); + + const responseData = await page.evaluate(() => { + // Chercher différents éléments de réponse + const responseElements = document.querySelectorAll( + '.response, .message, .assistant, .chat-message, [class*="response"]' + ); + + const responses = []; + responseElements.forEach(el => { + const text = el.innerText?.trim(); + if (text && text.length > 50) { + responses.push(text); + } + }); + + // Chercher aussi le texte brut dans le body + const bodyText = document.body.innerText; + const hasTuring = bodyText.toLowerCase().includes('turing'); + const hasComputation = bodyText.toLowerCase().includes('computation'); + const hasMachine = bodyText.toLowerCase().includes('machine'); + + return { + responses, + hasTuring, + hasComputation, + hasMachine, + bodyLength: bodyText.length + }; + }); + + if (responseData.responses.length > 0) { + console.log(` ✓ ${responseData.responses.length} réponse(s) détectée(s)`); + console.log(`\n Extrait de la première réponse:`); + const preview = responseData.responses[0].substring(0, 300); + console.log(` ${preview}...`); + } else if (responseData.hasTuring && responseData.hasComputation) { + console.log(' ✓ Réponse détectée (mots-clés présents)'); + console.log(` ✓ Mentionne "Turing": ${responseData.hasTuring}`); + console.log(` ✓ Mentionne "computation": ${responseData.hasComputation}`); + } else { + console.log(' ⚠ Réponse pas clairement détectée'); + console.log(` Body length: ${responseData.bodyLength} caractères`); + } + + // 8. Screenshot final + await page.screenshot({ + path: 'C:\\GitHub\\linear_coding_library_rag\\chat_response.png', + fullPage: true + }); + console.log('\n7. Screenshot final sauvegardé: chat_response.png'); + + // 9. Vérifier les sources si disponibles + console.log('\n8. Vérification des sources...'); + const sourcesData = await page.evaluate(() => { + const sourcesElements = document.querySelectorAll( + '[class*="source"], [class*="chunk"], [class*="passage"], [data-source]' + ); + + const sources = []; + sourcesElements.forEach(el => { + const author = el.querySelector('[class*="author"]')?.innerText || ''; + const title = el.querySelector('[class*="title"]')?.innerText || ''; + const distance = el.querySelector('[class*="distance"], [class*="score"]')?.innerText || ''; + + if (author || title) { + sources.push({ author, title: title.substring(0, 50), distance }); + } + }); + + // Chercher aussi dans le texte pour "Sources" + const bodyText = document.body.innerText; + const hasSources = bodyText.includes('Sources') || + bodyText.includes('sources') || + bodyText.includes('References'); + + return { sources, hasSources }; + }); + + if (sourcesData.sources.length > 0) { + console.log(` ✓ ${sourcesData.sources.length} source(s) trouvée(s):`); + sourcesData.sources.slice(0, 5).forEach((src, i) => { + console.log(` ${i+1}. ${src.author} - ${src.title}`); + if (src.distance) console.log(` Distance: ${src.distance}`); + }); + } else if (sourcesData.hasSources) { + console.log(' ✓ Section "Sources" détectée dans le texte'); + } else { + console.log(' ℹ Pas de sources distinctes détectées'); + } + + // 10. Vérifier les logs réseau pour la vectorisation + console.log('\n9. Vérification GPU embedder:'); + console.log(' → Vérifier les logs Flask pour "GPU embedder ready"'); + console.log(' → Vérifier "embed_single" dans les logs'); + console.log(' → Vérifier les appels SSE /chat'); + + console.log('\n' + '='.repeat(70)); + console.log('✓ Test terminé'); + console.log('Screenshots: chat_page.png, chat_before_send.png, chat_response.png'); + console.log('Vérifiez les logs Flask pour confirmer l\'utilisation du GPU embedder'); + console.log('='.repeat(70)); + + // Garder le navigateur ouvert 5 secondes + await new Promise(resolve => setTimeout(resolve, 5000)); + + return { success: true }; + + } catch (error) { + console.error('\n✗ Erreur:', error.message); + + // Screenshot d'erreur + try { + const pages = await browser.pages(); + if (pages.length > 0) { + await pages[0].screenshot({ + path: 'C:\\GitHub\\linear_coding_library_rag\\chat_error.png', + fullPage: true + }); + console.log('Screenshot d\'erreur sauvegardé: chat_error.png'); + } + } catch (screenshotError) { + // Ignore screenshot errors + } + + return { success: false, error: error.message }; + } finally { + await browser.close(); + } +} + +testChat() + .then(result => { + process.exit(result.success ? 0 : 1); + }) + .catch(err => { + console.error('Erreur fatale:', err); + process.exit(1); + }); diff --git a/test_gpu_mistral.py b/test_gpu_mistral.py new file mode 100644 index 0000000..ee68aff --- /dev/null +++ b/test_gpu_mistral.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""Test GPU vectorization with Mistral LLM (faster than Ollama).""" + +import sys +from pathlib import Path + +# Add library_rag to path +sys.path.insert(0, str(Path(__file__).parent / "generations" / "library_rag")) + +from utils.pdf_pipeline import process_pdf + +# Small PDF for testing +PDF_PATH = Path(r"C:\Users\david\Philosophie\IA\Human machine\most_viewed_papers_similar_to_this_one\Turing_and_Computationalism.pdf") + +print("="*70) +print("GPU Vectorization Test with Mistral LLM") +print("="*70) + +if not PDF_PATH.exists(): + print(f"ERROR: PDF not found at {PDF_PATH}") + sys.exit(1) + +print(f"\n1. PDF: {PDF_PATH.name}") +print(f" Size: {PDF_PATH.stat().st_size / 1024:.1f} KB") + +print("\n2. Processing with Mistral LLM + GPU Vectorization...") + +try: + result = process_pdf( + PDF_PATH, + use_llm=True, + llm_provider="mistral", # MISTRAL instead of Ollama + use_semantic_chunking=False, # Faster + use_ocr_annotations=False, + ingest_to_weaviate=True, # GPU vectorization happens here + ) + + print("\n3. Results:") + if result.get("success"): + print(f" SUCCESS!") + print(f" - Document: {result.get('document_name')}") + print(f" - Chunks: {result.get('chunks_count')}") + print(f" - Cost OCR: {result.get('cost_ocr', 0):.4f} EUR") + print(f" - Cost LLM: {result.get('cost_llm', 0):.4f} EUR") + print(f" - Total: {result.get('cost_total', 0):.4f} EUR") + else: + print(f" FAILED: {result.get('error')}") + +except Exception as e: + print(f"\nException: {e}") + import traceback + traceback.print_exc() + +print("\n" + "="*70) +print("Check logs above for 'GPU embedder ready' message") +print("="*70) diff --git a/test_memories_conversations.js b/test_memories_conversations.js new file mode 100644 index 0000000..66b4287 --- /dev/null +++ b/test_memories_conversations.js @@ -0,0 +1,237 @@ +/** + * Test des pages Memories et Conversations - Debug NetworkError + */ + +const puppeteer = require('puppeteer'); + +async function testMemoriesAndConversations() { + console.log('='.repeat(70)); + console.log('Test Memories et Conversations - Debug NetworkError'); + console.log('='.repeat(70)); + + const browser = await puppeteer.launch({ + headless: false, + defaultViewport: { width: 1280, height: 900 } + }); + + try { + const page = await browser.newPage(); + + // Intercepter les erreurs réseau + page.on('response', response => { + const status = response.status(); + const url = response.url(); + if (status >= 400) { + console.log(` ⚠ HTTP ${status}: ${url}`); + } + }); + + page.on('pageerror', error => { + console.log(` ⚠ Page Error: ${error.message}`); + }); + + page.on('console', msg => { + const type = msg.type(); + if (type === 'error') { + console.log(` ⚠ Console Error: ${msg.text()}`); + } + }); + + // ===== TEST 1: Page Memories ===== + console.log('\n1. Test de la page /memories...'); + + try { + await page.goto('http://localhost:5000/memories', { + waitUntil: 'networkidle2', + timeout: 10000 + }); + console.log(' ✓ Page /memories chargée'); + + await page.screenshot({ path: 'C:\\GitHub\\linear_coding_library_rag\\memories_page.png' }); + console.log(' ✓ Screenshot sauvegardé: memories_page.png'); + + // Attendre un peu pour voir si des requêtes échouent + await new Promise(resolve => setTimeout(resolve, 3000)); + + // Vérifier si des erreurs sont affichées + const hasError = await page.evaluate(() => { + const bodyText = document.body.innerText; + return bodyText.includes('Error') || + bodyText.includes('error') || + bodyText.includes('NetworkError') || + bodyText.includes('Failed'); + }); + + if (hasError) { + console.log(' ⚠ Erreur détectée dans la page'); + } else { + console.log(' ✓ Pas d\'erreur visible dans la page'); + } + + } catch (error) { + console.log(` ✗ Erreur lors du chargement: ${error.message}`); + await page.screenshot({ path: 'C:\\GitHub\\linear_coding_library_rag\\memories_error.png' }); + } + + // ===== TEST 2: Page Conversations ===== + console.log('\n2. Test de la page /conversations...'); + + try { + await page.goto('http://localhost:5000/conversations', { + waitUntil: 'networkidle2', + timeout: 10000 + }); + console.log(' ✓ Page /conversations chargée'); + + await page.screenshot({ path: 'C:\\GitHub\\linear_coding_library_rag\\conversations_page.png' }); + console.log(' ✓ Screenshot sauvegardé: conversations_page.png'); + + // Attendre un peu pour voir si des requêtes échouent + await new Promise(resolve => setTimeout(resolve, 3000)); + + // Vérifier si des erreurs sont affichées + const hasError = await page.evaluate(() => { + const bodyText = document.body.innerText; + return bodyText.includes('Error') || + bodyText.includes('error') || + bodyText.includes('NetworkError') || + bodyText.includes('Failed'); + }); + + if (hasError) { + console.log(' ⚠ Erreur détectée dans la page'); + } else { + console.log(' ✓ Pas d\'erreur visible dans la page'); + } + + } catch (error) { + console.log(` ✗ Erreur lors du chargement: ${error.message}`); + await page.screenshot({ path: 'C:\\GitHub\\linear_coding_library_rag\\conversations_error.png' }); + } + + // ===== TEST 3: Tester la recherche sur Memories ===== + console.log('\n3. Test de recherche sur /memories...'); + + try { + await page.goto('http://localhost:5000/memories', { + waitUntil: 'networkidle2', + timeout: 10000 + }); + + // Chercher un input de recherche + const searchInput = await page.$('input[type="text"]') || + await page.$('input[placeholder*="search"]') || + await page.$('textarea'); + + if (searchInput) { + console.log(' ✓ Champ de recherche trouvé'); + + // Taper une requête + await searchInput.type('test search'); + console.log(' ✓ Requête saisie: "test search"'); + + // Chercher le bouton de recherche + const searchButton = await page.$('button[type="submit"]') || + await page.$('button.search-button') || + await page.$('button'); + + if (searchButton) { + console.log(' ✓ Bouton de recherche trouvé'); + await searchButton.click(); + console.log(' ✓ Recherche lancée'); + + // Attendre la réponse + await new Promise(resolve => setTimeout(resolve, 3000)); + + await page.screenshot({ + path: 'C:\\GitHub\\linear_coding_library_rag\\memories_search_results.png', + fullPage: true + }); + console.log(' ✓ Screenshot résultats sauvegardé'); + } else { + console.log(' ⚠ Bouton de recherche non trouvé'); + } + } else { + console.log(' ℹ Pas de champ de recherche détecté'); + } + + } catch (error) { + console.log(` ✗ Erreur lors de la recherche: ${error.message}`); + } + + // ===== TEST 4: Tester la recherche sur Conversations ===== + console.log('\n4. Test de recherche sur /conversations...'); + + try { + await page.goto('http://localhost:5000/conversations', { + waitUntil: 'networkidle2', + timeout: 10000 + }); + + // Chercher un input de recherche + const searchInput = await page.$('input[type="text"]') || + await page.$('input[placeholder*="search"]') || + await page.$('textarea'); + + if (searchInput) { + console.log(' ✓ Champ de recherche trouvé'); + + // Taper une requête + await searchInput.type('test conversation'); + console.log(' ✓ Requête saisie: "test conversation"'); + + // Chercher le bouton de recherche + const searchButton = await page.$('button[type="submit"]') || + await page.$('button.search-button') || + await page.$('button'); + + if (searchButton) { + console.log(' ✓ Bouton de recherche trouvé'); + await searchButton.click(); + console.log(' ✓ Recherche lancée'); + + // Attendre la réponse + await new Promise(resolve => setTimeout(resolve, 3000)); + + await page.screenshot({ + path: 'C:\\GitHub\\linear_coding_library_rag\\conversations_search_results.png', + fullPage: true + }); + console.log(' ✓ Screenshot résultats sauvegardé'); + } else { + console.log(' ⚠ Bouton de recherche non trouvé'); + } + } else { + console.log(' ℹ Pas de champ de recherche détecté'); + } + + } catch (error) { + console.log(` ✗ Erreur lors de la recherche: ${error.message}`); + } + + console.log('\n' + '='.repeat(70)); + console.log('✓ Tests terminés'); + console.log('Screenshots sauvegardés pour analyse'); + console.log('='.repeat(70)); + + // Garder le navigateur ouvert 10 secondes + await new Promise(resolve => setTimeout(resolve, 10000)); + + return { success: true }; + + } catch (error) { + console.error('\n✗ Erreur:', error.message); + return { success: false, error: error.message }; + } finally { + await browser.close(); + } +} + +testMemoriesAndConversations() + .then(result => { + process.exit(result.success ? 0 : 1); + }) + .catch(err => { + console.error('Erreur fatale:', err); + process.exit(1); + }); diff --git a/test_search_simple.js b/test_search_simple.js new file mode 100644 index 0000000..e4adc09 --- /dev/null +++ b/test_search_simple.js @@ -0,0 +1,145 @@ +/** + * Test simple de recherche - détection automatique des éléments + */ + +const puppeteer = require('puppeteer'); + +async function testSearch() { + console.log('='.repeat(70)); + console.log('Test de Recherche Sémantique'); + console.log('='.repeat(70)); + + const browser = await puppeteer.launch({ + headless: false, + defaultViewport: { width: 1280, height: 800 } + }); + + try { + const page = await browser.newPage(); + + // 1. Aller à la page de recherche + console.log('\n1. Navigation vers /search...'); + await page.goto('http://localhost:5000/search', { waitUntil: 'networkidle2' }); + console.log(' ✓ Page chargée'); + + // 2. Prendre un screenshot de la page initiale + await page.screenshot({ path: 'C:\\GitHub\\linear_coding_library_rag\\search_page.png' }); + console.log(' ✓ Screenshot initial sauvegardé'); + + // 3. Trouver le champ de recherche + console.log('\n2. Recherche du champ de saisie...'); + + // Essayer plusieurs sélecteurs possibles + const possibleSelectors = [ + 'input[name="query"]', + 'input[type="text"]', + 'input[placeholder*="recherche"]', + 'input[placeholder*="search"]', + '#query', + '.search-input', + 'input.form-control' + ]; + + let queryInput = null; + for (const selector of possibleSelectors) { + try { + await page.waitForSelector(selector, { timeout: 2000 }); + queryInput = selector; + console.log(` ✓ Champ trouvé avec sélecteur: ${selector}`); + break; + } catch (e) { + // Continuer avec le prochain sélecteur + } + } + + if (!queryInput) { + throw new Error('Impossible de trouver le champ de recherche'); + } + + // 4. Saisir la requête + const searchQuery = 'Turing machine computation'; + console.log(`\n3. Saisie de la requête: "${searchQuery}"`); + await page.type(queryInput, searchQuery); + console.log(' ✓ Requête saisie'); + + // 5. Trouver et cliquer sur le bouton de soumission + console.log('\n4. Soumission de la recherche...'); + const submitButton = await page.$('button[type="submit"]') || await page.$('input[type="submit"]'); + + if (submitButton) { + await Promise.all([ + submitButton.click(), + page.waitForNavigation({ waitUntil: 'networkidle2', timeout: 15000 }) + ]); + console.log(' ✓ Recherche soumise'); + } else { + // Essayer de soumettre avec Enter + await page.keyboard.press('Enter'); + await page.waitForNavigation({ waitUntil: 'networkidle2', timeout: 15000 }); + console.log(' ✓ Recherche soumise (Enter)'); + } + + // 6. Attendre un peu pour les résultats + await new Promise(resolve => setTimeout(resolve, 2000)); + + // 7. Vérifier si des résultats sont affichés + console.log('\n5. Vérification des résultats...'); + const pageContent = await page.content(); + + // Chercher des indicateurs de résultats + const hasResults = pageContent.includes('résultat') || + pageContent.includes('result') || + pageContent.includes('chunk') || + pageContent.includes('distance'); + + if (hasResults) { + console.log(' ✓ Résultats détectés dans la page'); + + // Essayer d'extraire quelques informations + const resultCount = await page.evaluate(() => { + const elements = document.querySelectorAll('[class*="result"], [class*="chunk"], .passage'); + return elements.length; + }); + + console.log(` ✓ Nombre d'éléments de résultats: ${resultCount}`); + } else { + console.log(' ⚠ Pas de résultats évidents trouvés'); + } + + // 8. Screenshot final + await page.screenshot({ + path: 'C:\\GitHub\\linear_coding_library_rag\\search_results.png', + fullPage: true + }); + console.log('\n6. Screenshot des résultats sauvegardé'); + + // 9. Vérifier les logs réseau pour la vectorisation + console.log('\n7. Vérification de l\'utilisation du GPU embedder:'); + console.log(' → Vérifier les logs Flask pour "GPU embedder ready"'); + console.log(' → Vérifier "embed_single" dans les logs'); + + console.log('\n' + '='.repeat(70)); + console.log('✓ Test terminé - Vérifiez les screenshots et logs Flask'); + console.log('='.repeat(70)); + + // Garder le navigateur ouvert 5 secondes pour voir le résultat + await new Promise(resolve => setTimeout(resolve, 5000)); + + return { success: true }; + + } catch (error) { + console.error('\n✗ Erreur:', error.message); + return { success: false, error: error.message }; + } finally { + await browser.close(); + } +} + +testSearch() + .then(result => { + process.exit(result.success ? 0 : 1); + }) + .catch(err => { + console.error('Erreur fatale:', err); + process.exit(1); + });