import { useEffect, useState, useRef, forwardRef, useImperativeHandle } from 'react' import { useTranslation } from 'react-i18next' import { useParams } from 'react-router-dom'; import Card from './components/Card' import { Form, Space, Row, Col, Button, Flex, App, Select } from 'antd' import Tag, { type TagProps } from './components/Tag' import CustomSelect from '@/components/CustomSelect'; import { getMultiAgentConfig, saveMultiAgentConfig, getApplicationList } from '@/api/application'; import type { Config, SubAgentModalRef, ChatData, SubAgentItem, ClusterRef, ModelConfigModalRef } from './types' import Chat from './components/Chat' import RbCard from '@/components/RbCard/Card' import SubAgentModal from './components/SubAgentModal' import Empty from '@/components/Empty' import RadioGroupCard from '@/components/RadioGroupCard' import { getModelListUrl } from '@/api/models' import ModelConfigModal from './components/ModelConfigModal' import type { Application } from '@/views/ApplicationManagement/types' const tagColors = ['processing', 'warning', 'default'] const MAX_LENGTH = 5; const Cluster = forwardRef((_props, ref) => { const { t } = useTranslation() const { message } = App.useApp() const [form] = Form.useForm() const { id } = useParams() const subAgentModalRef = useRef(null) const [data, setData] = useState(null) const values = Form.useWatch([], form) const [subAgents, setSubAgents] = useState([]) const [chatList, setChatList] = useState([ { list: [] }, ]) const handleSave = (flag = true) => { if (!data) return Promise.resolve() if (!values.default_model_config_id && values.orchestration_mode === 'supervisor') { message.warning(t('common.selectPlaceholder', { title: t('application.model') })) return Promise.resolve() } const params = { id: data.id, app_id: data.app_id, ...values, sub_agents: (subAgents || []).map(item => ({ ...item, priority: 1, })) } return new Promise((resolve, reject) => { form.validateFields().then(() => { saveMultiAgentConfig(id as string, params) .then((res) => { if (flag) { message.success(t('common.saveSuccess')) } resolve(res) }) .catch(error => { reject(error) }) }) .catch(error => { reject(error) }) }) } useEffect(() => { getData() }, [id]) const getData = () => { if (!id) { return } getMultiAgentConfig(id as string).then(res => { const response = res as Config setData(response) form.setFieldsValue({ ...response, }) let sub_agents = response.sub_agents || [] if (sub_agents.length > 0) { console.log({ ids: sub_agents?.map(item => item.agent_id) }) getApplicationList({ ids: sub_agents?.map(item => item.agent_id).join(',')}) .then(res => { const applicationList = (res as Application[]) || [] setSubAgents(sub_agents.map(vo => { const filterVO = applicationList.find(item => item.id === vo.agent_id) if (filterVO) { return { ...vo, name: filterVO.name, is_active: filterVO.is_active } } return vo })) }) } else { setSubAgents(sub_agents) } }) } const handleSubAgentModal = (agent?: SubAgentItem) => { subAgentModalRef.current?.handleOpen(agent) } const refreshSubAgents = (agent: SubAgentItem) => { const index = subAgents.findIndex(item => item.agent_id === agent.agent_id) const newSubAgents = [...subAgents] if (index === -1) { if (subAgents.length >= MAX_LENGTH) { message.warning(t('application.subAgentMaxLength', {maxLength: MAX_LENGTH})) return } setSubAgents([...newSubAgents, agent]) } else { newSubAgents[index] = agent setSubAgents(newSubAgents) } } const handleDeleteSubAgent = (agent: SubAgentItem) => { setSubAgents(prev => prev.filter(item => item.agent_id !== agent.agent_id)) } useImperativeHandle(ref, () => ({ handleSave })) const modelConfigModalRef = useRef(null) const handleEditModelConfig = () => { modelConfigModalRef.current?.handleOpen('multi_agent', values.model_parameters) } const handleSaveModelConfig = (values: Config['model_parameters']) => { form.setFieldsValue({ model_parameters: values }) } return (
({ value: type, label: t(`application.${type}`), labelDesc: t(`application.${type}Desc`), }))} allowClear={false} />
{t('application.added')}: {subAgents.length}/{MAX_LENGTH}
{subAgents.length === 0 ? : subAgents.map((agent, index) => (
{agent.name?.[0]}
{agent.name} {agent.is_active ? t('common.enable') : t('common.deleted')}
{agent.role &&
{agent.role || '-'}
} {agent.capabilities && {agent.capabilities.map((tag, tagIndex) => {tag})}}
handleSubAgentModal(agent)} >
handleDeleteSubAgent(agent)} >
))}
{values?.orchestration_mode !== 'collaboration' && ({ value: type, label: t(`application.${type}`), }))} /> }
) }) export default Cluster