diff --git a/skyvern-frontend/src/router.tsx b/skyvern-frontend/src/router.tsx index ea9179aa..0fb9b52d 100644 --- a/skyvern-frontend/src/router.tsx +++ b/skyvern-frontend/src/router.tsx @@ -12,6 +12,7 @@ import { TaskActions } from "./routes/tasks/detail/TaskActions"; import { TaskRecording } from "./routes/tasks/detail/TaskRecording"; import { TaskParameters } from "./routes/tasks/detail/TaskParameters"; import { StepArtifactsLayout } from "./routes/tasks/detail/StepArtifactsLayout"; +import { CreateNewTaskFromPrompt } from "./routes/tasks/create/CreateNewTaskFromPrompt"; const router = createBrowserRouter([ { @@ -66,6 +67,10 @@ const router = createBrowserRouter([ index: true, element: , }, + { + path: "sk-prompt", + element: , + }, { path: ":template", element: , diff --git a/skyvern-frontend/src/routes/tasks/create/CreateNewTaskFormPage.tsx b/skyvern-frontend/src/routes/tasks/create/CreateNewTaskFormPage.tsx index 36acc6e0..4d2b351e 100644 --- a/skyvern-frontend/src/routes/tasks/create/CreateNewTaskFormPage.tsx +++ b/skyvern-frontend/src/routes/tasks/create/CreateNewTaskFormPage.tsx @@ -1,11 +1,11 @@ +import { getClient } from "@/api/AxiosClient"; +import { useCredentialGetter } from "@/hooks/useCredentialGetter"; +import { useQuery } from "@tanstack/react-query"; import { useParams } from "react-router-dom"; -import { CreateNewTaskForm } from "./CreateNewTaskForm"; import { getSampleForInitialFormValues } from "../data/sampleTaskData"; import { SampleCase, sampleCases } from "../types"; +import { CreateNewTaskForm } from "./CreateNewTaskForm"; import { SavedTaskForm } from "./SavedTaskForm"; -import { useQuery } from "@tanstack/react-query"; -import { useCredentialGetter } from "@/hooks/useCredentialGetter"; -import { getClient } from "@/api/AxiosClient"; function CreateNewTaskFormPage() { const { template } = useParams(); diff --git a/skyvern-frontend/src/routes/tasks/create/CreateNewTaskFromPrompt.tsx b/skyvern-frontend/src/routes/tasks/create/CreateNewTaskFromPrompt.tsx new file mode 100644 index 00000000..e3856b54 --- /dev/null +++ b/skyvern-frontend/src/routes/tasks/create/CreateNewTaskFromPrompt.tsx @@ -0,0 +1,42 @@ +import { useLocation } from "react-router-dom"; +import { CreateNewTaskForm } from "./CreateNewTaskForm"; +import { MagicWandIcon } from "@radix-ui/react-icons"; + +function CreateNewTaskFromPrompt() { + const location = useLocation(); + + const state = location.state.data; + return ( + + + + + Create New Task + + + Prompt: {state.user_prompt} + + + Below are the parameters we generated automatically. You can go ahead + and create the task if everything looks correct. + + + + + ); +} + +export { CreateNewTaskFromPrompt }; diff --git a/skyvern-frontend/src/routes/tasks/create/TaskTemplates.tsx b/skyvern-frontend/src/routes/tasks/create/TaskTemplates.tsx index 0f95a196..dd973237 100644 --- a/skyvern-frontend/src/routes/tasks/create/TaskTemplates.tsx +++ b/skyvern-frontend/src/routes/tasks/create/TaskTemplates.tsx @@ -10,6 +10,19 @@ import { Separator } from "@/components/ui/separator"; import { useNavigate } from "react-router-dom"; import { SavedTasks } from "./SavedTasks"; import { getSample } from "../data/sampleTaskData"; +import { Textarea } from "@/components/ui/textarea"; +import { useState } from "react"; +import { PaperPlaneIcon, ReloadIcon } from "@radix-ui/react-icons"; +import { useMutation } from "@tanstack/react-query"; +import { useCredentialGetter } from "@/hooks/useCredentialGetter"; +import { getClient } from "@/api/AxiosClient"; +import { AxiosError } from "axios"; +import { toast } from "@/components/ui/use-toast"; + +const examplePrompts = [ + "What is the top post on hackernews?", + "Navigate to Google Finance and search for AAPL", +]; const templateSamples: { [key in SampleCase]: { @@ -41,9 +54,74 @@ const templateSamples: { function TaskTemplates() { const navigate = useNavigate(); + const [prompt, setPrompt] = useState(""); + const credentialGetter = useCredentialGetter(); + + const getTaskFromPromptMutation = useMutation({ + mutationFn: async (prompt: string) => { + const client = await getClient(credentialGetter); + return client + .post("/generate/task", { prompt }) + .then((response) => response.data); + }, + onSuccess: (response) => { + navigate("/create/sk-prompt", { state: { data: response } }); + }, + onError: (error: AxiosError) => { + toast({ + variant: "destructive", + title: "Error creating task from prompt", + description: error.message, + }); + }, + }); return ( + + + Try a prompt + + + We will generate a task for you automatically. + + + + setPrompt(e.target.value)} + placeholder="Enter your prompt..." + /> + + {getTaskFromPromptMutation.isPending ? ( + + ) : ( + { + getTaskFromPromptMutation.mutate(prompt); + }} + /> + )} + + + + {examplePrompts.map((examplePrompt) => { + return ( + { + setPrompt(examplePrompt); + }} + > + {examplePrompt} + + ); + })} + + Your Templates
+ Prompt: {state.user_prompt} +
+ Below are the parameters we generated automatically. You can go ahead + and create the task if everything looks correct. +
+ We will generate a task for you automatically. +