import React, { useEffect, useMemo } from 'react'; import { Dialog, DialogTitle, DialogContent, DialogActions, Button, FormControl, InputLabel, Select, MenuItem, Box, Typography, CircularProgress, ListSubheader, } from '@mui/material'; import { useForm, Controller } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { LlmSvgIcon } from '@/components/AppSvgIcon'; import { IconMap, type LLMFactory } from '@/constants/llm'; import type { ITenantInfo } from '@/interfaces/database/knowledge'; import type { LlmModelType } from '@/constants/knowledge'; import type { IMyLlmModel, IThirdOAIModel } from '@/interfaces/database/llm'; interface AllModelOptionItem { label: string; options: { value: string; label: string; disabled: boolean; model: IThirdOAIModel }[]; } // 导出接口供其他文件使用 export interface SystemModelFormData extends Partial { } // 系统默认模型设置对话框 export interface SystemModelDialogProps { open: boolean; onClose: () => void; loading: boolean; editMode?: boolean; onSubmit: (data: SystemModelFormData) => Promise; initialData?: Partial; allModelOptions: Record; } export interface ModelOption { value: string; label: string; disabled: boolean; model: IThirdOAIModel; } export interface ModelGroup { label: string; options: ModelOption[]; } /** * 系统默认模型设置对话框 */ function SystemModelDialog({ open, onClose, onSubmit, loading, initialData, editMode = false, allModelOptions }: SystemModelDialogProps) { const { t } = useTranslation(); const { control, handleSubmit, reset, formState: { errors } } = useForm({ defaultValues: {} }); // 获取工厂图标名称 const getFactoryIconName = (factoryName: LLMFactory) => { return IconMap[factoryName] || 'default'; }; // all model options 包含了全部的 options const llmOptions = useMemo(() => allModelOptions?.llmOptions || [], [allModelOptions]); const embdOptions = useMemo(() => allModelOptions?.embeddingOptions || [], [allModelOptions]); const img2txtOptions = useMemo(() => allModelOptions?.image2textOptions || [], [allModelOptions]); const asrOptions = useMemo(() => allModelOptions?.speech2textOptions || [], [allModelOptions]); const ttsOptions = useMemo(() => allModelOptions?.ttsOptions || [], [allModelOptions]); const rerankOptions = useMemo(() => allModelOptions?.rerankOptions || [], [allModelOptions]); useEffect(() => { if (open && initialData) { reset(initialData); } else if (open) { reset({ llm_id: '', embd_id: '', img2txt_id: '', asr_id: '', tts_id: '', rerank_id: '', }); } }, [open, initialData, reset]); const handleFormSubmit = async (data: ITenantInfo) => { try { await onSubmit(data); onClose(); } catch (error) { console.error(t('setting.submitFailed'), error); } }; return ( {t('setting.setDefaultModel')} ( {t('setting.chatModel')} {errors.llm_id && ( {errors.llm_id.message} )} )} /> ( {t('setting.embeddingModel')} {errors.embd_id && ( {errors.embd_id.message} )} )} /> ( {t('setting.img2txtModel')} )} /> ( {t('setting.speech2txtModel')} )} /> ( {t('setting.rerankModel')} )} /> ( {t('setting.ttsModel')} )} /> ); }; export default SystemModelDialog;