From e9527bdd2bc522a7f47dd9b63afbbbb87b48adb7 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Wed, 11 Jun 2025 13:13:10 +0800 Subject: [PATCH] feat: chat log --- ui/src/api/application/application.ts | 1 - ui/src/api/application/chat-log.ts | 200 ++++++ .../lang/en-US/views/{log.ts => chat-log.ts} | 6 +- ui/src/locales/lang/en-US/views/index.ts | 4 +- .../lang/zh-CN/views/{log.ts => chat-log.ts} | 6 +- ui/src/locales/lang/zh-CN/views/index.ts | 4 +- .../zh-Hant/views/{log.ts => chat-log.ts} | 6 +- ui/src/locales/lang/zh-Hant/views/index.ts | 4 +- ui/src/router/modules/application-detail.ts | 26 +- ui/src/stores/index.ts | 3 +- ui/src/stores/modules/chat-log.ts | 78 +++ .../views/application/ApplicationSetting.vue | 52 +- .../chat-log/component/ChatRecordDrawer.vue | 166 +++++ .../chat-log/component/EditContentDialog.vue | 307 ++++++++ .../chat-log/component/EditMarkDialog.vue | 174 +++++ ui/src/views/chat-log/index.vue | 662 ++++++++++++++++++ .../nodes/search-dataset-node/index.vue | 4 +- 17 files changed, 1645 insertions(+), 58 deletions(-) create mode 100644 ui/src/api/application/chat-log.ts rename ui/src/locales/lang/en-US/views/{log.ts => chat-log.ts} (87%) rename ui/src/locales/lang/zh-CN/views/{log.ts => chat-log.ts} (87%) rename ui/src/locales/lang/zh-Hant/views/{log.ts => chat-log.ts} (87%) create mode 100644 ui/src/stores/modules/chat-log.ts create mode 100644 ui/src/views/chat-log/component/ChatRecordDrawer.vue create mode 100644 ui/src/views/chat-log/component/EditContentDialog.vue create mode 100644 ui/src/views/chat-log/component/EditMarkDialog.vue create mode 100644 ui/src/views/chat-log/index.vue diff --git a/ui/src/api/application/application.ts b/ui/src/api/application/application.ts index 256dd4c1d..3b3f63357 100644 --- a/ui/src/api/application/application.ts +++ b/ui/src/api/application/application.ts @@ -3,7 +3,6 @@ import { get, post, postStream, del, put, request, download, exportFile } from ' import type { pageRequest } from '@/api/type/common' import type { ApplicationFormType } from '@/api/type/application' import { type Ref } from 'vue' -import type { FormField } from '@/components/dynamics-form/type' const prefix = '/workspace/' + localStorage.getItem('workspace_id') + '/application' diff --git a/ui/src/api/application/chat-log.ts b/ui/src/api/application/chat-log.ts new file mode 100644 index 000000000..2327e664b --- /dev/null +++ b/ui/src/api/application/chat-log.ts @@ -0,0 +1,200 @@ +import { Result } from '@/request/Result' +import { + get, + post, + exportExcelPost, + postStream, + del, + put, + request, + download, + exportFile, +} from '@/request/index' +import type { pageRequest } from '@/api/type/common' +import type { ApplicationFormType } from '@/api/type/application' +import { type Ref } from 'vue' + +const prefix = '/workspace/' + localStorage.getItem('workspace_id') + '/application' +/** + * 对话记录提交至知识库 + * @param data + * @param loading + * @param application_id + * @param knowledge_id + */ + +const postChatLogAddKnowledge: ( + application_id: string, + data: any, + loading?: Ref, +) => Promise> = (application_id, data, loading) => { + return post(`${prefix}/${application_id}/add_knowledge`, data, undefined, loading) +} + +/** + * 对话日志 + * @param 参数 + * application_id + * param { + "start_time": "string", + "end_time": "string", + } + */ +const getChatLog: ( + application_id: String, + page: pageRequest, + param: any, + loading?: Ref, +) => Promise> = (application_id, page, param, loading) => { + return get( + `${prefix}/${application_id}/chat/${page.current_page}/${page.page_size}`, + param, + loading, + ) +} + +/** + * 获得对话日志记录 + * @param 参数 + * application_id, chart_id,order_asc + */ +const getChatRecordLog: ( + application_id: String, + chart_id: String, + page: pageRequest, + loading?: Ref, + order_asc?: boolean, +) => Promise> = (application_id, chart_id, page, loading, order_asc) => { + return get( + `${prefix}/${application_id}/chat/${chart_id}/chat_record/${page.current_page}/${page.page_size}`, + { order_asc: order_asc !== undefined ? order_asc : true }, + loading, + ) +} + +/** + * 获取标注段落列表信息 + * @param 参数 + * application_id, chart_id, chart_record_id, knowledge_id, document_id + */ +const getMarkChatRecord: ( + application_id: String, + chart_id: String, + chart_record_id: String, + knowledge_id: String, + document_id: String, + loading?: Ref, +) => Promise> = ( + application_id, + chart_id, + chart_record_id, + knowledge_id, + document_id, + loading, +) => { + return get( + `${prefix}/${application_id}/chat/${chart_id}/chat_record/${chart_record_id}/knowledge/${knowledge_id}/document/${document_id}/improve`, + undefined, + loading, + ) +} + +/** + * 修改日志记录内容 + * @param 参数 + * application_id, chart_id, chart_record_id, knowledge_id, document_id + * data { + "title": "string", + "content": "string", + "problem_text": "string" + } + */ +const putChatRecordLog: ( + application_id: String, + chart_id: String, + chart_record_id: String, + knowledge_id: String, + document_id: String, + data: any, + loading?: Ref, +) => Promise> = ( + application_id, + chart_id, + chart_record_id, + knowledge_id, + document_id, + data, + loading, +) => { + return put( + `${prefix}/${application_id}/chat/${chart_id}/chat_record/${chart_record_id}/dataset/${knowledge_id}/document/${document_id}/improve`, + data, + undefined, + loading, + ) +} + +/** + * 删除标注 + * @param 参数 + * application_id, chart_id, chart_record_id, dataset_id, document_id,paragraph_id + */ +const delMarkChatRecord: ( + application_id: String, + chart_id: String, + chart_record_id: String, + knowledge_id: String, + document_id: String, + paragraph_id: String, + loading?: Ref, +) => Promise> = ( + application_id, + chart_id, + chart_record_id, + knowledge_id, + document_id, + paragraph_id, + loading, +) => { + return del( + `${prefix}/${application_id}/chat/${chart_id}/chat_record/${chart_record_id}/knowledge/${knowledge_id}/document/${document_id}/paragraph/${paragraph_id}/improve`, + undefined, + {}, + loading, + ) +} + +/** + * 导出对话日志 + * @param 参数 + * application_id + * param { + "start_time": "string", + "end_time": "string", + } + */ +const postExportChatLog: ( + application_id: string, + application_name: string, + param: any, + data: any, + loading?: Ref, +) => void = (application_id, application_name, param, data, loading) => { + exportExcelPost( + application_name + '.xlsx', + `${prefix}/${application_id}/chat/export`, + param, + data, + loading, + ) +} + +export default { + postChatLogAddKnowledge, + getChatLog, + getChatRecordLog, + getMarkChatRecord, + putChatRecordLog, + delMarkChatRecord, + postExportChatLog, +} diff --git a/ui/src/locales/lang/en-US/views/log.ts b/ui/src/locales/lang/en-US/views/chat-log.ts similarity index 87% rename from ui/src/locales/lang/en-US/views/log.ts rename to ui/src/locales/lang/en-US/views/chat-log.ts index 9dfa40e00..b8ff8c087 100644 --- a/ui/src/locales/lang/en-US/views/log.ts +++ b/ui/src/locales/lang/en-US/views/chat-log.ts @@ -22,10 +22,10 @@ export default { mark: 'Marks', recenTimes: 'Last Chat Time' }, - addToDataset: 'Add to Knowledge', + addToKnowledge: 'Add to Knowledge', daysText: 'Days ago', - selectDataset: 'Select Knowledge', - selectDatasetPlaceholder: 'Please select a knowledge', + selectKnowledge: 'Select Knowledge', + selectKnowledgePlaceholder: 'Please select a knowledge', saveToDocument: 'Save to Document', documentPlaceholder: 'Please select a document', editContent: 'Edit Content', diff --git a/ui/src/locales/lang/en-US/views/index.ts b/ui/src/locales/lang/en-US/views/index.ts index c01e4723e..db445ebbc 100644 --- a/ui/src/locales/lang/en-US/views/index.ts +++ b/ui/src/locales/lang/en-US/views/index.ts @@ -12,7 +12,7 @@ import model from './model' import document from './document' import paragraph from './paragraph' import problem from './problem' -import log from './log' +import chatLog from './chat-log' import applicationWorkflow from './application-workflow' import login from './login' import operateLog from './operate-log' @@ -31,7 +31,7 @@ export default { document, paragraph, problem, - log, + chatLog, login, operateLog, role diff --git a/ui/src/locales/lang/zh-CN/views/log.ts b/ui/src/locales/lang/zh-CN/views/chat-log.ts similarity index 87% rename from ui/src/locales/lang/zh-CN/views/log.ts rename to ui/src/locales/lang/zh-CN/views/chat-log.ts index c866a9551..b7122accc 100644 --- a/ui/src/locales/lang/zh-CN/views/log.ts +++ b/ui/src/locales/lang/zh-CN/views/chat-log.ts @@ -22,10 +22,10 @@ export default { mark: '改进标注', recenTimes: '最近对话时间' }, - addToDataset: '添加至知识库', + addToKnowledge: '添加至知识库', daysText: '天之前的对话记录', - selectDataset: '选择知识库', - selectDatasetPlaceholder: '请选择知识库', + selectKnowledge: '选择知识库', + selectKnowledgePlaceholder: '请选择知识库', saveToDocument: '保存至文档', documentPlaceholder: '请选择文档', editContent: '修改内容', diff --git a/ui/src/locales/lang/zh-CN/views/index.ts b/ui/src/locales/lang/zh-CN/views/index.ts index 556d18101..4c5c42b9c 100644 --- a/ui/src/locales/lang/zh-CN/views/index.ts +++ b/ui/src/locales/lang/zh-CN/views/index.ts @@ -12,7 +12,7 @@ import problem from './problem' import applicationOverview from './application-overview' import applicationWorkflow from './application-workflow' import paragraph from './paragraph' -import log from './log' +import chatLog from './chat-log' // import notFound from './404' // import operateLog from './operate-log' @@ -31,7 +31,7 @@ export default { applicationOverview, applicationWorkflow, paragraph, - log, + chatLog, // notFound, // operateLog diff --git a/ui/src/locales/lang/zh-Hant/views/log.ts b/ui/src/locales/lang/zh-Hant/views/chat-log.ts similarity index 87% rename from ui/src/locales/lang/zh-Hant/views/log.ts rename to ui/src/locales/lang/zh-Hant/views/chat-log.ts index 5e84a698d..4c774e5fd 100644 --- a/ui/src/locales/lang/zh-Hant/views/log.ts +++ b/ui/src/locales/lang/zh-Hant/views/chat-log.ts @@ -22,10 +22,10 @@ export default { mark: '改進標註', recenTimes: '最近對話時間' }, - addToDataset: '添加至知識庫', + addToKnowledge: '添加至知識庫', daysText: '天之前的對話記錄', - selectDataset: '選擇知識庫', - selectDatasetPlaceholder: '請選擇知識庫', + selectKnowledge: '選擇知識庫', + selectKnowledgePlaceholder: '請選擇知識庫', saveToDocument: '保存至文件', documentPlaceholder: '請選擇文件', editContent: '修改內容', diff --git a/ui/src/locales/lang/zh-Hant/views/index.ts b/ui/src/locales/lang/zh-Hant/views/index.ts index c01e4723e..db445ebbc 100644 --- a/ui/src/locales/lang/zh-Hant/views/index.ts +++ b/ui/src/locales/lang/zh-Hant/views/index.ts @@ -12,7 +12,7 @@ import model from './model' import document from './document' import paragraph from './paragraph' import problem from './problem' -import log from './log' +import chatLog from './chat-log' import applicationWorkflow from './application-workflow' import login from './login' import operateLog from './operate-log' @@ -31,7 +31,7 @@ export default { document, paragraph, problem, - log, + chatLog, login, operateLog, role diff --git a/ui/src/router/modules/application-detail.ts b/ui/src/router/modules/application-detail.ts index bb77d5901..bc3bc89e9 100644 --- a/ui/src/router/modules/application-detail.ts +++ b/ui/src/router/modules/application-detail.ts @@ -57,19 +57,19 @@ const ApplicationDetailRouter = { }, component: () => import('@/views/hit-test/index.vue'), }, - // { - // path: 'log', - // name: 'Log', - // meta: { - // icon: 'app-document', - // iconActive: 'app-document-active', - // title: 'views.log.title', - // active: 'log', - // parentPath: '/application/:id/:type', - // parentName: 'ApplicationDetail' - // }, - // component: () => import('@/views/log/index.vue') - // } + { + path: 'chat-log', + name: 'ChatLog', + meta: { + icon: 'app-document', + iconActive: 'app-document-active', + title: 'views.chatLog.title', + active: 'log', + parentPath: '/application/:id/:type', + parentName: 'ApplicationDetail' + }, + component: () => import('@/views/chat-log/index.vue') + } ], } diff --git a/ui/src/stores/index.ts b/ui/src/stores/index.ts index b04575e49..91e47b839 100644 --- a/ui/src/stores/index.ts +++ b/ui/src/stores/index.ts @@ -10,7 +10,7 @@ import useProblemStore from './modules/problem' import useParagraphStore from './modules/paragraph' import useDocumentStore from './modules/document' import useApplicationStore from './modules/application' - +import useChatLogStore from './modules/chat-log' const useStore = () => ({ common: useCommonStore(), login: useLoginStore(), @@ -24,6 +24,7 @@ const useStore = () => ({ paragraph: useParagraphStore(), document: useDocumentStore(), application: useApplicationStore(), + chatLog: useChatLogStore(), }) export default useStore diff --git a/ui/src/stores/modules/chat-log.ts b/ui/src/stores/modules/chat-log.ts new file mode 100644 index 000000000..6ce738657 --- /dev/null +++ b/ui/src/stores/modules/chat-log.ts @@ -0,0 +1,78 @@ +import { defineStore } from 'pinia' +import chatLogApi from '@/api/application/chat-log' +import { type Ref } from 'vue' +import type { pageRequest } from '@/api/type/common' + +const useChatLogStore = defineStore('chatLog',{ + state: () => ({}), + actions: { + async asyncGetChatLog(id: string, page: pageRequest, param: any, loading?: Ref) { + return new Promise((resolve, reject) => { + chatLogApi + .getChatLog(id, page, param, loading) + .then((data) => { + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + async asyncChatRecordLog( + id: string, + chatId: string, + page: pageRequest, + loading?: Ref, + order_asc?: boolean + ) { + return new Promise((resolve, reject) => { + chatLogApi + .getChatRecordLog(id, chatId, page, loading, order_asc) + .then((data) => { + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + async asyncGetChatLogClient(id: string, page: pageRequest, loading?: Ref) { + return new Promise((resolve, reject) => { + chatLogApi + .getChatLogClient(id, page, loading) + .then((data) => { + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + async asyncDelChatClientLog(id: string, chatId: string, loading?: Ref) { + return new Promise((resolve, reject) => { + chatLogApi + .delChatClientLog(id, chatId, loading) + .then((data) => { + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + async asyncPutChatClientLog(id: string, chatId: string, data: any, loading?: Ref) { + return new Promise((resolve, reject) => { + chatLogApi + .putChatClientLog(id, chatId, data, loading) + .then((data) => { + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + } + } +}) + +export default useChatLogStore diff --git a/ui/src/views/application/ApplicationSetting.vue b/ui/src/views/application/ApplicationSetting.vue index f200c4cd9..4e7013e33 100644 --- a/ui/src/views/application/ApplicationSetting.vue +++ b/ui/src/views/application/ApplicationSetting.vue @@ -156,7 +156,7 @@ {{ $t('common.paramSetting') }} - + @@ -180,11 +180,11 @@ v-for="(item, index) in applicationForm.knowledge_id_list" :key="index" > - +
- {{ relatedObject(datasetList, item, 'id')?.name }}
- + @@ -470,12 +470,12 @@ - @@ -491,7 +491,7 @@ import { useRoute } from 'vue-router' import { groupBy } from 'lodash' import AIModeParamSettingDialog from './component/AIModeParamSettingDialog.vue' import ParamSettingDialog from './component/ParamSettingDialog.vue' -import AddDatasetDialog from './component/AddDatasetDialog.vue' +import AddKnowledgeDialog from './component/AddKnowledgeDialog.vue' import EditAvatarDialog from '@/views/application-overview/component/EditAvatarDialog.vue' import applicationApi from '@/api/application/application' import { isAppIcon } from '@/utils/common' @@ -529,11 +529,11 @@ const TTSModeParamSettingDialogRef = ref>() const applicationFormRef = ref() -const AddDatasetDialogRef = ref() +const AddKnowledgeDialogRef = ref() const EditAvatarDialogRef = ref() const loading = ref(false) -const datasetLoading = ref(false) +const knowledgeLoading = ref(false) const applicationForm = ref({ name: '', desc: '', @@ -578,7 +578,7 @@ const rules = reactive>({ ], }) const modelOptions = ref(null) -const datasetList = ref([]) +const knowledgeList = ref([]) const sttModelOptions = ref(null) const ttsModelOptions = ref(null) const showEditIcon = ref(false) @@ -660,7 +660,7 @@ function refreshTTSForm(data: any) { applicationForm.value.tts_model_params_setting = data } -function removeDataset(id: any) { +function removeKnowledge(id: any) { if (applicationForm.value.knowledge_id_list) { applicationForm.value.knowledge_id_list.splice( applicationForm.value.knowledge_id_list.indexOf(id), @@ -669,12 +669,12 @@ function removeDataset(id: any) { } } -function addDataset(val: Array) { +function addKnowledge(val: Array) { applicationForm.value.knowledge_id_list = val } -function openDatasetDialog() { - AddDatasetDialogRef.value.open(applicationForm.value.knowledge_id_list) +function openKnowledgeDialog() { + AddKnowledgeDialogRef.value.open(applicationForm.value.knowledge_id_list) } function getDetail() { @@ -692,9 +692,9 @@ function getDetail() { }) } -function getDataset() { - application.asyncGetApplicationDataset(id, datasetLoading).then((res: any) => { - datasetList.value = res.data +function getKnowledge() { + application.asyncGetApplicationKnowledge(id, knowledgeLoading).then((res: any) => { + knowledgeList.value = res.data }) } @@ -766,12 +766,12 @@ function refreshIcon() { } function refresh() { - getDataset() + getKnowledge() } onMounted(() => { // getModel() - // getDataset() + // getKnowledge() // getDetail() // getSTTModel() // getTTSModel() @@ -779,7 +779,7 @@ onMounted(() => { diff --git a/ui/src/views/chat-log/component/EditContentDialog.vue b/ui/src/views/chat-log/component/EditContentDialog.vue new file mode 100644 index 000000000..157e71909 --- /dev/null +++ b/ui/src/views/chat-log/component/EditContentDialog.vue @@ -0,0 +1,307 @@ + + + diff --git a/ui/src/views/chat-log/component/EditMarkDialog.vue b/ui/src/views/chat-log/component/EditMarkDialog.vue new file mode 100644 index 000000000..9755cd845 --- /dev/null +++ b/ui/src/views/chat-log/component/EditMarkDialog.vue @@ -0,0 +1,174 @@ + + + diff --git a/ui/src/views/chat-log/index.vue b/ui/src/views/chat-log/index.vue new file mode 100644 index 000000000..8b2232296 --- /dev/null +++ b/ui/src/views/chat-log/index.vue @@ -0,0 +1,662 @@ + + + diff --git a/ui/src/workflow/nodes/search-dataset-node/index.vue b/ui/src/workflow/nodes/search-dataset-node/index.vue index 3a7a1b6cb..59a7a8e3c 100644 --- a/ui/src/workflow/nodes/search-dataset-node/index.vue +++ b/ui/src/workflow/nodes/search-dataset-node/index.vue @@ -10,10 +10,10 @@ label-width="auto" ref="DatasetNodeFormRef" > - +