import { memo, useState } from 'react' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { Button, Input, Modal, TextArea } from '@janhq/joi' import { PlusIcon } from 'lucide-react' import { z } from 'zod' import { addRemoteEngine, useGetEngines } from '@/hooks/useEngineManagement' const engineSchema = z.object({ engineName: z.string().min(1, 'Engine name is required'), modelListUrl: z .string() .url('Enter a valid Model List URL') .or(z.literal('')), headerTemplate: z.string().optional(), chatCmpletionsUrl: z .string() .url('Enter a valid Model List URL') .or(z.literal('')), apiKey: z.string().optional(), requestFormat: z.string().optional(), responseFormat: z.string().optional(), }) const ModalAddRemoteEngine = () => { const [open, setOpen] = useState(false) const { mutate: mutateListEngines } = useGetEngines() const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(engineSchema), defaultValues: { engineName: '', chatCmpletionsUrl: '', modelListUrl: '', headerTemplate: '', apiKey: '', requestFormat: '', responseFormat: '', }, }) const onSubmit = async (data: z.infer) => { await addRemoteEngine({ type: 'remote', engine: data.engineName, url: ' ', api_key: data.apiKey, metadata: { header_template: data.headerTemplate, get_models_url: data.modelListUrl, transform_req: { chat_completions: { template: data.requestFormat, url: data.chatCmpletionsUrl, }, }, transform_resp: { chat_completions: { template: data.requestFormat, }, }, }, }) mutateListEngines() setOpen(false) } // Helper to render labels with asterisks for required fields const renderLabel = (label: string, isRequired: boolean, desc?: string) => ( <> {label} {isRequired && *}

{desc}

) return (

Install Remote Engine

Only OpenAI API-compatible engines are supported.

} fullPage open={open} onOpenChange={() => setOpen(!open)} trigger={ } content={
{errors.engineName && (

{errors.engineName.message}

)}
{errors.chatCmpletionsUrl && (

{errors.chatCmpletionsUrl.message}

)}
{errors.modelListUrl && (

{errors.modelListUrl.message}

)}