import React, { useState, useRef, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAgents } from '../contexts/AgentContext'; import client, { getPromptTemplates, analyzePrompt } from '../api/client'; import { Box, Typography, TextField, Button, Paper, CircularProgress, Alert, List, ListItem, ListItemIcon, ListItemText, IconButton, Chip, Grid, Card, CardContent, CardActionArea, Divider } from '@mui/material'; import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'; import CloudUploadIcon from '@mui/icons-material/CloudUpload'; import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; import DeleteIcon from '@mui/icons-material/Delete'; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import DiamondIcon from '@mui/icons-material/Diamond'; const AgentCreation = () => { const navigate = useNavigate(); const { fetchAgents } = useAgents(); const fileInputRef = useRef(null); const [name, setName] = useState(''); const [prompt, setPrompt] = useState(''); const [files, setFiles] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); // Prompt templates const [templates, setTemplates] = useState([]); const [selectedTemplate, setSelectedTemplate] = useState(null); // Prompt analysis const [analyzing, setAnalyzing] = useState(false); const [analysis, setAnalysis] = useState(null); // Load templates on mount useEffect(() => { loadTemplates(); }, []); const loadTemplates = async () => { try { const response = await getPromptTemplates(); if (response.templates) { setTemplates(response.templates); } } catch (err) { console.error('Failed to load templates:', err); } }; const handleTemplateSelect = (template) => { setSelectedTemplate(template); setPrompt(template.template); // Auto-analyze when template is selected handleAnalyzePrompt(template.template); }; const handleAnalyzePrompt = async (promptText = prompt) => { if (!promptText || promptText.length < 20) return; setAnalyzing(true); try { const response = await analyzePrompt(promptText); if (response.analysis) { setAnalysis(response.analysis); // Auto-suggest agent name if empty if (!name && response.analysis.suggested_name) { setName(response.analysis.suggested_name.toLowerCase().replace(/\s+/g, '_')); } } } catch (err) { console.error('Failed to analyze prompt:', err); } finally { setAnalyzing(false); } }; const handleFileSelect = (e) => { const selectedFiles = Array.from(e.target.files); setFiles(prev => [...prev, ...selectedFiles]); }; const handleRemoveFile = (index) => { setFiles(prev => prev.filter((_, i) => i !== index)); }; const handleSubmit = async (e) => { e.preventDefault(); setLoading(true); setError(''); try { if (files.length === 0) { setError('Please upload at least one knowledge file'); setLoading(false); return; } // Create FormData for file upload const formData = new FormData(); formData.append('agent_name', name); formData.append('system_prompt', prompt); files.forEach(file => formData.append('files', file)); // Call the Phase 2 compile API const response = await client.post('/api/compile/', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); // Refresh agents list and navigate await fetchAgents(); navigate(`/compile/${response.data.agent_name}`); } catch (err) { const message = err.response?.data?.detail || 'Failed to create agent'; setError(message); } finally { setLoading(false); } }; return ( {/* Left Column - Templates */} Prompt Templates Select a template to get started quickly {templates.map((template, index) => ( handleTemplateSelect(template)}> {template.name} {selectedTemplate?.name === template.name && ( )} ))} {/* Right Column - Form */} Create New Agent {error && {error}}
setName(e.target.value)} margin="normal" required helperText="Use lowercase letters and underscores" /> setPrompt(e.target.value)} onBlur={() => handleAnalyzePrompt()} margin="normal" required multiline rows={4} /> {/* Analysis Results */} {analyzing && ( Analyzing prompt... )} {analysis && !analyzing && ( Detected Domain: {analysis.domain} {analysis.capabilities && analysis.capabilities.length > 0 && ( {analysis.capabilities.slice(0, 5).map((cap, i) => ( ))} )} )} {/* File Upload Section */} Knowledge Files * {files.length > 0 && ( {files.map((file, index) => ( handleRemoveFile(index)} size="small" > } > ))} )}
); }; export default AgentCreation;