|
import { useState, useRef, useEffect } from "react"; |
|
import API_CONFIG from "../../../config/api"; |
|
|
|
|
|
const EVALUATION_STEPS = [ |
|
"initializing", |
|
"finding_available_model_providers", |
|
"starting_evaluation_process", |
|
"evaluating_models", |
|
"storing_evaluation_results", |
|
]; |
|
|
|
|
|
const STEP_LABELS = { |
|
initializing: "Initializing evaluation environment", |
|
finding_available_model_providers: "Finding available model providers", |
|
starting_evaluation_process: "Starting evaluation process", |
|
evaluating_models: "Evaluating models", |
|
storing_evaluation_results: "Storing evaluation results", |
|
}; |
|
|
|
|
|
const ERROR_MESSAGES = [ |
|
"heavy load", |
|
"try again later", |
|
"rate limit", |
|
"RATE_LIMIT_EXCEEDED", |
|
]; |
|
|
|
export const useEvaluation = (sessionId, onComplete) => { |
|
const [error, setError] = useState(null); |
|
const [evaluationComplete, setEvaluationComplete] = useState(false); |
|
const [currentStep, setCurrentStep] = useState(0); |
|
const [evaluationStarted, setEvaluationStarted] = useState(false); |
|
const pollingIntervalRef = useRef(null); |
|
|
|
const mapStepToIndex = (step) => { |
|
return EVALUATION_STEPS.indexOf(step); |
|
}; |
|
|
|
const checkForErrors = (logs) => { |
|
if (!logs) return false; |
|
|
|
const hasError = ERROR_MESSAGES.some((errorMessage) => |
|
logs.some((log) => log.toLowerCase().includes(errorMessage.toLowerCase())) |
|
); |
|
|
|
if (hasError) { |
|
setError( |
|
"The demo is currently under heavy load, please try again later." |
|
); |
|
setEvaluationComplete(true); |
|
if (pollingIntervalRef.current) { |
|
clearInterval(pollingIntervalRef.current); |
|
} |
|
return true; |
|
} |
|
return false; |
|
}; |
|
|
|
const startEvaluation = async () => { |
|
if (!sessionId) { |
|
setError("Missing session ID"); |
|
return; |
|
} |
|
|
|
setEvaluationStarted(true); |
|
|
|
try { |
|
const response = await fetch( |
|
`${API_CONFIG.BASE_URL}/evaluate-benchmark`, |
|
{ |
|
method: "POST", |
|
headers: { |
|
"Content-Type": "application/json", |
|
}, |
|
body: JSON.stringify({ |
|
session_id: sessionId, |
|
}), |
|
} |
|
); |
|
|
|
const result = await response.json(); |
|
|
|
if (response.ok) { |
|
setupPolling(); |
|
} else { |
|
setError(result.error || "Benchmark evaluation failed"); |
|
} |
|
} catch (error) { |
|
console.error("Error starting evaluation:", error); |
|
setError("Error connecting to server"); |
|
} |
|
}; |
|
|
|
const setupPolling = () => { |
|
pollingIntervalRef.current = setInterval(async () => { |
|
try { |
|
const logsResponse = await fetch( |
|
`${API_CONFIG.BASE_URL}/evaluation-logs/${sessionId}` |
|
); |
|
|
|
if (logsResponse.ok) { |
|
const logsResult = await logsResponse.json(); |
|
|
|
|
|
if (checkForErrors(logsResult.logs)) { |
|
return; |
|
} |
|
|
|
if (logsResult.is_completed) { |
|
setEvaluationComplete(true); |
|
clearInterval(pollingIntervalRef.current); |
|
if (onComplete) { |
|
onComplete(); |
|
} |
|
} else if (logsResult.current_step) { |
|
const newStepIndex = mapStepToIndex(logsResult.current_step); |
|
if (newStepIndex !== -1) { |
|
setCurrentStep(newStepIndex); |
|
} |
|
} |
|
} |
|
} catch (error) { |
|
console.log("Error polling logs:", error); |
|
} |
|
}, 2000); |
|
}; |
|
|
|
useEffect(() => { |
|
return () => { |
|
if (pollingIntervalRef.current) { |
|
clearInterval(pollingIntervalRef.current); |
|
} |
|
}; |
|
}, []); |
|
|
|
return { |
|
error, |
|
evaluationComplete, |
|
currentStep, |
|
evaluationStarted, |
|
startEvaluation, |
|
currentStepLabel: |
|
STEP_LABELS[EVALUATION_STEPS[currentStep]] || "Processing", |
|
totalSteps: EVALUATION_STEPS.length, |
|
}; |
|
}; |
|
|