Commit a48fd5ba by Archer Committed by GitHub

perf: dispatch chat;perf env (#7213)

* perf: dispatch chat

* perf: env

* doc
parent 4ee790db
...@@ -197,9 +197,13 @@ ${{vec.db}} ...@@ -197,9 +197,13 @@ ${{vec.db}}
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -208,25 +212,20 @@ ${{vec.db}} ...@@ -208,25 +212,20 @@ ${{vec.db}}
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: ${{fastgpt-code-sandbox.image}}:${{fastgpt-code-sandbox.tag}} image: ${{fastgpt-code-sandbox.image}}:${{fastgpt-code-sandbox.tag}}
......
...@@ -75,21 +75,18 @@ fastgpt-mcp-server: ...@@ -75,21 +75,18 @@ fastgpt-mcp-server:
- FASTGPT_ENDPOINT=http://fastgpt:3000 - FASTGPT_ENDPOINT=http://fastgpt:3000
``` ```
### Update FastGPT Configuration ### Update FastGPT Container Environment Variables
In your `config.json`, add: `"feconfigs.mcpServerProxyEndpoint": "<your fastgpt-mcp-server URL>"` (no trailing slash). For example: Configure `SSE_MCP_SERVER_PROXY_ENDPOINT` in the FastGPT container. Set it to the client-accessible `fastgpt-mcp-server` URL without a trailing `/`. For example:
```json ```yaml
{ environment:
"feConfigs": { SSE_MCP_SERVER_PROXY_ENDPOINT: https://mcp.fastgpt.cn
"mcpServerProxyEndpoint": "https://mcp.fastgpt.cn"
}
}
``` ```
### Restart FastGPT ### Restart FastGPT
Since you modified a mounted config file, force a full restart: Restart FastGPT after changing the environment variable:
```bash ```bash
docker-compose down docker-compose down
......
...@@ -77,19 +77,16 @@ fastgpt-mcp-server: ...@@ -77,19 +77,16 @@ fastgpt-mcp-server:
### 修改 FastGPT 容器环境变量 ### 修改 FastGPT 容器环境变量
修改 `config.json` 配置文件,增加: `"feconfigs.mcpServerProxyEndpoint": "fastgpt-mcp-server 的访问地址"`,末尾不要携带/,例如: 在 FastGPT 容器中配置 `SSE_MCP_SERVER_PROXY_ENDPOINT`,值为客户端可访问的 `fastgpt-mcp-server` 地址,末尾不要携带 `/`,例如:
```json ```yaml
{ environment:
"feConfigs": { SSE_MCP_SERVER_PROXY_ENDPOINT: https://mcp.fastgpt.cn
"mcpServerProxyEndpoint": "https://mcp.fastgpt.cn"
}
}
``` ```
### 重启 FastGPT 容器 ### 重启 FastGPT 容器
因为是修改的挂载文件,可以强制 down 再 up 服务。启动后,既可以在工作台看到 MCP server 服务选项。 修改环境变量后,需要重启 FastGPT 服务。启动后,可以在工作台看到 MCP server 服务选项。
```bash ```bash
docker-compose down docker-compose down
......
...@@ -9,7 +9,7 @@ description: 'FastGPT V4.15.0-beta7 Release Notes' ...@@ -9,7 +9,7 @@ description: 'FastGPT V4.15.0-beta7 Release Notes'
Only users who have deployed a FastGPT version earlier than `<4.8` need to run this step. Only users who have deployed a FastGPT version earlier than `<4.8` need to run this step.
Starting from V4.15.0-beta7, workflow save payloads use the V2 structure consistently. Historical `apps.modules` and `app_versions.nodes` records may still use the V1 structure. Run the V1 -> V2 migration first, then run the V2 dirty-data cleanup in the next step. Starting from V4.15.0-beta7, workflow save payloads use the V2 structure consistently. Historical `apps.modules` and `app_versions.nodes` records may still use the V1 structure. After upgrading, run the V1 -> V2 migration first, then run the V2 dirty-data cleanup in the next step.
Migration script path: `projects/app/src/pages/api/admin/dataClean/v1WorkflowToV2.ts`. This endpoint is only for this upgrade migration and is not a public OpenAPI endpoint. Migration script path: `projects/app/src/pages/api/admin/dataClean/v1WorkflowToV2.ts`. This endpoint is only for this upgrade migration and is not a public OpenAPI endpoint.
...@@ -40,8 +40,8 @@ Request parameters: ...@@ -40,8 +40,8 @@ Request parameters:
Migration behavior: Migration behavior:
1. Scans apps where `apps.version != 'v2'` and `type` is not `folder`, `httpPlugin`, or `toolFolder`. 1. Scans apps where `apps.version != 'v2'` and `type` is not `folder`, `httpPlugin`, or `toolFolder`.
2. For each batch of `apps`, converts and writes related `app_versions` first, then converts and writes `apps`, so a rerun will not miss historical versions after an interruption. 2. For each batch of `apps`, converts and writes related `app_versions` first, then converts and writes `apps`, so historical versions will not be missed if the migration is interrupted.
3. Converts V1 node fields to V2 fields, for example `moduleId` -> `nodeId` and `flowType` -> `flowNodeType`. 3. Converts V1 node fields to V2 node fields, such as `moduleId` -> `nodeId` and `flowType` -> `flowNodeType`.
4. Unknown node types fall back to `emptyNode`, and invalid `valueType` values are converted to `any`. 4. Unknown node types fall back to `emptyNode`, and invalid `valueType` values are converted to `any`.
5. Missing `node.name` falls back to `flowType`, and missing `input.label` falls back to `input.key`. 5. Missing `node.name` falls back to `flowType`, and missing `input.label` falls back to `input.key`.
6. Before writing, the script validates `nodes`, `edges`, and `chatConfig` with `PublishAppBodySchema`. Documents that fail validation are not written and are included in the endpoint response. 6. Before writing, the script validates `nodes`, `edges`, and `chatConfig` with `PublishAppBodySchema`. Documents that fail validation are not written and are included in the endpoint response.
...@@ -68,8 +68,6 @@ The correct stored values are: ...@@ -68,8 +68,6 @@ The correct stored values are:
This dirty data can affect workflow node input rendering and IO type checks. After running the V1 -> V2 migration, continue with the V2 cleanup script to scan and fix `apps.modules` and `app_versions.nodes`. This dirty data can affect workflow node input rendering and IO type checks. After running the V1 -> V2 migration, continue with the V2 cleanup script to scan and fix `apps.modules` and `app_versions.nodes`.
Migration script path: `projects/app/src/pages/api/admin/dataClean/initWorkflowData.ts`. This endpoint is only for this upgrade migration and is not a public OpenAPI endpoint.
The endpoint uses dry-run mode by default. It formats data in memory and validates with `PublishAppBodySchema` without writing to MongoDB: The endpoint uses dry-run mode by default. It formats data in memory and validates with `PublishAppBodySchema` without writing to MongoDB:
```bash ```bash
...@@ -93,7 +91,7 @@ Request parameters: ...@@ -93,7 +91,7 @@ Request parameters:
| Parameter | Type | Default | Description | | Parameter | Type | Default | Description |
| ---------------- | ------- | ------- | ------------------------------------------------------------------------------- | | ---------------- | ------- | ------- | ------------------------------------------------------------------------------- |
| `dryRun` | boolean | `true` | Whether to scan and validate only without writing changes. | | `dryRun` | boolean | `true` | Whether to scan and validate only without writing changes. |
| `batchSize` | number | `1000` | Documents fetched per page. | | `batchSize` | number | `1000` | Documents fetched per batch. |
| `writeBatchSize` | number | `10` | Documents written per `bulkWrite`. Lower it when online write pressure is high. | | `writeBatchSize` | number | `10` | Documents written per `bulkWrite`. Lower it when online write pressure is high. |
Cleanup behavior: Cleanup behavior:
...@@ -104,15 +102,14 @@ Cleanup behavior: ...@@ -104,15 +102,14 @@ Cleanup behavior:
4. Documents that fail Zod validation are only recorded in the response and are not written to MongoDB. 4. Documents that fail Zod validation are only recorded in the response and are not written to MongoDB.
5. In non-dry-run mode, only documents that changed during formatting and passed Zod validation are written. Unchanged documents are not written again. 5. In non-dry-run mode, only documents that changed during formatting and passed Zod validation are written. Unchanged documents are not written again.
The response includes separate statistics for `apps`, `appVersions`, and `total`, including scanned documents, fixable documents, Zod error count, successful writes, failed writes, enum expression statistics, format samples, and error samples. The response includes separate statistics for `apps`, `appVersions`, and `total`, including scanned documents, fixable documents, Zod error count, successful writes, failed writes, enum expression statistics, change samples, and error samples.
### 3. Update Images ### 3. Update Images
- Update the fastgpt-app (FastGPT main service) image tag to v4.15.0. See the [4.15.0 stable image tags](./41500.mdx) and update all images to the stable release.
- Update the fastgpt-pro (FastGPT commercial edition) image tag to v4.15.0.
## 🐛 Fixes ## 🐛 Fixes
1. Fixed historical V1 workflow data that could fail validation under the new save payload structure. 1. Fixed historical V1 workflow data that could fail validation under the new save payload structure.
2. Fixed dirty `FlowNodeInputTypeEnum.*`, `FlowNodeOutputTypeEnum.*`, and `WorkflowIOValueTypeEnum.*` expression strings in workflow nodes that could break input rendering and IO type checks. 2. Fixed dirty `FlowNodeInputTypeEnum.*`, `FlowNodeOutputTypeEnum.*`, and `WorkflowIOValueTypeEnum.*` expression strings in workflow node configuration that could break input rendering and IO type checks.
3. Fixed AgentV2 MCP not being able to retrieve schemas. 3. Fixed AgentV2 MCP not being able to retrieve schemas.
...@@ -5,6 +5,53 @@ description: 'FastGPT V4.15.0-beta7 更新说明' ...@@ -5,6 +5,53 @@ description: 'FastGPT V4.15.0-beta7 更新说明'
## 📦 升级指南 ## 📦 升级指南
### 1. 开源版 config.json 配置移除
`config.json` 配置文件移除,全部改成环境变量,环境变量为:
```dotenv
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址(末尾不要带 /)
SSE_MCP_SERVER_PROXY_ENDPOINT=http://localhost:3003
# ==================== PDF 增强解析(可选) ====================
# 自定义 PDF 解析服务地址
# CUSTOM_PDF_PARSE_URL=
# 自定义 PDF 解析服务密钥
# CUSTOM_PDF_PARSE_KEY=
# Doc2x PDF 解析服务密钥
# DOC2X_KEY=
# 合合信息 Textin 服务 App ID
# TEXTIN_APP_ID=
# 合合信息 Textin 服务 Secret Code
# TEXTIN_SECRET_CODE=
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH=100
# 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES=100000
# ==================== 知识库处理并发控制 ====================
# 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS=10
# 向量训练队列最大并发数
VECTOR_MAX_PROCESS=10
# 问答拆分队列最大并发数
QA_MAX_PROCESS=10
# 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS=10
```
### 2. 商业版补充 SSE Mcp Endpoint
该配置从 admin 里移除,需要在 `fastgpt` 服务里增加环境变量:
```dotenv
SSE_MCP_SERVER_PROXY_ENDPOINT=http://localhost:3003
```
### 3. 更新镜像
参考 [4.15.0 正式版镜像](./41500.mdx),全部镜像升级为正式版。
### 1. 执行工作流 V1 升级 V2 迁移(可选) ### 1. 执行工作流 V1 升级 V2 迁移(可选)
该步骤仅需部署过 `<4.8` 版本 FastGPT 的用户执行。 该步骤仅需部署过 `<4.8` 版本 FastGPT 的用户执行。
...@@ -68,8 +115,6 @@ curl -X POST 'https://你的域名/api/admin/dataClean/v1WorkflowToV2' \ ...@@ -68,8 +115,6 @@ curl -X POST 'https://你的域名/api/admin/dataClean/v1WorkflowToV2' \
该脏数据会影响工作流节点输入渲染和 IO 类型判断。执行 V1 -> V2 迁移后,继续执行 V2 清洗脚本,扫描并修复 `apps.modules` 与 `app_versions.nodes`。 该脏数据会影响工作流节点输入渲染和 IO 类型判断。执行 V1 -> V2 迁移后,继续执行 V2 清洗脚本,扫描并修复 `apps.modules` 与 `app_versions.nodes`。
迁移脚本位置:`projects/app/src/pages/api/admin/dataClean/initWorkflowData.ts`。该接口仅用于本次升级迁移,不作为 OpenAPI 对外接口。
接口默认 dry-run,只格式化内存数据并执行 `PublishAppBodySchema` 校验,不写库: 接口默认 dry-run,只格式化内存数据并执行 `PublishAppBodySchema` 校验,不写库:
```bash ```bash
...@@ -106,11 +151,6 @@ curl -X POST 'https://你的域名/api/admin/dataClean/initWorkflowData' \ ...@@ -106,11 +151,6 @@ curl -X POST 'https://你的域名/api/admin/dataClean/initWorkflowData' \
返回结果会分别展示 `apps`、`appVersions` 和 `total` 的统计,包括扫描文档数、可修复文档数、Zod 错误数量、写入成功数量、写入失败数量、枚举表达式统计、变更样本和错误样本。 返回结果会分别展示 `apps`、`appVersions` 和 `total` 的统计,包括扫描文档数、可修复文档数、Zod 错误数量、写入成功数量、写入失败数量、枚举表达式统计、变更样本和错误样本。
### 3. 更新镜像
- 更新 fastgpt-app(fastgpt 主服务) 镜像 tag: v4.15.0
- 更新 fastgpt-pro(fastgpt 商业版) 镜像 tag: v4.15.0
## 🐛 修复 ## 🐛 修复
1. 修复历史 V1 工作流数据在新版保存结构下无法通过校验的问题。 1. 修复历史 V1 工作流数据在新版保存结构下无法通过校验的问题。
......
...@@ -9,7 +9,7 @@ description: FastGPT V4.9.6 更新说明 ...@@ -9,7 +9,7 @@ description: FastGPT V4.9.6 更新说明
2. 支持以 MCP SSE 协议创建工具。 2. 支持以 MCP SSE 协议创建工具。
3. 批量执行节点支持交互节点,可实现每一轮循环都人工参与。 3. 批量执行节点支持交互节点,可实现每一轮循环都人工参与。
4. 增加工作台二级菜单,合并工具箱。 4. 增加工作台二级菜单,合并工具箱。
5. 增加 grok3、GPT4.1、o系列、Gemini2.5 模型系统配置。 5. 增加 grok3、GPT4.1、o 系列、Gemini2.5 模型系统配置。
## ⚙️ 优化 ## ⚙️ 优化
...@@ -17,7 +17,7 @@ description: FastGPT V4.9.6 更新说明 ...@@ -17,7 +17,7 @@ description: FastGPT V4.9.6 更新说明
2. Python sandbox 代码,支持大数据输入。 2. Python sandbox 代码,支持大数据输入。
3. 路径组件支持配置最后一步是否可点击。 3. 路径组件支持配置最后一步是否可点击。
4. 知识库工具调用结果,自动补充图片域名。 4. 知识库工具调用结果,自动补充图片域名。
5. Github action runner 升级成 unbuntu24 5. GitHub action runner 升级成 unbuntu24
6. 去除飞书、公众号等三方渠道,回复时,可能前后多一个换行的问题。 6. 去除飞书、公众号等三方渠道,回复时,可能前后多一个换行的问题。
7. 调整分块策略,大表格时,不进行超大块合并,而是独立拆块。 7. 调整分块策略,大表格时,不进行超大块合并,而是独立拆块。
8. Iframe 嵌套组件,内置允许麦克风声明。 8. Iframe 嵌套组件,内置允许麦克风声明。
...@@ -36,7 +36,7 @@ description: FastGPT V4.9.6 更新说明 ...@@ -36,7 +36,7 @@ description: FastGPT V4.9.6 更新说明
#### Docker 部署 #### Docker 部署
在`docker-compose.yml`文件中,加入`fastgpt-mcp-server`服务: 在 `docker-compose.yml` 文件中,加入 `fastgpt-mcp-server` 服务:
```yml ```yml
fastgpt-mcp-server: fastgpt-mcp-server:
...@@ -53,13 +53,13 @@ fastgpt-mcp-server: ...@@ -53,13 +53,13 @@ fastgpt-mcp-server:
#### Sealos 部署 #### Sealos 部署
直接在`应用管理`中,增加一个`fastgpt-mcp-server`应用,镜像为`ghcr.io/labring/fastgpt-mcp_server:v4.9.6`,并设置环境变量`FASTGPT_ENDPOINT=fastgpt 的访问地址`。 直接在 `应用管理` 中,增加一个 `fastgpt-mcp-server` 应用,镜像为 `ghcr.io/labring/fastgpt-mcp_server:v4.9.6`,并设置环境变量 `FASTGPT_ENDPOINT=fastgpt 的访问地址`。
### 3. 修改 FastGPT 容器环境变量 ### 3. 修改 FastGPT 容器环境变量
#### 社区版 #### 社区版
修改`config.json`配置文件,增加: `"feconfigs.mcpServerProxyEndpoint": "fastgpt-mcp-server 的访问地址"`, 末尾不要携带/,例如: 修改 `config.json` 配置文件,增加: `"feconfigs.mcpServerProxyEndpoint": "fastgpt-mcp-server 的访问地址"`,末尾不要携带/,例如:
```json ```json
{ {
...@@ -72,7 +72,7 @@ fastgpt-mcp-server: ...@@ -72,7 +72,7 @@ fastgpt-mcp-server:
#### 商业版 #### 商业版
在 Admin 后台,`系统配置-基础配置-系统参数`中的`MCP 转发服务地址`中,设置`fastgpt-mcp-server`的公网访问地址。 在 Admin 后台,`系统配置-基础配置-系统参数` 中的 `MCP 转发服务地址` 中,设置 `fastgpt-mcp-server` 的公网访问地址。
### 4. 更新镜像 tag ### 4. 更新镜像 tag
......
...@@ -33,8 +33,8 @@ ...@@ -33,8 +33,8 @@
"content/guide/build/publish/feishu.mdx": "2026-05-07T15:06:40+08:00", "content/guide/build/publish/feishu.mdx": "2026-05-07T15:06:40+08:00",
"content/guide/build/publish/link.en.mdx": "2026-06-22T11:01:59+08:00", "content/guide/build/publish/link.en.mdx": "2026-06-22T11:01:59+08:00",
"content/guide/build/publish/link.mdx": "2026-06-22T11:01:59+08:00", "content/guide/build/publish/link.mdx": "2026-06-22T11:01:59+08:00",
"content/guide/build/publish/mcp_server.en.mdx": "2026-06-22T11:01:59+08:00", "content/guide/build/publish/mcp_server.en.mdx": "2026-06-30T11:22:17+08:00",
"content/guide/build/publish/mcp_server.mdx": "2026-06-22T11:01:59+08:00", "content/guide/build/publish/mcp_server.mdx": "2026-06-30T11:22:17+08:00",
"content/guide/build/publish/official_account.en.mdx": "2026-05-07T15:06:40+08:00", "content/guide/build/publish/official_account.en.mdx": "2026-05-07T15:06:40+08:00",
"content/guide/build/publish/official_account.mdx": "2026-05-07T15:06:40+08:00", "content/guide/build/publish/official_account.mdx": "2026-05-07T15:06:40+08:00",
"content/guide/build/publish/openapi.en.mdx": "2026-06-23T13:54:06+08:00", "content/guide/build/publish/openapi.en.mdx": "2026-06-23T13:54:06+08:00",
...@@ -306,8 +306,8 @@ ...@@ -306,8 +306,8 @@
"content/self-host/upgrading/4-15/41505.mdx": "2026-06-29T10:45:58+08:00", "content/self-host/upgrading/4-15/41505.mdx": "2026-06-29T10:45:58+08:00",
"content/self-host/upgrading/4-15/41506.en.mdx": "2026-06-29T00:47:43+08:00", "content/self-host/upgrading/4-15/41506.en.mdx": "2026-06-29T00:47:43+08:00",
"content/self-host/upgrading/4-15/41506.mdx": "2026-06-29T00:47:43+08:00", "content/self-host/upgrading/4-15/41506.mdx": "2026-06-29T00:47:43+08:00",
"content/self-host/upgrading/4-15/41507.en.mdx": "2026-06-29T23:38:28+08:00", "content/self-host/upgrading/4-15/41507.en.mdx": "2026-06-30T10:50:36+08:00",
"content/self-host/upgrading/4-15/41507.mdx": "2026-06-29T23:38:28+08:00", "content/self-host/upgrading/4-15/41507.mdx": "2026-06-30T11:22:17+08:00",
"content/self-host/upgrading/outdated/40.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/40.en.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/40.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/40.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/41.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/41.en.mdx": "2026-04-26T21:08:47+08:00",
...@@ -438,8 +438,8 @@ ...@@ -438,8 +438,8 @@
"content/self-host/upgrading/outdated/494.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/494.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/495.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/495.en.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/495.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/495.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/496.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/496.en.mdx": "2026-06-30T11:22:17+08:00",
"content/self-host/upgrading/outdated/496.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/496.mdx": "2026-06-30T11:22:17+08:00",
"content/self-host/upgrading/outdated/497.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/497.en.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/497.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/497.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/498.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/498.en.mdx": "2026-04-26T21:08:47+08:00",
......
...@@ -254,9 +254,13 @@ services: ...@@ -254,9 +254,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -265,25 +269,20 @@ services: ...@@ -265,25 +269,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1 image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -232,9 +232,13 @@ services: ...@@ -232,9 +232,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -243,25 +247,20 @@ services: ...@@ -243,25 +247,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1 image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -216,9 +216,13 @@ services: ...@@ -216,9 +216,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -227,25 +231,20 @@ services: ...@@ -227,25 +231,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1 image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -214,9 +214,13 @@ services: ...@@ -214,9 +214,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -225,25 +229,20 @@ services: ...@@ -225,25 +229,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1 image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -219,9 +219,13 @@ services: ...@@ -219,9 +219,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -230,25 +234,20 @@ services: ...@@ -230,25 +234,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1 image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -198,9 +198,13 @@ services: ...@@ -198,9 +198,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -209,25 +213,20 @@ services: ...@@ -209,25 +213,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1 image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -254,9 +254,13 @@ services: ...@@ -254,9 +254,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -265,25 +269,20 @@ services: ...@@ -265,25 +269,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1 image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -232,9 +232,13 @@ services: ...@@ -232,9 +232,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -243,25 +247,20 @@ services: ...@@ -243,25 +247,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1 image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -216,9 +216,13 @@ services: ...@@ -216,9 +216,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -227,25 +231,20 @@ services: ...@@ -227,25 +231,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1 image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -214,9 +214,13 @@ services: ...@@ -214,9 +214,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -225,25 +229,20 @@ services: ...@@ -225,25 +229,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1 image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -219,9 +219,13 @@ services: ...@@ -219,9 +219,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -230,25 +234,20 @@ services: ...@@ -230,25 +234,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1 image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -198,9 +198,13 @@ services: ...@@ -198,9 +198,13 @@ services:
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
AIPROXY_API_TOKEN: *x-aiproxy-token AIPROXY_API_TOKEN: *x-aiproxy-token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址 # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址
MCP_SERVER_PROXY_ENDPOINT: SSE_MCP_SERVER_PROXY_ENDPOINT:
# ==================== 原 config.json systemEnv 配置 ==================== # ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# 知识库文件解析队列最大并发数 # 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS: 10 DATASET_PARSE_MAX_PROCESS: 10
# 向量训练队列最大并发数 # 向量训练队列最大并发数
...@@ -209,25 +213,20 @@ services: ...@@ -209,25 +213,20 @@ services:
QA_MAX_PROCESS: 10 QA_MAX_PROCESS: 10
# 图片理解模型处理队列最大并发数 # 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS: 10 VLM_MAX_PROCESS: 10
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效 # 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH: 100 HNSW_EF_SEARCH: 100
# 向量检索最大扫描数据量,仅对 PG 生效 # 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES: 100000 HNSW_MAX_SCAN_TUPLES: 100000
# 自定义 PDF 解析服务配置 # 自定义 PDF 解析服务配置
CUSTOM_PDF_PARSE_URL: CUSTOM_PDF_PARSE_URL:
CUSTOM_PDF_PARSE_KEY: CUSTOM_PDF_PARSE_KEY:
# Doc2x
DOC2X_KEY: DOC2X_KEY:
# 合合信息
TEXTIN_APP_ID: TEXTIN_APP_ID:
TEXTIN_SECRET_CODE: TEXTIN_SECRET_CODE:
CUSTOM_PDF_PARSE_PRICE: 0
# 文件 URL 白名单,逗号或空白分隔
FILE_URL_WHITELIST:
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: false
# ==================== 日志与监控 ====================
# 传递给 OTLP 收集器的服务名称
LOG_OTEL_SERVICE_NAME: fastgpt-client
fastgpt-code-sandbox: fastgpt-code-sandbox:
container_name: fastgpt-code-sandbox container_name: fastgpt-code-sandbox
image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1 image: ghcr.io/labring/fastgpt-code-sandbox:v4.15.0-beta1
......
...@@ -359,6 +359,7 @@ if [ -n "$MCP_ADDR" ]; then ...@@ -359,6 +359,7 @@ if [ -n "$MCP_ADDR" ]; then
fi fi
if $USES_CONFIG_JSON; then if $USES_CONFIG_JSON; then
# 旧版本 compose 挂载 config.json,只能继续写旧字段;main 已迁移到环境变量。
if [[ "$OSTYPE" == "darwin"* ]]; then if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "s|\"mcpServerProxyEndpoint\": \"\"|\"mcpServerProxyEndpoint\": \"$MCP_ENDPOINT\"|g" config.json sed -i '' "s|\"mcpServerProxyEndpoint\": \"\"|\"mcpServerProxyEndpoint\": \"$MCP_ENDPOINT\"|g" config.json
else else
...@@ -366,19 +367,27 @@ if [ -n "$MCP_ADDR" ]; then ...@@ -366,19 +367,27 @@ if [ -n "$MCP_ADDR" ]; then
fi fi
else else
if [[ "$OSTYPE" == "darwin"* ]]; then if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "s|^ MCP_SERVER_PROXY_ENDPOINT:.*| MCP_SERVER_PROXY_ENDPOINT: $MCP_ENDPOINT|g" docker-compose.yml sed -i '' "s|^ SSE_MCP_SERVER_PROXY_ENDPOINT:.*| SSE_MCP_SERVER_PROXY_ENDPOINT: $MCP_ENDPOINT|g" docker-compose.yml
else else
sed -i "s|^ MCP_SERVER_PROXY_ENDPOINT:.*| MCP_SERVER_PROXY_ENDPOINT: $MCP_ENDPOINT|g" docker-compose.yml sed -i "s|^ SSE_MCP_SERVER_PROXY_ENDPOINT:.*| SSE_MCP_SERVER_PROXY_ENDPOINT: $MCP_ENDPOINT|g" docker-compose.yml
fi fi
fi fi
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo "已更新 MCP 访问地址为: $MCP_ENDPOINT" echo "已更新 MCP 访问地址为: $MCP_ENDPOINT"
else else
echo "警告: 替换 MCP 地址失败,请手动编辑 docker-compose.yml 中的 MCP_SERVER_PROXY_ENDPOINT 或 config.json 中的 mcpServerProxyEndpoint" if $USES_CONFIG_JSON; then
echo "警告: 替换 MCP 地址失败,请手动编辑旧版 config.json 中的 mcpServerProxyEndpoint"
else
echo "警告: 替换 MCP 地址失败,请手动编辑 docker-compose.yml 中的 SSE_MCP_SERVER_PROXY_ENDPOINT"
fi
fi fi
else else
echo "警告: 未设置 MCP 地址,请手动编辑 docker-compose.yml 中的 MCP_SERVER_PROXY_ENDPOINT 或 config.json 中的 mcpServerProxyEndpoint" if $USES_CONFIG_JSON; then
echo "警告: 未设置 MCP 地址,请手动编辑旧版 config.json 中的 mcpServerProxyEndpoint"
else
echo "警告: 未设置 MCP 地址,请手动编辑 docker-compose.yml 中的 SSE_MCP_SERVER_PROXY_ENDPOINT"
fi
fi fi
if [ "$DEPLOY_VERSION" != "main" ]; then if [ "$DEPLOY_VERSION" != "main" ]; then
......
...@@ -47,7 +47,12 @@ export type FastGPTFeConfigsType = { ...@@ -47,7 +47,12 @@ export type FastGPTFeConfigsType = {
find_password_method?: ['email' | 'phone']; find_password_method?: ['email' | 'phone'];
bind_notification_method?: ['email' | 'phone']; bind_notification_method?: ['email' | 'phone'];
googleClientVerKey?: string; googleClientVerKey?: string;
/**
* @deprecated MCP SSE 代理地址已迁移到环境变量 SSE_MCP_SERVER_PROXY_ENDPOINT。
* 运行时配置以环境变量为准,admin 不再支持写入该字段。
*/
mcpServerProxyEndpoint?: string; mcpServerProxyEndpoint?: string;
chineseRedirectUrl?: string; chineseRedirectUrl?: string;
botIframeUrl?: string; botIframeUrl?: string;
......
import { filterGPTMessageByMaxContext } from '../../../../ai/llm/utils';
import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants';
import {
chats2GPTMessages,
getSystemPrompt_ChatItemType,
runtimePrompt2ChatsValue
} from '@fastgpt/global/core/chat/adapt';
import type { ChatItemMiniType, UserChatItemFileItemType } from '@fastgpt/global/core/chat/type';
import type { LLMModelItemType } from '@fastgpt/global/core/ai/model.schema';
import type { ChatDispatchProps } from '@fastgpt/global/core/workflow/runtime/type';
import { parseFileContentFromUrls } from '../../../utils/file';
import { rewriteChatMessagesWithFiles } from './fileContext';
/**
* 组装系统提示、历史、当前输入和文件上下文,并按模型上下文限制裁剪为 LLM 消息。
*/
export const getChatMessages = async ({
model,
maxTokens = 0,
histories = [],
datasetCiteSystemPrompt,
systemPrompt,
userChatInput,
userFiles,
parseHistoryFiles,
requestOrigin,
maxFiles,
customPdfParse,
usageId,
runningUserInfo
}: {
model: LLMModelItemType;
maxTokens?: number;
histories: ChatItemMiniType[];
datasetCiteSystemPrompt?: string;
systemPrompt: string;
userChatInput: string;
userFiles: UserChatItemFileItemType[];
parseHistoryFiles: boolean;
requestOrigin?: string;
maxFiles: number;
customPdfParse?: boolean;
usageId?: string;
runningUserInfo: ChatDispatchProps['runningUserInfo'];
}) => {
const concatenateSystemPrompt = [
model.defaultSystemChatPrompt,
systemPrompt,
datasetCiteSystemPrompt
]
.filter(Boolean)
.join('\n\n===---===---===\n\n');
const rawUserMessages: ChatItemMiniType[] = [
...getSystemPrompt_ChatItemType(concatenateSystemPrompt),
...histories,
{
obj: ChatRoleEnum.Human,
value: runtimePrompt2ChatsValue({
files: userFiles,
text: userChatInput
})
}
];
const messages = await rewriteChatMessagesWithFiles({
messages: rawUserMessages,
parseHistoryFiles,
parseFileFn: async (urls) => {
const files = await parseFileContentFromUrls({
urls,
requestOrigin,
maxFiles,
teamId: runningUserInfo.teamId,
tmbId: runningUserInfo.tmbId,
customPdfParse,
usageId
});
return files.map((file) => ({
name: file.name,
url: file.url,
content: file.content
}));
}
});
const adaptMessages = chats2GPTMessages({
messages,
reserveId: false
});
return await filterGPTMessageByMaxContext({
messages: adaptMessages,
maxContext: model.maxContext - maxTokens // filter token. not response maxToken
});
};
import { formatTime2YMDHM } from '@fastgpt/global/common/string/time';
import { getQuotePrompt } from '@fastgpt/global/core/ai/prompt/AIChat';
import type { LLMModelItemType } from '@fastgpt/global/core/ai/model.schema';
import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type';
import type { AiChatQuoteRoleType } from '@fastgpt/global/core/workflow/template/system/aiChat/type';
import { replaceVariable } from '../../../../../common/string/replaceVariable';
import { filterSearchResultsByMaxChars } from '../../../utils';
import type { ChatProps } from './type';
/**
* 根据知识库引用配置生成用户问题和系统提示中的引用上下文。
*/
export const getDatasetCiteData = async ({
quoteQA = [],
model,
quoteTemplate,
aiChatQuoteRole,
datasetQuotePrompt = '',
userChatInput,
version,
useDatasetQuote
}: {
quoteQA: ChatProps['params']['quoteQA'];
model: LLMModelItemType;
quoteTemplate: string;
userChatInput: string;
aiChatQuoteRole: AiChatQuoteRoleType;
datasetQuotePrompt?: string;
version?: string;
useDatasetQuote: boolean;
}) => {
const getValue = ({ item, index }: { item: SearchDataResponseItemType; index: number }) => {
return replaceVariable(quoteTemplate, {
id: item.id,
q: item.q,
a: item.a || '',
updateTime: formatTime2YMDHM(item.updateTime),
source: item.sourceName,
sourceId: String(item.sourceId || ''),
index: index + 1
});
};
// 按模型引用上限裁剪知识库引用,避免引用内容挤占对话上下文。
const filterQuoteQA = await filterSearchResultsByMaxChars(quoteQA, model.quoteMaxToken);
const datasetQuoteText =
filterQuoteQA.length > 0
? `${filterQuoteQA.map((item, index) => getValue({ item, index }).trim()).join('\n------\n')}`
: '';
// Prompt 显式包含问题时必须放到 user role,避免 system prompt 无法承载用户问题变量。
const quoteRole =
aiChatQuoteRole === 'user' || datasetQuotePrompt.includes('{{question}}') ? 'user' : 'system';
const defaultQuotePrompt = getQuotePrompt(version, quoteRole);
const datasetQuotePromptTemplate = datasetQuotePrompt || defaultQuotePrompt;
const replaceInputValue =
useDatasetQuote && quoteRole === 'user'
? replaceVariable(datasetQuotePromptTemplate, {
quote: datasetQuoteText,
question: userChatInput
})
: userChatInput;
const systemPrompt =
useDatasetQuote && quoteRole === 'system'
? replaceVariable(datasetQuotePromptTemplate, {
quote: datasetQuoteText
})
: '';
return {
userInput: replaceInputValue,
systemPrompt
};
};
import { i18nT } from '@fastgpt/global/common/i18n/utils';
import { getQuoteTemplate } from '@fastgpt/global/core/ai/prompt/AIChat';
import { GPTMessages2Chats } from '@fastgpt/global/core/chat/adapt';
import { getHistoryPreview } from '@fastgpt/global/core/chat/utils';
import {
DispatchNodeResponseKeyEnum,
SseResponseEventEnum
} from '@fastgpt/global/core/workflow/runtime/constants';
import { textAdaptGptResponse } from '@fastgpt/global/core/workflow/runtime/utils';
import { getLLMModel } from '../../../../ai/model';
import { createLLMResponse } from '../../../../ai/llm/request';
import { computedMaxToken } from '../../../../ai/utils';
import { postTextCensor } from '../../../../chat/postTextCensor';
import { formatModelChars2Points } from '../../../../../support/wallet/usage/utils';
import { checkQuoteQAValue, getHistories, getNodeErrResponse } from '../../utils';
import { getChatMessages } from './chatMessages';
import { getDatasetCiteData } from './datasetCite';
import { getAIChatFileContextConfig, getInputFiles } from './fileContext';
import type { ChatProps, ChatResponse } from './type';
/**
* 调度 AI Chat 节点:整理引用、历史和文件上下文,调用 LLM,并写入节点响应与用量。
*/
export const dispatchChatCompletion = async (props: ChatProps): Promise<ChatResponse> => {
const {
checkIsStopping,
requestOrigin,
stream = false,
retainDatasetCite = true,
externalProvider,
histories,
node: { name, version, inputs },
runningUserInfo,
workflowStreamResponse,
chatConfig,
usageId,
params: {
model,
temperature,
maxToken,
history = 6,
userChatInput: rawUserChatInput = '',
isResponseAnswerText = true,
systemPrompt = '',
aiChatQuoteRole = 'system',
quoteTemplate,
quotePrompt,
aiChatReasoning = true,
aiChatReasoningEffort,
aiChatTopP,
aiChatStopSign,
aiChatResponseFormat,
aiChatJsonSchema,
quoteQA: rawQuoteQA,
aiChatVision: rawAiChatVision,
aiChatAudio: rawAiChatAudio,
aiChatVideo: rawAiChatVideo,
aiChatExtractFiles,
fileUrlList: rawFileLinks // node quote file links
}
} = props;
let quoteQA = rawQuoteQA;
let aiChatVision = rawAiChatVision;
let aiChatAudio = rawAiChatAudio;
let aiChatVideo = rawAiChatVideo;
let fileLinks = rawFileLinks;
let userChatInput = rawUserChatInput;
const modelConstantsData = getLLMModel(model);
if (!modelConstantsData) {
return getNodeErrResponse({
error: `Model ${model} is undefined, you need to select a chat model.`
});
}
try {
aiChatVision = modelConstantsData.vision && aiChatVision;
aiChatAudio = modelConstantsData.audio && aiChatAudio;
aiChatVideo = modelConstantsData.video && aiChatVideo;
const fileContextConfig = getAIChatFileContextConfig({ inputs, rawFileLinks });
fileLinks = fileContextConfig.fileLinks;
const chatHistories = getHistories(history, histories);
quoteQA = checkQuoteQAValue(quoteQA);
const [datasetCiteData, userFiles] = await Promise.all([
getDatasetCiteData({
quoteQA,
model: modelConstantsData,
quoteTemplate: quoteTemplate || getQuoteTemplate(version),
aiChatQuoteRole,
datasetQuotePrompt: quotePrompt,
userChatInput,
version,
useDatasetQuote: quoteQA !== undefined
}),
getInputFiles({
fileLinks
})
]);
userChatInput = datasetCiteData.userInput;
if (!userChatInput && userFiles.length === 0) {
return getNodeErrResponse({ error: i18nT('chat:AI_input_is_empty') });
}
const max_tokens = computedMaxToken({
model: modelConstantsData,
maxToken
});
const [filterMessages] = await Promise.all([
getChatMessages({
model: modelConstantsData,
maxTokens: max_tokens,
histories: chatHistories,
datasetCiteSystemPrompt: datasetCiteData.systemPrompt,
systemPrompt,
userChatInput,
userFiles,
parseHistoryFiles: fileContextConfig.parseHistoryFiles,
requestOrigin,
maxFiles: chatConfig?.fileSelectConfig?.maxFiles || 20,
customPdfParse: chatConfig?.fileSelectConfig?.customPdfParse,
usageId,
runningUserInfo
}),
(() => {
if (modelConstantsData.censor && !externalProvider.openaiAccount?.key) {
return postTextCensor({
text: `${systemPrompt}
${userChatInput}
`
});
}
})()
]);
const {
completeMessages,
reasoningText,
answerText,
finish_reason,
responseEmptyTip,
usage,
error,
requestId // 获取请求追踪 ID
} = await createLLMResponse({
throwError: false,
body: {
model: modelConstantsData.model,
stream,
messages: filterMessages,
temperature,
max_tokens,
top_p: aiChatTopP,
stop: aiChatStopSign,
reasoning_effort: aiChatReasoningEffort,
response_format: {
type: aiChatResponseFormat,
json_schema: aiChatJsonSchema
},
retainDatasetCite,
useVision: aiChatVision,
useAudio: aiChatAudio,
useVideo: aiChatVideo,
extractFiles: aiChatExtractFiles,
requestOrigin
},
userKey: externalProvider.openaiAccount,
teamId: runningUserInfo.teamId,
isAborted: checkIsStopping,
onReasoning({ text }) {
if (!aiChatReasoning) return;
workflowStreamResponse?.({
event: SseResponseEventEnum.answer,
data: textAdaptGptResponse({
reasoning_content: text
})
});
},
onStreaming({ text }) {
if (!isResponseAnswerText) return;
workflowStreamResponse?.({
event: SseResponseEventEnum.answer,
data: textAdaptGptResponse({
text
})
});
}
});
if (responseEmptyTip) {
return getNodeErrResponse({ error: responseEmptyTip });
}
const { totalPoints, modelName } = formatModelChars2Points({
model: modelConstantsData.model,
inputTokens: usage.inputTokens,
outputTokens: usage.outputTokens
});
const points = usage.usedUserOpenAIKey ? 0 : totalPoints;
props.usagePush([
{
moduleName: name,
totalPoints: points,
model: modelName,
inputTokens: usage.inputTokens,
outputTokens: usage.outputTokens
}
]);
const chatCompleteMessages = GPTMessages2Chats({ messages: completeMessages });
if (error) {
return getNodeErrResponse({
error,
responseData: {
totalPoints: points,
model: modelName,
inputTokens: usage.inputTokens,
outputTokens: usage.outputTokens,
query: `${userChatInput}`,
maxToken: max_tokens,
reasoningText,
historyPreview: getHistoryPreview(chatCompleteMessages, 10000, aiChatVision),
contextTotalLen: completeMessages.length,
finishReason: finish_reason,
llmRequestIds: [requestId] // 记录 LLM 请求追踪 ID
}
});
}
return {
data: {
answerText: answerText,
reasoningText,
history: chatCompleteMessages
},
[DispatchNodeResponseKeyEnum.answerText]: isResponseAnswerText ? answerText : undefined,
[DispatchNodeResponseKeyEnum.reasoningText]: aiChatReasoning ? reasoningText : undefined,
[DispatchNodeResponseKeyEnum.nodeResponse]: {
totalPoints: points,
model: modelName,
inputTokens: usage.inputTokens,
outputTokens: usage.outputTokens,
query: `${userChatInput}`,
maxToken: max_tokens,
reasoningText,
historyPreview: getHistoryPreview(chatCompleteMessages, 10000, aiChatVision),
contextTotalLen: completeMessages.length,
finishReason: finish_reason,
llmRequestIds: [requestId] // 记录 LLM 请求追踪 ID
},
[DispatchNodeResponseKeyEnum.toolResponse]: answerText
};
} catch (error) {
return getNodeErrResponse({ error });
}
};
import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants';
import type { ChatItemMiniType, UserChatItemFileItemType } from '@fastgpt/global/core/chat/type';
import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants';
import type { FlowNodeInputItemType } from '@fastgpt/global/core/workflow/type/io';
import { parseUrlToFileType } from '../../../utils/context';
import { formatUserQueryWithFiles } from '../../../utils/file';
import type { ChatMessageFileParser } from './type';
/**
* 根据 AI Chat 节点的文件链接输入计算文件上下文开关。
*
* `fileUrlList` 的绑定状态同时控制当前显式文件输入和历史文件解析,避免节点未绑定
* 文件链接时从聊天记录中恢复旧文件。
*/
export const getAIChatFileContextConfig = ({
inputs,
rawFileLinks
}: {
inputs: FlowNodeInputItemType[];
rawFileLinks?: string[];
}) => {
const fileUrlInput = inputs.find((item) => item.key === NodeInputKeyEnum.fileUrlList);
const hasFileUrlInput = !!fileUrlInput?.value?.length;
return {
fileLinks: hasFileUrlInput ? rawFileLinks : undefined,
parseHistoryFiles: hasFileUrlInput
};
};
/**
* 在发送给 LLM 前把 Human 消息里的普通文件解析为文本。
*
* 当前轮 Human 消息始终允许根据已归一化的 `fileLinks` 解析;历史 Human 消息只有在
* 节点显式绑定文件链接输入时才解析。未绑定时会移除历史 Human 的 file item,避免后续
* 适配层继续从历史中生成 `file_url` / `image_url`。
*/
export const rewriteChatMessagesWithFiles = async ({
messages,
parseHistoryFiles,
parseFileFn
}: {
messages: ChatItemMiniType[];
parseHistoryFiles: boolean;
parseFileFn: ChatMessageFileParser;
}) => {
return Promise.all(
messages.map(async (message, index): Promise<ChatItemMiniType> => {
if (message.obj !== ChatRoleEnum.Human) {
return message;
}
const isCurrentUserMessage = index === messages.length - 1;
if (!isCurrentUserMessage && !parseHistoryFiles) {
return {
...message,
value: message.value.filter((item) => !item.file)
};
}
const query = await formatUserQueryWithFiles({
userQuery: message.value,
parseFileFn
});
return {
...message,
value: query
};
})
);
};
/**
* 把节点输入的文件链接转换成聊天消息文件结构;无法识别的链接会被过滤。
*/
export const getInputFiles = ({ fileLinks = [] }: { fileLinks?: string[] }) => {
return fileLinks
.map((url) => parseUrlToFileType(url))
.filter((file): file is UserChatItemFileItemType => Boolean(file));
};
export { dispatchChatCompletion } from './dispatchChatCompletion';
export { getAIChatFileContextConfig, rewriteChatMessagesWithFiles } from './fileContext';
export type { ChatMessageFileParser, ChatProps, ChatResponse } from './type';
import type { ChatItemMiniType } from '@fastgpt/global/core/chat/type';
import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type';
import type { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants';
import type { NodeOutputKeyEnum } from '@fastgpt/global/core/workflow/constants';
import type {
AIChatNodeProps,
DispatchNodeResultType,
ModuleDispatchProps
} from '@fastgpt/global/core/workflow/runtime/type';
export type ChatProps = ModuleDispatchProps<
AIChatNodeProps & {
[NodeInputKeyEnum.userChatInput]?: string;
[NodeInputKeyEnum.history]?: ChatItemMiniType[] | number;
[NodeInputKeyEnum.aiChatDatasetQuote]?: SearchDataResponseItemType[];
}
>;
export type ChatResponse = DispatchNodeResultType<
{
[NodeOutputKeyEnum.answerText]: string;
[NodeOutputKeyEnum.reasoningText]?: string;
[NodeOutputKeyEnum.history]: ChatItemMiniType[];
},
{
[NodeOutputKeyEnum.errorText]: string;
}
>;
export type ChatMessageFileParser = (urls: string[]) => Promise<
{
id?: string;
name: string;
url: string;
sandboxPath?: string;
content?: string;
}[]
>;
...@@ -137,9 +137,6 @@ export const serviceEnv = createEnv({ ...@@ -137,9 +137,6 @@ export const serviceEnv = createEnv({
TEXTIN_SECRET_CODE: z.string().optional().meta({ TEXTIN_SECRET_CODE: z.string().optional().meta({
description: '合合信息 Textin 服务 Secret Code' description: '合合信息 Textin 服务 Secret Code'
}), }),
CUSTOM_PDF_PARSE_PRICE: NumSchema.default(0).meta({
description: 'PDF 增强解析单价'
}),
// ==================== 数据库与缓存 ==================== // ==================== 数据库与缓存 ====================
// Redisg // Redisg
...@@ -253,9 +250,6 @@ export const serviceEnv = createEnv({ ...@@ -253,9 +250,6 @@ export const serviceEnv = createEnv({
.string() .string()
.optional() .optional()
.meta({ description: '自定义跨域;不配置时默认允许所有跨域(逗号分割)' }), .meta({ description: '自定义跨域;不配置时默认允许所有跨域(逗号分割)' }),
FILE_URL_WHITELIST: z.string().optional().meta({
description: '文件 URL 白名单,逗号或空白分隔'
}),
MULTIPLE_DATA_TO_BASE64: BoolSchema.default(true).meta({ MULTIPLE_DATA_TO_BASE64: BoolSchema.default(true).meta({
description: '是否强制将图片、音频、视频转成 base64 传递给模型' description: '是否强制将图片、音频、视频转成 base64 传递给模型'
}), }),
...@@ -332,9 +326,6 @@ export const serviceEnv = createEnv({ ...@@ -332,9 +326,6 @@ export const serviceEnv = createEnv({
VLM_MAX_PROCESS: IntSchema.min(1).default(10).meta({ VLM_MAX_PROCESS: IntSchema.min(1).default(10).meta({
description: '图片理解模型最大处理并发数' description: '图片理解模型最大处理并发数'
}), }),
WORKFLOW_HTTP_IGNORE_HTTPS_CERT: BoolSchema.default(false).meta({
description: '工作流 HTTP 节点是否忽略 HTTPS 证书校验'
}),
// ==================== 资源限制 ==================== // ==================== 资源限制 ====================
SERVICE_REQUEST_MAX_CONTENT_LENGTH: IntSchema.default(10).meta({ SERVICE_REQUEST_MAX_CONTENT_LENGTH: IntSchema.default(10).meta({
description: '服务器接收请求的最大大小(MB)' description: '服务器接收请求的最大大小(MB)'
......
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { ChatFileTypeEnum, ChatRoleEnum } from '@fastgpt/global/core/chat/constants';
import type { ChatItemMiniType } from '@fastgpt/global/core/chat/type';
import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants';
import {
getAIChatFileContextConfig,
rewriteChatMessagesWithFiles
} from '../../../../../core/workflow/dispatch/ai/chat';
const createHumanMessage = ({
text,
fileUrl
}: {
text?: string;
fileUrl?: string;
}): ChatItemMiniType => ({
obj: ChatRoleEnum.Human,
value: [
...(text
? [
{
text: {
content: text
}
}
]
: []),
...(fileUrl
? [
{
file: {
type: ChatFileTypeEnum.file,
name: fileUrl.split('/').pop() || 'file.pdf',
url: fileUrl
}
}
]
: [])
]
});
describe('getAIChatFileContextConfig', () => {
it('未绑定文件链接输入时清空当前文件并禁用历史文件解析', () => {
const result = getAIChatFileContextConfig({
inputs: [
{
key: NodeInputKeyEnum.fileUrlList,
value: ''
} as any
],
rawFileLinks: ['/current.pdf']
});
expect(result).toEqual({
fileLinks: undefined,
parseHistoryFiles: false
});
});
it('绑定文件链接输入时保留当前文件并允许历史文件解析', () => {
const result = getAIChatFileContextConfig({
inputs: [
{
key: NodeInputKeyEnum.fileUrlList,
value: '{{workflowStart.fileUrlList}}'
} as any
],
rawFileLinks: ['/current.pdf']
});
expect(result).toEqual({
fileLinks: ['/current.pdf'],
parseHistoryFiles: true
});
});
});
describe('rewriteChatMessagesWithFiles', () => {
const parseFileFn = vi.fn(async (urls: string[]) =>
urls.map((url) => ({
name: url.split('/').pop() || 'file.pdf',
url,
content: `${url} content`
}))
);
beforeEach(() => {
vi.clearAllMocks();
});
it('禁用历史文件解析时只解析当前轮 Human 文件', async () => {
const result = await rewriteChatMessagesWithFiles({
messages: [
createHumanMessage({
text: '历史问题',
fileUrl: '/history.pdf'
}),
{
obj: ChatRoleEnum.AI,
value: [
{
text: {
content: '历史回答'
}
}
]
},
createHumanMessage({
text: '继续回答',
fileUrl: '/current.pdf'
})
],
parseHistoryFiles: false,
parseFileFn
});
expect(parseFileFn).toHaveBeenCalledTimes(1);
expect(parseFileFn).toHaveBeenCalledWith(['/current.pdf']);
const historyText = result[0].value.find((item) => item.text)?.text?.content;
const currentText = result[2].value.find((item) => item.text)?.text?.content;
expect(historyText).toBe('历史问题');
expect(result[0].value.some((item) => 'file' in item)).toBe(false);
expect(currentText).toContain('/current.pdf content');
expect(currentText).not.toContain('/history.pdf content');
});
it('启用历史文件解析时会解析历史和当前轮 Human 文件', async () => {
const result = await rewriteChatMessagesWithFiles({
messages: [
createHumanMessage({
text: '历史问题',
fileUrl: '/history.pdf'
}),
{
obj: ChatRoleEnum.AI,
value: [
{
text: {
content: '历史回答'
}
}
]
},
createHumanMessage({
text: '继续回答',
fileUrl: '/current.pdf'
})
],
parseHistoryFiles: true,
parseFileFn
});
expect(parseFileFn).toHaveBeenCalledTimes(2);
expect(parseFileFn).toHaveBeenNthCalledWith(1, ['/history.pdf']);
expect(parseFileFn).toHaveBeenNthCalledWith(2, ['/current.pdf']);
const historyText = result[0].value.find((item) => item.text)?.text?.content;
const currentText = result[2].value.find((item) => item.text)?.text?.content;
expect(historyText).toContain('/history.pdf content');
expect(currentText).toContain('/current.pdf content');
});
});
Subproject commit 42593cd8a99e15212489033e30e97ce82194a9ae Subproject commit f3872efa0979406dd3b0d04b62d845db16c4f47c
...@@ -36,7 +36,7 @@ AIPROXY_API_ENDPOINT=http://localhost:3010 ...@@ -36,7 +36,7 @@ AIPROXY_API_ENDPOINT=http://localhost:3010
AIPROXY_API_TOKEN=token AIPROXY_API_TOKEN=token
# MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址(末尾不要带 /) # MCP Server 代理地址,用于 MCP 使用方式页拼接 SSE 地址(末尾不要带 /)
MCP_SERVER_PROXY_ENDPOINT=http://localhost:3003 SSE_MCP_SERVER_PROXY_ENDPOINT=http://localhost:3003
# 插件市场地址 # 插件市场地址
MARKETPLACE_URL=https://v2.marketplace.fastgpt.cn MARKETPLACE_URL=https://v2.marketplace.fastgpt.cn
...@@ -72,20 +72,6 @@ AGENT_SANDBOX_NPM_REGISTRY= ...@@ -72,20 +72,6 @@ AGENT_SANDBOX_NPM_REGISTRY=
# Agent 沙箱内 pip/python -m pip/uv 使用的 PyPI index URL(可选) # Agent 沙箱内 pip/python -m pip/uv 使用的 PyPI index URL(可选)
AGENT_SANDBOX_PYPI_INDEX_URL= AGENT_SANDBOX_PYPI_INDEX_URL=
# ==================== PDF 增强解析(可选) ====================
# 自定义 PDF 解析服务地址
# CUSTOM_PDF_PARSE_URL=
# 自定义 PDF 解析服务密钥
# CUSTOM_PDF_PARSE_KEY=
# Doc2x PDF 解析服务密钥
# DOC2X_KEY=
# 合合信息 Textin 服务 App ID
# TEXTIN_APP_ID=
# 合合信息 Textin 服务 Secret Code
# TEXTIN_SECRET_CODE=
# PDF 增强解析单价
CUSTOM_PDF_PARSE_PRICE=0
# ==================== 沙盒代理 (agent-sandbox-proxy) 与网络配置 ==================== # ==================== 沙盒代理 (agent-sandbox-proxy) 与网络配置 ====================
# JWT 验签与内网安全物理阻断密钥 (必须与 Rust Proxy 的 AGENT_SANDBOX_PROXY_SECRET 环境变量保持完全一致) # JWT 验签与内网安全物理阻断密钥 (必须与 Rust Proxy 的 AGENT_SANDBOX_PROXY_SECRET 环境变量保持完全一致)
# 生产环境必须配置为至少 32 字节的高强度随机值,不能使用示例占位。 # 生产环境必须配置为至少 32 字节的高强度随机值,不能使用示例占位。
...@@ -140,10 +126,6 @@ PG_URL=postgresql://username:password@localhost:5432/postgres ...@@ -140,10 +126,6 @@ PG_URL=postgresql://username:password@localhost:5432/postgres
# MILVUS_TOKEN= # MILVUS_TOKEN=
# openGauss 向量库连接参数 # openGauss 向量库连接参数
# OPENGAUSS_URL=postgresql://gaussdb:FastGPT@123@localhost:5432/fastgpt # OPENGAUSS_URL=postgresql://gaussdb:FastGPT@123@localhost:5432/fastgpt
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH=100
# 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES=100000
# ==================== 日志配置 ==================== # ==================== 日志配置 ====================
# 日志等级: trace | debug | info | warning | error | fatal # 日志等级: trace | debug | info | warning | error | fatal
...@@ -189,8 +171,6 @@ PASSWORD_EXPIRED_MONTH= ...@@ -189,8 +171,6 @@ PASSWORD_EXPIRED_MONTH=
MAX_LOGIN_SESSION= MAX_LOGIN_SESSION=
# 自定义跨域;不配置时默认允许所有跨域(逗号分割) # 自定义跨域;不配置时默认允许所有跨域(逗号分割)
ALLOWED_ORIGINS= ALLOWED_ORIGINS=
# 文件 URL 白名单,逗号或空白分隔
# FILE_URL_WHITELIST=
# 强制将图片转成 base64 传递给模型 # 强制将图片转成 base64 传递给模型
MULTIPLE_DATA_TO_BASE64=true MULTIPLE_DATA_TO_BASE64=true
...@@ -227,28 +207,18 @@ SKIP_FILE_TYPE_CHECK=false ...@@ -227,28 +207,18 @@ SKIP_FILE_TYPE_CHECK=false
WECHAT_CHANNEL_CONCURRENCY=1000 WECHAT_CHANNEL_CONCURRENCY=1000
# 文件解析 worker 并发数 # 文件解析 worker 并发数
PARSE_FILE_WORKERS=10 PARSE_FILE_WORKERS=10
# 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS=10
# 文件解析超时时间(秒) # 文件解析超时时间(秒)
PARSE_FILE_TIMEOUT_SECONDS=600 PARSE_FILE_TIMEOUT_SECONDS=600
# HTML 转 Markdown worker 并发数 # HTML 转 Markdown worker 并发数
HTML_TO_MARKDOWN_WORKERS=10 HTML_TO_MARKDOWN_WORKERS=10
# 文本切块 worker 并发数 # 文本切块 worker 并发数
TEXT_TO_CHUNKS_WORKERS=10 TEXT_TO_CHUNKS_WORKERS=10
# 向量训练队列最大并发数
VECTOR_MAX_PROCESS=10
# 问答拆分队列最大并发数
QA_MAX_PROCESS=10
# 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS=10
# 工作流最大运行次数,避免极端死循环 # 工作流最大运行次数,避免极端死循环
WORKFLOW_MAX_RUN_TIMES=500 WORKFLOW_MAX_RUN_TIMES=500
# 循环/并行节点最大输入数组长度(默认 100) # 循环/并行节点最大输入数组长度(默认 100)
WORKFLOW_MAX_LOOP_TIMES=100 WORKFLOW_MAX_LOOP_TIMES=100
# 并行节点并发上限(最终会 clamp 到 [5, 100],默认 10) # 并行节点并发上限(最终会 clamp 到 [5, 100],默认 10)
WORKFLOW_PARALLEL_MAX_CONCURRENCY=10 WORKFLOW_PARALLEL_MAX_CONCURRENCY=10
# 工作流 HTTP 节点是否忽略 HTTPS 证书校验
WORKFLOW_HTTP_IGNORE_HTTPS_CERT=false
# 工作流 QPM(若用户套餐有限制,这里不生效) # 工作流 QPM(若用户套餐有限制,这里不生效)
CHAT_MAX_QPM=5000 CHAT_MAX_QPM=5000
...@@ -269,3 +239,31 @@ UPLOAD_FILE_MAX_AMOUNT=1000 ...@@ -269,3 +239,31 @@ UPLOAD_FILE_MAX_AMOUNT=1000
LLM_REQUEST_TRACKING_RETENTION_HOURS=6 LLM_REQUEST_TRACKING_RETENTION_HOURS=6
# HTML 转 Markdown 最大字符数(超过后不执行转换) # HTML 转 Markdown 最大字符数(超过后不执行转换)
MAX_HTML_TRANSFORM_CHARS=1000000 MAX_HTML_TRANSFORM_CHARS=1000000
# ==================== 开源版特有配置,商业版这部分配置会在 admin 看板 ====================
# ==================== PDF 增强解析(可选) ====================
# 自定义 PDF 解析服务地址
# CUSTOM_PDF_PARSE_URL=
# 自定义 PDF 解析服务密钥
# CUSTOM_PDF_PARSE_KEY=
# Doc2x PDF 解析服务密钥
# DOC2X_KEY=
# 合合信息 Textin 服务 App ID
# TEXTIN_APP_ID=
# 合合信息 Textin 服务 Secret Code
# TEXTIN_SECRET_CODE=
# 向量检索 hnsw ef_search 参数,仅对 PG / OB / OpenGauss 生效
HNSW_EF_SEARCH=100
# 向量检索最大扫描数据量,仅对 PG 生效
HNSW_MAX_SCAN_TUPLES=100000
# ==================== 知识库处理并发控制 ====================
# 知识库文件解析队列最大并发数
DATASET_PARSE_MAX_PROCESS=10
# 向量训练队列最大并发数
VECTOR_MAX_PROCESS=10
# 问答拆分队列最大并发数
QA_MAX_PROCESS=10
# 图片理解模型处理队列最大并发数
VLM_MAX_PROCESS=10
\ No newline at end of file
...@@ -5,7 +5,8 @@ import { BoolSchema, IntSchema, UrlSchema } from '@fastgpt/global/common/zod'; ...@@ -5,7 +5,8 @@ import { BoolSchema, IntSchema, UrlSchema } from '@fastgpt/global/common/zod';
export const appEnv = createEnv({ export const appEnv = createEnv({
server: { server: {
DEFAULT_ROOT_PSW: z.string().default('123456'), DEFAULT_ROOT_PSW: z.string().default('123456'),
MCP_SERVER_PROXY_ENDPOINT: UrlSchema.optional(), SSE_MCP_SERVER_PROXY_ENDPOINT: UrlSchema.optional(),
SYSTEM_NAME: z.string().default('AI'), SYSTEM_NAME: z.string().default('AI'),
SYSTEM_DESCRIPTION: z.string().default(''), SYSTEM_DESCRIPTION: z.string().default(''),
SYSTEM_FAVICON: z.string().default(''), SYSTEM_FAVICON: z.string().default(''),
......
...@@ -146,8 +146,8 @@ export async function initSystemConfig() { ...@@ -146,8 +146,8 @@ export async function initSystemConfig() {
const config: FastGPTConfigFileType = { const config: FastGPTConfigFileType = {
feConfigs: { feConfigs: {
...defaultFeConfigs, ...defaultFeConfigs,
mcpServerProxyEndpoint: appEnv.MCP_SERVER_PROXY_ENDPOINT,
...(fastgptConfig.feConfigs || {}), ...(fastgptConfig.feConfigs || {}),
mcpServerProxyEndpoint: appEnv.SSE_MCP_SERVER_PROXY_ENDPOINT,
limit: { limit: {
...defaultFeConfigs.limit, ...defaultFeConfigs.limit,
...(fastgptConfig.feConfigs?.limit || {}) ...(fastgptConfig.feConfigs?.limit || {})
...@@ -178,19 +178,10 @@ export async function initSystemConfig() { ...@@ -178,19 +178,10 @@ export async function initSystemConfig() {
key: serviceEnv.CUSTOM_PDF_PARSE_KEY, key: serviceEnv.CUSTOM_PDF_PARSE_KEY,
doc2xKey: serviceEnv.DOC2X_KEY, doc2xKey: serviceEnv.DOC2X_KEY,
textinAppId: serviceEnv.TEXTIN_APP_ID, textinAppId: serviceEnv.TEXTIN_APP_ID,
textinSecretCode: serviceEnv.TEXTIN_SECRET_CODE, textinSecretCode: serviceEnv.TEXTIN_SECRET_CODE
price: serviceEnv.CUSTOM_PDF_PARSE_PRICE
},
fileUrlWhitelist: serviceEnv.FILE_URL_WHITELIST
? serviceEnv.FILE_URL_WHITELIST.split(/[,;\s]+/)
.map((item) => item.trim())
.filter(Boolean)
: undefined,
workflowHttpNode: {
ignoreHttpsCertificate: serviceEnv.WORKFLOW_HTTP_IGNORE_HTTPS_CERT
} }
}, },
fastgptConfig.systemEnv || {} fastgptConfig.systemEnv || {} // 商业版数据存在数据库里
), ),
subPlans: fastgptConfig.subPlans subPlans: fastgptConfig.subPlans
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment