import { getClient } from "@/api/AxiosClient"; import { ObserverTask, TaskGenerationApiResponse } from "@/api/types"; import img from "@/assets/promptBoxBg.png"; import { AutoResizingTextarea } from "@/components/AutoResizingTextarea/AutoResizingTextarea"; import { CartIcon } from "@/components/icons/CartIcon"; import { GraphIcon } from "@/components/icons/GraphIcon"; import { InboxIcon } from "@/components/icons/InboxIcon"; import { MessageIcon } from "@/components/icons/MessageIcon"; import { TranslateIcon } from "@/components/icons/TranslateIcon"; import { TrophyIcon } from "@/components/icons/TrophyIcon"; import { Button } from "@/components/ui/button"; import { CustomSelectItem, Select, SelectContent, SelectItemText, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { toast } from "@/components/ui/use-toast"; import { useCredentialGetter } from "@/hooks/useCredentialGetter"; import { FileTextIcon, GearIcon, PaperPlaneIcon, Pencil1Icon, PlusIcon, ReloadIcon, } from "@radix-ui/react-icons"; import { ToastAction } from "@radix-ui/react-toast"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { AxiosError } from "axios"; import { useState } from "react"; import { Link, useNavigate } from "react-router-dom"; import { stringify as convertToYAML } from "yaml"; function createTemplateTaskFromTaskGenerationParameters( values: TaskGenerationApiResponse, ) { return { title: values.suggested_title ?? "Untitled Task", description: "", is_saved_task: true, webhook_callback_url: null, proxy_location: "RESIDENTIAL", workflow_definition: { parameters: [ { parameter_type: "workflow", workflow_parameter_type: "json", key: "navigation_payload", default_value: JSON.stringify(values.navigation_payload), }, ], blocks: [ { block_type: "task", label: values.suggested_title ?? "Untitled Task", url: values.url, navigation_goal: values.navigation_goal, data_extraction_goal: values.data_extraction_goal, data_schema: values.extracted_information_schema, }, ], }, }; } const exampleCases = [ { key: "finditparts", label: "Add a product to cart", icon: , }, { key: "geico", label: "Get an insurance quote", icon: , }, { key: "job_application", label: "Apply for a job", icon: , }, { key: "california_edd", label: "Fill out CA's online EDD", icon: , }, { key: "contact_us_forms", label: "Fill a contact us form", icon: , }, { key: "bci_seguros", label: "Get an auto insurance quote in spanish", icon: , }, { key: "hackernews", label: "What's the top post on hackernews", icon: , }, { key: "AAPLStockPrice", label: "Search for AAPL on Google Finance", icon: , }, { key: "topRankedFootballTeam", label: "Get the top ranked football team", icon: , }, { key: "extractIntegrationsFromGong", label: "Extract Integrations from Gong.io", icon: , }, ]; function PromptBox() { const navigate = useNavigate(); const [prompt, setPrompt] = useState(""); const [selectValue, setSelectValue] = useState("v2"); // Observer is the default const credentialGetter = useCredentialGetter(); const queryClient = useQueryClient(); const startObserverCruiseMutation = useMutation({ mutationFn: async (prompt: string) => { const client = await getClient(credentialGetter, "v2"); return client.post<{ user_prompt: string }, { data: ObserverTask }>( "/tasks", { user_prompt: prompt }, ); }, onSuccess: (response) => { toast({ variant: "success", title: "Workflow Run Created", description: `Workflow run created successfully.`, action: ( View ), }); queryClient.invalidateQueries({ queryKey: ["workflowRuns"], }); queryClient.invalidateQueries({ queryKey: ["workflows"], }); }, onError: (error: AxiosError) => { toast({ variant: "destructive", title: "Error creating workflow run from prompt", description: error.message, }); }, }); const getTaskFromPromptMutation = useMutation({ mutationFn: async (prompt: string) => { const client = await getClient(credentialGetter); return client .post< { prompt: string }, { data: TaskGenerationApiResponse } >("/generate/task", { prompt }) .then((response) => response.data); }, onError: (error: AxiosError) => { toast({ variant: "destructive", title: "Error creating task from prompt", description: error.message, }); }, }); const saveTaskMutation = useMutation({ mutationFn: async (params: TaskGenerationApiResponse) => { const client = await getClient(credentialGetter); const templateTask = createTemplateTaskFromTaskGenerationParameters(params); const yaml = convertToYAML(templateTask); return client.post("/workflows", yaml, { headers: { "Content-Type": "text/plain", }, }); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["savedTasks"], }); }, onError: (error: AxiosError) => { toast({ variant: "destructive", title: "Error saving task", description: error.message, }); }, }); return ( What task would you like to accomplish? setPrompt(e.target.value)} placeholder="Enter your prompt..." /> Skyvern 1.0 Best for simple tasks Skyvern 2.0 Best for complex tasks {startObserverCruiseMutation.isPending || getTaskFromPromptMutation.isPending || saveTaskMutation.isPending ? ( ) : ( { if (selectValue === "v2") { startObserverCruiseMutation.mutate(prompt); return; } const taskGenerationResponse = await getTaskFromPromptMutation.mutateAsync(prompt); await saveTaskMutation.mutateAsync(taskGenerationResponse); navigate("/tasks/create/from-prompt", { state: { data: taskGenerationResponse, }, }); }} /> )} { navigate("/tasks/create/blank"); }} > Build Your Own {exampleCases.map((example) => { return ( { navigate(`/tasks/create/${example.key}`); }} > {example.icon} {example.label} ); })} ); } export { PromptBox };