John-Jiang's picture
init commit
5301c48
raw
history blame
8.01 kB
'use client'
import { useState, useEffect } from 'react'
import { Loader2 } from "lucide-react"
import TemplateWorkflowSteps from './TemplateWorkflowSteps'
import TemplateConfigureStep from './TemplateConfigureStep'
import TemplateRunningStep from './TemplateRunningStep'
import TemplateResultsStep from './TemplateResultsStep'
import TemplateEvaluateStep from './TemplateEvaluateStep'
import TemplateSaveExportStep from './TemplateSaveExportStep'
import type { TemplateRegister } from '../types'
interface TemplateManagerProps {
projectId: string
templateName: string
}
export type WorkflowStep = 'configure' | 'running' | 'results' | 'evaluate' | 'save-export'
export interface DatasetRecord {
id: string
[key: string]: any
score?: number
}
export interface ToEvaluateDatasetRecord {
id: string
[key: string]: any
rating?: number
comments?: string
}
export interface TemplateResult {
success: boolean
data: DatasetRecord[]
metadata?: {
total_records: number
execution_time: number
template_name: string
}
}
export default function TemplateManager({ projectId, templateName }: TemplateManagerProps) {
// Template data state
const [selectedTemplate, setSelectedTemplate] = useState<TemplateRegister | null>(null)
const [isLoadingTemplate, setIsLoadingTemplate] = useState(false)
const [templateLoaded, setTemplateLoaded] = useState(false)
// Workflow state
const [currentStep, setCurrentStep] = useState<WorkflowStep>('configure')
const [templateInputs, setTemplateInputs] = useState<Record<string, string>>({})
const [templateResult, setTemplateResult] = useState<TemplateResult | null>(null)
const [evaluatedData, setEvaluatedData] = useState<DatasetRecord[]>([])
// Fetch specific template data
useEffect(() => {
if (templateLoaded || !templateName) return
const fetchTemplateData = async () => {
setIsLoadingTemplate(true)
try {
const response = await fetch('/api/template/list')
if (response.ok) {
const data: TemplateRegister[] = await response.json()
const template = data.find(t => t.name === templateName)
if (template) {
setSelectedTemplate(template)
// Initialize form inputs
if (template.input_example) {
const exampleData = parseTemplateExample(template.input_example)
if (exampleData) {
const initialInputs: Record<string, string> = {}
Object.keys(exampleData).forEach(key => {
initialInputs[key] = ''
})
setTemplateInputs(initialInputs)
}
}
} else {
console.error(`Template "${templateName}" not found`)
}
setTemplateLoaded(true)
} else {
console.error('Failed to fetch template data:', response.statusText)
}
} catch (error) {
console.error('Error fetching template data:', error)
} finally {
setIsLoadingTemplate(false)
}
}
fetchTemplateData()
}, [templateLoaded, templateName])
const parseTemplateExample = (inputExample: any) => {
try {
if (typeof inputExample === 'object' && inputExample !== null) {
return inputExample
}
if (typeof inputExample === 'string') {
const cleanedExample = inputExample
.trim()
.replace(/True/g, 'true')
.replace(/False/g, 'false')
.replace(/None/g, 'null')
.replace(/,(\s*[}\]])/g, '$1')
.replace(/'/g, '"')
.replace(/^\s*#.*$/gm, '')
return JSON.parse(cleanedExample)
}
return null
} catch (error) {
console.error('Error parsing template example:', error)
return null
}
}
const handleDatasetEvaluation = async (evaluatedData: DatasetRecord[], skipEvaluation: boolean) => {
try {
if (skipEvaluation) {
setCurrentStep('save-export')
return
}
setCurrentStep('running') // Show loading state during API call
// Update templateResult with the evaluated data (ratings and comments)
if (templateResult) {
setTemplateResult({
...templateResult,
data: evaluatedData
})
}
const response = await fetch('/api/dataset/evaluate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
model_name: "gpt-4o-mini",
evaluatedData: evaluatedData
})
})
if (!response.ok) {
throw new Error('Failed to evaluate dataset')
}
const finalEvaluatedData = await response.json()
//const finalEvaluatedData = result.evaluatedData || evaluatedData
// Update both evaluatedData and templateResult
setEvaluatedData(finalEvaluatedData)
// if (templateResult) {
// setTemplateResult({
// ...templateResult,
// data: finalEvaluatedData
// })
// }
setCurrentStep('evaluate')
} catch (error) {
console.error('Error evaluating dataset:', error)
// Fallback to using the original evaluated data
setEvaluatedData(evaluatedData)
if (templateResult) {
setTemplateResult({
...templateResult,
data: evaluatedData
})
}
setCurrentStep('evaluate')
// You might want to show an error message to the user here
}
}
if (isLoadingTemplate) {
return (
<div className="space-y-6">
<div className="flex items-center justify-center py-12">
<div className="flex items-center gap-2">
<Loader2 className="h-6 w-6 animate-spin" />
<span className="text-lg text-gray-600">Loading template...</span>
</div>
</div>
</div>
)
}
if (!selectedTemplate) {
return (
<div className="space-y-6">
<div className="text-center py-12">
<p className="text-gray-500">
{templateName ? `Template "${templateName}" not found` : 'No template associated with this project'}
</p>
</div>
</div>
)
}
return (
<div className="space-y-6">
<TemplateWorkflowSteps currentStep={currentStep} />
{currentStep === 'configure' && (
<TemplateConfigureStep
selectedTemplate={selectedTemplate}
templateInputs={templateInputs}
setTemplateInputs={setTemplateInputs}
parseTemplateExample={parseTemplateExample}
setTemplateResult={setTemplateResult}
setCurrentStep={setCurrentStep}
// setEvaluatedData={setEvaluatedData}
/>
)}
{currentStep === 'running' && (
<TemplateRunningStep selectedTemplate={selectedTemplate} />
)}
{currentStep === 'results' && (
<TemplateResultsStep
templateResult={templateResult}
onEvaluate={handleDatasetEvaluation}
onBackToConfigure={() => setCurrentStep('configure')}
/>
)}
{currentStep === 'evaluate' && (
<TemplateEvaluateStep
evaluatedData={evaluatedData}
setEvaluatedData={setEvaluatedData}
templateResult={templateResult}
onSaveExport={() => setCurrentStep('save-export')}
onBackToResults={() => setCurrentStep('results')}
/>
)}
{currentStep === 'save-export' && (
<TemplateSaveExportStep
evaluatedData={evaluatedData}
selectedTemplate={selectedTemplate}
projectId={projectId}
onBackToStep={(step) => setCurrentStep(step as WorkflowStep)}
onStartNew={() => {
setCurrentStep('configure')
setTemplateResult(null)
setEvaluatedData([])
}}
/>
)}
</div>
)
}