"use client"; import { useEffect, useState } from "react"; import { useTranslations } from "next-intl"; import { experimental_useObject } from "@ai-sdk/react"; import { ChatModel } from "app-types/chat"; import { AgentGenerateSchema } from "app-types/agent"; import { handleErrorWithToast } from "ui/shared-toast"; import { CommandIcon, CornerRightUpIcon } from "lucide-react"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "ui/dialog"; import { Button } from "ui/button"; import { Textarea } from "ui/textarea"; import { MessageLoading } from "ui/message-loading"; import { SelectModel } from "@/components/select-model"; import { appStore } from "@/app/store"; interface GenerateAgentDialogProps { open: boolean; onOpenChange: (open: boolean) => void; onAgentChange: (data: any) => void; onToolsGenerated?: (tools: string[]) => void; } export function GenerateAgentDialog({ open, onOpenChange, onAgentChange, onToolsGenerated, }: GenerateAgentDialogProps) { const t = useTranslations(); const [generateModel, setGenerateModel] = useState( appStore.getState().chatModel, ); const [generateAgentPrompt, setGenerateAgentPrompt] = useState(""); const [submittedPrompt, setSubmittedPrompt] = useState(""); const { submit, isLoading, object } = experimental_useObject({ api: "/api/agent/ai", schema: AgentGenerateSchema, onFinish(event) { if (event.error) { handleErrorWithToast(event.error); } if (event.object) { onAgentChange(event.object); if (event.object.tools && onToolsGenerated) { onToolsGenerated(event.object.tools); } } // Close dialog after generation completes onOpenChange(false); setGenerateAgentPrompt(""); setSubmittedPrompt(""); // Reset to current global default model setGenerateModel(appStore.getState().chatModel); }, }); const submitGenerateAgent = () => { setSubmittedPrompt(generateAgentPrompt); submit({ message: generateAgentPrompt, chatModel: generateModel, }); setGenerateAgentPrompt(""); // Clear textarea immediately after submit // Don't close dialog immediately - will close in onFinish }; useEffect(() => { if (object && isLoading) { onAgentChange(object); } }, [object, isLoading, onAgentChange]); return ( Generate Agent Generate Agent

{t("Agent.generateAgentDetailedGreeting")}

{isLoading && submittedPrompt ? ( submittedPrompt ) : ( )}