import React, { useEffect, useMemo, useState } from 'react'; import { Bot, CheckCircle2, PlusCircle, RefreshCw, X, ShoppingBag, Users, Globe } from 'lucide-react'; import { motion } from 'framer-motion'; import { supabase } from '../services/supabase'; import { useAuth } from '../context/useAuth'; import { getDefaultModel, getDefaultProvider, providerOptions } from '../services/llmConfig'; import type { SupportedProvider } from '../services/llmConfig'; interface Agent { id: string; name: string; role: string | null; api_provider: SupportedProvider; model: string; system_prompt: string | null; created_at: string; } const AgentsView: React.FC = () => { const { user } = useAuth(); const defaultProvider = useMemo(() => getDefaultProvider(), []); const [agents, setAgents] = useState([]); const [selectedAgentId, setSelectedAgentId] = useState(null); const [name, setName] = useState(''); const [role, setRole] = useState(''); const [provider, setProvider] = useState(defaultProvider); const [model, setModel] = useState(getDefaultModel(defaultProvider)); const [systemPrompt, setSystemPrompt] = useState(''); const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); const [message, setMessage] = useState(null); const [error, setError] = useState(null); const [showShareModal, setShowShareModal] = useState(false); const [sharingAgent, setSharingAgent] = useState(null); const [shareToTeam, setShareToTeam] = useState(null); const [shareDescription, setShareDescription] = useState(''); const [shareCategory, setShareCategory] = useState('General'); const [isPublicTemplate, setIsPublicTemplate] = useState(false); const [teams, setTeams] = useState<{ id: string; name: string }[]>([]); const providerModels = providerOptions.find((option) => option.id === provider)?.models ?? []; const isEditing = selectedAgentId !== null; const loadAgents = async () => { setLoading(true); setError(null); const { data, error: selectError } = await supabase .from('agents') .select('id,name,role,api_provider,model,system_prompt,created_at') .order('created_at', { ascending: false }); if (selectError) setError(selectError.message); setAgents((data ?? []) as Agent[]); setLoading(false); }; useEffect(() => { loadAgents(); fetchTeams(); }, []); const fetchTeams = async () => { try { const { data } = await supabase.from('teams').select('id, name'); setTeams(data || []); } catch (err) { console.error('Failed to fetch teams'); } }; const handleProviderChange = (value: SupportedProvider) => { setProvider(value); setModel(getDefaultModel(value)); }; const resetForm = () => { setSelectedAgentId(null); setName(''); setRole(''); setProvider(defaultProvider); setModel(getDefaultModel(defaultProvider)); setSystemPrompt(''); }; const selectAgent = (agent: Agent) => { setSelectedAgentId(agent.id); setName(agent.name); setRole(agent.role ?? ''); setProvider(agent.api_provider); setModel(agent.model); setSystemPrompt(agent.system_prompt ?? ''); setMessage(null); setError(null); }; const saveAgent = async (event: React.FormEvent) => { event.preventDefault(); if (!user) { setError(`You must be signed in to ${isEditing ? 'update' : 'create'} an agent.`); return; } setSaving(true); setError(null); setMessage(null); const payload = { user_id: user.id, name, role, api_provider: provider, model, system_prompt: systemPrompt || `You are ${name}, acting as ${role || 'an AI agent'}.` }; const response = isEditing ? await supabase.from('agents').update(payload).eq('id', selectedAgentId) : await supabase.from('agents').insert(payload); if (response.error) { setError(response.error.message); } else { resetForm(); setMessage(isEditing ? 'Agent updated successfully.' : 'Agent created successfully.'); await loadAgents(); } setSaving(false); }; const handleShareTemplate = async () => { if (!sharingAgent || !user) return; setSaving(true); try { const { error } = await supabase.from('agent_templates').insert({ name: sharingAgent.name, role: sharingAgent.role, description: shareDescription || `Custom agent: ${sharingAgent.name}`, model: sharingAgent.model, api_provider: sharingAgent.api_provider, system_prompt: sharingAgent.system_prompt, category: shareCategory, author_id: user.id, team_id: isPublicTemplate ? null : shareToTeam, is_public: isPublicTemplate }); if (error) throw error; setMessage('Agent shared to marketplace!'); setShowShareModal(false); } catch (err: any) { setError(err.message); } finally { setSaving(false); } }; return (

Agents

Create custom agents and choose the LLM provider used at runtime.

{error &&
{error}
} {message &&
{message}
}

{isEditing ? 'Edit Agent' : 'Create Agent'}

{isEditing && ( )}