Sfoglia il codice sorgente

feat:添加后台接口

AmandaG 6 mesi fa
parent
commit
55b5adcad8

+ 28 - 0
src/api/module/AIRobot.ts

@@ -29,4 +29,32 @@ export const SavePromptConfiguration = (params: any, config: any) => {
     },
     config
   )
+}
+/**
+ * 编辑返回prompt数据
+ */
+export const EditPrompt = (params: any, config: any) => {
+  return HttpAxios.post(
+    `${baseUrl}`,
+    {
+      action: 'robot',
+      operate: 'preview_propmpt_witout_save',
+      ...params
+    },
+    config
+  )
+}
+/**
+ * AI测试问题
+ */
+export const PromptAITest = (params: any, config: any) => {
+  return HttpAxios.post(
+    `${baseUrl}`,
+    {
+      action: 'robot',
+      operate: 'test_with_ds_claude',
+      ...params
+    },
+    config
+  )
 }

+ 1 - 2
src/auto-imports.d.ts

@@ -3,7 +3,6 @@
 // @ts-nocheck
 // noinspection JSUnusedGlobalSymbols
 // Generated by unplugin-auto-import
-// biome-ignore lint: disable
 export {}
 declare global {
   const $api: typeof import('@/api/index')['default']
@@ -69,6 +68,6 @@ declare global {
 // for type re-export
 declare global {
   // @ts-ignore
-  export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
+  export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
   import('vue')
 }

+ 5 - 0
src/styles/elementui.scss

@@ -861,4 +861,9 @@ div .prompt-dialog {
 div .prompt-dialog-inner .el-dialog__header {
   padding: 0;
   height: 48px;
+}
+div .prompt-dialog-inner .el-dialog__body {
+  max-height: 720px;
+  overflow-y: scroll;
+  line-height: 21px; 
 }

+ 0 - 1
src/views/AIRobotChat/src/components/AIQuestions.vue

@@ -139,7 +139,6 @@ const generatePages = () => {
     currentPage = { row1: [], row2: [] }
   }
   pages.value = result.filter((p) => p.row1.length > 0)
-  console.log(pages.value)
 }
 onMounted(() => {
   prepareGroups()

+ 0 - 1
src/views/Layout/src/components/Menu/MenuView.vue

@@ -134,7 +134,6 @@ router.afterEach(() => {
 
 // 路由跳转函数
 const changeRouter = (path: any) => {
-  console.log(path)
   if(path == '/PromptConfiguration') {
     emitter.emit('checkPrompt');
   } else {

+ 117 - 62
src/views/PromptConfiguration/src/PromptConfiguration.vue

@@ -4,6 +4,7 @@ import TableConfiguration from './components/TableConfiguration.vue'
 import RespnseConfiguration from './components/RespnseConfiguration.vue'
 import OutputConfiguration from './components/OutputConfiguration.vue'
 import PreviewTesting from './components/PreviewTesting.vue'
+import submitsucessful from './images/icon_success_big@2x.png'
 import moment from 'moment'
 
 const rolename = ref('')
@@ -12,6 +13,7 @@ const professionalfield = ref('')
 const tabledescription = ref('')
 const maintasks = ref('')
 const outputvalue = ref('')
+const editid = ref('')
 const prompttextvalue = ref('')
 const TableConfigurationref = ref()
 const RespnseConfigurationref = ref()
@@ -22,48 +24,9 @@ const promptValue = ref([])
 const PromptdialogVisible = ref(false)
 const PromptdialogInnerVisible = ref(false)
 const testquestion = ref(false)
-const ChangeLogList = ref([
-  {
-    time: '2025-04-23 09:30 Prompt1',
-    person: '提交人:caroline@kln.com',
-    text: '您是专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL1...'
-  },
-  {
-    time: '2025-04-23 09:30 Prompt2',
-    person: '提交人:caroline@kln.com',
-    text: '您是专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL2...'
-  },
-  {
-    time: '2025-04-23 09:30 Prompt3',
-    person: '提交人:caroline@kln.com',
-    text: '您是专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL3...'
-  },
-  {
-    time: '2025-04-23 09:30 Prompt4',
-    person: '提交人:caroline@kln.com',
-    text: '您是专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL4...'
-  },
-  {
-    time: '2025-04-23 09:30 Prompt5',
-    person: '提交人:caroline@kln.com',
-    text: '您是专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL5...'
-  },
-  {
-    time: '2025-04-23 09:30 Prompt6',
-    person: '提交人:caroline@kln.com',
-    text: '您是专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL6...'
-  },
-  {
-    time: '2025-04-23 09:30 Prompt7',
-    person: '提交人:caroline@kln.com',
-    text: '您是专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL7...'
-  },
-  {
-    time: '2025-04-23 09:30 Prompt8',
-    person: '提交人:caroline@kln.com',
-    text: '您是专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL专家顾问专門从事货运代理行业的SQL8...'
-  }
-])
+const UnableSaveVisible = ref(false)
+const SaveedVisible = ref(false)
+const ChangeLogList = ref([])
 const prompttext = ref('')
 
 const AddTableConfiguration = () => {
@@ -87,7 +50,9 @@ const getPromptConfiguration = () => {
       formatList.value = res.data.formatList
       outputvalue.value = res.data.formatListType
       prompttextvalue.value = res.data.complete_prompt
-      promptValue.value = res.data['Prompt summary']
+      promptValue.value = res.data.prompt_summary
+      editid.value = res.data.id
+      ChangeLogList.value = res.data.prompt_log_record
       if(rolename.value != '' && professionalfield.value != '' && maintasks.value != '' && professionalfield.value != '' && tableDataList.value.length != 0 && stepData.value.length != 0 &&  formatList.value.length != 0 &&  outputvalue.value != '' && prompttextvalue.value != '') {
         testquestion.value = false
       } else {
@@ -96,25 +61,68 @@ const getPromptConfiguration = () => {
     }
   })
 }
-
 // 保存
+const missingmessage = ref()
 const SavePromptConfiguration = () => {
-  $api.SavePromptConfiguration({
-    role_name: rolename.value,
-    professional_field: professionalfield.value,
-    main_tasks: maintasks.value,
-    table_name: tablename.value,
-    table_description: tabledescription.value,
-    tableDataList: tableDataList.value,
-    stepData: stepData.value,
-    formatList: formatList.value,
-    outputvalue: outputvalue.value,
-    prompttextvalue: prompttextvalue.value
-  }).then((res) => {
-    if (res.code === 200) {
-      console.log(res.data)
+  missingmessage.value = ''
+  if(rolename.value != '' && professionalfield.value != '' && maintasks.value != '' && professionalfield.value != '' && tableDataList.value.length != 0 && stepData.value.length != 0 &&  formatList.value.length != 0 &&  outputvalue.value != '' && prompttextvalue.value != '') {
+    $api.SavePromptConfiguration({
+      role_name: rolename.value,
+      professional_field: professionalfield.value,
+      main_tasks: maintasks.value,
+      table_name: tablename.value,
+      table_description: tabledescription.value,
+      tableDataList: tableDataList.value,
+      stepData: stepData.value,
+      formatList: formatList.value,
+      outputvalue: outputvalue.value,
+      prompttextvalue: prompttextvalue.value,
+      id: editid.value
+    }).then((res) => {
+      if (res.code === 200) {
+        SaveedVisible.value = true
+        setTimeout(() => {
+          window.location.reload()
+        }, 3000)
+      }
+    })
+  } else {
+    if(rolename.value == '' || professionalfield.value == '' || maintasks.value == '') {
+      missingmessage.value += '系统角色配置, '
     }
-  })
+    if(tablename.value == '' || tableDataList.value.length == 0) {
+      missingmessage.value += '表结构配置, '
+    }
+    if(stepData.value.length == 0) {
+      missingmessage.value += '响应规则配置, '
+    }
+    if(formatList.value.length == 0 || outputvalue.value == '') {
+      missingmessage.value += '输出格式配置, '
+    }
+    missingmessage.value = missingmessage.value.substring(0, missingmessage.value.length - 2)
+    UnableSaveVisible.value = true
+  }
+}
+
+const EditPrompt = () => {
+  $api.EditPrompt({
+      role_name: rolename.value,
+      professional_field: professionalfield.value,
+      main_tasks: maintasks.value,
+      table_name: tablename.value,
+      table_description: tabledescription.value,
+      tableDataList: tableDataList.value,
+      stepData: stepData.value,
+      formatList: formatList.value,
+      outputvalue: outputvalue.value,
+      prompttextvalue: prompttextvalue.value,
+      id: editid.value
+    }).then((res) => {
+      if (res.code === 200) {
+        prompttextvalue.value = res.data.complete_prompt
+        promptValue.value = res.data.prompt_summary
+      }
+    })
 }
 
 // 导出为txt
@@ -202,9 +210,9 @@ onMounted(() => {
         <el-button class="el-button--default" @click="exporttxt"><span class="font_family icon-icon_import_b icon_dark" style="margin-right: 5px;" ></span>导出完整日志</el-button>
       </div>
     </template>
-    <div class="diaolog-content">
+    <pre class="diaolog-content">
       {{ prompttext }}
-    </div>
+    </pre>
   </el-dialog>
   <div class="prompt-content">
     <!-- 系统角色设置 -->
@@ -262,10 +270,41 @@ onMounted(() => {
      <div class="propmt-border-colorful">
         <div class="prompt-title" style="padding: 0 14px;">预览与测试</div>
         <div style="margin-top: 16px;">
-          <PreviewTesting ref="PreviewTestingref" :prompttext="prompttextvalue" :testquestion="testquestion" :promptValue="promptValue"></PreviewTesting>
+          <PreviewTesting ref="PreviewTestingref" :prompttext="prompttextvalue" :testquestion="testquestion" :promptValue="promptValue" @handleprompt="EditPrompt"></PreviewTesting>
         </div>
      </div>
      <div class="propmt-save"><el-button class="el-button--main" @click="SavePromptConfiguration"><span class="font_family icon-icon_save_b icon_dark" style="margin-right: 5px;"></span>保存生效</el-button></div>
+     <!-- 保存失败 -->
+    <el-dialog v-model="UnableSaveVisible" width="480">
+      <div>{{ missingmessage }} missing.</div>
+      <div>Please complete all required fields.</div>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button
+            class="el-button--danger"
+            @click="UnableSaveVisible = false"
+            style="width: 100px"
+          >
+            OK
+          </el-button>
+        </div>
+      </template>
+      <template #header>
+        <div class="cancel_header">
+          <span class="iconfont_icon iconfont_warning">
+            <svg class="iconfont icon_danger" aria-hidden="true">
+              <use xlink:href="#icon-icon_fail_fill_b"></use>
+            </svg>
+          </span>
+          Unable to Save
+        </div>
+      </template>
+    </el-dialog>
+    <!-- 保存成功 -->
+    <el-dialog v-model="SaveedVisible" width="320" style="height: 212px">
+      <div style="text-align: center"><el-image :src="submitsucessful" style="width: 64px;" /></div>
+      <div style="text-align: center; margin-top: 20px">Saved successfully</div>
+    </el-dialog>
   </div>
 </template>
 
@@ -362,6 +401,8 @@ onMounted(() => {
   padding: 16px;
   margin-bottom: 8px;
   border-radius: 6px;
+  line-height: 21px; 
+  white-space: break-spaces;
 }
 .diaolog-flex {
   display: flex;
@@ -416,4 +457,18 @@ onMounted(() => {
       color: var(--color-theme);
     }
 }
+.cancel_header {
+  font-size: 18px;
+  font-weight: 700;
+  color: var(--color-neutral-1);
+  display: flex;
+  align-items: center;
+}
+.icon_danger {
+  fill: var(--color-btn-danger-bg);
+}
+.iconfont_warning {
+  display: flex;
+  align-items: center;
+}
 </style>

+ 3 - 0
src/views/PromptConfiguration/src/components/CodeBlock.vue

@@ -86,4 +86,7 @@ pre {
 :deep(.hljs-number) {
   color: #42b0d5;
 }
+:deep(.hljs-literal) {
+  color: #42b0d5;
+}
 </style>

+ 10 - 2
src/views/PromptConfiguration/src/components/OutputConfiguration.vue

@@ -46,6 +46,9 @@ watch(
   () => props.formatList,
   (current) => {
     formatList.value = current
+    if(formatList.value == null) {
+      formatList.value = []
+    }
   }
 )
 watch(
@@ -152,6 +155,11 @@ const handleclicksave = () => {
     }
   }
 }
+
+// 删除字段
+const handelclickdelete = (val: any) => {
+  formatList.value.splice(formatList.value.indexOf(val), 1)
+}
 </script>
 <template>
   <div>
@@ -173,7 +181,7 @@ const handleclicksave = () => {
     <div>
       <el-button class="el-button--noborder--configuration prompt-button" @click="handleaddclick">+ 添加字段</el-button>
     </div>
-    <div class="empty" v-if="formatList.length === 0">
+    <div class="empty" v-if="formatList.length == 0 ">
       <div>
         <div><img :src="addimg" width="100" /></div>
         <el-button @click="handleaddclick" class="el-button--main">+ 添加字段</el-button>
@@ -189,7 +197,7 @@ const handleclicksave = () => {
           <el-button class="el-button--blue" style="height: 24px;width: 24px;" @click="handelclickedit(item)">
             <span class="font_family icon-icon_edit_b icon_dark"></span>
           </el-button>
-          <el-button class="el-button--blue" style="height: 24px;width: 24px;">
+          <el-button @click="handelclickdelete(item)" class="el-button--blue" style="height: 24px;width: 24px;">
             <span class="font_family icon-icon_delete_b icon_dark"></span>
           </el-button>
         </div>

+ 24 - 15
src/views/PromptConfiguration/src/components/PreviewTesting.vue

@@ -8,8 +8,7 @@ const testquestionvalue = ref('')
 
 const props = defineProps({
   prompttext: {
-    type: String,
-    default: ''
+    type: String
   },
   testquestion: {
     type: Boolean,
@@ -35,10 +34,12 @@ watch(
     testquestion.value = current
   }
 )
-console.log(testquestion.value)
+
+const emits = defineEmits(['handleprompt'])
 
 const handleclickprompt = () => {
   PromptdialogVisible.value = true
+  emits('handleprompt')
 }
 
 // 导出为txt
@@ -59,14 +60,21 @@ const exporttxt = () => {
   URL.revokeObjectURL(link.href)
 }
 
-const unformattedJson = ref({
-  name: "Vue3",
-  features: [{
-    name: "123",
-    text: "156"
-  }],
-  version: 3.2
-})
+const unformattedJson = ref({})
+
+const PromptAITest = (val:any) => {
+  if(testquestion.value == false) {
+    $api.PromptAITest({
+      test_ai_method: val,
+      test_question: testquestionvalue.value,
+      prompt: prompttext.value
+    }).then((res) => {
+      if (res.code === 200) {
+        unformattedJson.value = res.data
+      }
+    })
+  }
+}
 
 </script>
 
@@ -97,7 +105,7 @@ const unformattedJson = ref({
       <div class="preview_content" v-if="promptValue.length == 0">暂无数据</div>
       <div class="preview_content" v-else>
         <div class="preview_content_title">提示词摘要</div>
-        <div class="preview_content_item" v-for="item in promptValue" :key="item">{{ item }}</div>
+        <div class="preview_content_item" v-for="(item, index) in promptValue" :key="index">{{ item }}</div>
       </div>
     </div>
     <div class="test">
@@ -111,10 +119,10 @@ const unformattedJson = ref({
         <el-input type="textarea" v-model="testquestionvalue"></el-input>
       </div>
       <div class="test_flex">
-        <div class="test_button" :class="{opacity: testquestion}">
+        <div class="test_button" :class="{opacity: testquestion}" @click="PromptAITest('DS')">
           <div class="test_button_color"><img :src="icon" width="16px" /> Test with DS</div>
         </div>
-        <div class="test_button" :class="{opacity: testquestion}">
+        <div class="test_button" :class="{opacity: testquestion}" @click="PromptAITest('Claude')">
           <div class="test_button_color"><img :src="icon" width="16px" />Test with Claude</div>
         </div>
       </div>
@@ -122,7 +130,7 @@ const unformattedJson = ref({
         测试结果
       </div>
       <div class="test_result">
-        <div v-if="testquestion" class="test_result_text">暂无数据</div>
+        <div v-if="Object.keys(unformattedJson).length == 0" class="test_result_text">暂无数据</div>
         <CodeBlock v-else language="json" :raw-code="JSON.stringify(unformattedJson)">
         </CodeBlock>
       </div>
@@ -236,6 +244,7 @@ const unformattedJson = ref({
   max-height: 720px;
   line-height: 21px; 
   overflow-y: scroll;
+  white-space: break-spaces;
 }
 :deep(.el-dialog) {
   min-height: 800px;

+ 3 - 0
src/views/PromptConfiguration/src/components/RespnseConfiguration.vue

@@ -15,6 +15,9 @@ watch(
   () => props.stepDataprops,
   (current) => {
     stepData.value = current
+    if(stepData.value == null) {
+      stepData.value = []
+    }
   }
 )
 

+ 3 - 1
src/views/PromptConfiguration/src/components/TableConfiguration.vue

@@ -41,6 +41,9 @@ watch(
   () => props.tableDataList,
   (current) => {
     tableData.value = current
+    if(tableData.value == null) {
+      tableData.value = []
+    }
   }
 )
 
@@ -52,7 +55,6 @@ const addNewTableColumn = () => {
     exampledata: '',
   }
   tableData.value.unshift(item)
-  console.log(tableData.value)
 }
 
 // 展示全部字段

BIN
src/views/PromptConfiguration/src/images/icon_success_big@2x.png


BIN
src/views/PromptConfiguration/src/images/submit_successful.png


+ 0 - 1
src/views/Tracking/src/TrackingView.vue

@@ -259,7 +259,6 @@ const DateRangeSearch = (val: any, value: any) => {
 }
 //MoreFiltersSearch
 const MoreFiltersSearch = (val: any, value: any) => {
-  console.log(val,value)
   filterData.morefiltersData = []
   if (Object.keys(value).length == 0) {
     delete searchTableQeuryTracking.shipper