From 3e3f2165dbc791b252e02d77e49281ce0fead6d6 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Wed, 5 Mar 2025 14:11:52 +0800 Subject: [PATCH] feat: prompt call tool support reason;perf: ai proxy doc (#3982) * update schema * perf: ai proxy doc * feat: prompt call tool support reason --- .vscode/settings.json | 4 +- README.md | 24 +- deploy/docker/docker-compose-milvus.yml | 38 +-- deploy/docker/docker-compose-pgvector.yml | 42 +-- deploy/docker/docker-compose-zilliz.yml | 38 +-- docSite/assets/imgs/aiproxy1.png | Bin 0 -> 138147 bytes .../content/zh-cn/docs/development/docker.md | 31 +- .../docs/development/modelConfig/ai-proxy.md | 56 +++- .../zh-cn/docs/development/upgrading/490.md | 1 + packages/global/core/chat/adapt.ts | 279 ++++++++++-------- packages/global/core/chat/type.d.ts | 1 + .../workflow/template/system/aiChat/index.ts | 2 +- .../core/workflow/template/system/tools.ts | 7 + packages/service/common/file/read/utils.ts | 2 +- .../core/ai/config/provider/Moonshot.json | 75 +++++ .../core/app/templates/templateSchema.ts | 36 +-- .../workflow/dispatch/agent/runTool/index.ts | 6 +- .../dispatch/agent/runTool/promptCall.ts | 139 ++++++--- .../workflow/dispatch/agent/runTool/type.d.ts | 1 + .../core/workflow/dispatch/chat/oneapi.ts | 9 + packages/service/worker/readFile/index.ts | 4 +- .../account/model/Channel/index.tsx | 6 +- projects/app/src/web/core/ai/channel.ts | 5 +- 23 files changed, 508 insertions(+), 298 deletions(-) create mode 100644 docSite/assets/imgs/aiproxy1.png diff --git a/.vscode/settings.json b/.vscode/settings.json index c674d0733..bba595f12 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -27,7 +27,5 @@ }, "markdown.copyFiles.destination": { "/docSite/content/**/*": "${documentWorkspaceFolder}/docSite/assets/imgs/" - }, - "markdown.copyFiles.overwriteBehavior": "nameIncrementally", - "markdown.copyFiles.transformPath": "const filename = uri.path.split('/').pop(); return `/imgs/${filename}`;" + } } \ No newline at end of file diff --git a/README.md b/README.md index dfe0a8387..f40777117 100644 --- a/README.md +++ b/README.md @@ -115,16 +115,6 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b # -## 🏘️ 社区交流群 - -扫码加入飞书话题群: - -![](https://oss.laf.run/otnvvf-imgs/fastgpt-feishu1.png) - - - # - - ## 🏘️ 加入我们 我们正在寻找志同道合的小伙伴,加速 FastGPT 的发展。你可以通过 [FastGPT 2025 招聘](https://fael3z0zfze.feishu.cn/wiki/P7FOwEmPziVcaYkvVaacnVX1nvg)了解 FastGPT 的招聘信息。 @@ -135,17 +125,25 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b - [Sealos:快速部署集群应用](https://github.com/labring/sealos) - [AI Proxy API调用地址](https://sealos.run/aiproxy/?k=fastgpt-github/) - [One API:多模型管理,支持 Azure、文心一言等](https://github.com/songquanpeng/one-api) -- [TuShan:5 分钟搭建后台管理系统](https://github.com/msgbyte/tushan) # - ## 🌿 第三方生态 -- [COW 个人微信/企微机器人](https://doc.tryfastgpt.ai/docs/use-cases/external-integration/onwechat/) - [SiliconCloud (硅基流动) —— 开源模型在线体验平台](https://cloud.siliconflow.cn/i/TR9Ym0c4) +- [COW 个人微信/企微机器人](https://doc.tryfastgpt.ai/docs/use-cases/external-integration/onwechat/) + + + # + + +## 🏘️ 社区交流群 + +扫码加入飞书话题群: + +![](https://oss.laf.run/otnvvf-imgs/fastgpt-feishu1.png) # diff --git a/deploy/docker/docker-compose-milvus.yml b/deploy/docker/docker-compose-milvus.yml index 2914ab87a..2e30c9f23 100644 --- a/deploy/docker/docker-compose-milvus.yml +++ b/deploy/docker/docker-compose-milvus.yml @@ -141,10 +141,9 @@ services: - AIPROXY_API_ENDPOINT=http://aiproxy:3000 # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY - AIPROXY_API_TOKEN=aiproxy - # AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。 - - OPENAI_BASE_URL=http://oneapi:3000/v1 - # AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改) - - CHAT_API_KEY=sk-fastgpt + # 模型中转地址(如果用了 AI Proxy,下面 2 个就不需要了,旧版 OneAPI 用户,使用下面的变量) + # - OPENAI_BASE_URL=http://oneapi:3000/v1 + # - CHAT_API_KEY=sk-fastgpt # 数据库最大连接数 - DB_MAX_LINK=30 # 登录凭证密钥 @@ -180,32 +179,37 @@ services: container_name: aiproxy restart: unless-stopped depends_on: - pgsql: + aiproxy_pg: condition: service_healthy ports: - - '3002:3000/tcp' + - '3002:3000' networks: - fastgpt environment: - - ADMIN_KEY=aiproxy # 对应 fastgpt 里的AIPROXY_API_TOKEN - - LOG_DETAIL_STORAGE_HOURS=1 # 日志详情保存时间(小时) - - TZ=Asia/Shanghai - - SQL_DSN=postgres://postgres:aiproxy@pgsql:5432/aiproxy + # 对应 fastgpt 里的AIPROXY_API_TOKEN + - ADMIN_KEY=aiproxy + # 错误日志详情保存时间(小时) + - LOG_DETAIL_STORAGE_HOURS=1 + # 数据库连接地址 + - SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy + # 最大重试次数 + - RetryTimes=3 + # 不需要计费 + - BILLING_ENABLED=false + # 不需要严格检测模型 - DISABLE_MODEL_CONFIG=true healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status'] interval: 5s timeout: 5s retries: 10 - - # AI Proxy - pgsql: - # image: "postgres:latest" - image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.7.0 # 阿里云 + aiproxy_pg: + # image: pgvector/pgvector:0.8.0-pg15 # docker hub + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云 restart: unless-stopped - container_name: pgsql + container_name: aiproxy_pg volumes: - - ./pgsql:/var/lib/postgresql/data + - ./aiproxy_pg:/var/lib/postgresql/data networks: - fastgpt environment: diff --git a/deploy/docker/docker-compose-pgvector.yml b/deploy/docker/docker-compose-pgvector.yml index c403741bf..aee2bebcb 100644 --- a/deploy/docker/docker-compose-pgvector.yml +++ b/deploy/docker/docker-compose-pgvector.yml @@ -11,8 +11,8 @@ services: # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云 container_name: pg restart: always - ports: # 生产环境建议不要暴露 - - 5432:5432 + # ports: # 生产环境建议不要暴露 + # - 5432:5432 networks: - fastgpt environment: @@ -99,10 +99,9 @@ services: - AIPROXY_API_ENDPOINT=http://aiproxy:3000 # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY - AIPROXY_API_TOKEN=aiproxy - # AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。 - - OPENAI_BASE_URL=http://oneapi:3000/v1 - # AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改) - - CHAT_API_KEY=sk-fastgpt + # 模型中转地址(如果用了 AI Proxy,下面 2 个就不需要了,旧版 OneAPI 用户,使用下面的变量) + # - OPENAI_BASE_URL=http://oneapi:3000/v1 + # - CHAT_API_KEY=sk-fastgpt # 数据库最大连接数 - DB_MAX_LINK=30 # 登录凭证密钥 @@ -137,32 +136,37 @@ services: container_name: aiproxy restart: unless-stopped depends_on: - pgsql: + aiproxy_pg: condition: service_healthy ports: - - '3002:3000/tcp' + - '3002:3000' networks: - fastgpt environment: - - ADMIN_KEY=aiproxy # 对应 fastgpt 里的AIPROXY_API_TOKEN - - LOG_DETAIL_STORAGE_HOURS=1 # 日志详情保存时间(小时) - - TZ=Asia/Shanghai - - SQL_DSN=postgres://postgres:aiproxy@pgsql:5432/aiproxy + # 对应 fastgpt 里的AIPROXY_API_TOKEN + - ADMIN_KEY=aiproxy + # 错误日志详情保存时间(小时) + - LOG_DETAIL_STORAGE_HOURS=1 + # 数据库连接地址 + - SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy + # 最大重试次数 + - RetryTimes=3 + # 不需要计费 + - BILLING_ENABLED=false + # 不需要严格检测模型 - DISABLE_MODEL_CONFIG=true healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status'] interval: 5s timeout: 5s retries: 10 - - # AI Proxy - pgsql: - # image: "postgres:latest" - image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.7.0 # 阿里云 + aiproxy_pg: + # image: pgvector/pgvector:0.8.0-pg15 # docker hub + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云 restart: unless-stopped - container_name: pgsql + container_name: aiproxy_pg volumes: - - ./pgsql:/var/lib/postgresql/data + - ./aiproxy_pg:/var/lib/postgresql/data networks: - fastgpt environment: diff --git a/deploy/docker/docker-compose-zilliz.yml b/deploy/docker/docker-compose-zilliz.yml index ffdb623c1..e2bad44d8 100644 --- a/deploy/docker/docker-compose-zilliz.yml +++ b/deploy/docker/docker-compose-zilliz.yml @@ -79,10 +79,9 @@ services: - AIPROXY_API_ENDPOINT=http://aiproxy:3000 # AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY - AIPROXY_API_TOKEN=aiproxy - # AI模型的API地址哦。务必加 /v1。这里默认填写了OneApi的访问地址。 - - OPENAI_BASE_URL=http://oneapi:3000/v1 - # AI模型的API Key。(这里默认填写了OneAPI的快速默认key,测试通后,务必及时修改) - - CHAT_API_KEY=sk-fastgpt + # 模型中转地址(如果用了 AI Proxy,下面 2 个就不需要了,旧版 OneAPI 用户,使用下面的变量) + # - OPENAI_BASE_URL=http://oneapi:3000/v1 + # - CHAT_API_KEY=sk-fastgpt # 数据库最大连接数 - DB_MAX_LINK=30 # 登录凭证密钥 @@ -118,32 +117,37 @@ services: container_name: aiproxy restart: unless-stopped depends_on: - pgsql: + aiproxy_pg: condition: service_healthy ports: - - '3002:3000/tcp' + - '3002:3000' networks: - fastgpt environment: - - ADMIN_KEY=aiproxy # 对应 fastgpt 里的AIPROXY_API_TOKEN - - LOG_DETAIL_STORAGE_HOURS=1 # 日志详情保存时间(小时) - - TZ=Asia/Shanghai - - SQL_DSN=postgres://postgres:aiproxy@pgsql:5432/aiproxy + # 对应 fastgpt 里的AIPROXY_API_TOKEN + - ADMIN_KEY=aiproxy + # 错误日志详情保存时间(小时) + - LOG_DETAIL_STORAGE_HOURS=1 + # 数据库连接地址 + - SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy + # 最大重试次数 + - RetryTimes=3 + # 不需要计费 + - BILLING_ENABLED=false + # 不需要严格检测模型 - DISABLE_MODEL_CONFIG=true healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status'] interval: 5s timeout: 5s retries: 10 - - # AI Proxy - pgsql: - # image: "postgres:latest" - image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.7.0 # 阿里云 + aiproxy_pg: + # image: pgvector/pgvector:0.8.0-pg15 # docker hub + image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云 restart: unless-stopped - container_name: pgsql + container_name: aiproxy_pg volumes: - - ./pgsql:/var/lib/postgresql/data + - ./aiproxy_pg:/var/lib/postgresql/data networks: - fastgpt environment: diff --git a/docSite/assets/imgs/aiproxy1.png b/docSite/assets/imgs/aiproxy1.png new file mode 100644 index 0000000000000000000000000000000000000000..3905df329d6067f4e84920a87f8c32e8ad516ac4 GIT binary patch literal 138147 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

qNx$x-+j0t$e0 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 literal 0 HcmV?d00001 diff --git a/docSite/content/zh-cn/docs/development/docker.md b/docSite/content/zh-cn/docs/development/docker.md index 0ef3b1dcc..9a5962a04 100644 --- a/docSite/content/zh-cn/docs/development/docker.md +++ b/docSite/content/zh-cn/docs/development/docker.md @@ -30,7 +30,7 @@ weight: 707 ### PgVector版本 -非常轻量,适合数据量在 5000 万以下。 +非常轻量,适合知识库索引量在 5000 万以下。 {{< table "table-hover table-striped-columns" >}} | 环境 | 最低配置(单节点) | 推荐配置 | @@ -149,18 +149,14 @@ curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/mai {{< tab tabName="PgVector版本" >}} {{< markdownify >}} -``` -FE_DOMAIN=你的前端你访问地址,例如 http://192.168.0.1:3000;https://cloud.fastgpt.cn -``` +无需操作 {{< /markdownify >}} {{< /tab >}} {{< tab tabName="Milvus版本" >}} {{< markdownify >}} -``` -FE_DOMAIN=你的前端你访问地址,例如 http://192.168.0.1:3000;https://cloud.fastgpt.cn -``` +无需操作 {{< /markdownify >}} {{< /tab >}} @@ -174,7 +170,6 @@ FE_DOMAIN=你的前端你访问地址,例如 http://192.168.0.1:3000;https://clo {{% alert icon="🤖" context="success" %}} 1. 修改`MILVUS_ADDRESS`和`MILVUS_TOKEN`链接参数,分别对应 `zilliz` 的 `Public Endpoint` 和 `Api key`,记得把自己ip加入白名单。 -2. 修改FE_DOMAIN=你的前端你访问地址,例如 http://192.168.0.1:3000;https://cloud.fastgpt.cn {{% /alert %}} @@ -189,30 +184,28 @@ FE_DOMAIN=你的前端你访问地址,例如 http://192.168.0.1:3000;https://clo ```bash # 启动容器 docker-compose up -d -# 等待10s,OneAPI第一次总是要重启几次才能连上Mysql -sleep 10 -# 重启一次oneapi(由于OneAPI的默认Key有点问题,不重启的话会提示找不到渠道,临时手动重启一次解决,等待作者修复) -docker restart oneapi ``` ### 4. 访问 FastGPT -目前可以通过 `ip:3000` 直接访问(注意防火墙)。登录用户名为 `root`,密码为`docker-compose.yml`环境变量里设置的 `DEFAULT_ROOT_PSW`。 +目前可以通过 `ip:3000` 直接访问(注意开放防火墙)。登录用户名为 `root`,密码为`docker-compose.yml`环境变量里设置的 `DEFAULT_ROOT_PSW`。 如果需要域名访问,请自行安装并配置 Nginx。 -首次运行,会自动初始化 root 用户,密码为 `1234`(与环境变量中的`DEFAULT_ROOT_PSW`一致),日志里会提示一次`MongoServerError: Unable to read from a snapshot due to pending collection catalog changes;`可忽略。 +首次运行,会自动初始化 root 用户,密码为 `1234`(与环境变量中的`DEFAULT_ROOT_PSW`一致),日志可能会提示一次`MongoServerError: Unable to read from a snapshot due to pending collection catalog changes;`可忽略。 ### 5. 配置模型 -登录FastGPT后,进入“模型提供商”页面,首先配置模型渠道,[点击查看相关教程](/docs/development/modelconfig/ai-proxy) - -然后配置具体模型,务必先配置至少一个语言模型和一个向量模型,否则系统无法正常使用。 - -[点击查看模型配置教程](/docs/development/modelConfig/intro/) +- 首次登录FastGPT后,系统会提示未配置`语言模型`和`索引模型`,并自动跳转模型配置页面。系统必须至少有这两类模型才能正常使用。 +- 如果系统未正常跳转,可以在`账号-模型提供商`页面,进行模型配置。[点击查看相关教程](/docs/development/modelconfig/ai-proxy) +- 目前已知可能问题:首次进入系统后,整个浏览器 tab 无法响应。此时需要删除该tab,重新打开一次即可。 ## FAQ +### 登录系统后,浏览器无法响应 + +无法点击任何内容,刷新也无效。此时需要删除该tab,重新打开一次即可。 + ### Mongo 副本集自动初始化失败 最新的 docker-compose 示例优化 Mongo 副本集初始化,实现了全自动。目前在 unbuntu20,22 centos7, wsl2, mac, window 均通过测试。仍无法正常启动,大部分是因为 cpu 不支持 AVX 指令集,可以切换 Mongo4.x 版本。 diff --git a/docSite/content/zh-cn/docs/development/modelConfig/ai-proxy.md b/docSite/content/zh-cn/docs/development/modelConfig/ai-proxy.md index 70e58881f..5d86c0957 100644 --- a/docSite/content/zh-cn/docs/development/modelConfig/ai-proxy.md +++ b/docSite/content/zh-cn/docs/development/modelConfig/ai-proxy.md @@ -7,7 +7,7 @@ toc: true weight: 744 --- -从 FastGPT 4.8.23 版本开始,引入 AI Proxy 来进一步方便模型的配置。 +从 `FastGPT 4.8.23` 版本开始,引入 AI Proxy 来进一步方便模型的配置。 AI Proxy 与 One API 类似,也是作为一个 OpenAI 接口管理 & 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。 @@ -15,13 +15,29 @@ AI Proxy 与 One API 类似,也是作为一个 OpenAI 接口管理 & 分发系 ### Docker 版本 -`docker-compose.yml` 文件已加入了 AI Proxy 配置,可直接使用。 +`docker-compose.yml` 文件已加入了 AI Proxy 配置,可直接使用。[点击查看最新的 yml 配置](https://raw.githubusercontent.com/labring/FastGPT/main/deploy/docker/docker-compose-pgvector.yml) -## 基础使用 +从旧版升级的用户,可以复制 yml 里,ai proxy 的配置,加入到旧的 yml 文件中。 + +## 运行原理 + +AI proxy 核心模块: + +1. 渠道管理:管理各家模型提供商的 API Key 和可用模型列表。 +2. 模型调用:根据请求的模型,选中对应的渠道;根据渠道的 API 格式,构造请求体,发送请求;格式化响应体成标准格式返回。 +3. 调用日志:详细记录模型调用的日志,并在错误时候可以记录其入参和报错信息,方便排查。 + +运行流程: + +![aiproxy12](/imgs/aiproxy1.png) + +## 在 FastGPT 中使用 + +AI proxy 相关功能,可以在`账号-模型提供商`页面找到。 ### 1. 创建渠道 -如果 FastGPT 的环境变量中,设置了 AIPROXY_API_ENDPOINT 的值,那么在“模型提供商”的配置页面,会多出两个 tab,可以直接在 FastGPT 平台上配置模型渠道,以及查看模型实际调用日志。 +在`模型提供商`的配置页面,点击`模型渠道`,进入渠道配置页面 ![aiproxy1](/imgs/aiproxy-1.png) @@ -36,9 +52,18 @@ AI Proxy 与 One API 类似,也是作为一个 OpenAI 接口管理 & 分发系 1. 渠道名:展示在外部的渠道名称,仅作标识; 2. 厂商:模型对应的厂商,不同厂商对应不同的默认地址和 API 密钥格式; 3. 模型:当前渠道具体可以使用的模型,系统内置了主流的一些模型,如果下拉框中没有想要的选项,可以点击“新增模型”,[增加自定义模型](/docs/development/modelconfig/intro/#新增自定义模型); -4. 模型映射:将 FastGPT 请求的模型,映射到具体提供的模型上; -5. 代理地址:具体请求的地址,系统给每个主流渠道配置了默认的地址,如果无需改动则不用填 -6. API 密钥:从模型厂商处获取的 API 凭证 +4. 模型映射:将 FastGPT 请求的模型,映射到具体提供的模型上。例如: + +```json +{ + "gpt-4o-test": "gpt-4o", +} +``` + +FatGPT 中的模型为 `gpt-4o-test`,向 AI Proxy 发起请求时也是 `gpt-4o-test`。AI proxy 在向上游发送请求时,实际的`model`为 `gpt-4o`。 + +5. 代理地址:具体请求的地址,系统给每个主流渠道配置了默认的地址,如果无需改动则不用填。 +6. API 密钥:从模型厂商处获取的 API 凭证。注意部分厂商需要提供多个密钥组合,可以根据提示进行输入。 最后点击“新增”,就能在“模型渠道”下看到刚刚配置的渠道 @@ -60,16 +85,15 @@ AI Proxy 与 One API 类似,也是作为一个 OpenAI 接口管理 & 分发系 ### 3. 启用模型 -最后在“模型配置”中,可以选择启用对应的模型,这样就能在平台中使用了 +最后在`模型配置`中,可以选择启用对应的模型,这样就能在平台中使用了,更多模型配置可以参考[模型配置](/docs/development/modelconfig/intro) ![aiproxy8](/imgs/aiproxy-8.png) - -## 渠道设置 +## 其他功能介绍 ### 优先级 -在 FastGPT 中,可以给渠道设置优先级,对于同样的模型,优先级越高的渠道会越优先请求 +范围1~100。数值越大,越容易被优先选中。 ![aiproxy9](/imgs/aiproxy-9.png) @@ -81,13 +105,15 @@ AI Proxy 与 One API 类似,也是作为一个 OpenAI 接口管理 & 分发系 ### 调用日志 -在 “调用日志” 页面,会展示发送到模型处的请求记录,包括具体的输入输出 tokens、请求时间、请求耗时、请求地址等等 +在 `调用日志` 页面,会展示发送到模型处的请求记录,包括具体的输入输出 tokens、请求时间、请求耗时、请求地址等等。错误的请求,则会详细的入参和错误信息,方便排查,但仅会保留 1 小时(环境变量里可配置)。 ![aiproxy11](/imgs/aiproxy-11.png) -## 如何从 OneAPI 迁移到 AI Proxy +## 从 OneAPI 迁移到 AI Proxy -可以从任意终端,发起 1 个 HTTP 请求。其中 {{host}} 替换成 AI Proxy 地址,{{admin_key}} 替换成 AI Proxy 中 ADMIN_KEY 的值,参数 dsn 为 OneAPI 的 mysql 连接串 +可以从任意终端,发起 1 个 HTTP 请求。其中 `{{host}}` 替换成 AI Proxy 地址,`{{admin_key}}` 替换成 AI Proxy 中 `ADMIN_KEY` 的值。 + +Body 参数 `dsn` 为 OneAPI 的 mysql 连接串。 ```bash curl --location --request POST '{{host}}/api/channels/import/oneapi' \ @@ -100,4 +126,4 @@ curl --location --request POST '{{host}}/api/channels/import/oneapi' \ 执行成功的情况下会返回 "success": true -脚本目前不是完全准,可能会有部分渠道遗漏,还需要手动再检查下 \ No newline at end of file +脚本目前不是完全准,仅是简单的做数据映射,主要是迁移`代理地址`、`模型`和`API 密钥`,建议迁移后再进行手动检查。 \ No newline at end of file diff --git a/docSite/content/zh-cn/docs/development/upgrading/490.md b/docSite/content/zh-cn/docs/development/upgrading/490.md index 7836521d5..4857f7068 100644 --- a/docSite/content/zh-cn/docs/development/upgrading/490.md +++ b/docSite/content/zh-cn/docs/development/upgrading/490.md @@ -46,6 +46,7 @@ curl --location --request POST 'https://{{host}}/api/admin/initv490' \ 1. 知识库数据不再限制索引数量,可无限自定义。同时可自动更新输入文本的索引,不影响自定义索引。 2. Markdown 解析,增加链接后中文标点符号检测,增加空格。 +3. Prompt 模式工具调用,支持思考模型。同时优化其格式检测,减少空输出的概率。 ## 🐛 修复 diff --git a/packages/global/core/chat/adapt.ts b/packages/global/core/chat/adapt.ts index 4c4d65101..4302ca757 100644 --- a/packages/global/core/chat/adapt.ts +++ b/packages/global/core/chat/adapt.ts @@ -1,8 +1,11 @@ import type { + AIChatItemValueItemType, ChatItemType, ChatItemValueItemType, RuntimeUserPromptType, - UserChatItemType + SystemChatItemValueItemType, + UserChatItemType, + UserChatItemValueItemType } from '../../core/chat/type.d'; import { ChatFileTypeEnum, ChatItemValueTypeEnum, ChatRoleEnum } from '../../core/chat/constants'; import type { @@ -174,137 +177,24 @@ export const GPTMessages2Chats = ( ): ChatItemType[] => { const chatMessages = messages .map((item) => { - const value: ChatItemType['value'] = []; const obj = GPT2Chat[item.role]; - if ( - obj === ChatRoleEnum.System && - item.role === ChatCompletionRequestMessageRoleEnum.System - ) { - if (Array.isArray(item.content)) { - item.content.forEach((item) => [ - value.push({ - type: ChatItemValueTypeEnum.text, - text: { - content: item.text - } - }) - ]); - } else { - value.push({ - type: ChatItemValueTypeEnum.text, - text: { - content: item.content - } - }); - } - } else if ( - obj === ChatRoleEnum.Human && - item.role === ChatCompletionRequestMessageRoleEnum.User - ) { - if (typeof item.content === 'string') { - value.push({ - type: ChatItemValueTypeEnum.text, - text: { - content: item.content - } - }); - } else if (Array.isArray(item.content)) { - item.content.forEach((item) => { - if (item.type === 'text') { + const value = (() => { + if ( + obj === ChatRoleEnum.System && + item.role === ChatCompletionRequestMessageRoleEnum.System + ) { + const value: SystemChatItemValueItemType[] = []; + + if (Array.isArray(item.content)) { + item.content.forEach((item) => [ value.push({ type: ChatItemValueTypeEnum.text, text: { content: item.text } - }); - } else if (item.type === 'image_url') { - value.push({ - //@ts-ignore - type: ChatItemValueTypeEnum.file, - file: { - type: ChatFileTypeEnum.image, - name: '', - url: item.image_url.url - } - }); - } else if (item.type === 'file_url') { - value.push({ - // @ts-ignore - type: ChatItemValueTypeEnum.file, - file: { - type: ChatFileTypeEnum.file, - name: item.name, - url: item.url - } - }); - } - }); - } - } else if ( - obj === ChatRoleEnum.AI && - item.role === ChatCompletionRequestMessageRoleEnum.Assistant - ) { - if (item.tool_calls && reserveTool) { - // save tool calls - const toolCalls = item.tool_calls as ChatCompletionMessageToolCall[]; - value.push({ - //@ts-ignore - type: ChatItemValueTypeEnum.tool, - tools: toolCalls.map((tool) => { - let toolResponse = - messages.find( - (msg) => - msg.role === ChatCompletionRequestMessageRoleEnum.Tool && - msg.tool_call_id === tool.id - )?.content || ''; - toolResponse = - typeof toolResponse === 'string' ? toolResponse : JSON.stringify(toolResponse); - - return { - id: tool.id, - toolName: tool.toolName || '', - toolAvatar: tool.toolAvatar || '', - functionName: tool.function.name, - params: tool.function.arguments, - response: toolResponse as string - }; - }) - }); - } else if (item.function_call && reserveTool) { - const functionCall = item.function_call as ChatCompletionMessageFunctionCall; - const functionResponse = messages.find( - (msg) => - msg.role === ChatCompletionRequestMessageRoleEnum.Function && - msg.name === item.function_call?.name - ) as ChatCompletionFunctionMessageParam; - - if (functionResponse) { - value.push({ - //@ts-ignore - type: ChatItemValueTypeEnum.tool, - tools: [ - { - id: functionCall.id || '', - toolName: functionCall.toolName || '', - toolAvatar: functionCall.toolAvatar || '', - functionName: functionCall.name, - params: functionCall.arguments, - response: functionResponse.content || '' - } - ] - }); - } - } else if (item.interactive) { - value.push({ - //@ts-ignore - type: ChatItemValueTypeEnum.interactive, - interactive: item.interactive - }); - } else if (typeof item.content === 'string') { - const lastValue = value[value.length - 1]; - if (lastValue && lastValue.type === ChatItemValueTypeEnum.text && lastValue.text) { - lastValue.text.content += item.content; + }) + ]); } else { value.push({ type: ChatItemValueTypeEnum.text, @@ -313,8 +203,145 @@ export const GPTMessages2Chats = ( } }); } + return value; + } else if ( + obj === ChatRoleEnum.Human && + item.role === ChatCompletionRequestMessageRoleEnum.User + ) { + const value: UserChatItemValueItemType[] = []; + + if (typeof item.content === 'string') { + value.push({ + type: ChatItemValueTypeEnum.text, + text: { + content: item.content + } + }); + } else if (Array.isArray(item.content)) { + item.content.forEach((item) => { + if (item.type === 'text') { + value.push({ + type: ChatItemValueTypeEnum.text, + text: { + content: item.text + } + }); + } else if (item.type === 'image_url') { + value.push({ + //@ts-ignore + type: ChatItemValueTypeEnum.file, + file: { + type: ChatFileTypeEnum.image, + name: '', + url: item.image_url.url + } + }); + } else if (item.type === 'file_url') { + value.push({ + // @ts-ignore + type: ChatItemValueTypeEnum.file, + file: { + type: ChatFileTypeEnum.file, + name: item.name, + url: item.url + } + }); + } + }); + } + return value; + } else if ( + obj === ChatRoleEnum.AI && + item.role === ChatCompletionRequestMessageRoleEnum.Assistant + ) { + const value: AIChatItemValueItemType[] = []; + + if (typeof item.reasoning_text === 'string') { + value.push({ + type: ChatItemValueTypeEnum.reasoning, + reasoning: { + content: item.reasoning_text + } + }); + } + if (item.tool_calls && reserveTool) { + // save tool calls + const toolCalls = item.tool_calls as ChatCompletionMessageToolCall[]; + value.push({ + //@ts-ignore + type: ChatItemValueTypeEnum.tool, + tools: toolCalls.map((tool) => { + let toolResponse = + messages.find( + (msg) => + msg.role === ChatCompletionRequestMessageRoleEnum.Tool && + msg.tool_call_id === tool.id + )?.content || ''; + toolResponse = + typeof toolResponse === 'string' ? toolResponse : JSON.stringify(toolResponse); + + return { + id: tool.id, + toolName: tool.toolName || '', + toolAvatar: tool.toolAvatar || '', + functionName: tool.function.name, + params: tool.function.arguments, + response: toolResponse as string + }; + }) + }); + } + if (item.function_call && reserveTool) { + const functionCall = item.function_call as ChatCompletionMessageFunctionCall; + const functionResponse = messages.find( + (msg) => + msg.role === ChatCompletionRequestMessageRoleEnum.Function && + msg.name === item.function_call?.name + ) as ChatCompletionFunctionMessageParam; + + if (functionResponse) { + value.push({ + //@ts-ignore + type: ChatItemValueTypeEnum.tool, + tools: [ + { + id: functionCall.id || '', + toolName: functionCall.toolName || '', + toolAvatar: functionCall.toolAvatar || '', + functionName: functionCall.name, + params: functionCall.arguments, + response: functionResponse.content || '' + } + ] + }); + } + } + if (item.interactive) { + value.push({ + //@ts-ignore + type: ChatItemValueTypeEnum.interactive, + interactive: item.interactive + }); + } + if (typeof item.content === 'string') { + const lastValue = value[value.length - 1]; + if (lastValue && lastValue.type === ChatItemValueTypeEnum.text && lastValue.text) { + lastValue.text.content += item.content; + } else { + value.push({ + type: ChatItemValueTypeEnum.text, + text: { + content: item.content + } + }); + } + } + + return value; } - } + + return []; + })(); return { dataId: item.dataId, diff --git a/packages/global/core/chat/type.d.ts b/packages/global/core/chat/type.d.ts index 4e010c68f..8837075e8 100644 --- a/packages/global/core/chat/type.d.ts +++ b/packages/global/core/chat/type.d.ts @@ -77,6 +77,7 @@ export type AIChatItemValueItemType = { | ChatItemValueTypeEnum.reasoning | ChatItemValueTypeEnum.tool | ChatItemValueTypeEnum.interactive; + text?: { content: string; }; diff --git a/packages/global/core/workflow/template/system/aiChat/index.ts b/packages/global/core/workflow/template/system/aiChat/index.ts index 8d6aa6cd0..db5df3d6d 100644 --- a/packages/global/core/workflow/template/system/aiChat/index.ts +++ b/packages/global/core/workflow/template/system/aiChat/index.ts @@ -55,7 +55,7 @@ export const AiChatModule: FlowNodeTemplateType = { showStatus: true, isTool: true, courseUrl: '/docs/guide/workbench/workflow/ai_chat/', - version: '4813', + version: '490', inputs: [ Input_Template_SettingAiModel, // --- settings modal diff --git a/packages/global/core/workflow/template/system/tools.ts b/packages/global/core/workflow/template/system/tools.ts index 8ef75d9f5..672deaffa 100644 --- a/packages/global/core/workflow/template/system/tools.ts +++ b/packages/global/core/workflow/template/system/tools.ts @@ -58,6 +58,13 @@ export const ToolModule: FlowNodeTemplateType = { valueType: WorkflowIOValueTypeEnum.boolean, value: true }, + { + key: NodeInputKeyEnum.aiChatReasoning, + renderTypeList: [FlowNodeInputTypeEnum.hidden], + label: '', + valueType: WorkflowIOValueTypeEnum.boolean, + value: true + }, { key: NodeInputKeyEnum.aiChatTopP, renderTypeList: [FlowNodeInputTypeEnum.hidden], diff --git a/packages/service/common/file/read/utils.ts b/packages/service/common/file/read/utils.ts index 406c9f32f..2c943c6b1 100644 --- a/packages/service/common/file/read/utils.ts +++ b/packages/service/common/file/read/utils.ts @@ -245,7 +245,7 @@ export const readRawContentByFileBuffer = async ({ if (result_data.data.status === 'success') { const result = result_data.data.result.pages .map((page) => page.md) - .join('\n') + .join('') // Do some post-processing .replace(/\\[\(\)]/g, '$') .replace(/\\[\[\]]/g, '$$') diff --git a/packages/service/core/ai/config/provider/Moonshot.json b/packages/service/core/ai/config/provider/Moonshot.json index 796c529b8..f33b09ebe 100644 --- a/packages/service/core/ai/config/provider/Moonshot.json +++ b/packages/service/core/ai/config/provider/Moonshot.json @@ -75,6 +75,81 @@ "showTopP": true, "showStopSign": true, "responseFormatList": ["text", "json_object"] + }, + { + "model": "moonshot-v1-8k-vision-preview", + "name": "moonshot-v1-8k-vision-preview", + "maxContext": 8000, + "maxResponse": 4000, + "quoteMaxToken": 6000, + "maxTemperature": 1, + "vision": true, + "toolChoice": true, + "functionCall": false, + "defaultSystemChatPrompt": "", + "datasetProcess": true, + "usedInClassify": true, + "customCQPrompt": "", + "usedInExtractFields": true, + "usedInQueryExtension": true, + "customExtractPrompt": "", + "usedInToolCall": true, + "defaultConfig": {}, + "fieldMap": {}, + "type": "llm", + "showTopP": true, + "showStopSign": true, + "responseFormatList": ["text", "json_object"] + }, + { + "model": "moonshot-v1-32k-vision-preview", + "name": "moonshot-v1-32k-vision-preview", + "maxContext": 32000, + "maxResponse": 4000, + "quoteMaxToken": 32000, + "maxTemperature": 1, + "vision": true, + "toolChoice": true, + "functionCall": false, + "defaultSystemChatPrompt": "", + "datasetProcess": true, + "usedInClassify": true, + "customCQPrompt": "", + "usedInExtractFields": true, + "usedInQueryExtension": true, + "customExtractPrompt": "", + "usedInToolCall": true, + "defaultConfig": {}, + "fieldMap": {}, + "type": "llm", + "showTopP": true, + "showStopSign": true, + "responseFormatList": ["text", "json_object"] + }, + { + "model": "moonshot-v1-128k-vision-preview", + "name": "moonshot-v1-128k-vision-preview", + "maxContext": 128000, + "maxResponse": 4000, + "quoteMaxToken": 60000, + "maxTemperature": 1, + "vision": true, + "toolChoice": true, + "functionCall": false, + "defaultSystemChatPrompt": "", + "datasetProcess": true, + "usedInClassify": true, + "customCQPrompt": "", + "usedInExtractFields": true, + "usedInQueryExtension": true, + "customExtractPrompt": "", + "usedInToolCall": true, + "defaultConfig": {}, + "fieldMap": {}, + "type": "llm", + "showTopP": true, + "showStopSign": true, + "responseFormatList": ["text", "json_object"] } ] } diff --git a/packages/service/core/app/templates/templateSchema.ts b/packages/service/core/app/templates/templateSchema.ts index 2485f535f..826437412 100644 --- a/packages/service/core/app/templates/templateSchema.ts +++ b/packages/service/core/app/templates/templateSchema.ts @@ -9,41 +9,23 @@ const AppTemplateSchema = new Schema({ type: String, required: true }, - name: { - type: String - }, - intro: { - type: String - }, - avatar: { - type: String - }, - author: { - type: String - }, + name: String, + intro: String, + avatar: String, + author: String, tags: { type: [String], default: undefined }, - type: { - type: String - }, - isActive: { - type: Boolean - }, - userGuide: { - type: Object - }, - isQuickTemplate: { - type: Boolean - }, + type: String, + isActive: Boolean, + userGuide: Object, + isQuickTemplate: Boolean, order: { type: Number, default: -1 }, - workflow: { - type: Object - } + workflow: Object }); AppTemplateSchema.index({ templateId: 1 }); diff --git a/packages/service/core/workflow/dispatch/agent/runTool/index.ts b/packages/service/core/workflow/dispatch/agent/runTool/index.ts index d0f99583f..b10b57eac 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/index.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/index.ts @@ -55,7 +55,8 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise< userChatInput, history = 6, fileUrlList: fileLinks, - aiChatVision + aiChatVision, + aiChatReasoning } } = props; @@ -63,6 +64,9 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise< const useVision = aiChatVision && toolModel.vision; const chatHistories = getHistories(history, histories); + props.params.aiChatVision = aiChatVision && toolModel.vision; + props.params.aiChatReasoning = aiChatReasoning && toolModel.reasoning; + const toolNodeIds = filterToolNodeIdByEdges({ nodeId, edges: runtimeEdges }); // Gets the module to which the tool is connected diff --git a/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts b/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts index 58e95a059..c5c0cb4bd 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts @@ -24,7 +24,12 @@ import { import { AIChatItemType } from '@fastgpt/global/core/chat/type'; import { GPTMessages2Chats } from '@fastgpt/global/core/chat/adapt'; import { formatToolResponse, initToolCallEdges, initToolNodes } from './utils'; -import { computedMaxToken, llmCompletionsBodyFormat } from '../../../../ai/utils'; +import { + computedMaxToken, + llmCompletionsBodyFormat, + parseReasoningContent, + parseReasoningStreamContent +} from '../../../../ai/utils'; import { WorkflowResponseType } from '../../type'; import { toolValueTypeList } from '@fastgpt/global/core/workflow/constants'; import { WorkflowInteractiveResponseType } from '@fastgpt/global/core/workflow/template/system/interactive/type'; @@ -58,6 +63,7 @@ export const runToolWithPromptCall = async ( temperature, maxToken, aiChatVision, + aiChatReasoning, aiChatTopP, aiChatStopSign, aiChatResponseFormat, @@ -216,7 +222,7 @@ export const runToolWithPromptCall = async ( const [requestMessages] = await Promise.all([ loadRequestMessages({ messages: filterMessages, - useVision: toolModel.vision && aiChatVision, + useVision: aiChatVision, origin: requestOrigin }) ]); @@ -251,22 +257,46 @@ export const runToolWithPromptCall = async ( } }); - const answer = await (async () => { + const { answer, reasoning } = await (async () => { if (res && isStreamResponse) { - const { answer } = await streamResponse({ + const { answer, reasoning } = await streamResponse({ res, toolNodes, stream: aiResponse, - workflowStreamResponse + workflowStreamResponse, + aiChatReasoning }); - return answer; + return { answer, reasoning }; } else { - const result = aiResponse as ChatCompletion; + const content = aiResponse.choices?.[0]?.message?.content || ''; + const reasoningContent: string = aiResponse.choices?.[0]?.message?.reasoning_content || ''; - return result.choices?.[0]?.message?.content || ''; + // API already parse reasoning content + if (reasoningContent || !aiChatReasoning) { + return { + answer: content, + reasoning: reasoningContent + }; + } + + const [think, answer] = parseReasoningContent(content); + return { + answer, + reasoning: think + }; } })(); + + if (stream && !isStreamResponse && aiChatReasoning && reasoning) { + workflowStreamResponse?.({ + event: SseResponseEventEnum.fastAnswer, + data: textAdaptGptResponse({ + reasoning_content: reasoning + }) + }); + } + const { answer: replaceAnswer, toolJson } = parseAnswer(answer); if (!answer && !toolJson) { return Promise.reject(getEmptyResponseTip()); @@ -294,11 +324,16 @@ export const runToolWithPromptCall = async ( } // No tool is invoked, indicating that the process is over - const gptAssistantResponse: ChatCompletionAssistantMessageParam = { + const gptAssistantResponse: ChatCompletionMessageParam = { role: ChatCompletionRequestMessageRoleEnum.Assistant, - content: replaceAnswer + content: replaceAnswer, + reasoning_text: reasoning }; - const completeMessages = filterMessages.concat(gptAssistantResponse); + const completeMessages = filterMessages.concat({ + ...gptAssistantResponse, + reasoning_text: undefined + }); + const inputTokens = await countGptMessagesTokens(requestMessages); const outputTokens = await countGptMessagesTokens([gptAssistantResponse]); @@ -379,9 +414,10 @@ export const runToolWithPromptCall = async ( })(); // 合并工具调用的结果,使用 functionCall 格式存储。 - const assistantToolMsgParams: ChatCompletionAssistantMessageParam = { + const assistantToolMsgParams: ChatCompletionMessageParam = { role: ChatCompletionRequestMessageRoleEnum.Assistant, - function_call: toolJson + function_call: toolJson, + reasoning_text: reasoning }; // Only toolCall tokens are counted here, Tool response tokens count towards the next reply @@ -502,12 +538,14 @@ ANSWER: `; async function streamResponse({ res, stream, - workflowStreamResponse + workflowStreamResponse, + aiChatReasoning }: { res: NextApiResponse; toolNodes: ToolNodeItemType[]; stream: StreamChatType; workflowStreamResponse?: WorkflowResponseType; + aiChatReasoning?: boolean; }) { const write = responseWriteController({ res, @@ -515,7 +553,9 @@ async function streamResponse({ }); let startResponseWrite = false; - let textAnswer = ''; + let answer = ''; + let reasoning = ''; + const { parsePart, getStartTagBuffer } = parseReasoningStreamContent(); for await (const part of stream) { if (res.closed) { @@ -523,13 +563,21 @@ async function streamResponse({ break; } - const responseChoice = part.choices?.[0]?.delta; - // console.log(responseChoice, '---==='); + const [reasoningContent, content] = parsePart(part, aiChatReasoning); + answer += content; + reasoning += reasoningContent; - if (responseChoice?.content) { - const content = responseChoice?.content || ''; - textAnswer += content; + if (aiChatReasoning && reasoningContent) { + workflowStreamResponse?.({ + write, + event: SseResponseEventEnum.answer, + data: textAdaptGptResponse({ + reasoning_content: reasoningContent + }) + }); + } + if (content) { if (startResponseWrite) { workflowStreamResponse?.({ write, @@ -538,18 +586,20 @@ async function streamResponse({ text: content }) }); - } else if (textAnswer.length >= 3) { - textAnswer = textAnswer.trim(); - if (textAnswer.startsWith('0')) { + } else if (answer.length >= 3) { + answer = answer.trimStart(); + if (/0(:|:)/.test(answer)) { startResponseWrite = true; + // find first : index - const firstIndex = textAnswer.indexOf(':'); - textAnswer = textAnswer.substring(firstIndex + 1).trim(); + const firstIndex = + answer.indexOf('0:') !== -1 ? answer.indexOf('0:') : answer.indexOf('0:'); + answer = answer.substring(firstIndex + 2).trim(); workflowStreamResponse?.({ write, event: SseResponseEventEnum.answer, data: textAdaptGptResponse({ - text: textAnswer + text: answer }) }); } @@ -557,7 +607,23 @@ async function streamResponse({ } } - return { answer: textAnswer.trim() }; + if (answer === '') { + answer = getStartTagBuffer(); + if (/0(:|:)/.test(answer)) { + // find first : index + const firstIndex = answer.indexOf('0:') !== -1 ? answer.indexOf('0:') : answer.indexOf('0:'); + answer = answer.substring(firstIndex + 2).trim(); + workflowStreamResponse?.({ + write, + event: SseResponseEventEnum.answer, + data: textAdaptGptResponse({ + text: answer + }) + }); + } + } + + return { answer, reasoning }; } const parseAnswer = ( @@ -568,8 +634,7 @@ const parseAnswer = ( } => { str = str.trim(); // 首先,使用正则表达式提取TOOL_ID和TOOL_ARGUMENTS - const prefixReg = /^1(:|:)/; - const answerPrefixReg = /^0(:|:)/; + const prefixReg = /1(:|:)/; if (prefixReg.test(str)) { const toolString = sliceJsonStr(str); @@ -585,13 +650,21 @@ const parseAnswer = ( } }; } catch (error) { - return { - answer: ERROR_TEXT - }; + if (/^1(:|:)/.test(str)) { + return { + answer: ERROR_TEXT + }; + } else { + return { + answer: str + }; + } } } else { + const firstIndex = str.indexOf('0:') !== -1 ? str.indexOf('0:') : str.indexOf('0:'); + const answer = str.substring(firstIndex + 2).trim(); return { - answer: str.replace(answerPrefixReg, '') + answer }; } }; diff --git a/packages/service/core/workflow/dispatch/agent/runTool/type.d.ts b/packages/service/core/workflow/dispatch/agent/runTool/type.d.ts index 64ecd79fc..61cb6b217 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/type.d.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/type.d.ts @@ -22,6 +22,7 @@ export type DispatchToolModuleProps = ModuleDispatchProps<{ [NodeInputKeyEnum.aiChatTemperature]: number; [NodeInputKeyEnum.aiChatMaxToken]: number; [NodeInputKeyEnum.aiChatVision]?: boolean; + [NodeInputKeyEnum.aiChatReasoning]?: boolean; [NodeInputKeyEnum.aiChatTopP]?: number; [NodeInputKeyEnum.aiChatStopSign]?: string; [NodeInputKeyEnum.aiChatResponseFormat]?: string; diff --git a/packages/service/core/workflow/dispatch/chat/oneapi.ts b/packages/service/core/workflow/dispatch/chat/oneapi.ts index 41df8e31d..07035a826 100644 --- a/packages/service/core/workflow/dispatch/chat/oneapi.ts +++ b/packages/service/core/workflow/dispatch/chat/oneapi.ts @@ -563,6 +563,15 @@ async function streamResponse({ // if answer is empty, try to get value from startTagBuffer. (Cause: The response content is too short to exceed the minimum parse length) if (answer === '') { answer = getStartTagBuffer(); + if (isResponseAnswerText && answer) { + workflowStreamResponse?.({ + write, + event: SseResponseEventEnum.answer, + data: textAdaptGptResponse({ + text: answer + }) + }); + } } return { answer, reasoning }; diff --git a/packages/service/worker/readFile/index.ts b/packages/service/worker/readFile/index.ts index 625191a39..45092ed72 100644 --- a/packages/service/worker/readFile/index.ts +++ b/packages/service/worker/readFile/index.ts @@ -27,7 +27,9 @@ parentPort?.on('message', async (props: ReadRawTextProps) => { case 'csv': return readCsvRawText(params); default: - return Promise.reject('Only support .txt, .md, .html, .pdf, .docx, pptx, .csv, .xlsx'); + return Promise.reject( + `Only support .txt, .md, .html, .pdf, .docx, pptx, .csv, .xlsx. "${params.extension}" is not supported.` + ); } }; diff --git a/projects/app/src/pageComponents/account/model/Channel/index.tsx b/projects/app/src/pageComponents/account/model/Channel/index.tsx index 0f6ed2142..795cfd521 100644 --- a/projects/app/src/pageComponents/account/model/Channel/index.tsx +++ b/projects/app/src/pageComponents/account/model/Channel/index.tsx @@ -139,14 +139,14 @@ const ChannelTable = ({ Tab }: { Tab: React.ReactNode }) => { { const val = (() => { - if (!e) return 0; + if (!e) return 1; return e; })(); updateChannel({ diff --git a/projects/app/src/web/core/ai/channel.ts b/projects/app/src/web/core/ai/channel.ts index b7a10061b..fd4534a3f 100644 --- a/projects/app/src/web/core/ai/channel.ts +++ b/projects/app/src/web/core/ai/channel.ts @@ -130,7 +130,8 @@ export const postCreateChannel = (data: CreateChannelProps) => base_url: data.base_url, models: data.models, model_mapping: data.model_mapping, - key: data.key + key: data.key, + priority: 1 }); export const putChannelStatus = (id: number, status: ChannelStatusEnum) => @@ -146,7 +147,7 @@ export const putChannel = (data: ChannelInfoType) => model_mapping: data.model_mapping, key: data.key, status: data.status, - priority: data.priority + priority: data.priority ? Math.max(data.priority, 1) : undefined }); export const deleteChannel = (id: number) => DELETE(`/channel/${id}`);