|
|
@@ -100,7 +100,8 @@
|
|
|
<div class="dialog-footer" v-else>
|
|
|
<span v-html="getHTML(item.answer)"></span>
|
|
|
</div>
|
|
|
- <div v-if="(type === 'knowledge' || type === 'knowledgeQuiz') && knowledgeList.length > 0"
|
|
|
+ <!-- 处理来源 -->
|
|
|
+ <div v-if="(type === 'knowledge' || type === 'knowledgeQuiz') && item.reference && item.reference.length > 0"
|
|
|
class="knowledge-wrap">
|
|
|
<header>
|
|
|
<p>来源</p>
|
|
|
@@ -108,45 +109,7 @@
|
|
|
<!-- <p @click="goKnowledge">查看全部关联 ></p> -->
|
|
|
</header>
|
|
|
<section>
|
|
|
- <div v-for="(knowledge, knowledgeIndex) in knowledgeList" :key="knowledgeIndex">
|
|
|
- <a-popover :title="knowledge.name" position="left">
|
|
|
- <div>
|
|
|
- <span>{{ knowledgeIndex + 1 }}</span>
|
|
|
- <span>{{ knowledge.name }}</span>
|
|
|
- </div>
|
|
|
- <template #content>
|
|
|
- <div class="knowledge-detail">
|
|
|
- <div class="knowledge-content">
|
|
|
- {{ knowledge.contents[knowledge.page] }}
|
|
|
- </div>
|
|
|
- <div class="knowledge-footer">
|
|
|
- <p>检索片段</p>
|
|
|
- <p>
|
|
|
- <span v-for="(content, contentIndex) in knowledge.contents" :key="contentIndex"
|
|
|
- :class="{ active: knowledge.page === contentIndex }" @click="() => {
|
|
|
- knowledge.page = contentIndex;
|
|
|
- }
|
|
|
- ">{{ contentIndex + 1 }}</span>
|
|
|
- </p>
|
|
|
- <!-- TODO详情暂时注释 -->
|
|
|
- <!-- <p @click="goKnowledge(knowledge.id)">查看详情></p> -->
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </a-popover>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 历史记录的引用来源 -->
|
|
|
- <div v-if="item.reference && item.reference.doc_aggs" class="knowledge-wrap">
|
|
|
- <header>
|
|
|
- <p>来源</p>
|
|
|
- <!-- TODO详情暂时注释 -->
|
|
|
- <!-- <p @click="goKnowledge">查看全部关联 ></p> -->
|
|
|
- </header>
|
|
|
- <section>
|
|
|
- <div v-for="(knowledge, knowledgeIndex) in item.reference.doc_aggs" :key="knowledgeIndex">
|
|
|
+ <div v-for="(knowledge, knowledgeIndex) in item.reference" :key="knowledgeIndex">
|
|
|
<a-popover :title="knowledge.doc_name" position="left">
|
|
|
<div>
|
|
|
<span>{{ knowledgeIndex + 1 }}</span>
|
|
|
@@ -160,7 +123,7 @@
|
|
|
<div class="knowledge-footer">
|
|
|
<p>检索片段</p>
|
|
|
<p>
|
|
|
- <span v-for="(content, contentIndex) in knowledge.content_ltks[0]" :key="contentIndex"
|
|
|
+ <span v-for="(content, contentIndex) in knowledge.content_ltks" :key="contentIndex"
|
|
|
:class="{ active: knowledge.page === contentIndex }" @click="() => {
|
|
|
knowledge.page = contentIndex;
|
|
|
}
|
|
|
@@ -175,6 +138,7 @@
|
|
|
</div>
|
|
|
</section>
|
|
|
</div>
|
|
|
+
|
|
|
<div v-if="item.file" class="paper-wrap" @click="downloadFile(item.file.file_url)">
|
|
|
<img src="@/assets/question/excel.svg" v-if="type === 'excel'" />
|
|
|
<img src="@/assets/question/word.svg" v-else />
|
|
|
@@ -241,7 +205,7 @@ export default defineComponent({
|
|
|
},
|
|
|
props: ["open", "suggestions", "isSetting", "readonly", "type", "list", "agentId", "dialogId", 'reference'],
|
|
|
setup(props, { emit }) {
|
|
|
- const knowledgeList = ref([]);
|
|
|
+ const knowledgeList = ref([[{}]]);
|
|
|
const DOCUMENT_RESULT = {};
|
|
|
|
|
|
const getHTML = (string) => {
|
|
|
@@ -258,10 +222,17 @@ export default defineComponent({
|
|
|
return {
|
|
|
answer: replaceCode(item.answer),
|
|
|
question: item.question,
|
|
|
+ reference: (item.reference.chunks && item.reference.doc_aggs) ? item.reference.doc_aggs.map(reference => {
|
|
|
+ return {
|
|
|
+ id: reference.doc_id,
|
|
|
+ doc_name: reference.doc_name,
|
|
|
+ page: 0,
|
|
|
+ content_ltks: [item.reference.chunks.find(chunk => chunk.doc_id == reference.doc_id).content_ltks]
|
|
|
+ }
|
|
|
+ }) : []
|
|
|
}
|
|
|
});
|
|
|
const dialogList = reactive(list || []);
|
|
|
-
|
|
|
const randomKey = ref(0);
|
|
|
const showFeedback = ref(false);
|
|
|
const menuList = reactive([]);
|
|
|
@@ -291,60 +262,6 @@ export default defineComponent({
|
|
|
randomKey.value = Math.random();
|
|
|
scrollToEnd();
|
|
|
};
|
|
|
- const mockLink = (text, file = null) => {
|
|
|
- let num2 = 0;
|
|
|
- let p1 = text;
|
|
|
- const p2 = `尊敬的领导,
|
|
|
-
|
|
|
-因个人原因,我计划于2023年11月6日至11月10日请假。在此期间,我将妥善安排工作,确保任务顺利完成。恳请批准。
|
|
|
-
|
|
|
-谢谢!`;
|
|
|
- let result = { question: "", capacity: null, answer: "", other: null, file: null };
|
|
|
- // 第一步,输入问题
|
|
|
- const step1 = () => {
|
|
|
- result.question = p1;
|
|
|
- if (file) {
|
|
|
- result.file = file;
|
|
|
- addData(result);
|
|
|
- }
|
|
|
- step2();
|
|
|
- };
|
|
|
- // 第二步,调用能力
|
|
|
- const step2 = () => {
|
|
|
- const mockData = DOCUMENT_RESULT;
|
|
|
- result.capacity = {
|
|
|
- type: mockData.type,
|
|
|
- text: mockData.text,
|
|
|
- status: "loading",
|
|
|
- data: null
|
|
|
- };
|
|
|
- menuList[dialogIndex] = {
|
|
|
- save: false,
|
|
|
- open: false,
|
|
|
- documentOpenIndex: -1
|
|
|
- };
|
|
|
- addData(result);
|
|
|
- setTimeout(() => {
|
|
|
- result.capacity = mockData;
|
|
|
- addData(result);
|
|
|
- step3();
|
|
|
- }, 1000);
|
|
|
- };
|
|
|
- // 第三步,输出答案
|
|
|
- const step3 = () => {
|
|
|
- emit("set-readonly", true);
|
|
|
- answerInterval = setInterval(() => {
|
|
|
- if (num2 < p2.length + 1) {
|
|
|
- result.answer = p2.slice(0, num2);
|
|
|
- num2 += 1;
|
|
|
- addData(result);
|
|
|
- } else {
|
|
|
- stopWriting();
|
|
|
- }
|
|
|
- }, 50);
|
|
|
- };
|
|
|
- step1();
|
|
|
- };
|
|
|
const saveAnswer = (index) => {
|
|
|
if (!props.readonly) {
|
|
|
menuList[index].save = !menuList[index].save;
|
|
|
@@ -375,7 +292,7 @@ export default defineComponent({
|
|
|
};
|
|
|
const selectSuggestion = (text) => {
|
|
|
if (!props.readonly) {
|
|
|
- mockLink(text);
|
|
|
+
|
|
|
}
|
|
|
};
|
|
|
const copyAnswer = (text) => {
|
|
|
@@ -412,13 +329,15 @@ export default defineComponent({
|
|
|
const loadingData = ref(null);
|
|
|
const isLoaded = ref(false);
|
|
|
const answerData = ref("");
|
|
|
+ const answerReference = ref([]);
|
|
|
const addQuestion = (question, file = null) => {
|
|
|
- let result = { question, capacity: null, answer: "", other: null, file: null };
|
|
|
+ let result = { question, capacity: null, answer: "", other: null, file: null, };
|
|
|
addData(result);
|
|
|
return result;
|
|
|
};
|
|
|
const addAnswer = (data) => {
|
|
|
data.answer = answerData.value;
|
|
|
+ data.reference = answerReference.value;
|
|
|
addData(data);
|
|
|
};
|
|
|
const answerLoaded = () => {
|
|
|
@@ -439,6 +358,7 @@ export default defineComponent({
|
|
|
|
|
|
onMounted(() => {
|
|
|
scrollToEnd();
|
|
|
+
|
|
|
helper.webSocket = ajax.message.create(helper.read("token"), props.agentId, props.dialogId, props.type);
|
|
|
helper.webSocket.onmessage = (event) => {
|
|
|
|
|
|
@@ -465,25 +385,28 @@ export default defineComponent({
|
|
|
addAnswer(loadingData.value);
|
|
|
}
|
|
|
}
|
|
|
- if (type === "message") {
|
|
|
|
|
|
- // 把乱码替换为符号
|
|
|
- message = replaceCode(message)
|
|
|
+ if (type === "message") {
|
|
|
+ // 处理接收到的新消息和引用
|
|
|
+ message = replaceCode(message);
|
|
|
answerData.value = getHTML(message);
|
|
|
- if (answerData.value && !isLoaded.value) {
|
|
|
- answerLoaded();
|
|
|
- }
|
|
|
- addAnswer(loadingData.value);
|
|
|
+ answerReference.value = [];
|
|
|
if (reference.doc_aggs && reference.doc_aggs.length > 0) {
|
|
|
- knowledgeList.value = reference.doc_aggs.map(item => {
|
|
|
+ answerReference.value = reference.doc_aggs.map(item => {
|
|
|
return {
|
|
|
id: item.doc_id,
|
|
|
- name: item.doc_name,
|
|
|
+ doc_name: item.doc_name,
|
|
|
page: 0,
|
|
|
- contents: [reference.chunks.find(chunk => chunk.doc_id == item.doc_id).content_ltks]
|
|
|
+ content_ltks: [reference.chunks.find(chunk => chunk.doc_id == item.doc_id).content_ltks]
|
|
|
}
|
|
|
- })
|
|
|
+ });
|
|
|
}
|
|
|
+ if (answerData.value && !isLoaded.value) {
|
|
|
+ answerLoaded();
|
|
|
+ }
|
|
|
+ addAnswer(loadingData.value);
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
if (type === "close") {
|
|
|
if (!answerData.value) {
|
|
|
@@ -510,6 +433,7 @@ export default defineComponent({
|
|
|
if (props.type === 'doc') {
|
|
|
sendData.doc_ids = [helper.read('docId')];
|
|
|
}
|
|
|
+
|
|
|
helper.webSocket.send(JSON.stringify(sendData));
|
|
|
});
|
|
|
helper.$bus.on("clear-message", () => {
|