Compare commits
45 Commits
v4.8.16
...
v4.8.18-al
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
47f7b1a7a3 | ||
|
|
fadb3e3ceb | ||
|
|
1c0b323b1b | ||
|
|
b26345dcaa | ||
|
|
cef8487ca1 | ||
|
|
ed619edd47 | ||
|
|
93cf5bb372 | ||
|
|
f556fbf0d5 | ||
|
|
07cc849877 | ||
|
|
2066094047 | ||
|
|
2bf1fce32a | ||
|
|
5465ca642f | ||
|
|
c0d0c629c5 | ||
|
|
20c6c202d2 | ||
|
|
c8f60b47d0 | ||
|
|
8b2be89350 | ||
|
|
a401d4d612 | ||
|
|
d24d29ac48 | ||
|
|
9abbc16036 | ||
|
|
28710ac05b | ||
|
|
3412d7009d | ||
|
|
c3480b0ffa | ||
|
|
f89212f35f | ||
|
|
03d1c6a651 | ||
|
|
5d1d4ff64f | ||
|
|
fd9600c6f8 | ||
|
|
efecfd44c3 | ||
|
|
1fc77a126a | ||
|
|
bb669ca3ff | ||
|
|
72ed72e595 | ||
|
|
e5735fddd1 | ||
|
|
fa92ef86b9 | ||
|
|
f39ea04178 | ||
|
|
bd4893ced9 | ||
|
|
b75e807f24 | ||
|
|
b2fdefdc0c | ||
|
|
896fec4b82 | ||
|
|
50bf7f9a3b | ||
|
|
da2831b948 | ||
|
|
b520988c64 | ||
|
|
a209856d48 | ||
|
|
f7942655a2 | ||
|
|
108e1b92ef | ||
|
|
f646ef8595 | ||
|
|
a7f25994d5 |
4
.github/workflows/preview-fastgpt-image.yml
vendored
@@ -36,7 +36,7 @@ jobs:
|
|||||||
password: ${{ secrets.GH_PAT }}
|
password: ${{ secrets.GH_PAT }}
|
||||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
||||||
run: |
|
run: |
|
||||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-pr:${{ github.event.pull_request.number }}" >> $GITHUB_ENV
|
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-pr:${{ github.event.pull_request.head.sha }}" >> $GITHUB_ENV
|
||||||
- name: Build image for PR
|
- name: Build image for PR
|
||||||
env:
|
env:
|
||||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
||||||
@@ -44,7 +44,7 @@ jobs:
|
|||||||
docker buildx build \
|
docker buildx build \
|
||||||
-f projects/app/Dockerfile \
|
-f projects/app/Dockerfile \
|
||||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
||||||
--label "org.opencontainers.image.description=fastgpt-pr imae" \
|
--label "org.opencontainers.image.description=fastgpt-pr image" \
|
||||||
--label "org.opencontainers.image.licenses=Apache" \
|
--label "org.opencontainers.image.licenses=Apache" \
|
||||||
--push \
|
--push \
|
||||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
--cache-from=type=local,src=/tmp/.buildx-cache \
|
||||||
|
|||||||
25
README.md
@@ -58,9 +58,9 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
- [x] 多库复用,混用
|
- [x] 多库复用,混用
|
||||||
- [x] chunk 记录修改和删除
|
- [x] chunk 记录修改和删除
|
||||||
- [x] 支持手动输入,直接分段,QA 拆分导入
|
- [x] 支持手动输入,直接分段,QA 拆分导入
|
||||||
- [x] 支持 txt,md,html,pdf,docx,pptx,csv,xlsx (有需要更多可 PR file loader)
|
- [x] 支持 txt,md,html,pdf,docx,pptx,csv,xlsx (有需要更多可 PR file loader),支持 url 读取、CSV 批量导入
|
||||||
- [x] 支持 url 读取、CSV 批量导入
|
|
||||||
- [x] 混合检索 & 重排
|
- [x] 混合检索 & 重排
|
||||||
|
- [x] API 知识库
|
||||||
- [ ] 自定义文件读取服务
|
- [ ] 自定义文件读取服务
|
||||||
- [ ] 自定义分块服务
|
- [ ] 自定义分块服务
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
- [x] 对话时反馈引用并可修改与删除
|
- [x] 对话时反馈引用并可修改与删除
|
||||||
- [x] 完整上下文呈现
|
- [x] 完整上下文呈现
|
||||||
- [x] 完整模块中间值呈现
|
- [x] 完整模块中间值呈现
|
||||||
- [x] 高级编排 DeBug 模式
|
- [ ] 高级编排 DeBug 模式
|
||||||
|
|
||||||
`4` OpenAPI 接口
|
`4` OpenAPI 接口
|
||||||
- [x] completions 接口 (chat 模式对齐 GPT 接口)
|
- [x] completions 接口 (chat 模式对齐 GPT 接口)
|
||||||
@@ -104,7 +104,7 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
* [快速开始本地开发](https://doc.tryfastgpt.ai/docs/development/intro/)
|
* [快速开始本地开发](https://doc.tryfastgpt.ai/docs/development/intro/)
|
||||||
* [部署 FastGPT](https://doc.tryfastgpt.ai/docs/development/sealos/)
|
* [部署 FastGPT](https://doc.tryfastgpt.ai/docs/development/sealos/)
|
||||||
* [系统配置文件说明](https://doc.tryfastgpt.ai/docs/development/configuration/)
|
* [系统配置文件说明](https://doc.tryfastgpt.ai/docs/development/configuration/)
|
||||||
* [多模型配置](https://doc.tryfastgpt.ai/docs/development/one-api/)
|
* [多模型配置方案](https://doc.tryfastgpt.ai/docs/development/modelconfig/one-api/)
|
||||||
* [版本更新/升级介绍](https://doc.tryfastgpt.ai/docs/development/upgrading/)
|
* [版本更新/升级介绍](https://doc.tryfastgpt.ai/docs/development/upgrading/)
|
||||||
* [OpenAPI API 文档](https://doc.tryfastgpt.ai/docs/development/openapi/)
|
* [OpenAPI API 文档](https://doc.tryfastgpt.ai/docs/development/openapi/)
|
||||||
* [知识库结构详解](https://doc.tryfastgpt.ai/docs/guide/knowledge_base/rag/)
|
* [知识库结构详解](https://doc.tryfastgpt.ai/docs/guide/knowledge_base/rag/)
|
||||||
@@ -127,7 +127,6 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
|
|
||||||
我们正在寻找志同道合的小伙伴,加速 FastGPT 的发展。你可以通过 [FastGPT 2025 招聘](https://fael3z0zfze.feishu.cn/wiki/P7FOwEmPziVcaYkvVaacnVX1nvg)了解 FastGPT 的招聘信息。
|
我们正在寻找志同道合的小伙伴,加速 FastGPT 的发展。你可以通过 [FastGPT 2025 招聘](https://fael3z0zfze.feishu.cn/wiki/P7FOwEmPziVcaYkvVaacnVX1nvg)了解 FastGPT 的招聘信息。
|
||||||
|
|
||||||
|
|
||||||
## 💪 相关项目
|
## 💪 相关项目
|
||||||
|
|
||||||
- [Laf:3 分钟快速接入三方应用](https://github.com/labring/laf)
|
- [Laf:3 分钟快速接入三方应用](https://github.com/labring/laf)
|
||||||
@@ -139,19 +138,21 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
## 👀 其他
|
|
||||||
|
|
||||||
- [保姆级 FastGPT 教程](https://www.bilibili.com/video/BV1n34y1A7Bo/?spm_id_from=333.999.0.0)
|
## 🌿 第三方生态
|
||||||
- [接入飞书](https://www.bilibili.com/video/BV1Su4y1r7R3/?spm_id_from=333.999.0.0)
|
|
||||||
- [接入企微](https://www.bilibili.com/video/BV1Tp4y1n72T/?spm_id_from=333.999.0.0)
|
- [COW 个人微信/企微机器人](https://doc.tryfastgpt.ai/docs/use-cases/external-integration/onwechat/)
|
||||||
|
- [SiliconCloud (硅基流动) —— 开源模型在线体验平台](https://cloud.siliconflow.cn/i/TR9Ym0c4)
|
||||||
|
|
||||||
<a href="#readme">
|
<a href="#readme">
|
||||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
## 🌿 第三方生态
|
## 👀 其他
|
||||||
|
|
||||||
- [COW 个人微信/企微机器人](https://doc.tryfastgpt.ai/docs/use-cases/external-integration/onwechat/)
|
- [保姆级 FastGPT 教程](https://www.bilibili.com/video/BV1n34y1A7Bo/?spm_id_from=333.999.0.0)
|
||||||
|
- [接入飞书](https://www.bilibili.com/video/BV1Su4y1r7R3/?spm_id_from=333.999.0.0)
|
||||||
|
- [接入企微](https://www.bilibili.com/video/BV1Tp4y1n72T/?spm_id_from=333.999.0.0)
|
||||||
|
|
||||||
<a href="#readme">
|
<a href="#readme">
|
||||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||||
@@ -214,4 +215,4 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
1. 允许作为后台服务直接商用,但不允许提供 SaaS 服务。
|
1. 允许作为后台服务直接商用,但不允许提供 SaaS 服务。
|
||||||
2. 未经商业授权,任何形式的商用服务均需保留相关版权信息。
|
2. 未经商业授权,任何形式的商用服务均需保留相关版权信息。
|
||||||
3. 完整请查看 [FastGPT Open Source License](./LICENSE)
|
3. 完整请查看 [FastGPT Open Source License](./LICENSE)
|
||||||
4. 联系方式:Dennis@sealos.io,[点击查看商业版定价策略](https://doc.tryfastgpt.ai/docs/commercial)
|
4. 联系方式:Dennis@sealos.io,[点击查看商业版定价策略](https://doc.tryfastgpt.ai/docs/shopping_cart/intro/)
|
||||||
|
|||||||
BIN
docSite/assets/imgs/dataset1.png
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
docSite/assets/imgs/dataset2.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
docSite/assets/imgs/image-55.png
Normal file
|
After Width: | Height: | Size: 310 KiB |
BIN
docSite/assets/imgs/image-56.png
Normal file
|
After Width: | Height: | Size: 462 KiB |
BIN
docSite/assets/imgs/image-57.png
Normal file
|
After Width: | Height: | Size: 362 KiB |
BIN
docSite/assets/imgs/image-58.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
docSite/assets/imgs/image-59.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
docSite/assets/imgs/image-60.png
Normal file
|
After Width: | Height: | Size: 259 KiB |
BIN
docSite/assets/imgs/image-61.png
Normal file
|
After Width: | Height: | Size: 337 KiB |
BIN
docSite/assets/imgs/image-62.png
Normal file
|
After Width: | Height: | Size: 234 KiB |
BIN
docSite/assets/imgs/image-63.png
Normal file
|
After Width: | Height: | Size: 240 KiB |
BIN
docSite/assets/imgs/image-64.png
Normal file
|
After Width: | Height: | Size: 288 KiB |
BIN
docSite/assets/imgs/image-65.png
Normal file
|
After Width: | Height: | Size: 680 KiB |
BIN
docSite/assets/imgs/image-66.png
Normal file
|
After Width: | Height: | Size: 485 KiB |
BIN
docSite/assets/imgs/image-67.png
Normal file
|
After Width: | Height: | Size: 279 KiB |
BIN
docSite/assets/imgs/image-68.png
Normal file
|
After Width: | Height: | Size: 610 KiB |
BIN
docSite/assets/imgs/image-69.png
Normal file
|
After Width: | Height: | Size: 516 KiB |
BIN
docSite/assets/imgs/image-70.png
Normal file
|
After Width: | Height: | Size: 491 KiB |
BIN
docSite/assets/imgs/image-71.png
Normal file
|
After Width: | Height: | Size: 274 KiB |
BIN
docSite/assets/imgs/image-72.png
Normal file
|
After Width: | Height: | Size: 348 KiB |
BIN
docSite/assets/imgs/image-73.png
Normal file
|
After Width: | Height: | Size: 341 KiB |
BIN
docSite/assets/imgs/image-74.png
Normal file
|
After Width: | Height: | Size: 411 KiB |
BIN
docSite/assets/imgs/image-75.png
Normal file
|
After Width: | Height: | Size: 402 KiB |
BIN
docSite/assets/imgs/image-76.png
Normal file
|
After Width: | Height: | Size: 304 KiB |
BIN
docSite/assets/imgs/image-77.png
Normal file
|
After Width: | Height: | Size: 824 KiB |
BIN
docSite/assets/imgs/image-78.png
Normal file
|
After Width: | Height: | Size: 664 KiB |
BIN
docSite/assets/imgs/image-79.png
Normal file
|
After Width: | Height: | Size: 312 KiB |
BIN
docSite/assets/imgs/image-80.png
Normal file
|
After Width: | Height: | Size: 302 KiB |
BIN
docSite/assets/imgs/image-81.png
Normal file
|
After Width: | Height: | Size: 323 KiB |
BIN
docSite/assets/imgs/image-82.png
Normal file
|
After Width: | Height: | Size: 97 KiB |
@@ -4,7 +4,7 @@ description: 'FastGPT 配置参数介绍'
|
|||||||
icon: 'settings'
|
icon: 'settings'
|
||||||
draft: false
|
draft: false
|
||||||
toc: true
|
toc: true
|
||||||
weight: 708
|
weight: 707
|
||||||
---
|
---
|
||||||
|
|
||||||
由于环境变量不利于配置复杂的内容,新版 FastGPT 采用了 ConfigMap 的形式挂载配置文件,你可以在 `projects/app/data/config.json` 看到默认的配置文件。可以参考 [docker-compose 快速部署](/docs/development/docker/) 来挂载配置文件。
|
由于环境变量不利于配置复杂的内容,新版 FastGPT 采用了 ConfigMap 的形式挂载配置文件,你可以在 `projects/app/data/config.json` 看到默认的配置文件。可以参考 [docker-compose 快速部署](/docs/development/docker/) 来挂载配置文件。
|
||||||
@@ -97,7 +97,9 @@ weight: 708
|
|||||||
"customExtractPrompt": "",
|
"customExtractPrompt": "",
|
||||||
"defaultSystemChatPrompt": "",
|
"defaultSystemChatPrompt": "",
|
||||||
"defaultConfig": {
|
"defaultConfig": {
|
||||||
"temperature": 1
|
"temperature": 1,
|
||||||
|
"max_tokens": null,
|
||||||
|
"stream": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -122,7 +124,9 @@ weight: 708
|
|||||||
"customExtractPrompt": "",
|
"customExtractPrompt": "",
|
||||||
"defaultSystemChatPrompt": "",
|
"defaultSystemChatPrompt": "",
|
||||||
"defaultConfig": {
|
"defaultConfig": {
|
||||||
"temperature": 1
|
"temperature": 1,
|
||||||
|
"max_tokens": null,
|
||||||
|
"stream": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -164,6 +168,7 @@ weight: 708
|
|||||||
"reRankModels": [],
|
"reRankModels": [],
|
||||||
"audioSpeechModels": [
|
"audioSpeechModels": [
|
||||||
{
|
{
|
||||||
|
"provider": "OpenAI",
|
||||||
"model": "tts-1",
|
"model": "tts-1",
|
||||||
"name": "OpenAI TTS1",
|
"name": "OpenAI TTS1",
|
||||||
"charsPointsPrice": 0,
|
"charsPointsPrice": 0,
|
||||||
@@ -178,6 +183,7 @@ weight: 708
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"whisperModel": {
|
"whisperModel": {
|
||||||
|
"provider": "OpenAI",
|
||||||
"model": "whisper-1",
|
"model": "whisper-1",
|
||||||
"name": "Whisper1",
|
"name": "Whisper1",
|
||||||
"charsPointsPrice": 0
|
"charsPointsPrice": 0
|
||||||
@@ -185,7 +191,7 @@ weight: 708
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## 模型提供商
|
## 内置的模型提供商ID
|
||||||
|
|
||||||
为了方便模型分类展示,FastGPT 内置了部分模型提供商的名字和 Logo。如果你期望补充提供商,可[提交 Issue](https://github.com/labring/FastGPT/issues),并提供几个信息:
|
为了方便模型分类展示,FastGPT 内置了部分模型提供商的名字和 Logo。如果你期望补充提供商,可[提交 Issue](https://github.com/labring/FastGPT/issues),并提供几个信息:
|
||||||
|
|
||||||
@@ -197,7 +203,9 @@ weight: 708
|
|||||||
- OpenAI
|
- OpenAI
|
||||||
- Claude
|
- Claude
|
||||||
- Gemini
|
- Gemini
|
||||||
|
- Meta
|
||||||
- MistralAI
|
- MistralAI
|
||||||
|
- AliCloud - 阿里云
|
||||||
- Qwen - 通义千问
|
- Qwen - 通义千问
|
||||||
- Doubao - 豆包
|
- Doubao - 豆包
|
||||||
- ChatGLM - 智谱
|
- ChatGLM - 智谱
|
||||||
@@ -209,13 +217,40 @@ weight: 708
|
|||||||
- Baichuan - 百川
|
- Baichuan - 百川
|
||||||
- Yi - 零一万物
|
- Yi - 零一万物
|
||||||
- Ernie - 文心一言
|
- Ernie - 文心一言
|
||||||
|
- StepFun - 阶跃星辰
|
||||||
- Ollama
|
- Ollama
|
||||||
|
- BAAI - 智源研究院
|
||||||
|
- FishAudio
|
||||||
- Other - 其他
|
- Other - 其他
|
||||||
|
|
||||||
|
|
||||||
## 特殊模型
|
## ReRank 模型接入
|
||||||
|
|
||||||
### ReRank 接入(私有部署)
|
由于 OneAPI 不支持 Rerank 模型,所以需要单独配置接入,这里
|
||||||
|
|
||||||
|
|
||||||
|
### 使用硅基流动的在线模型
|
||||||
|
|
||||||
|
有免费的 `bge-reranker-v2-m3` 模型可以使用。
|
||||||
|
|
||||||
|
1. [点击注册硅基流动账号](https://cloud.siliconflow.cn/i/TR9Ym0c4)
|
||||||
|
2. 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak
|
||||||
|
3. 修改 FastGPT 配置文件
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"reRankModels": [
|
||||||
|
{
|
||||||
|
"model": "BAAI/bge-reranker-v2-m3", // 这里的model需要对应 siliconflow 的模型名
|
||||||
|
"name": "BAAI/bge-reranker-v2-m3",
|
||||||
|
"requestUrl": "https://api.siliconflow.cn/v1/rerank",
|
||||||
|
"requestAuth": "siliconflow 上申请的 key"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 私有部署模型
|
||||||
|
|
||||||
请使用 4.6.6-alpha 以上版本,配置文件中的 `reRankModels` 为重排模型,虽然是数组,不过目前仅有第1个生效。
|
请使用 4.6.6-alpha 以上版本,配置文件中的 `reRankModels` 为重排模型,虽然是数组,不过目前仅有第1个生效。
|
||||||
|
|
||||||
@@ -236,44 +271,3 @@ weight: 708
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### ReRank 接入(硅基流动)
|
|
||||||
|
|
||||||
有免费的 `bge-reranker-v2-m3` 模型可以使用。
|
|
||||||
|
|
||||||
1. 注册硅基流动账号: https://siliconflow.cn/
|
|
||||||
2. 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak
|
|
||||||
3. 修改 FastGPT 配置文件
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"reRankModels": [
|
|
||||||
{
|
|
||||||
"model": "BAAI/bge-reranker-v2-m3", // 这里的model需要对应 siliconflow 的模型名
|
|
||||||
"name": "BAAI/bge-reranker-v2-m3",
|
|
||||||
"requestUrl": "https://api.siliconflow.cn/v1/rerank",
|
|
||||||
"requestAuth": "siliconflow 上申请的 key"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### ReRank 接入(Cohere)
|
|
||||||
|
|
||||||
这个重排模型对中文不是很好,不如 bge 的好用。
|
|
||||||
|
|
||||||
1. 申请 Cohere 官方 Key: https://dashboard.cohere.com/api-keys
|
|
||||||
2. 修改 FastGPT 配置文件
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"reRankModels": [
|
|
||||||
{
|
|
||||||
"model": "rerank-multilingual-v2.0", // 这里的model需要对应 cohere 的模型名
|
|
||||||
"name": "rerank-multilingual-v2.0",
|
|
||||||
"requestUrl": "https://api.cohere.ai/v1/rerank",
|
|
||||||
"requestAuth": "Coherer上申请的key"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ FastGPT 默认使用了 OpenAI 的 LLM 模型和向量模型,如果想要私
|
|||||||
也可以通过环境变量引入:sk-key。有关docker环境变量引入的方法请自寻教程,此处不再赘述。
|
也可以通过环境变量引入:sk-key。有关docker环境变量引入的方法请自寻教程,此处不再赘述。
|
||||||
```
|
```
|
||||||
|
|
||||||
## 接入 [One API](/docs/development/one-api/)
|
## 接入 [One API](/docs/development/modelconfig/one-api/)
|
||||||
|
|
||||||
为 chatglm2 和 m3e-large 各添加一个渠道,参数如下:
|
为 chatglm2 和 m3e-large 各添加一个渠道,参数如下:
|
||||||
|
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ xinference launch -n qwen-chat -s 14 -f pytorch
|
|||||||
|
|
||||||
## 将本地模型接入 One API
|
## 将本地模型接入 One API
|
||||||
|
|
||||||
One API 的部署和接入请参考[这里](/docs/development/one-api/)。
|
One API 的部署和接入请参考[这里](/docs/development/modelconfig/one-api/)。
|
||||||
|
|
||||||
为 qwen1.5-chat 添加一个渠道,这里的 Base URL 需要填 Xinference 服务的端点,并且注册 qwen-chat (模型的 UID) 。
|
为 qwen1.5-chat 添加一个渠道,这里的 Base URL 需要填 Xinference 服务的端点,并且注册 qwen-chat (模型的 UID) 。
|
||||||
|
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ docker restart oneapi
|
|||||||
|
|
||||||
可以通过`ip:3001`访问OneAPI,默认账号为`root`密码为`123456`。
|
可以通过`ip:3001`访问OneAPI,默认账号为`root`密码为`123456`。
|
||||||
|
|
||||||
在OneApi中添加合适的AI模型渠道。[点击查看相关教程](/docs/development/one-api/)
|
在OneApi中添加合适的AI模型渠道。[点击查看相关教程](/docs/development/modelconfig/one-api/)
|
||||||
|
|
||||||
### 5. 访问 FastGPT
|
### 5. 访问 FastGPT
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
weight: 749
|
weight: 740
|
||||||
title: "私有部署常见问题"
|
title: "私有部署常见问题"
|
||||||
description: "FastGPT 私有部署常见问题"
|
description: "FastGPT 私有部署常见问题"
|
||||||
icon: upgrade
|
icon: upgrade
|
||||||
@@ -19,6 +19,10 @@ images: []
|
|||||||
|
|
||||||
## 二、通用问题
|
## 二、通用问题
|
||||||
|
|
||||||
|
### 本地部署的限制
|
||||||
|
|
||||||
|
具体内容参考https://fael3z0zfze.feishu.cn/wiki/OFpAw8XzAi36Guk8dfucrCKUnjg。
|
||||||
|
|
||||||
### 能否纯本地运行
|
### 能否纯本地运行
|
||||||
|
|
||||||
可以。需要准备好向量模型和LLM模型。
|
可以。需要准备好向量模型和LLM模型。
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ FastGPT 在`pnpm i`后会执行`postinstall`脚本,用于自动生成`ChakraUI
|
|||||||
|
|
||||||
## 加入社区
|
## 加入社区
|
||||||
|
|
||||||
遇到困难了吗?有任何问题吗? 加入微信群与开发者和用户保持沟通。
|
遇到困难了吗?有任何问题吗? 加入飞书群与开发者和用户保持沟通。
|
||||||
|
|
||||||
<img width="400px" src="https://oss.laf.run/otnvvf-imgs/fastgpt-feishu1.png" class="medium-zoom-image" />
|
<img width="400px" src="https://oss.laf.run/otnvvf-imgs/fastgpt-feishu1.png" class="medium-zoom-image" />
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
weight: 745
|
||||||
|
title: '模型配置方案'
|
||||||
|
description: '本模型配置方案'
|
||||||
|
icon: 'code_blocks'
|
||||||
|
draft: false
|
||||||
|
images: []
|
||||||
|
---
|
||||||
189
docSite/content/zh-cn/docs/development/modelConfig/one-api.md
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
---
|
||||||
|
title: '通过 OneAPI 接入模型'
|
||||||
|
description: '通过 OneAPI 接入模型'
|
||||||
|
icon: 'api'
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 745
|
||||||
|
---
|
||||||
|
|
||||||
|
FastGPT 目前采用模型分离的部署方案,FastGPT 中只兼容 OpenAI 的模型规范(OpenAI 不存在的模型采用一个较为通用的规范),并通过 [One API](https://github.com/songquanpeng/one-api) 来实现对不同模型接口的统一。
|
||||||
|
|
||||||
|
[One API](https://github.com/songquanpeng/one-api) 是一个 OpenAI 接口管理 & 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。
|
||||||
|
|
||||||
|
|
||||||
|
## FastGPT 与 One API 关系
|
||||||
|
|
||||||
|
可以把 One API 当做一个网关,FastGPT 与 One API 关系:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 部署
|
||||||
|
|
||||||
|
### Docker 版本
|
||||||
|
|
||||||
|
`docker-compose.yml` 文件已加入了 OneAPI 配置,可直接使用。默认暴露在 3001 端口。
|
||||||
|
|
||||||
|
### Sealos 版本
|
||||||
|
|
||||||
|
* 北京区: [点击部署 OneAPI](https://hzh.sealos.run/?openapp=system-template%3FtemplateName%3Done-api)
|
||||||
|
* 新加坡区(可用 GPT) [点击部署 OneAPI](https://cloud.sealos.io/?openapp=system-template%3FtemplateName%3Done-api)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
部署完后,可以打开 OneAPI 访问链接,进行下一步操作。
|
||||||
|
|
||||||
|
## OneAPI 基础教程
|
||||||
|
|
||||||
|
### 概念
|
||||||
|
|
||||||
|
1. 渠道:
|
||||||
|
1. OneApi 中一个渠道对应一个 `Api Key`,这个 `Api Key` 可以是GPT、微软、ChatGLM、文心一言的。一个`Api Key`通常可以调用同一个厂商的多个模型。
|
||||||
|
2. One API 会根据请求传入的`模型`来决定使用哪一个`渠道`,如果一个模型对应了多个`渠道`,则会随机调用。
|
||||||
|
2. 令牌:访问 One API 所需的凭证,只需要这`1`个凭证即可访问`One API`上配置的模型。因此`FastGPT`中,只需要配置`One API`的`baseurl`和`令牌`即可。令牌不要设置任何的模型范围权限,否则容易报错。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 大致工作流程
|
||||||
|
|
||||||
|
1. 客户端请求 One API
|
||||||
|
2. 根据请求中的 `model` 参数,匹配对应的渠道(根据渠道里的模型进行匹配,必须完全一致)。如果匹配到多个渠道,则随机选择一个(同优先级)。
|
||||||
|
3. One API 向真正的地址发出请求。
|
||||||
|
4. One API 将结果返回给客户端。
|
||||||
|
|
||||||
|
### 1. 登录 One API
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 2. 创建渠道
|
||||||
|
|
||||||
|
在 One API 中添加对应渠道,直接点击 【添加基础模型】,不要遗漏了向量模型(Embedding)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 3. 创建令牌
|
||||||
|
|
||||||
|
| | |
|
||||||
|
| --- | --- |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
### 4. 修改账号余额
|
||||||
|
|
||||||
|
One API 默认 root 用户只有 200刀,可以自行修改编辑。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 5. 修改 FastGPT 的环境变量
|
||||||
|
|
||||||
|
有了 One API 令牌后,FastGPT 可以通过修改 `baseurl` 和 `key` 去请求到 One API,再由 One API 去请求不同的模型。修改下面两个环境变量:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 务必写上 v1。如果在同一个网络内,可改成内网地址。
|
||||||
|
OPENAI_BASE_URL=https://xxxx.cloud.sealos.io/v1
|
||||||
|
# 下面的 key 是由 One API 提供的令牌
|
||||||
|
CHAT_API_KEY=sk-xxxxxx
|
||||||
|
```
|
||||||
|
|
||||||
|
## 接入其他模型
|
||||||
|
|
||||||
|
**以添加文心一言为例:**
|
||||||
|
|
||||||
|
### 1. OneAPI 新增模型渠道
|
||||||
|
|
||||||
|
类型选择百度文心千帆。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 2. 修改 FastGPT 配置文件
|
||||||
|
|
||||||
|
可以在 `/projects/app/src/data/config.json` 里找到配置文件(本地开发需要复制成 config.local.json),按下面内容修改配置文件,最新/更具体的配置说明,可查看[FastGPT 配置文件说明](/docs/development/configuration)。
|
||||||
|
|
||||||
|
配置模型关键点在于`model` 需要与 OneAPI 渠道中的模型一致。
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"llmModels": [ // 语言模型配置
|
||||||
|
{
|
||||||
|
"model": "ERNIE-Bot", // 这里的模型需要对应 One API 的模型
|
||||||
|
"name": "文心一言", // 对外展示的名称
|
||||||
|
"avatar": "/imgs/model/openai.svg", // 模型的logo
|
||||||
|
"maxContext": 16000, // 最大上下文
|
||||||
|
"maxResponse": 4000, // 最大回复
|
||||||
|
"quoteMaxToken": 13000, // 最大引用内容
|
||||||
|
"maxTemperature": 1.2, // 最大温度
|
||||||
|
"charsPointsPrice": 0,
|
||||||
|
"censor": false,
|
||||||
|
"vision": false, // 是否支持图片输入
|
||||||
|
"datasetProcess": true, // 是否设置为知识库处理模型
|
||||||
|
"usedInClassify": true, // 是否用于问题分类
|
||||||
|
"usedInExtractFields": true, // 是否用于字段提取
|
||||||
|
"usedInToolCall": true, // 是否用于工具调用
|
||||||
|
"usedInQueryExtension": true, // 是否用于问题优化
|
||||||
|
"toolChoice": true, // 是否支持工具选择
|
||||||
|
"functionCall": false, // 是否支持函数调用
|
||||||
|
"customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
|
||||||
|
"customExtractPrompt": "", // 自定义内容提取提示词
|
||||||
|
"defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
|
||||||
|
"defaultConfig":{} // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"vectorModels": [ // 向量模型配置
|
||||||
|
{
|
||||||
|
"model": "text-embedding-ada-002",
|
||||||
|
"name": "Embedding-2",
|
||||||
|
"avatar": "/imgs/model/openai.svg",
|
||||||
|
"charsPointsPrice": 0,
|
||||||
|
"defaultToken": 700,
|
||||||
|
"maxToken": 3000,
|
||||||
|
"weight": 100
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 重启 FastGPT
|
||||||
|
|
||||||
|
**Docker 版本**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose down
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
**Sealos 版本**
|
||||||
|
|
||||||
|
直接找到 FastGPT 服务,点击重启即可。
|
||||||
|
|
||||||
|
|
||||||
|
## 其他服务商接入参考
|
||||||
|
|
||||||
|
这章介绍一些提供商接入 OneAPI 的教程,配置后不要忘记修改 FastGPT 配置文件。
|
||||||
|
|
||||||
|
### 阿里通义千问
|
||||||
|
|
||||||
|
千问目前已经兼容 GPT 格式,可以直接选择 OpenAI 类型来接入即可。如下图,选择类型为`OpenAI`,代理填写阿里云的代理地址。
|
||||||
|
|
||||||
|
目前可以直接使用阿里云的语言模型和 `text-embedding-v3` 向量模型(实测已经归一化,可直接使用)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 硅基流动 —— 开源模型大合集
|
||||||
|
|
||||||
|
[硅基流动](https://cloud.siliconflow.cn/i/TR9Ym0c4) 是一个专门提供开源模型调用平台,并拥有自己的加速引擎。模型覆盖面广,非常适合低成本来测试开源模型。接入教程:
|
||||||
|
|
||||||
|
1. [点击注册硅基流动账号](https://cloud.siliconflow.cn/i/TR9Ym0c4)
|
||||||
|
2. 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak
|
||||||
|
3. 新增 OneAPI 渠道,选择`OpenAI`类型,代理填写:`https://api.siliconflow.cn`,密钥是第二步创建的密钥。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
由于 OneAPI 未内置 硅基流动 的模型名,可以通过自定义模型名称来填入,下面是获取模型名称的教程:
|
||||||
|
|
||||||
|
1. 打开[硅基流动模型列表](https://siliconflow.cn/zh-cn/models)
|
||||||
|
2. 单击模型后,会打开模型详情。
|
||||||
|
3. 复制模型名到 OneAPI 中。
|
||||||
|
|
||||||
|
| | | |
|
||||||
|
| --- | --- | --- |
|
||||||
|
|  | |  |
|
||||||
|
|
||||||
@@ -0,0 +1,220 @@
|
|||||||
|
---
|
||||||
|
title: '通过 SiliconCloud 体验开源模型'
|
||||||
|
description: '通过 SiliconCloud 体验开源模型'
|
||||||
|
icon: 'api'
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 746
|
||||||
|
---
|
||||||
|
|
||||||
|
[SiliconCloud(硅基流动)](https://cloud.siliconflow.cn/i/TR9Ym0c4) 是一个以提供开源模型调用为主的平台,并拥有自己的加速引擎。帮助用户低成本、快速的进行开源模型的测试和使用。实际体验下来,他们家模型的速度和稳定性都非常不错,并且种类丰富,覆盖语言、向量、重排、TTS、STT、绘图、视频生成模型,可以满足 FastGPT 中所有模型需求。
|
||||||
|
|
||||||
|
如果你想部分模型使用 SiliconCloud 的模型,可额外参考[OneAPI接入硅基流动](/docs/development/modelconfig/one-api/#硅基流动--开源模型大合集)。
|
||||||
|
|
||||||
|
本文会介绍完全使用 SiliconCloud 模型来部署 FastGPT 的方案。
|
||||||
|
|
||||||
|
|
||||||
|
## 1. 注册 SiliconCloud 账号
|
||||||
|
|
||||||
|
1. [点击注册硅基流动账号](https://cloud.siliconflow.cn/i/TR9Ym0c4)
|
||||||
|
2. 进入控制台,获取 API key: https://cloud.siliconflow.cn/account/ak
|
||||||
|
|
||||||
|
## 2. 修改 FastGPT 环境变量
|
||||||
|
|
||||||
|
```bash
|
||||||
|
OPENAI_BASE_URL=https://api.siliconflow.cn/v1
|
||||||
|
# 填写 SiliconCloud 控制台提供的 Api Key
|
||||||
|
CHAT_API_KEY=sk-xxxxxx
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. 修改 FastGPT 配置文件
|
||||||
|
|
||||||
|
我们选取 SiliconCloud 中的模型作为 FastGPT 配置。这里配置了 `Qwen2.5 72b` 的纯语言和视觉模型;选择 `bge-m3` 作为向量模型;选择 `bge-reranker-v2-m3` 作为重排模型。选择 `fish-speech-1.5` 作为语音模型;选择 `SenseVoiceSmall` 作为语音输入模型。
|
||||||
|
|
||||||
|
注意:ReRank 模型仍需配置一次 Api Key
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"llmModels": [
|
||||||
|
{
|
||||||
|
"provider": "Other", // 模型提供商,主要用于分类展示,目前已经内置提供商包括:https://github.com/labring/FastGPT/blob/main/packages/global/core/ai/provider.ts, 可 pr 提供新的提供商,或直接填写 Other
|
||||||
|
"model": "Qwen/Qwen2.5-72B-Instruct", // 模型名(对应OneAPI中渠道的模型名)
|
||||||
|
"name": "Qwen2.5-72B-Instruct", // 模型别名
|
||||||
|
"maxContext": 32000, // 最大上下文
|
||||||
|
"maxResponse": 4000, // 最大回复
|
||||||
|
"quoteMaxToken": 30000, // 最大引用内容
|
||||||
|
"maxTemperature": 1, // 最大温度
|
||||||
|
"charsPointsPrice": 0, // n积分/1k token(商业版)
|
||||||
|
"censor": false, // 是否开启敏感校验(商业版)
|
||||||
|
"vision": false, // 是否支持图片输入
|
||||||
|
"datasetProcess": true, // 是否设置为文本理解模型(QA),务必保证至少有一个为true,否则知识库会报错
|
||||||
|
"usedInClassify": true, // 是否用于问题分类(务必保证至少有一个为true)
|
||||||
|
"usedInExtractFields": true, // 是否用于内容提取(务必保证至少有一个为true)
|
||||||
|
"usedInToolCall": true, // 是否用于工具调用(务必保证至少有一个为true)
|
||||||
|
"usedInQueryExtension": true, // 是否用于问题优化(务必保证至少有一个为true)
|
||||||
|
"toolChoice": true, // 是否支持工具选择(分类,内容提取,工具调用会用到。)
|
||||||
|
"functionCall": false, // 是否支持函数调用(分类,内容提取,工具调用会用到。会优先使用 toolChoice,如果为false,则使用 functionCall,如果仍为 false,则使用提示词模式)
|
||||||
|
"customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
|
||||||
|
"customExtractPrompt": "", // 自定义内容提取提示词
|
||||||
|
"defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
|
||||||
|
"defaultConfig": {}, // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)
|
||||||
|
"fieldMap": {} // 字段映射(o1 模型需要把 max_tokens 映射为 max_completion_tokens)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"provider": "Other",
|
||||||
|
"model": "Qwen/Qwen2-VL-72B-Instruct",
|
||||||
|
"name": "Qwen2-VL-72B-Instruct",
|
||||||
|
"maxContext": 32000,
|
||||||
|
"maxResponse": 4000,
|
||||||
|
"quoteMaxToken": 30000,
|
||||||
|
"maxTemperature": 1,
|
||||||
|
"charsPointsPrice": 0,
|
||||||
|
"censor": false,
|
||||||
|
"vision": true,
|
||||||
|
"datasetProcess": false,
|
||||||
|
"usedInClassify": false,
|
||||||
|
"usedInExtractFields": false,
|
||||||
|
"usedInToolCall": false,
|
||||||
|
"usedInQueryExtension": false,
|
||||||
|
"toolChoice": false,
|
||||||
|
"functionCall": false,
|
||||||
|
"customCQPrompt": "",
|
||||||
|
"customExtractPrompt": "",
|
||||||
|
"defaultSystemChatPrompt": "",
|
||||||
|
"defaultConfig": {}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"vectorModels": [
|
||||||
|
{
|
||||||
|
"provider": "Other",
|
||||||
|
"model": "Pro/BAAI/bge-m3",
|
||||||
|
"name": "Pro/BAAI/bge-m3",
|
||||||
|
"charsPointsPrice": 0,
|
||||||
|
"defaultToken": 512,
|
||||||
|
"maxToken": 5000,
|
||||||
|
"weight": 100
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"reRankModels": [
|
||||||
|
{
|
||||||
|
"model": "BAAI/bge-reranker-v2-m3", // 这里的model需要对应 siliconflow 的模型名
|
||||||
|
"name": "BAAI/bge-reranker-v2-m3",
|
||||||
|
"requestUrl": "https://api.siliconflow.cn/v1/rerank",
|
||||||
|
"requestAuth": "siliconflow 上申请的 key"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"audioSpeechModels": [
|
||||||
|
{
|
||||||
|
"model": "fishaudio/fish-speech-1.5",
|
||||||
|
"name": "fish-speech-1.5",
|
||||||
|
"voices": [
|
||||||
|
{
|
||||||
|
"label": "fish-alex",
|
||||||
|
"value": "fishaudio/fish-speech-1.5:alex",
|
||||||
|
"bufferId": "fish-alex"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "fish-anna",
|
||||||
|
"value": "fishaudio/fish-speech-1.5:anna",
|
||||||
|
"bufferId": "fish-anna"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "fish-bella",
|
||||||
|
"value": "fishaudio/fish-speech-1.5:bella",
|
||||||
|
"bufferId": "fish-bella"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "fish-benjamin",
|
||||||
|
"value": "fishaudio/fish-speech-1.5:benjamin",
|
||||||
|
"bufferId": "fish-benjamin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "fish-charles",
|
||||||
|
"value": "fishaudio/fish-speech-1.5:charles",
|
||||||
|
"bufferId": "fish-charles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "fish-claire",
|
||||||
|
"value": "fishaudio/fish-speech-1.5:claire",
|
||||||
|
"bufferId": "fish-claire"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "fish-david",
|
||||||
|
"value": "fishaudio/fish-speech-1.5:david",
|
||||||
|
"bufferId": "fish-david"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "fish-diana",
|
||||||
|
"value": "fishaudio/fish-speech-1.5:diana",
|
||||||
|
"bufferId": "fish-diana"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"whisperModel": {
|
||||||
|
"model": "FunAudioLLM/SenseVoiceSmall",
|
||||||
|
"name": "SenseVoiceSmall",
|
||||||
|
"charsPointsPrice": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. 重启 FastGPT
|
||||||
|
|
||||||
|
## 5. 体验测试
|
||||||
|
|
||||||
|
### 测试对话和图片识别
|
||||||
|
|
||||||
|
随便新建一个简易应用,选择对应模型,并开启图片上传后进行测试:
|
||||||
|
|
||||||
|
| | |
|
||||||
|
| --- | --- |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
可以看到,72B 的模型,性能还是非常快的,这要是本地没几个 4090,不说配置环境,输出怕都要 30s 了。
|
||||||
|
|
||||||
|
### 测试知识库导入和知识库问答
|
||||||
|
|
||||||
|
新建一个知识库(由于只配置了一个向量模型,页面上不会展示向量模型选择)
|
||||||
|
|
||||||
|
| | |
|
||||||
|
| --- | --- |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
导入本地文件,直接选择文件,然后一路下一步即可。79 个索引,大概花了 20s 的时间就完成了。现在我们去测试一下知识库问答。
|
||||||
|
|
||||||
|
首先回到我们刚创建的应用,选择知识库,调整一下参数后即可开始对话:
|
||||||
|
|
||||||
|
| | | |
|
||||||
|
| --- | --- | --- |
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
对话完成后,点击底部的引用,可以查看引用详情,同时可以看到具体的检索和重排得分:
|
||||||
|
|
||||||
|
| | |
|
||||||
|
| --- | --- |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
### 测试语音播放
|
||||||
|
|
||||||
|
继续在刚刚的应用中,左侧配置中找到语音播放,点击后可以从弹窗中选择语音模型,并进行试听:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 测试语言输入
|
||||||
|
|
||||||
|
继续在刚刚的应用中,左侧配置中找到语音输入,点击后可以从弹窗中开启语言输入
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
开启后,对话输入框中,会增加一个话筒的图标,点击可进行语音输入:
|
||||||
|
|
||||||
|
| | |
|
||||||
|
| --- | --- |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
## 总结
|
||||||
|
|
||||||
|
如果你想快速的体验开源模型或者快速的使用 FastGPT,不想在不同服务商申请各类 Api Key,那么可以选择 SiliconCloud 的模型先进行快速体验。
|
||||||
|
|
||||||
|
如果你决定未来私有化部署模型和 FastGPT,前期可通过 SiliconCloud 进行测试验证,后期再进行硬件采购,减少 POC 时间和成本。
|
||||||
@@ -1,179 +0,0 @@
|
|||||||
---
|
|
||||||
title: '使用 One API 接入 Azure、ChatGLM 和本地模型'
|
|
||||||
description: '部署和使用 One API,实现 Azure、ChatGLM 和本地模型的接入。'
|
|
||||||
icon: 'api'
|
|
||||||
draft: false
|
|
||||||
toc: true
|
|
||||||
weight: 708
|
|
||||||
---
|
|
||||||
|
|
||||||
* 默认情况下,FastGPT 只配置了 GPT 的模型,如果你需要接入其他模型,需要进行一些额外配置。
|
|
||||||
* [One API](https://github.com/songquanpeng/one-api) 是一个 OpenAI 接口管理 & 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。
|
|
||||||
* FastGPT 可以通过接入 One API 来实现对不同大模型的支持。One API 的部署方法也很简单。
|
|
||||||
|
|
||||||
## FastGPT 与 One API 关系
|
|
||||||
|
|
||||||
可以把 One API 当做一个网关。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 部署
|
|
||||||
|
|
||||||
### Docker 版本
|
|
||||||
|
|
||||||
已加入最新的 `docker-compose.yml` 文件中。
|
|
||||||
|
|
||||||
### Sealos - MySQL 版本
|
|
||||||
|
|
||||||
MySQL 版本支持多实例,高并发。
|
|
||||||
|
|
||||||
直接点击以下按钮即可一键部署 👇
|
|
||||||
|
|
||||||
<a href="https://template.cloud.sealos.io/deploy?templateName=one-api" rel="external" target="_blank"><img src="https://cdn.jsdelivr.net/gh/labring-actions/templates@main/Deploy-on-Sealos.svg" alt="Deploy on Sealos"/></a>
|
|
||||||
|
|
||||||
部署完后会跳转「应用管理」,数据库在另一个应用「数据库」中。需要等待 1~3 分钟数据库运行后才能访问成功。
|
|
||||||
|
|
||||||
### Sealos - SqlLite 版本
|
|
||||||
|
|
||||||
SqlLite 版本不支持多实例,适合个人小流量使用,但是价格非常便宜。
|
|
||||||
|
|
||||||
**1. [点击打开 Sealos 公有云](https://cloud.sealos.io/)**
|
|
||||||
|
|
||||||
**2. 打开 AppLaunchpad(应用管理) 工具**
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**3. 点击创建新应用**
|
|
||||||
|
|
||||||
**4. 填写对应参数**
|
|
||||||
|
|
||||||
镜像:ghcr.io/songquanpeng/one-api:latest
|
|
||||||
|
|
||||||

|
|
||||||
打开外网访问开关后,Sealos 会自动分配一个可访问的地址,不需要自己配置。
|
|
||||||
|
|
||||||

|
|
||||||
填写完参数后,点击右上角部署即可。环境变量:
|
|
||||||
|
|
||||||
```
|
|
||||||
SESSION_SECRET=SESSION_SECRET
|
|
||||||
POLLING_INTERVAL=60
|
|
||||||
BATCH_UPDATE_ENABLED=true
|
|
||||||
BATCH_UPDATE_INTERVAL=60
|
|
||||||
```
|
|
||||||
|
|
||||||
## One API 使用教程
|
|
||||||
|
|
||||||
### 概念
|
|
||||||
|
|
||||||
1. 渠道:
|
|
||||||
1. OneApi 中一个渠道对应一个 `Api Key`,这个 `Api Key` 可以是GPT、微软、ChatGLM、文心一言的。一个`Api Key`通常可以调用同一个厂商的多个模型。
|
|
||||||
2. One API 会根据请求传入的`模型`来决定使用哪一个`Key`,如果一个模型对应了多个`Key`,则会随机调用。
|
|
||||||
2. 令牌:访问 One API 所需的凭证,只需要这`1`个凭证即可访问`One API`上配置的模型。因此`FastGPT`中,只需要配置`One API`的`baseurl`和`令牌`即可。
|
|
||||||
|
|
||||||
### 大致工作流程
|
|
||||||
|
|
||||||
1. 客户端请求 One API
|
|
||||||
2. 根据请求中的 `model` 参数,匹配对应的渠道(根据渠道里的模型进行匹配,必须完全一致)。如果匹配到多个渠道,则随机选择一个(同优先级)。
|
|
||||||
3. One API 向真正的地址发出请求。
|
|
||||||
4. One API 将结果返回给客户端。
|
|
||||||
|
|
||||||
### 1. 登录 One API
|
|
||||||
|
|
||||||
打开 【One API 应用详情】,找到访问地址:
|
|
||||||

|
|
||||||
|
|
||||||
登录 One API
|
|
||||||

|
|
||||||
|
|
||||||
### 2. 创建渠道和令牌
|
|
||||||
|
|
||||||
在 One API 中添加对应渠道,直接点击 【添加基础模型】,不要遗漏了向量模型(Embedding)
|
|
||||||

|
|
||||||
|
|
||||||
创建一个令牌
|
|
||||||

|
|
||||||
|
|
||||||
### 3. 修改账号余额
|
|
||||||
|
|
||||||
One API 默认 root 用户只有 200刀,可以自行修改编辑。
|
|
||||||
|
|
||||||
### 4. 修改 FastGPT 的环境变量
|
|
||||||
|
|
||||||
有了 One API 令牌后,FastGPT 可以通过修改 `baseurl` 和 `key` 去请求到 One API,再由 One API 去请求不同的模型。修改下面两个环境变量:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 下面的地址是 Sealos 提供的,务必写上 v1, 两个项目都在 sealos 部署时候,https://xxxx.cloud.sealos.io 可以改用内网地址
|
|
||||||
OPENAI_BASE_URL=https://xxxx.cloud.sealos.io/v1
|
|
||||||
# 下面的 key 是由 One API 提供的令牌
|
|
||||||
CHAT_API_KEY=sk-xxxxxx
|
|
||||||
```
|
|
||||||
|
|
||||||
## 接入其他模型
|
|
||||||
|
|
||||||
**以添加文心一言为例:**
|
|
||||||
|
|
||||||
### 1. One API 添加对应模型渠道
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 2. 修改 FastGPT 配置文件
|
|
||||||
|
|
||||||
可以在 `/projects/app/src/data/config.json` 里找到配置文件(本地开发需要复制成 config.local.json),配置文件中有一项是**对话模型配置**:
|
|
||||||
|
|
||||||
```json
|
|
||||||
"llmModels": [
|
|
||||||
...
|
|
||||||
{
|
|
||||||
"model": "ERNIE-Bot", // 这里的模型需要对应 One API 的模型
|
|
||||||
"name": "文心一言", // 对外展示的名称
|
|
||||||
"avatar": "/imgs/model/openai.svg", // 模型的logo
|
|
||||||
"maxContext": 16000, // 最大上下文
|
|
||||||
"maxResponse": 4000, // 最大回复
|
|
||||||
"quoteMaxToken": 13000, // 最大引用内容
|
|
||||||
"maxTemperature": 1.2, // 最大温度
|
|
||||||
"charsPointsPrice": 0,
|
|
||||||
"censor": false,
|
|
||||||
"vision": false, // 是否支持图片输入
|
|
||||||
"datasetProcess": true, // 是否设置为知识库处理模型
|
|
||||||
"usedInClassify": true, // 是否用于问题分类
|
|
||||||
"usedInExtractFields": true, // 是否用于字段提取
|
|
||||||
"usedInToolCall": true, // 是否用于工具调用
|
|
||||||
"usedInQueryExtension": true, // 是否用于问题优化
|
|
||||||
"toolChoice": true, // 是否支持工具选择
|
|
||||||
"functionCall": false, // 是否支持函数调用
|
|
||||||
"customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
|
|
||||||
"customExtractPrompt": "", // 自定义内容提取提示词
|
|
||||||
"defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
|
|
||||||
"defaultConfig":{} // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)
|
|
||||||
}
|
|
||||||
...
|
|
||||||
],
|
|
||||||
```
|
|
||||||
|
|
||||||
**添加向量模型:**
|
|
||||||
|
|
||||||
```json
|
|
||||||
"vectorModels": [
|
|
||||||
......
|
|
||||||
{
|
|
||||||
"model": "text-embedding-ada-002",
|
|
||||||
"name": "Embedding-2",
|
|
||||||
"avatar": "/imgs/model/openai.svg",
|
|
||||||
"charsPointsPrice": 0,
|
|
||||||
"defaultToken": 700,
|
|
||||||
"maxToken": 3000,
|
|
||||||
"weight": 100
|
|
||||||
},
|
|
||||||
......
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 重启 FastGPT
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose down
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
重启 FastGPT 即可在选择文心一言模型进行对话。**添加向量模型也是类似操作,增加到 `vectorModels`里。**
|
|
||||||
@@ -1424,7 +1424,11 @@ curl --location --request POST 'https://api.fastgpt.in/api/core/dataset/searchTe
|
|||||||
"limit": 5000,
|
"limit": 5000,
|
||||||
"similarity": 0,
|
"similarity": 0,
|
||||||
"searchMode": "embedding",
|
"searchMode": "embedding",
|
||||||
"usingReRank": false
|
"usingReRank": false,
|
||||||
|
|
||||||
|
"datasetSearchUsingExtensionQuery": true,
|
||||||
|
"datasetSearchExtensionModel": "gpt-4o-mini",
|
||||||
|
"datasetSearchExtensionBg": ""
|
||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -1441,6 +1445,9 @@ curl --location --request POST 'https://api.fastgpt.in/api/core/dataset/searchTe
|
|||||||
- similarity - 最低相关度(0~1,可选)
|
- similarity - 最低相关度(0~1,可选)
|
||||||
- searchMode - 搜索模式:embedding | fullTextRecall | mixedRecall
|
- searchMode - 搜索模式:embedding | fullTextRecall | mixedRecall
|
||||||
- usingReRank - 使用重排
|
- usingReRank - 使用重排
|
||||||
|
- datasetSearchUsingExtensionQuery - 使用问题优化
|
||||||
|
- datasetSearchExtensionModel - 问题优化模型
|
||||||
|
- datasetSearchExtensionBg - 问题优化背景描述
|
||||||
{{% /alert %}}
|
{{% /alert %}}
|
||||||
|
|
||||||
{{< /markdownify >}}
|
{{< /markdownify >}}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ weight: 706
|
|||||||
|
|
||||||
FastGPT 使用了 one-api 项目来管理模型池,其可以兼容 OpenAI 、Azure 、国内主流模型和本地模型等。
|
FastGPT 使用了 one-api 项目来管理模型池,其可以兼容 OpenAI 、Azure 、国内主流模型和本地模型等。
|
||||||
|
|
||||||
可参考:[Sealos 快速部署 OneAPI](/docs/development/one-api)
|
可参考:[Sealos 快速部署 OneAPI](/docs/development/modelconfig/one-api)
|
||||||
|
|
||||||
|
|
||||||
## 一键部署
|
## 一键部署
|
||||||
@@ -163,4 +163,4 @@ SYSTEM_FAVICON 可以是一个网络地址
|
|||||||
|
|
||||||
### One API 使用
|
### One API 使用
|
||||||
|
|
||||||
[参考 OneAPI 使用步骤](/docs/development/one-api/)
|
[参考 OneAPI 使用步骤](/docs/development/modelconfig/one-api/)
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: 'V4.8.16(进行中)'
|
title: 'V4.8.16(更新配置文件)'
|
||||||
description: 'FastGPT V4.8.16 更新说明'
|
description: 'FastGPT V4.8.16 更新说明'
|
||||||
icon: 'upgrade'
|
icon: 'upgrade'
|
||||||
draft: false
|
draft: false
|
||||||
@@ -11,9 +11,9 @@ weight: 808
|
|||||||
|
|
||||||
### 1. 更新镜像:
|
### 1. 更新镜像:
|
||||||
|
|
||||||
- 更新 fastgpt 镜像 tag: v4.8.16-beta
|
- 更新 fastgpt 镜像 tag: v4.8.16
|
||||||
- 更新 fastgpt-pro 商业版镜像 tag: v4.8.16-beta
|
- 更新 fastgpt-pro 商业版镜像 tag: v4.8.16
|
||||||
- Sandbox 镜像 tag: v4.8.16-beta
|
- Sandbox 镜像 tag: v4.8.16
|
||||||
|
|
||||||
### 2. 更新配置文件
|
### 2. 更新配置文件
|
||||||
|
|
||||||
@@ -69,3 +69,5 @@ weight: 808
|
|||||||
17. 修复 - 插件独立运行,变量初始值未赋上。
|
17. 修复 - 插件独立运行,变量初始值未赋上。
|
||||||
18. 修复 - 工作流使用弹窗组件时,关闭弹窗后,有时候会出现页面偏移。
|
18. 修复 - 工作流使用弹窗组件时,关闭弹窗后,有时候会出现页面偏移。
|
||||||
19. 修复 - 插件调试时,日志未保存插件输入参数。
|
19. 修复 - 插件调试时,日志未保存插件输入参数。
|
||||||
|
20. 修复 - 部分模板市场模板
|
||||||
|
21. 修复 - 设置NEXT_PUBLIC_BASE_URL时,图片文件读取URL不正确
|
||||||
52
docSite/content/zh-cn/docs/development/upgrading/4817.md
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
---
|
||||||
|
title: 'V4.8.17(包含升级脚本)'
|
||||||
|
description: 'FastGPT V4.8.17 更新说明'
|
||||||
|
icon: 'upgrade'
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 807
|
||||||
|
---
|
||||||
|
|
||||||
|
## 更新指南
|
||||||
|
|
||||||
|
### 1. 更新镜像:
|
||||||
|
|
||||||
|
- 更新 fastgpt 镜像 tag: v4.8.17-fix-title
|
||||||
|
- 更新 fastgpt-pro 商业版镜像 tag: v4.8.17
|
||||||
|
- Sandbox 镜像无需更新
|
||||||
|
|
||||||
|
|
||||||
|
### 2. 运行升级脚本
|
||||||
|
|
||||||
|
从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 `rootkey`;{{host}} 替换成**FastGPT 域名**。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl --location --request POST 'https://{{host}}/api/admin/initv4817' \
|
||||||
|
--header 'rootkey: {{rootkey}}' \
|
||||||
|
--header 'Content-Type: application/json'
|
||||||
|
```
|
||||||
|
|
||||||
|
会将用户绑定的 OpenAI 账号移动到团队中。
|
||||||
|
|
||||||
|
|
||||||
|
## 调整 completions 接口返回值
|
||||||
|
|
||||||
|
/api/v1/chat/completions 接口返回值调整,对话节点、工具节点等使用到模型的节点,将不再返回 `tokens` 字段,改为返回 `inputTokens` 和 `outputTokens` 字段,分别表示输入和输出的 Token 数量。
|
||||||
|
|
||||||
|
## 完整更新内容
|
||||||
|
|
||||||
|
1. 新增 - 简易模式工具调用支持数组类型插件。
|
||||||
|
2. 新增 - 工作流增加异常离开自动保存,避免工作流丢失。
|
||||||
|
3. 新增 - LLM 模型参数支持关闭 max_tokens 和 temperature。
|
||||||
|
4. 新增 - 商业版支持后台配置模板市场。
|
||||||
|
5. 新增 - 商业版支持后台配置自定义工作流变量,用于与业务系统鉴权打通。
|
||||||
|
6. 新增 - 搜索测试接口支持问题优化。
|
||||||
|
7. 新增 - 工作流中 Input Token 和 Output Token 分开记录展示。并修复部分请求未记录输出 Token 计费问题。
|
||||||
|
8. 优化 - Markdown 大小测试,超出 20 万字符不使用 Markdown 组件,避免崩溃。
|
||||||
|
9. 优化 - 知识库搜索参数,滑动条支持输入模式,可以更精准的控制。
|
||||||
|
10. 优化 - 可用模型展示UI。
|
||||||
|
11. 优化 - Mongo 查询语句,增加 virtual 字段。
|
||||||
|
12. 修复 - 文件返回接口缺少 Content-Length 头,导致通过非同源文件上传时,阿里 vision 模型无法识别图片。
|
||||||
|
13. 修复 - 去除判断器两端字符串隐藏换行符,避免判断器失效。
|
||||||
|
14. 修复 - 变量更新节点,手动输入更新内容时候,非字符串类型数据类型无法自动转化。
|
||||||
|
15. 修复 - 豆包模型无法工具调用。
|
||||||
37
docSite/content/zh-cn/docs/development/upgrading/4818.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
title: 'V4.8.18(进行中)'
|
||||||
|
description: 'FastGPT V4.8.18 更新说明'
|
||||||
|
icon: 'upgrade'
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 806
|
||||||
|
---
|
||||||
|
|
||||||
|
## 更新指南
|
||||||
|
|
||||||
|
### 2. 运行升级脚本
|
||||||
|
|
||||||
|
从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 `rootkey`;{{host}} 替换成**FastGPT 域名**。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl --location --request POST 'https://{{host}}/api/admin/initv4818' \
|
||||||
|
--header 'rootkey: {{rootkey}}' \
|
||||||
|
--header 'Content-Type: application/json'
|
||||||
|
```
|
||||||
|
|
||||||
|
会迁移全文检索表,时间较长,迁移期间全文检索会失效,日志中会打印已经迁移的数据长度。
|
||||||
|
|
||||||
|
|
||||||
|
## 完整更新内容
|
||||||
|
|
||||||
|
1. 新增 - 支持部门架构权限模式。
|
||||||
|
2. 新增 - 支持配置自定跨域安全策略,默认全开。
|
||||||
|
3. 优化 - 分享链接随机生成用户头像。
|
||||||
|
4. 优化 - 图片上传安全校验。并增加头像图片唯一存储,确保不会累计存储。
|
||||||
|
5. 优化 - Mongo 全文索引表分离。
|
||||||
|
6. 优化 - 知识库检索查询语句合并,同时减少查库数量。
|
||||||
|
7. 优化 - 文件编码检测,减少 CSV 文件乱码概率。
|
||||||
|
8. 优化 - 异步读取文件内容,减少进程阻塞。
|
||||||
|
9. 优化 - 文件阅读,HTML 直接下载,不允许在线阅读。
|
||||||
|
10. 修复 - HTML 文件上传,base64 图片无法自动转图片链接。
|
||||||
|
11. 修复 - 插件计费错误。
|
||||||
@@ -14,3 +14,11 @@ weight: 908
|
|||||||
但是,当连续问题之间的关联性较小,模型判断的准确度可能会受到限制。在这种情况下,我们可以引入全局变量的概念来记录分类结果。在后续的问题分类阶段,首先检查全局变量是否存有分类结果。如果有,那么直接沿用该结果;若没有,则让模型自行判断。
|
但是,当连续问题之间的关联性较小,模型判断的准确度可能会受到限制。在这种情况下,我们可以引入全局变量的概念来记录分类结果。在后续的问题分类阶段,首先检查全局变量是否存有分类结果。如果有,那么直接沿用该结果;若没有,则让模型自行判断。
|
||||||
|
|
||||||
建议:构建批量运行脚本进行测试,评估问题分类的准确性。
|
建议:构建批量运行脚本进行测试,评估问题分类的准确性。
|
||||||
|
|
||||||
|
## 系统编排配置中的定时执行,如果用户打开分享的连接,停留在那个页面,定时执行触发问题
|
||||||
|
|
||||||
|
发布后,后台生效。
|
||||||
|
|
||||||
|
## AI对话回答要求中的Markdown语法取消
|
||||||
|
|
||||||
|
在针对知识库的回答要求里有, 要给它配置提示词,不然他就是默认的,默认的里面就有该语法。
|
||||||
@@ -15,3 +15,50 @@ weight: 910
|
|||||||
|
|
||||||
* **文件处理模型**:用于数据处理的【增强处理】和【问答拆分】。在【增强处理】中,生成相关问题和摘要,在【问答拆分】中执行问答对生成。
|
* **文件处理模型**:用于数据处理的【增强处理】和【问答拆分】。在【增强处理】中,生成相关问题和摘要,在【问答拆分】中执行问答对生成。
|
||||||
* **索引模型**:用于向量化,即通过对文本数据进行处理和组织,构建出一个能够快速查询的数据结构。
|
* **索引模型**:用于向量化,即通过对文本数据进行处理和组织,构建出一个能够快速查询的数据结构。
|
||||||
|
|
||||||
|
## 基于知识库的查询,但是问题相关的答案过多。ai回答到一半就不继续回答。
|
||||||
|
|
||||||
|
FastGPT回复长度计算公式:
|
||||||
|
|
||||||
|
最大回复=min(配置的最大回复(内置的限制),最大上下文(输入和输出的总和)-历史记录)
|
||||||
|
|
||||||
|
18K模型->输入与输出的和
|
||||||
|
|
||||||
|
输出增多->输入减小
|
||||||
|
|
||||||
|
所以可以:
|
||||||
|
|
||||||
|
1. 检查配置的最大回复(回复上限)
|
||||||
|
2. 减小输入来增大输出,即减小历史记录,在工作流其实也就是“聊天记录”
|
||||||
|
|
||||||
|
配置的最大回复:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
1. 私有化部署的时候,后台配模型参数,可以在配置最大上文时候,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出
|
||||||
|
|
||||||
|
|
||||||
|
## 受到模型上下文的限制,有时候达不到聊天记录的轮次,连续对话字数过多就会报上下文不够的错误。
|
||||||
|
|
||||||
|
FastGPT回复长度计算公式:
|
||||||
|
|
||||||
|
最大回复=min(配置的最大回复(内置的限制),最大上下文(输入和输出的总和)-历史记录)
|
||||||
|
|
||||||
|
18K模型->输入与输出的和
|
||||||
|
|
||||||
|
输出增多->输入减小
|
||||||
|
|
||||||
|
所以可以:
|
||||||
|
|
||||||
|
1. 检查配置的最大回复(回复上限)
|
||||||
|
2. 减小输入来增大输出,即减小历史记录,在工作流其实也就是“聊天记录”
|
||||||
|
|
||||||
|
配置的最大回复:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
1. 私有化部署的时候,后台配模型参数,可以在配置最大上文时候,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出
|
||||||
@@ -44,9 +44,9 @@ weight: 104
|
|||||||
|
|
||||||
被放置在上下文数组的最前面,role 为 system,用于引导模型。
|
被放置在上下文数组的最前面,role 为 system,用于引导模型。
|
||||||
|
|
||||||
### 最大对话轮数(仅简易模式)
|
### 记忆轮数(仅简易模式)
|
||||||
|
|
||||||
可以配置模型支持的最大对话轮数,如果模型的超出上下文,系统会自动截断,尽可能保证不超模型上下文。
|
可以配置模型支持的记忆轮数,如果模型的超出上下文,系统会自动截断,尽可能保证不超模型上下文。
|
||||||
|
|
||||||
所以尽管配置 30 轮对话,实际运行时候,不一定会达到 30 轮。
|
所以尽管配置 30 轮对话,实际运行时候,不一定会达到 30 轮。
|
||||||
|
|
||||||
|
|||||||
@@ -160,6 +160,18 @@ default_doi_resolver: 'oadoi.org'
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
* 搜索结果为空时会返回友好提示:
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
{
|
||||||
|
"result": "[]",
|
||||||
|
"error": {
|
||||||
|
"message": "No search results",
|
||||||
|
"code": 500
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
* 失败时通过 Promise.reject 可能返回错误信息:
|
* 失败时通过 Promise.reject 可能返回错误信息:
|
||||||
|
|
||||||
```Bash
|
```Bash
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ FastGPT 从 V4 版本开始采用新的交互方式来构建 AI 应用。使用
|
|||||||
|
|
||||||
## 重点 - 工作流是如何运行的
|
## 重点 - 工作流是如何运行的
|
||||||
|
|
||||||
FastGPT的工作流从【流程开始】节点开始执行,可以理解为从用户输入问题开始,没有**固定的出口**,是以节点运行结束作为出口,如果在一个轮调用中,所有节点都不再允许,则工作流结束。
|
FastGPT的工作流从【流程开始】节点开始执行,可以理解为从用户输入问题开始,没有**固定的出口**,是以节点运行结束作为出口,如果在一个轮调用中,所有节点都不再运行,则工作流结束。
|
||||||
|
|
||||||
下面我们来看下,工作流是如何运行的,以及每个节点何时被触发执行。
|
下面我们来看下,工作流是如何运行的,以及每个节点何时被触发执行。
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ weight: 232
|
|||||||
|
|
||||||
## AI模型
|
## AI模型
|
||||||
|
|
||||||
可以通过 [config.json](/docs/development/configuration/) 配置可选的对话模型,通过 [one-api](/docs/development/one-api/) 来实现多模型接入。
|
可以通过 [config.json](/docs/development/configuration/) 配置可选的对话模型,通过 [one-api](/docs/development/modelconfig/one-api/) 来实现多模型接入。
|
||||||
|
|
||||||
点击AI模型后,可以配置模型的相关参数。
|
点击AI模型后,可以配置模型的相关参数。
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ weight: 236
|
|||||||
|
|
||||||
#### 用途
|
#### 用途
|
||||||
|
|
||||||
默认清空下,工具调用节点,在决定调用工具后,会将工具运行的结果,返回给AI,让 AI 对工具运行的结果进行总结输出。有时候,如果你不需要 AI 进行进一步的总结输出,可以使用该节点,将其接入对于工具流程的末尾。
|
默认情况下,工具调用节点,在决定调用工具后,会将工具运行的结果,返回给AI,让 AI 对工具运行的结果进行总结输出。有时候,如果你不需要 AI 进行进一步的总结输出,可以使用该节点,将其接入对于工具流程的末尾。
|
||||||
|
|
||||||
如下图,在执行知识库搜索后,发送给了 HTTP 请求,搜索将不会返回搜索的结果给工具调用进行 AI 总结。
|
如下图,在执行知识库搜索后,发送给了 HTTP 请求,搜索将不会返回搜索的结果给工具调用进行 AI 总结。
|
||||||
|
|
||||||
|
|||||||
@@ -19,17 +19,20 @@ FastGPT 商业版是基于 FastGPT 开源版的增强版本,增加了一些独
|
|||||||
| 应用管理与高级编排 | ✅ | ✅ | ✅ |
|
| 应用管理与高级编排 | ✅ | ✅ | ✅ |
|
||||||
| 文档知识库 | ✅ | ✅ | ✅ |
|
| 文档知识库 | ✅ | ✅ | ✅ |
|
||||||
| 外部使用 | ✅ | ✅ | ✅ |
|
| 外部使用 | ✅ | ✅ | ✅ |
|
||||||
|
| API 知识库 | ✅ | ✅ | ✅ |
|
||||||
| 最大应用数量 | 500 | 无限制 | 由付费套餐决定 |
|
| 最大应用数量 | 500 | 无限制 | 由付费套餐决定 |
|
||||||
| 最大知识库数量(单个知识库内容无限制) | 30 | 无限制 | 由付费套餐决定 |
|
| 最大知识库数量(单个知识库内容无限制) | 30 | 无限制 | 由付费套餐决定 |
|
||||||
| 自定义版权信息 | ❌ | ✅ | 设计中 |
|
| 自定义版权信息 | ❌ | ✅ | 设计中 |
|
||||||
| 多租户与支付 | ❌ | ✅ | ✅ |
|
| 多租户与支付 | ❌ | ✅ | ✅ |
|
||||||
| 团队空间 | ❌ | ✅ | ✅ |
|
| 团队空间 & 权限 | ❌ | ✅ | ✅ |
|
||||||
| 应用发布安全配置 | ❌ | ✅ | ✅ |
|
| 应用发布安全配置 | ❌ | ✅ | ✅ |
|
||||||
| 内容审核 | ❌ | ✅ | ✅ |
|
| 内容审核 | ❌ | ✅ | ✅ |
|
||||||
| web站点同步 | ❌ | ✅ | ✅ |
|
| web站点同步 | ❌ | ✅ | ✅ |
|
||||||
| 管理后台 | ❌ | ✅ | 不需要 |
|
| 主流文档库接入(目前支持:语雀、飞书) | ❌ | ✅ | ✅ |
|
||||||
| 增强训练模式 | ❌ | ✅ | ✅ |
|
| 增强训练模式 | ❌ | ✅ | ✅ |
|
||||||
| 第三方应用快速接入(飞书、公众号) | ❌ | ✅ | ✅ |
|
| 第三方应用快速接入(飞书、公众号) | ❌ | ✅ | ✅ |
|
||||||
|
| 管理后台 | ❌ | ✅ | 不需要 |
|
||||||
|
| SSO 登录(可自定义,也可使用内置:Github、公众号、钉钉、谷歌等) | ❌ | ✅ | 不需要 |
|
||||||
| 图片知识库 | ❌ | 设计中 | 设计中 |
|
| 图片知识库 | ❌ | 设计中 | 设计中 |
|
||||||
| 对话日志运营分析 | ❌ | 设计中 | 设计中 |
|
| 对话日志运营分析 | ❌ | 设计中 | 设计中 |
|
||||||
| 完整商业授权 | ❌ | ✅ | ✅ |
|
| 完整商业授权 | ❌ | ✅ | ✅ |
|
||||||
@@ -50,8 +53,8 @@ FastGPT 商业版软件根据不同的部署方式,分为 3 类收费模式。
|
|||||||
{{< table "table-hover table-striped-columns" >}}
|
{{< table "table-hover table-striped-columns" >}}
|
||||||
| 部署方式 | 特有服务 | 上线时长 | 标品价格 |
|
| 部署方式 | 特有服务 | 上线时长 | 标品价格 |
|
||||||
| ---- | ---- | ---- | ---- |
|
| ---- | ---- | ---- | ---- |
|
||||||
| Sealos全托管 | 1. 有效期内免费升级。<br>2. 免运维服务&数据库。 | 半天 | 5000元起/月(3个月起)<br>或<br>50000元起/年 |
|
| Sealos全托管 | 1. 有效期内免费升级。<br>2. 免运维服务&数据库。 | 半天 | 6000元起/月(3个月起)<br>或<br>60000元起/年 |
|
||||||
| 自有服务器部署 | 1. 6个版本的升级服务。 | 14天内 | 具体价格可[联系咨询](https://fael3z0zfze.feishu.cn/share/base/form/shrcnRxj3utrzjywsom96Px4sud) |
|
| 自有服务器部署 | 1. 6个版本免费升级支持。 | 14天内 | 具体价格可[联系咨询](https://fael3z0zfze.feishu.cn/share/base/form/shrcnRxj3utrzjywsom96Px4sud) |
|
||||||
{{< /table >}}
|
{{< /table >}}
|
||||||
|
|
||||||
{{% alert icon="🤖 " context="success" %}}
|
{{% alert icon="🤖 " context="success" %}}
|
||||||
@@ -62,6 +65,10 @@ FastGPT 商业版软件根据不同的部署方式,分为 3 类收费模式。
|
|||||||
- 高可用版适合对外提供在线服务,包含可视化监控、多副本、负载均衡、数据库自动备份等生产环境的基础设施。
|
- 高可用版适合对外提供在线服务,包含可视化监控、多副本、负载均衡、数据库自动备份等生产环境的基础设施。
|
||||||
{{% /alert %}}
|
{{% /alert %}}
|
||||||
|
|
||||||
|
## 联系方式
|
||||||
|
|
||||||
|
请填写[咨询问卷](https://fael3z0zfze.feishu.cn/share/base/form/shrcnRxj3utrzjywsom96Px4sud),我们会尽快与您联系。
|
||||||
|
|
||||||
|
|
||||||
## 技术支持
|
## 技术支持
|
||||||
|
|
||||||
@@ -79,9 +86,6 @@ FastGPT 商业版软件根据不同的部署方式,分为 3 类收费模式。
|
|||||||
|
|
||||||
跨版本更新或复杂更新可参考文档自行更新;或付费支持,标准与技术服务费一致。
|
跨版本更新或复杂更新可参考文档自行更新;或付费支持,标准与技术服务费一致。
|
||||||
|
|
||||||
## 联系方式
|
|
||||||
|
|
||||||
请填写[咨询问卷](https://fael3z0zfze.feishu.cn/share/base/form/shrcnRxj3utrzjywsom96Px4sud),我们会尽快与您联系。
|
|
||||||
|
|
||||||
## QA
|
## QA
|
||||||
|
|
||||||
@@ -95,8 +99,14 @@ FastGPT 商业版软件根据不同的部署方式,分为 3 类收费模式。
|
|||||||
|
|
||||||
可以修改开源版部分代码,不支持修改商业版镜像。完整版本=开源版+商业版镜像,所以是可以修改部分内容的。但是如果二开了,后续则需要自己进行代码合并升级。
|
可以修改开源版部分代码,不支持修改商业版镜像。完整版本=开源版+商业版镜像,所以是可以修改部分内容的。但是如果二开了,后续则需要自己进行代码合并升级。
|
||||||
|
|
||||||
## Sealos 费用
|
### Sealos 运行费用
|
||||||
|
|
||||||
Sealos 云服务属于按量计费,下面是它的价格表:
|
Sealos 云服务属于按量计费,下面是它的价格表:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
## 管理后台部分截图
|
||||||
|
|
||||||
|
| | | |
|
||||||
|
| ---- | ---- | ---- |
|
||||||
|
|  |  |  |
|
||||||
@@ -17,9 +17,11 @@ weight: 506
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 2. 登录微信公众平台,获取 AppID 、 Secret和Token
|
## 2. 获取 AppID 、 Secret和Token
|
||||||
|
|
||||||
### 1. https://mp.weixin.qq.com 登录微信公众平台,选择您的公众号。
|
### 1. 登录微信公众平台,选择您的公众号。
|
||||||
|
|
||||||
|
打开微信公众号官网:https://mp.weixin.qq.com
|
||||||
|
|
||||||
**只支持通过验证的公众号,未通过验证的公众号暂不支持。**
|
**只支持通过验证的公众号,未通过验证的公众号暂不支持。**
|
||||||
|
|
||||||
@@ -28,6 +30,7 @@ weight: 506
|
|||||||

|

|
||||||
|
|
||||||
### 2. 把3个参数填入 FastGPT 配置弹窗中。
|
### 2. 把3个参数填入 FastGPT 配置弹窗中。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 3. 在 IP 白名单中加入 FastGPT 的 IP
|
## 3. 在 IP 白名单中加入 FastGPT 的 IP
|
||||||
@@ -36,7 +39,7 @@ weight: 506
|
|||||||
|
|
||||||
私有部署的用户可自行查阅自己的 IP 地址。
|
私有部署的用户可自行查阅自己的 IP 地址。
|
||||||
|
|
||||||
海外版用户(cloud.tryfastgpt.ai)可以填写下面的 IP 白名单:
|
海外版用户(cloud.tryfastgpt.ai)可以填写下面的 IP 白名单:
|
||||||
|
|
||||||
```
|
```
|
||||||
35.240.227.100
|
35.240.227.100
|
||||||
|
|||||||
@@ -114,15 +114,15 @@ services:
|
|||||||
# fastgpt
|
# fastgpt
|
||||||
sandbox:
|
sandbox:
|
||||||
container_name: sandbox
|
container_name: sandbox
|
||||||
image: ghcr.io/labring/fastgpt-sandbox:v4.8.15 # git
|
image: ghcr.io/labring/fastgpt-sandbox:v4.8.17 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.15 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.17 # 阿里云
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
restart: always
|
||||||
fastgpt:
|
fastgpt:
|
||||||
container_name: fastgpt
|
container_name: fastgpt
|
||||||
image: ghcr.io/labring/fastgpt:v4.8.15-fix2 # git
|
image: ghcr.io/labring/fastgpt:v4.8.17 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.15-fix2 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.17 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -72,15 +72,15 @@ services:
|
|||||||
# fastgpt
|
# fastgpt
|
||||||
sandbox:
|
sandbox:
|
||||||
container_name: sandbox
|
container_name: sandbox
|
||||||
image: ghcr.io/labring/fastgpt-sandbox:v4.8.15 # git
|
image: ghcr.io/labring/fastgpt-sandbox:v4.8.17 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.15 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.17 # 阿里云
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
restart: always
|
||||||
fastgpt:
|
fastgpt:
|
||||||
container_name: fastgpt
|
container_name: fastgpt
|
||||||
image: ghcr.io/labring/fastgpt:v4.8.15-fix2 # git
|
image: ghcr.io/labring/fastgpt:v4.8.17 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.15-fix2 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.17 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -53,15 +53,15 @@ services:
|
|||||||
wait $$!
|
wait $$!
|
||||||
sandbox:
|
sandbox:
|
||||||
container_name: sandbox
|
container_name: sandbox
|
||||||
image: ghcr.io/labring/fastgpt-sandbox:v4.8.15 # git
|
image: ghcr.io/labring/fastgpt-sandbox:v4.8.17 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.15 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.8.17 # 阿里云
|
||||||
networks:
|
networks:
|
||||||
- fastgpt
|
- fastgpt
|
||||||
restart: always
|
restart: always
|
||||||
fastgpt:
|
fastgpt:
|
||||||
container_name: fastgpt
|
container_name: fastgpt
|
||||||
image: ghcr.io/labring/fastgpt:v4.8.15-fix2 # git
|
image: ghcr.io/labring/fastgpt:v4.8.17 # git
|
||||||
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.15-fix2 # 阿里云
|
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.17 # 阿里云
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -1,14 +1,20 @@
|
|||||||
|
import { i18nT } from '../../../../web/i18n/utils';
|
||||||
import { ErrType } from '../errorCode';
|
import { ErrType } from '../errorCode';
|
||||||
|
|
||||||
/* dataset: 507000 */
|
/* dataset: 507000 */
|
||||||
const startCode = 507000;
|
const startCode = 507000;
|
||||||
export enum CommonErrEnum {
|
export enum CommonErrEnum {
|
||||||
|
invalidParams = 'invalidParams',
|
||||||
fileNotFound = 'fileNotFound',
|
fileNotFound = 'fileNotFound',
|
||||||
unAuthFile = 'unAuthFile',
|
unAuthFile = 'unAuthFile',
|
||||||
missingParams = 'missingParams',
|
missingParams = 'missingParams',
|
||||||
inheritPermissionError = 'inheritPermissionError'
|
inheritPermissionError = 'inheritPermissionError'
|
||||||
}
|
}
|
||||||
const datasetErr = [
|
const datasetErr = [
|
||||||
|
{
|
||||||
|
statusText: CommonErrEnum.fileNotFound,
|
||||||
|
message: i18nT('common:error.invalid_params')
|
||||||
|
},
|
||||||
{
|
{
|
||||||
statusText: CommonErrEnum.fileNotFound,
|
statusText: CommonErrEnum.fileNotFound,
|
||||||
message: 'error.fileNotFound'
|
message: 'error.fileNotFound'
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
import { ErrType } from '../errorCode';
|
|
||||||
import { i18nT } from '../../../../web/i18n/utils';
|
import { i18nT } from '../../../../web/i18n/utils';
|
||||||
|
import type { ErrType } from '../errorCode';
|
||||||
/* team: 500000 */
|
/* team: 500000 */
|
||||||
export enum TeamErrEnum {
|
export enum TeamErrEnum {
|
||||||
|
notUser = 'notUser',
|
||||||
teamOverSize = 'teamOverSize',
|
teamOverSize = 'teamOverSize',
|
||||||
unAuthTeam = 'unAuthTeam',
|
unAuthTeam = 'unAuthTeam',
|
||||||
|
teamMemberOverSize = 'teamMemberOverSize',
|
||||||
aiPointsNotEnough = 'aiPointsNotEnough',
|
aiPointsNotEnough = 'aiPointsNotEnough',
|
||||||
datasetSizeNotEnough = 'datasetSizeNotEnough',
|
datasetSizeNotEnough = 'datasetSizeNotEnough',
|
||||||
datasetAmountNotEnough = 'datasetAmountNotEnough',
|
datasetAmountNotEnough = 'datasetAmountNotEnough',
|
||||||
@@ -14,11 +16,22 @@ export enum TeamErrEnum {
|
|||||||
groupNameEmpty = 'groupNameEmpty',
|
groupNameEmpty = 'groupNameEmpty',
|
||||||
groupNameDuplicate = 'groupNameDuplicate',
|
groupNameDuplicate = 'groupNameDuplicate',
|
||||||
groupNotExist = 'groupNotExist',
|
groupNotExist = 'groupNotExist',
|
||||||
|
orgMemberNotExist = 'orgMemberNotExist',
|
||||||
|
orgMemberDuplicated = 'orgMemberDuplicated',
|
||||||
|
orgNotExist = 'orgNotExist',
|
||||||
|
orgParentNotExist = 'orgParentNotExist',
|
||||||
|
cannotMoveToSubPath = 'cannotMoveToSubPath',
|
||||||
|
cannotModifyRootOrg = 'cannotModifyRootOrg',
|
||||||
|
cannotDeleteNonEmptyOrg = 'cannotDeleteNonEmptyOrg',
|
||||||
cannotDeleteDefaultGroup = 'cannotDeleteDefaultGroup',
|
cannotDeleteDefaultGroup = 'cannotDeleteDefaultGroup',
|
||||||
userNotActive = 'userNotActive'
|
userNotActive = 'userNotActive'
|
||||||
}
|
}
|
||||||
|
|
||||||
const teamErr = [
|
const teamErr = [
|
||||||
|
{
|
||||||
|
statusText: TeamErrEnum.notUser,
|
||||||
|
message: i18nT('common:code_error.team_error.not_user')
|
||||||
|
},
|
||||||
{
|
{
|
||||||
statusText: TeamErrEnum.teamOverSize,
|
statusText: TeamErrEnum.teamOverSize,
|
||||||
message: i18nT('common:code_error.team_error.over_size')
|
message: i18nT('common:code_error.team_error.over_size')
|
||||||
@@ -71,6 +84,34 @@ const teamErr = [
|
|||||||
{
|
{
|
||||||
statusText: TeamErrEnum.userNotActive,
|
statusText: TeamErrEnum.userNotActive,
|
||||||
message: i18nT('common:code_error.team_error.user_not_active')
|
message: i18nT('common:code_error.team_error.user_not_active')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
statusText: TeamErrEnum.orgMemberNotExist,
|
||||||
|
message: i18nT('common:code_error.team_error.org_member_not_exist')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
statusText: TeamErrEnum.orgMemberDuplicated,
|
||||||
|
message: i18nT('common:code_error.team_error.org_member_duplicated')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
statusText: TeamErrEnum.orgNotExist,
|
||||||
|
message: i18nT('common:code_error.team_error.org_not_exist')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
statusText: TeamErrEnum.orgParentNotExist,
|
||||||
|
message: i18nT('common:code_error.team_error.org_parent_not_exist')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
statusText: TeamErrEnum.cannotMoveToSubPath,
|
||||||
|
message: i18nT('common:code_error.team_error.cannot_move_to_sub_path')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
statusText: TeamErrEnum.cannotModifyRootOrg,
|
||||||
|
message: i18nT('common:code_error.team_error.cannot_modify_root_org')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
statusText: TeamErrEnum.cannotDeleteNonEmptyOrg,
|
||||||
|
message: i18nT('common:code_error.team_error.cannot_delete_non_empty_org')
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -2,25 +2,16 @@ import { ErrType } from '../errorCode';
|
|||||||
import { i18nT } from '../../../../web/i18n/utils';
|
import { i18nT } from '../../../../web/i18n/utils';
|
||||||
/* team: 503000 */
|
/* team: 503000 */
|
||||||
export enum UserErrEnum {
|
export enum UserErrEnum {
|
||||||
unAuthUser = 'unAuthUser',
|
|
||||||
unAuthRole = 'unAuthRole',
|
unAuthRole = 'unAuthRole',
|
||||||
binVisitor = 'binVisitor',
|
binVisitor = 'binVisitor',
|
||||||
balanceNotEnough = 'balanceNotEnough',
|
balanceNotEnough = 'balanceNotEnough',
|
||||||
unAuthSso = 'unAuthSso'
|
unAuthSso = 'unAuthSso'
|
||||||
}
|
}
|
||||||
const errList = [
|
const errList = [
|
||||||
{
|
|
||||||
statusText: UserErrEnum.unAuthUser,
|
|
||||||
message: i18nT('common:code_error.user_error.un_auth_user')
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
statusText: UserErrEnum.binVisitor,
|
statusText: UserErrEnum.binVisitor,
|
||||||
message: i18nT('common:code_error.user_error.bin_visitor')
|
message: i18nT('common:code_error.user_error.bin_visitor')
|
||||||
}, // 身份校验未通过
|
},
|
||||||
{
|
|
||||||
statusText: UserErrEnum.binVisitor,
|
|
||||||
message: i18nT('common:code_error.user_error.bin_visitor_guest')
|
|
||||||
}, // 游客身份
|
|
||||||
{
|
{
|
||||||
statusText: UserErrEnum.balanceNotEnough,
|
statusText: UserErrEnum.balanceNotEnough,
|
||||||
message: i18nT('common:code_error.user_error.balance_not_enough')
|
message: i18nT('common:code_error.user_error.balance_not_enough')
|
||||||
|
|||||||
5
packages/global/common/file/api.d.ts
vendored
@@ -1,10 +1,7 @@
|
|||||||
import { MongoImageTypeEnum } from './image/constants';
|
|
||||||
import { OutLinkChatAuthProps } from '../../support/permission/chat.d';
|
import { OutLinkChatAuthProps } from '../../support/permission/chat.d';
|
||||||
|
|
||||||
export type preUploadImgProps = OutLinkChatAuthProps & {
|
export type preUploadImgProps = OutLinkChatAuthProps & {
|
||||||
type: `${MongoImageTypeEnum}`;
|
// expiredTime?: Date;
|
||||||
|
|
||||||
expiredTime?: Date;
|
|
||||||
metadata?: Record<string, any>;
|
metadata?: Record<string, any>;
|
||||||
};
|
};
|
||||||
export type UploadImgProps = preUploadImgProps & {
|
export type UploadImgProps = preUploadImgProps & {
|
||||||
|
|||||||
@@ -1,61 +1,5 @@
|
|||||||
export const imageBaseUrl = '/api/system/img/';
|
export const imageBaseUrl = '/api/system/img/';
|
||||||
|
|
||||||
export enum MongoImageTypeEnum {
|
|
||||||
systemAvatar = 'systemAvatar',
|
|
||||||
appAvatar = 'appAvatar',
|
|
||||||
pluginAvatar = 'pluginAvatar',
|
|
||||||
datasetAvatar = 'datasetAvatar',
|
|
||||||
userAvatar = 'userAvatar',
|
|
||||||
teamAvatar = 'teamAvatar',
|
|
||||||
groupAvatar = 'groupAvatar',
|
|
||||||
|
|
||||||
chatImage = 'chatImage',
|
|
||||||
collectionImage = 'collectionImage'
|
|
||||||
}
|
|
||||||
export const mongoImageTypeMap = {
|
|
||||||
[MongoImageTypeEnum.systemAvatar]: {
|
|
||||||
label: 'appAvatar',
|
|
||||||
unique: true
|
|
||||||
},
|
|
||||||
[MongoImageTypeEnum.appAvatar]: {
|
|
||||||
label: 'appAvatar',
|
|
||||||
unique: true
|
|
||||||
},
|
|
||||||
[MongoImageTypeEnum.pluginAvatar]: {
|
|
||||||
label: 'pluginAvatar',
|
|
||||||
unique: true
|
|
||||||
},
|
|
||||||
[MongoImageTypeEnum.datasetAvatar]: {
|
|
||||||
label: 'datasetAvatar',
|
|
||||||
unique: true
|
|
||||||
},
|
|
||||||
[MongoImageTypeEnum.userAvatar]: {
|
|
||||||
label: 'userAvatar',
|
|
||||||
unique: true
|
|
||||||
},
|
|
||||||
[MongoImageTypeEnum.teamAvatar]: {
|
|
||||||
label: 'teamAvatar',
|
|
||||||
unique: true
|
|
||||||
},
|
|
||||||
[MongoImageTypeEnum.groupAvatar]: {
|
|
||||||
label: 'groupAvatar',
|
|
||||||
unique: true
|
|
||||||
},
|
|
||||||
|
|
||||||
[MongoImageTypeEnum.chatImage]: {
|
|
||||||
label: 'chatImage',
|
|
||||||
unique: false
|
|
||||||
},
|
|
||||||
[MongoImageTypeEnum.collectionImage]: {
|
|
||||||
label: 'collectionImage',
|
|
||||||
unique: false
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const uniqueImageTypeList = Object.entries(mongoImageTypeMap)
|
|
||||||
.filter(([key, value]) => value.unique)
|
|
||||||
.map(([key]) => key as `${MongoImageTypeEnum}`);
|
|
||||||
|
|
||||||
export const FolderIcon = 'file/fill/folder';
|
export const FolderIcon = 'file/fill/folder';
|
||||||
export const FolderImgUrl = '/imgs/files/folder.svg';
|
export const FolderImgUrl = '/imgs/files/folder.svg';
|
||||||
export const HttpPluginImgUrl = '/imgs/app/httpPluginFill.svg';
|
export const HttpPluginImgUrl = '/imgs/app/httpPluginFill.svg';
|
||||||
|
|||||||
4
packages/global/common/file/image/type.d.ts
vendored
@@ -1,12 +1,8 @@
|
|||||||
import { MongoImageTypeEnum } from './constants';
|
|
||||||
|
|
||||||
export type MongoImageSchemaType = {
|
export type MongoImageSchemaType = {
|
||||||
_id: string;
|
_id: string;
|
||||||
teamId: string;
|
teamId: string;
|
||||||
binary: Buffer;
|
binary: Buffer;
|
||||||
createTime: Date;
|
|
||||||
expiredTime?: Date;
|
expiredTime?: Date;
|
||||||
type: `${MongoImageTypeEnum}`;
|
|
||||||
|
|
||||||
metadata?: {
|
metadata?: {
|
||||||
mime?: string; // image mime type.
|
mime?: string; // image mime type.
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { detect } from 'jschardet';
|
|||||||
import { documentFileType, imageFileType } from './constants';
|
import { documentFileType, imageFileType } from './constants';
|
||||||
import { ChatFileTypeEnum } from '../../core/chat/constants';
|
import { ChatFileTypeEnum } from '../../core/chat/constants';
|
||||||
import { UserChatItemValueItemType } from '../../core/chat/type';
|
import { UserChatItemValueItemType } from '../../core/chat/type';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
|
||||||
export const formatFileSize = (bytes: number): string => {
|
export const formatFileSize = (bytes: number): string => {
|
||||||
if (bytes === 0) return '0 B';
|
if (bytes === 0) return '0 B';
|
||||||
@@ -16,6 +17,22 @@ export const formatFileSize = (bytes: number): string => {
|
|||||||
export const detectFileEncoding = (buffer: Buffer) => {
|
export const detectFileEncoding = (buffer: Buffer) => {
|
||||||
return detect(buffer.slice(0, 200))?.encoding?.toLocaleLowerCase();
|
return detect(buffer.slice(0, 200))?.encoding?.toLocaleLowerCase();
|
||||||
};
|
};
|
||||||
|
export const detectFileEncodingByPath = async (path: string) => {
|
||||||
|
// Get 64KB file head
|
||||||
|
const MAX_BYTES = 64 * 1024;
|
||||||
|
const buffer = Buffer.alloc(MAX_BYTES);
|
||||||
|
|
||||||
|
const fd = await fs.promises.open(path, 'r');
|
||||||
|
try {
|
||||||
|
// Read file head
|
||||||
|
const { bytesRead } = await fd.read(buffer, 0, MAX_BYTES, 0);
|
||||||
|
const actualBuffer = buffer.slice(0, bytesRead);
|
||||||
|
|
||||||
|
return detect(actualBuffer)?.encoding?.toLocaleLowerCase();
|
||||||
|
} finally {
|
||||||
|
await fd.close();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Url => user upload file type
|
// Url => user upload file type
|
||||||
export const parseUrlToFileType = (url: string): UserChatItemValueItemType['file'] | undefined => {
|
export const parseUrlToFileType = (url: string): UserChatItemValueItemType['file'] | undefined => {
|
||||||
|
|||||||
@@ -25,17 +25,22 @@ export const simpleText = (text = '') => {
|
|||||||
return text;
|
return text;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
export const valToStr = (val: any) => {
|
||||||
replace {{variable}} to value
|
if (val === undefined) return 'undefined';
|
||||||
*/
|
if (val === null) return 'null';
|
||||||
|
|
||||||
|
if (typeof val === 'object') return JSON.stringify(val);
|
||||||
|
return String(val);
|
||||||
|
};
|
||||||
|
|
||||||
|
// replace {{variable}} to value
|
||||||
export function replaceVariable(text: any, obj: Record<string, string | number>) {
|
export function replaceVariable(text: any, obj: Record<string, string | number>) {
|
||||||
if (typeof text !== 'string') return text;
|
if (typeof text !== 'string') return text;
|
||||||
|
|
||||||
for (const key in obj) {
|
for (const key in obj) {
|
||||||
const val = obj[key];
|
const val = obj[key];
|
||||||
const formatVal = typeof val === 'object' ? JSON.stringify(val) : String(val);
|
const formatVal = valToStr(val);
|
||||||
|
text = text.replace(new RegExp(`{{(${key})}}`, 'g'), () => formatVal);
|
||||||
text = text.replace(new RegExp(`{{(${key})}}`, 'g'), formatVal);
|
|
||||||
}
|
}
|
||||||
return text || '';
|
return text || '';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
export const HUMAN_ICON = `/icon/human.svg`;
|
export const HUMAN_ICON = `/icon/human.svg`;
|
||||||
export const LOGO_ICON = `/icon/logo.svg`;
|
export const LOGO_ICON = `/icon/logo.svg`;
|
||||||
export const HUGGING_FACE_ICON = `/imgs/model/huggingface.svg`;
|
export const HUGGING_FACE_ICON = `/imgs/model/huggingface.svg`;
|
||||||
|
|
||||||
export const DEFAULT_TEAM_AVATAR = `/imgs/avatar/defaultTeamAvatar.svg`;
|
export const DEFAULT_TEAM_AVATAR = `/imgs/avatar/defaultTeamAvatar.svg`;
|
||||||
|
export const DEFAULT_ORG_AVATAR = '/imgs/avatar/defaultOrgAvatar.svg';
|
||||||
|
export const DEFAULT_USER_AVATAR = '/imgs/avatar/BlueAvatar.svg';
|
||||||
|
|
||||||
export const isProduction = process.env.NODE_ENV === 'production';
|
export const isProduction = process.env.NODE_ENV === 'production';
|
||||||
|
|||||||
18
packages/global/common/system/types/index.d.ts
vendored
@@ -5,7 +5,7 @@ import type {
|
|||||||
LLMModelItemType,
|
LLMModelItemType,
|
||||||
VectorModelItemType,
|
VectorModelItemType,
|
||||||
AudioSpeechModels,
|
AudioSpeechModels,
|
||||||
WhisperModelType,
|
STTModelType,
|
||||||
ReRankModelItemType
|
ReRankModelItemType
|
||||||
} from '../../../core/ai/model.d';
|
} from '../../../core/ai/model.d';
|
||||||
import { SubTypeEnum } from '../../../support/wallet/sub/constants';
|
import { SubTypeEnum } from '../../../support/wallet/sub/constants';
|
||||||
@@ -18,6 +18,14 @@ export type NavbarItemType = {
|
|||||||
isActive: boolean;
|
isActive: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type ExternalProviderWorkflowVarType = {
|
||||||
|
name: string;
|
||||||
|
key: string;
|
||||||
|
intro: string;
|
||||||
|
isOpen: boolean;
|
||||||
|
url?: string;
|
||||||
|
};
|
||||||
|
|
||||||
/* fastgpt main */
|
/* fastgpt main */
|
||||||
export type FastGPTConfigFileType = {
|
export type FastGPTConfigFileType = {
|
||||||
feConfigs: FastGPTFeConfigsType;
|
feConfigs: FastGPTFeConfigsType;
|
||||||
@@ -27,7 +35,7 @@ export type FastGPTConfigFileType = {
|
|||||||
vectorModels: VectorModelItemType[];
|
vectorModels: VectorModelItemType[];
|
||||||
reRankModels: ReRankModelItemType[];
|
reRankModels: ReRankModelItemType[];
|
||||||
audioSpeechModels: AudioSpeechModelType[];
|
audioSpeechModels: AudioSpeechModelType[];
|
||||||
whisperModel: WhisperModelType;
|
whisperModel: STTModelType;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type FastGPTFeConfigsType = {
|
export type FastGPTFeConfigsType = {
|
||||||
@@ -65,6 +73,11 @@ export type FastGPTFeConfigsType = {
|
|||||||
google?: string;
|
google?: string;
|
||||||
wechat?: string;
|
wechat?: string;
|
||||||
dingtalk?: string;
|
dingtalk?: string;
|
||||||
|
wecom?: {
|
||||||
|
corpid?: string;
|
||||||
|
agentid?: string;
|
||||||
|
secret?: string;
|
||||||
|
};
|
||||||
microsoft?: {
|
microsoft?: {
|
||||||
clientId?: string;
|
clientId?: string;
|
||||||
tenantId?: string;
|
tenantId?: string;
|
||||||
@@ -84,6 +97,7 @@ export type FastGPTFeConfigsType = {
|
|||||||
uploadFileMaxSize?: number;
|
uploadFileMaxSize?: number;
|
||||||
lafEnv?: string;
|
lafEnv?: string;
|
||||||
navbarItems?: NavbarItemType[];
|
navbarItems?: NavbarItemType[];
|
||||||
|
externalProviderWorkflowVariables?: ExternalProviderWorkflowVarType[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export type SystemEnvType = {
|
export type SystemEnvType = {
|
||||||
|
|||||||
26
packages/global/core/ai/model.d.ts
vendored
@@ -1,6 +1,13 @@
|
|||||||
import type { ModelProviderIdType } from './provider';
|
import type { ModelProviderIdType } from './provider';
|
||||||
|
|
||||||
export type LLMModelItemType = {
|
type PriceType = {
|
||||||
|
charsPointsPrice?: number; // 1k chars=n points; 60s=n points;
|
||||||
|
|
||||||
|
// If inputPrice is set, the input-output charging scheme is adopted
|
||||||
|
inputPrice?: number; // 1k tokens=n points
|
||||||
|
outputPrice?: number; // 1k tokens=n points
|
||||||
|
};
|
||||||
|
export type LLMModelItemType = PriceType & {
|
||||||
provider: ModelProviderIdType;
|
provider: ModelProviderIdType;
|
||||||
model: string;
|
model: string;
|
||||||
name: string;
|
name: string;
|
||||||
@@ -10,8 +17,6 @@ export type LLMModelItemType = {
|
|||||||
quoteMaxToken: number;
|
quoteMaxToken: number;
|
||||||
maxTemperature: number;
|
maxTemperature: number;
|
||||||
|
|
||||||
charsPointsPrice: number; // 1k chars=n points
|
|
||||||
|
|
||||||
censor?: boolean;
|
censor?: boolean;
|
||||||
vision?: boolean;
|
vision?: boolean;
|
||||||
|
|
||||||
@@ -33,13 +38,12 @@ export type LLMModelItemType = {
|
|||||||
fieldMap?: Record<string, string>;
|
fieldMap?: Record<string, string>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type VectorModelItemType = {
|
export type VectorModelItemType = PriceType & {
|
||||||
provider: ModelProviderIdType;
|
provider: ModelProviderIdType;
|
||||||
model: string; // model name
|
model: string; // model name
|
||||||
name: string; // show name
|
name: string; // show name
|
||||||
avatar?: string;
|
avatar?: string;
|
||||||
defaultToken: number; // split text default token
|
defaultToken: number; // split text default token
|
||||||
charsPointsPrice: number; // 1k tokens=n points
|
|
||||||
maxToken: number; // model max token
|
maxToken: number; // model max token
|
||||||
weight: number; // training weight
|
weight: number; // training weight
|
||||||
hidden?: boolean; // Disallow creation
|
hidden?: boolean; // Disallow creation
|
||||||
@@ -48,23 +52,23 @@ export type VectorModelItemType = {
|
|||||||
queryConfig?: Record<string, any>; // Custom parameters for query
|
queryConfig?: Record<string, any>; // Custom parameters for query
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ReRankModelItemType = {
|
export type ReRankModelItemType = PriceType & {
|
||||||
|
provider: ModelProviderIdType;
|
||||||
model: string;
|
model: string;
|
||||||
name: string;
|
name: string;
|
||||||
charsPointsPrice: number;
|
|
||||||
requestUrl: string;
|
requestUrl: string;
|
||||||
requestAuth: string;
|
requestAuth: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type AudioSpeechModelType = {
|
export type AudioSpeechModelType = PriceType & {
|
||||||
|
provider: ModelProviderIdType;
|
||||||
model: string;
|
model: string;
|
||||||
name: string;
|
name: string;
|
||||||
charsPointsPrice: number;
|
|
||||||
voices: { label: string; value: string; bufferId: string }[];
|
voices: { label: string; value: string; bufferId: string }[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export type WhisperModelType = {
|
export type STTModelType = PriceType & {
|
||||||
|
provider: ModelProviderIdType;
|
||||||
model: string;
|
model: string;
|
||||||
name: string;
|
name: string;
|
||||||
charsPointsPrice: number; // 60s = n points
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import type { LLMModelItemType, VectorModelItemType } from './model.d';
|
import { i18nT } from '../../../web/i18n/utils';
|
||||||
|
import type { LLMModelItemType, STTModelType, VectorModelItemType } from './model.d';
|
||||||
import { getModelProvider, ModelProviderIdType } from './provider';
|
import { getModelProvider, ModelProviderIdType } from './provider';
|
||||||
|
|
||||||
export const defaultQAModels: LLMModelItemType[] = [
|
export const defaultQAModels: LLMModelItemType[] = [
|
||||||
@@ -35,6 +36,13 @@ export const defaultVectorModels: VectorModelItemType[] = [
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
export const defaultWhisperModel: STTModelType = {
|
||||||
|
provider: 'OpenAI',
|
||||||
|
model: 'whisper-1',
|
||||||
|
name: 'whisper-1',
|
||||||
|
charsPointsPrice: 0
|
||||||
|
};
|
||||||
|
|
||||||
export const getModelFromList = (
|
export const getModelFromList = (
|
||||||
modelList: { provider: ModelProviderIdType; name: string; model: string }[],
|
modelList: { provider: ModelProviderIdType; name: string; model: string }[],
|
||||||
model: string
|
model: string
|
||||||
@@ -46,3 +54,16 @@ export const getModelFromList = (
|
|||||||
avatar: provider.avatar
|
avatar: provider.avatar
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export enum ModelTypeEnum {
|
||||||
|
chat = 'chat',
|
||||||
|
embedding = 'embedding',
|
||||||
|
tts = 'tts',
|
||||||
|
stt = 'stt'
|
||||||
|
}
|
||||||
|
export const modelTypeList = [
|
||||||
|
{ label: i18nT('common:model.type.chat'), value: ModelTypeEnum.chat },
|
||||||
|
{ label: i18nT('common:model.type.embedding'), value: ModelTypeEnum.embedding },
|
||||||
|
{ label: i18nT('common:model.type.tts'), value: ModelTypeEnum.tts },
|
||||||
|
{ label: i18nT('common:model.type.stt'), value: ModelTypeEnum.stt }
|
||||||
|
];
|
||||||
|
|||||||
@@ -4,19 +4,25 @@ export type ModelProviderIdType =
|
|||||||
| 'OpenAI'
|
| 'OpenAI'
|
||||||
| 'Claude'
|
| 'Claude'
|
||||||
| 'Gemini'
|
| 'Gemini'
|
||||||
|
| 'Meta'
|
||||||
| 'MistralAI'
|
| 'MistralAI'
|
||||||
|
| 'Groq'
|
||||||
|
| 'AliCloud'
|
||||||
| 'Qwen'
|
| 'Qwen'
|
||||||
| 'Doubao'
|
| 'Doubao'
|
||||||
| 'ChatGLM'
|
| 'ChatGLM'
|
||||||
| 'DeepSeek'
|
| 'DeepSeek'
|
||||||
|
| 'Ernie'
|
||||||
| 'Moonshot'
|
| 'Moonshot'
|
||||||
| 'MiniMax'
|
| 'MiniMax'
|
||||||
| 'SparkDesk'
|
| 'SparkDesk'
|
||||||
| 'Hunyuan'
|
| 'Hunyuan'
|
||||||
| 'Baichuan'
|
| 'Baichuan'
|
||||||
|
| 'StepFun'
|
||||||
| 'Yi'
|
| 'Yi'
|
||||||
| 'Ernie'
|
|
||||||
| 'Ollama'
|
| 'Ollama'
|
||||||
|
| 'BAAI'
|
||||||
|
| 'FishAudio'
|
||||||
| 'Other';
|
| 'Other';
|
||||||
|
|
||||||
export type ModelProviderType = {
|
export type ModelProviderType = {
|
||||||
@@ -41,10 +47,25 @@ export const ModelProviderList: ModelProviderType[] = [
|
|||||||
name: 'Gemini',
|
name: 'Gemini',
|
||||||
avatar: 'model/gemini'
|
avatar: 'model/gemini'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'Meta',
|
||||||
|
name: 'Meta',
|
||||||
|
avatar: 'model/meta'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'MistralAI',
|
id: 'MistralAI',
|
||||||
name: 'MistralAI',
|
name: 'MistralAI',
|
||||||
avatar: 'model/huggingface'
|
avatar: 'model/mistral'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'Groq',
|
||||||
|
name: 'Groq',
|
||||||
|
avatar: 'model/groq'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'AliCloud',
|
||||||
|
name: i18nT('common:model_alicloud'),
|
||||||
|
avatar: 'model/alicloud'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'Qwen',
|
id: 'Qwen',
|
||||||
@@ -61,6 +82,11 @@ export const ModelProviderList: ModelProviderType[] = [
|
|||||||
name: i18nT('common:model_chatglm'),
|
name: i18nT('common:model_chatglm'),
|
||||||
avatar: 'model/chatglm'
|
avatar: 'model/chatglm'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'Ernie',
|
||||||
|
name: i18nT('common:model_ernie'),
|
||||||
|
avatar: 'model/ernie'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'DeepSeek',
|
id: 'DeepSeek',
|
||||||
name: 'DeepSeek',
|
name: 'DeepSeek',
|
||||||
@@ -91,21 +117,32 @@ export const ModelProviderList: ModelProviderType[] = [
|
|||||||
name: i18nT('common:model_baichuan'),
|
name: i18nT('common:model_baichuan'),
|
||||||
avatar: 'model/baichuan'
|
avatar: 'model/baichuan'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'StepFun',
|
||||||
|
name: i18nT('common:model_stepfun'),
|
||||||
|
avatar: 'model/stepfun'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'Yi',
|
id: 'Yi',
|
||||||
name: i18nT('common:model_yi'),
|
name: i18nT('common:model_yi'),
|
||||||
avatar: 'model/yi'
|
avatar: 'model/yi'
|
||||||
},
|
},
|
||||||
{
|
|
||||||
id: 'Ernie',
|
|
||||||
name: i18nT('common:model_ernie'),
|
|
||||||
avatar: 'model/ernie'
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
id: 'Ollama',
|
id: 'Ollama',
|
||||||
name: 'Ollama',
|
name: 'Ollama',
|
||||||
avatar: 'model/ollama'
|
avatar: 'model/ollama'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'BAAI',
|
||||||
|
name: i18nT('common:model_baai'),
|
||||||
|
avatar: 'model/BAAI'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'FishAudio',
|
||||||
|
name: 'FishAudio',
|
||||||
|
avatar: 'model/fishaudio'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'Other',
|
id: 'Other',
|
||||||
name: i18nT('common:model_other'),
|
name: i18nT('common:model_other'),
|
||||||
@@ -113,7 +150,7 @@ export const ModelProviderList: ModelProviderType[] = [
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
export const ModelProviderMap = Object.fromEntries(
|
export const ModelProviderMap = Object.fromEntries(
|
||||||
ModelProviderList.map((item) => [item.id, item])
|
ModelProviderList.map((item, index) => [item.id, { ...item, order: index }])
|
||||||
);
|
);
|
||||||
|
|
||||||
export const getModelProvider = (provider: ModelProviderIdType) => {
|
export const getModelProvider = (provider: ModelProviderIdType) => {
|
||||||
|
|||||||
5
packages/global/core/app/collaborator.d.ts
vendored
@@ -1,6 +1,6 @@
|
|||||||
import { RequireOnlyOne } from '../../common/type/utils';
|
import type { RequireOnlyOne } from '../../common/type/utils';
|
||||||
import {
|
import {
|
||||||
UpdateClbPermissionProps,
|
type UpdateClbPermissionProps,
|
||||||
UpdatePermissionBody
|
UpdatePermissionBody
|
||||||
} from '../../support/permission/collaborator';
|
} from '../../support/permission/collaborator';
|
||||||
import { PermissionValueType } from '../../support/permission/type';
|
import { PermissionValueType } from '../../support/permission/type';
|
||||||
@@ -14,4 +14,5 @@ export type AppCollaboratorDeleteParams = {
|
|||||||
} & RequireOnlyOne<{
|
} & RequireOnlyOne<{
|
||||||
tmbId: string;
|
tmbId: string;
|
||||||
groupId: string;
|
groupId: string;
|
||||||
|
orgId: string;
|
||||||
}>;
|
}>;
|
||||||
|
|||||||
34
packages/global/core/app/type.d.ts
vendored
@@ -13,6 +13,7 @@ import { StoreEdgeItemType } from '../workflow/type/edge';
|
|||||||
import { AppPermission } from '../../support/permission/app/controller';
|
import { AppPermission } from '../../support/permission/app/controller';
|
||||||
import { ParentIdType } from '../../common/parentFolder/type';
|
import { ParentIdType } from '../../common/parentFolder/type';
|
||||||
import { FlowNodeInputTypeEnum } from 'core/workflow/node/constant';
|
import { FlowNodeInputTypeEnum } from 'core/workflow/node/constant';
|
||||||
|
import { WorkflowTemplateBasicType } from '@fastgpt/global/core/workflow/type';
|
||||||
|
|
||||||
export type AppSchema = {
|
export type AppSchema = {
|
||||||
_id: string;
|
_id: string;
|
||||||
@@ -73,8 +74,8 @@ export type AppSimpleEditFormType = {
|
|||||||
aiSettings: {
|
aiSettings: {
|
||||||
model: string;
|
model: string;
|
||||||
systemPrompt?: string | undefined;
|
systemPrompt?: string | undefined;
|
||||||
temperature: number;
|
temperature?: number;
|
||||||
maxToken: number;
|
maxToken?: number;
|
||||||
isResponseAnswerText: boolean;
|
isResponseAnswerText: boolean;
|
||||||
maxHistories: number;
|
maxHistories: number;
|
||||||
};
|
};
|
||||||
@@ -109,8 +110,8 @@ export type AppChatConfigType = {
|
|||||||
};
|
};
|
||||||
export type SettingAIDataType = {
|
export type SettingAIDataType = {
|
||||||
model: string;
|
model: string;
|
||||||
temperature: number;
|
temperature?: number;
|
||||||
maxToken: number;
|
maxToken?: number;
|
||||||
isResponseAnswerText?: boolean;
|
isResponseAnswerText?: boolean;
|
||||||
maxHistories?: number;
|
maxHistories?: number;
|
||||||
[NodeInputKeyEnum.aiChatVision]?: boolean; // Is open vision mode
|
[NodeInputKeyEnum.aiChatVision]?: boolean; // Is open vision mode
|
||||||
@@ -184,3 +185,28 @@ export type SystemPluginListItemType = {
|
|||||||
name: string;
|
name: string;
|
||||||
avatar: string;
|
avatar: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type AppTemplateSchemaType = {
|
||||||
|
templateId: string;
|
||||||
|
name: string;
|
||||||
|
intro: string;
|
||||||
|
avatar: string;
|
||||||
|
tags: string[];
|
||||||
|
type: string;
|
||||||
|
author?: string;
|
||||||
|
isActive?: boolean;
|
||||||
|
userGuide?: {
|
||||||
|
type: 'markdown' | 'link';
|
||||||
|
content?: string;
|
||||||
|
link?: string;
|
||||||
|
};
|
||||||
|
isQuickTemplate?: boolean;
|
||||||
|
order?: number;
|
||||||
|
workflow: WorkflowTemplateBasicType;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type TemplateTypeSchemaType = {
|
||||||
|
typeName: string;
|
||||||
|
typeId: string;
|
||||||
|
typeOrder: number;
|
||||||
|
};
|
||||||
|
|||||||
@@ -11,4 +11,5 @@ export type DatasetCollaboratorDeleteParams = {
|
|||||||
} & RequireOnlyOne<{
|
} & RequireOnlyOne<{
|
||||||
tmbId: string;
|
tmbId: string;
|
||||||
groupId: string;
|
groupId: string;
|
||||||
|
orgId: string;
|
||||||
}>;
|
}>;
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
import { DatasetCollectionTypeEnum, TrainingModeEnum, TrainingTypeMap } from '../constants';
|
import { DatasetCollectionTypeEnum, TrainingModeEnum, TrainingTypeMap } from '../constants';
|
||||||
import { CollectionWithDatasetType, DatasetCollectionSchemaType } from '../type';
|
import { DatasetCollectionSchemaType } from '../type';
|
||||||
|
|
||||||
export const getCollectionSourceData = (
|
export const getCollectionSourceData = (collection?: DatasetCollectionSchemaType) => {
|
||||||
collection?: CollectionWithDatasetType | DatasetCollectionSchemaType
|
|
||||||
) => {
|
|
||||||
return {
|
return {
|
||||||
sourceId:
|
sourceId:
|
||||||
collection?.fileId ||
|
collection?.fileId ||
|
||||||
|
|||||||
16
packages/global/core/dataset/type.d.ts
vendored
@@ -112,6 +112,15 @@ export type DatasetDataSchemaType = {
|
|||||||
rebuilding?: boolean;
|
rebuilding?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type DatasetDataTextSchemaType = {
|
||||||
|
_id: string;
|
||||||
|
teamId: string;
|
||||||
|
datasetId: string;
|
||||||
|
collectionId: string;
|
||||||
|
dataId: string;
|
||||||
|
fullTextToken: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type DatasetTrainingSchemaType = {
|
export type DatasetTrainingSchemaType = {
|
||||||
_id: string;
|
_id: string;
|
||||||
userId: string;
|
userId: string;
|
||||||
@@ -133,11 +142,8 @@ export type DatasetTrainingSchemaType = {
|
|||||||
indexes: Omit<DatasetDataIndexItemType, 'dataId'>[];
|
indexes: Omit<DatasetDataIndexItemType, 'dataId'>[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export type CollectionWithDatasetType = Omit<DatasetCollectionSchemaType, 'datasetId'> & {
|
export type CollectionWithDatasetType = DatasetCollectionSchemaType & {
|
||||||
datasetId: DatasetSchemaType;
|
dataset: DatasetSchemaType;
|
||||||
};
|
|
||||||
export type DatasetDataWithCollectionType = Omit<DatasetDataSchemaType, 'collectionId'> & {
|
|
||||||
collectionId: DatasetCollectionSchemaType;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ================= dataset ===================== */
|
/* ================= dataset ===================== */
|
||||||
|
|||||||
22
packages/global/core/workflow/runtime/type.d.ts
vendored
@@ -21,13 +21,20 @@ import { ReadFileNodeResponse } from '../template/system/readFiles/type';
|
|||||||
import { UserSelectOptionType } from '../template/system/userSelect/type';
|
import { UserSelectOptionType } from '../template/system/userSelect/type';
|
||||||
import { WorkflowResponseType } from '../../../../service/core/workflow/dispatch/type';
|
import { WorkflowResponseType } from '../../../../service/core/workflow/dispatch/type';
|
||||||
import { AiChatQuoteRoleType } from '../template/system/aiChat/type';
|
import { AiChatQuoteRoleType } from '../template/system/aiChat/type';
|
||||||
|
import { LafAccountType, OpenaiAccountType } from '../../../support/user/team/type';
|
||||||
|
|
||||||
|
export type ExternalProviderType = {
|
||||||
|
openaiAccount?: OpenaiAccountType;
|
||||||
|
externalWorkflowVariables?: Record<string, string>;
|
||||||
|
};
|
||||||
|
|
||||||
/* workflow props */
|
/* workflow props */
|
||||||
export type ChatDispatchProps = {
|
export type ChatDispatchProps = {
|
||||||
res?: NextApiResponse;
|
res?: NextApiResponse;
|
||||||
requestOrigin?: string;
|
requestOrigin?: string;
|
||||||
mode: 'test' | 'chat' | 'debug';
|
mode: 'test' | 'chat' | 'debug';
|
||||||
user: UserModelSchema;
|
timezone: string;
|
||||||
|
externalProvider: ExternalProviderType;
|
||||||
|
|
||||||
runningAppInfo: {
|
runningAppInfo: {
|
||||||
id: string; // May be the id of the system plug-in (cannot be used directly to look up the table)
|
id: string; // May be the id of the system plug-in (cannot be used directly to look up the table)
|
||||||
@@ -100,7 +107,9 @@ export type DispatchNodeResponseType = {
|
|||||||
mergeSignId?: string;
|
mergeSignId?: string;
|
||||||
|
|
||||||
// bill
|
// bill
|
||||||
tokens?: number;
|
tokens?: number; // deprecated
|
||||||
|
inputTokens?: number;
|
||||||
|
outputTokens?: number;
|
||||||
model?: string;
|
model?: string;
|
||||||
contextTotalLen?: number;
|
contextTotalLen?: number;
|
||||||
totalPoints?: number;
|
totalPoints?: number;
|
||||||
@@ -150,6 +159,8 @@ export type DispatchNodeResponseType = {
|
|||||||
|
|
||||||
// tool
|
// tool
|
||||||
toolCallTokens?: number;
|
toolCallTokens?: number;
|
||||||
|
toolCallInputTokens?: number;
|
||||||
|
toolCallOutputTokens?: number;
|
||||||
toolDetail?: ChatHistoryItemResType[];
|
toolDetail?: ChatHistoryItemResType[];
|
||||||
toolStop?: boolean;
|
toolStop?: boolean;
|
||||||
|
|
||||||
@@ -201,13 +212,14 @@ export type DispatchNodeResultType<T = {}> = {
|
|||||||
export type AIChatNodeProps = {
|
export type AIChatNodeProps = {
|
||||||
[NodeInputKeyEnum.aiModel]: string;
|
[NodeInputKeyEnum.aiModel]: string;
|
||||||
[NodeInputKeyEnum.aiSystemPrompt]?: string;
|
[NodeInputKeyEnum.aiSystemPrompt]?: string;
|
||||||
[NodeInputKeyEnum.aiChatTemperature]: number;
|
[NodeInputKeyEnum.aiChatTemperature]?: number;
|
||||||
[NodeInputKeyEnum.aiChatMaxToken]: number;
|
[NodeInputKeyEnum.aiChatMaxToken]?: number;
|
||||||
[NodeInputKeyEnum.aiChatIsResponseText]: boolean;
|
[NodeInputKeyEnum.aiChatIsResponseText]: boolean;
|
||||||
|
[NodeInputKeyEnum.aiChatVision]?: boolean;
|
||||||
|
|
||||||
[NodeInputKeyEnum.aiChatQuoteRole]?: AiChatQuoteRoleType;
|
[NodeInputKeyEnum.aiChatQuoteRole]?: AiChatQuoteRoleType;
|
||||||
[NodeInputKeyEnum.aiChatQuoteTemplate]?: string;
|
[NodeInputKeyEnum.aiChatQuoteTemplate]?: string;
|
||||||
[NodeInputKeyEnum.aiChatQuotePrompt]?: string;
|
[NodeInputKeyEnum.aiChatQuotePrompt]?: string;
|
||||||
[NodeInputKeyEnum.aiChatVision]?: boolean;
|
|
||||||
|
|
||||||
[NodeInputKeyEnum.stringQuoteText]?: string;
|
[NodeInputKeyEnum.stringQuoteText]?: string;
|
||||||
[NodeInputKeyEnum.fileUrlList]?: string[];
|
[NodeInputKeyEnum.fileUrlList]?: string[];
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { isValidReferenceValueFormat } from '../utils';
|
|||||||
import { FlowNodeOutputItemType, ReferenceValueType } from '../type/io';
|
import { FlowNodeOutputItemType, ReferenceValueType } from '../type/io';
|
||||||
import { ChatItemType, NodeOutputItemType } from '../../../core/chat/type';
|
import { ChatItemType, NodeOutputItemType } from '../../../core/chat/type';
|
||||||
import { ChatItemValueTypeEnum, ChatRoleEnum } from '../../../core/chat/constants';
|
import { ChatItemValueTypeEnum, ChatRoleEnum } from '../../../core/chat/constants';
|
||||||
|
import { replaceVariable, valToStr } from '../../../common/string/tools';
|
||||||
|
|
||||||
export const getMaxHistoryLimitFromNodes = (nodes: StoreNodeItemType[]): number => {
|
export const getMaxHistoryLimitFromNodes = (nodes: StoreNodeItemType[]): number => {
|
||||||
let limit = 10;
|
let limit = 10;
|
||||||
@@ -317,6 +318,8 @@ export function replaceEditorVariable({
|
|||||||
}) {
|
}) {
|
||||||
if (typeof text !== 'string') return text;
|
if (typeof text !== 'string') return text;
|
||||||
|
|
||||||
|
text = replaceVariable(text, variables);
|
||||||
|
|
||||||
const variablePattern = /\{\{\$([^.]+)\.([^$]+)\$\}\}/g;
|
const variablePattern = /\{\{\$([^.]+)\.([^$]+)\$\}\}/g;
|
||||||
const matches = [...text.matchAll(variablePattern)];
|
const matches = [...text.matchAll(variablePattern)];
|
||||||
if (matches.length === 0) return text;
|
if (matches.length === 0) return text;
|
||||||
@@ -340,11 +343,7 @@ export function replaceEditorVariable({
|
|||||||
if (input) return getReferenceVariableValue({ value: input.value, nodes, variables });
|
if (input) return getReferenceVariableValue({ value: input.value, nodes, variables });
|
||||||
})();
|
})();
|
||||||
|
|
||||||
const formatVal = (() => {
|
const formatVal = valToStr(variableVal);
|
||||||
if (variableVal === undefined) return 'undefined';
|
|
||||||
if (variableVal === null) return 'null';
|
|
||||||
return typeof variableVal === 'object' ? JSON.stringify(variableVal) : String(variableVal);
|
|
||||||
})();
|
|
||||||
|
|
||||||
const regex = new RegExp(`\\{\\{\\$(${nodeId}\\.${id})\\$\\}\\}`, 'g');
|
const regex = new RegExp(`\\{\\{\\$(${nodeId}\\.${id})\\$\\}\\}`, 'g');
|
||||||
text = text.replace(regex, () => formatVal);
|
text = text.replace(regex, () => formatVal);
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ export const WorkflowStart: FlowNodeTemplateType = {
|
|||||||
intro: '',
|
intro: '',
|
||||||
forbidDelete: true,
|
forbidDelete: true,
|
||||||
unique: true,
|
unique: true,
|
||||||
courseUrl: '/docs/guide/workbench/workflow/input/',
|
|
||||||
version: '481',
|
version: '481',
|
||||||
inputs: [{ ...Input_Template_UserChatInput, toolDescription: i18nT('workflow:user_question') }],
|
inputs: [{ ...Input_Template_UserChatInput, toolDescription: i18nT('workflow:user_question') }],
|
||||||
outputs: [
|
outputs: [
|
||||||
|
|||||||
2
packages/global/core/workflow/type/node.d.ts
vendored
@@ -69,6 +69,7 @@ export type FlowNodeTemplateType = FlowNodeCommonType & {
|
|||||||
|
|
||||||
diagram?: string; // diagram url
|
diagram?: string; // diagram url
|
||||||
courseUrl?: string; // course url
|
courseUrl?: string; // course url
|
||||||
|
userGuide?: string; // user guide
|
||||||
};
|
};
|
||||||
|
|
||||||
export type NodeTemplateListItemType = {
|
export type NodeTemplateListItemType = {
|
||||||
@@ -87,6 +88,7 @@ export type NodeTemplateListItemType = {
|
|||||||
currentCost?: number; // 当前积分消耗
|
currentCost?: number; // 当前积分消耗
|
||||||
hasTokenFee?: boolean; // 是否配置积分
|
hasTokenFee?: boolean; // 是否配置积分
|
||||||
instructions?: string; // 使用说明
|
instructions?: string; // 使用说明
|
||||||
|
courseUrl?: string; // 教程链接
|
||||||
};
|
};
|
||||||
|
|
||||||
export type NodeTemplateListType = {
|
export type NodeTemplateListType = {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
"next": "14.2.5",
|
"next": "14.2.5",
|
||||||
"openai": "4.61.0",
|
"openai": "4.61.0",
|
||||||
"openapi-types": "^12.1.3",
|
"openapi-types": "^12.1.3",
|
||||||
|
"json5": "^2.2.3",
|
||||||
"timezones-list": "^3.0.2"
|
"timezones-list": "^3.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
5
packages/global/support/outLink/type.d.ts
vendored
@@ -83,11 +83,6 @@ export type OutLinkSchema<T extends OutlinkAppType = undefined> = {
|
|||||||
app: T;
|
app: T;
|
||||||
};
|
};
|
||||||
|
|
||||||
// to handle MongoDB querying
|
|
||||||
export type OutLinkWithAppType = Omit<OutLinkSchema, 'appId'> & {
|
|
||||||
appId: AppSchema;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Edit the Outlink
|
// Edit the Outlink
|
||||||
export type OutLinkEditType<T = undefined> = {
|
export type OutLinkEditType<T = undefined> = {
|
||||||
_id?: string;
|
_id?: string;
|
||||||
|
|||||||
@@ -10,22 +10,18 @@ export type CollaboratorItemType = {
|
|||||||
} & RequireOnlyOne<{
|
} & RequireOnlyOne<{
|
||||||
tmbId: string;
|
tmbId: string;
|
||||||
groupId: string;
|
groupId: string;
|
||||||
|
orgId: string;
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
export type UpdateClbPermissionProps = {
|
export type UpdateClbPermissionProps = {
|
||||||
members?: string[];
|
members?: string[];
|
||||||
groups?: string[];
|
groups?: string[];
|
||||||
|
orgs?: string[];
|
||||||
permission: PermissionValueType;
|
permission: PermissionValueType;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type DeleteClbPermissionProps = RequireOnlyOne<{
|
export type DeletePermissionQuery = RequireOnlyOne<{
|
||||||
tmbId: string;
|
tmbId?: string;
|
||||||
groupId: string;
|
groupId?: string;
|
||||||
}>;
|
orgId?: string;
|
||||||
|
|
||||||
export type UpdatePermissionBody = {
|
|
||||||
permission: PermissionValueType;
|
|
||||||
} & RequireOnlyOne<{
|
|
||||||
memberId: string;
|
|
||||||
groupId: string;
|
|
||||||
}>;
|
}>;
|
||||||
|
|||||||
13
packages/global/support/permission/type.d.ts
vendored
@@ -1,7 +1,9 @@
|
|||||||
|
import { UserModelSchema } from '../user/type';
|
||||||
import { RequireOnlyOne } from '../../common/type/utils';
|
import { RequireOnlyOne } from '../../common/type/utils';
|
||||||
import { TeamMemberWithUserSchema } from '../user/team/type';
|
import { TeamMemberSchema } from '../user/team/type';
|
||||||
import { AuthUserTypeEnum, PermissionKeyEnum, PerResourceTypeEnum } from './constant';
|
|
||||||
import { MemberGroupSchemaType } from './memberGroup/type';
|
import { MemberGroupSchemaType } from './memberGroup/type';
|
||||||
|
import type { TeamMemberWithUserSchema } from '../user/team/type';
|
||||||
|
import { AuthUserTypeEnum, type PermissionKeyEnum, type PerResourceTypeEnum } from './constant';
|
||||||
|
|
||||||
// PermissionValueType, the type of permission's value is a number, which is a bit field actually.
|
// PermissionValueType, the type of permission's value is a number, which is a bit field actually.
|
||||||
// It is spired by the permission system in Linux.
|
// It is spired by the permission system in Linux.
|
||||||
@@ -28,14 +30,11 @@ export type ResourcePermissionType = {
|
|||||||
} & RequireOnlyOne<{
|
} & RequireOnlyOne<{
|
||||||
tmbId: string;
|
tmbId: string;
|
||||||
groupId: string;
|
groupId: string;
|
||||||
|
orgId: string;
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
export type ResourcePerWithTmbWithUser = Omit<ResourcePermissionType, 'tmbId'> & {
|
export type ResourcePerWithTmbWithUser = Omit<ResourcePermissionType, 'tmbId'> & {
|
||||||
tmbId: TeamMemberWithUserSchema;
|
tmbId: TeamMemberSchema & { user: UserModelSchema };
|
||||||
};
|
|
||||||
|
|
||||||
export type ResourcePerWithGroup = Omit<ResourcePermissionType, 'groupId'> & {
|
|
||||||
groupId: MemberGroupSchemaType;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export type PermissionSchemaType = {
|
export type PermissionSchemaType = {
|
||||||
|
|||||||
@@ -17,5 +17,6 @@ export enum OAuthEnum {
|
|||||||
wechat = 'wechat',
|
wechat = 'wechat',
|
||||||
microsoft = 'microsoft',
|
microsoft = 'microsoft',
|
||||||
dingtalk = 'dingtalk',
|
dingtalk = 'dingtalk',
|
||||||
|
wecom = 'wecom',
|
||||||
sso = 'sso'
|
sso = 'sso'
|
||||||
}
|
}
|
||||||
|
|||||||
3
packages/global/support/user/login/constants.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export function checkIsWecomTerminal() {
|
||||||
|
return /wxwork/i.test(navigator.userAgent);
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { PermissionValueType } from '../../permission/type';
|
import { PermissionValueType } from '../../permission/type';
|
||||||
import { TeamMemberRoleEnum } from './constant';
|
import { TeamMemberRoleEnum } from './constant';
|
||||||
import { LafAccountType, TeamMemberSchema } from './type';
|
import { LafAccountType, TeamMemberSchema, ThirdPartyAccountType } from './type';
|
||||||
|
|
||||||
export type AuthTeamRoleProps = {
|
export type AuthTeamRoleProps = {
|
||||||
teamId: string;
|
teamId: string;
|
||||||
@@ -11,14 +11,13 @@ export type CreateTeamProps = {
|
|||||||
name: string;
|
name: string;
|
||||||
avatar?: string;
|
avatar?: string;
|
||||||
defaultTeam?: boolean;
|
defaultTeam?: boolean;
|
||||||
lafAccount?: LafAccountType;
|
|
||||||
memberName?: string;
|
memberName?: string;
|
||||||
};
|
};
|
||||||
export type UpdateTeamProps = {
|
export type UpdateTeamProps = Omit<ThirdPartyAccountType, 'externalWorkflowVariable'> & {
|
||||||
name?: string;
|
name?: string;
|
||||||
avatar?: string;
|
avatar?: string;
|
||||||
teamDomain?: string;
|
teamDomain?: string;
|
||||||
lafAccount?: null | LafAccountType;
|
externalWorkflowVariable?: { key: string; value: string };
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ------------- member ----------- */
|
/* ------------- member ----------- */
|
||||||
|
|||||||
32
packages/global/support/user/team/org/api.d.ts
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
export type postCreateOrgData = {
|
||||||
|
name: string;
|
||||||
|
parentId: string;
|
||||||
|
description?: string;
|
||||||
|
avatar?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type putUpdateOrgMembersData = {
|
||||||
|
orgId: string;
|
||||||
|
members: {
|
||||||
|
tmbId: string;
|
||||||
|
// role: `${OrgMemberRole}`;
|
||||||
|
}[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type putUpdateOrgData = {
|
||||||
|
orgId: string;
|
||||||
|
name?: string;
|
||||||
|
avatar?: string;
|
||||||
|
description?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type putMoveOrgType = {
|
||||||
|
orgId: string;
|
||||||
|
targetOrgId: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
// type putChnageOrgOwnerData = {
|
||||||
|
// orgId: string;
|
||||||
|
// tmbId: string;
|
||||||
|
// toAdmin?: boolean;
|
||||||
|
// };
|
||||||
12
packages/global/support/user/team/org/constant.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { OrgSchemaType } from './type';
|
||||||
|
|
||||||
|
export const OrgCollectionName = 'team_orgs';
|
||||||
|
export const OrgMemberCollectionName = 'team_org_members';
|
||||||
|
|
||||||
|
export const getOrgChildrenPath = (org: OrgSchemaType) => `${org.path}/${org.pathId}`;
|
||||||
|
|
||||||
|
// export enum OrgMemberRole {
|
||||||
|
// owner = 'owner',
|
||||||
|
// admin = 'admin',
|
||||||
|
// member = 'member'
|
||||||
|
// }
|
||||||
25
packages/global/support/user/team/org/type.d.ts
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import type { TeamPermission } from 'support/permission/user/controller';
|
||||||
|
import { ResourcePermissionType } from '../type';
|
||||||
|
|
||||||
|
type OrgSchemaType = {
|
||||||
|
_id: string;
|
||||||
|
teamId: string;
|
||||||
|
pathId: string;
|
||||||
|
path: string;
|
||||||
|
name: string;
|
||||||
|
avatar?: string;
|
||||||
|
description?: string;
|
||||||
|
updateTime: Date;
|
||||||
|
};
|
||||||
|
|
||||||
|
type OrgMemberSchemaType = {
|
||||||
|
teamId: string;
|
||||||
|
orgId: string;
|
||||||
|
tmbId: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type OrgType = Omit<OrgSchemaType, 'avatar'> & {
|
||||||
|
avatar: string;
|
||||||
|
members: OrgMemberSchemaType[];
|
||||||
|
permission: TeamPermission;
|
||||||
|
};
|
||||||
35
packages/global/support/user/team/type.d.ts
vendored
@@ -4,6 +4,12 @@ import { LafAccountType } from './type';
|
|||||||
import { PermissionValueType, ResourcePermissionType } from '../../permission/type';
|
import { PermissionValueType, ResourcePermissionType } from '../../permission/type';
|
||||||
import { TeamPermission } from '../../permission/user/controller';
|
import { TeamPermission } from '../../permission/user/controller';
|
||||||
|
|
||||||
|
export type ThirdPartyAccountType = {
|
||||||
|
lafAccount?: LafAccountType;
|
||||||
|
openaiAccount?: OpenaiAccountType;
|
||||||
|
externalWorkflowVariables?: Record<string, string>;
|
||||||
|
};
|
||||||
|
|
||||||
export type TeamSchema = {
|
export type TeamSchema = {
|
||||||
_id: string;
|
_id: string;
|
||||||
name: string;
|
name: string;
|
||||||
@@ -16,9 +22,8 @@ export type TeamSchema = {
|
|||||||
lastExportDatasetTime: Date;
|
lastExportDatasetTime: Date;
|
||||||
lastWebsiteSyncTime: Date;
|
lastWebsiteSyncTime: Date;
|
||||||
};
|
};
|
||||||
lafAccount: LafAccountType;
|
|
||||||
notificationAccount?: string;
|
notificationAccount?: string;
|
||||||
};
|
} & ThirdPartyAccountType;
|
||||||
|
|
||||||
export type tagsType = {
|
export type tagsType = {
|
||||||
label: string;
|
label: string;
|
||||||
@@ -42,34 +47,27 @@ export type TeamMemberSchema = {
|
|||||||
defaultTeam: boolean;
|
defaultTeam: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type TeamMemberWithUserSchema = Omit<TeamMemberSchema, 'userId'> & {
|
export type TeamMemberWithTeamAndUserSchema = TeamMemberSchema & {
|
||||||
userId: UserModelSchema;
|
team: TeamSchema;
|
||||||
};
|
user: UserModelSchema;
|
||||||
|
|
||||||
export type TeamMemberWithTeamSchema = Omit<TeamMemberSchema, 'teamId'> & {
|
|
||||||
teamId: TeamSchema;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type TeamMemberWithTeamAndUserSchema = Omit<TeamMemberWithTeamSchema, 'userId'> & {
|
|
||||||
userId: UserModelSchema;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export type TeamTmbItemType = {
|
export type TeamTmbItemType = {
|
||||||
userId: string;
|
userId: string;
|
||||||
teamId: string;
|
teamId: string;
|
||||||
|
teamAvatar?: string;
|
||||||
teamName: string;
|
teamName: string;
|
||||||
memberName: string;
|
memberName: string;
|
||||||
avatar: string;
|
avatar: string;
|
||||||
balance: number;
|
balance?: number;
|
||||||
tmbId: string;
|
tmbId: string;
|
||||||
teamDomain: string;
|
teamDomain: string;
|
||||||
defaultTeam: boolean;
|
defaultTeam: boolean;
|
||||||
role: `${TeamMemberRoleEnum}`;
|
role: `${TeamMemberRoleEnum}`;
|
||||||
status: `${TeamMemberStatusEnum}`;
|
status: `${TeamMemberStatusEnum}`;
|
||||||
lafAccount?: LafAccountType;
|
|
||||||
notificationAccount?: string;
|
notificationAccount?: string;
|
||||||
permission: TeamPermission;
|
permission: TeamPermission;
|
||||||
};
|
} & ThirdPartyAccountType;
|
||||||
|
|
||||||
export type TeamMemberItemType = {
|
export type TeamMemberItemType = {
|
||||||
userId: string;
|
userId: string;
|
||||||
@@ -88,11 +86,16 @@ export type TeamTagItemType = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type LafAccountType = {
|
export type LafAccountType = {
|
||||||
token: string;
|
|
||||||
appid: string;
|
appid: string;
|
||||||
|
token: string;
|
||||||
pat: string;
|
pat: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type OpenaiAccountType = {
|
||||||
|
key: string;
|
||||||
|
baseUrl: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type TeamInvoiceHeaderType = {
|
export type TeamInvoiceHeaderType = {
|
||||||
teamName: string;
|
teamName: string;
|
||||||
unifiedCreditCode: string;
|
unifiedCreditCode: string;
|
||||||
|
|||||||
5
packages/global/support/user/type.d.ts
vendored
@@ -14,10 +14,6 @@ export type UserModelSchema = {
|
|||||||
timezone: string;
|
timezone: string;
|
||||||
status: `${UserStatusEnum}`;
|
status: `${UserStatusEnum}`;
|
||||||
lastLoginTmbId?: string;
|
lastLoginTmbId?: string;
|
||||||
openaiAccount?: {
|
|
||||||
key: string;
|
|
||||||
baseUrl: string;
|
|
||||||
};
|
|
||||||
fastgpt_sem?: {
|
fastgpt_sem?: {
|
||||||
keyword: string;
|
keyword: string;
|
||||||
};
|
};
|
||||||
@@ -29,7 +25,6 @@ export type UserType = {
|
|||||||
avatar: string;
|
avatar: string;
|
||||||
timezone: string;
|
timezone: string;
|
||||||
promotionRate: UserModelSchema['promotionRate'];
|
promotionRate: UserModelSchema['promotionRate'];
|
||||||
openaiAccount: UserModelSchema['openaiAccount'];
|
|
||||||
team: TeamTmbItemType;
|
team: TeamTmbItemType;
|
||||||
standardInfo?: standardInfoType;
|
standardInfo?: standardInfoType;
|
||||||
notificationAccount?: string;
|
notificationAccount?: string;
|
||||||
|
|||||||
16
packages/global/support/user/utils.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
export const getRandomUserAvatar = () => {
|
||||||
|
const defaultAvatars = [
|
||||||
|
'/imgs/avatar/RoyalBlueAvatar.svg',
|
||||||
|
'/imgs/avatar/PurpleAvatar.svg',
|
||||||
|
'/imgs/avatar/AdoraAvatar.svg',
|
||||||
|
'/imgs/avatar/OrangeAvatar.svg',
|
||||||
|
'/imgs/avatar/RedAvatar.svg',
|
||||||
|
'/imgs/avatar/GrayModernAvatar.svg',
|
||||||
|
'/imgs/avatar/TealAvatar.svg',
|
||||||
|
'/imgs/avatar/GreenAvatar.svg',
|
||||||
|
'/imgs/avatar/BrightBlueAvatar.svg',
|
||||||
|
'/imgs/avatar/BlueAvatar.svg'
|
||||||
|
];
|
||||||
|
|
||||||
|
return defaultAvatars[Math.floor(Math.random() * defaultAvatars.length)];
|
||||||
|
};
|
||||||
@@ -23,7 +23,8 @@ export type BillSchemaType = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type ChatNodeUsageType = {
|
export type ChatNodeUsageType = {
|
||||||
tokens?: number;
|
inputTokens?: number;
|
||||||
|
outputTokens?: number;
|
||||||
totalPoints: number;
|
totalPoints: number;
|
||||||
moduleName: string;
|
moduleName: string;
|
||||||
model?: string;
|
model?: string;
|
||||||
|
|||||||
@@ -2,9 +2,13 @@ import { CreateUsageProps } from './api';
|
|||||||
import { UsageSourceEnum } from './constants';
|
import { UsageSourceEnum } from './constants';
|
||||||
|
|
||||||
export type UsageListItemCountType = {
|
export type UsageListItemCountType = {
|
||||||
tokens?: number;
|
inputTokens?: number;
|
||||||
|
outputTokens?: number;
|
||||||
charsLength?: number;
|
charsLength?: number;
|
||||||
duration?: number;
|
duration?: number;
|
||||||
|
|
||||||
|
// deprecated
|
||||||
|
tokens?: number;
|
||||||
};
|
};
|
||||||
export type UsageListItemType = UsageListItemCountType & {
|
export type UsageListItemType = UsageListItemCountType & {
|
||||||
moduleName: string;
|
moduleName: string;
|
||||||
|
|||||||
@@ -35,24 +35,26 @@ export const list = [...staticPluginList, ...packagePluginList];
|
|||||||
|
|
||||||
/* Get plugins */
|
/* Get plugins */
|
||||||
export const getCommunityPlugins = () => {
|
export const getCommunityPlugins = () => {
|
||||||
return list.map<SystemPluginTemplateItemType>((name) => {
|
return Promise.all(
|
||||||
const config = require(`./src/${name}/template.json`);
|
list.map<Promise<SystemPluginTemplateItemType>>(async (name) => {
|
||||||
|
const config = (await import(`./src/${name}/template.json`))?.default;
|
||||||
|
|
||||||
const isFolder = list.find((item) => item.startsWith(`${name}/`));
|
const isFolder = list.find((item) => item.startsWith(`${name}/`));
|
||||||
|
|
||||||
const parentIdList = name.split('/').slice(0, -1);
|
const parentIdList = name.split('/').slice(0, -1);
|
||||||
const parentId =
|
const parentId =
|
||||||
parentIdList.length > 0 ? `${PluginSourceEnum.community}-${parentIdList.join('/')}` : null;
|
parentIdList.length > 0 ? `${PluginSourceEnum.community}-${parentIdList.join('/')}` : null;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...config,
|
...config,
|
||||||
id: `${PluginSourceEnum.community}-${name}`,
|
id: `${PluginSourceEnum.community}-${name}`,
|
||||||
isFolder,
|
isFolder,
|
||||||
parentId,
|
parentId,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
isOfficial: true
|
isOfficial: true
|
||||||
};
|
};
|
||||||
});
|
})
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getSystemPluginTemplates = () => {
|
export const getSystemPluginTemplates = () => {
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import { SystemPluginSpecialResponse } from '../../../type.d';
|
|||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
title: string;
|
title: string;
|
||||||
xAxis: string;
|
xAxis: string[];
|
||||||
yAxis: string;
|
yAxis: string[];
|
||||||
chartType: string;
|
chartType: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -27,7 +27,12 @@ type Option = {
|
|||||||
series: SeriesData[]; // 使用定义的类型
|
series: SeriesData[]; // 使用定义的类型
|
||||||
};
|
};
|
||||||
|
|
||||||
const generateChart = async (title: string, xAxis: string, yAxis: string, chartType: string) => {
|
const generateChart = async (
|
||||||
|
title: string,
|
||||||
|
xAxis: string[],
|
||||||
|
yAxis: string[],
|
||||||
|
chartType: string
|
||||||
|
) => {
|
||||||
// @ts-ignore 无法使用dom,如使用jsdom会出现生成图片无法正常展示,有高手可以帮忙解决
|
// @ts-ignore 无法使用dom,如使用jsdom会出现生成图片无法正常展示,有高手可以帮忙解决
|
||||||
const chart = echarts.init(undefined, undefined, {
|
const chart = echarts.init(undefined, undefined, {
|
||||||
renderer: 'svg', // 必须使用 SVG 模式
|
renderer: 'svg', // 必须使用 SVG 模式
|
||||||
@@ -36,21 +41,11 @@ const generateChart = async (title: string, xAxis: string, yAxis: string, chartT
|
|||||||
height: 300
|
height: 300
|
||||||
});
|
});
|
||||||
|
|
||||||
let parsedXAxis: string[] = [];
|
|
||||||
let parsedYAxis: number[] = [];
|
|
||||||
try {
|
|
||||||
parsedXAxis = json5.parse(xAxis);
|
|
||||||
parsedYAxis = json5.parse(yAxis);
|
|
||||||
} catch (error: any) {
|
|
||||||
console.error('解析数据时出错:', error);
|
|
||||||
return Promise.reject('Data error');
|
|
||||||
}
|
|
||||||
|
|
||||||
const option: Option = {
|
const option: Option = {
|
||||||
backgroundColor: '#f5f5f5',
|
backgroundColor: '#f5f5f5',
|
||||||
title: { text: title },
|
title: { text: title },
|
||||||
tooltip: {},
|
tooltip: {},
|
||||||
xAxis: { data: parsedXAxis },
|
xAxis: { data: xAxis },
|
||||||
yAxis: {},
|
yAxis: {},
|
||||||
series: [] // 初始化为空数组
|
series: [] // 初始化为空数组
|
||||||
};
|
};
|
||||||
@@ -58,18 +53,18 @@ const generateChart = async (title: string, xAxis: string, yAxis: string, chartT
|
|||||||
// 根据 chartType 生成不同的图表
|
// 根据 chartType 生成不同的图表
|
||||||
switch (chartType) {
|
switch (chartType) {
|
||||||
case '柱状图':
|
case '柱状图':
|
||||||
option.series.push({ name: 'Sample', type: 'bar', data: parsedYAxis });
|
option.series.push({ name: 'Sample', type: 'bar', data: yAxis.map(Number) });
|
||||||
break;
|
break;
|
||||||
case '折线图':
|
case '折线图':
|
||||||
option.series.push({ name: 'Sample', type: 'line', data: parsedYAxis });
|
option.series.push({ name: 'Sample', type: 'line', data: yAxis.map(Number) });
|
||||||
break;
|
break;
|
||||||
case '饼图':
|
case '饼图':
|
||||||
option.series.push({
|
option.series.push({
|
||||||
name: 'Sample',
|
name: 'Sample',
|
||||||
type: 'pie',
|
type: 'pie',
|
||||||
data: parsedYAxis.map((value, index) => ({
|
data: yAxis.map((value, index) => ({
|
||||||
value,
|
value: Number(value),
|
||||||
name: parsedXAxis[index] // 使用 xAxis 作为饼图的名称
|
name: xAxis[index] // 使用 xAxis 作为饼图的名称
|
||||||
}))
|
}))
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"author": "silencezhang",
|
"author": "silencezhang",
|
||||||
"version": "4812",
|
"version": "4817",
|
||||||
"name": "基础图表",
|
"name": "基础图表",
|
||||||
"avatar": "core/workflow/template/baseChart",
|
"avatar": "core/workflow/template/baseChart",
|
||||||
"intro": "根据数据生成图表,可根据chartType生成柱状图,折线图,饼图",
|
"intro": "根据数据生成图表,可根据chartType生成柱状图,折线图,饼图",
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
"canEdit": true,
|
"canEdit": true,
|
||||||
"key": "yAxis",
|
"key": "yAxis",
|
||||||
"label": "yAxis",
|
"label": "yAxis",
|
||||||
"description": "y轴数据,例如:['1', '2', '3']",
|
"description": "y轴数据,例如:[1,2,3]",
|
||||||
"defaultValue": "",
|
"defaultValue": "",
|
||||||
"list": [
|
"list": [
|
||||||
{
|
{
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"required": true,
|
"required": true,
|
||||||
"toolDescription": "y轴数据,例如:['1', '2', '3']"
|
"toolDescription": "y轴数据,例如:[1,2,3]"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"renderTypeList": ["select", "reference"],
|
"renderTypeList": ["select", "reference"],
|
||||||
@@ -145,8 +145,8 @@
|
|||||||
"flowNodeType": "pluginOutput",
|
"flowNodeType": "pluginOutput",
|
||||||
"showStatus": false,
|
"showStatus": false,
|
||||||
"position": {
|
"position": {
|
||||||
"x": 2122.252754006148,
|
"x": 2128.8138851197145,
|
||||||
"y": -63.5218674613718
|
"y": -63.52186746137181
|
||||||
},
|
},
|
||||||
"version": "481",
|
"version": "481",
|
||||||
"inputs": [
|
"inputs": [
|
||||||
@@ -154,10 +154,12 @@
|
|||||||
"renderTypeList": ["reference"],
|
"renderTypeList": ["reference"],
|
||||||
"valueType": "string",
|
"valueType": "string",
|
||||||
"canEdit": true,
|
"canEdit": true,
|
||||||
"key": "相对路径URL",
|
"key": "图表 url",
|
||||||
"label": "相对路径URL",
|
"label": "图表 url",
|
||||||
"description": "可用使用markdown格式展示图片,如:",
|
"description": "可用使用markdown格式展示图片,如:",
|
||||||
"value": ["ws0DFKJnCPhk", "bzaYjKyQFOw2"]
|
"value": ["ws0DFKJnCPhk", "bzaYjKyQFOw2"],
|
||||||
|
"isToolOutput": true,
|
||||||
|
"required": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"outputs": []
|
"outputs": []
|
||||||
@@ -170,8 +172,8 @@
|
|||||||
"flowNodeType": "httpRequest468",
|
"flowNodeType": "httpRequest468",
|
||||||
"showStatus": true,
|
"showStatus": true,
|
||||||
"position": {
|
"position": {
|
||||||
"x": 1216.5166647574395,
|
"x": 1264.2009472531117,
|
||||||
"y": -206.30162946606856
|
"y": -455.0773486762623
|
||||||
},
|
},
|
||||||
"version": "481",
|
"version": "481",
|
||||||
"inputs": [
|
"inputs": [
|
||||||
@@ -275,7 +277,7 @@
|
|||||||
"key": "system_httpJsonBody",
|
"key": "system_httpJsonBody",
|
||||||
"renderTypeList": ["hidden"],
|
"renderTypeList": ["hidden"],
|
||||||
"valueType": "any",
|
"valueType": "any",
|
||||||
"value": "{\r\n \"title\": \"{{title-plugin}}\",\r\n \"xAxis\": \"{{xAxis-plugin}}\",\r\n \"yAxis\": \"{{yAxis-plugin}}\",\r\n \"chartType\": \"{{chartType-plugin}}\"\r\n}",
|
"value": "{\r\n \"title\": \"{{$pluginInput.title$}}\",\r\n \"xAxis\": {{$pluginInput.xAxis$}},\r\n \"yAxis\": {{$pluginInput.yAxis$}},\r\n \"chartType\": \"{{$pluginInput.chartType$}}\"\r\n}",
|
||||||
"label": "",
|
"label": "",
|
||||||
"required": false,
|
"required": false,
|
||||||
"valueDesc": "",
|
"valueDesc": "",
|
||||||
@@ -306,126 +308,6 @@
|
|||||||
"description": "",
|
"description": "",
|
||||||
"debugLabel": "",
|
"debugLabel": "",
|
||||||
"toolDescription": ""
|
"toolDescription": ""
|
||||||
},
|
|
||||||
{
|
|
||||||
"renderTypeList": ["reference"],
|
|
||||||
"valueType": "string",
|
|
||||||
"canEdit": true,
|
|
||||||
"key": "title-plugin",
|
|
||||||
"label": "title-plugin",
|
|
||||||
"customInputConfig": {
|
|
||||||
"selectValueTypeList": [
|
|
||||||
"string",
|
|
||||||
"number",
|
|
||||||
"boolean",
|
|
||||||
"object",
|
|
||||||
"arrayString",
|
|
||||||
"arrayNumber",
|
|
||||||
"arrayBoolean",
|
|
||||||
"arrayObject",
|
|
||||||
"arrayAny",
|
|
||||||
"any",
|
|
||||||
"chatHistory",
|
|
||||||
"datasetQuote",
|
|
||||||
"dynamic",
|
|
||||||
"selectApp",
|
|
||||||
"selectDataset"
|
|
||||||
],
|
|
||||||
"showDescription": false,
|
|
||||||
"showDefaultValue": true
|
|
||||||
},
|
|
||||||
"required": true,
|
|
||||||
"value": ["pluginInput", "title"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"renderTypeList": ["reference"],
|
|
||||||
"valueType": "string",
|
|
||||||
"canEdit": true,
|
|
||||||
"key": "xAxis-plugin",
|
|
||||||
"label": "xAxis-plugin",
|
|
||||||
"customInputConfig": {
|
|
||||||
"selectValueTypeList": [
|
|
||||||
"string",
|
|
||||||
"number",
|
|
||||||
"boolean",
|
|
||||||
"object",
|
|
||||||
"arrayString",
|
|
||||||
"arrayNumber",
|
|
||||||
"arrayBoolean",
|
|
||||||
"arrayObject",
|
|
||||||
"arrayAny",
|
|
||||||
"any",
|
|
||||||
"chatHistory",
|
|
||||||
"datasetQuote",
|
|
||||||
"dynamic",
|
|
||||||
"selectApp",
|
|
||||||
"selectDataset"
|
|
||||||
],
|
|
||||||
"showDescription": false,
|
|
||||||
"showDefaultValue": true
|
|
||||||
},
|
|
||||||
"required": true,
|
|
||||||
"value": ["pluginInput", "xAxis"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"renderTypeList": ["reference"],
|
|
||||||
"valueType": "string",
|
|
||||||
"canEdit": true,
|
|
||||||
"key": "yAxis-plugin",
|
|
||||||
"label": "yAxis-plugin",
|
|
||||||
"customInputConfig": {
|
|
||||||
"selectValueTypeList": [
|
|
||||||
"string",
|
|
||||||
"number",
|
|
||||||
"boolean",
|
|
||||||
"object",
|
|
||||||
"arrayString",
|
|
||||||
"arrayNumber",
|
|
||||||
"arrayBoolean",
|
|
||||||
"arrayObject",
|
|
||||||
"arrayAny",
|
|
||||||
"any",
|
|
||||||
"chatHistory",
|
|
||||||
"datasetQuote",
|
|
||||||
"dynamic",
|
|
||||||
"selectApp",
|
|
||||||
"selectDataset"
|
|
||||||
],
|
|
||||||
"showDescription": false,
|
|
||||||
"showDefaultValue": true
|
|
||||||
},
|
|
||||||
"required": true,
|
|
||||||
"value": ["pluginInput", "yAxis"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"renderTypeList": ["reference"],
|
|
||||||
"valueType": "string",
|
|
||||||
"canEdit": true,
|
|
||||||
"key": "chartType-plugin",
|
|
||||||
"label": "chartType-plugin",
|
|
||||||
"customInputConfig": {
|
|
||||||
"selectValueTypeList": [
|
|
||||||
"string",
|
|
||||||
"number",
|
|
||||||
"boolean",
|
|
||||||
"object",
|
|
||||||
"arrayString",
|
|
||||||
"arrayNumber",
|
|
||||||
"arrayBoolean",
|
|
||||||
"arrayObject",
|
|
||||||
"arrayAny",
|
|
||||||
"any",
|
|
||||||
"chatHistory",
|
|
||||||
"datasetQuote",
|
|
||||||
"dynamic",
|
|
||||||
"selectApp",
|
|
||||||
"selectDataset"
|
|
||||||
],
|
|
||||||
"showDescription": false,
|
|
||||||
"showDefaultValue": true
|
|
||||||
},
|
|
||||||
"required": true,
|
|
||||||
"value": ["pluginInput", "chartType"]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"outputs": [
|
"outputs": [
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"version": "488",
|
"version": "488",
|
||||||
"name": "飞书 webhook",
|
"name": "飞书 webhook",
|
||||||
"avatar": "/appMarketTemplates/plugin-feishu/avatar.svg",
|
"avatar": "core/app/templates/plugin-feishu",
|
||||||
"intro": "向飞书机器人发起 webhook 请求。",
|
"intro": "向飞书机器人发起 webhook 请求。",
|
||||||
"courseUrl": "https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot#f62e72d5",
|
"courseUrl": "https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot#f62e72d5",
|
||||||
"showStatus": false,
|
"showStatus": false,
|
||||||
|
|||||||