| <template> | 
|   <a-button | 
|     v-if="typeAngint == 'edit'" | 
|     type="text" | 
|     size="small" | 
|     @click="editClick" | 
|   > | 
|     <template #icon> | 
|       <icon-tool /> | 
|     </template> | 
|   </a-button> | 
|   <!--  <a-button v-if="typeAngint=='add'" style="margin-left: 10px" type="primary" @click="handleClick">确定</a-button>--> | 
|   <a-modal | 
|     v-model:visible="visible" | 
|     title="" | 
|     @before-open="handleOpened" | 
|     @cancel="handleCancel" | 
|     :footer="false" | 
|     title-align="start" | 
|     fullscreen | 
|   > | 
|   <div class="main-container"> | 
|     <div class="main-container-lf"> | 
|       <div style="padding: 10px;font-size: 16px;background: var(--color-neutral-3);">智能体配置</div> | 
|       <div style="display: flex;width: 100%;" :style="{height:height}"> | 
|         <div style="width: 50%;height: 100%"> | 
|           <div style="padding: 10px;font-size: 12px;color: #2a2a2b;">智能体画像</div> | 
|           <div> | 
|             <a-textarea v-model="system" placeholder="" disabled style="height: 400px;"  /> | 
|           </div> | 
|   | 
|         </div> | 
|         <div style="width: 50%;border: 1px solid var(--color-neutral-3);background:  var(--color-neutral-3)"> | 
|           <a-form ref="formRef" :rules="rules" :model="form" @submit="handleSubmit"  layout="vertical" > | 
|             <a-collapse :default-active-key="['1']"> | 
|               <a-collapse-item header="基础信息" key="0" v-if="typeAngint == 'edit'"> | 
|                 <a-input v-model="form.name" placeholder="请输入智能体名称"  style="width:200px;margin-top: 10px" /> | 
|               </a-collapse-item> | 
|               <a-collapse-item header="AI模型配置" key="1"> | 
|                 <a-form-item field="llm_id" label="模型"> | 
|                   <a-space direction="vertical" size="large"> | 
|                     <a-select :size="'large'" field="llm_id" v-model="form.llm_id" :style="{width:'25rem'}" placeholder="请选择 ..."> | 
|                       <a-optgroup | 
|                         :label="index" | 
|                         v-for="(item, index) in modelList" | 
|                         :key="index" | 
|                       > | 
|                         <a-option | 
|                           v-for="obj in item" | 
|                           :key="obj.fid" | 
|                           :disabled="!obj.available" | 
|                           :value="obj.llm_id" | 
|                         > | 
|                           {{ obj.llm_name }} | 
|                         </a-option> | 
|                       </a-optgroup> | 
|                     </a-select> | 
|                   </a-space> | 
|                 </a-form-item> | 
|                 </a-collapse-item> | 
|                 <a-collapse-item header="开场引导" :key="'2'" disabled> | 
|                 </a-collapse-item> | 
|                 <a-collapse-item  header="知识库" key="3"> | 
|                   <a-form-item field="kb_ids" label="知识库"> | 
|                     <a-select | 
|                       v-model="form.kb_ids" | 
|                       :style="{ width: '25rem' }" | 
|                       placeholder="请选择 ..." | 
|                       multiple | 
|                     > | 
|                       <a-option | 
|                         v-for="item in tabs" | 
|                         :key="item.id" | 
|                         :value="item.id" | 
|                       >{{ item.name }}</a-option | 
|                       > | 
|                     </a-select> | 
|                   </a-form-item> | 
|                 </a-collapse-item> | 
|                 <a-collapse-item header="工具" key="4" disabled> | 
|                 </a-collapse-item> | 
|                 <a-collapse-item header="工作流" key="5" disabled> | 
|                 </a-collapse-item> | 
|               </a-collapse> | 
|   | 
|               <a-form-item> | 
|                 <div | 
|                   style=" | 
|                     position: absolute; | 
|                     right: 10px; | 
|                     top: 0px; | 
|                     z-index: 99999; | 
|                   " | 
|                 > | 
|                   <!--                <a-button @click="visible = false">取消</a-button>--> | 
|                   <a-button | 
|                     style="margin-left: 10px" | 
|                     type="primary" | 
|                     html-type="submit" | 
|                     >保存</a-button | 
|                   > | 
|                 </div> | 
|               </a-form-item> | 
|             </a-form> | 
|           </div> | 
|         </div> | 
|       </div> | 
|       <div class="main-container-rt"> | 
|         <sessionAction></sessionAction> | 
|       </div> | 
|     </div> | 
|   </a-modal> | 
| </template> | 
|   | 
| <script lang="ts" setup> | 
|   import { onMounted, onBeforeMount, reactive, ref, nextTick } from 'vue'; | 
|   import { IconSend } from '@arco-design/web-vue/es/icon'; | 
|   import { queryKbList, queryModelList } from '@/api/kbList'; | 
|   import useLoading from '@/hooks/loading'; | 
|   import { dialogSet } from '@/api/Agent'; | 
|   import { Message } from '@arco-design/web-vue'; | 
|   import EventBus from "@/utils/EventBus"; | 
|   import sessionAction  from "@/views/dmx/IntelligentAgent/components/sessionAction.vue"; | 
|   const { setLoading } = useLoading(true); | 
|   const props = defineProps(['typeAngint', 'formData']); | 
|   const visible = ref(false); | 
|   const loading = ref(false); | 
|   const form = reactive({ | 
|     name: '', | 
|     icon: '', | 
|     language: 'English', | 
|     prompt_config: { | 
|       empty_response: '', | 
|       prologue: '你好! 我是你的助理,有什么可以帮到你的吗?', | 
|       quote: true, | 
|       self_rag: true, | 
|       system: | 
|         '示例:\n' + | 
|         '你是 XX,具有 XX 经验,擅长 XX,…\n' + | 
|         '你的任务是 XX ,需要按照以下步骤执行:\n' + | 
|         '1. XX\n' + | 
|         '2. XX\n' + | 
|         '3. …\n' + | 
|         '{knowlege}', | 
|       parameters: [ | 
|         { | 
|           key: 'knowledge', | 
|           optional: false, | 
|         }, | 
|       ], | 
|     }, | 
|     kb_ids: [], | 
|     llm_id: 'qwen-plus', | 
|     llm_setting: { | 
|       temperature: 0.1, | 
|       top_p: 0.3, | 
|       presence_penalty: 0.4, | 
|       frequency_penalty: 0.7, | 
|       max_tokens: 512, | 
|     }, | 
|     similarity_threshold: 0.2, | 
|     vector_similarity_weight: 0.30000000000000004, | 
|     top_n: 8, | 
|   }); | 
|   const system = ref(''); | 
|   const embdId = ref(''); | 
|   const modelList = ref({}); | 
|   const renderData = ref([]); | 
|   const formRef = ref(null); | 
|   let tabs = ref([]); | 
|   const height = ref('calc(100vh - 150px)'); | 
|   const emit = defineEmits(['cancelModal']); | 
|   const rules = { | 
|     name: [ | 
|       { | 
|         required: true, | 
|         message: '名称不允许为空', | 
|       }, | 
|     ], | 
|     llm_id: [ | 
|       { | 
|         required: true, | 
|         message: '模型不能为空', | 
|       }, | 
|     ], | 
|     kb_ids: [ | 
|       { | 
|         required: true, | 
|         message: '知识库不能为空', | 
|       }, | 
|     ], | 
|   }; | 
|   | 
|   const handleSubmit = async ({ values, errors }) => { | 
|     // console.log('values:', values, '\nerrors:', errors) | 
|     if(!errors){ | 
|       let title = '创建成功'; | 
|       let formNew = { ...form }; | 
|       if (props.typeAngint == 'edit') { | 
|         formNew.dialog_id = form.id; | 
|         delete formNew.id; | 
|         delete formNew.off; | 
|         title = '修改成功'; | 
|       } | 
|       const data = await dialogSet(formNew); | 
|       if (data.code == 0) { | 
|         Message.success(title); | 
|         handleCancel(); | 
|         EventBus.emit('queryList'); | 
|       } | 
|     } | 
|   }; | 
|   | 
|   const editClick = (data) => { | 
|     visible.value = true; | 
|   | 
|     console.log(props.formData); | 
|     Object.assign(form, props.formData); | 
|     console.log(form); | 
|     system.value = form.prompt_config.system; | 
|   }; | 
|   | 
|   const handleClick = (data) => { | 
|     visible.value = true; | 
|     nextTick(() => { | 
|       Object.assign(form, data); | 
|       console.log(form,'传值'); | 
|       system.value = form.prompt_config.system; | 
|       if(tabs.value && tabs.value.length>0){ | 
|         form.kb_ids = [tabs.value[0].id]; | 
|       } | 
|     }); | 
|   }; | 
|   defineExpose({ | 
|     handleClick, | 
|   }); | 
|   const handleBeforeOk = (done) => { | 
|     formRef.value.validate().then((res) => { | 
|       console.log('form:', form); | 
|       if (!form.name) { | 
|         done(false); | 
|       } else { | 
|         console.log('请求数据'); | 
|       } | 
|     }); | 
|   }; | 
|   const handleCancel = () => { | 
|     visible.value = false; | 
|     emit('cancelModal'); | 
|   }; | 
|   | 
|   const handleOpened = (el) => { | 
|     // formRef.value.resetFields(); | 
|   }; | 
|   const queryModel = async (params) => { | 
|     try { | 
|       const data = await queryModelList(params); | 
|       console.log(data.data, '大模型列表'); | 
|       modelList.value = data.data; | 
|     } catch (err) { | 
|       // you can report use errorHandler or other | 
|     } finally { | 
|     } | 
|   }; | 
|   const file = ref(); | 
|   | 
|   const onChange = (_, currentFile) => { | 
|     file.value = { | 
|       ...currentFile, | 
|       // url: URL.createObjectURL(currentFile.file), | 
|     }; | 
|   }; | 
|   const onProgress = (currentFile) => { | 
|     file.value = currentFile; | 
|   }; | 
|   | 
|   const knowledgeData = async (params = { page: 1, page_size: 20 }) => { | 
|     setLoading(true); | 
|     try { | 
|       const { data } = await queryKbList(params); | 
|       console.log(data, 'data'); | 
|       nextTick(() => { | 
|         tabs.value = data; | 
|         console.log(tabs.value, 'tabs'); | 
|       }); | 
|     } catch (err) { | 
|       // you can report use errorHandler or other | 
|     } finally { | 
|       setLoading(false); | 
|     } | 
|   }; | 
|   | 
|   onBeforeMount(() => { | 
|     queryModel({}); | 
|     knowledgeData(); | 
|   }); | 
|   onMounted(() => {}); | 
| </script> | 
|   | 
| <style scoped lang="less"> | 
|   .main-container { | 
|     width: 100%; | 
|     display: flex; | 
|     .main-container-lf { | 
|       width: 60%; | 
|     } | 
|     .main-container-rt { | 
|       position: relative; | 
|       width: 40%; | 
|     } | 
|   } | 
|   .bottom { | 
|     width: 100%; | 
|     position: absolute; | 
|     bottom: 40px; | 
|     left: 0; | 
|     .input { | 
|       margin-left: 20%; | 
|       width: 60%; | 
|     } | 
|     .text { | 
|       margin-left: 40%; | 
|       font-size: 12px; | 
|       color: lightgrey; | 
|       line-height: 40px; | 
|     } | 
|   } | 
|   :deep(.arco-textarea-wrapper.arco-textarea-disabled){ | 
|       background: var(--color-bg-2); | 
|       color: var(--color-text-1); | 
|   } | 
| </style> |