#!/bin/bash # Script de test complet - API Cloud + FAISS + Gemini # Usage: ./test_complete_api.sh set -e # Configuration API_URL="https://k2mar-docuresume-backend.hf.space" EMAIL="visiteur@gmail.com" PASSWORD="123456789" # Couleurs RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' NC='\033[0m' # No Color echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ Tests API DocuResume - FAISS + Gemini ║${NC}" echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}" # Test 1: Health check echo -e "\n${BLUE}[1/8] Test Health Check...${NC}" HEALTH=$(curl -s "$API_URL/") if echo "$HEALTH" | jq -e '.status == "healthy"' > /dev/null 2>&1; then echo -e "${GREEN}✓ Backend opérationnel${NC}" else echo -e "${RED}✗ Backend inaccessible${NC}" exit 1 fi # Test 2: Login echo -e "\n${BLUE}[2/8] Test Login...${NC}" LOGIN=$(curl -s -X POST "$API_URL/login" \ -H "Content-Type: application/json" \ -d "{\"email\":\"$EMAIL\",\"password\":\"$PASSWORD\"}") USER_ID=$(echo "$LOGIN" | jq -r '.user_id') if [ "$USER_ID" != "null" ] && [ -n "$USER_ID" ]; then echo -e "${GREEN}✓ Login réussi - User ID: $USER_ID${NC}" else echo -e "${RED}✗ Login échoué${NC}" echo "$LOGIN" exit 1 fi # Test 3: Liste des documents echo -e "\n${BLUE}[3/8] Test Liste Documents...${NC}" DOCS=$(curl -s "$API_URL/documents/$USER_ID") DOC_COUNT=$(echo "$DOCS" | jq 'length') DOC_ID=$(echo "$DOCS" | jq -r '.[0].id') if [ "$DOC_COUNT" -gt 0 ]; then echo -e "${GREEN}✓ $DOC_COUNT documents trouvés${NC}" echo -e " Premier document: ${YELLOW}$DOC_ID${NC}" else echo -e "${RED}✗ Aucun document trouvé${NC}" exit 1 fi # Test 4: Recherche sémantique (single document) echo -e "\n${BLUE}[4/8] Test Recherche Sémantique (FAISS)...${NC}" SEMANTIC=$(curl -s -X POST "$API_URL/search/semantic?document_id=$DOC_ID&query=invoice%20date&k=3") if echo "$SEMANTIC" | jq -e '.results' > /dev/null 2>&1; then RESULT_COUNT=$(echo "$SEMANTIC" | jq '.count') echo -e "${GREEN}✓ FAISS opérationnel - $RESULT_COUNT résultats${NC}" # Afficher le meilleur résultat BEST_SCORE=$(echo "$SEMANTIC" | jq -r '.results[0].score') BEST_TEXT=$(echo "$SEMANTIC" | jq -r '.results[0].text' | head -c 100) echo -e " Meilleur score: ${YELLOW}$BEST_SCORE${NC}" echo -e " Texte: $BEST_TEXT..." else echo -e "${RED}✗ FAISS non disponible${NC}" echo "$SEMANTIC" fi # Test 5: Recherche sémantique multi-documents echo -e "\n${BLUE}[5/8] Test Recherche Multi-Documents...${NC}" MULTI_SEARCH=$(curl -s -X POST "$API_URL/search/semantic/multi?user_id=$USER_ID&query=data%20science&k=5") if echo "$MULTI_SEARCH" | jq -e '.results' > /dev/null 2>&1; then SEARCHED_DOCS=$(echo "$MULTI_SEARCH" | jq '.searched_documents') RESULTS=$(echo "$MULTI_SEARCH" | jq '.count') echo -e "${GREEN}✓ Recherche multi-docs réussie${NC}" echo -e " Documents scannés: ${YELLOW}$SEARCHED_DOCS${NC}" echo -e " Résultats trouvés: ${YELLOW}$RESULTS${NC}" else echo -e "${RED}✗ Erreur recherche multi-documents${NC}" echo "$MULTI_SEARCH" fi # Test 6: Résumé avec Gemini (si quota disponible) echo -e "\n${BLUE}[6/8] Test Résumé Gemini...${NC}" SUMMARY=$(curl -s -X POST "$API_URL/generate/summary/gemini?document_id=$DOC_ID&max_length=100") if echo "$SUMMARY" | jq -e '.summary' > /dev/null 2>&1; then echo -e "${GREEN}✓ Résumé généré avec succès${NC}" SUMMARY_TEXT=$(echo "$SUMMARY" | jq -r '.summary') SUMMARY_LENGTH=$(echo "$SUMMARY" | jq -r '.length') echo -e " Longueur: ${YELLOW}$SUMMARY_LENGTH mots${NC}" echo -e " Résumé: ${SUMMARY_TEXT:0:150}..." elif echo "$SUMMARY" | jq -e '.detail' | grep -q "429\|RESOURCE_EXHAUSTED\|quota"; then echo -e "${YELLOW}⚠ Quota Gemini dépassé - Réessayez dans 60s${NC}" echo -e " (Test non bloquant - Gemini fonctionne mais quota atteint)" else echo -e "${RED}✗ Erreur résumé Gemini${NC}" echo "$SUMMARY" fi # Test 7: Question/Réponse avec Gemini echo -e "\n${BLUE}[7/8] Test Question/Réponse Gemini...${NC}" QUERY=$(curl -s -X POST "$API_URL/query/gemini?document_id=$DOC_ID&question=Quel%20est%20le%20montant%20total%3F&use_context=true") if echo "$QUERY" | jq -e '.answer' > /dev/null 2>&1; then echo -e "${GREEN}✓ Réponse générée avec succès${NC}" ANSWER=$(echo "$QUERY" | jq -r '.answer') CONTEXT_USED=$(echo "$QUERY" | jq -r '.context_used') echo -e " Contexte FAISS: ${YELLOW}$CONTEXT_USED${NC}" echo -e " Réponse: ${ANSWER:0:200}..." elif echo "$QUERY" | jq -e '.detail' | grep -q "429\|RESOURCE_EXHAUSTED\|quota"; then echo -e "${YELLOW}⚠ Quota Gemini dépassé - Réessayez dans 60s${NC}" else echo -e "${RED}✗ Erreur question/réponse Gemini${NC}" echo "$QUERY" fi # Test 8: Statistiques globales echo -e "\n${BLUE}[8/8] Test Statistiques...${NC}" STATS=$(curl -s "$API_URL/stats/global") if echo "$STATS" | jq -e '.total_users' > /dev/null 2>&1; then USERS=$(echo "$STATS" | jq '.total_users') DOCUMENTS=$(echo "$STATS" | jq '.total_documents') QUERIES=$(echo "$STATS" | jq '.total_queries') echo -e "${GREEN}✓ Statistiques récupérées${NC}" echo -e " Utilisateurs: ${YELLOW}$USERS${NC}" echo -e " Documents: ${YELLOW}$DOCUMENTS${NC}" echo -e " Requêtes: ${YELLOW}$QUERIES${NC}" else echo -e "${RED}✗ Erreur statistiques${NC}" echo "$STATS" fi # Résumé final echo -e "\n${BLUE}╔════════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ Résumé des tests ║${NC}" echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}" echo -e "\n${GREEN}✅ API Backend${NC}" echo -e " ├─ Health check: ✓" echo -e " ├─ Authentification: ✓" echo -e " └─ Documents: ✓" echo -e "\n${GREEN}✅ FAISS (Recherche Sémantique)${NC}" echo -e " ├─ Single document: ✓" echo -e " └─ Multi-documents: ✓" echo -e "\n${YELLOW}⚠ Gemini API${NC}" echo -e " ├─ Configuration: ✓" echo -e " ├─ Résumés: ${YELLOW}Quota limité (15 req/min)${NC}" echo -e " └─ Q&A: ${YELLOW}Quota limité (15 req/min)${NC}" echo -e "\n${BLUE}📝 Notes:${NC}" echo -e " • FAISS est bien activé sur HuggingFace Spaces" echo -e " • Gemini fonctionne mais nécessite gestion de quota" echo -e " • Pour production: créer votre propre clé API Gemini" echo -e " • Documentation: voir GEMINI_API_ENDPOINTS.md" echo -e "\n${GREEN}🎉 Tests terminés avec succès!${NC}\n"