src/views/dmx/knowledgeLib/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/dmx/knowledgeLib/test.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/dmx/knowledgeLib/tool.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/views/dmx/knowledgeLib/index.vue
@@ -6,51 +6,37 @@ <div class="lf-container-top"> <a-input-search :placeholder="$t('cardList.searchInput.placeholder')" style="width: 130px" style="width: 130px;" /> <addKnow @knowledgeData="knowledgeData"></addKnow> </div> <div class="lf-container-down"> <a-scrollbar style="height: 56rem; overflow: auto"> <a-scrollbar style="height:56rem;overflow: auto;"> <div class="tab" v-for="(tab, index) in tabs" :key="index" @click="selectTab(index, tab)" :class="{ active: selectedTab === index }" @click="selectTab(index,tab)" :class="{ 'active': selectedTab === index }" > {{ tab.name }} <a-popover position="bl"> <icon-more :style="{ position: 'absolute', top: '10px', right: '20px' }" /> <icon-more :style="{position: 'absolute',top:'10px',right:'20px'}"/> <template #content> <a-popconfirm content="确定删除吗?" @ok="deleteKnowledge(tab.id)" type="warning" > <span style="cursor: pointer; color: #0960bd; font-size: 12px" ><icon-delete />删除</span > <a-popconfirm content="确定删除吗?" @ok="deleteKnowledge(tab.id)" type="warning"> <span style="cursor: pointer;color: #0960bd;font-size: 12px"><icon-delete />删除</span> </a-popconfirm> </template> </a-popover> </div> </a-scrollbar> </div> </div> </div> <div class="rt-container"> <a-tabs default-active-key="1"> <a-tab-pane key="1" :title="t('dmx.list.DataSet')"> <a-tab-pane key="1" :title= "t('dmx.list.DataSet')"> <div class="rt-container-main"> <a-card ref="account" class="general-card" title="" style="padding-top: 20px" > <a-card ref="account" class="general-card" title="" style="padding-top: 20px"> <a-row> <a-col :flex="1" :span="12"> <a-form @@ -60,27 +46,15 @@ label-align="left" > <a-row :gutter="16"> <a-col :span="24" style=" margin-bottom: 10px; display: flex; justify-content: right; " > <a-col :span="24" style="margin-bottom: 10px;display: flex;justify-content: right"> <a-input-search :placeholder=" $t('cardList.searchInput.placeholder') " style="width: 200px; margin-right: 10px" :placeholder="$t('cardList.searchInput.placeholder')" style="width: 200px;margin-right: 10px" v-model="keywords" @change="search" /> <!--新建--> <add :kbobj="kbobj" @changeFetchData="changeFetchData" /> <add :kbobj="kbobj" @changeFetchData="changeFetchData"/> </a-col> </a-row> </a-form> @@ -107,11 +81,7 @@ </a-col> <a-col :span="12" style=" display: flex; align-items: center; justify-content: end; " style="display: flex; align-items: center; justify-content: end" > <!-- <a-button>--> <!-- <template #icon>--> @@ -120,13 +90,13 @@ <!-- {{ $t('searchTable.operation.download') }}--> <!-- </a-button>--> <a-tooltip :content="$t('searchTable.actions.refresh')"> <div class="action-icon"><icon-refresh size="18" /></div> <div class="action-icon" ><icon-refresh size="18" /></div> </a-tooltip> <a-dropdown @select="handleSelectDensity"> <a-tooltip :content="$t('searchTable.actions.density')"> <div class="action-icon" ><icon-line-height size="18" /></div> <div class="action-icon"><icon-line-height size="18" /></div> </a-tooltip> <template #content> <a-doption @@ -187,132 +157,84 @@ :scroll="{ y: 580 }" > <template #name="{ record }"> <!-- <icon-file style="color: #0960bd;margin-right: 4px;" />--> <icon-file style="margin-right: 4px" /> <!-- <span style="color: #0960bd;cursor: pointer" @click="fileClick">--> <!-- {{record.name}}--> <!-- </span>--> {{ record.name }} <!-- <icon-file style="color: #0960bd;margin-right: 4px;" />--> <icon-file style="margin-right: 4px;" /> <!-- <span style="color: #0960bd;cursor: pointer" @click="fileClick">--> <!-- {{record.name}}--> <!-- </span>--> {{record.name}} </template> <template #create_time="{ record }"> <span>{{ parseTime(record.create_time) }}</span> <span>{{parseTime(record.create_time)}}</span> </template> <!-- <template #parser_id="{ record }">--> <!-- <span>{{ parser_ids[record.parser_id]}}</span>--> <!-- </template>--> <!-- <template #parser_id="{ record }">--> <!-- <span>{{ parser_ids[record.parser_id]}}</span>--> <!-- </template>--> <template #status="{ record }"> <a-switch v-model="record.status" size="small" checked-value="1" unchecked-value="0" @change="handleChangeStatus(record)" /> <a-switch v-model="record.status" size="small" checked-value="1" unchecked-value="0" @change="handleChangeStatus(record)"/> </template> <template #run="{ record }"> <div style="display: flex; align-items: center"> <div style="display: flex;align-items: center;"> <div style="width: 100px"> <a-popover title="Title" v-if="record.run == '3'"> <a-tag :loading="record.loading" :color="'blue'" border >{{ $t('dmx.list.complete') }}</a-tag > <a-tag :loading="record.loading" :color="'blue'" border>{{$t('dmx.list.complete')}}</a-tag> <template #content> <p>Here is the text content</p> </template> </a-popover> <a-popover title="Title" v-if="record.run == '1'"> <a-tag :loading="record.loading" :color="'blue'" border >{{ $t('dmx.list.complete') }}</a-tag > <a-tag :loading="record.loading" :color="'blue'" border>{{$t('dmx.list.complete')}}</a-tag> <template #content> <p>Here is the text content</p> </template> </a-popover> <a-popover title="Title" v-if="record.run == '2'"> <a-tag :loading="record.loading" :color="'gold'" border >{{ $t('dmx.list.cancel') }}</a-tag > <a-tag :loading="record.loading" :color="'gold'" border>{{$t('dmx.list.cancel')}}</a-tag> <template #content> <p>Here is the text content</p> </template> </a-popover> <a-popover title="Title" v-if="record.run == '0'"> <a-tag :loading="record.loading" :color="'green'" border >{{ $t('dmx.list.NotStarted') }}</a-tag > <a-tag :loading="record.loading" :color="'green'" border>{{$t('dmx.list.NotStarted')}}</a-tag> <template #content> <p>Here is the text content</p> </template> </a-popover> </div> <div> <a-button type="text" size="large" @click="run(record)" :loading="record.loading" > <div > <a-button type="text" size="large" @click="run(record)" :loading="record.loading"> <template #icon> <icon-sync v-if="record.run == '3'" /> <icon-sync v-if="record.run == '2'" /> <icon-sync style="color: green" v-if="record.run == '1'" /> <icon-play-circle style="color: green" v-if="record.run == '0'" /> <icon-sync v-if="record.run == '3'"/> <icon-sync v-if="record.run == '2'"/> <icon-sync style="color: green" v-if="record.run == '1'"/> <icon-play-circle style="color: green" v-if="record.run == '0'"/> </template> </a-button> </div> </div> </template> <template #action="{ record }"> <tool :kbtenantInfo="kbtenantInfo" :item="record" :kbdetail="kbdetail" /> <edit :item="record" @upTabdateItem="upTabdateItem" /> <a-popconfirm :content="'确定删除吗'" type="warning" @ok="deleteItem(record)" > <a-button type="text" size="small"> <template #action="{ record }" > <tool :kbtenantInfo="kbtenantInfo" :item="record" :kbdetail="kbdetail" /> <edit :item="record" @upTabdateItem="upTabdateItem"/> <a-popconfirm :content="'确定删除吗'" type="warning" @ok="deleteItem(record)"> <a-button type="text" size="small"> <template #icon> <icon-delete /> </template> </a-button> </a-popconfirm> <a-button type="text" size="small" @click="onDownloadDocument(record)" > <a-button type="text" size="small" @click="onDownloadDocument(record)"> <template #icon> <icon-download /> </template> </a-button> <a-button type="text" size="small" @click="seeload(record)"> <a-button type="text" size="small" @click="seeload(record)"> <template #icon> <icon-eye /> </template> </a-button> </template> </a-table> </a-card> @@ -325,107 +247,89 @@ </a-tab-pane> <a-tab-pane key="3" :title="t('dmx.list.disposition')"> <div class="rt-container-main"> <config ref="configForm" :kbtenantInfo="kbtenantInfo" :kbobj="kbobj" ></config> <config ref="configForm" :kbtenantInfo="kbtenantInfo" :kbobj="kbobj"></config> </div> </a-tab-pane> </a-tabs> <!-- <div v-if="detailsShow" class="details">--> <!-- <div class="details-header">--> <!-- <div style="display: flex;align-items: center">--> <!-- <span><icon-arrow-left size="20px" style="cursor: pointer;color: #0960bd;margin: 10px" @click="goBackClick" /></span>--> <!-- <icon-file style="color: #0960bd;margin-right: 4px;" />--> <!-- <span style="">123.docx</span>--> <!-- </div>--> <!-- <div style="display: flex; align-items: center;">--> <!-- <a-radio-group v-model="position" type="button" style="margin-right: 10px">--> <!-- <a-radio value="top">{{'dmx.list.EntireArticle'}}</a-radio>--> <!-- <a-radio value="right">{{'dmx.list.omit'}}</a-radio>--> <!-- </a-radio-group>--> <!-- <a-popover position="bottom">--> <!-- <a-button type="outline" class="button" style="margin-right: 10px">{{'dmx.list.batch'}} <icon-down style="margin-left: 4px" /></a-button>--> <!-- <template #content>--> <!-- <p>Here is the text content</p>--> <!-- <p>Here is the text content</p>--> <!-- </template>--> <!-- </a-popover>--> <!-- <a-button type="outline" class="button" style="margin-right: 10px">--> <!-- <template #icon>--> <!-- <icon-search />--> <!-- </template>--> <!-- </a-button>--> <!-- <a-popover position="bottom">--> <!-- <a-button type="outline" class="button" style="margin-right: 10px"><icon-sort /></a-button>--> <!-- <template #content>--> <!-- <p>Here is the text content</p>--> <!-- <p>Here is the text content</p>--> <!-- </template>--> <!-- </a-popover>--> <!-- <addDetails></addDetails>--> <!-- </div>--> <!-- </div>--> <!-- <a-divider style="margin-top: 10px" />--> <!-- </div>--> <!-- </div> --> <!-- <div v-if="detailsShow" class="details">--> <!-- <div class="details-header">--> <!-- <div style="display: flex;align-items: center">--> <!-- <span><icon-arrow-left size="20px" style="cursor: pointer;color: #0960bd;margin: 10px" @click="goBackClick" /></span>--> <!-- <icon-file style="color: #0960bd;margin-right: 4px;" />--> <!-- <span style="">123.docx</span>--> <!-- </div>--> <!-- <div style="display: flex; align-items: center;">--> <!-- <a-radio-group v-model="position" type="button" style="margin-right: 10px">--> <!-- <a-radio value="top">{{'dmx.list.EntireArticle'}}</a-radio>--> <!-- <a-radio value="right">{{'dmx.list.omit'}}</a-radio>--> <!-- </a-radio-group>--> <!-- <a-popover position="bottom">--> <!-- <a-button type="outline" class="button" style="margin-right: 10px">{{'dmx.list.batch'}} <icon-down style="margin-left: 4px" /></a-button>--> <!-- <template #content>--> <!-- <p>Here is the text content</p>--> <!-- <p>Here is the text content</p>--> <!-- </template>--> <!-- </a-popover>--> <!-- <a-button type="outline" class="button" style="margin-right: 10px">--> <!-- <template #icon>--> <!-- <icon-search />--> <!-- </template>--> <!-- </a-button>--> <!-- <a-popover position="bottom">--> <!-- <a-button type="outline" class="button" style="margin-right: 10px"><icon-sort /></a-button>--> <!-- <template #content>--> <!-- <p>Here is the text content</p>--> <!-- <p>Here is the text content</p>--> <!-- </template>--> <!-- </a-popover>--> <!-- <addDetails></addDetails>--> <!-- </div>--> <!-- </div>--> <!-- <a-divider style="margin-top: 10px" />--> <!-- </div>--> </div> </div> <a-modal title=" " v-model:visible="visible" :footer="false" fullscreen> <!-- <docx v-if="documenttype=='docx'" previewSrc="http://192.168.20.116:1080/v1/document/get/405c3efa4d8c11ef97560242ac120006"></docx>--> <docx v-if="documenttype == 'docx'" :previewSrc="previewSrc"></docx> <excel v-if="documenttype == 'excel'" :previewSrc="previewSrc"></excel> <txtPdf v-if="documenttype == 'txtPdf'" :previewSrc="previewSrc"></txtPdf> <!-- <docx v-if="documenttype=='docx'" previewSrc="http://192.168.20.116:1080/v1/document/get/405c3efa4d8c11ef97560242ac120006"></docx>--> <docx v-if="documenttype=='docx'" :previewSrc="previewSrc"></docx> <excel v-if="documenttype=='excel'" :previewSrc="previewSrc"></excel> <txtPdf v-if="documenttype=='txtPdf'" :previewSrc="previewSrc"></txtPdf> </a-modal> </div> </div> </template> <script lang="ts" setup> import { computed, ref, reactive, watch, nextTick, onBeforeMount, onMounted, } from 'vue'; import { computed, ref, reactive, watch, nextTick, onBeforeMount, onMounted } from "vue"; import { useI18n } from 'vue-i18n'; import useLoading from '@/hooks/loading'; import { queryKbList, PolicyRecord, PolicyParams, queryKbDocumentList, deleteKnow, queryKbdetail, queryKbtenantInfo, kbdocumentrm, kbdocumentchangeparser, kbdocumentrun, kbdocumentchangeStatus, downloadFile, } from '@/api/kbList'; import { queryKbList, PolicyRecord, PolicyParams, queryKbDocumentList, deleteKnow, queryKbdetail, queryKbtenantInfo, kbdocumentrm, kbdocumentchangeparser, kbdocumentrun, kbdocumentchangeStatus,downloadFile } from "@/api/kbList"; import { Pagination } from '@/types/global'; import type { SelectOptionData } from '@arco-design/web-vue/es/select/interface'; import type { TableColumnData } from '@arco-design/web-vue/es/table/interface'; import cloneDeep from 'lodash/cloneDeep'; import Sortable from 'sortablejs'; import add from '@/views/dmx/knowledgeLib/add.vue'; import edit from '@/views/dmx/knowledgeLib/edit.vue'; import addKnow from '@/views/dmx/knowledgeLib/addKnow.vue'; import config from '@/views/dmx/knowledgeLib/config.vue'; import test from '@/views/dmx/knowledgeLib/test.vue'; import tool from '@/views/dmx/knowledgeLib/tool.vue'; import docx from '@/views/dmx/knowledgeLib/components/docx.vue'; import excel from '@/views/dmx/knowledgeLib/components/excel.vue'; import txtPdf from '@/views/dmx/knowledgeLib/components/txtPdf.vue'; import { Message } from '@arco-design/web-vue'; import { parseTime } from '@/utils'; import add from '@/views/dmx/knowledgeLib/add.vue' import edit from '@/views/dmx/knowledgeLib/edit.vue' import addKnow from '@/views/dmx/knowledgeLib/addKnow.vue' import config from '@/views/dmx/knowledgeLib/config.vue' import test from '@/views/dmx/knowledgeLib/test.vue' import tool from '@/views/dmx/knowledgeLib/tool.vue' import docx from '@/views/dmx/knowledgeLib/components/docx.vue' import excel from '@/views/dmx/knowledgeLib/components/excel.vue' import txtPdf from '@/views/dmx/knowledgeLib/components/txtPdf.vue' import { Message } from "@arco-design/web-vue"; import { parseTime } from "@/utils"; type SizeProps = 'mini' | 'small' | 'medium' | 'large'; type Column = TableColumnData & { checked?: true }; const account = ref(null); const account = ref(null) const generateFormModel = () => { return { number: '', @@ -444,47 +348,46 @@ const showColumns = ref<Column[]>([]); const size = ref<SizeProps>('medium'); let visible = ref(false); let keywords = ref(''); let detailsShow = ref(false); let selectedTab = ref(0); let testForm = ref(null); let configForm = ref(null); let documenttype = ref('docx'); let previewSrc = ref(''); let kbId = ref(''); let kbobj = reactive({}); let kbdetail = reactive({}); let parser_ids = reactive({}); let seeObj = reactive({}); let visible = ref(false) let keywords = ref('') let detailsShow = ref(false) let selectedTab = ref(0) let testForm = ref(null) let configForm = ref(null) let documenttype = ref('docx') let previewSrc = ref('') let kbId = ref('') let kbobj = reactive({}) let kbdetail = reactive({}) let parser_ids = reactive({}) let seeObj = reactive({}) let kbtenantInfo = reactive({ asr_id: 'paraformer-realtime-8k-v1', embd_id: 'BAAI/bge-large-zh-v1.5', img2txt_id: 'qwen-vl-max', llm_id: 'qwen-plus', name: 'wanghao‘s Kingdom', parser_ids: 'naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One', rerank_id: 'BAAI/bge-reranker-v2-m3', role: 'owner', tenant_id: '948fc6fa41ab11ef8fb80242ac120004', parser_idObj: {}, }); let tabs = ref([]); "asr_id": "paraformer-realtime-8k-v1", "embd_id": "BAAI/bge-large-zh-v1.5", "img2txt_id": "qwen-vl-max", "llm_id": "qwen-plus", "name": "wanghao‘s Kingdom", "parser_ids": "naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One", "rerank_id": "BAAI/bge-reranker-v2-m3", "role": "owner", "tenant_id": "948fc6fa41ab11ef8fb80242ac120004", parser_idObj:{} }) let tabs = ref([]) const selectTab = (index, item) => { selectedTab.value = index; const selectTab = (index,item) => { selectedTab.value= index; // console.log(item.id); kbobj = item; kbobj= item; kbId = kbobj.id; testForm.value.changekbid(kbId); configForm.value.changekbObj(kbobj); fetchData({ kb_id: kbobj.id, page: 1, page_size: 20, }); }; page_size: 20 }) } const basePagination: Pagination = { current: 1, @@ -525,7 +428,7 @@ title: t('dmx.column.UploadTime'), dataIndex: 'create_time', slotName: 'create_time', width: 200, width:200 }, { title: t('解析方法'), @@ -587,9 +490,9 @@ const fetchData = async (params) => { setLoading(true); try { const data = await queryKbDocumentList(params); const data = await queryKbDocumentList(params); console.log(data, 'data'); if (data.code == '0') { if(data.code=='0'){ // 详情 // const kbtenantInfo = await queryKbtenantInfo(); parser_ids = kbtenantInfo.parser_ids.split(',').reduce((acc, pair) => { @@ -599,7 +502,7 @@ }, {}); // console.log(parser_ids, 'parser_ids'); kbtenantInfo.parser_idObj = parser_ids; renderData.value = data.data.docs || []; renderData.value = data.data.docs||[]; renderData.value = renderData.value.map((item) => { return { ...item, @@ -612,9 +515,10 @@ pagination.current = params.page; pagination.total = data.data.total; // 查询知识库详情 kbdetail = await queryKbdetail({ kb_id: params.kb_id, kbdetail = await queryKbdetail({ kb_id:params.kb_id, }); } } catch (err) { // you can report use errorHandler or other @@ -628,35 +532,37 @@ kb_id: kbobj.id, page: 1, page_size: 20, keywords: keywords.value, }); keywords:keywords.value }) }; const handleClick = () => { const handleClick = ()=>{ visible.value = true; }; } const onPageChange = (current: number) => { fetchData({ ...basePagination, current }); }; const knowledgeData = async (params = { page: 1, page_size: 20 }) => { const knowledgeData = async ( params = { page: 1, page_size: 20 } ) => { setLoading(true); try { const { data } = await queryKbList(params); console.log(data, 'data'); tabs.value = data; console.log(tabs.value, 'tabs'); if (tabs.value.length > 0 && tabs.value[0]) { kbobj = tabs.value[0]; if(tabs.value.length>0 && tabs.value[0]){ kbobj = tabs.value[0] kbId = kbobj.id; testForm.value.changekbid(kbId); configForm.value.changekbObj(kbobj); fetchData({ kb_id: kbobj.id, page: 1, page_size: 20, }); page_size: 20 }) } // renderData.value = data.list; // console.log(renderData, 'renderData'); @@ -671,13 +577,13 @@ const deleteKnowledge = async (id) => { let data = await deleteKnow({ kb_id: id, }); if (data.code == 0) { kb_id:id }) if(data.code == 0){ Message.success('删除成功'); knowledgeData(); knowledgeData() } }; } const reset = () => { formModel.value = generateFormModel(); }; @@ -736,104 +642,106 @@ } }; const fileClick = () => { detailsShow.value = true; }; const fileClick = ()=>{ detailsShow.value = true const goBackClick = () => { detailsShow.value = false; }; } const goBackClick = ()=>{ detailsShow.value = false } function upTabdateItem(id, newName) { console.log(id, newName); const itemToUpdate = renderData.value.find((item) => item.id === id); const itemToUpdate = renderData.value.find(item => item.id === id); if (itemToUpdate) { itemToUpdate.name = newName; } } const deleteItem = async (row) => { const deleteItem = async (row)=>{ console.log(row); let data = await kbdocumentrm({ doc_id: row.id }); if (data.code == 0) { let data = await kbdocumentrm({doc_id: row.id}) if(data.code == 0){ Message.success('删除成功'); console.log(kbobj, 'kbobj'); fetchData({ kb_id: kbobj.id, page: 1, page_size: 20, }); page_size: 20 }) } }; const onDownloadDocument = async (record) => { } const onDownloadDocument = async (record)=>{ console.log(record); downloadFile({ url: `/api/v1/document/get/${record.id}`, filename: record.name, }); }; const seeload = async (row) => { Object.assign(seeObj, row); // console.log(seeObj.name, 'seeObj'); let type = row.name.split('.')[1]; console.log(type); if (type == 'pdf') { documenttype.value = 'txtPdf'; } else if (type == 'docx') { documenttype.value = 'docx'; } else if (type == 'xlsx') { documenttype.value = 'excel'; } else if (type == 'txt') { documenttype.value = 'txtPdf'; } else { return false; } previewSrc.value = `${import.meta.env.VITE_API_BASE_URL}/v1/document/get/${ row.id }`; visible.value = true; }; } const seeload = async (row)=>{ Object.assign(seeObj, row) // console.log(seeObj.name, 'seeObj'); let type = row.name.split('.')[1]; console.log(type); if(type=='pdf'){ documenttype.value = 'txtPdf' }else if(type=='docx'){ documenttype.value = 'docx' }else if(type=='xlsx'){ documenttype.value = 'excel' }else if(type=='txt'){ documenttype.value = 'txtPdf' }else { return false } previewSrc.value = `${import.meta.env.VITE_API_BASE_URL}/v1/document/get/${row.id}` visible.value = true; const handleChangeStatus = async (row) => { console.log(row); let data = await kbdocumentchangeStatus({ doc_id: row.id, status: row.status, }); if (data.code == 0) { Message.success('操作成功'); } }; } const run = async (row) => { console.log(row); row.loading = true; let run = '1'; if (row.run != '2') { run = '1'; } else { run = '2'; } let data = await kbdocumentrun({ doc_ids: [row.id], run: run, }); if (data.code == 0) { Message.success('解析成功'); row.run = '3'; } else { Message.error('解析失败'); row.run = '1'; } row.loading = false; }; const handleChangeStatus = async (row)=>{ console.log(row); let data = await kbdocumentchangeStatus({ doc_id: row.id, status: row.status }) if(data.code == 0){ Message.success('操作成功'); } } const changeFetchData = async (row) => { fetchData({ kb_id: kbobj.id, page: 1, page_size: 20, }); }; const run = async (row)=>{ console.log(row); row.loading = true; let run = '1' if(row.run!='2'){ run = '1' }else { run = '2' } let data = await kbdocumentrun({ doc_ids: [row.id], run: run }) if(data.code == 0){ Message.success('解析成功'); row.run = '3'; }else{ Message.error('解析失败'); row.run = '1'; } row.loading = false; } const changeFetchData = async (row)=>{ fetchData({ kb_id: kbobj.id, page: 1, page_size: 20 }) } watch( () => columns.value, (val) => { @@ -847,44 +755,49 @@ { deep: true, immediate: true } ); onBeforeMount(() => {}); onMounted(() => { knowledgeData(); }); onBeforeMount(()=>{ }) onMounted(()=>{ knowledgeData() }) </script> <script lang="ts"> export default { name: 'SearchTable', methods: {}, methods: { } }; </script> <style scoped lang="less"> .container { padding: 0 20px 20px 20px; .main-container { .main-container{ display: flex; width: 100%; height: 100%; .lf-container { .lf-container{ display: flex; flex-direction: column; align-items: center; justify-content: space-evenly; background: var(--color-neutral-3); background: #ffffff; width: 200px; .lf-container-top { .lf-container-top{ display: flex; margin: 10px 0; } .lf-container-down { .lf-container-down{ display: flex; flex-direction: column; box-sizing: border-box; width: 90%; //height: 56rem; border: 1px solid var(--color-neutral-3); border: 1px solid #eeeeee; //padding: 10px; margin-bottom: 10px; //.tabs{ @@ -896,8 +809,8 @@ cursor: pointer; box-sizing: border-box; margin: 10px 10px; padding: 0 10px; //color: var(--color-text-1); padding:0 10px; color: rgba(0, 0, 0, 0.88); font-size: 14px; height: 40px; line-height: 40px; @@ -909,40 +822,33 @@ } .tab:hover { border: 1px solid #ffffff; color: #000000; background: #e8e8ea; box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); } .tab.active { border: 1px solid #e8e8ea; background: #e8e8ea; color: #000000; cursor: pointer; box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); } } } .rt-container { .rt-container{ position: relative; //background: #626aea; margin-left: 20px; width: calc(100% - 200px); height: 56rem; .rt-container-main { .rt-container-main{ height: 76vh; } .details { .details{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; //background: #ffffff; .details-header { background: #ffffff; .details-header{ display: flex; justify-content: space-between; margin-top: 10px; src/views/dmx/knowledgeLib/test.vue
@@ -1,215 +1,186 @@ <template> <div class="main-container"> <div class="main-container-lf"> <div class="main-container-lf-top">检索测试</div> <div class="main-container-lf-down"> <div style="color: #999" >最后一步! 成功后,剩下的就交给Infiniflow AI吧。</div > <a-divider style="margin-top: 10px" /> <a-form ref="formRef" :model="form" :style="{ width: '100%' }" layout="vertical" @submit="handleSubmit" > <a-form-item field="similarity_threshold" label="相似度阈值"> <a-slider v-model="form.similarity_threshold" /> </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.vector_similarity_weight" /> </a-form-item> <a-form-item field="section" label="Rerank模型" :rules="[{ match: /section one/, message: '请选择' }]" > <a-space direction="vertical" size="large"> <a-select :size="'large'" v-model="form.rerank_id" :style="{ width: '100%' }" placeholder="请选择 ..." allow-clear > <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_name" > {{ obj.llm_name }} </a-option> </a-optgroup> </a-select> </a-space> </a-form-item> <a-form-item field="slider" label="Top-K" :rules="[ { type: 'number', min: 5, message: 'slider is min than 5' }, ]" > <a-slider v-model="form.top_k" :min="1" :max="2048" /> </a-form-item> <a-form-item> <div class="main-container-form-item-extra"> <div class="main-container-form-item-extra-top">测试文本</div> <div class="main-container-form-item-extra-down"> <a-textarea v-model="form.question" style=" height: 10rem; border: 1px solid var(--color-fill-3); border-radius: 4px; " placeholder="" allow-clear /> <div class="main-container"> <div class="main-container-lf"> <div class="main-container-lf-top">检索测试</div> <div class="main-container-lf-down"> <div style="color: #999;">最后一步! 成功后,剩下的就交给Infiniflow AI吧。</div> <a-divider style="margin-top: 10px" /> <a-form ref="formRef" :model="form" :style="{width:'100%'}" layout="vertical" @submit="handleSubmit"> <a-form-item field="similarity_threshold" label="相似度阈值"> <a-slider v-model="form.similarity_threshold" /> </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.vector_similarity_weight" /> </a-form-item> <a-form-item field="section" label="Rerank模型" :rules="[{match:/section one/,message:'请选择'}]"> <a-space direction="vertical" size="large"> <a-select :size="'large'" v-model="form.rerank_id" :style="{width:'100%'}" placeholder="请选择 ..." allow-clear> <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_name" > {{obj.llm_name}} </a-option> </a-optgroup> </a-select> </a-space> </a-form-item> <a-form-item field="slider" label="Top-K" :rules="[{type:'number', min:5,message:'slider is min than 5'}]"> <a-slider v-model="form.top_k" :min="1" :max="2048" /> </a-form-item> <a-form-item > <div class="main-container-form-item-extra"> <div class="main-container-form-item-extra-top">测试文本</div> <div class="main-container-form-item-extra-down"> <a-textarea v-model="form.question" style="height: 10rem;border: 1px solid var(--color-fill-3);border-radius: 4px" placeholder="" allow-clear/> </div> <div class="main-container-form-item-extra-btn"> <a-button type="primary" html-type="submit">测试</a-button> </div> </div> <div class="main-container-form-item-extra-btn"> <a-button type="primary" html-type="submit">测试</a-button> </div> </a-form-item> </a-form> </div> </div> <div class="main-container-rt"> <a-collapse style="width: 96%;margin-top: 1rem;margin-left: 2%"> <a-collapse-item header="0/0 选定的文件" key="3"> <template #extra> <a-tag size="small">命中数</a-tag> <a-tag size="small">看法</a-tag> </template> <div> <a-empty /> </div> </a-form-item> </a-form> </a-collapse-item> </a-collapse> </div> </div> <div class="main-container-rt"> <a-collapse style="width: 96%; margin-top: 1rem; margin-left: 2%"> <a-collapse-item header="0/0 选定的文件" key="3"> <template #extra> <a-tag size="small">命中数</a-tag> <a-tag size="small">看法</a-tag> </template> <div> <a-empty /> </div> </a-collapse-item> </a-collapse> </div> </div> </template> <script lang="ts" setup> import { onMounted, onBeforeMount, reactive, ref, watch } from 'vue'; import { Message } from '@arco-design/web-vue'; import { kbretrievalTest, queryModelList } from '@/api/kbList'; // const props = defineProps(['kbId']) import { onMounted, onBeforeMount, reactive, ref, watch } from "vue"; import { Message } from '@arco-design/web-vue'; import { kbretrievalTest, queryModelList } from "@/api/kbList"; // const props = defineProps(['kbId']) // watch(() => props.kbId, (newValue, oldValue) => { // console.log('kbId 变化了', newValue, oldValue); // },{ // deep:true, // }); // watch(() => props.kbId, (newValue, oldValue) => { // console.log('kbId 变化了', newValue, oldValue); // },{ // deep:true, // }); let visible = ref(false); let loading = ref(false); const formRef = ref(null); const kbid = ref(''); const modelList = ref({}); let form = reactive({ page: 1, question: '', rerank_id: '', similarity_threshold: 20, size: 10, top_k: 1024, vector_similarity_weight: 30, let visible = ref(false); let loading = ref(false); const formRef = ref(null); const kbid = ref(''); const modelList = ref({}); let form = reactive({ page: 1, question: '', rerank_id: '', similarity_threshold: 20, size: 10, top_k: 1024, vector_similarity_weight: 30, }); const formatter = (value) => { // return String(Math.round(value / 100)) }; const handleSubmit = async ({values, errors}) => { // console.log(props.kbobj, 'props.kbobj'); if (!form.question){ return } let formObj = { ...form, kb_id:kbid.value, } formObj.similarity_threshold = formObj.similarity_threshold/100; formObj.vector_similarity_weight = formObj.vector_similarity_weight/100; const data = await kbretrievalTest(formObj); } const handleClick = () => { visible.value = true; }; const handleCancel = () => { visible.value = false; } const handleOpened =(el) => { Object.assign(form,{ }); formRef.value.resetFields(); } const formatter = (value) => { // return String(Math.round(value / 100)) }; const changekbid = (value) => { kbid.value = value; } const handleSubmit = async ({ values, errors }) => { // console.log(props.kbobj, 'props.kbobj'); if (!form.question) { return; } let formObj = { ...form, kb_id: kbid.value, const queryModel = async (params) => { try { const data = await queryModelList(params); console.log(data.data, '大模型列表'); modelList.value = { BAAI: [data.data.BAAI[1]], Jina: data.data.Jina, youdao: data.data.youdao }; formObj.similarity_threshold = formObj.similarity_threshold / 100; formObj.vector_similarity_weight = formObj.vector_similarity_weight / 100; const data = await kbretrievalTest(formObj); }; } catch (err) { // you can report use errorHandler or other } finally { const handleClick = () => { visible.value = true; }; const handleCancel = () => { visible.value = false; }; } }; const handleOpened = (el) => { Object.assign(form, {}); formRef.value.resetFields(); }; const changekbid = (value) => { kbid.value = value; }; defineExpose({ changekbid }) const queryModel = async (params) => { try { const data = await queryModelList(params); console.log(data.data, '大模型列表'); modelList.value = { BAAI: [data.data.BAAI[1]], Jina: data.data.Jina, youdao: data.data.youdao, }; } catch (err) { // you can report use errorHandler or other } finally { } }; onBeforeMount(()=>{ queryModel({}) }) onMounted(()=>{ defineExpose({ changekbid, }); onBeforeMount(() => { queryModel({}); }); onMounted(() => {}); }) </script> <script lang="ts"> export default { name: 'config', methods: {}, }; export default { name: 'config', methods: { } }; </script> <style scoped lang="less"> .main-container { .main-container{ display: flex; justify-content: space-between; height: 100%; //background: #626aea; &-lf { &-lf{ width: 30%; height: 100%; //border: 1px solid #cccccc; //background: #ffffff; background: #ffffff; border-radius: 10px; overflow: hidden; &-top { &-top{ width: 100%; height: 60px; line-height: 60px; @@ -217,44 +188,44 @@ color: #ffffff; text-align: center; } &-down { &-down{ padding: 20px; width: 100%; } } &-form-item-extra { &-form-item-extra{ width: 100%; height: 20rem; border: 1px solid var(--color-fill-3); border-radius: 6px; overflow: hidden; &-top { &-top{ width: 100%; height: 40px; line-height: 40px; border-bottom: 1px solid var(--color-fill-3); border-bottom: 1px solid var(--color-fill-3); //background: rgb(var(--primary-6)); color: #999999; text-align: center; } &-down { &-down{ width: 92%; margin-left: 4%; margin-top: 30px; } &-btn { &-btn{ width: 96%; text-align: right; margin-top: 1rem; } } &-rt { &-rt{ width: 69%; height: 100%; //background: #626aea; //border: 1px solid #cccccc; //background: #ffffff; background: #ffffff; border-radius: 10px; } } </style> </style> src/views/dmx/knowledgeLib/tool.vue
@@ -1,3 +1,4 @@ <template> <a-button type="text" @click="handleClick" size="small"> <template #icon> @@ -13,382 +14,232 @@ title-align="start" width="900px" > <a-tabs default-active-key="1"> <a-tab-pane key="1"> <template #title> <icon-calendar /> 解析方法 </template> <div style="width: 100%"> <div style="display: flex; align-items: center"> <div> 解析方法: </div> <div style="margin-left: 10px"> <a-select v-model="form.parser_id" placeholder="请选择"> <a-option v-for="item in parser_ids" :key="item.value" :label="item.name" :value="item.value" ></a-option> </a-select> </div> </div> <div class="parser"> <a-form ref="formRef" :rules="rules" :model="form" auto-label-width @submit="handleSubmit" > <a-divider style="margin-top: 10px" /> <a-form-item field="slider" label="块token数" :rules="[ { type: 'number', min: 1, message: 'slider is min than 1' }, ]" > <a-slider v-model="form.chunk_token_num" :max="1000" show-input /> </a-form-item> <a-divider style="margin-top: 10px" /> <a-form-item field="raptor" label="使用召回增强RAPTOR策略"> <a-space direction="vertical" size="large"> <a-switch v-model="form.use_raptor" @change="onChangeRAPTOR" /> </a-space> </a-form-item> <div v-if="form.use_raptor"> <a-form-item field="prompt" label="提示词"> <a-textarea v-model="form.prompt" placeholder="请填写提示词" /> </a-form-item> <a-form-item field="slider" label="最大token数" :rules="[ { type: 'number', min: 5, message: 'slider is min than 5' }, ]" > <a-slider v-model="form.max_token" :min="1" :max="1000" 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.threshold" show-tooltip 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.max_cluster" :max="1000" show-input /> </a-form-item> <a-form-item field="slider" label="随机种子" v-model="form.random_seed" :rules="[ { type: 'number', min: 5, message: 'slider is min than 5' }, ]" > <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="randomNumber"> <icon-plus /> </a-button> </a-form-item> <a-tabs default-active-key="1"> <a-tab-pane key="1"> <template #title> <icon-calendar/> 解析方法 </template> <div style="width: 100%"> <div style="display: flex;align-items: center;"> <div> 解析方法: </div> <a-form-item> <div style="width: 100%; text-align: right"> <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> </a-tab-pane> <a-tab-pane key="2"> <template #title> <icon-clock-circle /> 创建解析块 </template> <div class="details"> <div class="details-header"> <div style=" display: flex; align-items: center; justify-content: flex-end; " > <a-radio-group v-model="radio" type="button" style="margin-right: 10px" @change="onRadioChange" > <a-radio value="1">全文</a-radio> <a-radio value="2">省略</a-radio> </a-radio-group> <a-popover position="bottom"> <a-button type="outline" class="button" style="margin-right: 10px" >批量<icon-down style="margin-left: 4px" /></a-button> <template #content> <a-space direction="vertical"> <a-checkbox :model-value="checkedAll" :indeterminate="indeterminate" @change="handleChangeAll" style="margin-left: 10px" > 选择所有 </a-checkbox> <div style="margin-left: 10px"> <a-select v-model="form.parser_id" placeholder="请选择" > <a-option v-for="item in parser_ids" :key="item.value" :label="item.name" :value="item.value"></a-option> </a-select> </div> </div> <div class="parser"> <a-form ref="formRef" :rules="rules" :model="form" auto-label-width @submit="handleSubmit" > <a-divider style="margin-top: 10px" /> <a-form-item field="slider" label="块token数" :rules="[{type:'number', min:1,message:'slider is min than 1'}]"> <a-slider v-model="form.chunk_token_num" :max="1000" show-input /> </a-form-item> <a-divider style="margin-top: 10px" /> <a-form-item field="raptor" label="使用召回增强RAPTOR策略"> <a-space direction="vertical" size="large"> <a-switch v-model="form.use_raptor" @change="onChangeRAPTOR" /> </a-space> <a-divider style="margin: 10px 0" /> <p> <a-button type="text" class="button" style="color: #2a2a2b"> <template #icon> <icon-check-circle /> </template> 启用选定的 </a-form-item> <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="最大token数" :rules="[{type:'number', min:5,message:'slider is min than 5'}]"> <a-slider v-model="form.max_token" :min="1" :max="1000" 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.threshold" show-tooltip 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.max_cluster" :max="1000" show-input/> </a-form-item> <a-form-item field="slider" label="随机种子" v-model="form.random_seed" :rules="[{type:'number', min:5,message:'slider is min than 5'}]"> <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="randomNumber"> <icon-plus /> </a-button> </p> <p> <a-button type="text" class="button" style="color: #2a2a2b"> <template #icon> <icon-close-circle /> </template> 禁用选定的 </a-button> </p> <a-divider style="margin: 10px 0" /> <p> <a-button type="text" class="button" style="color: #2a2a2b"> <template #icon> <icon-delete /> </template> 删除选定的 </a-button> </p> </template> </a-popover> <a-button type="outline" class="button" style="margin-right: 10px" > <template #icon> <icon-search /> </template> </a-button> <a-popover position="bottom"> <a-button type="outline" class="button" style="margin-right: 10px" ><icon-sort /></a-button> <template #content> <a-radio-group v-model="available_int" direction="vertical" size="large" @change="onChangeavailable" > <a-radio value="">所有</a-radio> <a-radio value="1">启用</a-radio> <a-radio value="0">禁用</a-radio> </a-radio-group> </template> </a-popover> <addDetails :item="item"></addDetails> </a-form-item> </div> <a-form-item> <div style="width: 100%;text-align: right"> <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> <a-divider style="margin-top: 10px" /> <div class="groupMain"> <a-checkbox-group v-model="data" @change="handleChange"> <div class="groupList" :style="{ background: keyBg == '1' ? '#eff8ff' : 'white' }" > <a-checkbox value="1"></a-checkbox> <div class="groupList-content" @click="groupListContentClick('1')" @dblclick="contentClick(1)" > 而 stable version 是最新稳定版,经过充分测试和验证,bug 较少, 适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions 则是之前发布的稳定版,对于需要 特定旧版本的兼容性或安全性支持的用户有用,但一般不 推荐用于新项目,除非有特殊需求。在实际使用中,如果追求最新功能 且愿意面对可能存在的一些不稳定因素,可以尝试使用主线版本进行测试和研究;如果是用于生产环境 </div> <div class="groupList-right"> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()" /> </div> </a-tab-pane> <a-tab-pane key="2"> <template #title> <icon-clock-circle/> 创建解析块 </template> <div class="details"> <div class="details-header"> <div style="display: flex; align-items: center;justify-content: flex-end;"> <a-radio-group v-model="radio" type="button" style="margin-right: 10px" @change="onRadioChange"> <a-radio value="1">全文</a-radio> <a-radio value="2">省略</a-radio> </a-radio-group> <a-popover position="bottom"> <a-button type="outline" class="button" style="margin-right: 10px;">批量<icon-down style="margin-left: 4px" /></a-button> <template #content> <a-space direction="vertical"> <a-checkbox :model-value="checkedAll" :indeterminate="indeterminate" @change="handleChangeAll" style="margin-left: 10px"> 选择所有 </a-checkbox> </a-space> <a-divider style="margin: 10px 0" /> <p> <a-button type="text" class="button" style="color: #2a2a2b"> <template #icon> <icon-check-circle /> </template> 启用选定的 </a-button> </p> <p> <a-button type="text" class="button" style="color: #2a2a2b"> <template #icon> <icon-close-circle /> </template> 禁用选定的 </a-button> </p> <a-divider style="margin: 10px 0" /> <p> <a-button type="text" class="button" style="color: #2a2a2b"> <template #icon> <icon-delete /> </template> 删除选定的 </a-button> </p> </template> </a-popover> <a-button type="outline" class="button" style="margin-right: 10px"> <template #icon> <icon-search /> </template> </a-button> <a-popover position="bottom"> <a-button type="outline" class="button" style="margin-right: 10px"><icon-sort /></a-button> <template #content> <a-radio-group v-model="available_int" direction="vertical" size="large" @change="onChangeavailable"> <a-radio value="">所有</a-radio> <a-radio value="1">启用</a-radio> <a-radio value="0">禁用</a-radio> </a-radio-group> </template> </a-popover> <addDetails :item="item"></addDetails> </div> </a-checkbox-group> </div> <a-divider style="margin-top: 10px" /> <div class="groupMain"> <a-checkbox-group v-model="data" @change="handleChange"> <div class="groupList"> <a-checkbox value="1"></a-checkbox> <div class="groupList-content" @click="groupListContentClick('1')" @dblclick="contentClick(1)" > 而 stable version 是最新稳定版,经过充分测试和验证,bug 较少, 适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions 则是之前发布的稳定版,对于需要 特定旧版本的兼容性或安全性支持的用户有用,但一般不 推荐用于新项目,除非有特殊需求。在实际使用中,如果追求最新功能 且愿意面对可能存在的一些不稳定因素,可以尝试使用主线版本进行测试和研究;如果是用于生产环境 </div> <a-divider style="margin-top: 10px" /> <div class="groupMain"> <a-checkbox-group v-model="data" @change="handleChange" > <div class="groupList" :style="{background:keyBg=='1'?'#eff8ff':'white'}"> <a-checkbox value="1"></a-checkbox> <div class="groupList-content" @click="groupListContentClick('1')" @dblclick="contentClick(1)"> 而 stable version 是最新稳定版,经过充分测试和验证,bug 较少, 适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions 则是之前发布的稳定版,对于需要 特定旧版本的兼容性或安全性支持的用户有用,但一般不 推荐用于新项目,除非有特殊需求。在实际使用中,如果追求最新功能 且愿意面对可能存在的一些不稳定因素,可以尝试使用主线版本进行测试和研究;如果是用于生产环境 </div> <div class="groupList-right"> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()"/> </div> </div> <div class="groupList-right"> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()" /> </div> </div> <div class="groupList"> <a-checkbox value="1"></a-checkbox> <div class="groupList-content" @click="groupListContentClick('2')" @dblclick="contentClick(1)" > 而 stable version 是最新稳定版,经过充分测试和验证,bug 较少, 适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions 则是之前发布的稳定版,对于需要 <div class="groupList" :style="{background:keyBg=='2'?'#eff8ff':'white'}"> <a-checkbox value="1"></a-checkbox> <div class="groupList-content" @click="groupListContentClick('2')" @dblclick="contentClick(1)"> 而 stable version 是最新稳定版,经过充分测试和验证,bug 较少, 适合用于生产环境。其版本号通常为双数,如 1.26。legacy versions 则是之前发布的稳定版,对于需要 </div> <div class="groupList-right"> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()"/> </div> </div> <div class="groupList-right"> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()" /> </div> </div> <div class="groupList-right"> <a-switch v-model="switchType" checked-value="1" unchecked-value="0" @change="handleChangeStatus()" /> </div> </a-checkbox-group> </a-checkbox-group> </div> </div> </div> <eidtDetails ref="eidtDil"></eidtDetails> </a-tab-pane> </a-tabs> <eidtDetails ref="eidtDil"></eidtDetails> </a-tab-pane> </a-tabs> </a-modal> </template> <script lang="ts" setup> import { onMounted, onBeforeMount, reactive, ref, computed } from 'vue'; import { Message } from '@arco-design/web-vue'; import { kbdocumentchangeparser } 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 eidtDil = ref(); import { onMounted, onBeforeMount, reactive, ref, computed } from "vue"; import { Message } from "@arco-design/web-vue"; import {kbdocumentchangeparser} 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 eidtDil = ref(); const props = defineProps(['kbtenantInfo', 'item', 'kbdetail']); // const emit = defineEmits(['upTabdateItem']) const props = defineProps(['kbtenantInfo','item','kbdetail']) // const emit = defineEmits(['upTabdateItem']) let threshold = computed(() => { return form.threshold / 100; }); let threshold = computed(()=>{ return form.threshold/100; }) const kbtenantInfo = props.kbtenantInfo; const kbtenantInfo = props.kbtenantInfo; let parser_ids = kbtenantInfo.parser_ids.split(',').map((item) => { const [value1, value2] = item.split(':'); return { name: value2, value: value1, }; }); const form = reactive({ parser_id: props.item.parser_id, doc_id: props.item.id, max_token: 698, threshold: 30, max_cluster: 233, random_seed: 1500, chunk_token_num: 128, use_raptor: false, pages: {}, prompt: '请总结以下段落。 小心数字,不要编造。 段落如下:\n' + ' {cluster_content}\n' + '以上就是你需要总结的内容。', }); const formRef = ref(null); const rules = { prompt: [ { required: true, message: '提示词不允许为空', }, ], let parser_ids = kbtenantInfo.parser_ids.split(',').map((item) => { const [value1, value2] = item.split(':'); return { name: value2, value: value1, }; const formatter = (value) => { return value / 100; }; }); const form = reactive({ parser_id: props.item.parser_id, doc_id: props.item.id, max_token: 698, threshold: 30, max_cluster: 233, random_seed: 1500, chunk_token_num: 128, use_raptor: false, pages: {}, prompt: '请总结以下段落。 小心数字,不要编造。 段落如下:\n' + ' {cluster_content}\n' + '以上就是你需要总结的内容。', }); const formRef = ref(null); const rules = { prompt: [ { required: true, message:'提示词不允许为空', }, ], } const formatter = (value) => { return value / 100 }; function randomNumber() { // 生成一个介于min和max之间的随机整数(包含min和max) const min = 1; // 最小值 @@ -396,180 +247,169 @@ form.random_seed = Math.floor(Math.random() * (max - min + 1)) + min; } const handleSubmit = async ({ values, errors }) => { if (!errors) { let data = await kbdocumentchangeparser({ parser_id: form.parser_id, doc_id: form.doc_id, 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, }, chunk_token_num: form.chunk_token_num, pages: [], const handleSubmit = async ({values, errors}) => { if(!errors){ let data = await kbdocumentchangeparser({ parser_id: form.parser_id, doc_id: form.doc_id, 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, }, }); if (data.code == 0) { Message.success('配置成功'); } else { Message.error('配置失败'); chunk_token_num: form.chunk_token_num, pages: [ ] } visible.value = false; }) if(data.code == 0){ Message.success('配置成功'); }else{ Message.error('配置失败'); } }; const handleClick = () => { visible.value = true; }; const handleCancel = () => { visible.value = false; }; } } const contentClick = (done) => { eidtDil.value.handleClick(); }; const handleOpened = (el) => { // console.log('props',props.kbtenantInfo); // console.log('props',props.item); // console.log('props',props.kbdetail); console.log(parser_ids, 'parser_ids'); // Object.assign(form,{ // name: '',// 用户名 // nameJoin: '',// 昵称 // post: '',// 岗位 // txt: '',// 备注 // }); // formRef.value.resetFields(); console.log(props.item.id); }; const handleClick = () => { visible.value = true; }; const handleCancel = () => { visible.value = false; } const onChangeRAPTOR = () => {}; const contentClick = (done) => { eidtDil.value.handleClick(); } const handleOpened =(el) => { // console.log('props',props.kbtenantInfo); // console.log('props',props.item); // console.log('props',props.kbdetail); console.log(parser_ids, 'parser_ids'); // Object.assign(form,{ // name: '',// 用户名 // nameJoin: '',// 昵称 // post: '',// 岗位 // txt: '',// 备注 // }); // formRef.value.resetFields(); console.log(props.item.id); } const indeterminate = ref(false); const checkedAll = ref(false); const data = ref([]); const switchType = ref(false); const available_int = ref(''); const onRadioChange = () => { console.log(radio.value); }; const handleChangeAll = (value) => { const onChangeRAPTOR = () => { }; const indeterminate = ref(false) const checkedAll = ref(false) const data = ref([]) const switchType = ref(false) const available_int = ref('') const onRadioChange = () => { console.log(radio.value); }; const handleChangeAll = (value) => { indeterminate.value = false; if (value) { checkedAll.value = true; data.value = ['1', '2', '3'] } else { checkedAll.value = false; data.value = [] } } const handleChange = (values) => { if (values.length === 3) { checkedAll.value = true indeterminate.value = false; if (value) { checkedAll.value = true; data.value = ['1', '2', '3']; } else { checkedAll.value = false; data.value = []; } }; } else if (values.length === 0) { checkedAll.value = false indeterminate.value = false; } else { checkedAll.value = false indeterminate.value = true; } } const handleChange = (values) => { if (values.length === 3) { checkedAll.value = true; indeterminate.value = false; } else if (values.length === 0) { checkedAll.value = false; indeterminate.value = false; } else { checkedAll.value = false; indeterminate.value = true; } }; const groupListContentClick = (value) => { keyBg.value = value; }; const groupListContentClick = (value) => { keyBg.value = value; } const onChangeavailable = () => { console.log(available_int.value); }; const handleChangeStatus = () => { console.log(switchType.value); }; const onChangeavailable = ()=>{ console.log(available_int.value); } onBeforeMount(() => {}); onMounted(() => {}); const handleChangeStatus = ()=>{ console.log(switchType.value); } onBeforeMount(()=>{ }) 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; } .parser{ width: 100%; ::v-deep .arco-btn-outline:hover, .arco-btn-outline, .arco-btn-outline[type='button']{ color: #2a2a2b; border: 1px solid #2a2a2b; } .groupMain { width: 100%; height: 500px; overflow: auto; .button{ //color: #2a2a2b!important; } } .groupMain{ width: 100%; height: 500px; overflow: auto; display: flex; justify-content: center; .groupList{ display: flex; justify-content: center; .groupList { display: flex; padding: 24px; border-radius: 8px; //background: #eff8ff; border: 1px solid var(--color-neutral-3); margin-bottom: 20px; padding: 24px; border-radius: 8px; //background: #eff8ff; border: 1px solid #f0f0f0; margin-bottom: 20px; overflow: auto; .groupList-content{ width: 700px; //height: 100px; overflow: auto; .groupList-content { width: 700px; //height: 100px; overflow: auto; box-sizing: border-box; margin: 0; padding: 0; color: var(--color-text-1); font-size: 14px; font-family: Inter; position: relative; box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.88); font-size: 14px; font-family: Inter; position: relative; } } .groupMain { width: 100%; height: 500px; overflow: auto; display: flex; justify-content: center; .groupList { display: flex; padding: 24px; border-radius: 8px; //background: #eff8ff; border: 1px solid #f0f0f0; margin-bottom: 20px; overflow: auto; .groupList-content { width: 700px; //height: 100px; overflow: auto; box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.88); font-size: 14px; font-family: Inter; position: relative; } } } } </style> } </style>