|
@@ -22,13 +22,18 @@
|
|
|
<Suggestion :suggestions="suggestions" :readonly="readonly"/>
|
|
<Suggestion :suggestions="suggestions" :readonly="readonly"/>
|
|
|
|
|
|
|
|
<div class="dialog-list" v-if="dialogList.length > 0" :key="randomKey">
|
|
<div class="dialog-list" v-if="dialogList.length > 0" :key="randomKey">
|
|
|
- <div :class="['dialog-item', isSetting ? '' : 'dialog-absolute', 'dialog-item-' + key]" v-for="(item, key) in dialogList"
|
|
|
|
|
- :key="item.key" :data-item-index="key">
|
|
|
|
|
|
|
+ <div
|
|
|
|
|
+ :class="['dialog-item', isSetting ? '' : 'dialog-absolute', 'dialog-item-' + key]"
|
|
|
|
|
+ v-for="(item, key) in dialogList"
|
|
|
|
|
+ :key="item.key"
|
|
|
|
|
+ :data-item-index="key"
|
|
|
|
|
+ >
|
|
|
<div class="dialog-header" v-if="item?.question">
|
|
<div class="dialog-header" v-if="item?.question">
|
|
|
<div class="user-name" style="background-color: rgb(255, 110, 110)">
|
|
<div class="user-name" style="background-color: rgb(255, 110, 110)">
|
|
|
{{ userName.slice(0, 1) }}
|
|
{{ userName.slice(0, 1) }}
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+
|
|
|
<div class="dialog-footer" v-if="item?.question">
|
|
<div class="dialog-footer" v-if="item?.question">
|
|
|
<p style="margin-top: 0">{{ item.question }}</p>
|
|
<p style="margin-top: 0">{{ item.question }}</p>
|
|
|
</div>
|
|
</div>
|
|
@@ -49,6 +54,7 @@
|
|
|
<span v-html="item.sql"></span>
|
|
<span v-html="item.sql"></span>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+
|
|
|
<div class="dialog-footer" v-else-if="item?.capacity"
|
|
<div class="dialog-footer" v-else-if="item?.capacity"
|
|
|
:style="{ display: dialogConfig.type === 'paper' ? 'inline-block' : 'block' }">
|
|
:style="{ display: dialogConfig.type === 'paper' ? 'inline-block' : 'block' }">
|
|
|
<div v-if="type === 'knowledge'" @click="openCapacity(key)"
|
|
<div v-if="type === 'knowledge'" @click="openCapacity(key)"
|
|
@@ -65,6 +71,7 @@
|
|
|
<a-spin :size="18" />
|
|
<a-spin :size="18" />
|
|
|
<span>{{ type === 'excel' ? '正在为您合并...' : '正在为您搜索答案...' }}</span>
|
|
<span>{{ type === 'excel' ? '正在为您合并...' : '正在为您搜索答案...' }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+
|
|
|
<section v-if="type === 'knowledge' && item.capacity.status === 'loaded'" v-show="menuList[key].open">
|
|
<section v-if="type === 'knowledge' && item.capacity.status === 'loaded'" v-show="menuList[key].open">
|
|
|
<div v-if="item.capacity.data.list">
|
|
<div v-if="item.capacity.data.list">
|
|
|
<p v-for="(item, key) in item.capacity.data.list" :key="key">
|
|
<p v-for="(item, key) in item.capacity.data.list" :key="key">
|
|
@@ -73,6 +80,7 @@
|
|
|
</a-typography-paragraph>
|
|
</a-typography-paragraph>
|
|
|
</p>
|
|
</p>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+
|
|
|
<div v-if="item.capacity.data.documents">
|
|
<div v-if="item.capacity.data.documents">
|
|
|
<div v-for="(document, documentKey) in item.capacity.data.documents" :key="documentKey">
|
|
<div v-for="(document, documentKey) in item.capacity.data.documents" :key="documentKey">
|
|
|
<div @click="openDocument(key, documentKey)" :class="[readonly ? 'disabled' : '']">
|
|
<div @click="openDocument(key, documentKey)" :class="[readonly ? 'disabled' : '']">
|
|
@@ -114,12 +122,30 @@
|
|
|
<em>DOCX,13.19KB</em>
|
|
<em>DOCX,13.19KB</em>
|
|
|
</span>
|
|
</span>
|
|
|
</span>
|
|
</span>
|
|
|
- <span v-else v-html="getHTML(item.answer)"></span>
|
|
|
|
|
|
|
+ <!-- <span v-else v-html="getHTML(item.answer)"></span> -->
|
|
|
|
|
+
|
|
|
|
|
+ <Answer v-else
|
|
|
|
|
+ :answer="item.answer"
|
|
|
|
|
+ :index="key"
|
|
|
|
|
+ :chat_id="dialogId"
|
|
|
|
|
+ :chat_type="type"
|
|
|
|
|
+ :agentId="agentId"
|
|
|
|
|
+ :special_refference="item.fullRefference"
|
|
|
|
|
+ />
|
|
|
</p>
|
|
</p>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="dialog-footer" v-else>
|
|
<div class="dialog-footer" v-else>
|
|
|
- <span v-html="getHTML(item.answer)"></span>
|
|
|
|
|
|
|
+ <!-- <span v-html="getHTML(item.answer)"></span> -->
|
|
|
|
|
+
|
|
|
|
|
+ <Answer
|
|
|
|
|
+ :answer="item.answer"
|
|
|
|
|
+ :index="key"
|
|
|
|
|
+ :chat_id="dialogId"
|
|
|
|
|
+ :chat_type="type"
|
|
|
|
|
+ :agentId="agentId"
|
|
|
|
|
+ :special_refference="item.fullRefference"
|
|
|
|
|
+ />
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 处理来源 -->
|
|
<!-- 处理来源 -->
|
|
@@ -230,19 +256,23 @@ import DialogFeedback from "./DialogFeedback.vue";
|
|
|
import { defineComponent, ref, onBeforeUnmount, onMounted, reactive, nextTick, inject } from "vue";
|
|
import { defineComponent, ref, onBeforeUnmount, onMounted, reactive, nextTick, inject } from "vue";
|
|
|
|
|
|
|
|
import formatAnwserString from './refference-effect/format-anwser-string';
|
|
import formatAnwserString from './refference-effect/format-anwser-string';
|
|
|
-import applyRefferencePopover from './refference-effect/apply-refference-popover';
|
|
|
|
|
-import applyImageDisplay from './refference-effect/apply-image-display';
|
|
|
|
|
|
|
+// import applyRefferencePopover from './refference-effect/apply-refference-popover';
|
|
|
|
|
+// import applyImageDisplay from './refference-effect/apply-image-display';
|
|
|
import initTempHistory, {getChatIdFromUrl} from './refference-effect/temp-history';
|
|
import initTempHistory, {getChatIdFromUrl} from './refference-effect/temp-history';
|
|
|
|
|
|
|
|
import { getDocumentUrl } from '../ajax/document';
|
|
import { getDocumentUrl } from '../ajax/document';
|
|
|
|
|
|
|
|
import Suggestion from './dialog-wrap/Suggestion.vue';
|
|
import Suggestion from './dialog-wrap/Suggestion.vue';
|
|
|
|
|
|
|
|
|
|
+import Answer from './dialog-wrap/Answer.vue';
|
|
|
|
|
+
|
|
|
export default defineComponent({
|
|
export default defineComponent({
|
|
|
components: {
|
|
components: {
|
|
|
DialogFeedback,
|
|
DialogFeedback,
|
|
|
|
|
|
|
|
- Suggestion
|
|
|
|
|
|
|
+ Suggestion,
|
|
|
|
|
+
|
|
|
|
|
+ Answer
|
|
|
},
|
|
},
|
|
|
props: [
|
|
props: [
|
|
|
"open",
|
|
"open",
|
|
@@ -292,6 +322,10 @@ export default defineComponent({
|
|
|
content_ltks: [item.reference.chunks.find(chunk => chunk.doc_id == reference.doc_id).content_ltks]
|
|
content_ltks: [item.reference.chunks.find(chunk => chunk.doc_id == reference.doc_id).content_ltks]
|
|
|
}
|
|
}
|
|
|
}) : [],
|
|
}) : [],
|
|
|
|
|
+
|
|
|
|
|
+ // 完整的引用数据: pdf文档引用效果需要使用此数据
|
|
|
|
|
+ fullRefference: item.reference,
|
|
|
|
|
+
|
|
|
// 如果有文件处理完拿第一个,后续有变动再改
|
|
// 如果有文件处理完拿第一个,后续有变动再改
|
|
|
file: (item.files && item.files.length > 0) ? item.files.map(item => {
|
|
file: (item.files && item.files.length > 0) ? item.files.map(item => {
|
|
|
const port = window.location.port ? `:${window.location.port}` : '';
|
|
const port = window.location.port ? `:${window.location.port}` : '';
|
|
@@ -424,6 +458,9 @@ export default defineComponent({
|
|
|
const isLoaded = ref(false);
|
|
const isLoaded = ref(false);
|
|
|
const answerData = ref("");
|
|
const answerData = ref("");
|
|
|
const answerReference = ref([]);
|
|
const answerReference = ref([]);
|
|
|
|
|
+ const fullRefference = reactive({
|
|
|
|
|
+ full_ref: {}
|
|
|
|
|
+ });
|
|
|
const imageUrl = ref(undefined);
|
|
const imageUrl = ref(undefined);
|
|
|
const answerFile = ref(undefined);
|
|
const answerFile = ref(undefined);
|
|
|
const answerCode = ref(undefined);
|
|
const answerCode = ref(undefined);
|
|
@@ -436,6 +473,7 @@ export default defineComponent({
|
|
|
const addAnswer = (data) => {
|
|
const addAnswer = (data) => {
|
|
|
data.answer = answerData.value;
|
|
data.answer = answerData.value;
|
|
|
data.reference = answerReference.value;
|
|
data.reference = answerReference.value;
|
|
|
|
|
+ data.fullRefference = fullRefference.full_ref; // 完整的引用数据
|
|
|
data.image_url = imageUrl.value;
|
|
data.image_url = imageUrl.value;
|
|
|
data.code = answerCode.value;
|
|
data.code = answerCode.value;
|
|
|
data.file = answerFile.value;
|
|
data.file = answerFile.value;
|
|
@@ -464,8 +502,8 @@ export default defineComponent({
|
|
|
* 应用引用效果
|
|
* 应用引用效果
|
|
|
* 答案中 引用图标(感叹号)点击时,浮层显示引用内容
|
|
* 答案中 引用图标(感叹号)点击时,浮层显示引用内容
|
|
|
*/
|
|
*/
|
|
|
- applyRefferencePopover(props.list);
|
|
|
|
|
- applyImageDisplay(props.list);
|
|
|
|
|
|
|
+ // applyRefferencePopover(props.list);
|
|
|
|
|
+ // applyImageDisplay(props.list);
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* TODO: 只允许保存一条消息,避免出现多条消息同时发送的情况
|
|
* TODO: 只允许保存一条消息,避免出现多条消息同时发送的情况
|
|
@@ -578,6 +616,8 @@ export default defineComponent({
|
|
|
message = replaceCode(message, cur_index);
|
|
message = replaceCode(message, cur_index);
|
|
|
answerData.value = getHTML(message);
|
|
answerData.value = getHTML(message);
|
|
|
answerReference.value = [];
|
|
answerReference.value = [];
|
|
|
|
|
+
|
|
|
|
|
+ fullRefference.full_ref = reference; // 完整引用数据
|
|
|
|
|
|
|
|
// 如有文档引用处理接收到的新消息和引用
|
|
// 如有文档引用处理接收到的新消息和引用
|
|
|
if (reference && reference.doc_aggs && reference.doc_aggs.length > 0) {
|
|
if (reference && reference.doc_aggs && reference.doc_aggs.length > 0) {
|
|
@@ -650,11 +690,11 @@ export default defineComponent({
|
|
|
isLoaded.value = false;
|
|
isLoaded.value = false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 获取所有的临时历史记录
|
|
|
|
|
- const full_history = tempHistory.getHistory();
|
|
|
|
|
- applyRefferencePopover(full_history);
|
|
|
|
|
- const current_index = tempHistory.getChatIndex(cur_chat_id);
|
|
|
|
|
- applyImageDisplay(full_history, current_index);
|
|
|
|
|
|
|
+ // // 获取所有的临时历史记录
|
|
|
|
|
+ // const full_history = tempHistory.getHistory();
|
|
|
|
|
+ // applyRefferencePopover(full_history);
|
|
|
|
|
+ // const current_index = tempHistory.getChatIndex(cur_chat_id);
|
|
|
|
|
+ // applyImageDisplay(full_history, current_index);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
helper.webSocket.onmessage = (event) => {
|
|
helper.webSocket.onmessage = (event) => {
|