1- import { type FC } from 'react' ;
1+ import { type FC , useEffect } from 'react' ;
22import { CreateLayout } from './CreateLayout' ;
33import { CreateFormHeader } from './CreateFormHeader' ;
44import { CreateFormNavigation } from './CreateFormNavigation' ;
5+ import { z } from 'zod' ;
6+ import { zodResolver } from '@hookform/resolvers/zod' ;
7+ import { useForm , useWatch } from 'react-hook-form' ;
8+ import { InputFormField } from './InputFormField' ;
9+ import { SelectFormField } from './SelectFormField' ;
10+
11+ const formSchema = z . object ( {
12+ modelProvider : z . string ( ) . min ( 1 , {
13+ message : 'Model provider is required.' ,
14+ } ) ,
15+ model : z . string ( ) . min ( 1 , {
16+ message : 'Model is required.' ,
17+ } ) ,
18+ apiKey : z . string ( ) . min ( 1 , {
19+ message : 'API key is required.' ,
20+ } ) ,
21+ prompt : z . string ( ) . min ( 1 , {
22+ message : 'Prompt is required.' ,
23+ } ) ,
24+ } ) ;
525
626type AgentStepProps = {
727 handleNext : ( ) => void ;
828 handleBack : ( ) => void ;
929} ;
1030
1131export const AgentStep : FC < AgentStepProps > = ( { handleNext, handleBack } ) => {
32+ const form = useForm < z . infer < typeof formSchema > > ( {
33+ resolver : zodResolver ( formSchema ) ,
34+ defaultValues : {
35+ modelProvider : '' ,
36+ model : '' ,
37+ apiKey : '' ,
38+ prompt : '' ,
39+ } ,
40+ } ) ;
41+
42+ const modelProvider = useWatch ( {
43+ control : form . control ,
44+ name : 'modelProvider' ,
45+ } ) ;
46+
47+ useEffect ( ( ) => {
48+ if ( modelProvider === 'openai' ) {
49+ form . setValue ( 'model' , 'gpt-4o' ) ;
50+ } else if ( modelProvider === 'anthropic' ) {
51+ form . setValue ( 'model' , 'sonnet-3.7' ) ;
52+ } else {
53+ form . setValue ( 'model' , '' ) ;
54+ }
55+ } , [ modelProvider , form ] ) ;
56+
57+ function onSubmit ( values : z . infer < typeof formSchema > ) {
58+ console . log ( 'Agent values:' , values ) ;
59+ handleNext ( ) ;
60+ }
61+
62+ const getModelOptions = ( ) => {
63+ if ( modelProvider === 'openai' ) {
64+ return [ { value : 'gpt-4o' , label : 'ChatGPT 4o' } ] ;
65+ } else if ( modelProvider === 'anthropic' ) {
66+ return [ { value : 'sonnet-3.7' , label : 'Sonnet-3.7' } ] ;
67+ }
68+ return [ ] ;
69+ } ;
70+
71+ const formHasErrors = ! form . formState . isValid ;
72+
1273 return (
1374 < CreateLayout
1475 currentStep = { 2 }
@@ -24,7 +85,51 @@ export const AgentStep: FC<AgentStepProps> = ({ handleNext, handleBack }) => {
2485 title = "Agent Specific Stuff"
2586 description = "At varius sit sit netus at integer vitae posuere id. Nulla imperdiet vestibulum amet ultrices egestas. Bibendum sed integer ac eget."
2687 />
27- < CreateFormNavigation handleNext = { handleNext } handleBack = { handleBack } />
88+
89+ < form
90+ onSubmit = { form . handleSubmit ( onSubmit ) }
91+ className = "space-y-6 mb-6 w-full"
92+ >
93+ < SelectFormField
94+ control = { form . control }
95+ name = "modelProvider"
96+ label = "Model Provider"
97+ placeholder = "Select a model provider"
98+ options = { [
99+ { value : 'openai' , label : 'OpenAI' } ,
100+ { value : 'anthropic' , label : 'Anthropic' } ,
101+ ] }
102+ />
103+
104+ < SelectFormField
105+ control = { form . control }
106+ name = "model"
107+ label = "Select Model"
108+ placeholder = "Select a model"
109+ options = { getModelOptions ( ) }
110+ />
111+
112+ < InputFormField
113+ control = { form . control }
114+ name = "apiKey"
115+ label = "Model Provider API Key"
116+ placeholder = "Paste or type key here"
117+ />
118+
119+ < InputFormField
120+ control = { form . control }
121+ name = "prompt"
122+ label = "Prompt"
123+ placeholder = "Instructions for the agent on how to act, behave..."
124+ type = "textarea"
125+ />
126+
127+ < CreateFormNavigation
128+ handleNext = { form . handleSubmit ( onSubmit ) }
129+ handleBack = { handleBack }
130+ disabled = { formHasErrors || ! form . formState . isDirty }
131+ />
132+ </ form >
28133 </ CreateLayout >
29134 ) ;
30135} ;
0 commit comments