/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable react/no-unescaped-entities */ /* eslint-disable @typescript-eslint/no-unused-vars */ import React, { useCallback, useRef, useState, useEffect } from 'react' import { EngineConfig as OriginalEngineConfig, InferenceEngine, events, EngineEvent, } from '@janhq/core' interface EngineConfig extends OriginalEngineConfig { [key: string]: any } import { ScrollArea, Input, TextArea, Button } from '@janhq/joi' import { useAtomValue, useSetAtom } from 'jotai' import { set } from 'lodash' import { ChevronDown, ChevronRight, Eye, EyeOff, RefreshCwIcon, } from 'lucide-react' import { twMerge } from 'tailwind-merge' import Spinner from '@/containers/Loader/Spinner' import { updateEngine, useGetEngines, useRefreshModelList, } from '@/hooks/useEngineManagement' import { getTitleByEngine } from '@/utils/modelEngine' import { getLogoEngine } from '@/utils/modelEngine' import ModalAddModel from './ModalAddModel' import ModalDeleteModel from './ModalDeleteModel' import { downloadedModelsAtom, selectedModelAtom, } from '@/helpers/atoms/Model.atom' import { showScrollBarAtom } from '@/helpers/atoms/Setting.atom' import { threadsAtom } from '@/helpers/atoms/Thread.atom' const RemoteEngineSettings = ({ engine: name, }: { engine: InferenceEngine }) => { const { engines, mutate } = useGetEngines() const downloadedModels = useAtomValue(downloadedModelsAtom) const [showApiKey, setShowApiKey] = useState(false) const remoteModels = downloadedModels.filter((e) => e.engine === name) const [isActiveAdvanceSetting, setisActiveAdvanceSetting] = useState(false) const setSelectedModel = useSetAtom(selectedModelAtom) const customEngineLogo = getLogoEngine(name) const threads = useAtomValue(threadsAtom) const { refreshingModels, refreshModels } = useRefreshModelList(name) const showScrollBar = useAtomValue(showScrollBarAtom) const engine = engines && Object.entries(engines) .filter(([key]) => key === name) .flatMap(([_, engineArray]) => engineArray as EngineConfig)[0] const debounceRef = useRef(null) const handleChange = useCallback( (field: string, value: any) => { if (!engine) return setData((prevData) => { const updatedData = { ...prevData } set(updatedData, field, value) return updatedData }) if (debounceRef.current) { clearTimeout(debounceRef.current) } debounceRef.current = setTimeout(async () => { const updatedEngine = { ...engine } set(updatedEngine, field, value) await updateEngine(name, updatedEngine) mutate() events.emit(EngineEvent.OnEngineUpdate, {}) }, 300) }, [engine, name, mutate] ) const [data, setData] = useState({ api_key: '', metadata: { header_template: '', get_models_url: '', transform_req: { chat_completions: { template: '', url: '', }, }, transform_resp: { chat_completions: { template: '', }, }, }, }) useEffect(() => { if (threads.length === 0) { setSelectedModel(remoteModels[0]) } if (engine) { setData({ api_key: engine.api_key || '', metadata: { header_template: engine.metadata?.header_template || '', get_models_url: engine.metadata?.get_models_url || '', transform_req: { chat_completions: { template: engine.metadata?.transform_req?.chat_completions?.template || '', url: engine.metadata?.transform_req?.chat_completions?.url || '', }, }, transform_resp: { chat_completions: { template: engine.metadata?.transform_resp?.chat_completions?.template || '', }, }, }, }) } }, [engine]) if (!engine) return null return (
API Key

{!customEngineLogo ? ( Enter your authentication key to activate this engine.{' '} ) : ( Enter your authentication key to activate this engine. {engine.engine && engine.url && (  Get your API key from{' '} {getTitleByEngine(engine.engine)}. )} )}

{data?.api_key.length > 0 && (
setShowApiKey(!showApiKey)} > {showApiKey ? ( ) : ( )}
)} handleChange('api_key', e.target.value)} />
Model
{remoteModels && remoteModels?.map((item, i) => { return (
{item.name}
) })}

setisActiveAdvanceSetting(!isActiveAdvanceSetting)} > Advanced Settings {isActiveAdvanceSetting ? ( ) : ( )}

{isActiveAdvanceSetting && (
Chat Completion URL

Enter your chat completion URL.

handleChange( 'metadata.transform_req.chat_completions.url', e.target.value ) } />
Model List URL

The endpoint URL to fetch available models.

handleChange( 'metadata.get_models_url', e.target.value ) } />
Request Headers Template

HTTP headers template required for API authentication and version specification.