From b9d7db533c3598d46e812a7af2ea5d7a3fd514e7 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 14:57:43 +0000 Subject: [PATCH] Add Agents screen to sidebar --- src/App.tsx | 2 + src/components/agents/CreateAgentDialog.tsx | 125 ++++++++++++++++ src/components/layout/AppSidebar.tsx | 2 + src/pages/Agents.tsx | 158 ++++++++++++++++++++ 4 files changed, 287 insertions(+) create mode 100644 src/components/agents/CreateAgentDialog.tsx create mode 100644 src/pages/Agents.tsx diff --git a/src/App.tsx b/src/App.tsx index 992347a..7430a80 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,6 +5,7 @@ import { ThemeProvider } from "next-themes"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { BrowserRouter, Routes, Route } from "react-router-dom"; import { AppLayout } from "./components/layout/AppLayout"; +import Agents from "./pages/Agents"; import Prompts from "./pages/Prompts"; import TestPrompt from "./pages/TestPrompt"; import History from "./pages/History"; @@ -21,6 +22,7 @@ const App = () => ( }> + } /> } /> } /> } /> diff --git a/src/components/agents/CreateAgentDialog.tsx b/src/components/agents/CreateAgentDialog.tsx new file mode 100644 index 0000000..1c7ed4e --- /dev/null +++ b/src/components/agents/CreateAgentDialog.tsx @@ -0,0 +1,125 @@ +import { useState } from "react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; + +interface CreateAgentDialogProps { + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export function CreateAgentDialog({ open, onOpenChange }: CreateAgentDialogProps) { + const [name, setName] = useState(""); + const [status, setStatus] = useState<"active" | "inactive">("active"); + const [selectedPrompt, setSelectedPrompt] = useState(""); + const [selectedModel, setSelectedModel] = useState(""); + + const handleSave = () => { + console.log("Salvando agente:", { name, status, selectedPrompt, selectedModel }); + // Implementar lógica de salvar no backend + onOpenChange(false); + // Reset form + setName(""); + setStatus("active"); + setSelectedPrompt(""); + setSelectedModel(""); + }; + + return ( + + + + Criar Novo Agente + + Configure o agente selecionando um prompt e modelo de IA + + + +
+
+ + setName(e.target.value)} + /> +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ ); +} diff --git a/src/components/layout/AppSidebar.tsx b/src/components/layout/AppSidebar.tsx index e052241..8ff4bfa 100644 --- a/src/components/layout/AppSidebar.tsx +++ b/src/components/layout/AppSidebar.tsx @@ -1,6 +1,7 @@ import { useState } from "react"; import { NavLink } from "react-router-dom"; import { + Bot, FileText, TestTube, ArrowLeft, @@ -12,6 +13,7 @@ import { Separator } from "@/components/ui/separator"; import { ThemeToggle } from "./ThemeToggle"; const menuItems = [ + { title: "Agentes", url: "/agents", icon: Bot }, { title: "Prompts", url: "/", icon: FileText }, { title: "Testar Prompt", url: "/test", icon: TestTube }, ]; diff --git a/src/pages/Agents.tsx b/src/pages/Agents.tsx new file mode 100644 index 0000000..d1d5433 --- /dev/null +++ b/src/pages/Agents.tsx @@ -0,0 +1,158 @@ +import { useState } from "react"; +import { CreateAgentDialog } from "@/components/agents/CreateAgentDialog"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Badge } from "@/components/ui/badge"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Plus, Search, MoreVertical, Edit, Trash2 } from "lucide-react"; + +export default function Agents() { + const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); + const [searchQuery, setSearchQuery] = useState(""); + + const [agents] = useState([ + { + id: 1, + name: "Agente de Atendimento", + status: "active" as const, + prompt: "Prompt de Atendimento v2.1", + model: "Google Gemini 2.5 Flash", + createdAt: "2 dias atrás", + }, + { + id: 2, + name: "Agente de Vendas", + status: "active" as const, + prompt: "Prompt de Vendas v1.5", + model: "OpenAI GPT-5", + createdAt: "5 dias atrás", + }, + { + id: 3, + name: "Agente de Análise", + status: "inactive" as const, + prompt: "Prompt de Análise", + model: "Anthropic Claude Sonnet 4.5", + createdAt: "1 semana atrás", + }, + ]); + + const filteredAgents = agents.filter(agent => + agent.name.toLowerCase().includes(searchQuery.toLowerCase()) + ); + + return ( +
+
+
+

Gestão de Agentes

+

+ Crie e gerencie agentes de IA com prompts e modelos específicos +

+
+ +
+ +
+
+ + setSearchQuery(e.target.value)} + className="pl-10" + /> +
+

+ {filteredAgents.length} {filteredAgents.length === 1 ? 'agente encontrado' : 'agentes encontrados'} +

+
+ + {filteredAgents.length === 0 ? ( +
+

Nenhum agente encontrado.

+
+ ) : ( +
+ + + + Nome + Prompt + Modelo + Criado + Status + Ações + + + + {filteredAgents.map((agent) => ( + + {agent.name} + {agent.prompt} + + + {agent.model} + + + {agent.createdAt} + + + {agent.status === "active" ? "Ativo" : "Inativo"} + + + + + + + + + console.log("Edit", agent.id)}> + + Editar + + console.log("Delete", agent.id)} + className="text-destructive" + > + + Excluir + + + + + + ))} + +
+
+ )} + + +
+ ); +}