Quellcode durchsuchen

更新AI取数接口相关参数

zhengnaiwen_citu vor 3 Monaten
Ursprung
Commit
d25cbd17e6

+ 2 - 2
src/api/dataOps.js

@@ -1,8 +1,8 @@
 import http from '@/utils/request'
 
 // 积分 列表
-export function getAsk (data) {
-  return http.post('/api/v0/ask', data)
+export function getAsk (data, config) {
+  return http.post('/api/v0/ask_agent', data, config)
 }
 
 // 积分 列表

+ 3 - 2
src/utils/request.js

@@ -130,14 +130,15 @@ service.interceptors.response.use(
 
 // 请求方法
 const http = {
-  post (url, params) {
+  post (url, params, config = {}) {
     return service.post(url, params, {
       transformRequest: [(params) => {
         return JSON.stringify(params)
       }],
       headers: {
         'Content-Type': 'application/json'
-      }
+      },
+      ...config
     })
   },
   get (url, params) {

+ 86 - 29
src/views/dataChart/privateChart/privateChartEditParams.vue

@@ -47,35 +47,37 @@
                   </template>
                   <template v-else>
                     <div class="py-3">
-                      {{ item.content.summary }}
+                      {{ item.content.response }}
                     </div>
                     <m-card v-if="item.showSql" shadow="never" :body-style="{ background: '#f5f5f5', color: '#777' }">
                       {{ item.content.sql }}
                     </m-card>
                     <div class="mt-3">
-                      <el-popover
-                        placement="bottom"
-                        width="200"
-                        trigger="click"
-                      >
-                        <m-form :ref="`form${i}`" label-width="60px" :items="formItems(item.content.columns)" v-model="item.model"></m-form>
-                        <div style="text-align: right; margin: 0">
-                          <m-button type="primary" size="mini" @click="onRender($refs[`form${i}`], item)">生成图表</m-button>
+                      <template v-if="item.content.columns.length">
+                        <el-popover
+                          placement="bottom"
+                          width="200"
+                          trigger="click"
+                        >
+                          <m-form :ref="`form${i}`" label-width="60px" :items="formItems(item.content.columns)" v-model="item.model"></m-form>
+                          <div style="text-align: right; margin: 0">
+                            <m-button type="primary" size="mini" @click="onRender($refs[`form${i}`], item)">生成图表</m-button>
+                          </div>
+                          <m-button type="primary" text slot="reference">我要作图</m-button>
+                        </el-popover>
+                        <m-table
+                          clearHeader
+                          size="small"
+                          shadow="never"
+                          :headers="item.content.columns"
+                          :items="item.content.rows"
+                        ></m-table>
+                        <div v-if="!item.dataValidation" class="mt-3">
+                          您认为结果是否正确
+                          <m-button class="ml-3" size="mini" type="success" icon="mdi mdi-thumb-up" circle @click="onAddTrain(item, true)"></m-button>
+                          <m-button size="mini" type="info" icon="mdi mdi-thumb-down" circle @click="onAddTrain(item, true)"></m-button>
                         </div>
-                        <m-button type="primary" text slot="reference">我要作图</m-button>
-                      </el-popover>
-                      <m-table
-                        clearHeader
-                        size="small"
-                        shadow="never"
-                        :headers="item.content.columns"
-                        :items="item.content.rows"
-                      ></m-table>
-                      <div v-if="!item.dataValidation" class="mt-3">
-                        您认为结果是否正确
-                        <m-button class="ml-3" size="mini" type="success" icon="mdi mdi-thumb-up" circle @click="onAddTrain(item, true)"></m-button>
-                        <m-button size="mini" type="info" icon="mdi mdi-thumb-down" circle @click="onAddTrain(item, true)"></m-button>
-                      </div>
+                      </template>
                     </div>
                   </template>
                 </div>
@@ -83,9 +85,24 @@
             </div>
           </div>
           <div class="box-input">
+            <div class="pa-3 text-center" v-if="conversationId">
+              <m-button type="orange" size="small" icon="mdi mdi-chat-plus-outline" @click="onNew"> 发起新对话</m-button>
+            </div>
             <el-input placeholder="请输入内容" v-model="inputTxt" @keydown.enter.native="onSubmit">
               <m-button slot="append" icon="el-icon-s-promotion" @click="onSubmit" :loading="!isAlready"></m-button>
             </el-input>
+            <div class="mt-1">
+              <el-tag
+                v-for="chip in chips"
+                :key="chip.value"
+                :type="routingMode === chip.value ? undefined : 'info'"
+                class="mr-2 cursor-pointer"
+                size="small"
+                @click="onClickChoose(chip)"
+              >
+                {{ chip.text }}
+              </el-tag>
+            </div>
           </div>
         </div>
       </el-tab-pane>
@@ -99,10 +116,16 @@ import {
   submitTrainingCorrect,
   submitTrainingError
 } from '@/api/dataOps'
+import { mapGetters } from 'vuex'
 export default {
   name: 'privateChartEditParams',
   data () {
     return {
+      routingMode: undefined,
+      chips: [
+        { text: '聊天模式', value: 'chat_direct' },
+        { text: '数据库模式', value: 'database_direct' }
+      ],
       loading: false,
       activeName: 'third',
       isAlready: true,
@@ -110,10 +133,28 @@ export default {
       items: [{
         type: 2,
         content: '我是您的AI取数助手,请问有什么可以帮到您'
-      }]
+      }],
+      abortController: null,
+      conversationId: undefined
     }
   },
+  computed: {
+    ...mapGetters(['userInfo'])
+  },
   methods: {
+    onNew () {
+      this.abortController.abort('')
+      this.abortController = null
+      this.items.splice(1, this.items.length - 1)
+      this.conversationId = undefined
+    },
+    onClickChoose (item) {
+      if (this.routingMode === item.value) {
+        this.routingMode = undefined
+        return
+      }
+      this.routingMode = item.value
+    },
     formItems (items) {
       return [
         {
@@ -161,21 +202,37 @@ export default {
         }
       }
       this.items.push(ask)
+      this.$nextTick(() => {
+        const container = this.$refs.container
+        // 滚动到底部 - IE11 兼容写法
+        container.scrollTop = container.scrollHeight
+      })
       try {
+        this.abortController = new AbortController()
         const { data } = await getAsk({
-          question: content
+          question: content,
+          user_id: this.userInfo.employeeCode,
+          routing_mode: this.routingMode,
+          conversation_id: this.conversationId
+        }, {
+          signal: this.abortController.signal
         })
-        const { columns, ...obj } = data
+        const { records, ...obj } = data
+
+        const { rows, columns } = records ?? {}
         ask.content = {
           ...obj,
-          columns: columns.map(e => ({ label: e, prop: e, value: e }))
+          rows,
+          columns: columns ? columns.map(e => ({ label: e, prop: e, value: e })) : {}
         }
+        this.conversationId = data.conversation_id
         this.$nextTick(() => {
           const container = this.$refs.container
           // 滚动到底部 - IE11 兼容写法
           container.scrollTop = container.scrollHeight
         })
       } catch (error) {
+        console.log(error)
         ask.content = error
       } finally {
         this.isAlready = true
@@ -229,7 +286,7 @@ export default {
 }
 .box {
   overflow: hidden;
-  $height: 60px;
+  $height: 150px;
   &-msg {
     height: calc(100% - #{$height});
     overflow-y: auto;
@@ -275,8 +332,8 @@ export default {
   &-input {
     height: $height;
     display: flex;
-    align-items: center;
     justify-content: center;
+    flex-direction: column;
   }
 }
 ::v-deep .el-tabs__content {