From 1fbc407ecf87c2478b869243b850ed1e1a0d00e7 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Mon, 8 Apr 2024 21:17:33 +0800 Subject: [PATCH] 4.7.1-alpha2 (#1153) Co-authored-by: UUUUnotfound <31206589+UUUUnotfound@users.noreply.github.com> Co-authored-by: Hexiao Zhang <731931282qq@gmail.com> Co-authored-by: heheer <71265218+newfish-cmyk@users.noreply.github.com> --- ...s-image.yml => docs-deploy-kubeconfig.yml} | 6 +- ...docs-deploy.yml => docs-deploy-vercel.yml} | 4 +- .github/workflows/docs-preview.yml | 4 +- .github/workflows/helm-release.yaml | 2 +- README.md | 2 +- README_en.md | 2 +- README_ja.md | 2 +- docSite/assets/imgs/laf1.webp | Bin 0 -> 47302 bytes docSite/assets/imgs/laf2.webp | Bin 0 -> 20778 bytes docSite/assets/imgs/laf3.webp | Bin 0 -> 59116 bytes docSite/assets/imgs/laf4.webp | Bin 0 -> 24196 bytes docSite/assets/imgs/rerank1.png | Bin 0 -> 93453 bytes .../content/docs/development/configuration.md | 2 +- .../development/custom-models/bge-rerank.md | 121 +++++ .../development/custom-models/reranker.md | 90 ---- docSite/content/docs/development/docker.md | 2 +- docSite/content/docs/development/one-api.md | 2 +- docSite/content/docs/development/sealos.md | 2 +- .../content/docs/development/upgrading/47.md | 4 +- .../content/docs/development/upgrading/471.md | 18 +- docSite/content/docs/workflow/modules/laf.md | 88 ++++ .../partials/docs/footer/footer-scripts.html | 2 +- docSite/layouts/partials/docs/head.html | 6 +- docSite/static/js/jsdelivr-auto-fallback.js | 2 +- packages/global/common/system/api.d.ts | 1 + packages/global/core/app/api.d.ts | 2 +- packages/global/core/app/constants.ts | 8 + packages/global/core/app/type.d.ts | 34 +- packages/global/core/app/utils.ts | 13 +- packages/global/core/chat/type.d.ts | 2 +- packages/global/core/module/constants.ts | 1 + packages/global/core/module/type.d.ts | 18 - packages/global/core/module/utils.ts | 11 +- .../global/core/plugin/httpPlugin/type.d.ts | 1 + .../global/core/plugin/httpPlugin/utils.ts | 3 +- packages/web/common/system/utils.ts | 4 + .../web/components/common/Icon/constants.ts | 4 +- .../icons/core/app/simpleMode/whisper.svg | 6 + .../{stopSpeechFill.svg => cancelSpeak.svg} | 2 +- .../Icon/icons/core/chat/finishSpeak.svg | 6 + packages/web/styles/theme.ts | 2 +- projects/app/package.json | 2 +- projects/app/public/docs/versionIntro.md | 19 +- projects/app/public/locales/en/common.json | 18 + projects/app/public/locales/zh/common.json | 22 +- .../src/components/ChatBox/MessageInput.tsx | 122 +++-- .../app/src/components/ChatBox/Provider.tsx | 176 +++++++ .../ChatBox/components/ChatController.tsx | 144 +++--- .../ChatBox/components/ChatItem.tsx | 9 +- .../ChatBox/components/VariableInput.tsx | 2 +- .../app/src/components/ChatBox/constants.ts | 6 + projects/app/src/components/ChatBox/index.tsx | 100 ++-- .../core/ai/SettingLLMModel/index.tsx | 2 +- .../components/modules => app}/QGSwitch.tsx | 0 .../components/modules => app}/TTSSelect.tsx | 12 +- .../modules => app}/VariableEdit.tsx | 2 +- .../src/components/core/app/WhisperConfig.tsx | 116 +++++ .../components/core/module/Flow/ChatTest.tsx | 1 + .../module/Flow/components/nodes/NodeLaf.tsx | 150 ++++-- .../Flow/components/nodes/NodeUserGuide.tsx | 8 +- projects/app/src/global/core/chat/api.d.ts | 2 +- .../src/pages/api/core/chat/item/getSpeech.ts | 5 +- .../src/pages/api/v1/audio/transcriptions.ts | 19 +- .../src/pages/app/detail/components/Logs.tsx | 2 + .../detail/components/SimpleEdit/ChatTest.tsx | 1 + .../detail/components/SimpleEdit/EditForm.tsx | 50 +- projects/app/src/pages/chat/index.tsx | 1 + projects/app/src/pages/chat/share.tsx | 2 + projects/app/src/pages/chat/team.tsx | 1 + .../app/src/web/common/hooks/useSpeech.ts | 88 ++-- projects/app/src/web/common/utils/voice.ts | 487 +++++++++++------- projects/app/src/web/core/app/utils.ts | 8 +- python/bge-rerank/README.md | 114 ++++ .../bge-reranker-base/Dockerfile | 0 .../bge-reranker-base/app.py | 52 +- .../bge-reranker-base/requirements.txt | 2 +- .../bge-rerank/bge-reranker-large/Dockerfile | 12 + python/bge-rerank/bge-reranker-large/app.py | 88 ++++ .../bge-reranker-large/requirements.txt | 7 + .../bge-rerank/bge-reranker-v2-m3/Dockerfile | 12 + python/bge-rerank/bge-reranker-v2-m3/app.py | 88 ++++ .../bge-reranker-v2-m3/requirements.txt | 7 + python/bge-rerank/rerank1.png | Bin 0 -> 93453 bytes python/reranker/bge-reranker-base/README.md | 48 -- 84 files changed, 1772 insertions(+), 714 deletions(-) rename .github/workflows/{docs-image.yml => docs-deploy-kubeconfig.yml} (95%) rename .github/workflows/{docs-deploy.yml => docs-deploy-vercel.yml} (92%) create mode 100644 docSite/assets/imgs/laf1.webp create mode 100644 docSite/assets/imgs/laf2.webp create mode 100644 docSite/assets/imgs/laf3.webp create mode 100644 docSite/assets/imgs/laf4.webp create mode 100644 docSite/assets/imgs/rerank1.png create mode 100644 docSite/content/docs/development/custom-models/bge-rerank.md delete mode 100644 docSite/content/docs/development/custom-models/reranker.md create mode 100644 docSite/content/docs/workflow/modules/laf.md create mode 100644 packages/global/common/system/api.d.ts create mode 100644 packages/web/components/common/Icon/icons/core/app/simpleMode/whisper.svg rename packages/web/components/common/Icon/icons/core/chat/{stopSpeechFill.svg => cancelSpeak.svg} (97%) create mode 100644 packages/web/components/common/Icon/icons/core/chat/finishSpeak.svg create mode 100644 projects/app/src/components/ChatBox/Provider.tsx rename projects/app/src/components/core/{module/Flow/components/modules => app}/QGSwitch.tsx (100%) rename projects/app/src/components/core/{module/Flow/components/modules => app}/TTSSelect.tsx (94%) rename projects/app/src/components/core/{module/Flow/components/modules => app}/VariableEdit.tsx (99%) create mode 100644 projects/app/src/components/core/app/WhisperConfig.tsx create mode 100644 python/bge-rerank/README.md rename python/{reranker => bge-rerank}/bge-reranker-base/Dockerfile (100%) rename python/{reranker => bge-rerank}/bge-reranker-base/app.py (69%) rename python/{reranker => bge-rerank}/bge-reranker-base/requirements.txt (82%) create mode 100644 python/bge-rerank/bge-reranker-large/Dockerfile create mode 100644 python/bge-rerank/bge-reranker-large/app.py create mode 100644 python/bge-rerank/bge-reranker-large/requirements.txt create mode 100644 python/bge-rerank/bge-reranker-v2-m3/Dockerfile create mode 100644 python/bge-rerank/bge-reranker-v2-m3/app.py create mode 100644 python/bge-rerank/bge-reranker-v2-m3/requirements.txt create mode 100644 python/bge-rerank/rerank1.png delete mode 100644 python/reranker/bge-reranker-base/README.md diff --git a/.github/workflows/docs-image.yml b/.github/workflows/docs-deploy-kubeconfig.yml similarity index 95% rename from .github/workflows/docs-image.yml rename to .github/workflows/docs-deploy-kubeconfig.yml index 4f261422658f..e38d53485f27 100644 --- a/.github/workflows/docs-image.yml +++ b/.github/workflows/docs-deploy-kubeconfig.yml @@ -1,4 +1,4 @@ -name: Build docs images and copy image to docker hub +name: Deploy image by kubeconfig on: workflow_dispatch: push: @@ -68,7 +68,7 @@ jobs: tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} outputs: - tags: ${{ steps.datetime.outputs.datetime }} + tags: ${{ steps.datetime.outputs.datetime }} update-docs-image: needs: build-fastgpt-docs-images runs-on: ubuntu-20.04 @@ -85,4 +85,4 @@ jobs: env: KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }} with: - args: annotate deployment/fastgpt-docs originImageName="registry.cn-hangzhou.aliyuncs.com/${{ secrets.ALI_HUB_USERNAME }}/fastgpt-docs:${{ needs.build-fastgpt-docs-images.outputs.tags }}" --overwrite \ No newline at end of file + args: annotate deployment/fastgpt-docs originImageName="registry.cn-hangzhou.aliyuncs.com/${{ secrets.ALI_HUB_USERNAME }}/fastgpt-docs:${{ needs.build-fastgpt-docs-images.outputs.tags }}" --overwrite diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy-vercel.yml similarity index 92% rename from .github/workflows/docs-deploy.yml rename to .github/workflows/docs-deploy-vercel.yml index b306ef57000d..cb65363c5e8a 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy-vercel.yml @@ -1,4 +1,4 @@ -name: deploy-docs +name: Deploy image to vercel on: workflow_dispatch: @@ -47,7 +47,7 @@ jobs: - name: Add cdn for images run: | - sed -i "s#\](/imgs/#\](https://cdn.jsdelivr.us/gh/yangchuansheng/fastgpt-imgs@main/imgs/#g" $(grep -rl "\](/imgs/" docSite/content/docs) + sed -i "s#\](/imgs/#\](https://cdn.jsdelivr.net/gh/yangchuansheng/fastgpt-imgs@main/imgs/#g" $(grep -rl "\](/imgs/" docSite/content/docs) # Step 3 - Install Hugo (specific version) - name: Install Hugo diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml index bb951648322c..abdc7037b2a3 100644 --- a/.github/workflows/docs-preview.yml +++ b/.github/workflows/docs-preview.yml @@ -1,4 +1,4 @@ -name: preview-docs +name: Preview FastGPT docs on: pull_request_target: @@ -47,7 +47,7 @@ jobs: - name: Add cdn for images run: | - sed -i "s#\](/imgs/#\](https://cdn.jsdelivr.us/gh/yangchuansheng/fastgpt-imgs@main/imgs/#g" $(grep -rl "\](/imgs/" docSite/content/docs) + sed -i "s#\](/imgs/#\](https://cdn.jsdelivr.net/gh/yangchuansheng/fastgpt-imgs@main/imgs/#g" $(grep -rl "\](/imgs/" docSite/content/docs) # Step 3 - Install Hugo (specific version) - name: Install Hugo diff --git a/.github/workflows/helm-release.yaml b/.github/workflows/helm-release.yaml index 434dac9a8dad..4e01873dc77a 100644 --- a/.github/workflows/helm-release.yaml +++ b/.github/workflows/helm-release.yaml @@ -1,4 +1,4 @@ -name: Release +name: Release helm chart on: push: diff --git a/README.md b/README.md index 3be481b19d05..e74fe91f78e1 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ fastgpt.run 域名会弃用。 > [Sealos](https://sealos.io) 的服务器在国外,不需要额外处理网络问题,无需服务器、无需魔法、无需域名,支持高并发 & 动态伸缩。点击以下按钮即可一键部署 👇 - [![](https://cdn.jsdelivr.us/gh/labring-actions/templates@main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt) + [![](https://cdn.jsdelivr.net/gh/labring-actions/templates@main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt) 由于需要部署数据库,部署完后需要等待 2~4 分钟才能正常访问。默认用了最低配置,首次访问时会有些慢。相关使用教程可查看:[Sealos 部署 FastGPT](https://doc.fastgpt.in/docs/development/sealos/) diff --git a/README_en.md b/README_en.md index 29bdf0b9a4e3..a389bd1d3672 100644 --- a/README_en.md +++ b/README_en.md @@ -106,7 +106,7 @@ Project tech stack: NextJs + TS + ChakraUI + Mongo + Postgres (Vector plugin) - **⚡ Deployment** - [![](https://cdn.jsdelivr.us/gh/labring-actions/templates@main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt) + [![](https://cdn.jsdelivr.net/gh/labring-actions/templates@main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt) Give it a 2-4 minute wait after deployment as it sets up the database. Initially, it might be a tad slow since we're using the basic settings. diff --git a/README_ja.md b/README_ja.md index ce7c597c2949..a9f4b619251c 100644 --- a/README_ja.md +++ b/README_ja.md @@ -94,7 +94,7 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b - **⚡ デプロイ** - [![](https://cdn.jsdelivr.us/gh/labring-actions/templates@main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt) + [![](https://cdn.jsdelivr.net/gh/labring-actions/templates@main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt) デプロイ 後、データベースをセットアップするので、2~4分待 ってください。基本設定 を 使 っているので、最初 は 少 し 遅 いかもしれません。 diff --git a/docSite/assets/imgs/laf1.webp b/docSite/assets/imgs/laf1.webp new file mode 100644 index 0000000000000000000000000000000000000000..6c9904c390ff47623fccfb19e06cdb9e7279b10f GIT binary patch literal 47302 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 z000000000000000H8S-C literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/laf2.webp b/docSite/assets/imgs/laf2.webp new file mode 100644 index 0000000000000000000000000000000000000000..4090439712af45c4a439f81dfc30417120ffcc5e GIT binary patch literal 20778 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 literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/laf3.webp b/docSite/assets/imgs/laf3.webp new file mode 100644 index 0000000000000000000000000000000000000000..9edce0eab921f6fc9648d1e40a13286a4d13e951 GIT binary patch literal 59116 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%0DX|htLGa?as7LjlqUAG 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 bH16Qv=Kh6J_J1$`li+nE^xgj#1_1sG+$}|| literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/laf4.webp b/docSite/assets/imgs/laf4.webp new file mode 100644 index 0000000000000000000000000000000000000000..0aae869a18f6c2063b2ad59c10fbf17567987f01 GIT binary patch literal 24196 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 B>^}ei literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/rerank1.png b/docSite/assets/imgs/rerank1.png new file mode 100644 index 0000000000000000000000000000000000000000..ab26e2cfadecb7673062910a9506ad20ce2c024f GIT binary patch literal 93453 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
  • QBa=ZjjHXEK;kh&n~f&9$gva!;)=05;c<` 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 KOAcZ$=KcdUy|N(y literal 0 HcmV?d00001 diff --git a/docSite/content/docs/development/configuration.md b/docSite/content/docs/development/configuration.md index 8a94c9e0971b..88604cd3d48c 100644 --- a/docSite/content/docs/development/configuration.md +++ b/docSite/content/docs/development/configuration.md @@ -156,7 +156,7 @@ llm模型全部合并 请使用 4.6.6-alpha 以上版本,配置文件中的 `reRankModels` 为重排模型,虽然是数组,不过目前仅有第1个生效。 -1. [部署 ReRank 模型](/docs/development/custom-models/reranker/) +1. [部署 ReRank 模型](/docs/development/custom-models/bge-rerank/) 1. 找到 FastGPT 的配置文件中的 `reRankModels`, 4.6.6 以前是 `ReRankModels`。 2. 修改对应的值:(记得去掉注释) diff --git a/docSite/content/docs/development/custom-models/bge-rerank.md b/docSite/content/docs/development/custom-models/bge-rerank.md new file mode 100644 index 000000000000..bc09bd3e7a84 --- /dev/null +++ b/docSite/content/docs/development/custom-models/bge-rerank.md @@ -0,0 +1,121 @@ +--- +title: '接入 bge-rerank 重排模型' +description: '接入 bge-rerank 重排模型' +icon: 'sort' +draft: false +toc: true +weight: 910 +--- + +## 不同模型推荐配置 + +推荐配置如下: + +{{< table "table-hover table-striped-columns" >}} +| 模型名 | 内存 | 显存 | 硬盘空间 | 启动命令 | +|------|---------|---------|----------|--------------------------| +| bge-rerank-base | >=4GB | >=4GB | >=8GB | python app.py | +| bge-rerank-large | >=8GB | >=8GB | >=8GB | python app.py | +| bge-rerank-v2-m3 | >=8GB | >=8GB | >=8GB | python app.py | +{{< /table >}} + +## 源码部署 + +### 1. 安装环境 + +- Python 3.9, 3.10 +- CUDA 11.7 +- 科学上网环境 + +### 2. 下载代码 + +3 个模型代码分别为: + +1. [https://github.com/labring/FastGPT/tree/main/python/reranker/bge-reranker-base](https://github.com/labring/FastGPT/tree/main/python/reranker/bge-reranker-base) +2. [https://github.com/labring/FastGPT/tree/main/python/reranker/bge-reranker-large](https://github.com/labring/FastGPT/tree/main/python/reranker/bge-reranker-large) +3. [https://github.com/labring/FastGPT/tree/main/python/reranker/bge-rerank-v2-m3](https://github.com/labring/FastGPT/tree/main/python/reranker/bge-rerank-v2-m3) + +### 3. 安装依赖 + +```sh +pip install -r requirements.txt +``` + +### 4. 下载模型 + +3个模型的 huggingface 仓库地址如下: + +1. [https://huggingface.co/BAAI/bge-reranker-base](https://huggingface.co/BAAI/bge-reranker-base) +2. [https://huggingface.co/BAAI/bge-reranker-large](https://huggingface.co/BAAI/bge-reranker-large) +3. [https://huggingface.co/BAAI/bge-rerank-v2-m3](https://huggingface.co/BAAI/bge-rerank-v2-m3) + +在对应代码目录下 clone 模型。目录结构: + +``` +bge-reranker-base/ +app.py +Dockerfile +requirements.txt +``` + +### 5. 运行代码 + +```bash +python app.py +``` + +启动成功后应该会显示如下地址: + +![](/imgs/rerank1.png) + +> 这里的 `http://0.0.0.0:6006` 就是连接地址。 + +## docker 部署 + +**镜像名分别为:** + +1. registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1 (4 GB+) +2. registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-large:v0.1 (5 GB+) +3. registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-v2-m3:v0.1 (5 GB+) + +**端口** + +6006 + +**环境变量** + +``` +ACCESS_TOKEN=访问安全凭证,请求时,Authorization: Bearer ${ACCESS_TOKEN} +``` + +**运行命令示例** + +```sh +# auth token 为mytoken +docker run -d --name reranker -p 6006:6006 -e ACCESS_TOKEN=mytoken --gpus all registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1 +``` + +**docker-compose.yml示例** +``` +version: "3" +services: + reranker: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/rerank:v0.2 + container_name: reranker + # GPU运行环境,如果宿主机未安装,将deploy配置隐藏即可 + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + ports: + - 6006:6006 + environment: + - ACCESS_TOKEN=mytoken + +``` +## 接入 FastGPT + +参考 [ReRank模型接入](/docs/development/configuration/#rerank-接入),host 变量为部署的域名。 diff --git a/docSite/content/docs/development/custom-models/reranker.md b/docSite/content/docs/development/custom-models/reranker.md deleted file mode 100644 index 06d40923f614..000000000000 --- a/docSite/content/docs/development/custom-models/reranker.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: '接入 ReRank 重排模型' -description: '接入 ReRank 重排模型' -icon: 'sort' -draft: false -toc: true -weight: 910 ---- - -## 推荐配置 - -推荐配置如下: - -{{< table "table-hover table-striped-columns" >}} -| 类型 | 内存 | 显存 | 硬盘空间 | 启动命令 | -|------|---------|---------|----------|--------------------------| -| base | >=4GB | >=3GB | >=8GB | python app.py | -{{< /table >}} - -## 部署 - -### 环境要求 - -- Python 3.10.11 -- CUDA 11.7 -- 科学上网环境 - -### 源码部署 - -1. 根据上面的环境配置配置好环境,具体教程自行 GPT; -2. 下载 [python 文件](https://github.com/labring/FastGPT/tree/main/python/reranker/bge-reranker-base) -3. 在命令行输入命令 `pip install -r requirements.txt`; -4. 按照[https://huggingface.co/BAAI/bge-reranker-base](https://huggingface.co/BAAI/bge-reranker-base)下载模型仓库到app.py同级目录 -5. 添加环境变量 `export ACCESS_TOKEN=XXXXXX` 配置 token,这里的 token 只是加一层验证,防止接口被人盗用,默认值为 `ACCESS_TOKEN` ; -6. 执行命令 `python app.py`。 - -然后等待模型下载,直到模型加载完毕为止。如果出现报错先问 GPT。 - -启动成功后应该会显示如下地址: - -![](/imgs/chatglm2.png) - -> 这里的 `http://0.0.0.0:6006` 就是连接地址。 - -### docker 部署 - -+ 镜像名: `registry.cn-hangzhou.aliyuncs.com/fastgpt/rerank:v0.2` -+ 端口号: 6006 -+ 大小:约8GB - -**设置安全凭证(即oneapi中的渠道密钥)** -``` -ACCESS_TOKEN=mytoken -``` - -**运行命令示例** -- 无需GPU环境,使用CPU运行 -```sh -docker run -d --name reranker -p 6006:6006 -e ACCESS_TOKEN=mytoken registry.cn-hangzhou.aliyuncs.com/fastgpt/rerank:v0.2 -``` - -- 需要CUDA 11.7环境 -```sh -docker run -d --gpus all --name reranker -p 6006:6006 -e ACCESS_TOKEN=mytoken registry.cn-hangzhou.aliyuncs.com/fastgpt/rerank:v0.2 -``` - -**docker-compose.yml示例** -``` -version: "3" -services: - reranker: - image: registry.cn-hangzhou.aliyuncs.com/fastgpt/rerank:v0.2 - container_name: reranker - # GPU运行环境,如果宿主机未安装,将deploy配置隐藏即可 - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: all - capabilities: [gpu] - ports: - - 6006:6006 - environment: - - ACCESS_TOKEN=mytoken - -``` -## 接入 FastGPT - -参考 [ReRank模型接入](/docs/development/configuration/#rerank-接入),host 变量为部署的域名。 diff --git a/docSite/content/docs/development/docker.md b/docSite/content/docs/development/docker.md index c6ce731b9114..312c8f97a124 100644 --- a/docSite/content/docs/development/docker.md +++ b/docSite/content/docs/development/docker.md @@ -32,7 +32,7 @@ FastGPT 使用了 one-api 项目来管理模型池,其可以兼容 OpenAI 、A 可选择 [Sealos 快速部署 OneAPI](/docs/development/one-api),更多部署方法可参考该项目的 [README](https://github.com/songquanpeng/one-api),也可以直接通过以下按钮一键部署: -Deploy on Sealos +Deploy on Sealos ## 一、安装 Docker 和 docker-compose diff --git a/docSite/content/docs/development/one-api.md b/docSite/content/docs/development/one-api.md index 72a9e7a5c836..eae82d2e2718 100644 --- a/docSite/content/docs/development/one-api.md +++ b/docSite/content/docs/development/one-api.md @@ -29,7 +29,7 @@ MySQL 版本支持多实例,高并发。 直接点击以下按钮即可一键部署 👇 -Deploy on Sealos +Deploy on Sealos 部署完后会跳转「应用管理」,数据库在另一个应用「数据库」中。需要等待 1~3 分钟数据库运行后才能访问成功。 diff --git a/docSite/content/docs/development/sealos.md b/docSite/content/docs/development/sealos.md index 9f1cd136f147..accf08a26840 100644 --- a/docSite/content/docs/development/sealos.md +++ b/docSite/content/docs/development/sealos.md @@ -21,7 +21,7 @@ FastGPT 使用了 one-api 项目来管理模型池,其可以兼容 OpenAI 、A ## 一键部署 Sealos 的服务器在国外,不需要额外处理网络问题,无需服务器、无需魔法、无需域名,支持高并发 & 动态伸缩。点击以下按钮即可一键部署 👇 -Deploy on Sealos +Deploy on Sealos 由于需要部署数据库,部署完后需要等待 2~4 分钟才能正常访问。默认用了最低配置,首次访问时会有些慢。 diff --git a/docSite/content/docs/development/upgrading/47.md b/docSite/content/docs/development/upgrading/47.md index ebcf33e0a044..77d88cf9f31e 100644 --- a/docSite/content/docs/development/upgrading/47.md +++ b/docSite/content/docs/development/upgrading/47.md @@ -1,5 +1,5 @@ --- -title: 'V4.7' +title: 'V4.7(需要初始化)' description: 'FastGPT V4.7更新说明' icon: 'upgrade' draft: false @@ -26,7 +26,7 @@ curl --location --request POST 'https://{{host}}/api/admin/initv47' \ ## 3. 升级 ReRank 模型 -4.7对ReRank模型进行了格式变动,兼容 cohere 的格式,可以直接使用 cohere 提供的 API。如果是本地的 ReRank 模型,需要修改镜像为:`registry.cn-hangzhou.aliyuncs.com/fastgpt/rerank:v0.2` 。 +4.7对ReRank模型进行了格式变动,兼容 cohere 的格式,可以直接使用 cohere 提供的 API。如果是本地的 ReRank 模型,需要修改镜像为:`registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1` 。 cohere的重排模型对中文不是很好,感觉不如 bge 的好用,接入教程如下: diff --git a/docSite/content/docs/development/upgrading/471.md b/docSite/content/docs/development/upgrading/471.md index b22d781f33c8..381a8512531a 100644 --- a/docSite/content/docs/development/upgrading/471.md +++ b/docSite/content/docs/development/upgrading/471.md @@ -21,11 +21,13 @@ curl --location --request POST 'https://{{host}}/api/admin/clearInvalidData' \ ## V4.7.1 更新说明 -1. 新增 - Pptx 和 xlsx 文件读取。但所有文件读取都放服务端,会消耗更多的服务器资源,以及无法在上传时预览更多内容。 -2. 新增 - 集成 Laf 云函数,可以读取 Laf 账号中的云函数作为 HTTP 模块。 -3. 新增 - 定时器,清理垃圾数据。(采用小范围清理,会清理最近n个小时的,所以请保证服务持续运行,长时间不允许,可以继续执行 clearInvalidData 的接口进行全量清理。) -4. 商业版新增 - 后台配置系统通知。 -5. 修改 - csv导入模板,取消 header 校验,自动获取前两列。 -6. 修复 - 工具调用模块连线数据类型校验错误。 -7. 修复 - 自定义索引输入时,解构数据失败。 -8. 修复 - rerank 模型数据格式。 \ No newline at end of file +1. 新增 - 语音输入完整配置。支持选择是否打开语音输入(包括分享页面),支持语音输入后自动发送,支持语音输入后自动语音播放(流式)。 +2. 新增 - Pptx 和 xlsx 文件读取。但所有文件读取都放服务端,会消耗更多的服务器资源,以及无法在上传时预览更多内容。 +3. 新增 - 集成 Laf 云函数,可以读取 Laf 账号中的云函数作为 HTTP 模块。 +4. 新增 - 定时器,清理垃圾数据。(采用小范围清理,会清理最近n个小时的,所以请保证服务持续运行,长时间不允许,可以继续执行 clearInvalidData 的接口进行全量清理。) +5. 商业版新增 - 后台配置系统通知。 +6. 修改 - csv导入模板,取消 header 校验,自动获取前两列。 +7. 修复 - 工具调用模块连线数据类型校验错误。 +8. 修复 - 自定义索引输入时,解构数据失败。 +9. 修复 - rerank 模型数据格式。 +10. 修复 - 问题补全历史记录BUG \ No newline at end of file diff --git a/docSite/content/docs/workflow/modules/laf.md b/docSite/content/docs/workflow/modules/laf.md new file mode 100644 index 000000000000..e04d968f218e --- /dev/null +++ b/docSite/content/docs/workflow/modules/laf.md @@ -0,0 +1,88 @@ +--- +title: "Laf 函数调用" +description: "FastGPT Laf 函数调用模块介绍" +icon: "Laf" +draft: false +toc: true +weight: 355 +--- + +## 特点 + +- 可重复添加 +- 有外部输入 +- 手动配置 +- 触发执行 +- 核中核模块 + +![](/imgs/laf1.webp) + +## 介绍 + +Laf 函数调用模块可以调用 Laf 账号下的云函数,其操作与 HTTP 模块相同,可以理解为封装了请求 Laf 云函数的 http 模块,值得注意的不同之处为: + +- 只能使用 POST 请求 +- 请求自带系统参数 systemParams + +## 具体使用 + +要能调用 Laf 云函数,首先需要绑定 Laf 账号和应用,并且在应用中创建云函数。 + +Laf 提供了 PAT(访问凭证) 来实现 Laf 平台外的快捷登录,可以访问 [Laf 文档](https://doc.Laf.run/zh/cli/#%E7%99%BB%E5%BD%95)查看详细如何获取 PAT。 + +在获取到 PAT 后,我们可以进入 fastgpt 的账号页或是直接在高级编排中使用 Laf 模块,填入 PAT 验证后,选择需要绑定的应用(应用需要是 Running 状态),即可调用 Laf 云函数。 + +> 如果需要解绑则取消绑定后,点击“更新”即可 + +![](/imgs/laf2.webp) + +为了更便捷地调用 Laf 云函数,可以参照下面的代码编写云函数,以便 openAPI 识别 + +```ts +import cloud from '@Lafjs/cloud' + +interface IRequestBody { + username: string // 用户名 + passwd?: string // 密码 +} + +interface IResponse { + message: string // 返回信息 + data: any // 返回数据 +} + +type extendedBody = IRequestBody & { + systemParams?: { + appId: string, + variables: string, + histories: string, + cTime: string, + chatId: string, + responseChatItemId: string + } +} + +export default async function (ctx: FunctionContext): Promise { + const body: extendedBody = ctx.body; + + console.log(body.systemParams.chatId); + + return { + message: 'ok', + data: '查找到用户名为' + body.username + '的用户' + }; +} +``` + +具体操作可以是,进入 Laf 的函数页面,新建函数(注意 fastgpt 只会调用 post 请求的函数),然后复制上面的代码或者点击更多模板搜索“fastgpt”,使用下面的模板 + +![](/imgs/laf3.webp) + +这样就能直接通过点击“同步参数”,一键填写输入输出 + +![](/imgs/laf4.webp) + +当然也可以手动添加,手动修改后的参数不会被“同步参数”修改 + +## 作用 +Laf 账号是绑定在团队上的,团队的成员可以轻松调用已经编写好的云函数 diff --git a/docSite/layouts/partials/docs/footer/footer-scripts.html b/docSite/layouts/partials/docs/footer/footer-scripts.html index 95437e0fe5b5..b5f4ea052be1 100644 --- a/docSite/layouts/partials/docs/footer/footer-scripts.html +++ b/docSite/layouts/partials/docs/footer/footer-scripts.html @@ -58,7 +58,7 @@ diff --git a/docSite/layouts/partials/docs/head.html b/docSite/layouts/partials/docs/head.html index 45e03defc0ea..2be89c4eefce 100644 --- a/docSite/layouts/partials/docs/head.html +++ b/docSite/layouts/partials/docs/head.html @@ -1,5 +1,5 @@ - + {{- $url := replace .Permalink ( printf "%s" .Site.BaseURL) "" }} @@ -106,6 +106,6 @@ {{- end -}} {{- end -}} <!-- change --> - <link rel="preload" href="https://cdn.jsdelivr.us/npm/lxgw-wenkai-screen-webfont@1.1.0/style.css" as="style" /> - <link rel="stylesheet" href="https://cdn.jsdelivr.us/npm/lxgw-wenkai-screen-webfont@1.1.0/style.css" /> + <link rel="preload" href="https://cdn.jsdelivr.net/npm/lxgw-wenkai-screen-webfont@1.1.0/style.css" as="style" /> + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lxgw-wenkai-screen-webfont@1.1.0/style.css" /> </head> \ No newline at end of file diff --git a/docSite/static/js/jsdelivr-auto-fallback.js b/docSite/static/js/jsdelivr-auto-fallback.js index 836b3911ba96..eee603de3de7 100644 --- a/docSite/static/js/jsdelivr-auto-fallback.js +++ b/docSite/static/js/jsdelivr-auto-fallback.js @@ -4,7 +4,7 @@ let failed; let isRunning; const DEST_LIST = [ - 'cdn.jsdelivr.us', + 'cdn.jsdelivr.net', 'jsd.cdn.zzko.cn', 'jsd.onmicrosoft.cn' ]; diff --git a/packages/global/common/system/api.d.ts b/packages/global/common/system/api.d.ts new file mode 100644 index 000000000000..5262e9b68069 --- /dev/null +++ b/packages/global/common/system/api.d.ts @@ -0,0 +1 @@ +export type AuthGoogleTokenProps = { googleToken: string; remoteip?: string | null }; diff --git a/packages/global/core/app/api.d.ts b/packages/global/core/app/api.d.ts index d508d60624c2..e77b945b20bc 100644 --- a/packages/global/core/app/api.d.ts +++ b/packages/global/core/app/api.d.ts @@ -1,6 +1,6 @@ import type { LLMModelItemType } from '../ai/model.d'; import { AppTypeEnum } from './constants'; -import { AppSchema, AppSimpleEditFormType } from './type'; +import { AppSchema } from './type'; export type CreateAppParams = { name?: string; diff --git a/packages/global/core/app/constants.ts b/packages/global/core/app/constants.ts index c2b2b5e7a114..18bbff28ffe0 100644 --- a/packages/global/core/app/constants.ts +++ b/packages/global/core/app/constants.ts @@ -1,3 +1,5 @@ +import { AppWhisperConfigType } from './type'; + export enum AppTypeEnum { simple = 'simple', advanced = 'advanced' @@ -10,3 +12,9 @@ export const AppTypeMap = { label: 'advanced' } }; + +export const defaultWhisperConfig: AppWhisperConfigType = { + open: false, + autoSend: false, + autoTTSResponse: false +}; diff --git a/packages/global/core/app/type.d.ts b/packages/global/core/app/type.d.ts index 8c75c3ad2002..15307481bedf 100644 --- a/packages/global/core/app/type.d.ts +++ b/packages/global/core/app/type.d.ts @@ -1,9 +1,5 @@ -import type { - AppTTSConfigType, - FlowNodeTemplateType, - ModuleItemType, - VariableItemType -} from '../module/type.d'; +import type { FlowNodeTemplateType, ModuleItemType } from '../module/type.d'; + import { AppTypeEnum } from './constants'; import { PermissionTypeEnum } from '../../support/permission/constant'; import type { DatasetModuleProps } from '../module/node/type.d'; @@ -82,5 +78,31 @@ export type AppSimpleEditFormType = { voice?: string | undefined; speed?: number | undefined; }; + whisper: AppWhisperConfigType; }; }; + +/* app function config */ +// variable +export type VariableItemType = { + id: string; + key: string; + label: string; + type: `${VariableInputEnum}`; + required: boolean; + maxLen: number; + enums: { value: string }[]; +}; +// tts +export type AppTTSConfigType = { + type: 'none' | 'web' | 'model'; + model?: string; + voice?: string; + speed?: number; +}; +// whisper +export type AppWhisperConfigType = { + open: boolean; + autoSend: boolean; + autoTTSResponse: boolean; +}; diff --git a/packages/global/core/app/utils.ts b/packages/global/core/app/utils.ts index 8a3c3de023bb..e322cf510e03 100644 --- a/packages/global/core/app/utils.ts +++ b/packages/global/core/app/utils.ts @@ -9,6 +9,7 @@ import type { FlowNodeInputItemType } from '../module/node/type.d'; import { getGuideModule, splitGuideModule } from '../module/utils'; import { ModuleItemType } from '../module/type.d'; import { DatasetSearchModeEnum } from '../dataset/constants'; +import { defaultWhisperConfig } from './constants'; export const getDefaultAppForm = (): AppSimpleEditFormType => { return { @@ -36,7 +37,8 @@ export const getDefaultAppForm = (): AppSimpleEditFormType => { questionGuide: false, tts: { type: 'web' - } + }, + whisper: defaultWhisperConfig } }; }; @@ -107,14 +109,15 @@ export const appModules2Form = ({ modules }: { modules: ModuleItemType[] }) => { ModuleInputKeyEnum.datasetSearchExtensionBg ); } else if (module.flowType === FlowNodeTypeEnum.userGuide) { - const { welcomeText, variableModules, questionGuide, ttsConfig } = splitGuideModule( - getGuideModule(modules) - ); + const { welcomeText, variableModules, questionGuide, ttsConfig, whisperConfig } = + splitGuideModule(getGuideModule(modules)); + defaultAppForm.userGuide = { welcomeText: welcomeText, variables: variableModules, questionGuide: questionGuide, - tts: ttsConfig + tts: ttsConfig, + whisper: whisperConfig }; } else if (module.flowType === FlowNodeTypeEnum.pluginModule) { defaultAppForm.selectedTools.push({ diff --git a/packages/global/core/chat/type.d.ts b/packages/global/core/chat/type.d.ts index 8ab87b390e97..34e7855afc16 100644 --- a/packages/global/core/chat/type.d.ts +++ b/packages/global/core/chat/type.d.ts @@ -109,7 +109,7 @@ export type ChatItemType = (UserChatItemType | SystemChatItemType | AIChatItemTy }; export type ChatSiteItemType = (UserChatItemType | SystemChatItemType | AIChatItemType) & { - dataId?: string; + dataId: string; status: `${ChatStatusEnum}`; moduleName?: string; ttsBuffer?: Uint8Array; diff --git a/packages/global/core/module/constants.ts b/packages/global/core/module/constants.ts index 8dcabaacf864..37f7aee09cf0 100644 --- a/packages/global/core/module/constants.ts +++ b/packages/global/core/module/constants.ts @@ -37,6 +37,7 @@ export enum ModuleInputKeyEnum { userChatInput = 'userChatInput', questionGuide = 'questionGuide', tts = 'tts', + whisper = 'whisper', answerText = 'text', agents = 'agents', // cq agent key diff --git a/packages/global/core/module/type.d.ts b/packages/global/core/module/type.d.ts index 5b6160bb937d..996ec5b9ed0f 100644 --- a/packages/global/core/module/type.d.ts +++ b/packages/global/core/module/type.d.ts @@ -63,24 +63,6 @@ export type ModuleItemType = { }; /* --------------- function type -------------------- */ -// variable -export type VariableItemType = { - id: string; - key: string; - label: string; - type: `${VariableInputEnum}`; - required: boolean; - maxLen: number; - enums: { value: string }[]; -}; -// tts -export type AppTTSConfigType = { - type: 'none' | 'web' | 'model'; - model?: string; - voice?: string; - speed?: number; -}; - export type SelectAppItemType = { id: string; name: string; diff --git a/packages/global/core/module/utils.ts b/packages/global/core/module/utils.ts index 012fdb0a6657..31764df8d201 100644 --- a/packages/global/core/module/utils.ts +++ b/packages/global/core/module/utils.ts @@ -6,10 +6,12 @@ import { variableMap } from './constants'; import { FlowNodeInputItemType, FlowNodeOutputItemType } from './node/type'; -import { AppTTSConfigType, ModuleItemType, VariableItemType } from './type'; +import { ModuleItemType } from './type'; +import type { VariableItemType, AppTTSConfigType, AppWhisperConfigType } from '../app/type'; import { Input_Template_Switch } from './template/input'; import { EditorVariablePickerType } from '../../../web/components/common/Textarea/PromptEditor/type'; import { Output_Template_Finish } from './template/output'; +import { defaultWhisperConfig } from '../app/constants'; /* module */ export const getGuideModule = (modules: ModuleItemType[]) => @@ -30,11 +32,16 @@ export const splitGuideModule = (guideModules?: ModuleItemType) => { (item) => item.key === ModuleInputKeyEnum.tts )?.value || { type: 'web' }; + const whisperConfig: AppWhisperConfigType = + guideModules?.inputs?.find((item) => item.key === ModuleInputKeyEnum.whisper)?.value || + defaultWhisperConfig; + return { welcomeText, variableModules, questionGuide, - ttsConfig + ttsConfig, + whisperConfig }; }; diff --git a/packages/global/core/plugin/httpPlugin/type.d.ts b/packages/global/core/plugin/httpPlugin/type.d.ts index 857947dad1d9..f8494334e205 100644 --- a/packages/global/core/plugin/httpPlugin/type.d.ts +++ b/packages/global/core/plugin/httpPlugin/type.d.ts @@ -5,6 +5,7 @@ export type PathDataType = { path: string; params: any[]; request: any; + response: any; }; export type OpenApiJsonSchema = { diff --git a/packages/global/core/plugin/httpPlugin/utils.ts b/packages/global/core/plugin/httpPlugin/utils.ts index c3b452b0595f..5a5a95a9df09 100644 --- a/packages/global/core/plugin/httpPlugin/utils.ts +++ b/packages/global/core/plugin/httpPlugin/utils.ts @@ -43,7 +43,8 @@ export const str2OpenApiSchema = async (yamlStr = ''): Promise<OpenApiJsonSchema name: methodInfo.operationId || path, description: methodInfo.description || methodInfo.summary, params: methodInfo.parameters, - request: methodInfo?.requestBody + request: methodInfo?.requestBody, + response: methodInfo.responses }; return result; }); diff --git a/packages/web/common/system/utils.ts b/packages/web/common/system/utils.ts index 07150fa50fa6..a9fef1861f9e 100644 --- a/packages/web/common/system/utils.ts +++ b/packages/web/common/system/utils.ts @@ -7,3 +7,7 @@ export const getUserFingerprint = async () => { const result = await fp.get(); console.log(result.visitorId); }; + +export const hasHttps = () => { + return window.location.protocol === 'https:'; +}; diff --git a/packages/web/components/common/Icon/constants.ts b/packages/web/components/common/Icon/constants.ts index d824bf2a41bf..706af88201b1 100644 --- a/packages/web/components/common/Icon/constants.ts +++ b/packages/web/components/common/Icon/constants.ts @@ -70,6 +70,7 @@ export const iconPaths = { 'core/app/simpleMode/template': () => import('./icons/core/app/simpleMode/template.svg'), 'core/app/simpleMode/tts': () => import('./icons/core/app/simpleMode/tts.svg'), 'core/app/simpleMode/variable': () => import('./icons/core/app/simpleMode/variable.svg'), + 'core/app/simpleMode/whisper': () => import('./icons/core/app/simpleMode/whisper.svg'), 'core/app/toolCall': () => import('./icons/core/app/toolCall.svg'), 'core/app/ttsFill': () => import('./icons/core/app/ttsFill.svg'), 'core/app/variable/external': () => import('./icons/core/app/variable/external.svg'), @@ -77,12 +78,14 @@ export const iconPaths = { 'core/app/variable/select': () => import('./icons/core/app/variable/select.svg'), 'core/app/variable/textarea': () => import('./icons/core/app/variable/textarea.svg'), 'core/chat/QGFill': () => import('./icons/core/chat/QGFill.svg'), + 'core/chat/cancelSpeak': () => import('./icons/core/chat/cancelSpeak.svg'), 'core/chat/chatFill': () => import('./icons/core/chat/chatFill.svg'), 'core/chat/chatLight': () => import('./icons/core/chat/chatLight.svg'), 'core/chat/chatModelTag': () => import('./icons/core/chat/chatModelTag.svg'), 'core/chat/feedback/badLight': () => import('./icons/core/chat/feedback/badLight.svg'), 'core/chat/feedback/goodLight': () => import('./icons/core/chat/feedback/goodLight.svg'), 'core/chat/fileSelect': () => import('./icons/core/chat/fileSelect.svg'), + 'core/chat/finishSpeak': () => import('./icons/core/chat/finishSpeak.svg'), 'core/chat/quoteFill': () => import('./icons/core/chat/quoteFill.svg'), 'core/chat/quoteSign': () => import('./icons/core/chat/quoteSign.svg'), 'core/chat/recordFill': () => import('./icons/core/chat/recordFill.svg'), @@ -91,7 +94,6 @@ export const iconPaths = { 'core/chat/setTopLight': () => import('./icons/core/chat/setTopLight.svg'), 'core/chat/speaking': () => import('./icons/core/chat/speaking.svg'), 'core/chat/stopSpeech': () => import('./icons/core/chat/stopSpeech.svg'), - 'core/chat/stopSpeechFill': () => import('./icons/core/chat/stopSpeechFill.svg'), 'core/dataset/commonDataset': () => import('./icons/core/dataset/commonDataset.svg'), 'core/dataset/datasetFill': () => import('./icons/core/dataset/datasetFill.svg'), 'core/dataset/datasetLight': () => import('./icons/core/dataset/datasetLight.svg'), diff --git a/packages/web/components/common/Icon/icons/core/app/simpleMode/whisper.svg b/packages/web/components/common/Icon/icons/core/app/simpleMode/whisper.svg new file mode 100644 index 000000000000..4bd7d6767813 --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/app/simpleMode/whisper.svg @@ -0,0 +1,6 @@ +<svg t="1712207338160" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6114" + width="128" height="128"> + <path + d="M370.569846 945.230769c-18.825846 0.787692-34.658462-14.808615-35.446154-34.776615 0.787692-19.968 16.620308-35.524923 35.446154-34.776616h106.180923v-106.338461c-138.358154-10.436923-252.888615-118.153846-279.394461-262.774154a36.745846 36.745846 0 0 1 6.852923-26.545231 32.649846 32.649846 0 0 1 22.803692-13.154461c18.628923-3.426462 36.470154 9.412923 40.369231 29.065846 24.260923 122.249846 127.133538 208.817231 244.775384 205.902769 117.563077 2.875077 220.396308-83.613538 244.736-205.824 3.938462-19.613538 21.740308-32.374154 40.329847-28.987077a32.649846 32.649846 0 0 1 22.803692 13.115077c5.592615 7.483077 8.073846 17.092923 6.892308 26.545231-26.505846 144.580923-141.075692 252.297846-279.433847 262.656v106.338461h106.220308c18.786462-0.787692 34.619077 14.808615 35.367385 34.776616a37.179077 37.179077 0 0 1-10.909539 25.206154 32.964923 32.964923 0 0 1-24.457846 9.570461h-283.175384z m-36.076308-483.958154v-208.738461C338.628923 152.891077 417.595077 75.342769 511.488 78.769231c93.892923-3.426462 172.898462 74.161231 176.955077 173.883077v208.738461c-4.056615 99.721846-83.062154 177.309538-176.955077 173.883077-93.971692 3.426462-172.977231-74.24-176.994462-174.001231z" + fill="#F06E23" p-id="6115"></path> +</svg> \ No newline at end of file diff --git a/packages/web/components/common/Icon/icons/core/chat/stopSpeechFill.svg b/packages/web/components/common/Icon/icons/core/chat/cancelSpeak.svg similarity index 97% rename from packages/web/components/common/Icon/icons/core/chat/stopSpeechFill.svg rename to packages/web/components/common/Icon/icons/core/chat/cancelSpeak.svg index b7c022844c1e..62943e2dac10 100644 --- a/packages/web/components/common/Icon/icons/core/chat/stopSpeechFill.svg +++ b/packages/web/components/common/Icon/icons/core/chat/cancelSpeak.svg @@ -2,7 +2,7 @@ <g clip-path="url(#clip0_74_2)"> <path fill-rule="evenodd" clip-rule="evenodd" d="M10 2.49999C5.85791 2.49999 2.50004 5.85786 2.50004 10C2.50004 14.1421 5.85791 17.5 10 17.5C14.1422 17.5 17.5 14.1421 17.5 10C17.5 5.85786 14.1422 2.49999 10 2.49999ZM0.833374 10C0.833374 4.93739 4.93743 0.833328 10 0.833328C15.0627 0.833328 19.1667 4.93739 19.1667 10C19.1667 15.0626 15.0627 19.1667 10 19.1667C4.93743 19.1667 0.833374 15.0626 0.833374 10ZM6.66671 7.5C6.66671 7.03976 7.0398 6.66666 7.50004 6.66666H12.5C12.9603 6.66666 13.3334 7.03976 13.3334 7.5V12.5C13.3334 12.9602 12.9603 13.3333 12.5 13.3333H7.50004C7.0398 13.3333 6.66671 12.9602 6.66671 12.5V7.5ZM8.33337 8.33333V11.6667H11.6667V8.33333H8.33337Z" - fill="#3370FF" /> + fill="#fd853a" /> </g> <defs> <clipPath id="clip0_74_2"> diff --git a/packages/web/components/common/Icon/icons/core/chat/finishSpeak.svg b/packages/web/components/common/Icon/icons/core/chat/finishSpeak.svg new file mode 100644 index 000000000000..1f9060d35612 --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/chat/finishSpeak.svg @@ -0,0 +1,6 @@ +<svg t="1712578349044" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1183" + width="128" height="128"> + <path + d="M512 105.472c225.28 0 407.04 181.76 407.04 407.04s-181.76 407.04-407.04 407.04-407.04-181.76-407.04-407.04 181.76-407.04 407.04-407.04z m0-74.24c-265.216 0-480.768 215.552-480.768 480.768s215.552 480.768 480.768 480.768 480.768-215.552 480.768-480.768-215.552-480.768-480.768-480.768z m254.976 296.96l-331.776 331.776-129.024-129.024-53.248 53.248 155.648 155.648 26.624 25.6 26.624-25.6 358.4-358.4-53.248-53.248z" + p-id="1184" fill="#039855"></path> +</svg> \ No newline at end of file diff --git a/packages/web/styles/theme.ts b/packages/web/styles/theme.ts index 2c87bcfd1faf..516742af18ab 100644 --- a/packages/web/styles/theme.ts +++ b/packages/web/styles/theme.ts @@ -205,7 +205,7 @@ const Button = defineStyleConfig({ bg: 'primary.50' }, _disabled: { - bg: 'myGray.50' + bg: 'myGray.50 !important' } }, grayDanger: { diff --git a/projects/app/package.json b/projects/app/package.json index b33917170734..2c6c0800a0ae 100644 --- a/projects/app/package.json +++ b/projects/app/package.json @@ -1,6 +1,6 @@ { "name": "app", - "version": "4.7", + "version": "4.7.1", "private": false, "scripts": { "dev": "next dev", diff --git a/projects/app/public/docs/versionIntro.md b/projects/app/public/docs/versionIntro.md index 65c10a5832e9..bf7b3e5853c2 100644 --- a/projects/app/public/docs/versionIntro.md +++ b/projects/app/public/docs/versionIntro.md @@ -1,13 +1,10 @@ ### FastGPT V4.7 -1. 新增 - 工具调用模块,可以让LLM模型根据用户意图,动态的选择其他模型或插件执行。 -2. 新增 - 分类和内容提取支持 functionCall 模式。部分模型支持 functionCall 不支持 ToolCall,也可以使用了。需要把 LLM 模型配置文件里的 `functionCall` 设置为 `true`, `toolChoice`设置为 `false`。如果 `toolChoice` 为 true,会走 tool 模式。 -3. 新增 - HTTP插件,可实现OpenAPI快速生成插件。 -4. 优化 - 高级编排性能。 -5. 优化 - AI模型选择。 -6. 优化 - 手动输入知识库弹窗。 -7. 优化 - 变量输入弹窗。 -8. 优化 - 浏览器读取文件自动推断编码,减少乱码情况。 -9. [点击查看高级编排介绍文档](https://doc.fastgpt.in/docs/workflow/intro) -10. [使用文档](https://doc.fastgpt.in/docs/intro/) -11. [点击查看商业版](https://doc.fastgpt.in/docs/commercial/) \ No newline at end of file +1. 新增 - 语音输入完整配置。支持选择是否打开语音输入(包括分享页面),支持语音输入后自动发送,支持语音输入后自动语音播放(流式)。 +2. 新增 - Pptx 和 xlsx 文件读取。但所有文件读取都放服务端,会消耗更多的服务器资源,以及无法在上传时预览更多内容。 +3. 新增 - 集成 Laf 云函数,可以读取 Laf 账号中的云函数作为 HTTP 模块。 +4. 修改 - csv导入模板,取消 header 校验,自动获取前两列。 +5. 修复 - 问题补全历史记录BUG +6. [点击查看高级编排介绍文档](https://doc.fastgpt.in/docs/workflow/intro) +7. [使用文档](https://doc.fastgpt.in/docs/intro/) +8. [点击查看商业版](https://doc.fastgpt.in/docs/commercial/) \ No newline at end of file diff --git a/projects/app/public/locales/en/common.json b/projects/app/public/locales/en/common.json index 84df7fe4249d..7c23b2c7e913 100644 --- a/projects/app/public/locales/en/common.json +++ b/projects/app/public/locales/en/common.json @@ -275,6 +275,7 @@ "App intro": "App intro", "App params config": "App Config", "Chat Variable": "", + "Config whisper": "Config whisper", "External using": "External use", "Make a brief introduction of your app": "Make a brief introduction of your app", "Max histories": "Dialog round", @@ -297,6 +298,7 @@ "Simple Config Tip": "Only basic functions are included. For complex agent functions, use advanced orchestration.", "TTS": "Audio Speech", "TTS Tip": "After this function is enabled, the voice playback function can be used after each conversation. Use of this feature may incur additional charges.", + "TTS start": "Reading content", "Team tags": "Team tags", "Temperature": "Temperature", "Tool call": "Tool call", @@ -309,6 +311,9 @@ "This plugin cannot be called as a tool": "This tool cannot be used in easy mode" }, "Welcome Text": "Welcome Text", + "Whisper": "Whisper", + "Whisper Tip": "", + "Whisper config": "Whisper config", "create app": "Create App", "deterministic": "Deterministic", "edit": { @@ -395,11 +400,23 @@ "Test Listen": "Test", "Test Listen Text": "Hello, this is a voice test, if you can hear this sentence, it means that the voice playback function is normal", "Web": "Browser (free)" + }, + "whisper": { + "Auto send": "Auto send", + "Auto send tip": "After the voice input is completed, you can send it directly, without manually clicking the send button", + "Auto tts response": "Auto tts response", + "Auto tts response tip": "Questions sent through voice input will be answered directly in the form of voice. Please ensure that the voice broadcast function is enabled.", + "Close": "Close", + "Not tts tip": "You have not turned on Voice playback and the feature is not available", + "Open": "Open", + "Switch": "Open whisper" } }, "chat": { "Admin Mark Content": "Corrected response", "Audio Speech Error": "Audio Speech Error", + "Cancel Speak": "Cancel speak", + "Canceled Speak": "Voice input has been cancelled", "Chat API is error or undefined": "The session interface reported an error or returned null", "Confirm to clear history": "Confirm to clear history?", "Confirm to clear share chat history": " Are you sure to delete all chats?", @@ -415,6 +432,7 @@ "Feedback Submit": "Submit", "Feedback Success": "Feedback Success", "Feedback Update Failed": "Feedback Update Failed", + "Finish Speak": "Finish speak", "History": "History", "History Amount": "{{amount}} records", "Mark": "Mark", diff --git a/projects/app/public/locales/zh/common.json b/projects/app/public/locales/zh/common.json index 8bf8829b05a2..0583d2b682f4 100644 --- a/projects/app/public/locales/zh/common.json +++ b/projects/app/public/locales/zh/common.json @@ -275,6 +275,7 @@ "App intro": "应用介绍", "App params config": "应用配置", "Chat Variable": "对话框变量", + "Config whisper": "配置语音输入", "External using": "外部使用途径", "Make a brief introduction of your app": "给你的 AI 应用一个介绍", "Max histories": "聊天记录数量", @@ -295,8 +296,9 @@ "Share link desc": "分享链接给其他用户,无需登录即可直接进行使用", "Share link desc detail": "可以直接分享该模型给其他用户去进行对话,对方无需登录即可直接进行对话。注意,这个功能会消耗你账号的余额,请保管好链接!", "Simple Config Tip": "仅包含基础功能,复杂 agent 功能请使用高级编排。", - "TTS": "语音播报", + "TTS": "语音播放", "TTS Tip": "开启后,每次对话后可使用语音播放功能。使用该功能可能产生额外费用。", + "TTS start": "朗读内容", "Team tags": "团队标签", "Temperature": "温度", "Tool call": "工具调用", @@ -309,6 +311,9 @@ "This plugin cannot be called as a tool": "该工具无法在简易模式中使用" }, "Welcome Text": "对话开场白", + "Whisper": "语音输入", + "Whisper Tip": "配置语音输入相关参数", + "Whisper config": "语音输入配置", "create app": "创建属于你的 AI 应用", "deterministic": "严谨", "edit": { @@ -395,11 +400,23 @@ "Test Listen": "试听", "Test Listen Text": "你好,这是语音测试,如果你能听到这句话,说明语音播放功能正常", "Web": "浏览器自带(免费)" + }, + "whisper": { + "Auto send": "自动发送", + "Auto send tip": "语音输入完毕后直接发送,不需要再手动点击发送按键", + "Auto tts response": "自动语音回复", + "Auto tts response tip": "通过语音输入发送的问题,会直接以语音的形式响应,请确保打开了语音播报功能。", + "Close": "关闭", + "Not tts tip": "你没有开启语音播放,该功能无法使用", + "Open": "开启", + "Switch": "开启语音输入" } }, "chat": { "Admin Mark Content": "纠正后的回复", "Audio Speech Error": "语音播报异常", + "Cancel Speak": "取消语音输入", + "Canceled Speak": "语音输入已取消", "Chat API is error or undefined": "对话接口报错或返回为空", "Confirm to clear history": "确认清空该应用的在线聊天记录?分享和 API 调用的记录不会被清空。", "Confirm to clear share chat history": "确认删除所有聊天记录?", @@ -415,6 +432,7 @@ "Feedback Submit": "提交反馈", "Feedback Success": "反馈成功!", "Feedback Update Failed": "更新反馈状态失败", + "Finish Speak": "语音输入完成", "History": "记录", "History Amount": "{{amount}}条记录", "Mark": "标注预期回答", @@ -1473,7 +1491,7 @@ "usage": { "Ai model": "AI模型", "App name": "应用名", - "Audio Speech": "语音播报", + "Audio Speech": "语音播放", "Bill Module": "扣费模块", "Chars length": "文本长度", "Data Length": "数据长度", diff --git a/projects/app/src/components/ChatBox/MessageInput.tsx b/projects/app/src/components/ChatBox/MessageInput.tsx index fc1be41df38c..166d709c0f56 100644 --- a/projects/app/src/components/ChatBox/MessageInput.tsx +++ b/projects/app/src/components/ChatBox/MessageInput.tsx @@ -1,7 +1,7 @@ import { useSpeech } from '@/web/common/hooks/useSpeech'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { Box, Flex, Image, Spinner, Textarea } from '@chakra-ui/react'; -import React, { useRef, useEffect, useCallback, useMemo } from 'react'; +import React, { useRef, useEffect, useCallback, useTransition } from 'react'; import { useTranslation } from 'next-i18next'; import MyTooltip from '../MyTooltip'; import MyIcon from '@fastgpt/web/components/common/Icon'; @@ -12,32 +12,28 @@ import { ChatFileTypeEnum } from '@fastgpt/global/core/chat/constants'; import { addDays } from 'date-fns'; import { useRequest } from '@fastgpt/web/hooks/useRequest'; import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'; -import { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat'; import { ChatBoxInputFormType, ChatBoxInputType, UserInputFileItemType } from './type'; import { textareaMinH } from './constants'; import { UseFormReturn, useFieldArray } from 'react-hook-form'; +import { useChatProviderStore } from './Provider'; const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 6); const MessageInput = ({ onSendMessage, onStop, - isChatting, TextareaDom, showFileSelector = false, resetInputVal, - shareId, - outLinkUid, - teamId, - teamToken, - chatForm -}: OutLinkChatAuthProps & { - onSendMessage: (val: ChatBoxInputType) => void; + chatForm, + appId +}: { + onSendMessage: (val: ChatBoxInputType & { autoTTSResponse?: boolean }) => void; onStop: () => void; - isChatting: boolean; showFileSelector?: boolean; TextareaDom: React.MutableRefObject<HTMLTextAreaElement | null>; resetInputVal: (val: ChatBoxInputType) => void; chatForm: UseFormReturn<ChatBoxInputFormType>; + appId?: string; }) => { const { setValue, watch, control } = chatForm; const inputValue = watch('input'); @@ -52,15 +48,8 @@ const MessageInput = ({ name: 'files' }); - const { - isSpeaking, - isTransCription, - stopSpeak, - startSpeak, - speakingTimeString, - renderAudioGraph, - stream - } = useSpeech({ shareId, outLinkUid, teamId, teamToken }); + const { shareId, outLinkUid, teamId, teamToken, isChatting, whisperConfig, autoTTSResponse } = + useChatProviderStore(); const { isPc, whisperModel } = useSystemStore(); const canvasRef = useRef<HTMLCanvasElement>(null); const { t } = useTranslation(); @@ -163,6 +152,16 @@ const MessageInput = ({ replaceFile([]); }, [TextareaDom, fileList, onSendMessage, replaceFile]); + /* whisper init */ + const { + isSpeaking, + isTransCription, + stopSpeak, + startSpeak, + speakingTimeString, + renderAudioGraph, + stream + } = useSpeech({ appId, shareId, outLinkUid, teamId, teamToken }); useEffect(() => { if (!stream) { return; @@ -180,6 +179,28 @@ const MessageInput = ({ }; renderCurve(); }, [renderAudioGraph, stream]); + const finishWhisperTranscription = useCallback( + (text: string) => { + if (!text) return; + if (whisperConfig?.autoSend) { + onSendMessage({ + text, + files: fileList, + autoTTSResponse + }); + replaceFile([]); + } else { + resetInputVal({ text }); + } + }, + [autoTTSResponse, fileList, onSendMessage, replaceFile, resetInputVal, whisperConfig?.autoSend] + ); + const onWhisperRecord = useCallback(() => { + if (isSpeaking) { + return stopSpeak(); + } + startSpeak(finishWhisperTranscription); + }, [finishWhisperTranscription, isSpeaking, startSpeak, stopSpeak]); return ( <Box m={['0 auto', '10px auto']} w={'100%'} maxW={['auto', 'min(800px, 100%)']} px={[0, 5]}> @@ -369,7 +390,7 @@ const MessageInput = ({ bottom={['10px', '12px']} > {/* voice-input */} - {!shareId && !havInput && !isChatting && !!whisperModel && ( + {whisperConfig.open && !havInput && !isChatting && !!whisperModel && ( <> <canvas ref={canvasRef} @@ -380,32 +401,49 @@ const MessageInput = ({ zIndex: 0 }} /> - <Flex - mr={2} - alignItems={'center'} - justifyContent={'center'} - flexShrink={0} - h={['26px', '32px']} - w={['26px', '32px']} - borderRadius={'md'} - cursor={'pointer'} - _hover={{ bg: '#F5F5F8' }} - onClick={() => { - if (isSpeaking) { - return stopSpeak(); - } - startSpeak((text) => resetInputVal({ text })); - }} - > - <MyTooltip label={isSpeaking ? t('core.chat.Stop Speak') : t('core.chat.Record')}> + {isSpeaking && ( + <MyTooltip label={t('core.chat.Cancel Speak')}> + <Flex + mr={2} + alignItems={'center'} + justifyContent={'center'} + flexShrink={0} + h={['26px', '32px']} + w={['26px', '32px']} + borderRadius={'md'} + cursor={'pointer'} + _hover={{ bg: '#F5F5F8' }} + onClick={() => stopSpeak(true)} + > + <MyIcon + name={'core/chat/cancelSpeak'} + width={['20px', '22px']} + height={['20px', '22px']} + /> + </Flex> + </MyTooltip> + )} + <MyTooltip label={isSpeaking ? t('core.chat.Finish Speak') : t('core.chat.Record')}> + <Flex + mr={2} + alignItems={'center'} + justifyContent={'center'} + flexShrink={0} + h={['26px', '32px']} + w={['26px', '32px']} + borderRadius={'md'} + cursor={'pointer'} + _hover={{ bg: '#F5F5F8' }} + onClick={onWhisperRecord} + > <MyIcon - name={isSpeaking ? 'core/chat/stopSpeechFill' : 'core/chat/recordFill'} + name={isSpeaking ? 'core/chat/finishSpeak' : 'core/chat/recordFill'} width={['20px', '22px']} height={['20px', '22px']} color={isSpeaking ? 'primary.500' : 'myGray.600'} /> - </MyTooltip> - </Flex> + </Flex> + </MyTooltip> </> )} {/* send and stop icon */} diff --git a/projects/app/src/components/ChatBox/Provider.tsx b/projects/app/src/components/ChatBox/Provider.tsx new file mode 100644 index 000000000000..6fd8725254db --- /dev/null +++ b/projects/app/src/components/ChatBox/Provider.tsx @@ -0,0 +1,176 @@ +import React, { useContext, createContext, useState, useMemo, useEffect, useCallback } from 'react'; +import { useAudioPlay } from '@/web/common/utils/voice'; +import { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat'; +import { ModuleItemType } from '@fastgpt/global/core/module/type'; +import { splitGuideModule } from '@fastgpt/global/core/module/utils'; +import { + AppTTSConfigType, + AppWhisperConfigType, + VariableItemType +} from '@fastgpt/global/core/app/type'; +import { ChatSiteItemType } from '@fastgpt/global/core/chat/type'; + +type useChatStoreType = OutLinkChatAuthProps & { + welcomeText: string; + variableModules: VariableItemType[]; + questionGuide: boolean; + ttsConfig: AppTTSConfigType; + whisperConfig: AppWhisperConfigType; + autoTTSResponse: boolean; + startSegmentedAudio: () => Promise<any>; + splitText2Audio: (text: string, done?: boolean | undefined) => void; + finishSegmentedAudio: () => void; + audioLoading: boolean; + audioPlaying: boolean; + hasAudio: boolean; + playAudioByText: ({ + text, + buffer + }: { + text: string; + buffer?: Uint8Array | undefined; + }) => Promise<{ + buffer?: Uint8Array | undefined; + }>; + cancelAudio: () => void; + audioPlayingChatId: string | undefined; + setAudioPlayingChatId: React.Dispatch<React.SetStateAction<string | undefined>>; + chatHistories: ChatSiteItemType[]; + setChatHistories: React.Dispatch<React.SetStateAction<ChatSiteItemType[]>>; + isChatting: boolean; +}; +const StateContext = createContext<useChatStoreType>({ + welcomeText: '', + variableModules: [], + questionGuide: false, + ttsConfig: { + type: 'none', + model: undefined, + voice: undefined, + speed: undefined + }, + whisperConfig: { + open: false, + autoSend: false, + autoTTSResponse: false + }, + autoTTSResponse: false, + startSegmentedAudio: function (): Promise<any> { + throw new Error('Function not implemented.'); + }, + splitText2Audio: function (text: string, done?: boolean | undefined): void { + throw new Error('Function not implemented.'); + }, + chatHistories: [], + setChatHistories: function (value: React.SetStateAction<ChatSiteItemType[]>): void { + throw new Error('Function not implemented.'); + }, + isChatting: false, + audioLoading: false, + audioPlaying: false, + hasAudio: false, + playAudioByText: function ({ + text, + buffer + }: { + text: string; + buffer?: Uint8Array | undefined; + }): Promise<{ buffer?: Uint8Array | undefined }> { + throw new Error('Function not implemented.'); + }, + cancelAudio: function (): void { + throw new Error('Function not implemented.'); + }, + audioPlayingChatId: undefined, + setAudioPlayingChatId: function (value: React.SetStateAction<string | undefined>): void { + throw new Error('Function not implemented.'); + }, + finishSegmentedAudio: function (): void { + throw new Error('Function not implemented.'); + } +}); + +export type ChatProviderProps = OutLinkChatAuthProps & { + userGuideModule?: ModuleItemType; + + // not chat test params + chatId?: string; + children: React.ReactNode; +}; + +export const useChatProviderStore = () => useContext(StateContext); + +const Provider = ({ + shareId, + outLinkUid, + teamId, + teamToken, + userGuideModule, + children +}: ChatProviderProps) => { + const [chatHistories, setChatHistories] = useState<ChatSiteItemType[]>([]); + + const { welcomeText, variableModules, questionGuide, ttsConfig, whisperConfig } = useMemo( + () => splitGuideModule(userGuideModule), + [userGuideModule] + ); + + // segment audio + const [audioPlayingChatId, setAudioPlayingChatId] = useState<string>(); + const { + audioLoading, + audioPlaying, + hasAudio, + playAudioByText, + cancelAudio, + startSegmentedAudio, + finishSegmentedAudio, + splitText2Audio + } = useAudioPlay({ + ttsConfig, + shareId, + outLinkUid, + teamId, + teamToken + }); + + const autoTTSResponse = + whisperConfig?.open && whisperConfig?.autoSend && whisperConfig?.autoTTSResponse && hasAudio; + + const isChatting = useMemo( + () => + chatHistories[chatHistories.length - 1] && + chatHistories[chatHistories.length - 1]?.status !== 'finish', + [chatHistories] + ); + + const value: useChatStoreType = { + shareId, + outLinkUid, + teamId, + teamToken, + welcomeText, + variableModules, + questionGuide, + ttsConfig, + whisperConfig, + autoTTSResponse, + startSegmentedAudio, + finishSegmentedAudio, + splitText2Audio, + audioLoading, + audioPlaying, + hasAudio, + playAudioByText, + cancelAudio, + audioPlayingChatId, + setAudioPlayingChatId, + chatHistories, + setChatHistories, + isChatting + }; + + return <StateContext.Provider value={value}>{children}</StateContext.Provider>; +}; + +export default React.memo(Provider); diff --git a/projects/app/src/components/ChatBox/components/ChatController.tsx b/projects/app/src/components/ChatBox/components/ChatController.tsx index 10d5ed831a64..474d593910c5 100644 --- a/projects/app/src/components/ChatBox/components/ChatController.tsx +++ b/projects/app/src/components/ChatBox/components/ChatController.tsx @@ -2,21 +2,18 @@ import { useCopyData } from '@/web/common/hooks/useCopyData'; import { useAudioPlay } from '@/web/common/utils/voice'; import { Flex, FlexProps, Image, css, useTheme } from '@chakra-ui/react'; import { ChatSiteItemType } from '@fastgpt/global/core/chat/type'; -import { AppTTSConfigType } from '@fastgpt/global/core/module/type'; -import { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat'; import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; -import React from 'react'; +import React, { useMemo } from 'react'; import { useTranslation } from 'next-i18next'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { formatChatValue2InputType } from '../utils'; import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants'; +import { useChatProviderStore } from '../Provider'; export type ChatControllerProps = { - isChatting: boolean; + isLastChild: boolean; chat: ChatSiteItemType; - setChatHistories?: React.Dispatch<React.SetStateAction<ChatSiteItemType[]>>; showVoiceIcon?: boolean; - ttsConfig?: AppTTSConfigType; onRetry?: () => void; onDelete?: () => void; onMark?: () => void; @@ -27,33 +24,29 @@ export type ChatControllerProps = { }; const ChatController = ({ - isChatting, chat, - setChatHistories, + isLastChild, showVoiceIcon, - ttsConfig, onReadUserDislike, onCloseUserLike, onMark, onRetry, onDelete, onAddUserDislike, - onAddUserLike, - shareId, - outLinkUid, - teamId, - teamToken -}: OutLinkChatAuthProps & ChatControllerProps & FlexProps) => { + onAddUserLike +}: ChatControllerProps & FlexProps) => { const theme = useTheme(); - const { t } = useTranslation(); - const { copyData } = useCopyData(); - const { audioLoading, audioPlaying, hasAudio, playAudio, cancelAudio } = useAudioPlay({ - ttsConfig, - shareId, - outLinkUid, - teamId, - teamToken - }); + const { + isChatting, + setChatHistories, + audioLoading, + audioPlaying, + hasAudio, + playAudioByText, + cancelAudio, + audioPlayingChatId, + setAudioPlayingChatId + } = useChatProviderStore(); const controlIconStyle = { w: '14px', cursor: 'pointer', @@ -67,6 +60,11 @@ const ChatController = ({ display: 'flex' }; + const { t } = useTranslation(); + const { copyData } = useCopyData(); + + const chatText = useMemo(() => formatChatValue2InputType(chat.value).text || '', [chat.value]); + return ( <Flex {...controlContainerStyle} @@ -86,7 +84,7 @@ const ChatController = ({ {...controlIconStyle} name={'copy'} _hover={{ color: 'primary.600' }} - onClick={() => copyData(formatChatValue2InputType(chat.value).text || '')} + onClick={() => copyData(chatText)} /> </MyTooltip> {!!onDelete && !isChatting && ( @@ -113,51 +111,65 @@ const ChatController = ({ )} {showVoiceIcon && hasAudio && - (audioLoading ? ( - <MyTooltip label={t('common.Loading')}> - <MyIcon {...controlIconStyle} name={'common/loading'} /> - </MyTooltip> - ) : audioPlaying ? ( - <Flex alignItems={'center'}> - <MyTooltip label={t('core.chat.tts.Stop Speech')}> + (() => { + const isPlayingChat = chat.dataId === audioPlayingChatId; + if (isPlayingChat && audioPlaying) { + return ( + <Flex alignItems={'center'}> + <MyTooltip label={t('core.chat.tts.Stop Speech')}> + <MyIcon + {...controlIconStyle} + borderRight={'none'} + name={'core/chat/stopSpeech'} + color={'#E74694'} + onClick={cancelAudio} + /> + </MyTooltip> + <Image + src="/icon/speaking.gif" + w={'23px'} + alt={''} + borderRight={theme.borders.base} + /> + </Flex> + ); + } + if (isPlayingChat && audioLoading) { + return ( + <MyTooltip label={t('common.Loading')}> + <MyIcon {...controlIconStyle} name={'common/loading'} /> + </MyTooltip> + ); + } + return ( + <MyTooltip label={t('core.app.TTS start')}> <MyIcon {...controlIconStyle} - borderRight={'none'} - name={'core/chat/stopSpeech'} - color={'#E74694'} - onClick={() => cancelAudio()} + name={'common/voiceLight'} + _hover={{ color: '#E74694' }} + onClick={async () => { + setAudioPlayingChatId(chat.dataId); + const response = await playAudioByText({ + buffer: chat.ttsBuffer, + text: chatText + }); + + if (!setChatHistories || !response.buffer) return; + setChatHistories((state) => + state.map((item) => + item.dataId === chat.dataId + ? { + ...item, + ttsBuffer: response.buffer + } + : item + ) + ); + }} /> </MyTooltip> - <Image src="/icon/speaking.gif" w={'23px'} alt={''} borderRight={theme.borders.base} /> - </Flex> - ) : ( - <MyTooltip label={t('core.app.TTS')}> - <MyIcon - {...controlIconStyle} - name={'common/voiceLight'} - _hover={{ color: '#E74694' }} - onClick={async () => { - const response = await playAudio({ - buffer: chat.ttsBuffer, - chatItemId: chat.dataId, - text: formatChatValue2InputType(chat.value).text || '' - }); - - if (!setChatHistories || !response.buffer) return; - setChatHistories((state) => - state.map((item) => - item.dataId === chat.dataId - ? { - ...item, - ttsBuffer: response.buffer - } - : item - ) - ); - }} - /> - </MyTooltip> - ))} + ); + })()} {!!onMark && ( <MyTooltip label={t('core.chat.Mark')}> <MyIcon diff --git a/projects/app/src/components/ChatBox/components/ChatItem.tsx b/projects/app/src/components/ChatBox/components/ChatItem.tsx index db05ad7213b5..2b14e05db634 100644 --- a/projects/app/src/components/ChatBox/components/ChatItem.tsx +++ b/projects/app/src/components/ChatBox/components/ChatItem.tsx @@ -25,6 +25,7 @@ import { ChatStatusEnum } from '@fastgpt/global/core/chat/constants'; import FilesBlock from './FilesBox'; +import { useChatProviderStore } from '../Provider'; const colorMap = { [ChatStatusEnum.loading]: { @@ -56,11 +57,9 @@ const ChatItem = ({ status: `${ChatStatusEnum}`; name: string; }; - isLastChild?: boolean; questionGuides?: string[]; children?: React.ReactNode; } & ChatControllerProps) => { - const theme = useTheme(); const styleMap: BoxProps = type === ChatRoleEnum.Human ? { @@ -77,7 +76,9 @@ const ChatItem = ({ textAlign: 'left', bg: 'myGray.50' }; - const { chat, isChatting } = chatControllerProps; + + const { isChatting } = useChatProviderStore(); + const { chat } = chatControllerProps; const ContentCard = useMemo(() => { if (type === 'Human') { @@ -209,7 +210,7 @@ ${toolResponse}`} <Flex w={'100%'} alignItems={'center'} gap={2} justifyContent={styleMap.justifyContent}> {isChatting && type === ChatRoleEnum.AI && isLastChild ? null : ( <Box order={styleMap.order} ml={styleMap.ml}> - <ChatController {...chatControllerProps} /> + <ChatController {...chatControllerProps} isLastChild={isLastChild} /> </Box> )} <ChatAvatar src={avatar} type={type} /> diff --git a/projects/app/src/components/ChatBox/components/VariableInput.tsx b/projects/app/src/components/ChatBox/components/VariableInput.tsx index e00f32d44ef8..852a6ae0a833 100644 --- a/projects/app/src/components/ChatBox/components/VariableInput.tsx +++ b/projects/app/src/components/ChatBox/components/VariableInput.tsx @@ -1,4 +1,4 @@ -import { VariableItemType } from '@fastgpt/global/core/module/type'; +import { VariableItemType } from '@fastgpt/global/core/app/type.d'; import React, { useState } from 'react'; import { UseFormReturn } from 'react-hook-form'; import { useTranslation } from 'next-i18next'; diff --git a/projects/app/src/components/ChatBox/constants.ts b/projects/app/src/components/ChatBox/constants.ts index 34ce6f695934..c58033b38074 100644 --- a/projects/app/src/components/ChatBox/constants.ts +++ b/projects/app/src/components/ChatBox/constants.ts @@ -11,3 +11,9 @@ export const MessageCardStyle: BoxProps = { maxW: ['calc(100% - 25px)', 'calc(100% - 40px)'], color: 'myGray.900' }; + +export enum FeedbackTypeEnum { + user = 'user', + admin = 'admin', + hidden = 'hidden' +} diff --git a/projects/app/src/components/ChatBox/index.tsx b/projects/app/src/components/ChatBox/index.tsx index ca0ca1c69bc7..5f6fea01e7b9 100644 --- a/projects/app/src/components/ChatBox/index.tsx +++ b/projects/app/src/components/ChatBox/index.tsx @@ -11,7 +11,6 @@ import React, { import Script from 'next/script'; import { throttle } from 'lodash'; import type { - AIChatItemType, AIChatItemValueItemType, ChatSiteItemType, UserChatItemValueItemType @@ -39,7 +38,6 @@ import type { AdminMarkType } from './SelectMarkCollection'; import MyTooltip from '../MyTooltip'; import { postQuestionGuide } from '@/web/core/ai/api'; -import { splitGuideModule } from '@fastgpt/global/core/module/utils'; import type { generatingMessageProps, StartChatFnProps, @@ -55,6 +53,8 @@ import { ChatItemValueTypeEnum, ChatRoleEnum } from '@fastgpt/global/core/chat/c import { formatChatValue2InputType } from './utils'; import { textareaMinH } from './constants'; import { SseResponseEventEnum } from '@fastgpt/global/core/module/runtime/constants'; +import ChatProvider, { useChatProviderStore } from './Provider'; + import ChatItem from './components/ChatItem'; import dynamic from 'next/dynamic'; @@ -82,9 +82,9 @@ type Props = OutLinkChatAuthProps & { userGuideModule?: ModuleItemType; showFileSelector?: boolean; active?: boolean; // can use + appId: string; // not chat test params - appId?: string; chatId?: string; onUpdateVariable?: (e: Record<string, any>) => void; @@ -112,7 +112,6 @@ const ChatBox = ( showEmptyIntro = false, appAvatar, userAvatar, - userGuideModule, showFileSelector, active = true, appId, @@ -137,7 +136,6 @@ const ChatBox = ( const questionGuideController = useRef(new AbortController()); const isNewChatReplace = useRef(false); - const [chatHistories, setChatHistories] = useState<ChatSiteItemType[]>([]); const [feedbackId, setFeedbackId] = useState<string>(); const [readFeedbackData, setReadFeedbackData] = useState<{ chatItemId: string; @@ -146,17 +144,20 @@ const ChatBox = ( const [adminMarkData, setAdminMarkData] = useState<AdminMarkType & { chatItemId: string }>(); const [questionGuides, setQuestionGuide] = useState<string[]>([]); - const isChatting = useMemo( - () => - chatHistories[chatHistories.length - 1] && - chatHistories[chatHistories.length - 1]?.status !== 'finish', - [chatHistories] - ); + const { + welcomeText, + variableModules, + questionGuide, + startSegmentedAudio, + finishSegmentedAudio, + setAudioPlayingChatId, + splitText2Audio, + chatHistories, + setChatHistories, + isChatting + } = useChatProviderStore(); - const { welcomeText, variableModules, questionGuide, ttsConfig } = useMemo( - () => splitGuideModule(userGuideModule), - [userGuideModule] - ); + /* variable */ const filterVariableModules = useMemo( () => variableModules.filter((item) => item.type !== VariableInputEnum.external), [variableModules] @@ -171,10 +172,9 @@ const ChatBox = ( chatStarted: false } }); - const { setValue, watch, handleSubmit, control } = chatForm; + const { setValue, watch, handleSubmit } = chatForm; const variables = watch('variables'); const chatStarted = watch('chatStarted'); - const variableIsFinish = useMemo(() => { if (!filterVariableModules || filterVariableModules.length === 0 || chatHistories.length > 0) return true; @@ -212,12 +212,21 @@ const ChatBox = ( ); // eslint-disable-next-line react-hooks/exhaustive-deps const generatingMessage = useCallback( - ({ event, text = '', status, name, tool }: generatingMessageProps) => { + ({ + event, + text = '', + status, + name, + tool, + autoTTSResponse + }: generatingMessageProps & { autoTTSResponse?: boolean }) => { setChatHistories((state) => state.map((item, index) => { if (index !== state.length - 1) return item; if (item.obj !== ChatRoleEnum.AI) return item; + autoTTSResponse && splitText2Audio(formatChatValue2InputType(item.value).text || ''); + const lastValue: AIChatItemValueItemType = JSON.parse( JSON.stringify(item.value[item.value.length - 1]) ); @@ -299,7 +308,7 @@ const ChatBox = ( ); generatingScroll(); }, - [generatingScroll] + [generatingScroll, setChatHistories, splitText2Audio] ); // 重置输入内容 @@ -357,8 +366,10 @@ const ChatBox = ( ({ text = '', files = [], - history = chatHistories + history = chatHistories, + autoTTSResponse = false }: ChatBoxInputType & { + autoTTSResponse?: boolean; history?: ChatSiteItemType[]; }) => { handleSubmit(async ({ variables }) => { @@ -370,7 +381,7 @@ const ChatBox = ( }); return; } - questionGuideController.current?.abort('stop'); + text = text.trim(); if (!text && files.length === 0) { @@ -381,6 +392,15 @@ const ChatBox = ( return; } + const responseChatId = getNanoid(24); + questionGuideController.current?.abort('stop'); + + // set auto audio playing + if (autoTTSResponse) { + await startSegmentedAudio(); + setAudioPlayingChatId(responseChatId); + } + const newChatList: ChatSiteItemType[] = [ ...history, { @@ -409,7 +429,7 @@ const ChatBox = ( status: 'finish' }, { - dataId: getNanoid(24), + dataId: responseChatId, obj: ChatRoleEnum.AI, value: [ { @@ -447,7 +467,7 @@ const ChatBox = ( chatList: newChatList, messages, controller: abortSignal, - generatingMessage, + generatingMessage: (e) => generatingMessage({ ...e, autoTTSResponse }), variables }); @@ -485,6 +505,9 @@ const ChatBox = ( generatingScroll(); isPc && TextareaDom.current?.focus(); }, 100); + + // tts audio + autoTTSResponse && splitText2Audio(responseText, true); } catch (err: any) { toast({ title: t(getErrText(err, 'core.chat.error.Chat error')), @@ -509,11 +532,14 @@ const ChatBox = ( }) ); } + + autoTTSResponse && finishSegmentedAudio(); })(); }, [ chatHistories, createQuestionGuide, + finishSegmentedAudio, generatingMessage, generatingScroll, handleSubmit, @@ -521,6 +547,10 @@ const ChatBox = ( isPc, onStartChat, resetInputVal, + setAudioPlayingChatId, + setChatHistories, + splitText2Audio, + startSegmentedAudio, t, toast ] @@ -875,9 +905,9 @@ const ChatBox = ( type={item.obj} avatar={item.obj === 'Human' ? userAvatar : appAvatar} chat={item} - isChatting={isChatting} onRetry={retryInput(item.dataId)} onDelete={delOneMessage(item.dataId)} + isLastChild={index === chatHistories.length - 1} /> )} {item.obj === 'AI' && ( @@ -886,17 +916,14 @@ const ChatBox = ( type={item.obj} avatar={appAvatar} chat={item} - isChatting={isChatting} + isLastChild={index === chatHistories.length - 1} {...(item.obj === 'AI' && { - setChatHistories, showVoiceIcon, - ttsConfig, shareId, outLinkUid, teamId, teamToken, statusBoxData, - isLastChild: index === chatHistories.length - 1, questionGuides, onMark: onMark( item, @@ -957,15 +984,11 @@ const ChatBox = ( <MessageInput onSendMessage={sendPrompt} onStop={() => chatController.current?.abort('stop')} - isChatting={isChatting} TextareaDom={TextareaDom} resetInputVal={resetInputVal} showFileSelector={showFileSelector} - shareId={shareId} - outLinkUid={outLinkUid} - teamId={teamId} - teamToken={teamToken} chatForm={chatForm} + appId={appId} /> )} {/* user feedback modal */} @@ -1063,5 +1086,14 @@ const ChatBox = ( </Flex> ); }; +const ForwardChatBox = forwardRef(ChatBox); + +const ChatBoxContainer = (props: Props, ref: ForwardedRef<ComponentRef>) => { + return ( + <ChatProvider {...props}> + <ForwardChatBox {...props} ref={ref} /> + </ChatProvider> + ); +}; -export default React.memo(forwardRef(ChatBox)); +export default React.memo(forwardRef(ChatBoxContainer)); diff --git a/projects/app/src/components/core/ai/SettingLLMModel/index.tsx b/projects/app/src/components/core/ai/SettingLLMModel/index.tsx index e206752ca9bf..f2e334cbfa22 100644 --- a/projects/app/src/components/core/ai/SettingLLMModel/index.tsx +++ b/projects/app/src/components/core/ai/SettingLLMModel/index.tsx @@ -55,7 +55,7 @@ const SettingLLMModel = ({ llmModelType = LLMModelTypeEnum.all, defaultData, onC leftIcon={ <Avatar borderRadius={'0'} - src={selectedModel.avatar || HUGGING_FACE_ICON} + src={selectedModel?.avatar || HUGGING_FACE_ICON} fallbackSrc={HUGGING_FACE_ICON} w={'18px'} /> diff --git a/projects/app/src/components/core/module/Flow/components/modules/QGSwitch.tsx b/projects/app/src/components/core/app/QGSwitch.tsx similarity index 100% rename from projects/app/src/components/core/module/Flow/components/modules/QGSwitch.tsx rename to projects/app/src/components/core/app/QGSwitch.tsx diff --git a/projects/app/src/components/core/module/Flow/components/modules/TTSSelect.tsx b/projects/app/src/components/core/app/TTSSelect.tsx similarity index 94% rename from projects/app/src/components/core/module/Flow/components/modules/TTSSelect.tsx rename to projects/app/src/components/core/app/TTSSelect.tsx index 47818a0ea97b..777c18286d9b 100644 --- a/projects/app/src/components/core/module/Flow/components/modules/TTSSelect.tsx +++ b/projects/app/src/components/core/app/TTSSelect.tsx @@ -5,7 +5,7 @@ import { Box, Button, Flex, ModalBody, useDisclosure, Image } from '@chakra-ui/r import React, { useCallback, useMemo } from 'react'; import { useTranslation } from 'next-i18next'; import { TTSTypeEnum } from '@/constants/app'; -import type { AppTTSConfigType } from '@fastgpt/global/core/module/type.d'; +import type { AppTTSConfigType } from '@fastgpt/global/core/app/type.d'; import { useAudioPlay } from '@/web/common/utils/voice'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import MyModal from '@fastgpt/web/components/common/MyModal'; @@ -46,7 +46,9 @@ const TTSSelect = ({ [formatValue, list, t] ); - const { playAudio, cancelAudio, audioLoading, audioPlaying } = useAudioPlay({ ttsConfig: value }); + const { playAudioByText, cancelAudio, audioLoading, audioPlaying } = useAudioPlay({ + ttsConfig: value + }); const onclickChange = useCallback( (e: string) => { @@ -137,9 +139,7 @@ const TTSSelect = ({ color={'primary.600'} isLoading={audioLoading} leftIcon={<MyIcon name={'core/chat/stopSpeech'} w={'16px'} />} - onClick={() => { - cancelAudio(); - }} + onClick={cancelAudio} > {t('core.chat.tts.Stop Speech')} </Button> @@ -149,7 +149,7 @@ const TTSSelect = ({ isLoading={audioLoading} leftIcon={<MyIcon name={'core/app/headphones'} w={'16px'} />} onClick={() => { - playAudio({ + playAudioByText({ text: t('core.app.tts.Test Listen Text') }); }} diff --git a/projects/app/src/components/core/module/Flow/components/modules/VariableEdit.tsx b/projects/app/src/components/core/app/VariableEdit.tsx similarity index 99% rename from projects/app/src/components/core/module/Flow/components/modules/VariableEdit.tsx rename to projects/app/src/components/core/app/VariableEdit.tsx index fb3ea556e454..c2601c082606 100644 --- a/projects/app/src/components/core/module/Flow/components/modules/VariableEdit.tsx +++ b/projects/app/src/components/core/app/VariableEdit.tsx @@ -26,7 +26,7 @@ import { } from '@chakra-ui/react'; import { QuestionOutlineIcon, SmallAddIcon } from '@chakra-ui/icons'; import { VariableInputEnum, variableMap } from '@fastgpt/global/core/module/constants'; -import type { VariableItemType } from '@fastgpt/global/core/module/type.d'; +import type { VariableItemType } from '@fastgpt/global/core/app/type.d'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useForm } from 'react-hook-form'; import { useFieldArray } from 'react-hook-form'; diff --git a/projects/app/src/components/core/app/WhisperConfig.tsx b/projects/app/src/components/core/app/WhisperConfig.tsx new file mode 100644 index 000000000000..989c7c975e86 --- /dev/null +++ b/projects/app/src/components/core/app/WhisperConfig.tsx @@ -0,0 +1,116 @@ +import MyIcon from '@fastgpt/web/components/common/Icon'; +import MyTooltip from '@/components/MyTooltip'; +import { Box, Button, Flex, ModalBody, useDisclosure, Switch } from '@chakra-ui/react'; +import React, { useMemo } from 'react'; +import { useTranslation } from 'next-i18next'; +import type { AppWhisperConfigType } from '@fastgpt/global/core/app/type.d'; +import MyModal from '@fastgpt/web/components/common/MyModal'; +import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; + +const WhisperConfig = ({ + isOpenAudio, + value, + onChange +}: { + isOpenAudio: boolean; + value: AppWhisperConfigType; + onChange: (e: AppWhisperConfigType) => void; +}) => { + const { t } = useTranslation(); + const { isOpen, onOpen, onClose } = useDisclosure(); + + const isOpenWhisper = value.open; + const isAutoSend = value.autoSend; + + const formLabel = useMemo(() => { + if (!isOpenWhisper) { + return t('core.app.whisper.Close'); + } + return t('core.app.whisper.Open'); + }, [t, isOpenWhisper]); + + return ( + <Flex alignItems={'center'}> + <MyIcon name={'core/app/simpleMode/whisper'} mr={2} w={'20px'} /> + <Box>{t('core.app.Whisper')}</Box> + <Box flex={1} /> + <MyTooltip label={t('core.app.Config whisper')}> + <Button + variant={'transparentBase'} + iconSpacing={1} + size={'sm'} + fontSize={'md'} + mr={'-5px'} + onClick={onOpen} + > + {formLabel} + </Button> + </MyTooltip> + <MyModal + title={t('core.app.Whisper config')} + iconSrc="core/app/simpleMode/whisper" + isOpen={isOpen} + onClose={onClose} + > + <ModalBody px={[5, 16]} py={[4, 8]}> + <Flex justifyContent={'space-between'} alignItems={'center'}> + {t('core.app.whisper.Switch')} + <Switch + isChecked={isOpenWhisper} + size={'lg'} + onChange={(e) => { + onChange({ + ...value, + open: e.target.checked + }); + }} + /> + </Flex> + {isOpenWhisper && ( + <Flex mt={8} alignItems={'center'}> + {t('core.app.whisper.Auto send')} + <QuestionTip label={t('core.app.whisper.Auto send tip')} /> + <Box flex={'1 0 0'} /> + <Switch + isChecked={value.autoSend} + size={'lg'} + onChange={(e) => { + onChange({ + ...value, + autoSend: e.target.checked + }); + }} + /> + </Flex> + )} + {isOpenWhisper && isAutoSend && ( + <> + <Flex mt={8} alignItems={'center'}> + {t('core.app.whisper.Auto tts response')} + <QuestionTip label={t('core.app.whisper.Auto tts response tip')} /> + <Box flex={'1 0 0'} /> + <Switch + isChecked={value.autoTTSResponse} + size={'lg'} + onChange={(e) => { + onChange({ + ...value, + autoTTSResponse: e.target.checked + }); + }} + /> + </Flex> + {!isOpenAudio && ( + <Box mt={1} color={'myGray.600'} fontSize={'sm'}> + {t('core.app.whisper.Not tts tip')} + </Box> + )} + </> + )} + </ModalBody> + </MyModal> + </Flex> + ); +}; + +export default React.memo(WhisperConfig); diff --git a/projects/app/src/components/core/module/Flow/ChatTest.tsx b/projects/app/src/components/core/module/Flow/ChatTest.tsx index 65b1859b5761..c11eb1e19431 100644 --- a/projects/app/src/components/core/module/Flow/ChatTest.tsx +++ b/projects/app/src/components/core/module/Flow/ChatTest.tsx @@ -121,6 +121,7 @@ const ChatTest = ( <Box flex={1}> <ChatBox ref={ChatBoxRef} + appId={app._id} appAvatar={app.avatar} userAvatar={userInfo?.avatar} showMarkIcon diff --git a/projects/app/src/components/core/module/Flow/components/nodes/NodeLaf.tsx b/projects/app/src/components/core/module/Flow/components/nodes/NodeLaf.tsx index 1da75d8efa5c..d03d64968e99 100644 --- a/projects/app/src/components/core/module/Flow/components/nodes/NodeLaf.tsx +++ b/projects/app/src/components/core/module/Flow/components/nodes/NodeLaf.tsx @@ -16,13 +16,17 @@ import { useSystemStore } from '@/web/common/system/useSystemStore'; import { ChevronRightIcon } from '@chakra-ui/icons'; import { useQuery } from '@tanstack/react-query'; import dynamic from 'next/dynamic'; -import { FlowNodeInputTypeEnum } from '@fastgpt/global/core/module/node/constant'; +import { + FlowNodeInputTypeEnum, + FlowNodeOutputTypeEnum +} from '@fastgpt/global/core/module/node/constant'; import { useToast } from '@fastgpt/web/hooks/useToast'; import Divider from '../modules/Divider'; import RenderToolInput from '../render/RenderToolInput'; import RenderInput from '../render/RenderInput'; import RenderOutput from '../render/RenderOutput'; import { getErrText } from '@fastgpt/global/common/error/utils'; +import { useRequest } from '@fastgpt/web/hooks/useRequest'; const LafAccountModal = dynamic(() => import('@/components/support/laf/LafAccountModal')); @@ -31,7 +35,7 @@ const NodeLaf = (props: NodeProps<FlowModuleItemType>) => { const { toast } = useToast(); const { feConfigs } = useSystemStore(); const { data, selected } = props; - const { moduleId, inputs } = data; + const { moduleId, inputs, outputs } = data; const requestUrl = inputs.find((item) => item.key === ModuleInputKeyEnum.httpReqUrl); @@ -49,7 +53,11 @@ const NodeLaf = (props: NodeProps<FlowModuleItemType>) => { ); } - const { data: lafData, isLoading: isLoadingFunctions } = useQuery( + const { + data: lafData, + isLoading: isLoadingFunctions, + refetch: refetchFunction + } = useQuery( ['getLafFunctionList'], async () => { // load laf app detail @@ -94,61 +102,99 @@ const NodeLaf = (props: NodeProps<FlowModuleItemType>) => { [lafFunctionSelectList, requestUrl?.value] ); - const onSyncParams = useCallback(() => { - const lafFunction = lafData?.lafFunctions.find((item) => item.requestUrl === selectedFunction); + const { mutate: onSyncParams, isLoading: isSyncing } = useRequest({ + mutationFn: async () => { + await refetchFunction(); + const lafFunction = lafData?.lafFunctions.find( + (item) => item.requestUrl === selectedFunction + ); - if (!lafFunction) return; + if (!lafFunction) return; - const bodyParams = - lafFunction?.request?.content?.['application/json']?.schema?.properties || {}; + const bodyParams = + lafFunction?.request?.content?.['application/json']?.schema?.properties || {}; - const requiredParams = - lafFunction?.request?.content?.['application/json']?.schema?.required || []; + const requiredParams = + lafFunction?.request?.content?.['application/json']?.schema?.required || []; - const allParams = [ - ...Object.keys(bodyParams).map((key) => ({ - name: key, - desc: bodyParams[key].description, - required: requiredParams?.includes(key) || false, - value: `{{${key}}}`, - type: 'string' - })) - ].filter((item) => !inputs.find((input) => input.key === item.name)); + const allParams = [ + ...Object.keys(bodyParams).map((key) => ({ + name: key, + desc: bodyParams[key].description, + required: requiredParams?.includes(key) || false, + value: `{{${key}}}`, + type: 'string' + })) + ].filter((item) => !inputs.find((input) => input.key === item.name)); - // add params - allParams.forEach((param) => { - onChangeNode({ - moduleId, - type: 'addInput', - key: param.name, - value: { + // add params + allParams.forEach((param) => { + onChangeNode({ + moduleId, + type: 'addInput', key: param.name, - valueType: ModuleIOValueTypeEnum.string, - label: param.name, - type: FlowNodeInputTypeEnum.target, - required: param.required, - description: param.desc || '', - toolDescription: param.desc || '未设置参数描述', - edit: true, - editField: { - key: true, - name: true, - description: true, - required: true, - dataType: true, - inputType: true, - isToolInput: true - }, - connected: false - } + value: { + key: param.name, + valueType: ModuleIOValueTypeEnum.string, + label: param.name, + type: FlowNodeInputTypeEnum.target, + required: param.required, + description: param.desc || '', + toolDescription: param.desc || '未设置参数描述', + edit: true, + editField: { + key: true, + name: true, + description: true, + required: true, + dataType: true, + inputType: true, + isToolInput: true + }, + connected: false + } + }); }); - }); - toast({ - status: 'success', - title: t('common.Sync success') - }); - }, [inputs, lafData?.lafFunctions, moduleId, selectedFunction, t, toast]); + const responseParams = + lafFunction?.response?.default.content?.['application/json'].schema.properties || {}; + const requiredResponseParams = + lafFunction?.response?.default.content?.['application/json'].schema.required || []; + + const allResponseParams = [ + ...Object.keys(responseParams).map((key) => ({ + valueType: responseParams[key].type, + name: key, + desc: responseParams[key].description, + required: requiredResponseParams?.includes(key) || false + })) + ].filter((item) => !outputs.find((output) => output.key === item.name)); + allResponseParams.forEach((param) => { + onChangeNode({ + moduleId, + type: 'addOutput', + key: param.name, + value: { + key: param.name, + valueType: param.valueType, + label: param.name, + type: FlowNodeOutputTypeEnum.source, + required: param.required, + description: param.desc || '', + edit: true, + editField: { + key: true, + description: true, + dataType: true, + defaultValue: true + }, + targets: [] + } + }); + }); + }, + successToast: t('common.Sync success') + }); return ( <NodeCard minW={'350px'} selected={selected} {...data}> @@ -174,9 +220,9 @@ const NodeLaf = (props: NodeProps<FlowModuleItemType>) => { {/* auto set params and go to edit */} {!!selectedFunction && ( <Flex justifyContent={'flex-end'} mt={2} gap={2}> - {/* <Button variant={'whiteBase'} size={'sm'} onClick={onSyncParams}> + <Button isLoading={isSyncing} variant={'grayBase'} size={'sm'} onClick={onSyncParams}> {t('core.module.Laf sync params')} - </Button> */} + </Button> <Button variant={'grayBase'} size={'sm'} diff --git a/projects/app/src/components/core/module/Flow/components/nodes/NodeUserGuide.tsx b/projects/app/src/components/core/module/Flow/components/nodes/NodeUserGuide.tsx index 32764e11c244..b78a1cb385bf 100644 --- a/projects/app/src/components/core/module/Flow/components/nodes/NodeUserGuide.tsx +++ b/projects/app/src/components/core/module/Flow/components/nodes/NodeUserGuide.tsx @@ -7,14 +7,14 @@ import { ModuleInputKeyEnum } from '@fastgpt/global/core/module/constants'; import { welcomeTextTip } from '@fastgpt/global/core/module/template/tip'; import { onChangeNode } from '../../FlowProvider'; -import VariableEdit from '../modules/VariableEdit'; +import VariableEdit from '../../../../app/VariableEdit'; import MyIcon from '@fastgpt/web/components/common/Icon'; import MyTooltip from '@/components/MyTooltip'; import Container from '../modules/Container'; import NodeCard from '../render/NodeCard'; -import type { VariableItemType } from '@fastgpt/global/core/module/type.d'; -import QGSwitch from '@/components/core/module/Flow/components/modules/QGSwitch'; -import TTSSelect from '@/components/core/module/Flow/components/modules/TTSSelect'; +import type { VariableItemType } from '@fastgpt/global/core/app/type.d'; +import QGSwitch from '@/components/core/app/QGSwitch'; +import TTSSelect from '@/components/core/app/TTSSelect'; import { splitGuideModule } from '@fastgpt/global/core/module/utils'; import { useTranslation } from 'next-i18next'; diff --git a/projects/app/src/global/core/chat/api.d.ts b/projects/app/src/global/core/chat/api.d.ts index 49be7d81a12d..483f48c6d077 100644 --- a/projects/app/src/global/core/chat/api.d.ts +++ b/projects/app/src/global/core/chat/api.d.ts @@ -1,4 +1,4 @@ -import type { AppTTSConfigType } from '@fastgpt/global/core/module/type.d'; +import type { AppTTSConfigType } from '@fastgpt/global/core/app/type.d'; import { ModuleItemType } from '../module/type'; import { AdminFbkType, ChatItemType } from '@fastgpt/global/core/chat/type'; import type { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat.d'; diff --git a/projects/app/src/pages/api/core/chat/item/getSpeech.ts b/projects/app/src/pages/api/core/chat/item/getSpeech.ts index f8f6450ac0a3..012e9b5fc3de 100644 --- a/projects/app/src/pages/api/core/chat/item/getSpeech.ts +++ b/projects/app/src/pages/api/core/chat/item/getSpeech.ts @@ -12,7 +12,6 @@ import { MongoTTSBuffer } from '@fastgpt/service/common/buffer/tts/schema'; /* 1. get tts from chatItem store 2. get tts from ai -3. save tts to chatItem store if chatItemId is provided 4. push bill */ @@ -34,6 +33,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) throw new Error('voice not found'); } + /* get audio from buffer */ const ttsBuffer = await MongoTTSBuffer.findOne( { bufferId: voiceData.bufferId, @@ -46,6 +46,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) return res.end(new Uint8Array(ttsBuffer.buffer.buffer)); } + /* request audio */ await text2Speech({ res, input, @@ -54,6 +55,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) speed: ttsConfig.speed, onSuccess: async ({ model, buffer }) => { try { + /* bill */ pushAudioSpeechUsage({ model: model, charsLength: input.length, @@ -62,6 +64,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) source: authType2UsageSource({ authType }) }); + /* create buffer */ await MongoTTSBuffer.create({ bufferId: voiceData.bufferId, text: JSON.stringify({ text: input, speed: ttsConfig.speed }), diff --git a/projects/app/src/pages/api/v1/audio/transcriptions.ts b/projects/app/src/pages/api/v1/audio/transcriptions.ts index fd3cb7861ff0..a10f8176ce88 100644 --- a/projects/app/src/pages/api/v1/audio/transcriptions.ts +++ b/projects/app/src/pages/api/v1/audio/transcriptions.ts @@ -7,6 +7,8 @@ import fs from 'fs'; import { getAIApi } from '@fastgpt/service/core/ai/config'; import { pushWhisperUsage } from '@/service/support/wallet/usage/push'; import { authChatCert } from '@/service/support/permission/auth/chat'; +import { MongoApp } from '@fastgpt/service/core/app/schema'; +import { getGuideModule, splitGuideModule } from '@fastgpt/global/core/module/utils'; const upload = getUploadModel({ maxSize: 2 @@ -18,8 +20,9 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex try { const { file, - data: { duration, teamId: spaceTeamId, teamToken } + data: { appId, duration, teamId: spaceTeamId, teamToken } } = await upload.doUpload<{ + appId: string; duration: number; shareId?: string; teamId?: string; @@ -31,8 +34,6 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex filePaths = [file.path]; - const { teamId, tmbId } = await authChatCert({ req, authToken: true }); - if (!global.whisperModel) { throw new Error('whisper model not found'); } @@ -41,6 +42,18 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex throw new Error('file not found'); } + // auth role + const { teamId, tmbId } = await authChatCert({ req, authToken: true }); + // auth app + const app = await MongoApp.findById(appId, 'modules').lean(); + if (!app) { + throw new Error('app not found'); + } + const { whisperConfig } = splitGuideModule(getGuideModule(app?.modules)); + if (!whisperConfig?.open) { + throw new Error('Whisper is not open in the app'); + } + const ai = getAIApi(); const result = await ai.audio.transcriptions.create({ diff --git a/projects/app/src/pages/app/detail/components/Logs.tsx b/projects/app/src/pages/app/detail/components/Logs.tsx index 0d00ea81da56..63576f1da491 100644 --- a/projects/app/src/pages/app/detail/components/Logs.tsx +++ b/projects/app/src/pages/app/detail/components/Logs.tsx @@ -32,6 +32,7 @@ import MyBox from '@/components/common/MyBox'; import { usePagination } from '@fastgpt/web/hooks/usePagination'; import DateRangePicker, { DateRangeType } from '@fastgpt/web/components/common/DateRangePicker'; import { formatChatValue2InputType } from '@/components/ChatBox/utils'; +import { getNanoid } from '@fastgpt/global/common/string/tools'; const Logs = ({ appId }: { appId: string }) => { const { t } = useTranslation(); @@ -234,6 +235,7 @@ const DetailLogsModal = ({ onSuccess(res) { const history = res.history.map((item) => ({ ...item, + dataId: item.dataId || getNanoid(), status: 'finish' as any })); ChatBoxRef.current?.resetHistory(history); diff --git a/projects/app/src/pages/app/detail/components/SimpleEdit/ChatTest.tsx b/projects/app/src/pages/app/detail/components/SimpleEdit/ChatTest.tsx index d5929d1422b2..9911ef7fd141 100644 --- a/projects/app/src/pages/app/detail/components/SimpleEdit/ChatTest.tsx +++ b/projects/app/src/pages/app/detail/components/SimpleEdit/ChatTest.tsx @@ -99,6 +99,7 @@ const ChatTest = ({ appId }: { appId: string }) => { <Box flex={1}> <ChatBox ref={ChatBoxRef} + appId={appDetail._id} appAvatar={appDetail.avatar} userAvatar={userInfo?.avatar} showMarkIcon diff --git a/projects/app/src/pages/app/detail/components/SimpleEdit/EditForm.tsx b/projects/app/src/pages/app/detail/components/SimpleEdit/EditForm.tsx index 789255419976..c3f2c88d103c 100644 --- a/projects/app/src/pages/app/detail/components/SimpleEdit/EditForm.tsx +++ b/projects/app/src/pages/app/detail/components/SimpleEdit/EditForm.tsx @@ -6,7 +6,7 @@ import { useForm, useFieldArray } from 'react-hook-form'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { appModules2Form, getDefaultAppForm } from '@fastgpt/global/core/app/utils'; import type { AppSimpleEditFormType } from '@fastgpt/global/core/app/type.d'; -import { chatNodeSystemPromptTip, welcomeTextTip } from '@fastgpt/global/core/module/template/tip'; +import { welcomeTextTip } from '@fastgpt/global/core/module/template/tip'; import { useRequest } from '@fastgpt/web/hooks/useRequest'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; import { useRouter } from 'next/router'; @@ -20,7 +20,7 @@ import dynamic from 'next/dynamic'; import MyTooltip from '@/components/MyTooltip'; import Avatar from '@/components/Avatar'; import MyIcon from '@fastgpt/web/components/common/Icon'; -import VariableEdit from '@/components/core/module/Flow/components/modules/VariableEdit'; +import VariableEdit from '@/components/core/app/VariableEdit'; import MyTextarea from '@/components/common/Textarea/MyTextarea/index'; import PromptEditor from '@fastgpt/web/components/common/Textarea/PromptEditor'; import { formatEditorVariablePickerIcon } from '@fastgpt/global/core/module/utils'; @@ -28,14 +28,26 @@ import SearchParamsTip from '@/components/core/dataset/SearchParamsTip'; import SettingLLMModel from '@/components/core/ai/SettingLLMModel'; import { SettingAIDataType } from '@fastgpt/global/core/module/node/type'; import DeleteIcon, { hoverDeleteStyles } from '@fastgpt/web/components/common/Icon/delete'; +import { TTSTypeEnum } from '@/constants/app'; const DatasetSelectModal = dynamic(() => import('@/components/core/module/DatasetSelectModal')); const DatasetParamsModal = dynamic(() => import('@/components/core/module/DatasetParamsModal')); const ToolSelectModal = dynamic(() => import('./ToolSelectModal')); -const TTSSelect = dynamic( - () => import('@/components/core/module/Flow/components/modules/TTSSelect') -); -const QGSwitch = dynamic(() => import('@/components/core/module/Flow/components/modules/QGSwitch')); +const TTSSelect = dynamic(() => import('@/components/core/app/TTSSelect')); +const QGSwitch = dynamic(() => import('@/components/core/app/QGSwitch')); +const WhisperConfig = dynamic(() => import('@/components/core/app/WhisperConfig')); + +const BoxStyles: BoxProps = { + px: 5, + py: '16px', + borderBottomWidth: '1px', + borderBottomColor: 'borderColor.low' +}; +const LabelStyles: BoxProps = { + w: ['60px', '100px'], + flexShrink: 0, + fontSize: ['sm', 'md'] +}; const EditForm = ({ divRef, @@ -131,18 +143,6 @@ const EditForm = ({ ); useQuery(['loadAllDatasets'], loadAllDatasets); - const BoxStyles: BoxProps = { - px: 5, - py: '16px', - borderBottomWidth: '1px', - borderBottomColor: 'borderColor.low' - }; - const LabelStyles: BoxProps = { - w: ['60px', '100px'], - flexShrink: 0, - fontSize: ['sm', 'md'] - }; - return ( <Box> {/* title */} @@ -154,7 +154,7 @@ const EditForm = ({ py={4} justifyContent={'space-between'} alignItems={'center'} - zIndex={10} + zIndex={100} px={4} {...(isSticky && { borderBottom: theme.borders.base, @@ -414,6 +414,18 @@ const EditForm = ({ /> </Box> + {/* whisper */} + <Box {...BoxStyles}> + <WhisperConfig + isOpenAudio={getValues('userGuide.tts').type !== TTSTypeEnum.none} + value={getValues('userGuide.whisper')} + onChange={(e) => { + setValue('userGuide.whisper', e); + setRefresh((state) => !state); + }} + /> + </Box> + {/* question guide */} <Box {...BoxStyles} borderBottom={'none'}> <QGSwitch diff --git a/projects/app/src/pages/chat/index.tsx b/projects/app/src/pages/chat/index.tsx index cbd993514759..356bef5bc3d2 100644 --- a/projects/app/src/pages/chat/index.tsx +++ b/projects/app/src/pages/chat/index.tsx @@ -146,6 +146,7 @@ const Chat = ({ appId, chatId }: { appId: string; chatId: string }) => { const res = await getInitChatInfo({ appId, chatId }); const history = res.history.map((item) => ({ ...item, + dataId: item.dataId || nanoid(), status: ChatStatusEnum.finish })); diff --git a/projects/app/src/pages/chat/share.tsx b/projects/app/src/pages/chat/share.tsx index d8c2e1d4020a..e909c698e7f0 100644 --- a/projects/app/src/pages/chat/share.tsx +++ b/projects/app/src/pages/chat/share.tsx @@ -141,6 +141,7 @@ const OutLink = ({ /* post message to report result */ const result: ChatSiteItemType[] = GPTMessages2Chats(prompts).map((item) => ({ ...item, + dataId: item.dataId || nanoid(), status: 'finish' })); @@ -183,6 +184,7 @@ const OutLink = ({ }); const history = res.history.map((item) => ({ ...item, + dataId: item.dataId || nanoid(), status: ChatStatusEnum.finish })); diff --git a/projects/app/src/pages/chat/team.tsx b/projects/app/src/pages/chat/team.tsx index 3cd9a7410509..285e0d2fdf7f 100644 --- a/projects/app/src/pages/chat/team.tsx +++ b/projects/app/src/pages/chat/team.tsx @@ -210,6 +210,7 @@ const OutLink = () => { const history = res.history.map((item) => ({ ...item, + dataId: item.dataId || nanoid(), status: ChatStatusEnum.finish })); diff --git a/projects/app/src/web/common/hooks/useSpeech.ts b/projects/app/src/web/common/hooks/useSpeech.ts index 44231dcb5a37..83e44d67e23e 100644 --- a/projects/app/src/web/common/hooks/useSpeech.ts +++ b/projects/app/src/web/common/hooks/useSpeech.ts @@ -5,7 +5,7 @@ import { useTranslation } from 'next-i18next'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat'; -export const useSpeech = (props?: OutLinkChatAuthProps) => { +export const useSpeech = (props?: OutLinkChatAuthProps & { appId?: string }) => { const { t } = useTranslation(); const mediaRecorder = useRef<MediaRecorder>(); const [mediaStream, setMediaStream] = useState<MediaStream>(); @@ -15,6 +15,7 @@ export const useSpeech = (props?: OutLinkChatAuthProps) => { const [audioSecond, setAudioSecond] = useState(0); const intervalRef = useRef<any>(); const startTimestamp = useRef(0); + const cancelWhisperSignal = useRef(false); const speakingTimeString = useMemo(() => { const minutes: number = Math.floor(audioSecond / 60); @@ -51,6 +52,8 @@ export const useSpeech = (props?: OutLinkChatAuthProps) => { const startSpeak = async (onFinish: (text: string) => void) => { try { + cancelWhisperSignal.current = false; + const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); setMediaStream(stream); @@ -73,42 +76,45 @@ export const useSpeech = (props?: OutLinkChatAuthProps) => { }; mediaRecorder.current.onstop = async () => { - const formData = new FormData(); - let options = {}; - if (MediaRecorder.isTypeSupported('audio/webm')) { - options = { type: 'audio/webm' }; - } else if (MediaRecorder.isTypeSupported('video/mp3')) { - options = { type: 'video/mp3' }; - } else { - console.error('no suitable mimetype found for this device'); - } - const blob = new Blob(chunks, options); - const duration = Math.round((Date.now() - startTimestamp.current) / 1000); - - formData.append('file', blob, 'recording.mp3'); - formData.append( - 'data', - JSON.stringify({ - ...props, - duration - }) - ); - - setIsTransCription(true); - try { - const result = await POST<string>('/v1/audio/transcriptions', formData, { - timeout: 60000, - headers: { - 'Content-Type': 'multipart/form-data; charset=utf-8' - } - }); - onFinish(result); - } catch (error) { - toast({ - status: 'warning', - title: getErrText(error, t('common.speech.error tip')) - }); + if (!cancelWhisperSignal.current) { + const formData = new FormData(); + let options = {}; + if (MediaRecorder.isTypeSupported('audio/webm')) { + options = { type: 'audio/webm' }; + } else if (MediaRecorder.isTypeSupported('video/mp3')) { + options = { type: 'video/mp3' }; + } else { + console.error('no suitable mimetype found for this device'); + } + const blob = new Blob(chunks, options); + const duration = Math.round((Date.now() - startTimestamp.current) / 1000); + + formData.append('file', blob, 'recording.mp3'); + formData.append( + 'data', + JSON.stringify({ + ...props, + duration + }) + ); + + setIsTransCription(true); + try { + const result = await POST<string>('/v1/audio/transcriptions', formData, { + timeout: 60000, + headers: { + 'Content-Type': 'multipart/form-data; charset=utf-8' + } + }); + onFinish(result); + } catch (error) { + toast({ + status: 'warning', + title: getErrText(error, t('common.speech.error tip')) + }); + } } + setIsTransCription(false); setIsSpeaking(false); }; @@ -128,7 +134,8 @@ export const useSpeech = (props?: OutLinkChatAuthProps) => { } }; - const stopSpeak = () => { + const stopSpeak = (cancel = false) => { + cancelWhisperSignal.current = cancel; if (mediaRecorder.current) { mediaRecorder.current?.stop(); clearInterval(intervalRef.current); @@ -147,6 +154,13 @@ export const useSpeech = (props?: OutLinkChatAuthProps) => { }; }, []); + // listen minuted. over 60 seconds, stop speak + useEffect(() => { + if (audioSecond >= 60) { + stopSpeak(); + } + }, [audioSecond]); + return { startSpeak, stopSpeak, diff --git a/projects/app/src/web/common/utils/voice.ts b/projects/app/src/web/common/utils/voice.ts index fb58d2fa42d0..106d5ae9fa4e 100644 --- a/projects/app/src/web/common/utils/voice.ts +++ b/projects/app/src/web/common/utils/voice.ts @@ -1,246 +1,357 @@ import { useState, useCallback, useEffect, useMemo, useRef } from 'react'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { getErrText } from '@fastgpt/global/common/error/utils'; -import type { AppTTSConfigType } from '@fastgpt/global/core/module/type.d'; +import type { AppTTSConfigType } from '@fastgpt/global/core/app/type.d'; import { TTSTypeEnum } from '@/constants/app'; import { useTranslation } from 'next-i18next'; import type { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat.d'; +const contentType = 'audio/mpeg'; +const splitMarker = 'SPLIT_MARKER'; + export const useAudioPlay = (props?: OutLinkChatAuthProps & { ttsConfig?: AppTTSConfigType }) => { const { t } = useTranslation(); const { ttsConfig, shareId, outLinkUid, teamId, teamToken } = props || {}; const { toast } = useToast(); - const [audio, setAudio] = useState<HTMLAudioElement>(); + const audioRef = useRef<HTMLAudioElement>(new Audio()); + const audio = audioRef.current; const [audioLoading, setAudioLoading] = useState(false); const [audioPlaying, setAudioPlaying] = useState(false); const audioController = useRef(new AbortController()); // Check whether the voice is supported - const hasAudio = useMemo(() => { + const hasAudio = (() => { if (ttsConfig?.type === TTSTypeEnum.none) return false; if (ttsConfig?.type === TTSTypeEnum.model) return true; const voices = window.speechSynthesis?.getVoices?.() || []; // 获取语言包 const voice = voices.find((item) => { - return item.lang === 'zh-CN'; + return item.lang === 'zh-CN' || item.lang === 'zh'; }); return !!voice; - }, [ttsConfig]); - - const playAudio = async ({ - text, - chatItemId, - buffer - }: { - text: string; - chatItemId?: string; - buffer?: Uint8Array; - }) => - new Promise<{ buffer?: Uint8Array }>(async (resolve, reject) => { - text = text.replace(/\\n/g, '\n'); - try { - // tts play - if (audio && ttsConfig && ttsConfig?.type === TTSTypeEnum.model) { - setAudioLoading(true); - - /* buffer tts */ - if (buffer) { - playAudioBuffer({ audio, buffer }); - setAudioLoading(false); - return resolve({ buffer }); - } + })(); - audioController.current = new AbortController(); - - /* request tts */ - const response = await fetch('/api/core/chat/item/getSpeech', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - signal: audioController.current.signal, - body: JSON.stringify({ - chatItemId, - ttsConfig, - input: text, - shareId, - outLinkUid, - teamId, - teamToken - }) - }); - setAudioLoading(false); + const getAudioStream = useCallback( + async (input: string) => { + if (!input) return Promise.reject('Text is empty'); - if (!response.body || !response.ok) { - const data = await response.json(); - toast({ - status: 'error', - title: getErrText(data, t('core.chat.Audio Speech Error')) - }); - return reject(data); - } + setAudioLoading(true); + audioController.current = new AbortController(); - const audioBuffer = await readAudioStream({ - audio, - stream: response.body, - contentType: 'audio/mpeg' - }); + const response = await fetch('/api/core/chat/item/getSpeech', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + signal: audioController.current.signal, + body: JSON.stringify({ + ttsConfig, + input: input.trim(), + shareId, + outLinkUid, + teamId, + teamToken + }) + }).finally(() => { + setAudioLoading(false); + }); - resolve({ - buffer: audioBuffer - }); - } else { - // window speech - window.speechSynthesis?.cancel(); - const msg = new SpeechSynthesisUtterance(text); - const voices = window.speechSynthesis?.getVoices?.() || []; // 获取语言包 - const voice = voices.find((item) => { - return item.lang === 'zh-CN'; - }); - if (voice) { - msg.onstart = () => { - setAudioPlaying(true); - }; - msg.onend = () => { - setAudioPlaying(false); - msg.onstart = null; - msg.onend = null; - }; - msg.voice = voice; - window.speechSynthesis?.speak(msg); - } - resolve({}); - } - } catch (error) { + if (!response.body || !response.ok) { + const data = await response.json(); toast({ status: 'error', - title: getErrText(error, t('core.chat.Audio Speech Error')) + title: getErrText(data, t('core.chat.Audio Speech Error')) }); - reject(error); + return Promise.reject(data); } - setAudioLoading(false); + return response.body; + }, + [outLinkUid, shareId, t, teamId, teamToken, toast, ttsConfig] + ); + const playWebAudio = useCallback((text: string) => { + // window speech + window.speechSynthesis?.cancel(); + const msg = new SpeechSynthesisUtterance(text); + const voices = window.speechSynthesis?.getVoices?.() || []; // 获取语言包 + const voice = voices.find((item) => { + return item.lang === 'zh-CN'; }); - + if (voice) { + msg.onstart = () => { + setAudioPlaying(true); + }; + msg.onend = () => { + setAudioPlaying(false); + msg.onstart = null; + msg.onend = null; + }; + msg.voice = voice; + window.speechSynthesis?.speak(msg); + } + }, []); const cancelAudio = useCallback(() => { + try { + window.speechSynthesis?.cancel(); + audioController.current.abort(''); + } catch (error) {} if (audio) { audio.pause(); audio.src = ''; } - window.speechSynthesis?.cancel(); - audioController.current?.abort(); setAudioPlaying(false); }, [audio]); - // listen ttsUrl update - useEffect(() => { - setAudio(new Audio()); - }, []); + /* Perform a voice playback */ + const playAudioByText = useCallback( + async ({ text, buffer }: { text: string; buffer?: Uint8Array }) => { + const playAudioBuffer = (buffer: Uint8Array) => { + const audioUrl = URL.createObjectURL(new Blob([buffer], { type: 'audio/mpeg' })); - // listen audio status - useEffect(() => { - if (audio) { - audio.onplay = () => { - setAudioPlaying(true); - }; - audio.onended = () => { - setAudioPlaying(false); - }; - audio.onerror = () => { - setAudioPlaying(false); + audio.src = audioUrl; + audio.play(); }; - audio.oncancel = () => { - setAudioPlaying(false); + const readAudioStream = (stream: ReadableStream<Uint8Array>) => { + if (!audio) return; + + // Create media source and play audio + const ms = new MediaSource(); + const url = URL.createObjectURL(ms); + audio.src = url; + audio.play(); + + let u8Arr: Uint8Array = new Uint8Array(); + return new Promise<Uint8Array>(async (resolve, reject) => { + // Async to read data from ms + await new Promise((resolve) => { + ms.onsourceopen = resolve; + }); + const sourceBuffer = ms.addSourceBuffer(contentType); + + const reader = stream.getReader(); + + // read stream + try { + while (true) { + const { done, value } = await reader.read(); + if (done || audio.paused) { + resolve(u8Arr); + if (sourceBuffer.updating) { + await new Promise((resolve) => (sourceBuffer.onupdateend = resolve)); + } + ms.endOfStream(); + return; + } + + u8Arr = new Uint8Array([...u8Arr, ...value]); + + await new Promise((resolve) => { + sourceBuffer.onupdateend = resolve; + sourceBuffer.appendBuffer(value.buffer); + }); + } + } catch (error) { + reject(error); + } + }); }; + + return new Promise<{ buffer?: Uint8Array }>(async (resolve, reject) => { + text = text.replace(/\\n/g, '\n'); + try { + // stop last audio + cancelAudio(); + + // tts play + if (audio && ttsConfig?.type === TTSTypeEnum.model) { + /* buffer tts */ + if (buffer) { + playAudioBuffer(buffer); + return resolve({ buffer }); + } + + /* request tts */ + const audioBuffer = await readAudioStream(await getAudioStream(text)); + + resolve({ + buffer: audioBuffer + }); + } else { + // window speech + playWebAudio(text); + resolve({}); + } + } catch (error) { + toast({ + status: 'error', + title: getErrText(error, t('core.chat.Audio Speech Error')) + }); + reject(error); + } + }); + }, + [audio, cancelAudio, getAudioStream, playWebAudio, t, toast, ttsConfig?.type] + ); + + // segmented params + const segmentedMediaSource = useRef<MediaSource>(); + const segmentedSourceBuffer = useRef<SourceBuffer>(); + const segmentedTextList = useRef<string[]>([]); + const appendAudioPromise = useRef<Promise<any>>(Promise.resolve()); + + /* Segmented voice playback */ + const startSegmentedAudio = useCallback(async () => { + if (!audio) return; + cancelAudio(); + + /* reset all source */ + const buffer = segmentedSourceBuffer.current; + if (buffer) { + buffer.updating && (await new Promise((resolve) => (buffer.onupdateend = resolve))); + segmentedSourceBuffer.current = undefined; } - const listen = () => { - cancelAudio(); - }; - window.addEventListener('beforeunload', listen); - return () => { - if (audio) { - audio.onplay = null; - audio.onended = null; - audio.onerror = null; + if (segmentedMediaSource.current) { + if (segmentedMediaSource.current?.readyState === 'open') { + segmentedMediaSource.current.endOfStream(); } - cancelAudio(); - window.removeEventListener('beforeunload', listen); - }; - }, [audio, cancelAudio]); + segmentedMediaSource.current = undefined; + } - useEffect(() => { - return () => { - setAudio(undefined); - }; - }, []); + /* init source */ + segmentedTextList.current = []; + appendAudioPromise.current = Promise.resolve(); - return { - audioPlaying, - audioLoading, - hasAudio, - playAudio, - cancelAudio - }; -}; + /* start ms and source buffer */ + const ms = new MediaSource(); + segmentedMediaSource.current = ms; + const url = URL.createObjectURL(ms); + audio.src = url; + audio.play(); -export function readAudioStream({ - audio, - stream, - contentType = 'audio/mpeg' -}: { - audio: HTMLAudioElement; - stream: ReadableStream<Uint8Array>; - contentType?: string; -}): Promise<Uint8Array> { - // Create media source and play audio - const ms = new MediaSource(); - const url = URL.createObjectURL(ms); - audio.src = url; - audio.play(); - - let u8Arr: Uint8Array = new Uint8Array(); - return new Promise<Uint8Array>(async (resolve, reject) => { - // Async to read data from ms await new Promise((resolve) => { ms.onsourceopen = resolve; }); - const sourceBuffer = ms.addSourceBuffer(contentType); + segmentedSourceBuffer.current = sourceBuffer; + }, [audio, cancelAudio]); + const finishSegmentedAudio = useCallback(() => { + appendAudioPromise.current = appendAudioPromise.current.finally(() => { + if (segmentedMediaSource.current?.readyState === 'open') { + segmentedMediaSource.current.endOfStream(); + } + }); + }, []); - const reader = stream.getReader(); + const appendAudioStream = useCallback( + (input: string) => { + const buffer = segmentedSourceBuffer.current; - // read stream - try { - while (true) { - const { done, value } = await reader.read(); - if (done) { - resolve(u8Arr); - if (sourceBuffer.updating) { - await new Promise((resolve) => (sourceBuffer.onupdateend = resolve)); + if (!buffer) return; + + let u8Arr: Uint8Array = new Uint8Array(); + return new Promise<Uint8Array>(async (resolve, reject) => { + // read stream + try { + const stream = await getAudioStream(input); + const reader = stream.getReader(); + + while (true) { + const { done, value } = await reader.read(); + + if (done || !audio?.played) { + buffer.updating && (await new Promise((resolve) => (buffer.onupdateend = resolve))); + return resolve(u8Arr); + } + + u8Arr = new Uint8Array([...u8Arr, ...value]); + + await new Promise((resolve) => { + buffer.onupdateend = resolve; + buffer.appendBuffer(value.buffer); + }); } - ms.endOfStream(); - return; + } catch (error) { + reject(error); } + }); + }, + [audio?.played, getAudioStream, segmentedSourceBuffer] + ); + /* split audio text and fetch tts */ + const splitText2Audio = useCallback( + (text: string, done?: boolean) => { + if (ttsConfig?.type === TTSTypeEnum.model && ttsConfig?.model) { + const splitReg = /([。!?]|[.!?]\s)/g; + const storeText = segmentedTextList.current.join(''); + const newText = text.slice(storeText.length); - u8Arr = new Uint8Array([...u8Arr, ...value]); + const splitTexts = newText + .replace(splitReg, (() => `$1${splitMarker}`.trim())()) + .split(`${splitMarker}`) + .filter((part) => part.trim()); - await new Promise((resolve) => { - sourceBuffer.onupdateend = resolve; - sourceBuffer.appendBuffer(value.buffer); - }); + if (splitTexts.length > 1 || done) { + let splitList = splitTexts.slice(); + + // concat same sentence + if (!done) { + splitList = splitTexts.slice(0, -1); + splitList = [splitList.join('')]; + } + + segmentedTextList.current = segmentedTextList.current.concat(splitList); + + for (const item of splitList) { + appendAudioPromise.current = appendAudioPromise.current.then(() => + appendAudioStream(item) + ); + } + } + } else if (ttsConfig?.type === TTSTypeEnum.web && done) { + playWebAudio(text); } - } catch (error) { - reject(error); - } - }); -} -export function playAudioBuffer({ - audio, - buffer -}: { - audio: HTMLAudioElement; - buffer: Uint8Array; -}) { - const audioUrl = URL.createObjectURL(new Blob([buffer], { type: 'audio/mpeg' })); - - audio.src = audioUrl; - audio.play(); -} + }, + [appendAudioStream, playWebAudio, ttsConfig?.model, ttsConfig?.type] + ); + + // listen audio status + useEffect(() => { + audio.onplay = () => { + setAudioPlaying(true); + }; + audio.onended = () => { + setAudioPlaying(false); + }; + audio.onerror = () => { + setAudioPlaying(false); + }; + audio.oncancel = () => { + setAudioPlaying(false); + }; + const listen = () => { + cancelAudio(); + }; + window.addEventListener('beforeunload', listen); + return () => { + audio.onplay = null; + audio.onended = null; + audio.onerror = null; + cancelAudio(); + audio.remove(); + window.removeEventListener('beforeunload', listen); + }; + }, []); + + return { + audio, + audioLoading, + audioPlaying, + setAudioPlaying, + getAudioStream, + cancelAudio, + audioController, + hasAudio: useMemo(() => hasAudio, [hasAudio]), + playAudioByText, + startSegmentedAudio, + finishSegmentedAudio, + splitText2Audio + }; +}; diff --git a/projects/app/src/web/core/app/utils.ts b/projects/app/src/web/core/app/utils.ts index 2ac7dd7f8ba4..0676ba0e62c0 100644 --- a/projects/app/src/web/core/app/utils.ts +++ b/projects/app/src/web/core/app/utils.ts @@ -38,8 +38,14 @@ export async function postForm2Modules(data: AppSimpleEditFormType) { { key: ModuleInputKeyEnum.tts, type: FlowNodeInputTypeEnum.hidden, - label: 'core.app.TTS', + label: '', value: formData.userGuide.tts + }, + { + key: ModuleInputKeyEnum.whisper, + type: FlowNodeInputTypeEnum.hidden, + label: '', + value: formData.userGuide.whisper } ], outputs: [], diff --git a/python/bge-rerank/README.md b/python/bge-rerank/README.md new file mode 100644 index 000000000000..51693f2334ee --- /dev/null +++ b/python/bge-rerank/README.md @@ -0,0 +1,114 @@ +# 接入 bge-rerank 重排模型 + +## 不同模型推荐配置 + +推荐配置如下: + +| 模型名 | 内存 | 显存 | 硬盘空间 | 启动命令 | +| ---------------- | ----- | ----- | -------- | ------------- | +| bge-rerank-base | >=4GB | >=4GB | >=8GB | python app.py | +| bge-rerank-large | >=8GB | >=8GB | >=8GB | python app.py | +| bge-rerank-v2-m3 | >=8GB | >=8GB | >=8GB | python app.py | + +## 源码部署 + +### 1. 安装环境 + +- Python 3.9, 3.10 +- CUDA 11.7 +- 科学上网环境 + +### 2. 下载代码 + +3 个模型代码分别为: + +1. [https://github.com/labring/FastGPT/tree/main/python/reranker/bge-reranker-base](https://github.com/labring/FastGPT/tree/main/python/reranker/bge-reranker-base) +2. [https://github.com/labring/FastGPT/tree/main/python/reranker/bge-reranker-large](https://github.com/labring/FastGPT/tree/main/python/reranker/bge-reranker-large) +3. [https://github.com/labring/FastGPT/tree/main/python/reranker/bge-rerank-v2-m3](https://github.com/labring/FastGPT/tree/main/python/reranker/bge-rerank-v2-m3) + +### 3. 安装依赖 + +```sh +pip install -r requirements.txt +``` + +### 4. 下载模型 + +3个模型的 huggingface 仓库地址如下: + +1. [https://huggingface.co/BAAI/bge-reranker-base](https://huggingface.co/BAAI/bge-reranker-base) +2. [https://huggingface.co/BAAI/bge-reranker-large](https://huggingface.co/BAAI/bge-reranker-large) +3. [https://huggingface.co/BAAI/bge-rerank-v2-m3](https://huggingface.co/BAAI/bge-rerank-v2-m3) + +在对应代码目录下 clone 模型。目录结构: + +``` +bge-reranker-base/ +app.py +Dockerfile +requirements.txt +``` + +### 5. 运行代码 + +```bash +python app.py +``` + +启动成功后应该会显示如下地址: + +![](./rerank1.png) + +> 这里的 `http://0.0.0.0:6006` 就是请求地址。 + +## docker 部署 + +**镜像名分别为:** + +1. registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1 +2. registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-large:v0.1 +3. registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-v2-m3:v0.1 + +**端口** + +6006 + +**环境变量** + +``` +ACCESS_TOKEN=访问安全凭证,请求时,Authorization: Bearer ${ACCESS_TOKEN} +``` + +**运行命令示例** + +```sh +# auth token 为mytoken +docker run -d --name reranker -p 6006:6006 -e ACCESS_TOKEN=mytoken --gpus all registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1 +``` + +**docker-compose.yml示例** + +``` +version: "3" +services: + reranker: + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/rerank:v0.2 + container_name: reranker + # GPU运行环境,如果宿主机未安装,将deploy配置隐藏即可 + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + ports: + - 6006:6006 + environment: + - ACCESS_TOKEN=mytoken + +``` + +## 接入 FastGPT + +参考 [ReRank模型接入](https://doc/fastai.site/docs/development/configuration/#rerank-接入) diff --git a/python/reranker/bge-reranker-base/Dockerfile b/python/bge-rerank/bge-reranker-base/Dockerfile similarity index 100% rename from python/reranker/bge-reranker-base/Dockerfile rename to python/bge-rerank/bge-reranker-base/Dockerfile diff --git a/python/reranker/bge-reranker-base/app.py b/python/bge-rerank/bge-reranker-base/app.py similarity index 69% rename from python/reranker/bge-reranker-base/app.py rename to python/bge-rerank/bge-reranker-base/app.py index 544f9253ad2c..8f878bf8f233 100644 --- a/python/reranker/bge-reranker-base/app.py +++ b/python/bge-rerank/bge-reranker-base/app.py @@ -17,20 +17,9 @@ from pydantic import Field, BaseModel, validator from typing import Optional, List -def response(code, msg, data=None): - time = str(datetime.datetime.now()) - if data is None: - data = [] - result = { - "code": code, - "message": msg, - "data": data, - "time": time - } - return result - -def success(data=None, msg=''): - return +app = FastAPI() +security = HTTPBearer() +env_bearer_token = 'ACCESS_TOKEN' class QADocs(BaseModel): query: Optional[str] @@ -46,42 +35,35 @@ def __call__(cls, *args, **kwargs): RERANK_MODEL_PATH = os.path.join(os.path.dirname(__file__), "bge-reranker-base") -class Reranker(metaclass=Singleton): +class ReRanker(metaclass=Singleton): def __init__(self, model_path): - self.reranker = FlagReranker(model_path, - use_fp16=False) + self.reranker = FlagReranker(model_path, use_fp16=False) def compute_score(self, pairs: List[List[str]]): if len(pairs) > 0: - result = self.reranker.compute_score(pairs) + result = self.reranker.compute_score(pairs, normalize=True) if isinstance(result, float): result = [result] return result else: return None - class Chat(object): def __init__(self, rerank_model_path: str = RERANK_MODEL_PATH): - self.reranker = Reranker(rerank_model_path) + self.reranker = ReRanker(rerank_model_path) def fit_query_answer_rerank(self, query_docs: QADocs) -> List: if query_docs is None or len(query_docs.documents) == 0: return [] - new_docs = [] - pair = [] - for answer in query_docs.documents: - pair.append([query_docs.query, answer]) + + pair = [[query_docs.query, doc] for doc in query_docs.documents] scores = self.reranker.compute_score(pair) + + new_docs = [] for index, score in enumerate(scores): - new_docs.append({"index": index, "text": query_docs.documents[index], "score": 1 / (1 + np.exp(-score))}) - #results = [{"document": {"text": documents["text"]}, "index": documents["index"], "relevance_score": documents["score"]} for documents in list(sorted(new_docs, key=lambda x: x["score"], reverse=True))] + new_docs.append({"index": index, "text": query_docs.documents[index], "score": score}) results = [{"index": documents["index"], "relevance_score": documents["score"]} for documents in list(sorted(new_docs, key=lambda x: x["score"], reverse=True))] - return {"results": results} - -app = FastAPI() -security = HTTPBearer() -env_bearer_token = 'ACCESS_TOKEN' + return results @app.post('/v1/rerank') async def handle_post_request(docs: QADocs, credentials: HTTPAuthorizationCredentials = Security(security)): @@ -89,8 +71,12 @@ async def handle_post_request(docs: QADocs, credentials: HTTPAuthorizationCreden if env_bearer_token is not None and token != env_bearer_token: raise HTTPException(status_code=401, detail="Invalid token") chat = Chat() - qa_docs_with_rerank = chat.fit_query_answer_rerank(docs) - return response(200, msg="重排成功", data=qa_docs_with_rerank) + try: + results = chat.fit_query_answer_rerank(docs) + return {"results": results} + except Exception as e: + print(f"报错:\n{e}") + return {"error": "重排出错"} if __name__ == "__main__": token = os.getenv("ACCESS_TOKEN") diff --git a/python/reranker/bge-reranker-base/requirements.txt b/python/bge-rerank/bge-reranker-base/requirements.txt similarity index 82% rename from python/reranker/bge-reranker-base/requirements.txt rename to python/bge-rerank/bge-reranker-base/requirements.txt index 72f2c2555082..27ccb8402e19 100644 --- a/python/reranker/bge-reranker-base/requirements.txt +++ b/python/bge-rerank/bge-reranker-base/requirements.txt @@ -1,6 +1,6 @@ fastapi==0.104.1 transformers[sentencepiece] -FlagEmbedding==1.1.5 +FlagEmbedding==1.2.8 pydantic==1.10.13 uvicorn==0.17.6 itsdangerous diff --git a/python/bge-rerank/bge-reranker-large/Dockerfile b/python/bge-rerank/bge-reranker-large/Dockerfile new file mode 100644 index 000000000000..9312b28a50fc --- /dev/null +++ b/python/bge-rerank/bge-reranker-large/Dockerfile @@ -0,0 +1,12 @@ +FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime + +# please download the model from https://huggingface.co/BAAI/bge-reranker-large and put it in the same directory as Dockerfile +COPY ./bge-reranker-large ./bge-reranker-large + +COPY requirements.txt . + +RUN python3 -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple + +COPY app.py Dockerfile . + +ENTRYPOINT python3 app.py diff --git a/python/bge-rerank/bge-reranker-large/app.py b/python/bge-rerank/bge-reranker-large/app.py new file mode 100644 index 000000000000..0975f7f3dd07 --- /dev/null +++ b/python/bge-rerank/bge-reranker-large/app.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +@Time: 2023/11/7 22:45 +@Author: zhidong +@File: reranker.py +@Desc: +""" +import os +import numpy as np +import logging +import uvicorn +import datetime +from fastapi import FastAPI, Security, HTTPException +from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials +from FlagEmbedding import FlagReranker +from pydantic import Field, BaseModel, validator +from typing import Optional, List + +app = FastAPI() +security = HTTPBearer() +env_bearer_token = 'ACCESS_TOKEN' + +class QADocs(BaseModel): + query: Optional[str] + documents: Optional[List[str]] + + +class Singleton(type): + def __call__(cls, *args, **kwargs): + if not hasattr(cls, '_instance'): + cls._instance = super().__call__(*args, **kwargs) + return cls._instance + + +RERANK_MODEL_PATH = os.path.join(os.path.dirname(__file__), "bge-reranker-large") + +class ReRanker(metaclass=Singleton): + def __init__(self, model_path): + self.reranker = FlagReranker(model_path, use_fp16=False) + + def compute_score(self, pairs: List[List[str]]): + if len(pairs) > 0: + result = self.reranker.compute_score(pairs, normalize=True) + if isinstance(result, float): + result = [result] + return result + else: + return None + +class Chat(object): + def __init__(self, rerank_model_path: str = RERANK_MODEL_PATH): + self.reranker = ReRanker(rerank_model_path) + + def fit_query_answer_rerank(self, query_docs: QADocs) -> List: + if query_docs is None or len(query_docs.documents) == 0: + return [] + + pair = [[query_docs.query, doc] for doc in query_docs.documents] + scores = self.reranker.compute_score(pair) + + new_docs = [] + for index, score in enumerate(scores): + new_docs.append({"index": index, "text": query_docs.documents[index], "score": score}) + results = [{"index": documents["index"], "relevance_score": documents["score"]} for documents in list(sorted(new_docs, key=lambda x: x["score"], reverse=True))] + return results + +@app.post('/v1/rerank') +async def handle_post_request(docs: QADocs, credentials: HTTPAuthorizationCredentials = Security(security)): + token = credentials.credentials + if env_bearer_token is not None and token != env_bearer_token: + raise HTTPException(status_code=401, detail="Invalid token") + chat = Chat() + try: + results = chat.fit_query_answer_rerank(docs) + return {"results": results} + except Exception as e: + print(f"报错:\n{e}") + return {"error": "重排出错"} + +if __name__ == "__main__": + token = os.getenv("ACCESS_TOKEN") + if token is not None: + env_bearer_token = token + try: + uvicorn.run(app, host='0.0.0.0', port=6006) + except Exception as e: + print(f"API启动失败!\n报错:\n{e}") diff --git a/python/bge-rerank/bge-reranker-large/requirements.txt b/python/bge-rerank/bge-reranker-large/requirements.txt new file mode 100644 index 000000000000..27ccb8402e19 --- /dev/null +++ b/python/bge-rerank/bge-reranker-large/requirements.txt @@ -0,0 +1,7 @@ +fastapi==0.104.1 +transformers[sentencepiece] +FlagEmbedding==1.2.8 +pydantic==1.10.13 +uvicorn==0.17.6 +itsdangerous +protobuf diff --git a/python/bge-rerank/bge-reranker-v2-m3/Dockerfile b/python/bge-rerank/bge-reranker-v2-m3/Dockerfile new file mode 100644 index 000000000000..be11c83f816a --- /dev/null +++ b/python/bge-rerank/bge-reranker-v2-m3/Dockerfile @@ -0,0 +1,12 @@ +FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime + +# please download the model from https://huggingface.co/BAAI/bge-reranker-v2-m3 and put it in the same directory as Dockerfile +COPY ./bge-reranker-v2-m3 ./bge-reranker-v2-m3 + +COPY requirements.txt . + +RUN python3 -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple + +COPY app.py Dockerfile . + +ENTRYPOINT python3 app.py diff --git a/python/bge-rerank/bge-reranker-v2-m3/app.py b/python/bge-rerank/bge-reranker-v2-m3/app.py new file mode 100644 index 000000000000..293f777a6251 --- /dev/null +++ b/python/bge-rerank/bge-reranker-v2-m3/app.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +@Time: 2023/11/7 22:45 +@Author: zhidong +@File: reranker.py +@Desc: +""" +import os +import numpy as np +import logging +import uvicorn +import datetime +from fastapi import FastAPI, Security, HTTPException +from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials +from FlagEmbedding import FlagReranker +from pydantic import Field, BaseModel, validator +from typing import Optional, List + +app = FastAPI() +security = HTTPBearer() +env_bearer_token = 'ACCESS_TOKEN' + +class QADocs(BaseModel): + query: Optional[str] + documents: Optional[List[str]] + + +class Singleton(type): + def __call__(cls, *args, **kwargs): + if not hasattr(cls, '_instance'): + cls._instance = super().__call__(*args, **kwargs) + return cls._instance + + +RERANK_MODEL_PATH = os.path.join(os.path.dirname(__file__), "bge-reranker-v2-m3") + +class ReRanker(metaclass=Singleton): + def __init__(self, model_path): + self.reranker = FlagReranker(model_path, use_fp16=False) + + def compute_score(self, pairs: List[List[str]]): + if len(pairs) > 0: + result = self.reranker.compute_score(pairs, normalize=True) + if isinstance(result, float): + result = [result] + return result + else: + return None + +class Chat(object): + def __init__(self, rerank_model_path: str = RERANK_MODEL_PATH): + self.reranker = ReRanker(rerank_model_path) + + def fit_query_answer_rerank(self, query_docs: QADocs) -> List: + if query_docs is None or len(query_docs.documents) == 0: + return [] + + pair = [[query_docs.query, doc] for doc in query_docs.documents] + scores = self.reranker.compute_score(pair) + + new_docs = [] + for index, score in enumerate(scores): + new_docs.append({"index": index, "text": query_docs.documents[index], "score": score}) + results = [{"index": documents["index"], "relevance_score": documents["score"]} for documents in list(sorted(new_docs, key=lambda x: x["score"], reverse=True))] + return results + +@app.post('/v1/rerank') +async def handle_post_request(docs: QADocs, credentials: HTTPAuthorizationCredentials = Security(security)): + token = credentials.credentials + if env_bearer_token is not None and token != env_bearer_token: + raise HTTPException(status_code=401, detail="Invalid token") + chat = Chat() + try: + results = chat.fit_query_answer_rerank(docs) + return {"results": results} + except Exception as e: + print(f"报错:\n{e}") + return {"error": "重排出错"} + +if __name__ == "__main__": + token = os.getenv("ACCESS_TOKEN") + if token is not None: + env_bearer_token = token + try: + uvicorn.run(app, host='0.0.0.0', port=6006) + except Exception as e: + print(f"API启动失败!\n报错:\n{e}") diff --git a/python/bge-rerank/bge-reranker-v2-m3/requirements.txt b/python/bge-rerank/bge-reranker-v2-m3/requirements.txt new file mode 100644 index 000000000000..27ccb8402e19 --- /dev/null +++ b/python/bge-rerank/bge-reranker-v2-m3/requirements.txt @@ -0,0 +1,7 @@ +fastapi==0.104.1 +transformers[sentencepiece] +FlagEmbedding==1.2.8 +pydantic==1.10.13 +uvicorn==0.17.6 +itsdangerous +protobuf diff --git a/python/bge-rerank/rerank1.png b/python/bge-rerank/rerank1.png new file mode 100644 index 0000000000000000000000000000000000000000..ab26e2cfadecb7673062910a9506ad20ce2c024f GIT binary patch literal 93453 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 KOAcZ$=KcdUy|N(y literal 0 HcmV?d00001 diff --git a/python/reranker/bge-reranker-base/README.md b/python/reranker/bge-reranker-base/README.md deleted file mode 100644 index fa8b8070f0b1..000000000000 --- a/python/reranker/bge-reranker-base/README.md +++ /dev/null @@ -1,48 +0,0 @@ - -## 推荐配置 - -推荐配置如下: - -{{< table "table-hover table-striped-columns" >}} -| 类型 | 内存 | 显存 | 硬盘空间 | 启动命令 | -|------|---------|---------|----------|--------------------------| -| base | >=4GB | >=3GB | >=8GB | python app.py | -{{< /table >}} - -## 部署 - -### 环境要求 - -- Python 3.10.11 -- CUDA 11.7 -- 科学上网环境 - -### 源码部署 - -1. 根据上面的环境配置配置好环境,具体教程自行 GPT; -2. 下载 [python 文件](app.py) -3. 在命令行输入命令 `pip install -r requirments.txt`; -4. 按照[https://huggingface.co/BAAI/bge-reranker-base](https://huggingface.co/BAAI/bge-reranker-base)下载模型仓库到app.py同级目录 -5. 添加环境变量 `export ACCESS_TOKEN=XXXXXX` 配置 token,这里的 token 只是加一层验证,防止接口被人盗用,默认值为 `ACCESS_TOKEN` ; -6. 执行命令 `python app.py`。 - -然后等待模型下载,直到模型加载完毕为止。如果出现报错先问 GPT。 - -启动成功后应该会显示如下地址: - -![](/imgs/chatglm2.png) - -> 这里的 `http://0.0.0.0:6006` 就是连接地址。 - -### docker 部署 - -**镜像和端口** - -+ 镜像名: `registry.cn-hangzhou.aliyuncs.com/fastgpt/rerank:v0.2` -+ 端口号: 6006 - -``` -# 设置安全凭证(即oneapi中的渠道密钥) -通过环境变量ACCESS_TOKEN引入,默认值:ACCESS_TOKEN。 -有关docker环境变量引入的方法请自寻教程,此处不再赘述。 -```