Spaces:
Build error
Build error
| import { useState, useEffect } from "react"; | |
| const BENCHMARK_STEPS = [ | |
| "configuration", | |
| "provider_check", | |
| "ingestion", | |
| "upload_ingest_to_hub", | |
| "summarization", | |
| "chunking", | |
| "single_shot_question_generation", | |
| ]; | |
| export const useBenchmarkLogs = (sessionId, isDefault, onComplete) => { | |
| const [generationLogs, setGenerationLogs] = useState([]); | |
| const [error, setError] = useState(null); | |
| const [currentPhase, setCurrentPhase] = useState("initializing"); | |
| const [completedSteps, setCompletedSteps] = useState([]); | |
| const [activeStep, setActiveStep] = useState(1); | |
| const [generationComplete, setGenerationComplete] = useState(false); | |
| const checkForErrors = (logs) => { | |
| // Check for document with insufficient information error | |
| const hasInsufficientInfoError = logs.some((log) => | |
| log.includes( | |
| "Failed to generate benchmark: The document does not contain enough information" | |
| ) | |
| ); | |
| if (hasInsufficientInfoError) { | |
| return { | |
| hasError: true, | |
| error: | |
| "Your document doesn't contain enough information to generate a benchmark. Please try with a more comprehensive document that includes richer content.", | |
| }; | |
| } | |
| // Check for rate limiting errors | |
| const hasRateLimitError = logs.some( | |
| (log) => | |
| log.includes("RATE_LIMIT_EXCEEDED") || | |
| log.includes("heavy load") || | |
| log.includes("rate limit") | |
| ); | |
| if (hasRateLimitError) { | |
| return { | |
| hasError: true, | |
| error: | |
| "The demo is under heavy load at the moment. Please try again later.", | |
| }; | |
| } | |
| // Check for model availability errors | |
| const hasModelError = logs.some( | |
| (log) => | |
| log.includes("Required models not available") || | |
| log.includes("Some required models are not available") | |
| ); | |
| if (hasModelError) { | |
| return { | |
| hasError: true, | |
| error: | |
| "Some required models are not available at the moment. Please try again later.", | |
| }; | |
| } | |
| // Check for configuration errors | |
| const hasConfigError = logs.some( | |
| (log) => | |
| log.includes("Error generating configuration") || | |
| log.includes("Configuration failed") | |
| ); | |
| if (hasConfigError) { | |
| return { | |
| hasError: true, | |
| error: | |
| "Failed to generate benchmark configuration. Please try again later.", | |
| }; | |
| } | |
| // Check for insufficient content errors | |
| const hasInsufficientContentError = logs.some( | |
| (log) => | |
| log.includes( | |
| "No valid questions produced in single_shot_question_generation" | |
| ) || log.includes("No parseable JSON found") | |
| ); | |
| if (hasInsufficientContentError) { | |
| return { | |
| hasError: true, | |
| error: | |
| "The document does not contain enough information to generate a meaningful benchmark. Please try with a more detailed document.", | |
| }; | |
| } | |
| return { hasError: false }; | |
| }; | |
| const updateSteps = (logs) => { | |
| const newCompletedSteps = []; | |
| logs.forEach((log) => { | |
| const match = log.match(/\[SUCCESS\] Stage completed: (\w+)/); | |
| if (match && match[1]) { | |
| const completedStep = match[1].trim(); | |
| if ( | |
| BENCHMARK_STEPS.includes(completedStep) && | |
| !newCompletedSteps.includes(completedStep) | |
| ) { | |
| newCompletedSteps.push(completedStep); | |
| } | |
| } | |
| }); | |
| let newActiveStep = activeStep; | |
| if (newCompletedSteps.length > 0) { | |
| const maxCompletedStepIndex = Math.max( | |
| ...newCompletedSteps.map((step) => BENCHMARK_STEPS.indexOf(step)) | |
| ); | |
| const calculatedStep = maxCompletedStepIndex + 1; | |
| if (calculatedStep > activeStep) { | |
| newActiveStep = calculatedStep; | |
| } | |
| if (newActiveStep >= BENCHMARK_STEPS.length) { | |
| newActiveStep = BENCHMARK_STEPS.length; | |
| } | |
| } else if (activeStep === 0) { | |
| newActiveStep = 1; | |
| } | |
| return { newCompletedSteps, newActiveStep }; | |
| }; | |
| const updatePhase = (logs) => { | |
| const recentLogs = logs.slice(-10); | |
| const isComplete = recentLogs.some((log) => | |
| log.includes("[SUCCESS] Benchmark process completed successfully") | |
| ); | |
| if (isComplete) { | |
| return "complete"; | |
| } else if ( | |
| recentLogs.some((log) => log.includes("Starting ingestion process")) | |
| ) { | |
| return "benchmarking"; | |
| } else if ( | |
| recentLogs.some((log) => log.includes("Generating base configuration")) | |
| ) { | |
| return "configuring"; | |
| } | |
| return currentPhase; | |
| }; | |
| useEffect(() => { | |
| if (generationLogs.length === 0) return; | |
| const errorCheck = checkForErrors(generationLogs); | |
| if (errorCheck.hasError) { | |
| setError(errorCheck.error); | |
| setGenerationComplete(true); | |
| if (onComplete) { | |
| onComplete({ | |
| success: false, | |
| error: errorCheck.error, | |
| sessionId, | |
| }); | |
| } | |
| return; | |
| } | |
| const { newCompletedSteps, newActiveStep } = updateSteps(generationLogs); | |
| const newPhase = updatePhase(generationLogs); | |
| if (JSON.stringify(newCompletedSteps) !== JSON.stringify(completedSteps)) { | |
| setCompletedSteps(newCompletedSteps); | |
| } | |
| if (newActiveStep !== activeStep) { | |
| setActiveStep(newActiveStep); | |
| } | |
| if (newPhase !== currentPhase) { | |
| setCurrentPhase(newPhase); | |
| } | |
| // Vérifier si le benchmark est réellement terminé sans erreur | |
| const recentLogs = generationLogs.slice(-10); | |
| const isComplete = recentLogs.some((log) => | |
| log.includes("[SUCCESS] Benchmark process completed successfully") | |
| ); | |
| if (isComplete) { | |
| setGenerationComplete(true); | |
| if (onComplete) { | |
| onComplete({ | |
| success: true, | |
| sessionId, | |
| logs: generationLogs, | |
| }); | |
| } | |
| } | |
| }, [generationLogs, sessionId, onComplete]); | |
| return { | |
| generationLogs, | |
| setGenerationLogs, | |
| error, | |
| setError, | |
| currentPhase, | |
| completedSteps, | |
| activeStep, | |
| generationComplete, | |
| setGenerationComplete, | |
| }; | |
| }; | |