import * as React from 'react'; import { useLocation } from 'react-router-dom'; import { observer } from 'mobx-react'; import './style.less'; import { Button, Input, Form, Divider, Splitter, Select, InputNumber, InputNumberProps, Radio, Switch, Row, Col, Slider, Space, RadioChangeEvent, Spin, message } from 'antd'; import { PlusCircleOutlined, MinusCircleOutlined } from '@ant-design/icons'; import { apis } from '@/apis'; import router from '@/router'; import LocalStorage from '@/LocalStorage'; const { TextArea } = Input; const FormItem = Form.Item; const { Option } = Select; const MAX_COUNT = 10; const Index = 1; const QuestionAnswerInfo: React.FC = () => { const [form] = Form.useForm(); // top_p const [topPValue, setTopPValue] = React.useState(0.1); const TopPDecimalStep: React.FC = () => { const onChange: InputNumberProps['onChange'] = (value) => { if (Number.isNaN(value)) { return; } setTopPValue(value as number); }; return ( ); }; const [tempValue, setTempValue] = React.useState(0.01); // temperature const TempDecimalStep: React.FC = () => { const onChange: InputNumberProps['onChange'] = (value) => { if (Number.isNaN(value)) { return; } setTempValue(value as number); }; return ( ); }; type ModelList = { label: string, value: string, }[]; type KnowledgeList = { label: string, value: string, }[]; type AppTypeList = { label: string, value: string, }[]; const [step, setStep] = React.useState(1); const [pageLoading, setPageLoading] = React.useState(false); const [modelList, setModelList] = React.useState([]); const [knowledgeList, setKnowledgeList] = React.useState([]); const [isVisible, setIsVisible] = React.useState(false); const [isVisibleCus, setIsVisibleCus] = React.useState(false); const [isVisibleSlice, setIsVisibleSlice] = React.useState(false); const [isVisibleRerank, setIsVisibleRerank] = React.useState(false); const [isDeepThinkVisible, setIsDeepThinkVisible] = React.useState(false); const [name, setName] = React.useState(''); const [appTypeList, setAppTypeList] = React.useState([]); const [updateFlag, setUpdateFlag] = React.useState(); const [createFlag, setCreateFlag] = React.useState(); const [appProjectList, setAppProjectList] = React.useState([]); const [isAppPro, setIsAppPro] = React.useState(false); const [selectedAppProId, setSelectedAppProId] = React.useState(undefined); // 新增状态变量用于绑定 Select 值 const style: React.CSSProperties = { display: 'flex', flexDirection: 'column', gap: 8, width: 300, }; const location = useLocation(); const init = async (id: string) => { await Promise.all([ api.fetchKnowlegde(), api.fetchAppType(), // api.fetchModelList(), api.fetchAppProType(), ]) if (id) { await api.fetchDetail(id); } } React.useEffect(() => { const id = location?.state?.id; init(id); const uFlag = LocalStorage.getStatusFlag('deepseek:application:update'); setUpdateFlag(uFlag); const cFlag = LocalStorage.getStatusFlag('deepseek:application:create'); setCreateFlag(cFlag); }, []); // 定义一个状态来存储输入框数组 const [inputs, setInputs] = React.useState([{ id: 1, value: '' }]); // 添加新输入框的函数 const addInput = () => { const newId = inputs.length + 1; // 生成新的唯一ID setInputs([...inputs, { id: newId, value: '' }]); }; const delInput = () => { const newId = inputs.length - 1; // 生成新的唯一ID setInputs(inputs.slice(0, inputs.length - 1)); }; // 处理输入变更的函数 const handleChange = (id: number, value: string) => { setInputs(inputs.map(input => (input.id === id ? { ...input, value } : input))); }; const handleAppChange = (typeId: number) => { if (typeId === 41) { // 根据实际值进行判断 setIsAppPro(true); } else { setIsAppPro(false); } }; // const onChange: InputNumberProps['onChange'] = (value) => { // console.log('changed', value); // }; const onChangeShow = (checked: boolean) => { console.log(`switch to ${checked}`); }; const onChangeModel = (checked: boolean) => { setIsVisibleRerank(!isVisibleRerank); }; const onChangeCount = (value: string) => { if (value === 'fixed') { setIsVisibleSlice(!isVisibleSlice); } else { setIsVisibleSlice(false); } }; // 召回方式 const onChangeRecallMethod = (e: RadioChangeEvent) => { }; // 获取应用详情 const api = { fetchDetail: async (app_id: string) => { setPageLoading(true); try { const res = await apis.fetchTakaiApplicationDetail(app_id) console.log(res.data); const sd = res.data.questionlist.map((item: any, index: number) => { return { "id": index + 1, "value": item.question, } }); const info = res.data.detail; setTopPValue(info.topP as number); setTempValue(info.temperature as number); setName(info.name); interface Item2 { index_type_id: number, knowledge_id: string } interface Item { show_recall_result: boolean, recall_method: string, rerank_status: boolean, slice_config_type: string, slice_count: number, recall_slice_splicing_method: string, param_desc: string, rerank_model_name: string, rerank_index_type_list: [Item2], recall_index_type_list: [Item2] } const data_info: Item = JSON.parse(info.knowledgeInfo); if (data_info.param_desc === 'custom') { setIsVisibleCus(!isVisibleCus); //自定义回答风格 } if (data_info.rerank_status === true) { setIsVisibleRerank(!isVisibleRerank) //模型 } //召回切片数量 if (data_info.slice_config_type === 'fixed') { setIsVisibleSlice(!isVisibleSlice); } else { setIsVisibleSlice(false); } if(info.typeId === 42 || info.typeId === 43){ setIsAppPro(true); }else{ setIsAppPro(false); } if(info.model === 'Qwen3-30B') { setIsDeepThinkVisible(true); } else { setIsDeepThinkVisible(false); } form.setFieldsValue({ id: info.id, name: info.name, //应用名称 desc: info.desc, //应用描述 prompt: info.prompt, //应用提示语 top_p: info.topP as number, //topP temperature: info.temperature as number, //温度 knowledge_ids: info.knowledgeIds, model: info.model, isDeepThink: info.isDeepThink, icon_color: info.icon_color, icon_type: info.icon_type, questionList: sd, //问题列表 max_token: info.maxToken, //应用最大token updateDate: info.updateDate, // 更新时间 appProId: info.typeId, //项目级应用类型 typeId: info.typeId === 42 || info.typeId === 43 ? 41 : info.typeId, //应用类型 param_desc: data_info.param_desc, //回答风格 show_recall_result: data_info.show_recall_result, //是否展示召回结果 recall_method: data_info.recall_method, //召回方式 rerank_status: data_info.rerank_status, //开启rerank rerank_model_name: data_info.rerank_model_name, //模型名称 slice_config_type: data_info.slice_config_type, // 召回切片数量 slice_count: data_info.slice_count, // 切片数量 recall_slice_splicing_method: data_info.recall_slice_splicing_method, // 切片内容 // rerank_status = 1 rerank_index_type_list // recall_method = 'embedding' || 'mixed' recall_index_type_list //recall_index_type_list: info.recall_index_type_list, //知识库id //rerank_index_type_list: info.rerank_index_type_list, //知识库id }) if (sd.length > 0) { setInputs(sd); } } catch (error) { console.error(error); } finally { setPageLoading(false); } }, //获取知识库列表 fetchKnowlegde: async () => { try { const res = await apis.fetchTakaiKnowledgeList(); const list = res.data.map((item: any) => { return { label: item.name, value: item.knowledgeId, } }); setKnowledgeList(list); } catch (error: any) { console.error(error); } }, // 获取应用类型 fetchAppType: async () => { try { const res = await apis.fetchTakaiAppTypeList('app_type'); const list = res.data.map((item: any) => { return { label: item.dictLabel, value: item.dictCode, } }); setAppTypeList(list); } catch (error: any) { console.error(error); } }, // 获取模型列表 fetchModelList: async () => { try { const res = await apis.fetchModelList(); const list = res.data.data.map((item: any) => { return { label: item.modelName, value: item.modelCode, } }); setModelList(list); } catch (error: any) { console.error(error); } }, // 项目级应用下的类型 fetchAppProType: async () => { try { const res = await apis.fetchTakaiAppTypeList('project_type'); const list = res.data.map((item: any) => { return { label: item.dictLabel, value: item.dictCode, } }); console.log(list, 'project_type'); setAppProjectList(list); } catch (error: any) { console.error(error); } }, } const handleRedioClick = (value: string) => { setIsVisibleCus(false); if (value === 'strict') { setTopPValue(0.5); setTempValue(0.01); } else if (value === 'moderate') { setTopPValue(0.7); setTempValue(0.50); } else if (value === 'flexib') { setTopPValue(0.9); setTempValue(0.90); } } // const [modelValue, setModelValue] = useState(''); // // // 监听表单中模型值的变化 // useEffect(() => { // const currentModel = form.getFieldValue('model'); // setModelValue(currentModel); // }, [form]); // 依赖表单实例,当表单值变化时重新执行 return (
{ isAppPro && }