浏览代码

feat: add service apis

王晓东 2 月之前
父节点
当前提交
b4051178a5

+ 1 - 1
config/index.ts

@@ -22,7 +22,7 @@ export default defineConfig(async (merge, { command, mode }) => {
     },
     sourceRoot: 'src',
     outputRoot: 'dist',
-    plugins: [],
+    plugins: ['@taro-hooks/plugin-react', '@tarojs/plugin-http'],
     defineConstants: {
     },
     copy: {

+ 3 - 1
package.json

@@ -43,9 +43,11 @@
   "author": "",
   "dependencies": {
     "@babel/runtime": "^7.21.5",
+    "@taro-hooks/plugin-react": "^2.2.0",
     "@tarojs/components": "3.6.35",
     "@tarojs/helper": "3.6.35",
     "@tarojs/plugin-framework-react": "3.6.35",
+    "@tarojs/plugin-http": "^4.1.1",
     "@tarojs/plugin-platform-alipay": "3.6.35",
     "@tarojs/plugin-platform-h5": "3.6.35",
     "@tarojs/plugin-platform-harmony-hybrid": "3.6.35",
@@ -58,7 +60,7 @@
     "@tarojs/runtime": "3.6.35",
     "@tarojs/shared": "3.6.35",
     "@tarojs/taro": "3.6.35",
-    "axios": "0.27.2",
+    "axios": "^1.9.0",
     "browser-id": "^2.0.96",
     "classnames": "^2.5.1",
     "event-target-polyfill": "^0.0.4",

+ 48 - 29
pnpm-lock.yaml

@@ -11,6 +11,9 @@ importers:
       '@babel/runtime':
         specifier: ^7.21.5
         version: 7.21.5
+      '@taro-hooks/plugin-react':
+        specifier: ^2.2.0
+        version: 2.2.0(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@tarojs/service@3.6.35(@tarojs/shared@3.6.35)(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18)))(@tarojs/shared@3.6.35)(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18))(react@18.0.0)
       '@tarojs/components':
         specifier: 3.6.35
         version: 3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@tarojs/shared@3.6.35)(@types/react@18.0.0)(postcss@8.4.18)(react@18.0.0)
@@ -20,6 +23,9 @@ importers:
       '@tarojs/plugin-framework-react':
         specifier: 3.6.35
         version: 3.6.35(@pmmmwh/react-refresh-webpack-plugin@0.5.5(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.11.1(webpack@5.78.0(@swc/core@1.3.96)))(webpack@5.78.0(@swc/core@1.3.96)))(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@tarojs/shared@3.6.35)(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18))(react-refresh@0.11.0)(react@18.0.0)
+      '@tarojs/plugin-http':
+        specifier: ^4.1.1
+        version: 4.1.1(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@tarojs/shared@3.6.35)(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18))
       '@tarojs/plugin-platform-alipay':
         specifier: 3.6.35
         version: 3.6.35(@tarojs/components@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@tarojs/shared@3.6.35)(@types/react@18.0.0)(postcss@8.4.18)(react@18.0.0))(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18))
@@ -57,8 +63,8 @@ importers:
         specifier: 3.6.35
         version: 3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18)
       axios:
-        specifier: 0.27.2
-        version: 0.27.2
+        specifier: ^1.9.0
+        version: 1.9.0
       browser-id:
         specifier: ^2.0.96
         version: 2.0.96
@@ -153,9 +159,6 @@ importers:
       babel-preset-taro:
         specifier: 3.6.35
         version: 3.6.35(@babel/core@7.8.0)
-      cross-env:
-        specifier: ^7.0.3
-        version: 7.0.3
       eslint:
         specifier: ^8.12.0
         version: 8.12.0
@@ -1540,6 +1543,16 @@ packages:
   '@tailwindcss-mangle/shared@3.0.0':
     resolution: {integrity: sha512-h1ateiRm/o0JvRsD5755dyS4H1RPE5sgeyEAOorLGVkGvNawkACtM+0MsiD/ZFNgrfQ7aYDD+DF/dV/8LN5Lmw==}
 
+  '@taro-hooks/plugin-react@2.2.0':
+    resolution: {integrity: sha512-2a9eUraWMTPHT5nIidgxjlZ/o8Luj+aFVlqOqIix0qCEt1oktBYfpjAsS4+ueNbziDMjVSiqGlrFEE9pM6OduA==}
+    peerDependencies:
+      '@tarojs/helper': '>=3.4.x'
+      '@tarojs/runtime': '>=3.4.x'
+      '@tarojs/service': '>=3.4.x'
+      '@tarojs/shared': '>=3.4.x'
+      '@tarojs/taro': '>=3.4.x'
+      react: '>=16.9'
+
   '@tarojs/api@3.6.35':
     resolution: {integrity: sha512-RTyI09J2kgQBhjd0H/JtFsWygFIGYUFly88qm+ozQWxsgr9BTOSDpb94eQ/i9OZNFEXxGk8EGk1aLeoqKYOSaw==}
 
@@ -1705,6 +1718,14 @@ packages:
       react-refresh:
         optional: true
 
+  '@tarojs/plugin-http@4.1.1':
+    resolution: {integrity: sha512-9GNCPSk5I/K4AAblBE5zUOM+5nx7QI5XATiyCw/uIe0d/Ltq6E6uIJXMvZ7e9Q2ihSHYOyvOYeUIufe8kWkB7g==}
+    engines: {node: '>= 18'}
+    peerDependencies:
+      '@tarojs/runtime': 4.1.1
+      '@tarojs/shared': 4.1.1
+      '@tarojs/taro': 4.1.1
+
   '@tarojs/plugin-platform-alipay@3.6.35':
     resolution: {integrity: sha512-GqFES7JVs83gSsQglGhiYHTr8BgAexLl5GjHgEmlY7CYfKkqq2znWXilh8aiBq7/wlBdkjmNQ1E/aPhI7CfFnQ==}
     peerDependencies:
@@ -2395,11 +2416,8 @@ packages:
     resolution: {integrity: sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==}
     deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410
 
-  axios@0.27.2:
-    resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
-
-  axios@1.7.5:
-    resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==}
+  axios@1.9.0:
+    resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==}
 
   babel-helper-evaluate-path@0.5.0:
     resolution: {integrity: sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==}
@@ -3106,11 +3124,6 @@ packages:
   create-require@1.1.1:
     resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
 
-  cross-env@7.0.3:
-    resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
-    engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
-    hasBin: true
-
   cross-spawn@7.0.3:
     resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
     engines: {node: '>= 8'}
@@ -10373,6 +10386,17 @@ snapshots:
 
   '@tailwindcss-mangle/shared@3.0.0': {}
 
+  '@taro-hooks/plugin-react@2.2.0(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@tarojs/service@3.6.35(@tarojs/shared@3.6.35)(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18)))(@tarojs/shared@3.6.35)(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18))(react@18.0.0)':
+    dependencies:
+      '@tarojs/helper': 3.6.35
+      '@tarojs/runtime': 3.6.35(@tarojs/shared@3.6.35)
+      '@tarojs/service': 3.6.35(@tarojs/shared@3.6.35)(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18))
+      '@tarojs/shared': 3.6.35
+      '@tarojs/taro': 3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18)
+      acorn: 8.12.1
+      acorn-walk: 8.3.3
+      react: 18.0.0
+
   '@tarojs/api@3.6.35':
     dependencies:
       '@babel/runtime': 7.21.5
@@ -10408,7 +10432,7 @@ snapshots:
       '@tarojs/service': 3.6.35(@tarojs/shared@3.6.35)(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18))
       '@tarojs/shared': 3.6.35
       adm-zip: 0.4.16
-      axios: 1.7.5
+      axios: 1.9.0
       cli-highlight: 2.1.11
       download-git-repo: 2.0.0
       envinfo: 7.13.0
@@ -10617,6 +10641,12 @@ snapshots:
       - '@tarojs/taro'
       - supports-color
 
+  '@tarojs/plugin-http@4.1.1(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@tarojs/shared@3.6.35)(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18))':
+    dependencies:
+      '@tarojs/runtime': 3.6.35(@tarojs/shared@3.6.35)
+      '@tarojs/shared': 3.6.35
+      '@tarojs/taro': 3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18)
+
   '@tarojs/plugin-platform-alipay@3.6.35(@tarojs/components@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@tarojs/shared@3.6.35)(@types/react@18.0.0)(postcss@8.4.18)(react@18.0.0))(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18))':
     dependencies:
       '@tarojs/components': 3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@tarojs/shared@3.6.35)(@types/react@18.0.0)(postcss@8.4.18)(react@18.0.0)
@@ -10664,7 +10694,7 @@ snapshots:
       '@tarojs/service': 3.6.35(@tarojs/shared@3.6.35)(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18))
       '@tarojs/shared': 3.6.35
       '@tarojs/taro-h5': 3.6.35(@tarojs/components@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@tarojs/shared@3.6.35)(@types/react@18.0.0)(postcss@8.4.18)(react@18.0.0))(@tarojs/taro@3.6.35(@tarojs/helper@3.6.35)(@tarojs/runtime@3.6.35(@tarojs/shared@3.6.35))(@types/react@18.0.0)(postcss@8.4.18))
-      axios: 1.7.5
+      axios: 1.9.0
       babel-plugin-transform-taroapi: 3.6.35
       base64-js: 1.5.1
       change-case: 4.1.2
@@ -11767,14 +11797,7 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  axios@0.27.2:
-    dependencies:
-      follow-redirects: 1.15.6
-      form-data: 4.0.0
-    transitivePeerDependencies:
-      - debug
-
-  axios@1.7.5:
+  axios@1.9.0:
     dependencies:
       follow-redirects: 1.15.6
       form-data: 4.0.0
@@ -12560,10 +12583,6 @@ snapshots:
 
   create-require@1.1.1: {}
 
-  cross-env@7.0.3:
-    dependencies:
-      cross-spawn: 7.0.3
-
   cross-spawn@7.0.3:
     dependencies:
       path-key: 3.1.1

+ 7 - 0
project.private.config.json

@@ -8,6 +8,13 @@
   "condition": {
     "miniprogram": {
       "list": [
+        {
+          "name": "pages/agent/index",
+          "pathName": "pages/agent/index",
+          "query": "",
+          "launchMode": "default",
+          "scene": null
+        },
         {
           "name": "login",
           "pathName": "pages/login/index",

+ 18 - 0
src/consts/enum.ts

@@ -57,4 +57,22 @@ export enum EAI_MODEL {
   Common = "common",
   DeepseekChat = "deepseek-chat",
   DeepseekReasoner = "deepseek-reasoner",
+}
+
+
+export enum EUploadFileScene  {
+  VOICE_CLONE = 'voice_clone',
+  BG_IMAGE = 'bg_image',
+  COMPONENT = 'component',
+  DOC = 'doc',
+  OTHER = 'other',
+  AVATAR = 'avatar'
+}
+export enum EUploadFileBucketName  {
+  VOICE_CLONE = 'voice_clone',
+  BG_IMAGE = 'bg_image',
+  COMPONENT = 'component',
+  DOC = 'doc',
+  OTHER = 'other',
+  AVATAR = 'avatar'
 }

+ 1 - 0
src/consts/index.ts

@@ -0,0 +1 @@
+export const FileTypes = ["doc", "docx", "xls", "xlsx", "pdf", "txt", "ppt"];

+ 6 - 0
src/lib/api/index.ts

@@ -16,7 +16,13 @@ const getBaseUrl = (releaseUrl: string, preUrl: string) => {
   }
 }
 
+
 // Define base URLs
+export const bluebookAiAgent = getBaseUrl(
+  'https://api.xiaolanben.com/blue-aiagent/',
+  'https://api.xiaolanben.com/blue-aiagent-pre/',
+)
+
 export const bluebookBaseConst = getBaseUrl(
   'https://api.xiaolanben.com/bluebook/',
   'https://api.xiaolanben.com/bluebook-pre/',

+ 20 - 16
src/lib/module/axios.js

@@ -1,5 +1,5 @@
 import Taro from '@tarojs/taro'
-import Axios from 'taro-axios'
+import Axios from 'axios'
 import { OPEN_ID_STORAGE_KEY } from '../constant'
 import { getUserInfo } from '../utils/auth'
 import sign from './sign'
@@ -8,23 +8,27 @@ const axiosIns = Axios.create({
   siren: false,
 })
 
+export const getHeaders = async (config) => {
+  const userInfo = await getUserInfo()
+  console.log('userInfo', userInfo)
+  config.params = config.params || {}
+  config.headers = config.headers || {}
+  config.headers['X-Enniu-End'] = 'mp'
+  if (userInfo.userId && userInfo.token) {
+    config.headers.userId = `${userInfo.userId}`
+    config.headers.Authorization = `encrypt ${userInfo.token}`
+  }
+  const openId = Taro.getStorageInfoSync(OPEN_ID_STORAGE_KEY)
+  config.headers.openId = `${openId}`
+  await sign(config)
+  console.log(config,1111)
+  return config
+};
+
 axiosIns.interceptors.request.use(async (config) => {
+  
   try {
-    const userInfo = await getUserInfo()
-    console.log('userInfo', userInfo)
-    // const userInfo = {}
-    config.params = config.params || {}
-    // config.params.mpversion = MP_VERSION
-    config.headers['X-Enniu-End'] = 'mp'
-    if (userInfo.userId && userInfo.token) {
-      config.headers.userId = `${userInfo.userId}`
-      config.headers.Authorization = `encrypt ${userInfo.token}`
-    }
-    const openId = Taro.getStorageInfoSync(OPEN_ID_STORAGE_KEY)
-    config.headers.openId = `${openId}`
-
-    await sign(config)
-    return config
+    return getHeaders(config)
   } catch (e) {
     console.log(e)
   }

+ 19 - 1
src/pages/agent/components/AgentSetting/index.tsx

@@ -4,10 +4,28 @@ import AgentKnowledgeLib from './components/AgentKnowledgeLib'
 import AgentEmptyCard from './components/AgentEmptyCard'
 import AgentContactCard from './components/AgentContactCard'
 
-import React, { useState } from "react";
+import React, { useEffect, useState } from "react";
+import { getAgents, getAgent, createAgent } from "@/service/agent";
+import { TAgentItem } from '@/types/agent'
 
 export default React.memo(function Index() {
   console.log('agent setting')
+  
+  
+
+  const fetchAgent = async () => {
+    // const a = await getAgent()
+    // console.log(a)
+  }
+  
+  const fetchAgents = async () => {
+    const a = await getAgents()
+    console.log(a)
+  }
+
+  useEffect(()=> {
+    fetchAgents()
+  }, [])
 
   return (
     <View>

+ 40 - 2
src/pages/index/components/welcome/index.tsx

@@ -2,13 +2,50 @@ import { View } from "@tarojs/components";
 import style from "./index.module.less";
 import Taro from "@tarojs/taro";
 
-export default function Index({children}) {
+import { getAgents, getAgent, createAgent, } from "@/service/agent";
+import { TAgentItem } from '@/types/agent'
 
+export default function Index({children}) {
+  const saveAgent = async (agent: TAgentItem) => {
+    const res = await createAgent(agent)
+    console.log(res)
+    // Taro.navigateTo({url: '/pages/agent-gen/index'})
+  }
+  const test = ()=> {
+    
+  }
   const go = ()=> {
+    getAgents()
+    
     console.log('gogogo')
-    Taro.navigateTo({url: '/pages/agent-gen/index'})
+    return 
+    saveAgent({
+      address: '浙江杭州余杭文一西路1700号',
+      avatarUrl: 'https://cdn.wehome.cn/cmn/png/53/META-H8UKWHWU-2JNUAG2BARJF55VHU9QS3-YBQGHDAM-IW.png',
+      email: '',
+      enabledChatBg: false,
+      enabledPersonalKb: false,
+      "entId": '',
+      "entName": '',
+      "greeting": '',
+      "isDefault": true,
+      "isEnt": false,
+      "isNewEnt": false,
+      "isSystemVoice": true,
+      "mobile": '18658870618',
+      "name": 'xiaodong',
+      "personality": '一名疯瘨的数码博主',
+      "position": 'CEO',
+      "qrCodeUrl": '',
+      "questionGuides": ['想要了解相机?', '想要了解手机?'],
+      // "voice": ''
+    })
+    
   }
 
+
+  
+
   return (
     <View className={style.container}>
       <View className={style.hello}>你好</View>      
@@ -26,6 +63,7 @@ export default function Index({children}) {
               <View>3.你的内容,一页呈现</View>
           </View>
           <View className="button-rounded-big" onClick={go}>创建智能体</View>
+          <View className="button-rounded-big" onClick={test}>test</View>
         </View>
       </View>
       </View>

+ 1 - 1
src/pages/page/components/avatar-magic-style/index.tsx

@@ -5,7 +5,7 @@ import WemetaTabs from "@/components/wemeta-tabs/index";
 import { useEffect, useState } from "react";
 import Taro from "@tarojs/taro";
 import { uploadImage } from "@/utils/http";
-import { EUploadFileScene, TEntityAsset, type TMediaType } from "@/types/index";
+import { TEntityAsset, type TMediaType } from "@/types/index";
 import { deleteAsset, listAssets } from "@/service/asset";
 import { EAssetScene } from "@/consts/enum";
 import { useCharacterStore, useCurrentCharacter } from "@/store/characterStore";

+ 2 - 1
src/pages/page/components/bg-style-config/index.tsx

@@ -6,7 +6,8 @@ import Icon24Vip from "@/images/icon-24-vip.png";
 import { useEffect, useState } from "react";
 import Taro from "@tarojs/taro";
 import { uploadImage } from "@/utils/http";
-import { EUploadFileScene, TEntityAsset, type TMediaType } from "@/types/index";
+import { TEntityAsset, type TMediaType } from "@/types/index";
+import { EUploadFileScene } from "@/consts/enum";
 import { deleteAsset, listAssets } from "@/service/asset";
 import { EAssetScene } from "@/consts/enum";
 import { useCharacterStore, useCurrentCharacter } from "@/store/characterStore";

+ 1 - 1
src/pages/page/index.tsx

@@ -18,7 +18,7 @@ import AvatarMagicStyle from "./components/avatar-magic-style/index";
 
 import BottomNavBar from "./components/bottom-nav-bar";
 import TabButtons from "./components/tab-buttons";
-import { EUploadFileScene } from "@/types";
+import { EUploadFileScene } from "@/consts/enum";
 
 
 

+ 1 - 1
src/pages/voice/components/my-voice/components/popup-recorder/index.tsx

@@ -5,7 +5,7 @@ import { useEffect, useState } from "react";
 import popupStyle from "./index.module.less";
 
 import { useCharacterStore } from "@/store/characterStore";
-import { EUploadFileScene } from "@/types";
+import { EUploadFileScene } from "@/consts/enum";
 
 export enum ECloneStatus {
   STOP = 0,

+ 83 - 0
src/service/agent.ts

@@ -0,0 +1,83 @@
+import {
+  bluebookAiAgent,
+} from '@/lib/api/index'
+import request from '@/lib/module/axios.js'
+import { TAgentDetail, TComponentItem } from '@/types/agent'
+
+
+// 创建一个新的智能体--用户点击创建按钮时调用获取新智能体id与名称信息
+
+export const createAgent = (data: TAgentDetail) => {
+  return request.post<TAgentDetail>(`${bluebookAiAgent}api/v1/my/agent`, data)
+}
+
+// 获取我的智能体详细信息
+// 供编辑页使用,预览页使用智能体信息接口获取
+export const getAgent = (agentId: string) => {
+  return request.get<TAgentDetail>(`${bluebookAiAgent}api/v1/my/agent/${agentId}`)
+}
+
+// 编辑智能体--设置形象ID
+export const editAgentAvatar = (agentId: string, avatarUrl: string, enabledChatBg:boolean) => {
+  return request.put(`${bluebookAiAgent}api/v1/my/agent/${agentId}/avatar`, {
+    avatarUrl,
+    enabledChatBg,
+  })
+}
+// 设置当前我的默认智能体
+export const setDefaultAgent = (agentId: string) => {
+  return request.put(`${bluebookAiAgent}api/v1/my/agent/${agentId}/default`)
+}
+
+// 编辑智能体--微官网组件
+export const editAgentWebsite = (agentId: string, data: {components: TComponentItem[]}) => {
+  return request.put(`${bluebookAiAgent}api/v1/my/agent/${agentId}/website`, data)
+}
+
+
+// 编辑智能体--名片部份内容
+// address (string, optional): 地址,长度最多250 ,
+// email (string, optional): 邮箱,长度最多50 ,
+// entName (string, optional): 企业名称,长度最多100,如果是个人版允许编辑、企业版可以原值传入即可 ,
+// mobile (string, optional): 手机号 ,
+// name (string, optional): 智能体名称--名片的姓名;长度最多20 ,
+// position (string, optional): 职位,长度最多30 ,
+// qrCodeUrl (string, optional): 二维码地址,长度最多250
+export type TAgentContactCard = {
+  "address"?: string,
+  "email"?: string,
+  "entName"?: string,
+  "mobile"?: string,
+  "name"?: string,
+  "position"?: string,
+  "qrCodeUrl"?: string
+}
+
+export const editAgentCard = (agentId: string, data: TAgentContactCard) => {
+  return request.put<any, any>(`${bluebookAiAgent}api/v1/my/agent/${agentId}/card`, data)
+}
+
+
+
+export type TAgent = {
+  "agentId": "string",
+  "isDefault": boolean,
+  "isEnt": boolean,
+  "isNewEnt": boolean,
+  "name": "string"
+}
+
+
+
+
+// 我的智能体列表
+export const getAgents = () => {
+  return request.get<TAgent>(`${bluebookAiAgent}api/v1/my/agents`)
+}
+// 删除智能体--仅允许删除个人智能体
+export const deleteAgent = (agentId: string) => {
+  return request.delete(`${bluebookAiAgent}api/v1/my/agent/${agentId}`)
+}
+
+
+

+ 145 - 0
src/service/bot.ts

@@ -0,0 +1,145 @@
+import { bluebookAiAgent } from "@/lib/api/index";
+import Taro from "@tarojs/taro";
+import { getHeaders } from "@/lib/module/axios.js";
+import JsonChunkParser from "@/utils/jsonChunkParser";
+import request from "@/lib/module/axios.js";
+import type { TMessage } from "@/types/bot";
+
+export type TMessageHistories = {
+  data: TMessage[][];
+  nextId: string;
+  totalCount: 0;
+};
+
+// 获取与指定智能体的历史会话记录--按智能体维度倒序返回
+type TGetMessageHistoriesParams = {
+  agentId: string;
+  beginId?: string; // 起始ID, 如果未传入则获取最新的N条
+  pageSize: number;
+};
+export const getMessageHistories = (data: TGetMessageHistoriesParams) => {
+  return request.get<TMessageHistories>(
+    `${bluebookAiAgent}api/v1/chat/messages`,
+    { params: data }
+  );
+};
+
+// 保存消息--追加覆盖保存模式
+
+export type TAppendMessages = {
+  "agentId": string,
+  "loginId": string,
+  "messages": {
+    "content": string,
+    "isStreaming": false,
+    "msgUk": string,
+    "role": string
+  }[ ],
+  "sessionId": string
+}
+export const appendMessages = (data: TAppendMessages) => {
+  return request.post(`${bluebookAiAgent}api/v1/chat/messages/append`, data)
+}
+
+
+// 消息差评或取消差评
+type TDislikeMessage = {
+  "agentId": string,
+  "dislikeReason": string,
+  "isDislike": boolean,
+  "msgUk": string
+}
+export const dislikeMessage = (data: TDislikeMessage) => {
+  return request.put(`${bluebookAiAgent}api/v1/chat/messages/dislike`, data)
+}
+
+// 消息点赞或取消点赞
+type TLikeMessage = {
+  "agentId": string,
+  "dislikeReason": string,
+  "isDislike": boolean,
+  "msgUk": string
+}
+export const likeMessage = (data: TLikeMessage) => {
+  return request.put(`${bluebookAiAgent}api/v1/chat/messages/like`, data)
+}
+
+
+
+
+
+// 文本聊天,流式返回消息
+
+export type TTextChatParams = {
+  agentId: string;
+  params: {
+    message?: string;
+    model?: string;
+  };
+  onStart: () => void;
+  onReceived: (m: { content: string; reasoningContent: string }) => void;
+  onFinished: () => void;
+  onError: () => void;
+};
+
+export const textChat = ({
+  agentId,
+  params,
+  onStart,
+  onReceived,
+  onFinished,
+  onError,
+}: TTextChatParams) => {
+  onStart();
+
+  let reqTask: Taro.RequestTask<any>;
+  const jsonParser = new JsonChunkParser();
+  jsonParser.onParseComplete((m) => {
+    console.log("okok", m);
+    onFinished();
+  });
+  const onChunkReceived = (chunk: any) => {
+    // console.log(chunk);
+    const uint8Array = new Uint8Array(chunk.data);
+    var string = new TextDecoder("utf-8").decode(uint8Array);
+    // console.log(string);
+    jsonParser.parseChunk(string, (m) => {
+      // console.log(m);
+      onReceived(m);
+    });
+  };
+  try {
+    const url = `${bluebookAiAgent}api/v1/chat/completions`;
+    reqTask = Taro.request({
+      url: url,
+      data: params,
+      enableChunked: true,
+      method: "POST",
+      header: {
+        ...getHeaders({
+          url,
+          params,
+          method: "post",
+        }),
+      },
+      responseType: "arraybuffer",
+      success: function (res) {
+        console.log("服务端响应 >>", res);
+        // 如果没有识别或发生错误,则停止播放(恢复默认状态)
+        if (res.header["Content-Type"]?.indexOf("application/json") > -1) {
+        }
+      },
+    });
+
+    // reqTask.
+    reqTask.onChunkReceived(onChunkReceived);
+  } catch (e) {
+    onError();
+  }
+
+  const stopChunk = () => {
+    reqTask.offChunkReceived(onChunkReceived);
+  };
+
+  return stopChunk;
+};

+ 114 - 0
src/service/knowledge.ts

@@ -0,0 +1,114 @@
+import { bluebookAiAgent } from "@/lib/api/index";
+import Taro from "@tarojs/taro";
+import { getHeaders } from "@/lib/module/axios.js";
+import JsonChunkParser from "@/utils/jsonChunkParser";
+import request from "@/lib/module/axios.js";
+import type { TKnowledgeListItem, TQAListItem } from "@/types/knowledge";
+
+
+
+//我的知识库--列表
+export type TKnowledgeListResponse = {
+  "data": TKnowledgeListItem[][],
+  "nextId": string,
+  "totalCount": number
+}
+export const getKnowledgeList = ({startId, pageSize = 1}: {
+  startId?: string;
+  pageSize: number;
+}) => {
+  return request.get<TKnowledgeListResponse>(
+    `${bluebookAiAgent}api/v1/my/knowledge/list`,
+    { params: {startId, pageSize} }
+  );
+};
+
+// 共享我的知识库至企业
+export const shareToEnt = (data: 
+  {
+    "knowledgeIds": number[],
+    "toEntId": string
+  }
+) => {
+  return request.post(`${bluebookAiAgent}api/v1/my/knowledge/shareToEnt`, data)
+}
+
+
+// 我的知识库--信息流
+export type TKnowledgeDataItem = {
+  // 信息流内容 可能为null; 如:已成功解析2份知识 ,
+  "content"?: string,
+  // 信息流关联文件列表; 可能为 null ,
+  "knowledgeList"?: TKnowledgeListItem[],
+  "role": string,
+  "streamId": number,
+  "type": string
+}
+export type TKnowLedgeStreamResponse = {
+  "data": TKnowledgeDataItem[][],
+  "nextId": string,
+  "totalCount": number
+}
+export const getMyKnowledgeStream = (data: {startId?: string, pageSize:number} ) => {
+  return request.get<TKnowLedgeStreamResponse>(`${bluebookAiAgent}api/v1/my/knowledge/stream`, {params: data})
+}
+
+
+// 获取指定知识库项的详情信息
+export type TKnowledgeDetailResponse = {
+  "content": "string",
+  "knowledgeList": TKnowledgeListItem[],
+  "qaList": TQAListItem[],
+  "role": "string",
+  "streamId": number,
+  "type": "string"
+}
+
+export const getMyKnowledgeDetail = (knowledgeId: string) => {
+  return request.get<TKnowledgeDetailResponse>(`${bluebookAiAgent}api/v1/my/knowledge/${knowledgeId}`)
+}
+
+// 删除知识库 信息流记录;流删除会同步删除相关的记录项
+export const deleteKnowledgeStream = (streamId: string) => {
+  return request.delete(`${bluebookAiAgent}api/v1/my/knowledge/stream/${streamId}`,)
+}
+
+// 删除知识库 记录项
+export const deleteKnowledge = (knowledgeId: string) => {
+  return request.delete(`${bluebookAiAgent}api/v1/my/knowledge/${knowledgeId}`,)
+}
+// 删除指定知识库的 QA 项
+export const deleteKnowledgeQa = (knowledgeId: string, qaId: string) => {
+  return request.delete(`${bluebookAiAgent}api/v1/my/knowledge/${knowledgeId}/${qaId}`,)
+}
+
+// 更新指定的知识库 QA 项
+export const updateKnowledgeQa = (knowledgeId: string, qaId: string, qa: TQAListItem) => {
+  return request.put(`${bluebookAiAgent}api/v1/my/knowledge/${knowledgeId}/${qaId}`, qa)
+}
+
+
+
+// 企业知识库--列表
+export const getEntKnowledgeList = (data: {
+  entId: string;
+  startId?: string;
+  pageSize: number;
+}) => {
+  return request.get<TKnowledgeListResponse>(
+    `${bluebookAiAgent}api/v1/ent/knowledge/list`,
+    { params: data }
+  );
+};
+// 获取指定知识库项的详情信息
+export const getEntKnowledgeDetail = (knowledgeId: string) => {
+  return request.get<TKnowledgeDetailResponse>(`${bluebookAiAgent}api/v1/ent/knowledge/${knowledgeId}`)
+}
+
+// 企业知识库--信息流
+export const getEntKnowledgeStream = (data: {entId: string, startId?: string, pageSize:number} ) => {
+  return request.get<TKnowLedgeStreamResponse>(`${bluebookAiAgent}api/v1/ent/knowledge/stream`, {params: data})
+}
+
+
+

+ 122 - 0
src/service/storage.ts

@@ -0,0 +1,122 @@
+// 我的音色库&形象库
+import {
+  bluebookAiAgent,
+} from '@/lib/api/index'
+import request from '@/lib/module/axios.js'
+import Taro from '@tarojs/taro'
+
+import {FileTypes} from '@/consts'
+
+export type TAvatarItem = {
+  "avatarId": number,
+  "avatarUrl": string,
+  "isOriginal": boolean
+}
+// 上传形象--并生成微视频
+export type TUploadAvatarResponse = {
+  "avatars": TAvatarItem[],
+  "failedReason": string,
+  "status": string,
+  "taskId": string
+}
+export const uploadAvatar = (data: {
+  "aiGenerated": boolean,
+  "avatarUrl": string,
+  "description": string
+}) => {
+  return request.post<TUploadAvatarResponse>(`${bluebookAiAgent}api/v1/my/avatar`, data)
+}
+
+// 获取上传形象任务的处理状态
+export const getUploadedAvatarStatus = (taskId: string) => {
+  return request.get<TUploadAvatarResponse>(`${bluebookAiAgent}api/v1/my/avatar/task/${taskId}`)
+}
+
+// 获取个人形象库
+export const getMyAvatars = (taskId: string) => {
+  return request.get<TAvatarItem[]>(`${bluebookAiAgent}api/v1/my/avatar/task/${taskId}`)
+}
+
+// 删除指定的形象记录
+export const deleteAvatar = (avatarId: string) => {
+  return request.delete(`${bluebookAiAgent}api/v1/my/avatar/${avatarId}`)
+}
+
+// 用户上传文件--返回{'fileId':'xxxx', 'publicUrl':'xxxx'}
+// /blue-aiagent/api/v1/my/upload
+
+export const uploadFilesFromWechat = ()=> {
+  Taro.chooseMessageFile({
+    count: 10,
+    type: "file",
+    extension: FileTypes.map((f) => `${f}`),
+    success(res) {
+      const tempFilePaths = res.tempFiles;
+      console.log("tempFilePaths", tempFilePaths);
+      const files = tempFilePaths.map((file) => {
+        return {
+          file,
+          status: 0,
+          fileProgress: {
+            progress: 0,
+            totalBytesSent: 0,
+            totalBytesExpectedToSend: 0,
+          },
+        };
+      });
+      // setUploadingList(files);
+      // setUploadList(files);
+      console.log(files);
+    },
+  });
+}
+
+
+// 前端获取自主上传文件至存贮的安全令牌
+export type TUploadSecurityToken = {
+  "accessKeyId": string,
+  "accessKeySecret": string,
+  "expiration": string,
+  "fullPath": string,
+  "publicUrl": string,
+  "securityToken": string,
+  "statusCode": string
+}
+
+export const getUploadSecurityToken = () => {
+  return request.get<TUploadSecurityToken>(`${bluebookAiAgent}api/v1/my/upload/securityToken`)
+}
+
+// 克隆一个新的音色
+export type TVoiceItem = {
+  "createTime": string,
+  "failedReason": string,
+  "platform": string,
+  "sourceUrl": string,
+  "status": string,
+  "voiceId": string,
+  "voiceName": string
+}
+export const cloneVoice = (data: {
+  "sourceUrl": string,
+  "voiceText": string
+}) => {
+  return request.post<TVoiceItem>(`${bluebookAiAgent}api/v1/voice/clone`, data)
+}
+
+// 删除指定克隆的音色
+export const deleteVoice = (voiceId: string)=> {
+  return request.delete(`${bluebookAiAgent}api/v1/voice/clone/${voiceId}`)
+}
+
+// 获取指定克隆的音色记录--用于状态轮询
+export const getVoice = (voiceId: string) => {
+  return request.get<TVoiceItem>(`${bluebookAiAgent}api/v1/my/voice/${voiceId}`)
+}
+
+// 获取个人录音音色库
+export const getVoices = () => {
+  return request.get<TVoiceItem[]>(`${bluebookAiAgent}api/v1/my/voices/`)
+}
+
+

+ 56 - 0
src/service/system.ts

@@ -0,0 +1,56 @@
+// 系统配置
+import {
+  bluebookAiAgent,
+} from '@/lib/api/index'
+import request from '@/lib/module/axios.js'
+
+
+
+// 获取协议列表
+export type TAgreementItem = [
+  {
+    "link": string,
+    "name": string
+  }
+]
+// type??
+export const getSysAgreements = () => {
+  request.get<TAgreementItem>(`${bluebookAiAgent}api/v1/sys/agreements`)
+}
+
+// 获取个人最多允许创建N个智能体、智能助手二维码照片、录音文案等核心配置
+export type TSystemCoreCnf = {
+  "assistantQrCode": string,
+  "ossPrivateBucketName": string,
+  "ossPublicBucketName": string,
+  "personalMaxAgentNum": number,
+  "systemVoiceList": {
+    "avatar": string,
+    "gender": string,
+    "languages": string[],
+    "platform": string,
+    "style": string,
+    "voiceId": string,
+    "voiceName": string
+  }[],
+  "voiceText": "string"
+}
+export const getSysCoreCnf = () => {
+  request.get<TSystemCoreCnf>(`${bluebookAiAgent}api/v1/sys/core/cnf`)
+}
+
+
+// 获取个人未创建智能体时的默认主页渲染内容
+export type TSystemDefaultPageContent = {
+  "backgroundColor": string,
+  "backgroundImage": string,
+  "description": string,
+  "subDescription": string,
+  "subTitle": string,
+  "title": string
+}
+export const getSysDefaultPageContent = () => {
+  request.get<TSystemDefaultPageContent>(`${bluebookAiAgent}api/v1/sys/defaultPage/content`)
+}
+
+

+ 3 - 3
src/service/user.ts

@@ -1,12 +1,12 @@
-import { service } from '@/utils/http'
+import request from '@/lib/module/axios.js'
 import { TEntityUser } from '@/types/index'
 
 
 export const putUser = (data: TEntityUser) => {
-  return service.put<TEntityUser, TEntityUser>('/v1/user', data)
+  return request.put<TEntityUser, TEntityUser>('/v1/user', data)
 }
 
 
 export const getUser = () => {
-  return service.get<TEntityUser>('/v1/user')
+  return request.get<TEntityUser>('/v1/user')
 }

+ 28 - 0
src/types/agent.ts

@@ -0,0 +1,28 @@
+export type TComponentItem = {
+  "data"?: any,
+  "enabled"?: boolean,
+  "type"?: string
+}
+export type TAgentDetail = {
+  "address"?: string,
+  "agentId"?: string,
+  "avatarUrl"?: string,
+  "components"?: TComponentItem[],
+  "email"?: string,
+  "enabledChatBg"?: boolean,
+  "enabledPersonalKb"?: boolean,
+  "entId"?: string,
+  "entName"?: string,
+  "greeting"?: string,
+  "isDefault"?: boolean,
+  "isEnt"?: boolean,
+  "isNewEnt"?: boolean,
+  "isSystemVoice"?: boolean,
+  "mobile"?: string,
+  "name"?: string,
+  "personality"?: string,
+  "position"?: string,
+  "qrCodeUrl"?: string,
+  "questionGuides"?: string[],
+  "voice"?: string
+}

+ 13 - 0
src/types/bot.ts

@@ -0,0 +1,13 @@
+export type TMessage = {
+  "content": "string",
+  "dislikeReason": "string",
+  "isDislike": false,
+  "isLike": false,
+  "isStreaming": false,
+  "msgId": 0,
+  "msgTime": "2025-05-15T09:20:38.817Z",
+  "msgUk": "string",
+  "originalAgentId": "string",
+  "role": "string"
+}
+

+ 1 - 8
src/types/index.ts

@@ -440,14 +440,7 @@ export enum ECharacterAISTATUS {
   RESPONDING = 3,// 回答中
 }
 
-export enum EUploadFileScene  {
-  VOICE_CLONE = 'voice_clone',
-  BG_IMAGE = 'bg_image',
-  COMPONENT = 'component',
-  DOC = 'doc',
-  OTHER = 'other',
-  AVATAR = 'avatar'
-}
+
 
 export type TSocialMediaItem = {
   value: string,

+ 20 - 0
src/types/knowledge.ts

@@ -0,0 +1,20 @@
+
+export type TKnowledgeListItem = {
+  "answerCnt": number,
+  "createTime": string,
+  "enableExactAnswer": false,
+  "fileSizeStr": string,
+  "icon": string,
+  "knowledgeId": number,
+  "parseStatus": string,
+  "picUrl": string,
+  "title": string,
+  "type": string
+}
+
+export type TQAListItem = {
+  "answer": string,
+  "links": string[],
+  "pics": string[],
+  "question": string
+}

+ 2 - 82
src/utils/http.ts

@@ -7,7 +7,7 @@ import { authLogin } from "./auth";
 import { APP_VERSION, TARO_APP_ID } from "@/config/index";
 // import { TaroAdapter } from "axios-taro-adapter";
 import { useAppStore } from '@/store/appStore'
-import { EUploadFileScene } from '@/types/index'
+import { EUploadFileScene, EUploadFileBucketName } from '@/consts/enum'
 
 // type TResponseData = Promise<{
 //   "code": number,
@@ -142,6 +142,7 @@ export const service = {
 const _uploadFile = (
   tmpPath: string,
   fileName: string = "file",
+  bucketName= EUploadFileBucketName.OTHER, 
   scene=EUploadFileScene.OTHER, 
   callback: (
     data: {
@@ -179,71 +180,6 @@ const _uploadFile = (
   });
 };
 
-
-const _uploadFileByH5 = (
-  file: File,
-  callback: (
-    data: {
-      code: number;
-      data: string;
-      msg: string;
-    } | null
-  ) => void,
-  {
-    onProgressUpdate,
-    onUploadFinish,
-  }: {
-    onProgressUpdate?: (progress: number) => void;
-    onUploadFinish?: (res: any) => void;
-  }
-) => {
-  console.log("[ file ] >", file);
-  const formData = new FormData();
-  formData.append("file", file);
-
-  axios
-    .post(`${BASE_URL}v1/base/upload`, formData, {
-      onUploadProgress: (progressEvent) => {
-        const percentCompleted = Math.round(
-          (progressEvent.loaded * 100) / progressEvent.total
-        );
-        console.log(percentCompleted);
-        onProgressUpdate && onProgressUpdate(percentCompleted);
-      },
-      headers: {
-        ...getHeaders(),
-      },
-    })
-    .then((res) => {
-      console.log("[ response ] >", res);
-      callback && callback(res.data);
-      onUploadFinish && onUploadFinish(res);
-    })
-    .catch(() => {
-      callback(null);
-    });
-
-  // return task;
-};
-
-export async function uploadImageByH5(file: File): Promise<{
-  code: number;
-  data: string;
-  msg: string;
-} | null> {
-  console.log("[ file ] >", file);
-  const formData = new FormData();
-  formData.append("file", file);
-  const response = await fetch(`${BASE_URL}v1/base/upload`, {
-    method: "POST",
-    body: formData,
-    headers: {
-      ...getHeaders(),
-    },
-  }).then((res) => res.json());
-  return response;
-}
-
 export async function uploadImage(tmpPath: string, scene: EUploadFileScene = EUploadFileScene.OTHER): Promise<{
   code: number;
   data: string;
@@ -270,21 +206,5 @@ export async function uploadFile(
   });
 }
 
-	
-export function uploadFileManager(
-  path: string,
-  scene: EUploadFileScene,
-  callback: (data: any) => void,
-  options?: { file?: File, onProgressUpdate?: (progress:number) => void,onUploadFinish?: (res: any) => void }
-) {
-  if (options?.file) {
-    // h5 上传
-    _uploadFileByH5(options.file, callback, options);
-    return null;
-  }
-  return _uploadFile(path, 'file', scene, callback)
-}
-
-
 
 export default instance; // 导出创建后的实例