From bcf94919991df5b3fca948bed362ef22a79d50e0 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Wed, 11 Oct 2023 17:18:43 +0800 Subject: [PATCH] v4.4.7-2 (#388) --- docSite/assets/imgs/getfile_id.png | Bin 0 -> 180892 bytes .../content/docs/development/configuration.md | 4 +- docSite/content/docs/development/openApi.md | 21 +- .../docs/installation/upgrading/447.md | 4 +- packages/core/ai/config.ts | 28 +-- packages/core/ai/constant.ts | 7 +- .../core/ai/functions/createQuestionGuide.ts | 6 +- packages/core/ai/type.d.ts | 7 +- packages/core/package.json | 7 +- pnpm-lock.yaml | 197 ++++++++++++++++-- projects/app/public/docs/versionIntro.md | 13 +- projects/app/public/icon/human.svg | 187 +++++++++++++++++ projects/app/public/locales/en/common.json | 1 + projects/app/public/locales/zh/common.json | 1 + projects/app/src/api/app.ts | 4 +- .../app/src/components/ChatBox/QuoteModal.tsx | 38 +++- projects/app/src/components/Layout/index.tsx | 2 +- projects/app/src/components/Loading/index.tsx | 6 +- projects/app/src/constants/chat.ts | 2 +- .../app/src/constants/flow/ModuleTemplate.ts | 83 +++++--- projects/app/src/hooks/useLoading.tsx | 8 +- projects/app/src/pages/api/admin/initv447.ts | 20 +- projects/app/src/pages/api/app/create.ts | 19 +- projects/app/src/pages/api/app/update.ts | 3 +- .../pages/api/core/dataset/data/insertData.ts | 3 + .../pages/api/core/dataset/data/pushData.ts | 95 ++++----- .../src/pages/api/core/dataset/file/list.ts | 22 +- .../src/pages/api/core/dataset/searchTest.ts | 1 - .../src/pages/api/openapi/plugin/vector.ts | 22 +- .../app/src/pages/api/user/account/update.ts | 23 +- projects/app/src/pages/app/detail/index.tsx | 5 +- .../pages/app/list/component/CreateModal.tsx | 94 +++++---- .../kb/detail/components/InputDataModal.tsx | 6 +- projects/app/src/service/dataset/auth.ts | 22 ++ projects/app/src/service/errorCode.ts | 13 -- projects/app/src/service/events/generateQA.ts | 24 +-- projects/app/src/service/models/user.ts | 2 +- .../moduleDispatch/agent/classifyQuestion.ts | 47 ++--- .../service/moduleDispatch/agent/extract.ts | 47 ++--- .../src/service/moduleDispatch/chat/oneapi.ts | 135 +++++------- .../src/service/moduleDispatch/kb/search.ts | 4 +- projects/app/src/service/pg.ts | 33 ++- projects/app/src/service/response.ts | 20 +- projects/app/src/types/app.d.ts | 7 +- projects/app/src/types/chat.d.ts | 1 + projects/app/src/types/core/chat/type.d.ts | 2 +- projects/app/src/types/index.d.ts | 1 + projects/app/src/utils/adapt.ts | 2 +- projects/app/src/utils/common/tools/text.ts | 2 +- projects/app/src/utils/file.ts | 9 +- projects/app/src/utils/web/core/dataset.ts | 2 +- 51 files changed, 852 insertions(+), 460 deletions(-) create mode 100644 docSite/assets/imgs/getfile_id.png create mode 100644 projects/app/public/icon/human.svg create mode 100644 projects/app/src/service/dataset/auth.ts diff --git a/docSite/assets/imgs/getfile_id.png b/docSite/assets/imgs/getfile_id.png new file mode 100644 index 0000000000000000000000000000000000000000..3995d5669d6b5dae9a074b3d946ecb0bb146a819 GIT binary patch literal 180892 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 literal 0 HcmV?d00001 diff --git a/docSite/content/docs/development/configuration.md b/docSite/content/docs/development/configuration.md index 325996e54..c75eba7c9 100644 --- a/docSite/content/docs/development/configuration.md +++ b/docSite/content/docs/development/configuration.md @@ -77,7 +77,7 @@ weight: 520 "price": 0, "prompt": "" }, - "CQModel": { // 问题分类模型 + "CQModel": { // Classify Question: 问题分类模型 "model": "gpt-3.5-turbo-16k", "functionCall": true, "name": "GPT35-16k", @@ -85,7 +85,7 @@ weight: 520 "price": 0, "prompt": "" }, - "QGModel": { // 生成下一步指引模型 + "QGModel": { // Question Generation: 生成下一步指引模型 "model": "gpt-3.5-turbo", "name": "GPT35-4k", "maxToken": 4000, diff --git a/docSite/content/docs/development/openApi.md b/docSite/content/docs/development/openApi.md index df64f55b2..f93d18d11 100644 --- a/docSite/content/docs/development/openApi.md +++ b/docSite/content/docs/development/openApi.md @@ -225,9 +225,10 @@ data: [{"moduleName":"KB Search","price":1.2000000000000002,"model":"Embedding-2 此部分 API 需使用全局通用的 API Key。 {{% /alert %}} -### 如何获取知识库ID(kbId) +| 如何获取知识库ID(kbId) | 如何获取文件ID(file_id) | +| --------------------- | --------------------- | +| ![](/imgs/getKbId.png) | ![](/imgs/getfile_id.png) | -![](/imgs/getKbId.png) ### 知识库添加数据 @@ -248,6 +249,8 @@ curl --location --request POST 'https://fastgpt.run/api/core/dataset/data/pushDa         {             "a": "test",             "q": "1111", + "file_id": "关联的文件ID/URL/manual/mark", + "source": "来源名称",         },         {             "a": "test2", @@ -271,7 +274,8 @@ curl --location --request POST 'https://fastgpt.run/api/core/dataset/data/pushDa "data": [ { "q": "生成索引的内容,index 模式下最大 tokens 为3000,建议不超过 1000", - "a": "预期回答/补充" + "a": "预期回答/补充", + "file_id": "如果推送数据到手动录入,这里可以留空; 如果希望关联到某个文件中,需要填写对应文件的ID; 如果希望加入到手动标注中,可设置为: mark", }, { "q": "生成索引的内容,qa 模式下最大 tokens 为10000,建议 8000 左右", @@ -292,7 +296,16 @@ curl --location --request POST 'https://fastgpt.run/api/core/dataset/data/pushDa "code": 200, "statusText": "", "data": { - "insertLen": 1 // 最终插入成功的数量,可能因为超出 tokens 或者插入异常,index 可以重复插入,会自动去重 + "insertLen": 1, // 最终插入成功的数量 + "overToken": [], // 超出 token 的 + "fileIdInvalid": [ // file_id 无效的 + { + "a": "飞飞dsaf飞", + "q": "测试是32否收到", + "file_id": "32dwe" + } + ], + "error": [] // 其他错误 } } ``` diff --git a/docSite/content/docs/installation/upgrading/447.md b/docSite/content/docs/installation/upgrading/447.md index 8160cbef0..03bc72d43 100644 --- a/docSite/content/docs/installation/upgrading/447.md +++ b/docSite/content/docs/installation/upgrading/447.md @@ -26,4 +26,6 @@ curl --location --request POST 'https://{{host}}/api/admin/initv447' \ ### Fast GPT V4.4.7 1. 优化了数据库文件 crud。 -2. 兼容链接读取,作为 source。 \ No newline at end of file +2. 兼容链接读取,作为 source。 +3. 区分手动录入和标注,可追数据至某个文件。 +4. 升级 openai sdk。 \ No newline at end of file diff --git a/packages/core/ai/config.ts b/packages/core/ai/config.ts index cc9c94e2f..11df30451 100644 --- a/packages/core/ai/config.ts +++ b/packages/core/ai/config.ts @@ -1,28 +1,16 @@ import { UserModelSchema } from '../user/type'; -import { Configuration, OpenAIApi } from 'openai'; +import OpenAI from 'openai'; export const openaiBaseUrl = process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1'; export const baseUrl = process.env.ONEAPI_URL || openaiBaseUrl; export const systemAIChatKey = process.env.CHAT_API_KEY || ''; -export const getAIChatApi = (props?: UserModelSchema['openaiAccount']) => { - return new OpenAIApi( - new Configuration({ - basePath: props?.baseUrl || baseUrl, - apiKey: props?.key || systemAIChatKey - }) - ); -}; - -/* openai axios config */ -export const axiosConfig = (props?: UserModelSchema['openaiAccount']) => { - return { - baseURL: props?.baseUrl || baseUrl, // 此处仅对非 npm 模块有效 - httpsAgent: global.httpsAgent, - headers: { - Authorization: `Bearer ${props?.key || systemAIChatKey}`, - auth: process.env.OPENAI_BASE_URL_AUTH || '' - } - }; +export const getAIApi = (props?: UserModelSchema['openaiAccount'], timeout = 6000) => { + return new OpenAI({ + apiKey: props?.key || systemAIChatKey, + baseURL: props?.baseUrl || baseUrl, + httpAgent: global.httpsAgent, + timeout + }); }; diff --git a/packages/core/ai/constant.ts b/packages/core/ai/constant.ts index 2c6b9bee5..4773d0895 100644 --- a/packages/core/ai/constant.ts +++ b/packages/core/ai/constant.ts @@ -1 +1,6 @@ -export { ChatCompletionRequestMessageRoleEnum } from 'openai'; +export enum ChatCompletionRequestMessageRoleEnum { + 'System' = 'system', + 'User' = 'user', + 'Assistant' = 'assistant', + 'Function' = 'function' +} diff --git a/packages/core/ai/functions/createQuestionGuide.ts b/packages/core/ai/functions/createQuestionGuide.ts index d7a667756..3201c34e2 100644 --- a/packages/core/ai/functions/createQuestionGuide.ts +++ b/packages/core/ai/functions/createQuestionGuide.ts @@ -1,5 +1,5 @@ import { ChatCompletionRequestMessage } from '../type'; -import { getAIChatApi } from '../config'; +import { getAIApi } from '../config'; export const Prompt_QuestionGuide = `我不太清楚问你什么问题,请帮我生成 3 个问题,引导我继续提问。问题的长度应小于20个字符,按 JSON 格式返回: ["问题1", "问题2", "问题3"]`; @@ -10,8 +10,8 @@ export async function createQuestionGuide({ messages: ChatCompletionRequestMessage[]; model: string; }) { - const chatAPI = getAIChatApi(); - const { data } = await chatAPI.createChatCompletion({ + const ai = getAIApi(); + const data = await ai.chat.completions.create({ model: model, temperature: 0, max_tokens: 200, diff --git a/packages/core/ai/type.d.ts b/packages/core/ai/type.d.ts index 7fa86c127..89a5a42d5 100644 --- a/packages/core/ai/type.d.ts +++ b/packages/core/ai/type.d.ts @@ -1 +1,6 @@ -export type { CreateChatCompletionRequest, ChatCompletionRequestMessage } from 'openai'; +import OpenAI from 'openai'; +export type ChatCompletionRequestMessage = OpenAI.Chat.CreateChatCompletionRequestMessage; +export type ChatCompletion = OpenAI.Chat.ChatCompletion; +export type CreateChatCompletionRequest = OpenAI.Chat.ChatCompletionCreateParams; + +export type StreamChatType = Stream; diff --git a/packages/core/package.json b/packages/core/package.json index 0329f7d68..5013eac09 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -2,10 +2,11 @@ "name": "@fastgpt/core", "version": "1.0.0", "dependencies": { - "openai": "^3.3.0", - "tunnel": "^0.0.6", "@fastgpt/common": "workspace:*", - "@fastgpt/support": "workspace:*" + "@fastgpt/support": "workspace:*", + "encoding": "^0.1.13", + "openai": "^4.11.1", + "tunnel": "^0.0.6" }, "devDependencies": { "@types/tunnel": "^0.0.4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6d4511557..e15f8565c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,9 +37,12 @@ importers: '@fastgpt/support': specifier: workspace:* version: link:../support + encoding: + specifier: ^0.1.13 + version: registry.npmmirror.com/encoding@0.1.13 openai: - specifier: ^3.3.0 - version: registry.npmmirror.com/openai@3.3.0 + specifier: ^4.11.1 + version: registry.npmmirror.com/openai@4.11.1(encoding@0.1.13) tunnel: specifier: ^0.0.6 version: registry.npmmirror.com/tunnel@0.0.6 @@ -5584,6 +5587,15 @@ packages: '@types/express': registry.npmmirror.com/@types/express@4.17.17 dev: true + registry.npmmirror.com/@types/node-fetch@2.6.6: + resolution: {integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node-fetch/-/node-fetch-2.6.6.tgz} + name: '@types/node-fetch' + version: 2.6.6 + dependencies: + '@types/node': registry.npmmirror.com/@types/node@18.14.0 + form-data: registry.npmmirror.com/form-data@4.0.0 + dev: false + registry.npmmirror.com/@types/node@18.14.0: resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-18.14.0.tgz} name: '@types/node' @@ -5825,6 +5837,15 @@ packages: version: 2.0.6 dev: false + registry.npmmirror.com/abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/abort-controller/-/abort-controller-3.0.0.tgz} + name: abort-controller + version: 3.0.0 + engines: {node: '>=6.5'} + dependencies: + event-target-shim: registry.npmmirror.com/event-target-shim@5.0.1 + dev: false + registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz} id: registry.npmmirror.com/acorn-jsx/5.3.2 @@ -5855,6 +5876,15 @@ packages: - supports-color dev: false + registry.npmmirror.com/agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz} + name: agentkeepalive + version: 4.5.0 + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: registry.npmmirror.com/humanize-ms@1.2.1 + dev: false + registry.npmmirror.com/aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz} name: aggregate-error @@ -6115,16 +6145,6 @@ packages: engines: {node: '>=4'} dev: true - registry.npmmirror.com/axios@0.26.1: - resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz} - name: axios - version: 0.26.1 - dependencies: - follow-redirects: registry.npmmirror.com/follow-redirects@1.15.3 - transitivePeerDependencies: - - debug - dev: false - registry.npmmirror.com/axios@1.3.3: resolution: {integrity: sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/axios/-/axios-1.3.3.tgz} name: axios @@ -6213,6 +6233,12 @@ packages: version: 1.0.2 dev: true + registry.npmmirror.com/base-64@0.1.0: + resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/base-64/-/base-64-0.1.0.tgz} + name: base-64 + version: 0.1.0 + dev: false + registry.npmmirror.com/base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz} name: base64-js @@ -6418,6 +6444,12 @@ packages: version: 1.1.4 dev: false + registry.npmmirror.com/charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz} + name: charenc + version: 0.0.2 + dev: false + registry.npmmirror.com/chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz} name: chokidar @@ -6706,6 +6738,12 @@ packages: which: registry.npmmirror.com/which@2.0.2 dev: true + registry.npmmirror.com/crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz} + name: crypt + version: 0.0.2 + dev: false + registry.npmmirror.com/crypto@1.0.1: resolution: {integrity: sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/crypto/-/crypto-1.0.1.tgz} name: crypto @@ -7284,6 +7322,15 @@ packages: engines: {node: '>=0.3.1'} dev: false + registry.npmmirror.com/digest-fetch@1.3.0: + resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/digest-fetch/-/digest-fetch-1.3.0.tgz} + name: digest-fetch + version: 1.3.0 + dependencies: + base-64: registry.npmmirror.com/base-64@0.1.0 + md5: registry.npmmirror.com/md5@2.3.0 + dev: false + registry.npmmirror.com/dingbat-to-unicode@1.0.1: resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz} name: dingbat-to-unicode @@ -7446,6 +7493,14 @@ packages: version: 2.0.0 dev: false + registry.npmmirror.com/encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz} + name: encoding + version: 0.1.13 + dependencies: + iconv-lite: registry.npmmirror.com/iconv-lite@0.6.3 + dev: false + registry.npmmirror.com/enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz} name: enhanced-resolve @@ -7933,6 +7988,13 @@ packages: engines: {node: '>=0.10.0'} dev: true + registry.npmmirror.com/event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/event-target-shim/-/event-target-shim-5.0.1.tgz} + name: event-target-shim + version: 5.0.1 + engines: {node: '>=6'} + dev: false + registry.npmmirror.com/execa@7.1.1: resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/execa/-/execa-7.1.1.tgz} name: execa @@ -8105,6 +8167,12 @@ packages: is-callable: registry.npmmirror.com/is-callable@1.2.7 dev: true + registry.npmmirror.com/form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz} + name: form-data-encoder + version: 1.7.2 + dev: false + registry.npmmirror.com/form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz} name: form-data @@ -8123,6 +8191,16 @@ packages: engines: {node: '>=0.4.x'} dev: false + registry.npmmirror.com/formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/formdata-node/-/formdata-node-4.4.1.tgz} + name: formdata-node + version: 4.4.1 + engines: {node: '>= 12.20'} + dependencies: + node-domexception: registry.npmmirror.com/node-domexception@1.0.0 + web-streams-polyfill: registry.npmmirror.com/web-streams-polyfill@4.0.0-beta.3 + dev: false + registry.npmmirror.com/formidable@2.1.1: resolution: {integrity: sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/formidable/-/formidable-2.1.1.tgz} name: formidable @@ -8565,6 +8643,14 @@ packages: engines: {node: '>=14.18.0'} dev: true + registry.npmmirror.com/humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz} + name: humanize-ms + version: 1.2.1 + dependencies: + ms: registry.npmmirror.com/ms@2.1.3 + dev: false + registry.npmmirror.com/husky@8.0.3: resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/husky/-/husky-8.0.3.tgz} name: husky @@ -8785,6 +8871,12 @@ packages: has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 dev: true + registry.npmmirror.com/is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz} + name: is-buffer + version: 1.1.6 + dev: false + registry.npmmirror.com/is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz} name: is-buffer @@ -9516,6 +9608,16 @@ packages: version: 3.0.3 dev: false + registry.npmmirror.com/md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz} + name: md5 + version: 2.3.0 + dependencies: + charenc: registry.npmmirror.com/charenc@0.0.2 + crypt: registry.npmmirror.com/crypt@0.0.2 + is-buffer: registry.npmmirror.com/is-buffer@1.1.6 + dev: false + registry.npmmirror.com/mdast-util-definitions@5.1.2: resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz} name: mdast-util-definitions @@ -10381,6 +10483,29 @@ packages: next: registry.npmmirror.com/next@13.5.2(@babel/core@7.22.20)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) dev: false + registry.npmmirror.com/node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz} + name: node-domexception + version: 1.0.0 + engines: {node: '>=10.5.0'} + dev: false + + registry.npmmirror.com/node-fetch@2.7.0(encoding@0.1.13): + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz} + id: registry.npmmirror.com/node-fetch/2.7.0 + name: node-fetch + version: 2.7.0 + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + encoding: registry.npmmirror.com/encoding@0.1.13 + whatwg-url: registry.npmmirror.com/whatwg-url@5.0.0 + dev: false + registry.npmmirror.com/node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz} name: node-releases @@ -10543,15 +10668,23 @@ packages: mimic-fn: registry.npmmirror.com/mimic-fn@4.0.0 dev: true - registry.npmmirror.com/openai@3.3.0: - resolution: {integrity: sha512-uqxI/Au+aPRnsaQRe8CojU0eCR7I0mBiKjD3sNMzY6DaC1ZVrc85u98mtJW6voDug8fgGN+DIZmTDxTthxb7dQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/openai/-/openai-3.3.0.tgz} + registry.npmmirror.com/openai@4.11.1(encoding@0.1.13): + resolution: {integrity: sha512-GU0HQWbejXuVAQlDjxIE8pohqnjptFDIm32aPlNT1H9ucMz1VJJD0DaTJRQsagNaJ97awWjjVLEG7zCM6sm4SA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/openai/-/openai-4.11.1.tgz} + id: registry.npmmirror.com/openai/4.11.1 name: openai - version: 3.3.0 + version: 4.11.1 + hasBin: true dependencies: - axios: registry.npmmirror.com/axios@0.26.1 - form-data: registry.npmmirror.com/form-data@4.0.0 + '@types/node': registry.npmmirror.com/@types/node@18.14.0 + '@types/node-fetch': registry.npmmirror.com/@types/node-fetch@2.6.6 + abort-controller: registry.npmmirror.com/abort-controller@3.0.0 + agentkeepalive: registry.npmmirror.com/agentkeepalive@4.5.0 + digest-fetch: registry.npmmirror.com/digest-fetch@1.3.0 + form-data-encoder: registry.npmmirror.com/form-data-encoder@1.7.2 + formdata-node: registry.npmmirror.com/formdata-node@4.4.1 + node-fetch: registry.npmmirror.com/node-fetch@2.7.0(encoding@0.1.13) transitivePeerDependencies: - - debug + - encoding dev: false registry.npmmirror.com/option@0.2.4: @@ -12157,6 +12290,12 @@ packages: url-parse: registry.npmmirror.com/url-parse@1.5.10 dev: false + registry.npmmirror.com/tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz} + name: tr46 + version: 0.0.3 + dev: false + registry.npmmirror.com/tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz} name: tr46 @@ -12662,12 +12801,25 @@ packages: version: 2.0.1 dev: false + registry.npmmirror.com/web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz} + name: web-streams-polyfill + version: 4.0.0-beta.3 + engines: {node: '>= 14'} + dev: false + registry.npmmirror.com/web-worker@1.2.0: resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz} name: web-worker version: 1.2.0 dev: false + registry.npmmirror.com/webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz} + name: webidl-conversions + version: 3.0.1 + dev: false + registry.npmmirror.com/webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz} name: webidl-conversions @@ -12711,6 +12863,15 @@ packages: webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 dev: false + registry.npmmirror.com/whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz} + name: whatwg-url + version: 5.0.0 + dependencies: + tr46: registry.npmmirror.com/tr46@0.0.3 + webidl-conversions: registry.npmmirror.com/webidl-conversions@3.0.1 + dev: false + registry.npmmirror.com/which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz} name: which-boxed-primitive diff --git a/projects/app/public/docs/versionIntro.md b/projects/app/public/docs/versionIntro.md index aacab4f75..d8efed71d 100644 --- a/projects/app/public/docs/versionIntro.md +++ b/projects/app/public/docs/versionIntro.md @@ -1,9 +1,6 @@ -### Fast GPT V4.4.6 +### Fast GPT V4.4.7 -1. 高级编排新增模块 - 应用调用 -2. 新增 - 必要连接校验 -3. 新增 - 下一步指引选项,可以通过模型生成 3 个预测问题。 -4. 新增 - 分享链接 hook 身份校验。 -5. [使用文档](https://doc.fastgpt.run/docs/intro/) -6. [点击查看高级编排介绍文档](https://doc.fastgpt.run/docs/workflow) -7. [点击查看商业版](https://doc.fastgpt.run/docs/commercial/) +1. 优化数据集管理,区分手动录入和标注,可追数据至某个文件,保留链接读取的原始链接。 +2. [使用文档](https://doc.fastgpt.run/docs/intro/) +3. [点击查看高级编排介绍文档](https://doc.fastgpt.run/docs/workflow) +4. [点击查看商业版](https://doc.fastgpt.run/docs/commercial/) diff --git a/projects/app/public/icon/human.svg b/projects/app/public/icon/human.svg new file mode 100644 index 000000000..9be629cd0 --- /dev/null +++ b/projects/app/public/icon/human.svg @@ -0,0 +1,187 @@ + + + + diff --git a/projects/app/public/locales/en/common.json b/projects/app/public/locales/en/common.json index eb4811079..744c16c70 100644 --- a/projects/app/public/locales/en/common.json +++ b/projects/app/public/locales/en/common.json @@ -131,6 +131,7 @@ "Rename Success": "Rename Success", "Search": "Search", "Status": "Status", + "Unknow": "Unknow", "Update Successful": "Update Successful", "export": "" }, diff --git a/projects/app/public/locales/zh/common.json b/projects/app/public/locales/zh/common.json index 2c12ca555..15f6476c5 100644 --- a/projects/app/public/locales/zh/common.json +++ b/projects/app/public/locales/zh/common.json @@ -131,6 +131,7 @@ "Rename Success": "重命名成功", "Search": "搜索", "Status": "状态", + "Unknow": "未知", "Update Successful": "更新成功", "export": "" }, diff --git a/projects/app/src/api/app.ts b/projects/app/src/api/app.ts index 355464dbf..609412cf7 100644 --- a/projects/app/src/api/app.ts +++ b/projects/app/src/api/app.ts @@ -2,9 +2,9 @@ import { GET, POST, DELETE, PUT } from './request'; import type { AppSchema } from '@/types/mongoSchema'; import type { AppListItemType, AppUpdateParams } from '@/types/app'; import { RequestPaging } from '../types/index'; -import type { Props as CreateAppProps } from '@/pages/api/app/create'; import { addDays } from 'date-fns'; import { GetAppChatLogsParams } from './request/app'; +import type { CreateAppParams } from '@/types/app'; /** * 获取模型列表 @@ -14,7 +14,7 @@ export const getMyModels = () => GET('/app/myApps'); /** * 创建一个模型 */ -export const postCreateApp = (data: CreateAppProps) => POST('/app/create', data); +export const postCreateApp = (data: CreateAppParams) => POST('/app/create', data); /** * 根据 ID 删除模型 diff --git a/projects/app/src/components/ChatBox/QuoteModal.tsx b/projects/app/src/components/ChatBox/QuoteModal.tsx index 12723e44f..a486e1008 100644 --- a/projects/app/src/components/ChatBox/QuoteModal.tsx +++ b/projects/app/src/components/ChatBox/QuoteModal.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useMemo, useState } from 'react'; -import { ModalBody, Box, useTheme } from '@chakra-ui/react'; +import { ModalBody, Box, useTheme, Flex, Progress } from '@chakra-ui/react'; import { getDatasetDataItemById } from '@/api/core/dataset/data'; import { useLoading } from '@/hooks/useLoading'; import { useToast } from '@/hooks/useToast'; @@ -8,22 +8,19 @@ import { QuoteItemType } from '@/types/chat'; import MyIcon from '@/components/Icon'; import InputDataModal, { RawFileText } from '@/pages/kb/detail/components/InputDataModal'; import MyModal from '../MyModal'; -import type { PgDataItemType } from '@/types/core/dataset/data'; +import { useTranslation } from 'react-i18next'; import { useRouter } from 'next/router'; -type SearchType = PgDataItemType & { - kb_id?: string; -}; - const QuoteModal = ({ onUpdateQuote, rawSearch = [], onClose }: { onUpdateQuote: (quoteId: string, sourceText?: string) => Promise; - rawSearch: SearchType[]; + rawSearch: QuoteItemType[]; onClose: () => void; }) => { + const { t } = useTranslation(); const theme = useTheme(); const router = useRouter(); const { toast } = useToast(); @@ -36,7 +33,7 @@ const QuoteModal = ({ * click edit, get new kbDataItem */ const onclickEdit = useCallback( - async (item: SearchType) => { + async (item: QuoteItemType) => { if (!item.id) return; try { setIsLoading(true); @@ -95,9 +92,30 @@ const QuoteModal = ({ _hover={{ '& .edit': { display: 'flex' } }} overflow={'hidden'} > - {item.source && !isShare && ( - + {!isShare && ( + + + + {item.score && ( + <> + + {item.score.toFixed(4)} + + )} + )} + {item.q} {item.a} {item.id && !isShare && ( diff --git a/projects/app/src/components/Layout/index.tsx b/projects/app/src/components/Layout/index.tsx index d10743d7c..640076ec5 100644 --- a/projects/app/src/components/Layout/index.tsx +++ b/projects/app/src/components/Layout/index.tsx @@ -102,7 +102,7 @@ const Layout = ({ children }: { children: JSX.Element }) => { )} - + ); }; diff --git a/projects/app/src/components/Loading/index.tsx b/projects/app/src/components/Loading/index.tsx index ac3676340..c790e9cd1 100644 --- a/projects/app/src/components/Loading/index.tsx +++ b/projects/app/src/components/Loading/index.tsx @@ -4,16 +4,18 @@ import { Spinner, Flex, Box } from '@chakra-ui/react'; const Loading = ({ fixed = true, text = '', - bg = 'rgba(255,255,255,0.5)' + bg = 'rgba(255,255,255,0.5)', + zIndex = 1000 }: { fixed?: boolean; text?: string; bg?: string; + zIndex?: number; }) => { return ( { ({ loading, fixed = true, - text = '' + text = '', + zIndex }: { loading?: boolean; fixed?: boolean; text?: string; + zIndex?: number; }): JSX.Element | null => { - return isLoading || loading ? : null; + return isLoading || loading ? ( + + ) : null; }, [isLoading] ); diff --git a/projects/app/src/pages/api/admin/initv447.ts b/projects/app/src/pages/api/admin/initv447.ts index 5d0ef3d18..0eb519c60 100644 --- a/projects/app/src/pages/api/admin/initv447.ts +++ b/projects/app/src/pages/api/admin/initv447.ts @@ -15,16 +15,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) await connectToDatabase(); await authUser({ req, authRoot: true }); - console.log('add index'); - await PgClient.query( - ` - ALTER TABLE modeldata - ALTER COLUMN source TYPE VARCHAR(256), - ALTER COLUMN file_id TYPE VARCHAR(256); - CREATE INDEX IF NOT EXISTS modelData_fileId_index ON modeldata (file_id); - ` - ); - console.log('index success'); console.log('count rows'); // 去重获取 fileId const { rows } = await PgClient.query(`SELECT DISTINCT file_id @@ -36,8 +26,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) await init(rows.slice(i, i + limit), initFileIds); console.log(i); } - console.log('filter success'); - console.log('start update'); for (let i = 0; i < initFileIds.length; i++) { await PgClient.query(`UPDATE ${PgDatasetTableName} @@ -49,9 +37,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) const { rows: emptyIds } = await PgClient.query( `SELECT id FROM ${PgDatasetTableName} WHERE file_id IS NULL OR file_id=''` ); + console.log('filter success'); console.log(emptyIds.length); await delay(5000); + console.log('start update'); async function start(start: number) { for (let i = start; i < emptyIds.length; i += limit) { @@ -65,12 +55,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) start(i); } - // await PgClient.query( - // `UPDATE ${PgDatasetTableName} - // SET file_id = '${DatasetSpecialIdEnum.manual}' - // WHERE file_id IS NULL OR file_id = ''` - // ); - console.log('update success'); jsonRes(res, { diff --git a/projects/app/src/pages/api/app/create.ts b/projects/app/src/pages/api/app/create.ts index 40a7d8b03..39efacef5 100644 --- a/projects/app/src/pages/api/app/create.ts +++ b/projects/app/src/pages/api/app/create.ts @@ -4,17 +4,17 @@ import { jsonRes } from '@/service/response'; import { connectToDatabase } from '@/service/mongo'; import { authUser } from '@/service/utils/auth'; import { App } from '@/service/models/app'; -import { AppModuleItemType } from '@/types/app'; - -export type Props = { - name: string; - avatar?: string; - modules: AppModuleItemType[]; -}; +import type { CreateAppParams } from '@/types/app'; +import { AppTypeEnum } from '@/constants/app'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { - const { name, avatar, modules } = req.body as Props; + const { + name = 'APP', + avatar, + type = AppTypeEnum.advanced, + modules + } = req.body as CreateAppParams; if (!name || !Array.isArray(modules)) { throw new Error('缺少参数'); @@ -38,7 +38,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< avatar, name, userId, - modules + modules, + type }); jsonRes(res, { diff --git a/projects/app/src/pages/api/app/update.ts b/projects/app/src/pages/api/app/update.ts index ed887ed12..297b99ee0 100644 --- a/projects/app/src/pages/api/app/update.ts +++ b/projects/app/src/pages/api/app/update.ts @@ -9,7 +9,7 @@ import { authApp } from '@/service/utils/auth'; /* 获取我的模型 */ export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { - const { name, avatar, type, chat, share, intro, modules } = req.body as AppUpdateParams; + const { name, avatar, type, share, intro, modules } = req.body as AppUpdateParams; const { appId } = req.query as { appId: string }; if (!appId) { @@ -37,7 +37,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< type, avatar, intro, - chat, ...(share && { 'share.isShare': share.isShare, 'share.isShareDetail': share.isShareDetail diff --git a/projects/app/src/pages/api/core/dataset/data/insertData.ts b/projects/app/src/pages/api/core/dataset/data/insertData.ts index dace05c99..1f10b914d 100644 --- a/projects/app/src/pages/api/core/dataset/data/insertData.ts +++ b/projects/app/src/pages/api/core/dataset/data/insertData.ts @@ -13,6 +13,7 @@ import { getVectorModel } from '@/service/utils/data'; import { getVector } from '@/pages/api/openapi/plugin/vector'; import { DatasetDataItemType } from '@/types/core/dataset/data'; import { countPromptTokens } from '@/utils/common/tiktoken'; +import { authFileIdValid } from '@/service/dataset/auth'; export type Props = { kbId: string; @@ -72,6 +73,8 @@ export async function getVectorAndInsertDataset( return Promise.reject('已经存在完全一致的数据'); } + await authFileIdValid(data.file_id); + const { vectors } = await getVector({ model: kb.vectorModel, input: [q], diff --git a/projects/app/src/pages/api/core/dataset/data/pushData.ts b/projects/app/src/pages/api/core/dataset/data/pushData.ts index a8e21a968..bcd1707a9 100644 --- a/projects/app/src/pages/api/core/dataset/data/pushData.ts +++ b/projects/app/src/pages/api/core/dataset/data/pushData.ts @@ -1,16 +1,17 @@ +/* push data to training queue */ import type { NextApiRequest, NextApiResponse } from 'next'; import { jsonRes } from '@/service/response'; import { connectToDatabase, TrainingData, KB } from '@/service/mongo'; import { authUser } from '@/service/utils/auth'; import { authKb } from '@/service/utils/auth'; import { withNextCors } from '@/service/utils/tools'; -import { PgDatasetTableName, TrainingModeEnum } from '@/constants/plugin'; +import { TrainingModeEnum } from '@/constants/plugin'; import { startQueue } from '@/service/utils/tools'; -import { PgClient } from '@/service/pg'; import { getVectorModel } from '@/service/utils/data'; import { DatasetDataItemType } from '@/types/core/dataset/data'; import { countPromptTokens } from '@/utils/common/tiktoken'; import type { PushDataProps, PushDataResponse } from '@/api/core/dataset/data.d'; +import { authFileIdValid } from '@/service/dataset/auth'; const modeMap = { [TrainingModeEnum.index]: true, @@ -80,69 +81,49 @@ export async function pushDataToKb({ [TrainingModeEnum.qa]: global.qaModel.maxToken * 0.8 }; - // 过滤重复的 qa 内容 + // filter repeat or equal content const set = new Set(); - const filterData: DatasetDataItemType[] = []; + const filterResult: Record = { + success: [], + overToken: [], + fileIdInvalid: [], + error: [] + }; - data.forEach((item) => { - if (!item.q) return; + await Promise.all( + data.map(async (item) => { + if (!item.q) { + filterResult.error.push(item); + return; + } - const text = item.q + item.a; + const text = item.q + item.a; - // count q token - const token = countPromptTokens(item.q, 'system'); + // count q token + const token = countPromptTokens(item.q, 'system'); - if (token > modeMaxToken[mode]) { - return; - } + if (token > modeMaxToken[mode]) { + filterResult.overToken.push(item); + return; + } - if (!set.has(text)) { - filterData.push(item); - set.add(text); - } - }); + try { + await authFileIdValid(item.file_id); + } catch (error) { + filterResult.fileIdInvalid.push(item); + return; + } - // 数据库去重 - const insertData = ( - await Promise.allSettled( - filterData.map(async (data) => { - let { q, a } = data; - if (mode !== TrainingModeEnum.index) { - return Promise.resolve(data); - } - - if (!q) { - return Promise.reject('q为空'); - } - - q = q.replace(/\\n/g, '\n').trim().replace(/'/g, '"'); - a = a.replace(/\\n/g, '\n').trim().replace(/'/g, '"'); - - // Exactly the same data, not push - try { - const { rows } = await PgClient.query(` - SELECT COUNT(*) > 0 AS exists - FROM ${PgDatasetTableName} - WHERE md5(q)=md5('${q}') AND md5(a)=md5('${a}') AND user_id='${userId}' AND kb_id='${kbId}' - `); - const exists = rows[0]?.exists || false; - - if (exists) { - return Promise.reject('已经存在'); - } - } catch (error) { - console.log(error); - } - return Promise.resolve(data); - }) - ) - ) - .filter((item) => item.status === 'fulfilled') - .map((item: any) => item.value); + if (!set.has(text)) { + filterResult.success.push(item); + set.add(text); + } + }) + ); // 插入记录 const insertRes = await TrainingData.insertMany( - insertData.map((item) => ({ + filterResult.success.map((item) => ({ ...item, userId, kbId, @@ -154,9 +135,11 @@ export async function pushDataToKb({ ); insertRes.length > 0 && startQueue(); + delete filterResult.success; return { - insertLen: insertRes.length + insertLen: insertRes.length, + ...filterResult }; } diff --git a/projects/app/src/pages/api/core/dataset/file/list.ts b/projects/app/src/pages/api/core/dataset/file/list.ts index 49037fa61..abef540e7 100644 --- a/projects/app/src/pages/api/core/dataset/file/list.ts +++ b/projects/app/src/pages/api/core/dataset/file/list.ts @@ -3,7 +3,7 @@ import { jsonRes } from '@/service/response'; import { connectToDatabase, TrainingData } from '@/service/mongo'; import { authUser } from '@/service/utils/auth'; import { GridFSStorage } from '@/service/lib/gridfs'; -import { PgClient } from '@/service/pg'; +import { PgClient, updateDataFileId } from '@/service/pg'; import { PgDatasetTableName } from '@/constants/plugin'; import { FileStatusEnum } from '@/constants/dataset'; import { strIsLink } from '@fastgpt/common/tools/str'; @@ -35,8 +35,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< .join(' ')} ${searchText ? `AND source ILIKE '%${searchText}%'` : ''}`; - const [{ rows }, { rowCount: total }] = await Promise.all([ - PgClient.query(`SELECT file_id, COUNT(*) AS count + let [{ rows }, { rowCount: total }] = await Promise.all([ + PgClient.query<{ file_id: string; count: number }>(`SELECT file_id, COUNT(*) AS count FROM ${PgDatasetTableName} where ${pgWhere} GROUP BY file_id @@ -49,6 +49,21 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< `) ]); + // If fileId is invalid, reset it to manual + await Promise.all( + rows.map((row) => { + if (!strIsLink(row.file_id) && row.file_id.length !== 24) { + return updateDataFileId({ + oldFileId: row.file_id, + userId, + newFileId: DatasetSpecialIdEnum.manual + }); + } + }) + ); + // just filter link or fileData + rows = rows.filter((row) => strIsLink(row.file_id) || row.file_id.length === 24); + // find files const gridFs = new GridFSStorage('dataset', userId); const collection = gridFs.Collection(); @@ -96,6 +111,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< const data = await Promise.all([ getSpecialData(), ...rows.map(async (row) => { + if (!row.file_id) return null; // link data if (strIsLink(row.file_id)) { const { rows } = await PgClient.select(PgDatasetTableName, { diff --git a/projects/app/src/pages/api/core/dataset/searchTest.ts b/projects/app/src/pages/api/core/dataset/searchTest.ts index b62d1c434..288d3b028 100644 --- a/projects/app/src/pages/api/core/dataset/searchTest.ts +++ b/projects/app/src/pages/api/core/dataset/searchTest.ts @@ -47,7 +47,6 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex data: response?.[2]?.rows || [] }); } catch (err) { - console.log(err); jsonRes(res, { code: 500, error: err diff --git a/projects/app/src/pages/api/openapi/plugin/vector.ts b/projects/app/src/pages/api/openapi/plugin/vector.ts index e973f8b99..95583c761 100644 --- a/projects/app/src/pages/api/openapi/plugin/vector.ts +++ b/projects/app/src/pages/api/openapi/plugin/vector.ts @@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { jsonRes } from '@/service/response'; import { authBalanceByUid, authUser } from '@/service/utils/auth'; import { withNextCors } from '@/service/utils/tools'; -import { getAIChatApi, axiosConfig } from '@fastgpt/core/ai/config'; +import { getAIApi } from '@fastgpt/core/ai/config'; import { pushGenerateVectorBill } from '@/service/common/bill/push'; type Props = { @@ -54,29 +54,31 @@ export async function getVector({ } // 获取 chatAPI - const chatAPI = getAIChatApi(); + const ai = getAIApi(); // 把输入的内容转成向量 - const result = await chatAPI - .createEmbedding( + const result = await ai.embeddings + .create( { model, input }, { - timeout: 60000, - ...axiosConfig() + timeout: 60000 } ) .then(async (res) => { - if (!res.data?.data?.[0]?.embedding) { - console.log(res.data); + if (!res.data) { + return Promise.reject('Embedding API 404'); + } + if (!res?.data?.[0]?.embedding) { + console.log(res?.data); // @ts-ignore return Promise.reject(res.data?.err?.message || 'Embedding API Error'); } return { - tokenLen: res.data.usage.total_tokens || 0, - vectors: await Promise.all(res.data.data.map((item) => unityDimensional(item.embedding))) + tokenLen: res.usage.total_tokens || 0, + vectors: await Promise.all(res.data.map((item) => unityDimensional(item.embedding))) }; }); diff --git a/projects/app/src/pages/api/user/account/update.ts b/projects/app/src/pages/api/user/account/update.ts index d7a0094d6..8a5164d61 100644 --- a/projects/app/src/pages/api/user/account/update.ts +++ b/projects/app/src/pages/api/user/account/update.ts @@ -5,7 +5,7 @@ import { User } from '@/service/models/user'; import { connectToDatabase } from '@/service/mongo'; import { authUser } from '@/service/utils/auth'; import { UserUpdateParams } from '@/types/user'; -import { axiosConfig, getAIChatApi, openaiBaseUrl } from '@fastgpt/core/ai/config'; +import { getAIApi, openaiBaseUrl } from '@fastgpt/core/ai/config'; /* update user info */ export default async function handler(req: NextApiRequest, res: NextApiResponse) { @@ -22,20 +22,15 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< const baseUrl = openaiAccount?.baseUrl || openaiBaseUrl; openaiAccount.baseUrl = baseUrl; - const chatAPI = getAIChatApi(openaiAccount); + const ai = getAIApi(openaiAccount); - const response = await chatAPI.createChatCompletion( - { - model: 'gpt-3.5-turbo', - max_tokens: 1, - messages: [{ role: 'user', content: 'hi' }] - }, - { - ...axiosConfig(openaiAccount) - } - ); - if (response?.data?.choices?.[0]?.message?.content === undefined) { - throw new Error(JSON.stringify(response?.data)); + const response = await ai.chat.completions.create({ + model: 'gpt-3.5-turbo', + max_tokens: 1, + messages: [{ role: 'user', content: 'hi' }] + }); + if (response?.choices?.[0]?.message?.content === undefined) { + throw new Error('Key response is empty'); } } diff --git a/projects/app/src/pages/app/detail/index.tsx b/projects/app/src/pages/app/detail/index.tsx index 31d01a1e1..4b0e79701 100644 --- a/projects/app/src/pages/app/detail/index.tsx +++ b/projects/app/src/pages/app/detail/index.tsx @@ -6,6 +6,7 @@ import dynamic from 'next/dynamic'; import { defaultApp } from '@/constants/model'; import { useToast } from '@/hooks/useToast'; import { useQuery } from '@tanstack/react-query'; +import { feConfigs } from '@/store/static'; import Tabs from '@/components/Tabs'; import SideTabs from '@/components/SideTabs'; @@ -52,7 +53,9 @@ const AppDetail = ({ currentTab }: { currentTab: `${TabEnum}` }) => { const tabList = useMemo( () => [ { label: '简易配置', id: TabEnum.basicEdit, icon: 'overviewLight' }, - { label: '高级编排', id: TabEnum.adEdit, icon: 'settingLight' }, + ...(feConfigs?.hide_app_flow + ? [] + : [{ label: '高级编排', id: TabEnum.adEdit, icon: 'settingLight' }]), { label: '外部使用', id: TabEnum.outLink, icon: 'shareLight' }, { label: '对话日志', id: TabEnum.logs, icon: 'logsLight' }, { label: '立即对话', id: TabEnum.startChat, icon: 'chat' } diff --git a/projects/app/src/pages/app/list/component/CreateModal.tsx b/projects/app/src/pages/app/list/component/CreateModal.tsx index 426cb19e1..7590a2c03 100644 --- a/projects/app/src/pages/app/list/component/CreateModal.tsx +++ b/projects/app/src/pages/app/list/component/CreateModal.tsx @@ -21,6 +21,7 @@ import { useRouter } from 'next/router'; import { appTemplates } from '@/constants/flow/ModuleTemplate'; import { useGlobalStore } from '@/store/global'; import { useRequest } from '@/hooks/useRequest'; +import { feConfigs } from '@/store/static'; import Avatar from '@/components/Avatar'; import MyTooltip from '@/components/MyTooltip'; import MyModal from '@/components/MyModal'; @@ -74,10 +75,15 @@ const CreateModal = ({ onClose, onSuccess }: { onClose: () => void; onSuccess: ( const { mutate: onclickCreate, isLoading: creating } = useRequest({ mutationFn: async (data: FormType) => { + const template = appTemplates.find((item) => item.id === data.templateId); + if (!template) { + return Promise.reject('模板不存在'); + } return postCreateApp({ avatar: data.avatar, name: data.name, - modules: appTemplates.find((item) => item.id === data.templateId)?.modules || [] + type: template.type, + modules: template.modules || [] }); }, onSuccess(id: string) { @@ -118,48 +124,52 @@ const CreateModal = ({ onClose, onSuccess }: { onClose: () => void; onSuccess: ( })} /> - - 从模板中选择 - - - {appTemplates.map((item) => ( - { - setValue('templateId', item.id); - setRefresh((state) => !state); - }} + {!feConfigs?.hide_app_flow && ( + <> + + 从模板中选择 + + - - - - {item.name} - - - - {item.intro} - - - ))} - + {appTemplates.map((item) => ( + { + setValue('templateId', item.id); + setRefresh((state) => !state); + }} + > + + + + {item.name} + + + + {item.intro} + + + ))} + + + )} diff --git a/projects/app/src/pages/kb/detail/components/InputDataModal.tsx b/projects/app/src/pages/kb/detail/components/InputDataModal.tsx index f02515b0a..f31544189 100644 --- a/projects/app/src/pages/kb/detail/components/InputDataModal.tsx +++ b/projects/app/src/pages/kb/detail/components/InputDataModal.tsx @@ -263,6 +263,10 @@ export function RawFileText({ fileId, filename = '', ...props }: RawFileTextProp const { setLoading } = useGlobalStore(); const hasFile = useMemo(() => fileId && !datasetSpecialIds.includes(fileId), [fileId]); + const formatName = useMemo( + () => (filename.startsWith('kb') ? t(filename) : filename), + [filename, t] + ); return ( @@ -293,7 +297,7 @@ export function RawFileText({ fileId, filename = '', ...props }: RawFileTextProp : {})} {...props} > - {t(filename)} + {formatName} ); diff --git a/projects/app/src/service/dataset/auth.ts b/projects/app/src/service/dataset/auth.ts new file mode 100644 index 000000000..6e62819a7 --- /dev/null +++ b/projects/app/src/service/dataset/auth.ts @@ -0,0 +1,22 @@ +import { isSpecialFileId } from '@fastgpt/core/dataset/utils'; +import { GridFSStorage } from '../lib/gridfs'; +import { Types } from 'mongoose'; + +export async function authFileIdValid(fileId?: string) { + if (!fileId) return true; + if (isSpecialFileId(fileId)) return true; + try { + // find file + const gridFs = new GridFSStorage('dataset', ''); + const collection = gridFs.Collection(); + const file = await collection.findOne( + { _id: new Types.ObjectId(fileId) }, + { projection: { _id: 1 } } + ); + if (!file) { + return Promise.reject('Invalid fileId'); + } + } catch (error) { + return Promise.reject('Invalid fileId'); + } +} diff --git a/projects/app/src/service/errorCode.ts b/projects/app/src/service/errorCode.ts index f631f4e7d..89da25b99 100644 --- a/projects/app/src/service/errorCode.ts +++ b/projects/app/src/service/errorCode.ts @@ -17,19 +17,6 @@ export const TOKEN_ERROR_CODE: Record = { 403: '登录状态无效,请重新登录' }; -export const openaiError: Record = { - context_length_exceeded: '内容超长了,请重置对话', - Unauthorized: 'API-KEY 不合法', - rate_limit_reached: 'API被限制,请稍后再试', - 'Bad Request': 'Bad Request~ 可能内容太多了', - 'Bad Gateway': '网关异常,请重试' -}; -export const openaiAccountError: Record = { - insufficient_quota: 'API 余额不足', - invalid_api_key: 'openai 账号异常', - account_deactivated: '账号已停用', - invalid_request_error: '无效请求' -}; export const proxyError: Record = { ECONNABORTED: true, ECONNRESET: true diff --git a/projects/app/src/service/events/generateQA.ts b/projects/app/src/service/events/generateQA.ts index 52317a9d0..6b6cad882 100644 --- a/projects/app/src/service/events/generateQA.ts +++ b/projects/app/src/service/events/generateQA.ts @@ -4,7 +4,7 @@ import { TrainingModeEnum } from '@/constants/plugin'; import { ERROR_ENUM } from '../errorCode'; import { sendInform } from '@/pages/api/user/inform/send'; import { authBalanceByUid } from '../utils/auth'; -import { axiosConfig, getAIChatApi } from '@fastgpt/core/ai/config'; +import { getAIApi } from '@fastgpt/core/ai/config'; import type { ChatCompletionRequestMessage } from '@fastgpt/core/ai/type'; import { addLog } from '../utils/tools'; import { splitText2Chunks } from '@/utils/file'; @@ -58,8 +58,6 @@ export async function generateQA(): Promise { const startTime = Date.now(); - const chatAPI = getAIChatApi(); - // request LLM to get QA const text = data.q; const messages: ChatCompletionRequestMessage[] = [ @@ -73,19 +71,13 @@ export async function generateQA(): Promise { }) } ]; - - const { data: chatResponse } = await chatAPI.createChatCompletion( - { - model: global.qaModel.model, - temperature: 0.01, - messages, - stream: false - }, - { - timeout: 480000, - ...axiosConfig() - } - ); + const ai = getAIApi(undefined, 480000); + const chatResponse = await ai.chat.completions.create({ + model: global.qaModel.model, + temperature: 0.01, + messages, + stream: false + }); const answer = chatResponse.choices?.[0].message?.content; const totalTokens = chatResponse.usage?.total_tokens || 0; diff --git a/projects/app/src/service/models/user.ts b/projects/app/src/service/models/user.ts index 64fb0b92b..da54e7796 100644 --- a/projects/app/src/service/models/user.ts +++ b/projects/app/src/service/models/user.ts @@ -23,7 +23,7 @@ const UserSchema = new Schema({ }, avatar: { type: String, - default: '/icon/human.png' + default: '/icon/human.svg' }, balance: { type: Number, diff --git a/projects/app/src/service/moduleDispatch/agent/classifyQuestion.ts b/projects/app/src/service/moduleDispatch/agent/classifyQuestion.ts index 7e2a0ebca..919d51452 100644 --- a/projects/app/src/service/moduleDispatch/agent/classifyQuestion.ts +++ b/projects/app/src/service/moduleDispatch/agent/classifyQuestion.ts @@ -2,7 +2,7 @@ import { adaptChat2GptMessages } from '@/utils/common/adapt/message'; import { ChatContextFilter } from '@/service/common/tiktoken'; import type { ChatHistoryItemResType, ChatItemType } from '@/types/chat'; import { ChatRoleEnum, TaskResponseKeyEnum } from '@/constants/chat'; -import { getAIChatApi, axiosConfig } from '@fastgpt/core/ai/config'; +import { getAIApi } from '@fastgpt/core/ai/config'; import type { ClassifyQuestionAgentItemType } from '@/types/app'; import { SystemInputEnum } from '@/constants/app'; import { SpecialInputKeyEnum } from '@/constants/flow'; @@ -105,27 +105,22 @@ async function functionCall({ required: ['type'] } }; - const chatAPI = getAIChatApi(user.openaiAccount); + const ai = getAIApi(user.openaiAccount); - const response = await chatAPI.createChatCompletion( - { - model: cqModel.model, - temperature: 0, - messages: [...adaptMessages], - function_call: { name: agentFunName }, - functions: [agentFunction] - }, - { - ...axiosConfig(user.openaiAccount) - } - ); + const response = await ai.chat.completions.create({ + model: cqModel.model, + temperature: 0, + messages: [...adaptMessages], + function_call: { name: agentFunName }, + functions: [agentFunction] + }); try { - const arg = JSON.parse(response.data.choices?.[0]?.message?.function_call?.arguments || ''); + const arg = JSON.parse(response.choices?.[0]?.message?.function_call?.arguments || ''); return { arg, - tokens: response.data.usage?.total_tokens || 0 + tokens: response.usage?.total_tokens || 0 }; } catch (error) { console.log('Your model may not support function_call'); @@ -155,20 +150,14 @@ Human:${userChatInput}` } ]; - const chatAPI = getAIChatApi(user.openaiAccount); + const ai = getAIApi(user.openaiAccount, 480000); - const { data } = await chatAPI.createChatCompletion( - { - model: extractModel.model, - temperature: 0.01, - messages: adaptChat2GptMessages({ messages, reserveId: false }), - stream: false - }, - { - timeout: 480000, - ...axiosConfig(user.openaiAccount) - } - ); + const data = await ai.chat.completions.create({ + model: extractModel.model, + temperature: 0.01, + messages: adaptChat2GptMessages({ messages, reserveId: false }), + stream: false + }); const answer = data.choices?.[0].message?.content || ''; const totalTokens = data.usage?.total_tokens || 0; diff --git a/projects/app/src/service/moduleDispatch/agent/extract.ts b/projects/app/src/service/moduleDispatch/agent/extract.ts index 06ad86026..40044488a 100644 --- a/projects/app/src/service/moduleDispatch/agent/extract.ts +++ b/projects/app/src/service/moduleDispatch/agent/extract.ts @@ -2,7 +2,7 @@ import { adaptChat2GptMessages } from '@/utils/common/adapt/message'; import { ChatContextFilter } from '@/service/common/tiktoken'; import type { ChatHistoryItemResType, ChatItemType } from '@/types/chat'; import { ChatRoleEnum, TaskResponseKeyEnum } from '@/constants/chat'; -import { getAIChatApi, axiosConfig } from '@fastgpt/core/ai/config'; +import { getAIApi } from '@fastgpt/core/ai/config'; import type { ContextExtractAgentItemType } from '@/types/app'; import { ContextExtractEnum } from '@/constants/flow/flowField'; import { FlowModuleTypeEnum } from '@/constants/flow'; @@ -126,30 +126,25 @@ async function functionCall({ } }; - const chatAPI = getAIChatApi(user.openaiAccount); + const ai = getAIApi(user.openaiAccount); - const response = await chatAPI.createChatCompletion( - { - model: extractModel.model, - temperature: 0, - messages: [...adaptMessages], - function_call: { name: agentFunName }, - functions: [agentFunction] - }, - { - ...axiosConfig(user.openaiAccount) - } - ); + const response = await ai.chat.completions.create({ + model: extractModel.model, + temperature: 0, + messages: [...adaptMessages], + function_call: { name: agentFunName }, + functions: [agentFunction] + }); const arg: Record = (() => { try { - return JSON.parse(response.data.choices?.[0]?.message?.function_call?.arguments || '{}'); + return JSON.parse(response.choices?.[0]?.message?.function_call?.arguments || '{}'); } catch (error) { return {}; } })(); - const tokens = response.data.usage?.total_tokens || 0; + const tokens = response.usage?.total_tokens || 0; return { tokens, arg @@ -181,20 +176,14 @@ Human: ${content}` } ]; - const chatAPI = getAIChatApi(user.openaiAccount); + const ai = getAIApi(user.openaiAccount, 480000); - const { data } = await chatAPI.createChatCompletion( - { - model: extractModel.model, - temperature: 0.01, - messages: adaptChat2GptMessages({ messages, reserveId: false }), - stream: false - }, - { - timeout: 480000, - ...axiosConfig(user.openaiAccount) - } - ); + const data = await ai.chat.completions.create({ + model: extractModel.model, + temperature: 0.01, + messages: adaptChat2GptMessages({ messages, reserveId: false }), + stream: false + }); const answer = data.choices?.[0].message?.content || ''; const totalTokens = data.usage?.total_tokens || 0; diff --git a/projects/app/src/service/moduleDispatch/chat/oneapi.ts b/projects/app/src/service/moduleDispatch/chat/oneapi.ts index 50e0d8c22..75ec9aff6 100644 --- a/projects/app/src/service/moduleDispatch/chat/oneapi.ts +++ b/projects/app/src/service/moduleDispatch/chat/oneapi.ts @@ -3,9 +3,9 @@ import { ChatContextFilter } from '@/service/common/tiktoken'; import type { ChatItemType, QuoteItemType } from '@/types/chat'; import type { ChatHistoryItemResType } from '@/types/chat'; import { ChatRoleEnum, sseResponseEventEnum } from '@/constants/chat'; -import { SSEParseData, parseStreamChunk } from '@/utils/sse'; import { textAdaptGptResponse } from '@/utils/adapt'; -import { getAIChatApi, axiosConfig } from '@fastgpt/core/ai/config'; +import { getAIApi } from '@fastgpt/core/ai/config'; +import type { ChatCompletion, StreamChatType } from '@fastgpt/core/ai/type'; import { TaskResponseKeyEnum } from '@/constants/chat'; import { getChatModel } from '@/service/utils/data'; import { countModelPrice } from '@/service/common/bill/push'; @@ -20,9 +20,7 @@ import type { AIChatProps } from '@/types/core/aiChat'; import { replaceVariable } from '@/utils/common/tools/text'; import { FlowModuleTypeEnum } from '@/constants/flow'; import type { ModuleDispatchProps } from '@/types/core/chat/type'; -import { Readable } from 'stream'; import { responseWrite, responseWriteController } from '@/service/common/stream'; -import { addLog } from '@/service/utils/tools'; export type ChatProps = ModuleDispatchProps< AIChatProps & { @@ -106,32 +104,25 @@ export const dispatchChatCompletion = async (props: ChatProps): Promise { if (stream) { @@ -139,7 +130,7 @@ export const dispatchChatCompletion = async (props: ChatProps): Promise((resolve, reject) => { - const stream = response.data as Readable; - let answer = ''; - const parseData = new SSEParseData(); - - const write = responseWriteController({ - res, - readStream: stream - }); - - stream.on('data', (data) => { - if (res.closed) { - stream.destroy(); - return resolve({ answer }); - } - - const parse = parseStreamChunk(data); - parse.forEach((item) => { - const { data } = parseData.parse(item); - if (!data || data === '[DONE]') return; - - const content: string = data?.choices?.[0]?.delta?.content || ''; - if (data.error) { - addLog.error(`SSE response`, data.error); - } else { - answer += content; - - responseWrite({ - write, - event: detail ? sseResponseEventEnum.answer : undefined, - data: textAdaptGptResponse({ - text: content - }) - }); - } - }); - }); - stream.on('end', () => { - resolve({ answer }); - }); - stream.on('close', () => { - resolve({ answer }); - }); - stream.on('error', (err) => { - reject(err); - }); + const write = responseWriteController({ + res, + readStream: stream }); + let answer = ''; + + for await (const part of stream) { + if (res.closed) { + stream.controller?.abort(); + break; + } + const content = part.choices[0]?.delta?.content || ''; + answer += content; + + responseWrite({ + write, + event: detail ? sseResponseEventEnum.answer : undefined, + data: textAdaptGptResponse({ + text: content + }) + }); + } + + if (!answer) { + return Promise.reject('Chat API is error or undefined'); + } + + return { answer }; } function getHistoryPreview(completeMessages: ChatItemType[]) { diff --git a/projects/app/src/service/moduleDispatch/kb/search.ts b/projects/app/src/service/moduleDispatch/kb/search.ts index adf336ca4..bdcec1d62 100644 --- a/projects/app/src/service/moduleDispatch/kb/search.ts +++ b/projects/app/src/service/moduleDispatch/kb/search.ts @@ -46,7 +46,9 @@ export async function dispatchKBSearch(props: Record): Promise '[${ + vectors[0] + }]') * -1 AS score from ${PgDatasetTableName} where kb_id IN (${kbList .map((item) => `'${item.kbId}'`) .join(',')}) AND vector <#> '[${vectors[0]}]' < -${similarity} order by vector <#> '[${ vectors[0] diff --git a/projects/app/src/service/pg.ts b/projects/app/src/service/pg.ts index fe40fd35f..a6eb33fda 100644 --- a/projects/app/src/service/pg.ts +++ b/projects/app/src/service/pg.ts @@ -3,6 +3,7 @@ import type { QueryResultRow } from 'pg'; import { PgDatasetTableName } from '@/constants/plugin'; import { addLog } from './utils/tools'; import type { DatasetDataItemType } from '@/types/core/dataset/data'; +import { DatasetSpecialIdEnum, datasetSpecialIdMap } from '@fastgpt/core/dataset/constant'; export const connectPg = async (): Promise => { if (global.pgClient) { @@ -179,8 +180,13 @@ export const insertData2Dataset = ({ values: data.map((item) => [ { key: 'user_id', value: userId }, { key: 'kb_id', value: kbId }, - { key: 'source', value: item.source?.slice(0, 200)?.trim() || '' }, - { key: 'file_id', value: item.file_id?.slice(0, 200)?.trim() || '' }, + { + key: 'source', + value: + item.source?.slice(0, 200)?.trim() || + datasetSpecialIdMap[DatasetSpecialIdEnum.manual].sourceName + }, + { key: 'file_id', value: item.file_id?.slice(0, 200)?.trim() || DatasetSpecialIdEnum.manual }, { key: 'q', value: item.q.replace(/'/g, '"') }, { key: 'a', value: item.a.replace(/'/g, '"') }, { key: 'vector', value: `[${item.vector}]` } @@ -188,6 +194,25 @@ export const insertData2Dataset = ({ }); }; +/** + * Update data file_id + */ +export const updateDataFileId = async ({ + oldFileId, + userId, + newFileId = DatasetSpecialIdEnum.manual +}: { + oldFileId: string; + userId: string; + newFileId?: string; +}) => { + await PgClient.update(PgDatasetTableName, { + where: [['file_id', oldFileId], 'AND', ['user_id', userId]], + values: [{ key: 'file_id', value: newFileId }] + }); + return newFileId; +}; + export async function initPg() { try { await connectPg(); @@ -203,10 +228,6 @@ export async function initPg() { q TEXT NOT NULL, a TEXT ); - CREATE INDEX IF NOT EXISTS modelData_userId_index ON ${PgDatasetTableName} USING HASH (user_id); - CREATE INDEX IF NOT EXISTS modelData_kb_id_index ON ${PgDatasetTableName} (kb_id); - CREATE INDEX IF NOT EXISTS modelData_fileId_index ON ${PgDatasetTableName} (file_id); - CREATE INDEX IF NOT EXISTS idx_model_data_md5_q_a_user_id_kb_id ON ${PgDatasetTableName} (md5(q), md5(a), user_id, kb_id); `); console.log('init pg successful'); } catch (error) { diff --git a/projects/app/src/service/response.ts b/projects/app/src/service/response.ts index 7b4d20c63..bfe5c3d94 100644 --- a/projects/app/src/service/response.ts +++ b/projects/app/src/service/response.ts @@ -1,12 +1,6 @@ import { sseResponseEventEnum } from '@/constants/chat'; import { NextApiResponse } from 'next'; -import { - openaiError, - openaiAccountError, - proxyError, - ERROR_RESPONSE, - ERROR_ENUM -} from './errorCode'; +import { proxyError, ERROR_RESPONSE, ERROR_ENUM } from './errorCode'; import { clearCookie, sseResponse, addLog } from './utils/tools'; export interface ResponseType { @@ -47,10 +41,8 @@ export const jsonRes = ( msg = '网络连接异常'; } else if (error?.response?.data?.error?.message) { msg = error?.response?.data?.error?.message; - } else if (openaiAccountError[error?.response?.data?.error?.code]) { - msg = openaiAccountError[error?.response?.data?.error?.code]; - } else if (openaiError[error?.response?.statusText]) { - msg = openaiError[error.response.statusText]; + } else if (error?.error?.message) { + msg = error?.error?.message; } addLog.error(`response error: ${msg}`, error); @@ -88,10 +80,8 @@ export const sseErrRes = (res: NextApiResponse, error: any) => { msg = '网络连接异常'; } else if (error?.response?.data?.error?.message) { msg = error?.response?.data?.error?.message; - } else if (openaiAccountError[error?.response?.data?.error?.code]) { - msg = openaiAccountError[error?.response?.data?.error?.code]; - } else if (openaiError[error?.response?.statusText]) { - msg = openaiError[error.response.statusText]; + } else if (error?.error?.message) { + msg = error?.error?.message; } addLog.error(`sse error: ${msg}`, error); diff --git a/projects/app/src/types/app.d.ts b/projects/app/src/types/app.d.ts index d29c23d3f..dbb752e3f 100644 --- a/projects/app/src/types/app.d.ts +++ b/projects/app/src/types/app.d.ts @@ -22,12 +22,17 @@ export type AppListItemType = { intro: string; }; +export type CreateAppParams = { + name?: string; + avatar?: string; + type?: `${AppTypeEnum}`; + modules: AppSchema['modules']; +}; export interface AppUpdateParams { name?: string; type?: `${AppTypeEnum}`; avatar?: string; intro?: string; - chat?: AppSchema['chat']; share?: AppSchema['share']; modules?: AppSchema['modules']; } diff --git a/projects/app/src/types/chat.d.ts b/projects/app/src/types/chat.d.ts index 5d1e3f89f..2b8e51387 100644 --- a/projects/app/src/types/chat.d.ts +++ b/projects/app/src/types/chat.d.ts @@ -45,6 +45,7 @@ export type ShareChatType = InitShareChatResponse & { export type QuoteItemType = PgDataItemType & { kb_id: string; + score?: number; }; // response data diff --git a/projects/app/src/types/core/chat/type.d.ts b/projects/app/src/types/core/chat/type.d.ts index 5f1e702ef..4c98e2031 100644 --- a/projects/app/src/types/core/chat/type.d.ts +++ b/projects/app/src/types/core/chat/type.d.ts @@ -3,7 +3,7 @@ import type { NextApiResponse } from 'next'; import { RunningModuleItemType } from '@/types/app'; import { UserModelSchema } from '@/types/mongoSchema'; -export type MessageItemType = ChatCompletionRequestMessage & { dataId?: string }; +export type MessageItemType = ChatCompletionRequestMessage & { dataId?: string; content: string }; // module dispatch props type export type ModuleDispatchProps = { diff --git a/projects/app/src/types/index.d.ts b/projects/app/src/types/index.d.ts index 66008d469..594b09da8 100644 --- a/projects/app/src/types/index.d.ts +++ b/projects/app/src/types/index.d.ts @@ -29,6 +29,7 @@ export type FeConfigsType = { show_pay?: boolean; show_openai_account?: boolean; show_promotion?: boolean; + hide_app_flow?: boolean; openAPIUrl?: string; systemTitle?: string; authorText?: string; diff --git a/projects/app/src/utils/adapt.ts b/projects/app/src/utils/adapt.ts index 433424918..2bb16e7f1 100644 --- a/projects/app/src/utils/adapt.ts +++ b/projects/app/src/utils/adapt.ts @@ -25,7 +25,7 @@ export const adaptBill = (bill: BillSchema): UserBillType => { }; export const gptMessage2ChatType = (messages: MessageItemType[]): ChatItemType[] => { - const roleMap: Record<`${ChatCompletionRequestMessageRoleEnum}`, `${ChatRoleEnum}`> = { + const roleMap = { [ChatCompletionRequestMessageRoleEnum.Assistant]: ChatRoleEnum.AI, [ChatCompletionRequestMessageRoleEnum.User]: ChatRoleEnum.Human, [ChatCompletionRequestMessageRoleEnum.System]: ChatRoleEnum.System, diff --git a/projects/app/src/utils/common/tools/text.ts b/projects/app/src/utils/common/tools/text.ts index 2f329a621..3d7c6630f 100644 --- a/projects/app/src/utils/common/tools/text.ts +++ b/projects/app/src/utils/common/tools/text.ts @@ -1,7 +1,7 @@ /* replace {{variable}} to value */ -export function replaceVariable(text: string, obj: Record) { +export function replaceVariable(text: string, obj: Record) { for (const key in obj) { const val = obj[key]; if (typeof val !== 'string') continue; diff --git a/projects/app/src/utils/file.ts b/projects/app/src/utils/file.ts index f6139e800..8b72add79 100644 --- a/projects/app/src/utils/file.ts +++ b/projects/app/src/utils/file.ts @@ -11,7 +11,14 @@ export const splitText2Chunks = ({ text, maxLen }: { text: string; maxLen: numbe const overlapLen = Math.floor(maxLen * 0.25); // Overlap length try { - const splitTexts = text.split(/(?<=[。!?;.!?;\n])/g); + const tempMarker = 'SPLIT_HERE'; + text = text.replace(/\n{3,}/g, '\n'); + text = text.replace(/\s/g, ' '); + text = text.replace('\n\n', ''); + const splitTexts = text + .replace(/([。!?;]|\.\s|!\s|\?\s|;\s|\n)/g, `$1${tempMarker}`) + .split(tempMarker) + .filter((part) => part); const chunks: string[] = []; let preChunk = ''; diff --git a/projects/app/src/utils/web/core/dataset.ts b/projects/app/src/utils/web/core/dataset.ts index 16f936632..727c69738 100644 --- a/projects/app/src/utils/web/core/dataset.ts +++ b/projects/app/src/utils/web/core/dataset.ts @@ -9,7 +9,7 @@ export async function chunksUpload({ mode, chunks, prompt, - rate = 50, + rate = 150, onUploading }: { kbId: string;