zhangxiao
2024-08-08 8b6d79d198707624b1aa3ee004bed3991ac454f3
Merge branch 'master' of http://192.168.5.5:10010/r/web/flow_web
6个文件已修改
294 ■■■■■ 已修改文件
src/api/kbList.ts 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/authority/resource/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dmx/IntelligentAgent/components/agentConfig.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dmx/knowledgeLib/eidtDetails.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dmx/knowledgeLib/tool.vue 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yarn.lock 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/kbList.ts
@@ -205,10 +205,14 @@
export function achunkSet(params) {
  return axios.post('/api/v1/chunk/set', params);
}
export function achunkGet(params) {
  return axios.get('/api/v1/chunk/get', {params});
}
src/views/authority/resource/index.vue
@@ -8,7 +8,6 @@
          :bordered="false"
          style=" 'width': '100%';   height: calc(100vh - 250px); 'overflow-y': 'auto' "
        >
          <a-button @click="() => onIconClick(null)">新增父级菜单</a-button>
          <a-tree
            class="tree-demo"
            draggable
src/views/dmx/IntelligentAgent/components/agentConfig.vue
@@ -283,7 +283,7 @@
    empty_response: "",
    prologue: "你好! 我是你的助理,有什么可以帮到你的吗?",
    quote: true,
    self_rag: true,
    self_rag: false,
    system: "你是一个智能助手,请总结知识库的内容来回答问题,请列举知识库中的数据详细回答。当所有知识库内容都与问题无关时,你的回答必须包括“知识库中未找到您要的答案!”这句话。" +
      "回答需要考虑聊天历史。\n        以下是知识库:\n        {knowledge}\n        以上是知识库。",
    parameters: [
src/views/dmx/knowledgeLib/eidtDetails.vue
@@ -18,7 +18,7 @@
        <a-textarea
          v-model="form.content_with_weight"
          placeholder=""
          style="height: 100px"
          style="height: 100px;overflow: auto;"
          auto-size
        />
      </a-form-item>
@@ -26,10 +26,10 @@
        <div style="width: auto">
          <a-tag
            v-for="(item, index) in form.important_kwd"
            :key="index"
            :key="item"
            closable
            bordered
            @close="form.important_kwd.splice(index, 1)"
            @close="deleteKey(item)"
            style="margin-right: 10px"
          >
            {{ item }}
@@ -49,17 +49,17 @@
        </div>
      </a-form-item>
      <div>
        <a-divider style="margin: 10px 0" />
        <a-switch size="small" />
        <span style="color: var(--color-text-2)">启用</span>
        <a-button type="text" style="color: var(--color-text-2)">
          <template #icon>
            <icon-delete />
          </template>
          删除
        </a-button>
      </div>
<!--      <div>-->
<!--        <a-divider style="margin: 10px 0" />-->
<!--        <a-switch size="small" />-->
<!--        <span style="color: var(&#45;&#45;color-text-2)">启用</span>-->
<!--        <a-button type="text" style="color: var(&#45;&#45;color-text-2)">-->
<!--          <template #icon>-->
<!--            <icon-delete />-->
<!--          </template>-->
<!--          删除-->
<!--        </a-button>-->
<!--      </div>-->
      <a-form-item>
        <div style="width: 100%; text-align: right">
          <a-button @click="visible = false">取消</a-button>
@@ -73,12 +73,12 @@
</template>
<script lang="ts" setup>
  import { onMounted, onBeforeMount, reactive, ref } from 'vue';
  import { achunkCreate } from '@/api/kbList';
import { onMounted, onBeforeMount, reactive, ref, nextTick } from "vue";
import { achunkCreate, achunkSet } from "@/api/kbList";
  const props = defineProps(['item']);
  const visible = ref(false);
  const visible =defineModel('eidtDilVisible');
  const emit = defineEmits(['canplaythrough']);
  const keyVisible = ref(false);
  const loading = ref(false);
  const form = reactive({
@@ -98,13 +98,17 @@
  };
  const handleSubmit = async ({ values, errors }) => {
    console.log(props.item.id);
    if (!errors) {
      const res = await achunkCreate({
      const res = await achunkSet({
        content_with_weight: values.content_with_weight,
        important_kwd: values.important_kwd,
        doc_id: props.item.id,
        doc_id: props.item.doc_id,
        chunk_id: props.item.chunk_id,
      });
      if (res.code === 0) {
        visible.value = false;
        emit('canplaythrough');
      }
    }
  };
@@ -112,9 +116,6 @@
    visible.value = true;
  };
  defineExpose({
    handleClick,
  });
  const handleBeforeOk = (done) => {
    formRef.value.validate().then((res) => {
      console.log('form:', form);
@@ -125,15 +126,22 @@
  };
  const handleOpened = (el) => {
    Object.assign(form, {
      content_with_weight: '',
      important_kwd: [],
      important_kwd_key: '',
    });
    console.log(props.item);
    nextTick(()=>{
      Object.assign(form, props.item);
      console.log(form.important_kwd);
    })
    formRef.value.resetFields();
    keyVisible.value = false;
  };
  const deleteKey = (row) => {
    console.log(form.important_kwd);
    console.log(row);
    // form.important_kwd.splice(index, 1);
    form.important_kwd = form.important_kwd.filter((item) => item !== row);
  };
  const addKey = () => {
    form.important_kwd_key = '';
    formInput.value.focus();
src/views/dmx/knowledgeLib/tool.vue
@@ -15,7 +15,10 @@
  >
    <a-tabs default-active-key="1">
      <a-tab-pane key="1">
        <template #title> <icon-calendar /> 解析方法 </template>
        <template #title>
          <icon-calendar />
          解析方法
        </template>
        <div style="width: 100%">
          <div style="display: flex; align-items: center">
            <div> 解析方法: </div>
@@ -38,8 +41,14 @@
              auto-label-width
              @submit="handleSubmit"
            >
              <a-divider style="margin-top: 10px" />
              <a-form-item field="slider" label="块Token数">
              <a-divider style="margin-top: 10px"
                         v-if="
                form.parser_id === 'naive'" />
              <a-form-item
                field="slider"
                label="块Token数"
                v-if="
                form.parser_id === 'naive'">
                <a-slider
                  v-model="form.chunk_token_num"
                  :min="0"
@@ -47,8 +56,18 @@
                  show-input
                />
              </a-form-item>
              <a-divider style="margin-top: 10px" />
              <a-form-item field="raptor" label="使用召回增强RAPTOR策略">
              <a-divider style="margin-top: 10px"
                         v-if="form.parser_id === 'naive' ||
                           form.parser_id === 'qa'||
                           form.parser_id === 'manual' ||
                           form.parser_id === 'laws' ||
                           form.parser_id === 'book'" />
              <a-form-item field="raptor" label="使用召回增强RAPTOR策略"
                           v-if="form.parser_id === 'naive' ||
                           form.parser_id === 'qa'||
                           form.parser_id === 'manual' ||
                           form.parser_id === 'laws' ||
                           form.parser_id === 'book'">
                <a-space direction="vertical" size="large">
                  <a-switch
                    v-model="form.use_raptor"
@@ -125,7 +144,8 @@
                    style="margin-left: 10px"
                    type="primary"
                    html-type="submit"
                    >确定</a-button
                  >确定
                  </a-button
                  >
                </div>
              </a-form-item>
@@ -134,7 +154,10 @@
        </div>
      </a-tab-pane>
      <a-tab-pane key="2">
        <template #title> <icon-clock-circle /> 创建解析块 </template>
        <template #title>
          <icon-clock-circle />
          创建解析块
        </template>
        <div class="details">
          <div class="details-header">
            <div
@@ -158,8 +181,10 @@
                  type="outline"
                  class="button"
                  style="margin-right: 10px"
                  >批量<icon-down style="margin-left: 4px"
                /></a-button>
                >批量
                  <icon-down style="margin-left: 4px"
                  />
                </a-button>
                <template #content>
                  <a-space direction="vertical">
                    <a-checkbox
@@ -246,8 +271,10 @@
                  type="outline"
                  class="button"
                  style="margin-right: 10px"
                  ><icon-sort
                /></a-button>
                >
                  <icon-sort
                  />
                </a-button>
                <template #content>
                  <a-radio-group
                    v-model="available_int"
@@ -274,8 +301,8 @@
                <div
                  class="groupList"
                  :class="{
                    groupActive: keyBg == '1',
                    groupNoActive: keyBg != '1',
                    groupActive: keyBg == index,
                    groupNoActive: keyBg != index,
                  }"
                  v-for="(item, index) in listData"
                  :key="index"
@@ -283,8 +310,8 @@
                  <a-checkbox :value="item.chunk_id"></a-checkbox>
                  <div
                    class="groupList-content emphaRed"
                    @click="groupListContentClick('1')"
                    @dblclick="contentClick(1)"
                    @click="groupListContentClick(index)"
                    @dblclick="contentClick(item)"
                    v-html="item.content_with_weight"
                  >
                  </div>
@@ -301,7 +328,12 @@
            </a-spin>
          </div>
        </div>
        <eidtDetails ref="eidtDil"></eidtDetails>
        <eidtDetails
          ref="eidtDil"
          :item="eidtDilinfo"
          v-model:eidtDilVisible="eidtDilVisible"
          @canplaythrough="canplaythrough"
        ></eidtDetails>
      </a-tab-pane>
    </a-tabs>
  </a-modal>
@@ -314,25 +346,28 @@
    reactive,
    ref,
    computed,
    watch,
  } from 'vue';
  import { Message } from '@arco-design/web-vue';
  watch
} from "vue";
import { Message } from "@arco-design/web-vue";
  import {
    kbdocumentchangeparser,
    achunkCreate,
    queryChunkList,
    chunkSwitch,
    chunkRm,
  } from '@/api/kbList';
  import addDetails from '@/views/dmx/knowledgeLib/addDetails.vue';
  import eidtDetails from '@/views/dmx/knowledgeLib/eidtDetails.vue';
  chunkRm, achunkGet
} from "@/api/kbList";
import addDetails from "@/views/dmx/knowledgeLib/addDetails.vue";
import eidtDetails from "@/views/dmx/knowledgeLib/eidtDetails.vue";
  const visible = ref(false);
  const loading = ref(false);
  const radio = ref('1');
  const keyBg = ref('');
const radio = ref("1");
const keyBg = ref("");
  const eidtDil = ref();
const eidtDilVisible = ref(false);
const eidtDilinfo = reactive({});
  const props = defineProps(['kbtenantInfo', 'item', 'kbdetail']);
const props = defineProps(["kbtenantInfo", "item", "kbdetail"]);
  // const emit =  defineEmits(['upTabdateItem'])
  let threshold = computed(() => {
@@ -341,19 +376,35 @@
  const kbtenantInfo = props.kbtenantInfo;
  let parser_ids = kbtenantInfo.parser_ids.split(',').map((item) => {
    const [value1, value2] = item.split(':');
let parser_ids = kbtenantInfo.parser_ids.split(",").map((item) => {
  const [value1, value2] = item.split(":");
    return {
      name: value2,
      value: value1,
    value: value1
    };
  });
// 过滤解析方法
const filterParserArr = [
  'naive',
  'qa',
  'resume',
  'manual',
  'book',
  'laws',
  'one',
]
  const isBtn = ref(true);
  const closeSlelct = () => {
    window.addEventListener('click', (event) => {
      if (!event.target.closest('.space_search') && !isBtn.value) {
  window.addEventListener("click", (event) => {
    if (!event.target.closest(".space_search") && !isBtn.value) {
        isBtn.value = true;
        // form.keywords = '';
      }
@@ -367,7 +418,7 @@
  });
  const form = reactive({
    parser_id: props.item.parser_id,
  parser_id: '',
    doc_id: props.item.id,
    max_token: 698,
    threshold: 0.3,
@@ -375,21 +426,21 @@
    random_seed: 1500,
    chunk_token_num: 128,
    use_raptor: false,
    keywords: '',
  keywords: "",
    pages: {},
    prompt:
      '请总结以下段落。 小心数字,不要编造。 段落如下:\n' +
      '      {cluster_content}\n' +
      '以上就是你需要总结的内容。',
    "请总结以下段落。 小心数字,不要编造。 段落如下:\n" +
    "      {cluster_content}\n" +
    "以上就是你需要总结的内容。"
  });
  const formRef = ref(null);
  const rules = {
    prompt: [
      {
        required: true,
        message: '提示词不允许为空',
      },
    ],
      message: "提示词不允许为空"
    }
  ]
  };
  const listData = ref([]);
@@ -397,6 +448,7 @@
  const formatter = (value) => {
    return value / 100;
  };
  function randomNumber() {
    // 生成一个介于min和max之间的随机整数(包含min和max)
    const min = 1; // 最小值
@@ -416,16 +468,16 @@
            max_token: form.max_token,
            threshold: form.threshold,
            max_cluster: form.max_cluster,
            random_seed: form.random_seed,
          random_seed: form.random_seed
          },
          chunk_token_num: form.chunk_token_num,
          pages: [],
        },
        pages: []
      }
      });
      if (data.code == 0) {
        Message.success('配置成功');
      Message.success("配置成功");
      } else {
        Message.error('配置失败');
      Message.error("配置失败");
      }
      visible.value = false;
    }
@@ -438,14 +490,33 @@
    visible.value = false;
  };
  const contentClick = (done) => {
    eidtDil.value.handleClick();
const contentClick = async (item) => {
  try {
    const data = await achunkGet({
      chunk_id: item.chunk_id
    });
    // console.log(data.data);
    Object.assign(eidtDilinfo, data.data);
    eidtDilVisible.value = true;
  } catch (error) {
    Message.error("获取失败");
  }
  };
  const handleOpened = (el) => {
    // console.log('props',props.kbtenantInfo);
    // console.log('props',props.item);
  console.log('props',props.item);
    // console.log('props',props.kbdetail);
    console.log(parser_ids, 'parser_ids');
  console.log(parser_ids, "parser_ids");
  let parser_id = props.item.parser_id;
  parser_ids.forEach((item) => {
    if (item.name == parser_id) {
      form.parser_id = item.value;
    }
  });
    // Object.assign(form,{
    //   name: '',// 用户名
    //   nameJoin: '',// 昵称
@@ -456,13 +527,14 @@
    console.log(props.item.id);
  };
  const onChangeRAPTOR = () => {};
const onChangeRAPTOR = () => {
};
  const indeterminate = ref(false);
  const checkedAll = ref(false);
  const data = ref([]);
  const switchType = ref(false);
  const available_int = ref('');
const available_int = ref("");
  const onRadioChange = () => {
    console.log(radio.value);
  };
@@ -487,7 +559,7 @@
  //批量启用删除禁用
  const addBlock = (type) => {
    if (data.value.length == 0) {
      Message.error('请选择要操作的数据');
    Message.error("请选择要操作的数据");
      return;
    }
    if (type == 3) {
@@ -496,16 +568,16 @@
      let params = {
        chunk_ids: data.value,
        available_int: type,
        doc_id: props.item.id,
      doc_id: props.item.id
      };
      chunkSwitch(params).then((res) => {
        if (res.code == 0) {
          Message.success('操作成功');
        Message.success("操作成功");
          getList();
          checkedAll.value = false;
          data.value = [];
        } else {
          Message.error('操作失败');
        Message.error("操作失败");
        }
      });
    }
@@ -524,16 +596,16 @@
  };
  const isLoading = ref(true);
  // 自定义加载提示文本
  const tip = '加载中,请稍候...';
const tip = "加载中,请稍候...";
  //获取列表
  const getList = async () => {
    let params = {
      doc_id: props.item.id,
      keywords: form.keywords,
      page: 1,
      size: 10000,
    size: 10000
    };
    if (available_int.value !== '') {
  if (available_int.value !== "") {
      params.available_int = available_int.value;
    }
    await queryChunkList(params).then((res) => {
@@ -557,15 +629,15 @@
    let params = {
      chunk_ids: [val.chunk_id],
      available_int: val.available_int,
      doc_id: props.item.id,
    doc_id: props.item.id
    };
    chunkSwitch(params).then((res) => {
      console.log(res);
      if (res.code == 0) {
        Message.success('更新成功');
      Message.success("更新成功");
        getList();
      } else {
        Message.error('更新失败');
      Message.error("更新失败");
      }
    });
  };
@@ -574,47 +646,54 @@
  const deleteChunk = () => {
    let params = {
      chunk_ids: data.value,
      doc_id: props.item.id,
    doc_id: props.item.id
    };
    chunkRm(params).then((res) => {
      console.log(res);
      if (res.code == 0) {
        Message.success('删除成功');
      Message.success("删除成功");
        getList();
      } else {
        Message.error('删除失败');
      Message.error("删除失败");
      }
    });
  };
  onBeforeMount(() => {});
  onMounted(() => {
onBeforeMount(() => {
    getList();
});
onMounted(() => {
  });
</script>
<style scoped lang="less">
  .parser {
    width: 100%;
    ::v-deep .arco-btn-outline:hover,
    .arco-btn-outline,
    .arco-btn-outline[type='button'] {
      color: #2a2a2b;
      border: 1px solid #2a2a2b;
    }
    .button {
      //color: #2a2a2b!important;
    }
  }
  ::-webkit-scrollbar {
    display: none;
  }
  .groupMain {
    width: 100%;
    height: 500px;
    overflow: auto;
    display: flex;
    justify-content: center;
    .groupList {
      display: flex;
      padding: 24px;
@@ -623,6 +702,7 @@
      border: 1px solid #f0f0f0;
      margin-bottom: 20px;
      overflow: auto;
      .groupList-content {
        width: 700px;
        //height: 100px;
@@ -637,6 +717,7 @@
      }
    }
  }
  :deep(.emphaRed em) {
    color: red !important;
  }
@@ -644,6 +725,7 @@
  .groupActive {
    background: #eff8ff;
  }
  .groupNoActive {
    background: var(--color-bg-1);
    color: var(--color-text-1);
yarn.lock
@@ -621,6 +621,11 @@
    "@jridgewell/resolve-uri" "^3.1.0"
    "@jridgewell/sourcemap-codec" "^1.4.14"
"@microsoft/fetch-event-source@^2.0.1":
  version "2.0.1"
  resolved "https://registry.npmmirror.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz#9ceecc94b49fbaa15666e38ae8587f64acce007d"
  integrity sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==
"@mrmlnc/readdir-enhanced@^2.2.1":
  version "2.2.1"
  resolved "https://registry.npmmirror.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz"