import { useCallback, useEffect, useState } from 'react' import Image from 'next/image' import { EngineStatus, LlmEngine, Model, RemoteEngine } from '@janhq/core' import { Button } from '@janhq/joi' import { useSetAtom } from 'jotai' import { SettingsIcon } from 'lucide-react' import { twMerge } from 'tailwind-merge' import useEngineQuery from '@/hooks/useEngineQuery' import useGetModelsByEngine from '@/hooks/useGetModelsByEngine' import { getTitleByCategory } from '@/utils/model-engine' import ModelLabel from '../ModelLabel' import { setUpRemoteModelStageAtom } from '@/helpers/atoms/SetupRemoteModel.atom' type Props = { engine: LlmEngine searchText: string onModelSelected: (model: Model) => void } const ModelSection: React.FC = ({ engine, searchText, onModelSelected, }) => { const [models, setModels] = useState([]) const { getModelsByEngine } = useGetModelsByEngine() const setUpRemoteModelStage = useSetAtom(setUpRemoteModelStageAtom) const { data: engineData } = useEngineQuery() const engineLogo: string | undefined = models.find( (entry) => entry?.metadata?.logo != null )?.metadata?.logo const apiKeyUrl: string | undefined = models.find( (entry) => entry?.metadata?.api_key_url != null )?.metadata?.api_key_url const onSettingClick = useCallback(() => { setUpRemoteModelStage('SETUP_API_KEY', engine as unknown as RemoteEngine, { logo: engineLogo, api_key_url: apiKeyUrl, }) }, [apiKeyUrl, engine, engineLogo, setUpRemoteModelStage]) useEffect(() => { const matchedModels = getModelsByEngine(engine, searchText) setModels(matchedModels) }, [getModelsByEngine, engine, searchText]) if (models.length === 0) return null const engineName = getTitleByCategory(engine) return (
{engineLogo && ( logo )}
{engineName}
    {models.map((model) => { const isEngineReady = engineData?.find((e) => e.name === model.engine)?.status === EngineStatus.Ready return (
  • { if (isEngineReady) { onModelSelected(model) } }} >

    {model.name ?? model.model}

  • ) })}
) } export default ModelSection