import React, { useEffect, useState } from 'react'; import { Button, Form, Header, Message, Segment } from 'semantic-ui-react'; import { useParams } from 'react-router-dom'; import { API, showError, showInfo, showSuccess } from '../../helpers'; import { CHANNEL_OPTIONS } from '../../constants'; const EditChannel = () => { const params = useParams(); const channelId = params.id; const isEdit = channelId !== undefined; const [loading, setLoading] = useState(isEdit); const originInputs = { name: '', type: 1, key: '', base_url: '', other: '', models: [], groups: ['default'] }; const [batch, setBatch] = useState(false); const [inputs, setInputs] = useState(originInputs); const [modelOptions, setModelOptions] = useState([]); const [groupOptions, setGroupOptions] = useState([]); const [basicModels, setBasicModels] = useState([]); const [fullModels, setFullModels] = useState([]); const handleInputChange = (e, { name, value }) => { setInputs((inputs) => ({ ...inputs, [name]: value })); }; const loadChannel = async () => { let res = await API.get(`/api/channel/${channelId}`); const { success, message, data } = res.data; if (success) { if (data.models === '') { data.models = []; } else { data.models = data.models.split(','); } if (data.group === '') { data.groups = []; } else { data.groups = data.group.split(','); } setInputs(data); } else { showError(message); } setLoading(false); }; const fetchModels = async () => { try { let res = await API.get(`/api/channel/models`); setModelOptions(res.data.data.map((model) => ({ key: model.id, text: model.id, value: model.id }))); setFullModels(res.data.data.map((model) => model.id)); setBasicModels(res.data.data.filter((model) => !model.id.startsWith('gpt-4')).map((model) => model.id)); } catch (error) { showError(error.message); } }; const fetchGroups = async () => { try { let res = await API.get(`/api/group/`); setGroupOptions(res.data.data.map((group) => ({ key: group, text: group, value: group }))); } catch (error) { showError(error.message); } }; useEffect(() => { if (isEdit) { loadChannel().then(); } fetchModels().then(); fetchGroups().then(); }, []); const submit = async () => { if (!isEdit && (inputs.name === '' || inputs.key === '')) { showInfo('请填写渠道名称和渠道密钥!'); return; } if (inputs.models.length === 0) { showInfo('请至少选择一个模型!'); return; } let localInputs = inputs; if (localInputs.base_url.endsWith('/')) { localInputs.base_url = localInputs.base_url.slice(0, localInputs.base_url.length - 1); } if (localInputs.type === 3 && localInputs.other === '') { localInputs.other = '2023-03-15-preview'; } let res; localInputs.models = localInputs.models.join(','); localInputs.group = localInputs.groups.join(','); if (isEdit) { res = await API.put(`/api/channel/`, { ...localInputs, id: parseInt(channelId) }); } else { res = await API.post(`/api/channel/`, localInputs); } const { success, message } = res.data; if (success) { if (isEdit) { showSuccess('渠道更新成功!'); } else { showSuccess('渠道创建成功!'); setInputs(originInputs); } } else { showError(message); } }; return ( <>
{isEdit ? '更新渠道信息' : '创建新的渠道'}
{ inputs.type === 3 && ( <> 注意,模型部署名称必须和模型名称保持一致,因为 One API 会把请求体中的 model 参数替换为你的部署名称(模型名称中的点会被剔除),图片演示 ) } { inputs.type === 8 && ( ) } { inputs.type !== 3 && inputs.type !== 8 && ( ) }
{ batch ? : } { !isEdit && ( setBatch(!batch)} /> ) }
); }; export default EditChannel;