فهرست منبع

feat(rgflow):接口调试

hanyang 1 سال پیش
والد
کامیت
83018ebd52

+ 16 - 0
src/apis/intelligent.js

@@ -92,3 +92,19 @@ export function addLabelToDialog(labelIdList, objectId) {
     }
   });
 }
+
+/**
+ * @description 获取智能体详情
+ * @param {string} id 智能体ID
+ * @param {string} status 智能体状态 1-上线 2-下线
+ * */
+export function changeDialogStatus(id, status) {
+  return request({
+    url: `/api/dialog/status`,
+    method: 'put',
+    data: {
+      id,
+      status
+    }
+  });
+}

+ 15 - 0
src/apis/login.js

@@ -15,6 +15,14 @@ export function register(data) {
     data
   });
 }
+// 注册完成同步数据
+
+export function asycData(userFlag) {
+  return request({
+    url: `/api/auth/v2/sync?userFlag=${userFlag}`,
+    method: 'get'
+  });
+}
 // 获取用户信息
 export function getInfo() {
   return request({
@@ -29,3 +37,10 @@ export function generateRoutes() {
     method: 'get'
   });
 }
+// token转化
+export function tokenExchange() {
+  return request({
+    url: `/api/auth/token`,
+    method: 'get'
+  });
+}

+ 43 - 1
src/apis/rgflow-dify.js

@@ -1,7 +1,7 @@
 import request from '../base/ajax';
 
 /**
- * 创建Dify智能体,
+ * @description 创建Dify智能体,
  * @param {Object} data 包含创建Dify所需参数的对象
  * @param {String} data.mode 模式,可选值:'advanced-chat'、'agent-chat'、'workflow'
  * */
@@ -16,3 +16,45 @@ export function createDify(data) {
     data: initData
   });
 }
+
+// 创建rgflow智能体
+export function createRgFlow(data) {
+  return request({
+    url: `/rgflow/v1/dialog/set`,
+    method: 'post',
+    data
+  });
+}
+
+// 查询知识库列表
+export function queryKbList() {
+  return request({
+    url: `/rgflow/v1/kb/list`,
+    method: 'get'
+  });
+}
+// 头像上传
+// export function kbdocumentupload(params) {
+//   const config = {
+//     headers: {
+//       'Content-Type': 'application/x-www-form-urlencoded'
+//       // token: token,
+//     }
+//   };
+//   return axios.post('/api/v1/document/upload', params, config);
+// }
+// 查询模型列表
+export function queryModelList() {
+  return request({
+    url: `/rgflow/v1/llm/list`,
+    method: 'get'
+  });
+}
+
+// 获取某个智能体的数据
+export function getRagFlowData(id) {
+  return request({
+    url: `/rgflow/v1/dialog/get?dialog_id=${id}`,
+    method: 'get'
+  });
+}

+ 17 - 5
src/modules/dify/MessageBody.vue

@@ -19,17 +19,27 @@
 
 <script setup>
 import { ref, onMounted } from 'vue';
+import { tokenExchange } from '../../apis/login';
+import { kuky_Authorization } from '../../base/storage';
 const props = defineProps({
   id: {
     type: String,
     required: true
   }
 });
+const DIFY_TOKEN = ref('');
 const BASE_URL = 'http://192.168.20.119:28003/app';
-const defaultURL = ref(BASE_URL + '/' + props.id + '/workflow');
-console.log(defaultURL.value);
+const getToken = async () => {
+  const res = await tokenExchange();
+  if (res.code == 200) {
+    DIFY_TOKEN.value = res.data.dify_token;
+  }
+};
+const defaultURL = ref('');
 
-onMounted(() => {
+onMounted(async () => {
+  await getToken();
+  defaultURL.value = BASE_URL + '/' + props.id + `/workflow?token=${DIFY_TOKEN.value}`;
   const element = document.getElementById('dify');
   element.onload = function () {
     if (element && element.contentWindow) {
@@ -37,8 +47,10 @@ onMounted(() => {
       element.contentWindow.postMessage(
         JSON.stringify({
           type: 'insertStyle',
-          value: `body{background-color:red;font-size:50px;}`
-        })
+          value: `
+            .sticky{display:none;}`
+        }),
+        defaultURL.value
       );
     }
   };

+ 3 - 1
src/modules/dify/TopSetting.vue

@@ -1,7 +1,9 @@
 <template>
   <a-breadcrumb class="breadcrumb">
     <a-breadcrumb-item><icon-apps /></a-breadcrumb-item>
-    <a-breadcrumb-item>智能体管理</a-breadcrumb-item>
+    <a-breadcrumb-item>
+      <router-link to="/intelligent">智能体</router-link>
+    </a-breadcrumb-item>
     <a-breadcrumb-item>智能体详情</a-breadcrumb-item>
   </a-breadcrumb>
 </template>

+ 23 - 3
src/modules/intelligent/MessageBody.vue

@@ -3,7 +3,7 @@
     <CardItem v-for="item in moke_data" :key="item.id" :name="item.name" :img_src="item.img_src" :height="200">
       <template #description> {{ item.desc }} </template>
       <template #settings>
-        <a-switch v-model="item.online">
+        <a-switch v-model="item.online" @change="changeStatus(item)">
           <template #checked> {{ $t('management.online') }} </template>
           <template #unchecked> {{ $t('management.offline') }} </template>
         </a-switch>
@@ -64,7 +64,7 @@ import { getIconIntelligent, getImageIntelligent } from '../../views/manage/comm
 import LabelSelected from './LabelSelected.vue';
 import { getDialogList } from '../../apis/intelligent';
 import { bus_intelligentSearch, bus_intelligentEdit } from '../../base/event-bus';
-import { getLabelList, addLabelToDialog } from '../../apis/intelligent';
+import { getLabelList, addLabelToDialog, changeDialogStatus } from '../../apis/intelligent';
 
 const moke_data = ref([
   // {
@@ -94,7 +94,6 @@ const getDialog = async () => {
   try {
     const res = await getDialogList(pages.current, pages.pageSize, search_text.value);
     const data = res.data.rows.map((item) => {
-      console.log(item.icon, getImageIntelligent(item.icon));
       return {
         ...item,
         time: new Date(item.update_time).toLocaleString('zh-CN'),
@@ -172,6 +171,27 @@ const changeDropdownVisible = async (visible, id) => {
     }
   }
 };
+
+const changeStatus = async (item) => {
+  console.log(item);
+  try {
+    const res = await changeDialogStatus(item.id, item.status == '1' ? '0' : '1');
+    if (res.code != 200) {
+      moke_data.value.forEach((it) => {
+        if (item.id === id) {
+          it.online = item.online;
+        }
+      });
+    }
+  } catch (err) {
+    console.log(err);
+    moke_data.value.forEach((it) => {
+      if (it.id === item.id) {
+        it.online = item.online;
+      }
+    });
+  }
+};
 bus_intelligentSearch.on((text) => {
   search_text.value = text;
   moke_data.value = [];

+ 19 - 7
src/modules/intelligent/TopSetting.vue

@@ -31,12 +31,14 @@
     @updateIntelligentList="updateIntelligentList"
   ></ModelAddItem>
   <ModelSelectIcon v-model:show_select_icon="show_select_icon" @sendIcon="sendIcon"></ModelSelectIcon>
+  <!-- v-if="show_rg_config" -->
   <AgentConfig
     v-model:show_rg_config="show_rg_config"
     ref="editAgentKuai"
     :typeAngint="add_type"
     :formData="itemObj"
     @queryList="queryList"
+    @updateIntelligentList="updateIntelligentList"
   ></AgentConfig>
 </template>
 
@@ -48,6 +50,7 @@ import ModelAddItem from './ModelAddItem.vue';
 import ModelSelectIcon from './ModalSelectIcon.vue';
 import AgentConfig from './rgflow/agentConfig.vue';
 import { funcDebounce } from '../../utils/utils';
+import { getRagFlowData } from '../../apis/rgflow-dify';
 import { bus_intelligentSearch, bus_intelligentEdit } from '../../base/event-bus';
 
 const router = useRouter();
@@ -94,14 +97,10 @@ const handleSearch = funcDebounce(
 const handleCreate = () => {
   visible.value = true;
 };
-// 创建Dify智能体
+// 创建rgflow智能体
 const createRAGFLOWIntelligent = () => {
-  console.log('createRAGFLOWIntelligent');
   show_rg_config.value = true;
 };
-const closeAgentConfig = () => {
-  show_rg_config.value = false;
-};
 const addIntelligent = (data) => {
   //根据智能体类型,打开不同的配置面板data.type
   show_model_item.value = true;
@@ -119,6 +118,17 @@ const updateIntelligentList = () => {
   bus_intelligentSearch.emit('');
   target_icon.value = '';
 };
+
+const getRagFlowDataFunc = async (id) => {
+  try {
+    const res = await getRagFlowData(id);
+    Object.assign(itemObj, res.data);
+    editAgentKuai.value.editClick();
+  } catch (err) {
+    // you can report use errorHandler or other
+  } finally {
+  }
+};
 /**
  * 监听编辑智能体事件
  * @param {Object} item 编辑智能体对象
@@ -133,6 +143,9 @@ bus_intelligentEdit.on((item) => {
       // TODO: 编辑rgflow智能体
       // itemObj = item;
       show_rg_config.value = true;
+      add_type = 'edit';
+      getRagFlowDataFunc(item.id);
+
       break;
     case '4':
       // TODO: 进入Dify智能体配置
@@ -144,8 +157,7 @@ bus_intelligentEdit.on((item) => {
   }
 });
 </script>
-<style scoped lang="scss"></style>
-<style>
+<style scoped lang="css">
 .arco-input-wrapper {
   background-color: var(--color-bg-5);
 }

+ 59 - 33
src/modules/intelligent/rgflow/AgentConfig.vue

@@ -264,14 +264,17 @@
 
 <script setup>
 import { onMounted, onBeforeMount, reactive, ref, nextTick, onUnmounted, onBeforeUnmount, computed } from 'vue';
-// import { kbdocumentupload, queryKbList, queryModelList } from '@/api/kbList';
+// import { kbdocumentupload, queryKbList, queryModelList } from '../../../apis/rgflow-dify';
+import { queryKbList, queryModelList, createRgFlow } from '../../../apis/rgflow-dify';
+import { createDialog } from '../../../apis/intelligent';
+import { dialogType } from '../../../views/manage/common';
 import useLoading from './loading';
 import Upload from './Upload.vue';
 import { Message } from '@arco-design/web-vue';
 // import { dialogSet } from '@/api/Agent';
 
 const props = defineProps(['show_rg_config', 'typeAngint', 'formData']);
-const emit = defineEmits(['queryList', 'update:show_rg_config']);
+const emit = defineEmits(['queryList', 'update:show_rg_config', 'updateIntelligentList']);
 
 const { loading, setLoading } = useLoading(true);
 const visible = computed(() => props.show_rg_config);
@@ -433,7 +436,15 @@ const handleOpened = (el) => {
     }, 100);
   });
 };
-
+const createOwnDialog = async (data, title) => {
+  console.log(data, 'data');
+  const res = await createDialog(data);
+  if (res.code == 200) {
+    Message.success(title);
+    handleCancel();
+    emit('updateIntelligentList');
+  }
+};
 const handleBeforeOk = async (done) => {
   formRef.value.validate().then((res) => {
     // console.log('res:', res)
@@ -444,6 +455,9 @@ const handleBeforeOk = async (done) => {
   formRef2.value.validate().then((res) => {
     // console.log('res:', res)
   });
+  // TODO: 先写死知识库和模型
+  form.kb_ids = ['5e96cc5aad3111ef93990242ac130006'];
+  form.llm_id = 'qwen-2.5-72b-instruct___OpenAI-API@OpenAI-API-Compatible';
   if (form.name && form.kb_ids.length > 0 && form.prompt_config.system && form.llm_id) {
     let title = '创建成功';
     let formNew = { ...form };
@@ -478,15 +492,27 @@ const handleBeforeOk = async (done) => {
 
     setLoading(true);
     try {
-      // const data = await dialogSet(formNew);
-      // if (data.code == 0) {
-      //   Message.success(title);
-      //   handleCancel();
-      // TODO: 刷新列表
-      // EventBus.emit('queryList');
-      // } else {
-      //   Message.error(data.msg);
-      // }
+      const res = await createRgFlow(formNew);
+      if (res.data.id && res.data.id.length) {
+        const dialogData = {
+          id: res.data.id,
+          name: form.name,
+          description: '',
+          icon: form.icon,
+          dialogType: dialogType.RAGFLOW_TYPE,
+          mode: 'ragflow'
+        };
+        // TODO: 调用自己系统的新增
+        if (props.typeAngint == 'add') {
+          createOwnDialog(dialogData, title);
+        } else {
+          emit('updateIntelligentList');
+          handleCancel();
+          Message.success(title);
+        }
+      } else {
+        Message.error(data.msg);
+      }
       done(true);
       setLoading(false);
     } catch (err) {
@@ -537,35 +563,35 @@ function handleTabChange(key) {
   activeKey.value = key;
 }
 
-const queryModel = async (params) => {
+const queryModel = async () => {
   try {
-    // const data = await queryModelList(params);
-    // const arrObj = {};
-    // for (const key in data.data) {
-    //   if (Object.hasOwnProperty.call(data.data, key)) {
-    //     const element = data.data[key];
-    //     arrObj[key] = element.filter((item) => item.available === true && item.model_type === 'chat');
-    //   }
-    // }
-    // modelList.value = arrObj;
-    // rankModelList.value = {
-    //   BAAI: [data.data.BAAI[1]],
-    //   Jina: data.data.Jina,
-    //   youdao: data.data.youdao
-    // };
+    const data = await queryModelList();
+    const arrObj = {};
+    for (const key in data.data) {
+      if (Object.hasOwnProperty.call(data.data, key)) {
+        const element = data.data[key];
+        arrObj[key] = element.filter((item) => item.available === true && item.model_type === 'chat');
+      }
+    }
+    modelList.value = arrObj;
+    rankModelList.value = {
+      BAAI: [data.data.BAAI[1]],
+      Jina: data.data.Jina,
+      youdao: data.data.Youdao
+    };
   } catch (err) {
     // you can report use errorHandler or other
   } finally {
   }
 };
 
-const knowledgeData = async (params = { page: 1, page_size: 20 }) => {
+const knowledgeData = async () => {
   setLoading(true);
   try {
-    // const { data } = await queryKbList(params);
-    // nextTick(() => {
-    //   tabs.value = data;
-    // });
+    const { data } = await queryKbList();
+    nextTick(() => {
+      tabs.value = data;
+    });
   } catch (err) {
     // you can report use errorHandler or other
   } finally {
@@ -574,7 +600,7 @@ const knowledgeData = async (params = { page: 1, page_size: 20 }) => {
 };
 
 onBeforeMount(() => {
-  queryModel({});
+  queryModel();
   knowledgeData();
 });
 onMounted(() => {});

+ 8 - 6
src/modules/login/FormItem.vue

@@ -47,11 +47,11 @@
 </template>
 
 <script setup>
-import { ref, reactive, getCurrentInstance, nextTick } from 'vue';
+import { ref, reactive, getCurrentInstance } from 'vue';
 import { useRouter } from 'vue-router';
 import { useCurrentUserStore } from '../../base/store/use-current-user';
 import { getLoginFormRules } from './auth';
-import { register } from '../../apis/login';
+import { register, asycData } from '../../apis/login';
 import { useI18n } from 'vue-i18n';
 
 const router = useRouter();
@@ -101,13 +101,11 @@ const handleSubmit = (data) => {
 const toRegister = () => {
   register({ username: form.username, email: form.email, password: form.password })
     .then((res) => {
-      if (res.code == 200 && res.data.username) {
+      if (res.code == 200) {
         $message.success(res.msg);
         form_type.value = 0;
         ref_form.value.resetFields();
-        nextTick(() => {
-          form.username = res.data.username;
-        });
+        toAsycData(res.data.userFlag);
       } else {
         $message.error(res.msg);
       }
@@ -116,6 +114,10 @@ const toRegister = () => {
       loading.value = false;
     });
 };
+// 注册后同步数据
+const toAsycData = async (userFlag) => {
+  await asycData(userFlag);
+};
 const changeFormType = (e) => {
   e.preventDefault();
   ref_form.value.resetFields();

+ 1 - 0
src/views/manage/CardItem.vue

@@ -58,6 +58,7 @@ const props = defineProps({
 .card-des {
   display: -webkit-box;
   overflow: hidden;
+  min-height: 32px;
   margin-top: 5px;
   color: var(--color-neutral-4);
   -webkit-line-clamp: 2;

+ 7 - 0
vite.config.mjs

@@ -34,6 +34,13 @@ export default defineConfig({
         secure: false,
         ws: true,
         rewrite: (path) => path.replace(/^\/dify/, '')
+      },
+      '/rgflow': {
+        target: 'http://192.168.20.119:28002/',
+        changeOrigin: true,
+        secure: false,
+        ws: true,
+        rewrite: (path) => path.replace(/^\/rgflow/, '')
       }
     }
   },