소스 검색

feat: 动态agent

奇橙 1 년 전
부모
커밋
190c3fa525
11개의 변경된 파일138개의 추가작업 그리고 76개의 파일을 삭제
  1. 13 0
      src/ajax/api/agent.js
  2. 2 2
      src/ajax/api/message.js
  3. 0 13
      src/ajax/api/scene.js
  4. 2 2
      src/ajax/index.js
  5. 3 0
      src/ajax/request.js
  6. 3 3
      src/components/DialogWrap.vue
  7. 6 18
      src/components/DocumentCards.vue
  8. 13 20
      src/utils/config.js
  9. 18 0
      src/views/DocumentCombine.vue
  10. 76 16
      src/views/Home.vue
  11. 2 2
      src/views/Login.vue

+ 13 - 0
src/ajax/api/agent.js

@@ -0,0 +1,13 @@
+import request from "../request";
+
+/**
+ * 获取agents
+ * @returns {Promise<Object>}
+ */
+const getAgents = () => {
+    return request.get("/api/agent/list");
+};
+
+export default {
+    getAgents
+};

+ 2 - 2
src/ajax/api/message.js

@@ -1,5 +1,5 @@
-const create = (token) => {
-    const ws = new WebSocket(`ws://smartai.com:8000/api/chat/ws/0/0?token=${token}`);
+const create = (token, agentId) => {
+    const ws = new WebSocket(`ws://smartai.com:8000/api/chat/ws/${agentId}/0?token=${token}`);
     // 当 WebSocket 打开时...
     ws.onopen = function (event) {
         console.log("WebSocket 连接已打开");

+ 0 - 13
src/ajax/api/scene.js

@@ -1,13 +0,0 @@
-import request from '../request';
-
-/**
- * 获取阅读场景
- * @returns {Promise<Object>}
- */
-const getScenes = () => {
-  return request.get('/app-api/ai/scene/get');
-};
-
-export default {
-  getScenes
-};

+ 2 - 2
src/ajax/index.js

@@ -1,11 +1,11 @@
 import user from "./api/user";
-import scene from "./api/scene";
+import agent from "./api/agent";
 import knowledge from "./api/knowledge";
 import document from "./api/document";
 import message from "./api/message";
 const api = {
     user,
-    scene,
+    agent,
     knowledge,
     document,
     message

+ 3 - 0
src/ajax/request.js

@@ -11,6 +11,9 @@ const service = axios.create({
 service.interceptors.request.use(
     (config) => {
         helper.setLoading(true);
+        if (helper.read("token")) {
+            config.headers["Authorization"] = `Bearer ${helper.read("token")}`;
+        }
         return config;
     },
     (error) => {

+ 3 - 3
src/components/DialogWrap.vue

@@ -267,7 +267,7 @@ export default defineComponent({
     components: {
         DialogFeedback
     },
-    props: ["open", "suggestions", "isSetting", "readonly", "type", "list"],
+    props: ["open", "suggestions", "isSetting", "readonly", "type", "list", "agentId"],
     setup(props, { emit }) {
         const knowledgeList = ref([
             {
@@ -390,7 +390,7 @@ export default defineComponent({
 
 谢谢!
 
-信通小数`;
+上海电科院`;
             let result = { question: "", capacity: null, answer: "", other: null, file: null };
             // 第一步,输入问题
             const step1 = () => {
@@ -525,7 +525,7 @@ export default defineComponent({
         });
         onMounted(() => {
             scrollToEnd();
-            helper.webSocket = ajax.message.create(helper.read("token"));
+            helper.webSocket = ajax.message.create(helper.read("token"), props.agentId);
             helper.webSocket.onmessage = (event) => {
                 console.log(JSON.parse(event.data));
                 const { type, message, category } = JSON.parse(event.data);

+ 6 - 18
src/components/DocumentCards.vue

@@ -71,15 +71,13 @@
                                     @before-remove="onBeforeRemove"
                                     :custom-request="customRequest"
                                     :show-upload-button="{ showOnExceedLimit: true }"
-                                    :accept="uploadImg ? '.png,.jpg' : '.pdf,.doc,.docx,.txt,.csv'"
+                                    :accept="uploadImg ? '.png,.jpg' : '.xlsx‌'"
                                 >
                                     <template #upload-button>
                                         <div class="upload-main">
                                             <p>拖拽{{ uploadImg ? "图片" : "文档" }}到这里,或<span>点此上传</span></p>
                                             <span>
-                                                支持上传{{
-                                                    uploadImg ? ".png,.jpg图片" : ".pdf,.doc,.docx,.txt,.csv文档"
-                                                }},大小不超过30M
+                                                支持上传{{ uploadImg ? ".png,.jpg图片" : ".xlsx‌文档" }},大小不超过30M
                                             </span>
                                         </div>
                                     </template>
@@ -149,27 +147,17 @@
                             <a-button type="outline" style="margin-right: 10px" @click="selectFiles(false)"
                                 >取消</a-button
                             >
-                            <a-button
-                                type="primary"
-                                style="margin-right: 10px"
-                                @click="selectFiles(true, 'topic')"
-                                v-if="isQuestion"
-                                >去出题({{ selectedKeys.length }})</a-button
-                            >
-                            <a-button type="primary" @click="selectFiles(true, 'paper')" v-if="isQuestion"
-                                >去出卷({{ selectedKeys.length }})</a-button
-                            >
-                            <a-button type="primary" @click="selectFiles(true, 'question')" v-if="!isQuestion"
-                                >去提问({{ selectedKeys.length }})</a-button
+                            <a-button type="primary" @click="selectFiles(true, 'paper')"
+                                >去合并({{ selectedKeys.length }})</a-button
                             >
                         </div>
                     </div>
                 </template>
             </a-popover>
-            <section v-if="hasSlider">
+            <!-- <section v-if="hasSlider">
                 <p>出题随机性</p>
                 <a-slider :default-value="50" :style="{ width: '100px' }" />
-            </section>
+            </section> -->
         </footer>
     </main>
 </template>

+ 13 - 20
src/utils/config.js

@@ -1,41 +1,34 @@
 export default {
-    defaultTitle: "信通小数",
+    defaultTitle: "上海电科院",
     defaultDesc: "国网湖北电力AI能力平台,为你的下一个创意助力",
     slider: [
         {
-            title: "知识问答",
-            icon: "5",
-            img: "/src/assets/index/5.png",
-            desc: "遍历已创建的文档知识库,生成完整和准确的答案,同时显示来源文档供您参考",
-            dialog: "垂域知识的问答助手,针对你的提问,我们将遍历已创建的文档知识库,生成完整和准确的答案,同时显示来源文档供您参考。"
-        },
-        {
-            title: "文档智能",
+            title: "报告生成",
             icon: "2",
             img: "/src/assets/index/2.png",
             desc: "个人知识库的问答助手,基于您上传的文档进行问答,支持多文档",
             dialog: "个人知识库的问答助手,基于您上传的文档进行问答,支持多文档,大小在30M以内。"
         },
         {
-            title: "文档出卷",
+            title: "报表合并",
             icon: "6",
             img: "/src/assets/index/6.png",
             desc: "针对单文档或多个文档内容自动出题,高效便捷的帮助你建立私人题库",
             dialog: "您可以上传文档,小数能针对单文档或多个文档内容自动出题,高效便捷的帮助你建立私人题库。"
         },
         {
-            title: "小数绘图",
-            icon: "7",
-            img: "/src/assets/index/7.png",
-            desc: "基于您上传的图片,生成对应的文字描述并基于图片内容实现问答",
-            dialog: "基于您上传的图片,生成对应的文字描述并基于图片内容实现问答。"
+            title: "知识问答",
+            icon: "5",
+            img: "/src/assets/index/5.png",
+            desc: "遍历已创建的文档知识库,生成完整和准确的答案,同时显示来源文档供您参考",
+            dialog: "垂域知识的问答助手,针对你的提问,我们将遍历已创建的文档知识库,生成完整和准确的答案,同时显示来源文档供您参考。"
         },
         {
-            title: "智能数据",
-            icon: "8",
-            img: "/src/assets/index/8.png",
-            desc: "您可以上传文档或添加数据库地址,小数可针对你文档的数据进行分析,并生成指定的图表",
-            dialog: "您可以上传文档或添加数据库地址,小数可针对你文档的数据进行分析,并生成指定的图表。"
+            title: "文档智能",
+            icon: "7",
+            img: "/src/assets/index/7.png",
+            desc: "个人知识库的问答助手,基于您上传的文档进行问答,支持多文档",
+            dialog: "个人知识库的问答助手,基于您上传的文档进行问答,支持多文档,大小在30M以内。"
         },
         {
             title: "智能问答",

+ 18 - 0
src/views/DocumentCombine.vue

@@ -0,0 +1,18 @@
+<template>
+    <document-cards :data="data" :hasUpload="false" :hasSlider="false" />
+</template>
+<script>
+import DocumentCards from "@/components/DocumentCards.vue";
+import { defineComponent, ref, inject, reactive } from "vue";
+export default defineComponent({
+    components: {
+        DocumentCards
+    },
+    setup() {
+        const data = ref([]);
+        return {
+            data
+        };
+    }
+});
+</script>

+ 76 - 16
src/views/Home.vue

@@ -22,24 +22,22 @@
                             <div>
                                 <img src="@/assets/other/robot.gif" width="52" />
                                 <p>
-                                    信通小数<span>{{ slider[navIndex].title }}</span>
+                                    上海电科院<span>{{ slider[navIndex].title }}</span>
                                 </p>
                                 <span>{{ slider[navIndex].dialog }}</span>
                             </div>
                         </header>
                         <section :class="{ 'section-padding': showDialog }">
-                            <!-- 知识问答 -->
-                            <DocumentAnswer v-if="navIndex === 0 && !showDialog" />
-                            <!-- 文档智能 -->
+                            <!-- 报告生成 -->
+                            <DocumentCombine v-if="navIndex === 0 && !showDialog" />
+                            <!-- 报表合并 -->
                             <Document v-if="navIndex === 1 && !showDialog" />
-                            <!-- 文档出题 -->
+                            <!-- 知识问答 -->
                             <DocumentQuestion v-if="navIndex === 2 && !showDialog" />
-                            <!-- 小数绘图 -->
-                            <PicArticle v-if="navIndex === 3 && !showDialog" />
-                            <!-- 智能数据 -->
-                            <Analysis v-if="navIndex === 4 && !showDialog" />
+                            <!-- 文档智能 -->
+                            <DocumentAnswer v-if="navIndex === 3 && !showDialog" />
                             <!-- 智能问答 -->
-                            <Answer v-if="navIndex === 5 && !showDialog" />
+                            <Answer v-if="navIndex === 4 && !showDialog" />
                             <!-- 文库详情 -->
                             <DocumentDetail v-if="navIndex === -2" @go-back="goBack" />
                             <dialog-wrap
@@ -50,12 +48,26 @@
                                 :readonly="readonly"
                                 @setReadonly="setReadonly"
                                 @goDocument="goDocument"
+                                :agentId="agentIds[navIndex]"
                                 :list="dialogList"
                             />
                         </section>
-                        <footer v-if="navIndex !== -2">
+                        <footer v-if="navIndex !== -2 && navIndex !== 0">
                             <message-input :readonly="readonly" eventName="open-dialog" />
                         </footer>
+                        <footer v-if="navIndex === 0" class="upload-footer">
+                            <p><span>标题</span></p>
+                            <div><a-input :style="{ flex: '1' }" placeholder="请输入标题" allow-clear /></div>
+                            <div>
+                                <p><span>请上传文档</span></p>
+                                <a-upload :style="{ width: '110px' }" action="/" />
+                            </div>
+                            <div>
+                                <p><span>请上传中心动态</span></p>
+                                <a-upload :style="{ width: '110px' }" action="/" />
+                            </div>
+                            <a-button :style="{ width: '500px' }" type="primary" @click="beginCombine">开始</a-button>
+                        </footer>
                         <a-tooltip :content="closeOthers ? '收起' : '展开'">
                             <div @click="openAll" v-if="navIndex !== -2">
                                 <img src="@/assets/other/open.svg" width="20" v-if="closeOthers" />
@@ -65,7 +77,7 @@
                     </div>
                 </div>
             </div>
-            <right v-if="navIndex === 0 || navIndex === 2" />
+            <!-- <right v-if="navIndex === 0 || navIndex === 2" /> -->
         </div>
     </div>
 </template>
@@ -76,6 +88,7 @@ import Slider from "../components/Slider.vue";
 import History from "../components/History.vue";
 import MessageInput from "../components/MessageInput.vue";
 import DocumentDetail from "./DocumentDetail.vue";
+import DocumentCombine from "./DocumentCombine.vue";
 import Index from "./Index.vue";
 import Answer from "./Answer.vue";
 import Document from "./Document.vue";
@@ -98,7 +111,8 @@ export default defineComponent({
         DocumentAnswer,
         DocumentQuestion,
         Analysis,
-        DocumentDetail
+        DocumentDetail,
+        DocumentCombine
     },
     setup() {
         // nav对应的问答类型,4文库问答,对应的是knowledge类型
@@ -113,6 +127,7 @@ export default defineComponent({
         const selectId = ref("");
         const initDialog = ref(false);
         const hideDialog = ref(false);
+        const agentIds = ref([]);
         const openAll = () => {
             closeOthers.value = !closeOthers.value;
         };
@@ -153,7 +168,17 @@ export default defineComponent({
                 helper.$bus.emit("set-loading", false);
             }, 20);
         };
-        onMounted(() => {
+        const beginCombine = () => {
+            dialogList.value = [];
+            showDialog.value = true;
+            initDialog.value = true;
+            setTimeout(() => {
+                helper.$bus.emit("send-message", "开始");
+            }, 500);
+        };
+        onMounted(async () => {
+            const agents = await ajax.agent.getAgents();
+            agentIds.value = agents.map((data) => data.id);
             helper.$bus.on("open-dialog", (value) => {
                 dialogList.value = [];
                 showDialog.value = true;
@@ -164,10 +189,11 @@ export default defineComponent({
             });
         });
         onBeforeUnmount(() => {
-            helper.webSocket.close();
+            helper.webSocket?.close();
             helper.$bus.off("open-dialog");
         });
         return {
+            beginCombine,
             selectId,
             navIndex,
             selectNav,
@@ -184,13 +210,47 @@ export default defineComponent({
             initDialog,
             goDocument,
             goBack,
-            hideDialog
+            hideDialog,
+            agentIds
         };
     }
 });
 </script>
 <style lang="scss" scoped>
 .main {
+    .upload-footer {
+        margin-bottom: 50px;
+        padding: 20px;
+        width: 540px;
+        border: 1px solid #eee;
+        > div {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            width: 500px;
+            > p {
+                width: 150px;
+                margin-right: 10px;
+            }
+        }
+        p {
+            span {
+                position: relative;
+                &:after {
+                    content: "*";
+                    display: block;
+                    color: red;
+                    position: absolute;
+                    right: -10px;
+                    top: -5px;
+                }
+            }
+        }
+        > p,
+        > div {
+            margin: 10px 0;
+        }
+    }
     flex: 1;
     position: relative;
     display: flex;

+ 2 - 2
src/views/Login.vue

@@ -32,8 +32,8 @@ export default defineComponent({
     props: [],
     setup() {
         const { ajax, helper } = inject("$global");
-        const username = ref("zzxzzx");
-        const password = ref("123456");
+        const username = ref("user");
+        const password = ref("123");
         const login = async () => {
             const result = await ajax.user.login(username.value, password.value);
             if (result) {