/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import React, { useEffect, useState } from 'react' import ScrollToBottom from 'react-scroll-to-bottom' import { Button, Switch, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipTrigger, Select, SelectContent, SelectItem, Input, SelectTrigger, SelectValue, } from '@janhq/uikit' import { atom, useAtom, useAtomValue } from 'jotai' import { Paintbrush, CodeIcon } from 'lucide-react' import { ExternalLinkIcon, InfoIcon } from 'lucide-react' import { twMerge } from 'tailwind-merge' import CardSidebar from '@/containers/CardSidebar' import DropdownListSidebar, { selectedModelAtom, } from '@/containers/DropdownListSidebar' import { useActiveModel } from '@/hooks/useActiveModel' import { useServerLog } from '@/hooks/useServerLog' import { getConfigurationsData } from '@/utils/componentSettings' import { toSettingParams } from '@/utils/modelParam' import EngineSetting from '../Chat/EngineSetting' import settingComponentBuilder from '../Chat/ModelSetting/settingComponentBuilder' import { showRightSideBarAtom } from '../Chat/Sidebar' import Logs from './Logs' import { serverEnabledAtom } from '@/helpers/atoms/LocalServer.atom' import { getActiveThreadModelParamsAtom } from '@/helpers/atoms/Thread.atom' const corsEnabledAtom = atom(true) const verboseEnabledAtom = atom(true) const hostAtom = atom('127.0.0.1') const portAtom = atom('1337') const LocalServerScreen = () => { const [errorRangePort, setErrorRangePort] = useState(false) const [serverEnabled, setServerEnabled] = useAtom(serverEnabledAtom) const showing = useAtomValue(showRightSideBarAtom) const activeModelParams = useAtomValue(getActiveThreadModelParamsAtom) const modelEngineParams = toSettingParams(activeModelParams) const componentDataEngineSetting = getConfigurationsData(modelEngineParams) const { openServerLog, clearServerLog } = useServerLog() const { startModel, stateModel } = useActiveModel() const [selectedModel] = useAtom(selectedModelAtom) const [isCorsEnabled, setIsCorsEnabled] = useAtom(corsEnabledAtom) const [isVerboseEnabled, setIsVerboseEnabled] = useAtom(verboseEnabledAtom) const [host, setHost] = useAtom(hostAtom) const [port, setPort] = useAtom(portAtom) const FIRST_TIME_VISIT_API_SERVER = 'firstTimeVisitAPIServer' const [firstTimeVisitAPIServer, setFirstTimeVisitAPIServer] = useState(false) const handleChangePort = (value: any) => { if (Number(value) <= 0 || Number(value) >= 65536) { setErrorRangePort(true) } else { setErrorRangePort(false) } setPort(value) } useEffect(() => { if ( localStorage.getItem(FIRST_TIME_VISIT_API_SERVER) === null || localStorage.getItem(FIRST_TIME_VISIT_API_SERVER) === 'true' ) { localStorage.setItem(FIRST_TIME_VISIT_API_SERVER, 'true') setFirstTimeVisitAPIServer(true) } }, [firstTimeVisitAPIServer]) useEffect(() => { handleChangePort(port) }, []) return (
{/* Left SideBar */}

Server Options

Start an OpenAI-compatible local HTTP server.

{serverEnabled && ( )}

Server Options

{ handleChangePort(e.target.value) }} maxLength={5} disabled={serverEnabled} />
{errorRangePort && (

{`The port range should be from 0 to 65536`}

)}
setIsCorsEnabled(e)} name="cors" disabled={serverEnabled} />
setIsVerboseEnabled(e)} name="verbose" disabled={serverEnabled} />
{serverEnabled && ( Settings cannot be modified while the server is running )}
{/* Middle Bar */}

Server Logs

{firstTimeVisitAPIServer ? (
Once you start the server, you cannot chat with your assistant.
) : ( )}
{/* Right bar */}
{componentDataEngineSetting.filter( (x) => x.name === 'prompt_template' ).length !== 0 && (
{settingComponentBuilder(componentDataEngineSetting, true)}
)} {componentDataEngineSetting.length !== 0 && (
)}
) } export default LocalServerScreen