import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { DefaultPerformanceConfig } from "@/lib/constants/config"; import { getErrorMessage, setProviderFormDirtyState, useAppDispatch } from "@/lib/store"; import { useUpdateProviderMutation } from "@/lib/store/apis/providersApi"; import { ModelProvider } from "@/lib/types/config"; import { performanceFormSchema, type PerformanceFormSchema } from "@/lib/types/schemas"; import { RbacOperation, RbacResource, useRbac } from "@enterprise/lib"; import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect } from "react"; import { useForm, type Resolver } from "react-hook-form"; import { toast } from "sonner"; import { buildProviderUpdatePayload } from "../views/utils"; interface PerformanceFormFragmentProps { provider: ModelProvider; } export function PerformanceFormFragment({ provider }: PerformanceFormFragmentProps) { const dispatch = useAppDispatch(); const hasUpdateProviderAccess = useRbac(RbacResource.ModelProvider, RbacOperation.Update); const [updateProvider, { isLoading: isUpdatingProvider }] = useUpdateProviderMutation(); const form = useForm({ resolver: zodResolver(performanceFormSchema) as Resolver, mode: "onChange", reValidateMode: "onChange", defaultValues: { concurrency_and_buffer_size: { concurrency: provider.concurrency_and_buffer_size?.concurrency ?? DefaultPerformanceConfig.concurrency, buffer_size: provider.concurrency_and_buffer_size?.buffer_size ?? DefaultPerformanceConfig.buffer_size, }, }, }); useEffect(() => { dispatch(setProviderFormDirtyState(form.formState.isDirty)); }, [form.formState.isDirty]); useEffect(() => { // Reset form with new provider's concurrency_and_buffer_size when provider changes form.reset({ concurrency_and_buffer_size: { concurrency: provider.concurrency_and_buffer_size?.concurrency ?? DefaultPerformanceConfig.concurrency, buffer_size: provider.concurrency_and_buffer_size?.buffer_size ?? DefaultPerformanceConfig.buffer_size, }, }); }, [form, provider.name, provider.concurrency_and_buffer_size]); const onSubmit = (data: PerformanceFormSchema) => { // Create updated provider configuration (raw request/response are in Debugging tab) const updatedProvider = buildProviderUpdatePayload(provider, { concurrency_and_buffer_size: { concurrency: data.concurrency_and_buffer_size.concurrency, buffer_size: data.concurrency_and_buffer_size.buffer_size, }, }); updateProvider(updatedProvider) .unwrap() .then(() => { toast.success("Provider configuration updated successfully"); form.reset(data); }) .catch((err) => { toast.error("Failed to update provider configuration", { description: getErrorMessage(err), }); }); }; return (
{/* Performance Configuration */}
( Concurrency { const value = e.target.value; if (value === "") { field.onChange(undefined); return; } const parsed = Number.parseInt(value); if (!Number.isNaN(parsed)) { field.onChange(parsed); } form.trigger("concurrency_and_buffer_size"); }} /> )} />
( Buffer Size { const value = e.target.value; if (value === "") { field.onChange(undefined); return; } const parsed = Number.parseInt(value); if (!Number.isNaN(parsed)) { field.onChange(parsed); } form.trigger("concurrency_and_buffer_size"); }} /> )} />
{/* Form Actions */}
); }