import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { RiFileTextLine, RiFilmAiLine, RiImageCircleAiLine, RiVoiceAiFill, } from '@remixicon/react' import type { DefaultModel, Model, ModelItem, } from '../declarations' import { ModelFeatureEnum, ModelFeatureTextEnum, ModelTypeEnum, } from '../declarations' import { modelTypeFormat, sizeFormat, } from '../utils' import { useLanguage, useUpdateModelList, useUpdateModelProviders, } from '../hooks' import ModelIcon from '../model-icon' import ModelName from '../model-name' import ModelBadge from '../model-badge' import { ConfigurationMethodEnum, ModelStatusEnum, } from '../declarations' import { Check } from '@/app/components/base/icons/src/vender/line/general' import { useModalContext } from '@/context/modal-context' import { useProviderContext } from '@/context/provider-context' import Tooltip from '@/app/components/base/tooltip' import cn from '@/utils/classnames' type PopupItemProps = { defaultModel?: DefaultModel model: Model onSelect: (provider: string, model: ModelItem) => void } const PopupItem: FC = ({ defaultModel, model, onSelect, }) => { const { t } = useTranslation() const language = useLanguage() const { setShowModelModal } = useModalContext() const { modelProviders } = useProviderContext() const updateModelList = useUpdateModelList() const updateModelProviders = useUpdateModelProviders() const currentProvider = modelProviders.find(provider => provider.provider === model.provider)! const handleSelect = (provider: string, modelItem: ModelItem) => { if (modelItem.status !== ModelStatusEnum.active) return onSelect(provider, modelItem) } const handleOpenModelModal = () => { setShowModelModal({ payload: { currentProvider, currentConfigurationMethod: ConfigurationMethodEnum.predefinedModel, }, onSaveCallback: () => { updateModelProviders() const modelType = model.models[0].model_type if (modelType) updateModelList(modelType) }, }) } return (
{model.label[language] || model.label.en_US}
{ model.models.map(modelItem => (
{modelItem.label[language] || modelItem.label.en_US}
{/* {currentProvider?.description && (
{currentProvider?.description?.[language] || currentProvider?.description?.en_US}
)} */}
{modelItem.model_type && ( {modelTypeFormat(modelItem.model_type)} )} {modelItem.model_properties.mode && ( {(modelItem.model_properties.mode as string).toLocaleUpperCase()} )} {modelItem.model_properties.context_size && ( {sizeFormat(modelItem.model_properties.context_size as number)} )}
{modelItem.model_type === ModelTypeEnum.textGeneration && modelItem.features?.some(feature => [ModelFeatureEnum.vision, ModelFeatureEnum.audio, ModelFeatureEnum.video, ModelFeatureEnum.document].includes(feature)) && (
{t('common.model.capabilities')}
{modelItem.features?.includes(ModelFeatureEnum.vision) && ( {ModelFeatureTextEnum.vision} )} {modelItem.features?.includes(ModelFeatureEnum.audio) && ( {ModelFeatureTextEnum.audio} )} {modelItem.features?.includes(ModelFeatureEnum.video) && ( {ModelFeatureTextEnum.video} )} {modelItem.features?.includes(ModelFeatureEnum.document) && ( {ModelFeatureTextEnum.document} )}
)}
} >
handleSelect(model.provider, modelItem)} >
{ defaultModel?.model === modelItem.model && defaultModel.provider === currentProvider.provider && ( ) } { modelItem.status === ModelStatusEnum.noConfigure && (
{t('common.operation.add').toLocaleUpperCase()}
) }
)) } ) } export default PopupItem