import AutoTooltip from '@/components/auto-tooltip'; import IconFont from '@/components/icon-font'; import OverlayScroller from '@/components/overlay-scroller'; import { ClearOutlined, DeleteOutlined, MoreOutlined, SettingOutlined } from '@ant-design/icons'; import { useIntl } from '@umijs/max'; import { Button, Checkbox, Dropdown, Popover, Select, Spin } from 'antd'; import _ from 'lodash'; import 'overlayscrollbars/overlayscrollbars.css'; import React, { forwardRef, useCallback, useContext, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; import 'simplebar-react/dist/simplebar.min.css'; import { OpenAIViewCode, Roles, generateMessagesByListContent } from '../../config'; import CompareContext from '../../config/compare-context'; import { ChatParamsConfig } from '../../config/params-config'; import { MessageItem, ModelSelectionItem } from '../../config/types'; import { LLM_METAKEYS, llmInitialValues } from '../../hooks/config'; import useChatCompletion from '../../hooks/use-chat-completion'; import { useInitLLmMeta } from '../../hooks/use-init-meta'; import '../../style/model-item.less'; import DynamicParams from '../dynamic-params'; import ReferenceParams from '../reference-params'; import ViewCodeModal from '../view-code-modal'; import MessageContent from './message-content'; import SystemMessage from './system-message'; interface ModelItemProps { model: string; modelList: ModelSelectionItem[]; instanceId: symbol; ref: any; } const ModelItem: React.FC = forwardRef((props, ref) => { const { modelList, model, instanceId } = props; const { globalParams, setGlobalParams, setLoadingStatus, handleDeleteModel, handleApplySystemChangeToAll, modelFullList, actions } = useContext(CompareContext); const { handleOnValuesChange, handleOnModelChange, setParams, setInitialValues, formRef, paramsConfig, initialValues, parameters } = useInitLLmMeta(props, { defaultValues: { ...llmInitialValues, model: model }, defaultParamsConfig: ChatParamsConfig, metaKeys: LLM_METAKEYS }); const intl = useIntl(); const isApplyToAllModels = useRef(false); const [systemMessage, setSystemMessage] = useState(''); const [show, setShow] = useState(false); const scroller = useRef(null); const { submitMessage, handleAddNewMessage, handleClear, setMessageList, handleStopConversation, tokenResult, messageList, loading } = useChatCompletion(scroller); const viewCodeMessage = useMemo(() => { const resultList = systemMessage ? [{ role: Roles.System, content: systemMessage }] : []; const list = generateMessagesByListContent([...messageList]); return [...resultList, ...list]; }, [messageList, systemMessage]); const abortFetch = () => { handleStopConversation(); setLoadingStatus(instanceId, false); }; const handleDelete = () => { handleDeleteModel(instanceId); }; const handleSubmit = (currentMessage: Omit) => { const currentMsg = currentMessage.content || currentMessage.imgs?.length ? currentMessage : undefined; submitMessage({ system: systemMessage ? { role: Roles.System, content: systemMessage } : undefined, current: currentMsg, parameters: parameters }); }; const handleApplyToAllModels = (e: any) => { isApplyToAllModels.current = e.target.checked; if (e.target.checked) { setGlobalParams({ ..._.omit(parameters, 'model') }); } }; const OnValuesChange = useCallback( (changeValues: any, allValues: Record) => { handleOnValuesChange(changeValues, { ...allValues, model: parameters.model }); if (isApplyToAllModels.current) { setGlobalParams({ ...allValues }); } }, [parameters, isApplyToAllModels.current] ); const handleCloseViewCode = () => { setShow(false); }; const onModelChange = (value: string) => { handleOnModelChange(value); handleClear(); }; const actionItems = useMemo(() => { const list = [ { label: intl.formatMessage({ id: 'common.button.clear' }), key: 'clear', icon: , danger: false, onClick: () => { setMessageList([]); setSystemMessage(''); } }, { label: intl.formatMessage({ id: 'playground.viewcode' }), key: 'viewcode', icon: , onClick: () => { setShow(true); } } ]; if (modelList.length > 2) { list.push({ label: intl.formatMessage({ id: 'common.button.delete' }), key: 'delete', icon: , danger: true, onClick: () => { handleDelete(); } }); } return list; }, [modelList, intl]); useEffect(() => { setParams((prev: any) => { return { ...prev, ...globalParams }; }); setInitialValues((prev: any) => { return { ...prev, ...globalParams }; }); }, [globalParams]); useEffect(() => { setLoadingStatus(instanceId, loading); return () => { setLoadingStatus(instanceId, false); }; }, [loading]); useImperativeHandle(ref, () => { return { submit: handleSubmit, abortFetch, addNewMessage: handleAddNewMessage, clear: handleClear, setSystemMessage, loading }; }); return (
{tokenResult && !loading && ( )} } trigger={['click']} arrow={false} fresh={true} title={
{intl.formatMessage({ id: 'playground.compare.applytoall' })}
} >
); }); export default React.memo(ModelItem);