'use client'; import React, { useState, useEffect, useCallback } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Badge } from '@/components/ui/badge'; import { Progress } from '@/components/ui/progress'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Brain, Code, Database, Rocket, Sparkles, Zap, AlertCircle, CheckCircle, Clock, ChevronRight, Download, Eye, Copy, Share2, Upload, FileCode, Cpu, BarChart, GitBranch, Settings, Play, Pause, RefreshCw } from 'lucide-react'; import { cn } from '@/lib/utils'; import UnifiedQuestionnaire from './UnifiedQuestionnaire'; // Import smartFetch utility const smartFetch = async (url: string, options: RequestInit = {}) => { const defaultOptions: RequestInit = { headers: { 'Content-Type': 'application/json', ...options.headers, }, ...options, }; const response = await fetch(url, defaultOptions); if (!response.ok) { const errorText = await response.text(); console.error(`HTTP ${response.status}:`, errorText); throw new Error(`HTTP ${response.status}: ${errorText}`); } return response; }; // Define types for better type safety interface WorkflowStatus { workflow_id: string; status: string; current_stage?: number; progress_percentage?: number; solution?: any; error?: string; } interface ArchitectureResult { solution?: any; job_id?: string; message?: string; consciousness_score?: number; } export default function AIArchitectPanel() { // Core state const [userRequest, setUserRequest] = useState(''); const [isGenerating, setIsGenerating] = useState(false); const [workflowId, setWorkflowId] = useState(null); const [workflowStatus, setWorkflowStatus] = useState(null); const [workflowResult, setWorkflowResult] = useState(null); const [error, setError] = useState(null); // UI state const [activeTab, setActiveTab] = useState('request'); const [showCode, setShowCode] = useState(false); const [showNotebook, setShowNotebook] = useState(false); const [selectedModel, setSelectedModel] = useState('pytorch'); const [deploymentTarget, setDeploymentTarget] = useState('cloud'); // Advanced settings const [advancedSettings, setAdvancedSettings] = useState({ consciousness_level: 0.8, creativity_factor: 0.7, optimization_priority: 'balanced', include_monitoring: true, include_testing: true, include_documentation: true }); // Questionnaire state const [showQuestionnaire, setShowQuestionnaire] = useState(false); const [isSubmittingQuestionnaire, setIsSubmittingQuestionnaire] = useState(false); const [hasSubmittedQuestionnaire, setHasSubmittedQuestionnaire] = useState(false); // Generate architecture const generateArchitecture = async () => { if (!userRequest.trim()) { setError('Please enter a request'); return; } setIsGenerating(true); setError(null); setWorkflowResult(null); setWorkflowStatus(null); setActiveTab('status'); // Reset questionnaire state for new workflow setHasSubmittedQuestionnaire(false); setShowQuestionnaire(false); try { const response = await smartFetch(`${process.env.NEXT_PUBLIC_TRAINING_API_BASE || 'http://localhost:9006'}/api/ai-architect/create-workflow`, { method: 'POST', body: JSON.stringify({ user_request: userRequest, model_preference: selectedModel, deployment_target: deploymentTarget, settings: advancedSettings }) }); const data = await response.json(); if (data.workflow_id) { setWorkflowId(data.workflow_id); // Workflow status will be updated by the useEffect hook } else { throw new Error('No workflow ID received'); } } catch (err: any) { console.error('Architecture generation error:', err); setError(err.message || 'Failed to generate architecture'); setIsGenerating(false); } }; // Download notebook const downloadNotebook = () => { if (!workflowResult?.solution?.jupyter_notebook?.content) return; const blob = new Blob([workflowResult.solution.jupyter_notebook.content], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `ai_model_${Date.now()}.ipynb`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; // Copy code to clipboard const copyCode = (code: string) => { navigator.clipboard.writeText(code); // You could add a toast notification here }; // Export as Python script const exportPythonScript = () => { if (!workflowResult?.solution?.training_pipeline?.training_code) return; const blob = new Blob([workflowResult.solution.training_pipeline.training_code], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `model_training_${Date.now()}.py`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; // Deploy to cloud (placeholder) const deployToCloud = async () => { alert('Cloud deployment feature coming soon!'); }; // Get status color const getStatusColor = (status: string) => { switch (status) { case 'completed': return 'text-green-500'; case 'running': return 'text-blue-500'; case 'waiting_for_user_data': return 'text-yellow-500'; case 'failed': return 'text-red-500'; default: return 'text-gray-500'; } }; // Get status icon const getStatusIcon = (status: string) => { switch (status) { case 'completed': return ; case 'running': return ; case 'waiting_for_user_data': return ; case 'failed': return ; default: return ; } }; // Format code for display const formatCode = (code: string) => { if (!code) return ''; // Basic formatting - in production, use a proper code formatter return code.replace(/\n/g, '\n').replace(/\t/g, ' '); }; // Handle questionnaire submission const handleQuestionnaireSubmit = async (answers: any) => { if (!workflowId) return; setIsSubmittingQuestionnaire(true); try { // Submit the questionnaire answers const submitRes = await fetch(`${process.env.NEXT_PUBLIC_TRAINING_API_BASE || 'http://localhost:9006'}/api/ai-architect/submit-questionnaire`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ workflow_id: workflowId, answers: answers }) }); if (!submitRes.ok) { throw new Error('Failed to submit questionnaire'); } // Continue the workflow const continueRes = await fetch(`${process.env.NEXT_PUBLIC_TRAINING_API_BASE || 'http://localhost:9006'}/api/ai-architect/continue-workflow/${workflowId}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ user_data: answers }) }); if (!continueRes.ok) { throw new Error('Failed to continue workflow'); } // Mark as submitted and hide questionnaire setHasSubmittedQuestionnaire(true); setShowQuestionnaire(false); // The workflow status will be updated by the polling effect } catch (err: any) { console.error('Questionnaire submission error:', err); setError(err.message || 'Failed to submit questionnaire'); } finally { setIsSubmittingQuestionnaire(false); } }; // Removed old submitDataModal - now using handleQuestionnaireSubmit // Removed old uploadFile function - file upload handled in UnifiedQuestionnaire // Poll for workflow status useEffect(() => { const checkStatus = async () => { if (workflowId && !workflowResult) { try { const sRes = await fetch(`${process.env.NEXT_PUBLIC_TRAINING_API_BASE || 'http://localhost:9006'}/api/ai-architect/workflow-status/${workflowId}?ts=${Date.now()}`, { headers: { 'Cache-Control': 'no-cache' }, cache: 'no-store' }); if (sRes.ok) { const status = await sRes.json(); setWorkflowStatus(status); // Check if we need to show the questionnaire if (status?.status === 'waiting_for_user_data' && !hasSubmittedQuestionnaire) { setShowQuestionnaire(true); } else if (status?.status !== 'waiting_for_user_data') { // Hide questionnaire if status changes setShowQuestionnaire(false); } } } catch (error) { console.error('Error checking workflow status:', error); } } }; if (workflowId) { checkStatus(); const interval = setInterval(checkStatus, 3000); return () => clearInterval(interval); } }, [workflowId, workflowResult]); return (
{/* AI Architect Header */}
AI Architect
Consciousness: {(advancedSettings.consciousness_level * 100).toFixed(0)}% {workflowResult?.consciousness_score && ( Score: {workflowResult.consciousness_score.toFixed(3)} )}
{/* Main Content */}
{/* Left Panel - Input & Settings */}
Project Request