From c02bff2911f720d54388f4abb6456ec1777f8a96 Mon Sep 17 00:00:00 2001
From: zhangxiao <898441624@qq.com>
Date: 星期五, 30 八月 2024 10:40:02 +0800
Subject: [PATCH] fix: 修改bug

---
 src/views/dmx/knowledgeLib/config.vue |  506 +++++++++++++++++++++++++++++++------------------------
 1 files changed, 282 insertions(+), 224 deletions(-)

diff --git a/src/views/dmx/knowledgeLib/config.vue b/src/views/dmx/knowledgeLib/config.vue
index d134148..ebec067 100644
--- a/src/views/dmx/knowledgeLib/config.vue
+++ b/src/views/dmx/knowledgeLib/config.vue
@@ -1,136 +1,95 @@
 <template>
-  <div class="main-container">
+  <div ref="scrollContainer" class="main-container">
     <div style="position: absolute;top: 0;left: 0;width: 100%;padding: 0 20px">
-      <h4 style="margin-bottom: 10px">閰嶇疆</h4>
+      <h4 style="margin-bottom: 10px"></h4>
       <div style="color: #666666;">鍦ㄨ繖閲屾洿鏂版偍鐨勭煡璇嗗簱璇︾粏淇℃伅锛屽挨鍏舵槸瑙f瀽鏂规硶銆�</div>
       <a-divider style="margin-top: 20px" />
     </div>
     <div class="main-container-lf">
       <div class="main-container-lf-down">
-        <a-form ref="formRef" :size="form.size" :model="form" :style="{width:'100%'}" layout="vertical"
+        <a-form ref="formRef" :rules="rules" :model="form" :style="{width:'100%'}" layout="vertical"
                 @submit="handleSubmit">
-          <a-form-item field="name" label="鐭ヨ瘑搴撳悕绉�"
-                       :rules="[{required:true,message:'name is required'},{minLength:5,message:'must be greater than 5 characters'}]"
-                       :validate-trigger="['change','input']"
-          >
+          <a-form-item field="name" label="鐭ヨ瘑搴撳悕绉�">
             <a-input v-model="form.name" placeholder="璇疯緭鍏�" />
           </a-form-item>
           <a-form-item field="section" label="鐭ヨ瘑搴撳浘鐗�">
             <a-space direction="vertical" :style="{ width: '100%' }">
-              <a-upload
-                action="/"
-                :fileList="file ? [file] : []"
-                :show-file-list="false"
-                @change="onChange"
-                @progress="onProgress"
-              >
-                <template #upload-button>
-                  <div
-                    :class="`arco-upload-list-item${
-            file && file.status === 'error' ? ' arco-upload-list-item-error' : ''
-          }`"
-                  >
-                    <div
-                      class="arco-upload-list-picture custom-upload-avatar"
-                      v-if="file && file.url"
-                    >
-                      <img :src="file.url" />
-                      <div class="arco-upload-list-picture-mask">
-                        <IconEdit />
-                      </div>
-                      <a-progress
-                        v-if="file.status === 'uploading' && file.percent < 100"
-                        :percent="file.percent"
-                        type="circle"
-                        size="mini"
-                        :style="{
-                position: 'absolute',
-                left: '50%',
-                top: '50%',
-                transform: 'translateX(-50%) translateY(-50%)',
-              }"
-                      />
-                    </div>
-                    <div class="arco-upload-picture-card" v-else>
-                      <div class="arco-upload-picture-card-text">
-                        <IconPlus />
-                        <div style="margin-top: 10px; font-weight: 600">涓婁紶</div>
-                      </div>
-                    </div>
-                  </div>
-                </template>
-              </a-upload>
+              <Upload
+                v-if="avatarShow"
+                :action="uploadAction"
+                :limit="1"
+                :url="form.avatar ? httpUrl + form.avatar : ''"
+                @update:fileList="updateFileList"
+                @success="handleSuccess"
+              ></Upload>
             </a-space>
           </a-form-item>
           <a-form-item field="section" label="鎻忚堪">
-            <a-textarea placeholder="" allow-clear />
+            <a-textarea placeholder=""  v-model="form.description" allow-clear />
           </a-form-item>
-          <a-form-item field="section" label="璇█" :rules="[{match:/section one/,message:'璇烽�夋嫨'}]">
-            <a-select v-model="form.section" placeholder="璇烽�夋嫨" allow-clear>
-              <a-option value="0">涓枃</a-option>
-              <a-option value="1">鑻辨枃</a-option>
+<!--          <a-form-item field="section" label="璇█" :rules="[{match:/section one/,message:'璇烽�夋嫨'}]">-->
+<!--            <a-select v-model="form.section" placeholder="璇烽�夋嫨" allow-clear>-->
+<!--              <a-option value="0">涓枃</a-option>-->
+<!--              <a-option value="1">鑻辨枃</a-option>-->
+<!--            </a-select>-->
+<!--          </a-form-item>-->
+          <a-form-item field="embd_id" label="宓屽叆妯″瀷">
+            <a-select :size="'large'" v-model="form.embd_id" placeholder="璇烽�夋嫨 ..." :disabled="kbObj.chunk_num && kbObj.token_num">
+              <!-- <a-optgroup  :label="index" v-for="(item,index) in mobileData" :key=index>
+                <a-option
+                  v-for="(obj) in item"
+                  :key='obj.fid'
+                  :value="obj.llm_name"
+                >
+                  {{obj.llm_name}}
+                </a-option>
+              </a-optgroup> -->
+              <a-option
+                  v-for="(item,index) in mobileData"
+                  :key='item.name'
+                  :value="item.name"
+                >
+                  {{item.name}}
+                </a-option>
             </a-select>
           </a-form-item>
-          <a-form-item field="section" label="宓屽叆妯″瀷" :rules="[{match:/section one/,message:'璇烽�夋嫨'}]">
-            <a-select v-model="form.section" placeholder="璇烽�夋嫨" allow-clear>
-              <a-option value="section one">Section One</a-option>
-              <a-option value="section two">Section Two</a-option>
-              <a-option value="section three">Section Three</a-option>
+          <a-form-item field="parser_id" label="瑙f瀽鏂规硶">
+            <a-select v-model="form.parser_id" placeholder="璇烽�夋嫨" :disabled="!!(kbObj.chunk_num  && kbObj.token_num)" >
+              <a-option v-for="item in parser_ids" :key="item.value" :label="item.name" :value="item.value"></a-option>
             </a-select>
           </a-form-item>
-          <a-form-item field="section" label="瑙f瀽鏂规硶" :rules="[{match:/section one/,message:'璇烽�夋嫨'}]">
-            <a-select v-model="form.section" placeholder="璇烽�夋嫨" allow-clear>
-              <a-option value="section one">Section One</a-option>
-              <a-option value="section two">Section Two</a-option>
-              <a-option value="section three">Section Three</a-option>
-            </a-select>
+          <a-form-item field="slider" label="鍧桾oken鏁�">
+            <a-slider v-model="form.chunk_token_num" :min="0" :max="2048"  show-input />
           </a-form-item>
-          <a-form-item field="slider" label="鍧桾oken鏁�"
-                       :rules="[{type:'number', min:5,message:'slider is min than 5'}]">
-            <a-slider v-model="form.score" :max="10" />
-            <a-input-number v-model="form.score" :style="{width:'100px',marginLeft:'2rem',borderRadius:'4px'}"
-                            placeholder="Please Enter" class="input-demo" :min="10" :max="1000" />
-          </a-form-item>
-          <a-form-item field="slider" label="甯冨眬璇嗗埆" :rules="[{type:'number', min:5,message:'slider is min than 5'}]">
-            <a-space direction="vertical" size="large">
-              <a-switch v-model="form.score" checked-value="yes" unchecked-value="no" />
+          <a-form-item  label="甯冨眬璇嗗埆" >
+            <a-space direction="vertical">
+              <a-switch v-model="form.layout_recognize" size="small" />
             </a-space>
           </a-form-item>
           <a-form-item field="raptor" label="浣跨敤鍙洖澧炲己RAPTOR绛栫暐">
-            <a-space direction="vertical" size="large">
-              <a-switch v-model="form.raptor" @change="onChangeRAPTOR" />
-            </a-space>
+            <a-switch v-model="form.use_raptor" size="small" />
           </a-form-item>
-          <div v-if="form.raptor">
-            <a-form-item field="section" label="鎻愮ず璇�">
-              <a-textarea style="height: 10rem;border: 1px solid  var(--color-fill-3);border-radius: 4px" placeholder=""
-                          allow-clear />
+          <div v-if="form.use_raptor">
+            <a-form-item field="prompt" label="鎻愮ず璇�">
+              <a-textarea
+                v-model="form.prompt"
+                style="height: 10rem;border: 1px solid  var(--color-fill-3);border-radius: 4px" placeholder="璇峰~鍐欐彁绀鸿瘝"  />
             </a-form-item>
-            <a-form-item field="slider" label="鏈�澶oken鏁�"
-                         :rules="[{type:'number', min:5,message:'slider is min than 5'}]">
-              <a-slider v-model="form.score" :max="10" />
-              <a-input-number v-model="form.score" :style="{width:'100px',marginLeft:'2rem',borderRadius:'4px'}"
-                              placeholder="Please Enter" class="input-demo" :min="10" :max="1000" />
+            <a-form-item field="slider" label="鏈�澶oken鏁�">
+              <a-slider v-model="form.max_token" :min="0" :max="2048" show-input/>
             </a-form-item>
-            <a-form-item field="slider" label="闃堝��" :rules="[{type:'number', min:5,message:'slider is min than 5'}]">
-              <a-slider v-model="form.score" :max="10" />
-              <a-input-number v-model="form.score" :style="{width:'100px',marginLeft:'2rem',borderRadius:'4px'}"
-                              placeholder="Please Enter" class="input-demo" :min="10" :max="1000" />
+            <a-form-item field="slider" label="闃堝��" >
+              <a-slider v-model="form.threshold"  :step="0.01" :min="0" :max="1"  show-input/>
             </a-form-item>
-            <a-form-item field="slider" label="鏈�澶ц仛绫绘暟"
-                         :rules="[{type:'number', min:5,message:'slider is min than 5'}]">
-              <a-slider v-model="form.score" :max="10" />
-              <a-input-number v-model="form.score" :style="{width:'100px',marginLeft:'2rem',borderRadius:'4px'}"
-                              placeholder="Please Enter" class="input-demo" :min="10" :max="1000" />
+            <a-form-item field="slider" label="鏈�澶ц仛绫绘暟">
+              <a-slider v-model="form.max_cluster" :min="1" :max="1024" show-input/>
             </a-form-item>
-            <a-form-item field="slider" label="闅忔満绉嶅瓙"
-                         :rules="[{type:'number', min:5,message:'slider is min than 5'}]">
-              <a-input-number v-model="form.score" :style="{width:'300px',marginRight:'1rem',borderRadius:'4px'}"
+            <a-form-item field="slider" label="闅忔満绉嶅瓙" v-model="form.random_seed">
+              <a-input-number v-model="form.random_seed" :style="{width:'300px',marginRight:'1rem',borderRadius:'4px'}"
                               placeholder="璇疯緭鍏�" class="input-demo" :min="10" :max="100" />
-              <a-button type="primary" @click="">
+              <a-button type="primary" @click="randomNumber">
                 <icon-plus />
               </a-button>
-
             </a-form-item>
 
           </div>
@@ -139,8 +98,8 @@
           <a-form-item>
             <div style="width: 100%;text-align: right">
               <a-space>
-                <a-button type="primary" html-type="submit">淇濆瓨</a-button>
-                <!--               <a-button @click="$refs.formRef.resetFields()">Reset</a-button>-->
+                <a-button @click="cancelConfig">鍙栨秷</a-button>
+                <a-button :loading="loading" type="primary" html-type="submit">淇濆瓨</a-button>
               </a-space>
             </div>
           </a-form-item>
@@ -150,7 +109,7 @@
     <div class="main-container-rt">
       <section data-inspector-line="34" data-inspector-column="4"
                data-inspector-relative-path="src\pages\add-knowledge\components\knowledge-setting\category-panel.tsx"
-               class="categoryPanelWrapper___yI4rY" ><h4
+               class="categoryPanelWrapper___yI4rY"><h4
         class="ant-typography topTitle___tNiB9 css-dev-only-do-not-override-1wxecgq" data-inspector-line="37"
         data-inspector-column="10"
         data-inspector-relative-path="src\pages\add-knowledge\components\knowledge-setting\category-panel.tsx">"General"
@@ -198,120 +157,156 @@
 </template>
 
 <script lang="ts" setup>
-import { onMounted, onBeforeMount, reactive, ref } from "vue";
+import { onMounted, onBeforeMount, reactive, ref, nextTick } from "vue";
 import { Message } from "@arco-design/web-vue";
-
-const props = defineProps({
-  record: {
-    type: Object,
-    default: () => {
-      return {};
-    }
-  }
+import { queryModelList,kbUpdate,getKnowledgeBaseModel } from "@/api/kbList";
+import message from "@arco-design/web-vue/es/message";
+import useLoading from "@/hooks/loading";
+const { loading,setLoading } = useLoading(true);
+const scrollContainer = ref();
+const props =  defineProps(['kbtenantInfo'])
+const emit =  defineEmits(['cancleConfig','saveConfig'])
+// 瑙f瀽鏂规硶鍒楄〃
+let parser_ids = props.kbtenantInfo.parser_ids.split(",").map((item) => {
+  const [value1, value2] = item.split(":");
+  return {
+    name: value2,
+    value: value1
+  };
 });
 
-
-const visible = ref(false);
-const configIsShow = ref(false);
-const loading = ref(false);
-const formRef = ref(null);
-
+let kbObj = reactive({});
+let avatarShow = ref(true);
 
 const form = reactive({
-  size: "medium",
-  name: "",
-  age: undefined,
-  section: "0",
-  province: "haidian",
-  options: [],
-  date: "",
-  time: "",
-  radio: "radio one",
-  slider: 5,
-  score: 5,
-  switch: false,
-  multiSelect: ["section one"],
-  treeSelect: "",
-  raptor: false
+  name: '',
+  avatar: '',//澶村儚
+  max_token: 600,
+  threshold: 0.32,
+  max_cluster: 233,
+  random_seed: 1500,
+  chunk_token_num: 384,
+  use_raptor: false,
+  pages: {},
+  prompt: "璇锋�荤粨浠ヤ笅娈佃惤銆� 灏忓績鏁板瓧锛屼笉瑕佺紪閫犮�� 娈佃惤濡備笅锛歕n" +
+    "      {cluster_content}\n" +
+    "浠ヤ笂灏辨槸浣犻渶瑕佹�荤粨鐨勫唴瀹广��",
+  description: "",
+  language: "English",
+  permission: "",
+  embd_id: "",
+  parser_id: '',
+  layout_recognize: true
 });
-const options = [
-  {
-    value: "beijing",
-    label: "Beijing",
-    children: [
-      {
-        value: "chaoyang",
-        label: "ChaoYang",
-        children: [
-          {
-            value: "datunli",
-            label: "Datunli"
-          }
-        ]
-      },
-      {
-        value: "haidian",
-        label: "Haidian"
-      },
-      {
-        value: "dongcheng",
-        label: "Dongcheng"
-      },
-      {
-        value: "xicheng",
-        label: "XiCheng"
-      }
-    ]
-  },
-  {
-    value: "shanghai",
-    label: "Shanghai",
-    children: [
-      {
-        value: "shanghaishi",
-        label: "Shanghai",
-        children: [
-          {
-            value: "huangpu",
-            label: "Huangpu"
-          }
-        ]
-      }
-    ]
-  }
-];
 
-
-const sayHello = () => {
-  Message.info("hello");
-};
-
+const rules = {
+  name: [
+    {
+      required: true,
+      message:'鐭ヨ瘑搴撳悕绉颁笉鍏佽涓虹┖',
+    },
+  ],
+  embd_id: [
+    {
+      required: true,
+      message:'璇烽�夋嫨',
+    },
+  ],
+  parser_id: [
+    {
+      required: true,
+      message:'璇烽�夋嫨',
+    },
+  ],
+  prompt: [
+    {
+      required: true,
+      message:'鎻愮ず璇嶄笉鍏佽涓虹┖',
+    },
+  ],
+}
+let visible = ref(false);
+const formRef = ref();
+const modelList = ref({});
+const mobileData= ref<any>([])
 const file = ref();
 
-const onChange = (_, currentFile) => {
-  file.value = {
-    ...currentFile
-    // url: URL.createObjectURL(currentFile.file),
-  };
+const uploadAction = '/api/v1/llm/upload'; // 鏇挎崲涓轰綘鐨勪笂浼燗PI
+const fileList = ref([]);
+const imageUrls = ref([]);
+const httpUrl = localStorage.getItem('httpUrl');
+
+const updateFileList = (newFileList) => {
+  fileList.value = newFileList;
+  console.log(newFileList, 88);
 };
-const onProgress = (currentFile) => {
-  file.value = currentFile;
+
+const handleSuccess = (urls) => {
+  imageUrls.value = urls; // 鎷垮埌涓婁紶鐨勫浘鐗囧湴鍧�
+  form.avatar = urls[0];
 };
 
 
-const handleSubmit = ({ values, errors }) => {
-  console.log("values:", values, "\nerrors:", errors);
+const handleSubmit = async ({ values, errors }) => {
+  if (errors){
+    return;
+  }
+  let parms = {
+      name: form.name,
+      avatar: form.avatar,
+      description: form.description,
+      language: form.language,
+      permission: form.permission,
+      embd_id: form.embd_id,
+      parser_id: form.parser_id,
+      parser_config: {
+        chunk_token_num: form.chunk_token_num,
+        layout_recognize: form.layout_recognize,
+      },
+      kb_id: kbObj.id,
+   }
+   if(form.use_raptor){
+     parms.parser_config.raptor = {
+       use_raptor: form.use_raptor,
+       prompt: form.prompt,
+       max_token: form.max_token,
+       threshold: form.threshold,
+       max_cluster: form.max_cluster,
+       random_seed: form.random_seed,
+     };
+   }
+   try {
+     setLoading(true)
+    const data = await kbUpdate(parms);
+    if(data.code == '0'){
+      Message.success("閰嶇疆鎴愬姛");
+      // window.location.reload();
+      emit('saveConfig')
+
+    }
+    setLoading(false)
+
+  } catch (err) {
+    Message.error(err.message);
+     setLoading(false)
+  }
+
+
+
 };
 
-
-const onChangeRAPTOR = () => {
-  console.log(form.raptor);
-};
+const cancelConfig = () => {
+    emit('cancleConfig')
+}
 
 
-const handleClick = () => {
-  visible.value = true;
-};
+function randomNumber() {
+  // 鐢熸垚涓�涓粙浜巑in鍜宮ax涔嬮棿鐨勯殢鏈烘暣鏁帮紙鍖呭惈min鍜宮ax锛�
+  const min = 1; // 鏈�灏忓��
+  const max = 10000; // 鏈�澶у��
+  form.random_seed = Math.floor(Math.random() * (max - min + 1)) + min;
+}
+
 const handleBeforeOk = (done) => {
   formRef.value.validate().then(res => {
     console.log("form:", form);
@@ -323,31 +318,92 @@
     }
   });
 };
-const handleCancel = () => {
-  visible.value = false;
-};
+const handleOpened =(el) => {
+  Object.assign(form,{
 
-const handleOpened = (el) => {
-  Object.assign(form, {
-    name: "",// 鐢ㄦ埛鍚�
-    nameJoin: "",// 鏄电О
-    post: "",// 宀椾綅
-    txt: ""// 澶囨敞
   });
-  formRef.value.resetFields();
-  console.log(props.record, "record");
-  // if(props.edit == 'edit'){
-  //   Object.assign(form,props.record);
-  // }
+  // formRef.value.resetFields();
+}
+
+const queryModel = async (params) => {
+  try {
+    const data = await getKnowledgeBaseModel(params);
+    // const res =await queryModelList(params)
+    // console.log(data.data, '澶фā鍨嬪垪琛�');
+    modelList.value = data.data
+    for(let key in data.data) {
+      if (data.data.hasOwnProperty(key)) { // 纭繚鏄璞¤嚜鏈夊睘鎬э紝涓嶆槸鍘熷瀷閾句笂鐨勫睘鎬�
+        if(data.data[key].llm.length > 0){
+          mobileData.value= data.data[key].llm.filter(item => item.type == "embedding")
+        }
+      }  
+  
+    }
+
+   
+  } catch (err) {
+    // you can report use errorHandler or other
+  } finally {
+
+  }
 };
 
-onBeforeMount(() => {
+const changekbObj = (value) => {
+  
+   formRef.value.resetFields();
+  nextTick(()=>{
+    kbObj = value;
+    console.log(kbObj, 'kbObj');
+    let configObj = {
+      name: kbObj.name,
+      avatar: kbObj.avatar,
+      pages:  kbObj.parser_config.pages,
+      chunk_token_num:  kbObj.parser_config.chunk_token_num,
+      description: kbObj.description,
+      language: "English",
+      permission: kbObj.permission,
+      embd_id: kbObj.embd_id || props.kbtenantInfo.embd_id,
+      parser_id: kbObj.parser_id,
+      layout_recognize: true,
+    }
+    let raptor = {}
+    if(kbObj.parser_config && kbObj.parser_config.raptor){
+      raptor = kbObj.parser_config.raptor;
+      Object.assign(form,{
+        ...configObj,
+        ...raptor,
+        use_raptor: kbObj.parser_config.raptor.use_raptor,
+      });
+    }else{
+      Object.assign(form,{
+        ...configObj,
+        use_raptor: false,
+      });
+    }
+    imageUrls.value = [kbObj.avatar];
+    console.log(form,'閰嶇疆椤甸潰琛ㄥ崟淇℃伅');
+    avatarShow.value = false;
+    setTimeout(() => {
+      avatarShow.value = true;
+    },100);
+    scrollContainer.value.scrollTop = 0;
+  })
+}
 
-});
-onMounted(() => {
+defineExpose({
+  changekbObj
+})
 
 
-});
+onBeforeMount(()=>{
+  setLoading(false)
+  queryModel({})
+})
+onMounted(()=>{
+
+
+})
+
 </script>
 
 <script lang="ts">
@@ -366,15 +422,16 @@
   justify-content: space-between;
   height: 100%;
   overflow: auto;
-  //background: #626aea;
-  background: #ffffff;
+  border-radius: 8px;
+  background: var(--color-bg-2);
   padding-top: 80px;
+
   &-lf {
     width: 40%;
     //height: 100%;
     //border: 1px solid #cccccc;
     border-radius: 10px;
-
+    //border: 1px solid var(--color-fill-3);
     &-top {
       width: 100%;
       height: 60px;
@@ -427,9 +484,10 @@
     border-radius: 10px;
     overflow: hidden;
     padding: 20px;
-    section{
+    section {
       width: 100%;
-      color: #333333;
+      //color: #333333;
+      color: var(--color-text-1);
     }
   }
 }

--
Gitblit v1.8.0