Compare commits
12 Commits
v4.6.4
...
v4.6.5-alp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd682d4275 | ||
|
|
41115a96c0 | ||
|
|
b14a1db2f9 | ||
|
|
703583fff7 | ||
|
|
d33c99f564 | ||
|
|
05bf1b2265 | ||
|
|
dd7b4b98ae | ||
|
|
34656dfda0 | ||
|
|
7b5c35018b | ||
|
|
7630417679 | ||
|
|
63ce76413e | ||
|
|
1c1305fcb6 |
@@ -8,4 +8,5 @@ README.md
|
|||||||
|
|
||||||
.yalc/
|
.yalc/
|
||||||
yalc.lock
|
yalc.lock
|
||||||
testApi/
|
testApi/
|
||||||
|
*.local.*
|
||||||
3
.gitignore
vendored
@@ -35,4 +35,5 @@ dist/
|
|||||||
**/.hugo_build.lock
|
**/.hugo_build.lock
|
||||||
docSite/public/
|
docSite/public/
|
||||||
docSite/resources/_gen/
|
docSite/resources/_gen/
|
||||||
docSite/.vercel
|
docSite/.vercel
|
||||||
|
*.local.*
|
||||||
69
Dockerfile
@@ -1,57 +1,86 @@
|
|||||||
# Install dependencies only when needed
|
# --------- install dependence -----------
|
||||||
FROM node:18.15-alpine AS deps
|
FROM node:18.17-alpine AS mainDeps
|
||||||
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
|
|
||||||
RUN apk add --no-cache libc6-compat && npm install -g pnpm
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
ARG name
|
ARG name
|
||||||
|
ARG proxy
|
||||||
|
|
||||||
|
RUN [ -z "$proxy" ] || sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
|
||||||
|
RUN apk add --no-cache libc6-compat && npm install -g pnpm@8.6.0
|
||||||
|
# if proxy exists, set proxy
|
||||||
|
RUN [ -z "$proxy" ] || pnpm config set registry https://registry.npm.taobao.org
|
||||||
|
|
||||||
# copy packages and one project
|
# copy packages and one project
|
||||||
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
|
||||||
COPY ./packages ./packages
|
COPY ./packages ./packages
|
||||||
COPY ./projects/$name/package.json ./projects/$name/package.json
|
COPY ./projects/$name/package.json ./projects/$name/package.json
|
||||||
|
|
||||||
RUN [ -f pnpm-lock.yaml ] || (echo "Lockfile not found." && exit 1)
|
RUN [ -f pnpm-lock.yaml ] || (echo "Lockfile not found." && exit 1)
|
||||||
|
|
||||||
RUN pnpm install
|
RUN pnpm i
|
||||||
|
|
||||||
# Rebuild the source code only when needed
|
# --------- install dependence -----------
|
||||||
FROM node:18.15-alpine AS builder
|
FROM node:18.17-alpine AS workerDeps
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
ARG proxy
|
||||||
|
|
||||||
|
RUN [ -z "$proxy" ] || sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
|
||||||
|
RUN apk add --no-cache libc6-compat && npm install -g pnpm@8.6.0
|
||||||
|
# if proxy exists, set proxy
|
||||||
|
RUN [ -z "$proxy" ] || pnpm config set registry https://registry.npm.taobao.org
|
||||||
|
|
||||||
|
COPY ./worker /app/worker
|
||||||
|
RUN cd /app/worker && pnpm i --production --ignore-workspace
|
||||||
|
|
||||||
|
# --------- builder -----------
|
||||||
|
FROM node:18.17-alpine AS builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
ARG name
|
ARG name
|
||||||
|
ARG proxy
|
||||||
|
|
||||||
# copy common node_modules and one project node_modules
|
# copy common node_modules and one project node_modules
|
||||||
COPY package.json pnpm-workspace.yaml ./
|
COPY package.json pnpm-workspace.yaml ./
|
||||||
COPY --from=deps /app/node_modules ./node_modules
|
COPY --from=mainDeps /app/node_modules ./node_modules
|
||||||
COPY --from=deps /app/packages ./packages
|
COPY --from=mainDeps /app/packages ./packages
|
||||||
COPY ./projects/$name ./projects/$name
|
COPY ./projects/$name ./projects/$name
|
||||||
COPY --from=deps /app/projects/$name/node_modules ./projects/$name/node_modules
|
COPY --from=mainDeps /app/projects/$name/node_modules ./projects/$name/node_modules
|
||||||
|
|
||||||
# Uncomment the following line in case you want to disable telemetry during the build.
|
RUN [ -z "$proxy" ] || sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
|
||||||
ENV NEXT_TELEMETRY_DISABLED 1
|
|
||||||
RUN npm install -g pnpm
|
|
||||||
RUN pnpm --filter=$name run build
|
|
||||||
|
|
||||||
FROM node:18.15-alpine AS runner
|
RUN apk add --no-cache libc6-compat && npm install -g pnpm@8.6.0
|
||||||
|
RUN pnpm --filter=$name build
|
||||||
|
|
||||||
|
# --------- runner -----------
|
||||||
|
FROM node:18.17-alpine AS runner
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
ARG name
|
ARG name
|
||||||
|
ARG proxy
|
||||||
|
|
||||||
# create user and use it
|
# create user and use it
|
||||||
RUN addgroup --system --gid 1001 nodejs
|
RUN addgroup --system --gid 1001 nodejs
|
||||||
RUN adduser --system --uid 1001 nextjs
|
RUN adduser --system --uid 1001 nextjs
|
||||||
|
|
||||||
|
RUN [ -z "$proxy" ] || sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
|
||||||
RUN apk add --no-cache curl ca-certificates \
|
RUN apk add --no-cache curl ca-certificates \
|
||||||
&& update-ca-certificates
|
&& update-ca-certificates
|
||||||
|
|
||||||
# copy running files
|
# copy running files
|
||||||
COPY --from=builder /app/projects/$name/public ./projects/$name/public
|
COPY --from=builder /app/projects/$name/public /app/projects/$name/public
|
||||||
COPY --from=builder /app/projects/$name/next.config.js ./projects/$name/next.config.js
|
COPY --from=builder /app/projects/$name/next.config.js /app/projects/$name/next.config.js
|
||||||
COPY --from=builder --chown=nextjs:nodejs /app/projects/$name/.next/standalone ./
|
COPY --from=builder --chown=nextjs:nodejs /app/projects/$name/.next/standalone /app/
|
||||||
COPY --from=builder --chown=nextjs:nodejs /app/projects/$name/.next/static ./projects/$name/.next/static
|
COPY --from=builder --chown=nextjs:nodejs /app/projects/$name/.next/static /app/projects/$name/.next/static
|
||||||
# copy package.json to version file
|
# copy package.json to version file
|
||||||
COPY --from=builder /app/projects/$name/package.json ./package.json
|
COPY --from=builder /app/projects/$name/package.json ./package.json
|
||||||
|
# copy woker
|
||||||
|
COPY --from=workerDeps /app/worker /app/worker
|
||||||
|
# copy config
|
||||||
|
COPY ./projects/$name/data/config.json /app/data/config.json
|
||||||
|
COPY ./projects/$name/data/pluginTemplates /app/data/pluginTemplates
|
||||||
|
COPY ./projects/$name/data/simpleTemplates /app/data/simpleTemplates
|
||||||
|
|
||||||
|
|
||||||
ENV NODE_ENV production
|
ENV NODE_ENV production
|
||||||
ENV NEXT_TELEMETRY_DISABLED 1
|
ENV NEXT_TELEMETRY_DISABLED 1
|
||||||
|
|||||||
65
README.md
@@ -50,19 +50,20 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
|
|
||||||
## 💡 功能
|
## 💡 功能
|
||||||
|
|
||||||
1. 强大的可视化编排,轻松构建 AI 应用
|
`1` 强大的可视化编排,轻松构建 AI 应用
|
||||||
- [x] 提供简易模式,无需操作编排
|
- [x] 提供简易模式,无需操作编排
|
||||||
- [x] 用户对话前引导,全局字符串变量
|
- [x] 用户对话前引导,全局字符串变量
|
||||||
- [x] 知识库搜索
|
- [x] 知识库搜索
|
||||||
- [x] 多 LLM 模型对话
|
- [x] 多 LLM 模型对话
|
||||||
- [x] 文本内容提取成结构化数据
|
- [x] 文本内容提取成结构化数据
|
||||||
- [x] HTTP 扩展
|
- [x] HTTP 扩展
|
||||||
- [ ] 嵌入 Laf,实现在线编写 HTTP 模块
|
- [ ] 嵌入 [Laf](https://github.com/labring/laf),实现在线编写 HTTP 模块
|
||||||
- [x] 对话下一步指引
|
- [x] 对话下一步指引
|
||||||
- [ ] 对话多路线选择
|
- [ ] 对话多路线选择
|
||||||
- [x] 源文件引用追踪
|
- [x] 源文件引用追踪
|
||||||
- [x] 模块封装,实现多级复用
|
- [x] 模块封装,实现多级复用
|
||||||
2. 丰富的知识库预处理
|
|
||||||
|
`2` 丰富的知识库预处理
|
||||||
- [x] 多库复用,混用
|
- [x] 多库复用,混用
|
||||||
- [x] chunk 记录修改和删除
|
- [x] chunk 记录修改和删除
|
||||||
- [x] 支持手动输入,直接分段,QA 拆分导入
|
- [x] 支持手动输入,直接分段,QA 拆分导入
|
||||||
@@ -70,15 +71,18 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
- [x] 支持知识库单独设置向量模型
|
- [x] 支持知识库单独设置向量模型
|
||||||
- [x] 源文件存储
|
- [x] 源文件存储
|
||||||
- [ ] 文件学习 Agent
|
- [ ] 文件学习 Agent
|
||||||
3. 多种效果测试渠道
|
|
||||||
|
`3` 多种效果测试渠道
|
||||||
- [x] 知识库单点搜索测试
|
- [x] 知识库单点搜索测试
|
||||||
- [x] 对话时反馈引用并可修改与删除
|
- [x] 对话时反馈引用并可修改与删除
|
||||||
- [x] 完整上下文呈现
|
- [x] 完整上下文呈现
|
||||||
- [x] 完整模块中间值呈现
|
- [x] 完整模块中间值呈现
|
||||||
4. OpenAPI
|
|
||||||
|
`4` OpenAPI
|
||||||
- [x] completions 接口 (对齐 GPT 接口)
|
- [x] completions 接口 (对齐 GPT 接口)
|
||||||
- [ ] 知识库 CRUD
|
- [ ] 知识库 CRUD
|
||||||
5. 运营功能
|
|
||||||
|
`5` 运营功能
|
||||||
- [x] 免登录分享窗口
|
- [x] 免登录分享窗口
|
||||||
- [x] Iframe 一键嵌入
|
- [x] Iframe 一键嵌入
|
||||||
- [x] 统一查阅对话记录,并对数据进行标注
|
- [x] 统一查阅对话记录,并对数据进行标注
|
||||||
@@ -93,7 +97,7 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
|
|
||||||
- **⚡ 快速部署**
|
- **⚡ 快速部署**
|
||||||
|
|
||||||
> Sealos 的服务器在国外,不需要额外处理网络问题,无需服务器、无需魔法、无需域名,支持高并发 & 动态伸缩。点击以下按钮即可一键部署 👇
|
> [Sealos](https://sealos.io) 的服务器在国外,不需要额外处理网络问题,无需服务器、无需魔法、无需域名,支持高并发 & 动态伸缩。点击以下按钮即可一键部署 👇
|
||||||
|
|
||||||
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt)
|
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt)
|
||||||
|
|
||||||
@@ -142,7 +146,7 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
## 🤝 第三方生态
|
## 🌿 第三方生态
|
||||||
|
|
||||||
- [OnWeChat 个人微信/企微机器人](https://doc.fastgpt.in/docs/use-cases/onwechat/)
|
- [OnWeChat 个人微信/企微机器人](https://doc.fastgpt.in/docs/use-cases/onwechat/)
|
||||||
|
|
||||||
@@ -150,9 +154,50 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
## 🤝 参与贡献
|
||||||
|
|
||||||
|
我们非常欢迎各种形式的贡献。如果你对贡献代码感兴趣,可以查看我们的 GitHub [Issues](https://github.com/labring/FastGPT/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc),大展身手,向我们展示你的奇思妙想。
|
||||||
|
|
||||||
|
<a href="https://github.com/labring/FastGPT/graphs/contributors" target="_blank">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th colspan="2">
|
||||||
|
<br><img src="https://contrib.rocks/image?repo=labring/FastGPT"><br><br>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<picture>
|
||||||
|
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=active&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=dark">
|
||||||
|
<img alt="Active participants of labring - past 28 days" src="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=active&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=light">
|
||||||
|
</picture>
|
||||||
|
</td>
|
||||||
|
<td rowspan="2">
|
||||||
|
<picture>
|
||||||
|
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-org-participants-growth/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=4x7&color_scheme=dark">
|
||||||
|
<img alt="New trends of labring" src="https://next.ossinsight.io/widgets/official/compose-org-participants-growth/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=4x7&color_scheme=light">
|
||||||
|
</picture>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<picture>
|
||||||
|
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=dark">
|
||||||
|
<img alt="New participants of labring - past 28 days" src="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=light">
|
||||||
|
</picture>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</a>
|
||||||
|
|
||||||
## 🌟 Star History
|
## 🌟 Star History
|
||||||
|
|
||||||
[](https://star-history.com/#labring/FastGPT&Date)
|
<a href="https://github.com/labring/FastGPT/stargazers" target="_blank" style="display: block" align="center">
|
||||||
|
<picture>
|
||||||
|
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/analyze-repo-stars-history/thumbnail.png?repo_id=605673387&image_size=auto&color_scheme=dark">
|
||||||
|
<img alt="Star History of labring/FastGPT" src="https://next.ossinsight.io/widgets/official/analyze-repo-stars-history/thumbnail.png?repo_id=605673387&image_size=auto&color_scheme=light">
|
||||||
|
</picture>
|
||||||
|
</a>
|
||||||
|
|
||||||
<a href="#readme">
|
<a href="#readme">
|
||||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||||
@@ -165,4 +210,4 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
|
|||||||
1. 允许作为后台服务直接商用,但不允许提供 SaaS 服务。
|
1. 允许作为后台服务直接商用,但不允许提供 SaaS 服务。
|
||||||
2. 未经商业授权,任何形式的商用服务均需保留相关版权信息。
|
2. 未经商业授权,任何形式的商用服务均需保留相关版权信息。
|
||||||
3. 完整请查看 [FastGPT Open Source License](./LICENSE)
|
3. 完整请查看 [FastGPT Open Source License](./LICENSE)
|
||||||
4. 联系方式:yujinlong@sealos.io,[点击查看商业版定价策略](https://doc.fastgpt.in/docs/commercial)
|
4. 联系方式:yujinlong@sealos.io,[点击查看商业版定价策略](https://doc.fastgpt.in/docs/commercial)
|
||||||
BIN
docSite/assets/imgs/coreferenceResolution1.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
docSite/assets/imgs/coreferenceResolution2.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
docSite/assets/imgs/coreferenceResolution3.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
docSite/assets/imgs/customfeedback1.png
Normal file
|
After Width: | Height: | Size: 459 KiB |
BIN
docSite/assets/imgs/customfeedback2.png
Normal file
|
After Width: | Height: | Size: 599 KiB |
BIN
docSite/assets/imgs/customfeedback3.png
Normal file
|
After Width: | Height: | Size: 267 KiB |
BIN
docSite/assets/imgs/customfeedback4.png
Normal file
|
After Width: | Height: | Size: 252 KiB |
BIN
docSite/assets/imgs/data_search1.png
Normal file
|
After Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 485 KiB After Width: | Height: | Size: 2.4 MiB |
|
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 2.1 MiB |
|
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 353 KiB |
|
Before Width: | Height: | Size: 205 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 178 KiB |
BIN
docSite/assets/imgs/demo-appointment8.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
docSite/assets/imgs/demo-appointment9.png
Normal file
|
After Width: | Height: | Size: 291 KiB |
|
Before Width: | Height: | Size: 294 KiB |
|
Before Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 336 KiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 162 KiB |
BIN
docSite/assets/imgs/judgement1.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
docSite/assets/imgs/onSealos1.png
Normal file
|
After Width: | Height: | Size: 174 KiB |
BIN
docSite/assets/imgs/onsealos10.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
docSite/assets/imgs/onsealos12.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
docSite/assets/imgs/onsealos2.png
Normal file
|
After Width: | Height: | Size: 247 KiB |
BIN
docSite/assets/imgs/onsealos3.png
Normal file
|
After Width: | Height: | Size: 286 KiB |
BIN
docSite/assets/imgs/onsealos4.png
Normal file
|
After Width: | Height: | Size: 95 KiB |
BIN
docSite/assets/imgs/onsealos5.png
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
docSite/assets/imgs/onsealos6.png
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
docSite/assets/imgs/onsealos7.png
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
docSite/assets/imgs/onsealos8.png
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
docSite/assets/imgs/onsealos9.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
docSite/assets/imgs/onsealosl11.PNG
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
docSite/assets/imgs/sealos13.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
docSite/assets/imgs/string.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
40
docSite/content/docs/course/data_search.md
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
title: '知识库搜索参数'
|
||||||
|
description: '知识库搜索原理'
|
||||||
|
icon: 'language'
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 106
|
||||||
|
---
|
||||||
|
|
||||||
|
在知识库搜索的方式上,FastGPT提供了三种方式,分别为“语义检索”“增强语义检索”“混合检索”。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 语义检索
|
||||||
|
|
||||||
|
语义检索就是向量检索,同时把用户的问题和知识库内容向量化,然后通过“语义相关度匹配”的方式从知识库中查找到匹配的知识点。
|
||||||
|
|
||||||
|
优点:
|
||||||
|
- 相近语义理解
|
||||||
|
- 跨多语言理解(例如输入中文问题匹配英文知识点)
|
||||||
|
- 多模态理解(文本,图片,音视频等)
|
||||||
|
|
||||||
|
## 增强语义检索
|
||||||
|
|
||||||
|
在语义检索的基础上,增强“语义相关度匹配”并在搜索结束后进行 Rerank(重排)。
|
||||||
|
|
||||||
|
Rerank(重排):把检索结果按“与用户问题语义”相关性,从高到低排序,简单的说就是把最匹配用户问题的检索结果排在前面。
|
||||||
|
|
||||||
|
## 混合检索(推荐)
|
||||||
|
|
||||||
|
|
||||||
|
在向量检索的同时进行全文检索,并把两项检索的结果混合一起重排,以便选中匹配用户问题的最佳结果。
|
||||||
|
|
||||||
|
全文检索:理解为全文关键词检索,通过关键词查询知识库,并返回包含关键词的文本片段。
|
||||||
|
|
||||||
|
优点:
|
||||||
|
- 精确匹配(姓名,编号,ID等)
|
||||||
|
- 少量关键词匹配(当用户问题字数过少时向量检索效果非常不好)
|
||||||
|
|
||||||
|
混合检索结合了向量检索和全文检索的优点,并且对查询结果进行了重排,大大提高了命中率,推荐使用。
|
||||||
@@ -92,7 +92,7 @@ weight: 708
|
|||||||
"maxContext": 16000,
|
"maxContext": 16000,
|
||||||
"maxResponse": 4000,
|
"maxResponse": 4000,
|
||||||
"price": 0,
|
"price": 0,
|
||||||
"functionCall": true, // 是否支持function call, 不支持的模型需要设置为 false,会走提示词生成
|
"toolChoice": true, // 是否支持openai的 toolChoice, 不支持的模型需要设置为 false,会走提示词生成
|
||||||
"functionPrompt": ""
|
"functionPrompt": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -101,7 +101,7 @@ weight: 708
|
|||||||
"maxContext": 8000,
|
"maxContext": 8000,
|
||||||
"maxResponse": 8000,
|
"maxResponse": 8000,
|
||||||
"price": 0,
|
"price": 0,
|
||||||
"functionCall": true,
|
"toolChoice": true,
|
||||||
"functionPrompt": ""
|
"functionPrompt": ""
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -112,7 +112,7 @@ weight: 708
|
|||||||
"maxContext": 16000,
|
"maxContext": 16000,
|
||||||
"maxResponse": 4000,
|
"maxResponse": 4000,
|
||||||
"price": 0,
|
"price": 0,
|
||||||
"functionCall": true,
|
"toolChoice": true,
|
||||||
"functionPrompt": ""
|
"functionPrompt": ""
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ BATCH_UPDATE_ENABLED=true
|
|||||||
BATCH_UPDATE_INTERVAL=60
|
BATCH_UPDATE_INTERVAL=60
|
||||||
```
|
```
|
||||||
|
|
||||||
## 使用步骤
|
## One API使用步骤
|
||||||
|
|
||||||
### 1. 登录 One API
|
### 1. 登录 One API
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,9 @@ weight: 860
|
|||||||
"success": true,
|
"success": true,
|
||||||
"message": "错误提示",
|
"message": "错误提示",
|
||||||
"msg": "同message, 错误提示",
|
"msg": "同message, 错误提示",
|
||||||
"uid": "用户唯一凭证"
|
"data": {
|
||||||
|
"uid": "用户唯一凭证"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -80,7 +82,9 @@ curl --location --request POST '{{host}}/shareAuth/init' \
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"success": true,
|
"success": true,
|
||||||
"uid": "username123",
|
"data": {
|
||||||
|
"uid": "用户唯一凭证"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -129,7 +133,9 @@ curl --location --request POST '{{host}}/shareAuth/start' \
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"success": true,
|
"success": true,
|
||||||
"uid": "username123",
|
"data": {
|
||||||
|
"uid": "用户唯一凭证"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -41,4 +41,154 @@ Sealos 的服务器在国外,不需要额外处理网络问题,无需服务
|
|||||||
|
|
||||||
## 部署架构图
|
## 部署架构图
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
## Sealos 使用
|
||||||
|
|
||||||
|
### 简介
|
||||||
|
|
||||||
|
FastGPT 商业版共包含了3个应用(fastgpt, fastgpt-plus, fastgpt-admin)和2个数据库,使用多 Api Key 时候需要安装 OneAPI(一个应用和一个数据库),总计4个应用和3个数据库。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
点击右侧的详情,可以查看对应应用的详细信息。
|
||||||
|
|
||||||
|
### 如何更新/升级 FastGPT
|
||||||
|
[升级脚本文档](https://doc.fastgpt.in/docs/development/upgrading/)先看下文档,看下需要升级哪个版本。注意,不要跨版本升级!!!!!
|
||||||
|
|
||||||
|
例如,目前是4.5 版本,要升级到4.5.1,就先把镜像版本改成v4.5.1,执行一下升级脚本,等待完成后再继续升级。如果目标版本不需要执行初始化,则可以跳过。
|
||||||
|
|
||||||
|
升级步骤:
|
||||||
|
1. 打开sealos的应用管理
|
||||||
|
2. 有3个应用 fastgpt , fastgpt-plugin 和 fastgpt-admin
|
||||||
|
3. 点击对应应用右边3个点,变更。或者点详情后右上角的变更。
|
||||||
|
4. 修改镜像名栏
|
||||||
|

|
||||||
|
|
||||||
|
5. 点击变更/重启,会自动拉取最新镜像进行更新
|
||||||
|
6. 执行对应版本的初始化脚本
|
||||||
|
|
||||||
|
### 如何获取 FastGPT 访问链接
|
||||||
|
|
||||||
|
打开对应的应用,点击外网访问地址。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 配置自定义域名
|
||||||
|
|
||||||
|
点击对应应用的变更->点击自定义域名->填写域名-> 操作域名 Cname -> 确认 -> 确认变。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 如何修改配置文件
|
||||||
|
|
||||||
|
打开 Sealos 的应用管理 -> 找到对应的应用 -> 变更 -> 往下拉到高级配置,里面有个配置文件 -> 新增或点击对应的配置文件可以进行编辑 -> 点击右上角确认变。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[配置文件参考](https://doc.fastgpt.in/docs/development/configuration/)
|
||||||
|
|
||||||
|
FeConfig 参考下面(目前未做可视化)
|
||||||
|
```
|
||||||
|
"FeConfig": {
|
||||||
|
"show_emptyChat": false, // 是否展示聊天时空白的内容
|
||||||
|
"show_register": true, // 展示注册按键
|
||||||
|
"show_appStore": false, // 应用市场(暂时不可用)
|
||||||
|
"show_contact": false, // 联系方式(目前不可配置,直接false)
|
||||||
|
"show_git": false, // 展示 github
|
||||||
|
"show_doc": false, // 展示文档
|
||||||
|
"show_pay": true, // 展示支付
|
||||||
|
"show_openai_account": false, // 用户可自定义 openai key
|
||||||
|
"show_promotion": false, // 邀请好友机制
|
||||||
|
"docUrl": "https://doc.fastgpt.in", // 文档基本地址
|
||||||
|
"systemTitle": "FastGPT", // 系统的 title
|
||||||
|
"googleClientVerKey": "", // 谷歌 v3 校验前端凭证
|
||||||
|
"isPlus": true, // 直接设置 true
|
||||||
|
"oauth": { // oauth登录
|
||||||
|
"github": "",
|
||||||
|
"google": ""
|
||||||
|
},
|
||||||
|
"limit": {
|
||||||
|
"exportLimitMinutes": 0 // 导出间隔限制
|
||||||
|
},
|
||||||
|
"scripts": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 修改站点名称以及 favicon
|
||||||
|
修改应用的环境变量,增加
|
||||||
|
|
||||||
|
```
|
||||||
|
SYSTEM_NAME=FastGPT
|
||||||
|
SYSTEM_FAVICON=/favicon.ico
|
||||||
|
HOME_URL=/app/list
|
||||||
|
```
|
||||||
|
|
||||||
|
SYSTEM_FAVICON 可以是一个网络地址
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 挂载logo
|
||||||
|
目前暂时无法 把浏览器上的logo替换。仅支持svg,待后续可视化做了后可以全部替换。
|
||||||
|
新增一个挂载文件,文件名为:/app/projects/app/public/icon/logo.svg ,值为 svg 对应的值。
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
### 管理后台
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### 商业版镜像配置文件
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"license": "",
|
||||||
|
"system": {
|
||||||
|
"title": "" // 系统名称
|
||||||
|
},
|
||||||
|
"censor": {
|
||||||
|
"BAIDU_TEXT_CENSOR_CLIENTID": "", // 百度文本安全校验
|
||||||
|
"BAIDU_TEXT_CENSOR_CLIENTSECRET": "" // 百度文本安全校验
|
||||||
|
},
|
||||||
|
"auth": {
|
||||||
|
"googleServiceVerKey": "", // 谷歌 v3 校验
|
||||||
|
"github": { // github oauth
|
||||||
|
"clientId": "",
|
||||||
|
"secret": ""
|
||||||
|
},
|
||||||
|
"google": { // google oauth
|
||||||
|
"clientId": "",
|
||||||
|
"secret": ""
|
||||||
|
},
|
||||||
|
"email": { // 注册邮箱配置
|
||||||
|
"service": "qq",
|
||||||
|
"user": "",
|
||||||
|
"pass": ""
|
||||||
|
},
|
||||||
|
"phone": { // 阿里短信配置
|
||||||
|
"SNED_PHONE_ACCESSKEYID": "",
|
||||||
|
"SNED_PHONE_ACCESSSECRET": "",
|
||||||
|
"SNED_PHONE_SIGNNAME": "",
|
||||||
|
"SNED_PHONE_TEMPLATE": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pay": { // 微信支付配置
|
||||||
|
"wx": {
|
||||||
|
"WX_APPID": "",
|
||||||
|
"WX_MCHID": "",
|
||||||
|
"WX_V3_CODE": "",
|
||||||
|
"WX_NOTIFY_URL": "",
|
||||||
|
"WX_SERIAL_NO": "",
|
||||||
|
"WX_PRIVATE_KEY": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### One API 使用
|
||||||
|
|
||||||
|
[参考 OneAPI 使用步骤](/docs/development/one-api/)
|
||||||
@@ -32,7 +32,7 @@ curl --location --request POST 'https://{{host}}/api/admin/initv464' \
|
|||||||
4. 优化 - 历史记录模块。弃用旧的历史记录模块,直接在对应地方填写数值即可。
|
4. 优化 - 历史记录模块。弃用旧的历史记录模块,直接在对应地方填写数值即可。
|
||||||
5. 调整 - 知识库搜索模块 topk 逻辑,采用 MaxToken 计算,兼容不同长度的文本块
|
5. 调整 - 知识库搜索模块 topk 逻辑,采用 MaxToken 计算,兼容不同长度的文本块
|
||||||
6. 调整鉴权顺序,提高 apikey 的优先级,避免cookie抢占 apikey 的鉴权。
|
6. 调整鉴权顺序,提高 apikey 的优先级,避免cookie抢占 apikey 的鉴权。
|
||||||
7. 链接读取支持多选择器。参考[Web 站点同步用法](/docs/course/webSync)
|
7. 链接读取支持多选择器。参考[Web 站点同步用法](/docs/course/websync)
|
||||||
8. 修复 - 分享链接图片上传鉴权问题
|
8. 修复 - 分享链接图片上传鉴权问题
|
||||||
9. 修复 - Mongo 连接池未释放问题。
|
9. 修复 - Mongo 连接池未释放问题。
|
||||||
10. 修复 - Dataset Intro 无法更新
|
10. 修复 - Dataset Intro 无法更新
|
||||||
|
|||||||
31
docSite/content/docs/development/upgrading/465.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
title: 'V4.6.5(需要改配置文件)'
|
||||||
|
description: 'FastGPT V4.6.5'
|
||||||
|
icon: 'upgrade'
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 831
|
||||||
|
---
|
||||||
|
|
||||||
|
## 配置文件变更
|
||||||
|
|
||||||
|
由于 openai 已开始启用 function call,改为 toolChoice。FastGPT 同步的修改了对于的配置和调用方式,需要对配置文件做一些修改:
|
||||||
|
|
||||||
|
[点击查看最新的配置文件](/docs/development/configuration/)
|
||||||
|
|
||||||
|
主要是修改模型的`functionCall`字段,改成`toolChoice`即可。设置为`true`的模型,会默认走 openai 的 tools 模式;未设置或设置为`false`的,会走提示词生成模式。
|
||||||
|
|
||||||
|
问题补全模型与内容提取模型使用同一组配置。
|
||||||
|
|
||||||
|
## V4.6.5 功能介绍
|
||||||
|
|
||||||
|
1. 新增 - [问题补全模块](/docs/workflow/modules/coreferenceresolution/)
|
||||||
|
2. 新增 - [文本编辑模块](/docs/workflow/modules/text_editor/)
|
||||||
|
3. 新增 - [判断器模块](/docs/workflow/modules/tfswitch/)
|
||||||
|
4. 新增 - [自定义反馈模块](/docs/workflow/modules/custom_feedback/)
|
||||||
|
5. 新增 - 【内容提取】模块支持选择模型,以及字段枚举
|
||||||
|
6. 优化 - docx读取,兼容表格(表格转markdown)
|
||||||
|
7. 优化 - 高级编排连接线交互
|
||||||
|
8. 优化 - 由于 html2md 导致的 cpu密集计算,阻断线程问题
|
||||||
|
9. 修复 - 高级编排提示词提取描述
|
||||||
|
|
||||||
@@ -43,7 +43,6 @@ weight: 506
|
|||||||
AIBOTK_KEY=微秘书 APIKEY
|
AIBOTK_KEY=微秘书 APIKEY
|
||||||
AIBOTK_SECRET=微秘书 APISECRET
|
AIBOTK_SECRET=微秘书 APISECRET
|
||||||
WORK_PRO_TOKEN=你申请的企微 token (企业微信需要填写,私人微信不需要)
|
WORK_PRO_TOKEN=你申请的企微 token (企业微信需要填写,私人微信不需要)
|
||||||
WECHATY_PUPPET_SERVICE_AUTHORITY=token-service-discovery-test.juzibot.com(企业微信需要填写,私人微信不需要)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
这里最后两个变量只有部署企业微信才需要,私人微信只需要填写前两个即可。
|
这里最后两个变量只有部署企业微信才需要,私人微信只需要填写前两个即可。
|
||||||
@@ -56,7 +55,7 @@ WECHATY_PUPPET_SERVICE_AUTHORITY=token-service-discovery-test.juzibot.com(企
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
`WORK_PRO_TOKEN` [点击这里](https://tss.juzibot.com?aff=aibotk)申请 token 然后填入即可。
|
`WORK_PRO_TOKEN` [点击这里](https://tss.rpachat.com/?aff=aibotk)申请 token 然后填入即可。
|
||||||
|
|
||||||
`WECHATY_PUPPET_SERVICE_AUTHORITY`的值复制过去就可以。
|
`WECHATY_PUPPET_SERVICE_AUTHORITY`的值复制过去就可以。
|
||||||
|
|
||||||
|
|||||||
@@ -1,512 +0,0 @@
|
|||||||
---
|
|
||||||
title: '优化知识库搜索词'
|
|
||||||
description: '利用 GPT 优化和完善知识库搜索词,实现上下文关联搜索'
|
|
||||||
icon: 'search'
|
|
||||||
draft: false
|
|
||||||
toc: true
|
|
||||||
weight: 404
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
| 优化前 | 优化后 |
|
|
||||||
| --------------------- | --------------------- |
|
|
||||||
|  |  |
|
|
||||||
|
|
||||||
如上图,优化后的搜索可以针对【自动数据预处理】进行搜索,从而找到其相关的内容,一定程度上弥补了向量搜索的上下文缺失问题。
|
|
||||||
|
|
||||||
## 模块编排
|
|
||||||
|
|
||||||
复制下面配置,点击「高级编排」右上角的导入按键,导入该配置。
|
|
||||||
|
|
||||||
{{% details title="编排配置" closed="true" %}}
|
|
||||||
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"moduleId": "userChatInput",
|
|
||||||
"name": "用户问题(对话入口)",
|
|
||||||
"flowType": "questionInput",
|
|
||||||
"position": {
|
|
||||||
"x": 585.750318069507,
|
|
||||||
"y": 1597.4127130315183
|
|
||||||
},
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"key": "userChatInput",
|
|
||||||
"type": "systemInput",
|
|
||||||
"label": "用户问题",
|
|
||||||
"connected": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"key": "userChatInput",
|
|
||||||
"label": "用户问题",
|
|
||||||
"type": "source",
|
|
||||||
"valueType": "string",
|
|
||||||
"targets": [
|
|
||||||
{
|
|
||||||
"moduleId": "ssdd86",
|
|
||||||
"key": "content"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"moduleId": "history",
|
|
||||||
"name": "聊天记录",
|
|
||||||
"flowType": "historyNode",
|
|
||||||
"position": {
|
|
||||||
"x": 567.49877916803,
|
|
||||||
"y": 1289.3453864378014
|
|
||||||
},
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"key": "maxContext",
|
|
||||||
"type": "numberInput",
|
|
||||||
"label": "最长记录数",
|
|
||||||
"value": 6,
|
|
||||||
"min": 0,
|
|
||||||
"max": 50,
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "history",
|
|
||||||
"type": "hidden",
|
|
||||||
"label": "聊天记录",
|
|
||||||
"connected": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"key": "history",
|
|
||||||
"label": "聊天记录",
|
|
||||||
"valueType": "chatHistory",
|
|
||||||
"type": "source",
|
|
||||||
"targets": [
|
|
||||||
{
|
|
||||||
"moduleId": "ssdd86",
|
|
||||||
"key": "history"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"moduleId": "nkxlso",
|
|
||||||
"name": "知识库搜索",
|
|
||||||
"flowType": "datasetSearchNode",
|
|
||||||
"showStatus": true,
|
|
||||||
"position": {
|
|
||||||
"x": 1542.6434554710224,
|
|
||||||
"y": 1153.7853815737192
|
|
||||||
},
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"key": "kbList",
|
|
||||||
"type": "custom",
|
|
||||||
"label": "关联的知识库",
|
|
||||||
"value": [],
|
|
||||||
"list": [],
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "similarity",
|
|
||||||
"type": "slider",
|
|
||||||
"label": "相似度",
|
|
||||||
"value": 0.8,
|
|
||||||
"min": 0,
|
|
||||||
"max": 1,
|
|
||||||
"step": 0.01,
|
|
||||||
"markList": [
|
|
||||||
{
|
|
||||||
"label": "100",
|
|
||||||
"value": 100
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "1",
|
|
||||||
"value": 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "limit",
|
|
||||||
"type": "slider",
|
|
||||||
"label": "单次搜索上限",
|
|
||||||
"description": "最多取 n 条记录作为本次问题引用",
|
|
||||||
"value": 7,
|
|
||||||
"min": 1,
|
|
||||||
"max": 20,
|
|
||||||
"step": 1,
|
|
||||||
"markList": [
|
|
||||||
{
|
|
||||||
"label": "1",
|
|
||||||
"value": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "20",
|
|
||||||
"value": 20
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "switch",
|
|
||||||
"type": "target",
|
|
||||||
"label": "触发器",
|
|
||||||
"valueType": "any",
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "userChatInput",
|
|
||||||
"type": "target",
|
|
||||||
"label": "用户问题",
|
|
||||||
"required": true,
|
|
||||||
"valueType": "string",
|
|
||||||
"connected": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"key": "isEmpty",
|
|
||||||
"label": "搜索结果为空",
|
|
||||||
"type": "source",
|
|
||||||
"valueType": "boolean",
|
|
||||||
"targets": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "unEmpty",
|
|
||||||
"label": "搜索结果不为空",
|
|
||||||
"type": "source",
|
|
||||||
"valueType": "boolean",
|
|
||||||
"targets": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "quoteQA",
|
|
||||||
"label": "引用内容",
|
|
||||||
"description": "始终返回数组,如果希望搜索结果为空时执行额外操作,需要用到上面的两个输入以及目标模块的触发器",
|
|
||||||
"type": "source",
|
|
||||||
"valueType": "datasetQuote",
|
|
||||||
"targets": [
|
|
||||||
{
|
|
||||||
"moduleId": "ol82hp",
|
|
||||||
"key": "quoteQA"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"moduleId": "ol82hp",
|
|
||||||
"name": "AI 对话",
|
|
||||||
"flowType": "chatNode",
|
|
||||||
"showStatus": true,
|
|
||||||
"position": {
|
|
||||||
"x": 2207.4577044902126,
|
|
||||||
"y": 1079.6308003796544
|
|
||||||
},
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"key": "model",
|
|
||||||
"type": "custom",
|
|
||||||
"label": "对话模型",
|
|
||||||
"value": "gpt-3.5-turbo",
|
|
||||||
"list": [],
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "temperature",
|
|
||||||
"type": "slider",
|
|
||||||
"label": "温度",
|
|
||||||
"value": 0,
|
|
||||||
"min": 0,
|
|
||||||
"max": 10,
|
|
||||||
"step": 1,
|
|
||||||
"markList": [
|
|
||||||
{
|
|
||||||
"label": "严谨",
|
|
||||||
"value": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "发散",
|
|
||||||
"value": 10
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "maxToken",
|
|
||||||
"type": "custom",
|
|
||||||
"label": "回复上限",
|
|
||||||
"value": 2000,
|
|
||||||
"min": 100,
|
|
||||||
"max": 4000,
|
|
||||||
"step": 50,
|
|
||||||
"markList": [
|
|
||||||
{
|
|
||||||
"label": "100",
|
|
||||||
"value": 100
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "4000",
|
|
||||||
"value": 4000
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "systemPrompt",
|
|
||||||
"type": "textarea",
|
|
||||||
"label": "系统提示词",
|
|
||||||
"max": 300,
|
|
||||||
"valueType": "string",
|
|
||||||
"description": "模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}",
|
|
||||||
"placeholder": "模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}",
|
|
||||||
"value": "我会向你询问三引号引用中提及的内容,你仅使用提供的引用内容来回答我的问题,不要做额外的扩展补充。",
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "limitPrompt",
|
|
||||||
"type": "textarea",
|
|
||||||
"valueType": "string",
|
|
||||||
"label": "限定词",
|
|
||||||
"max": 500,
|
|
||||||
"description": "限定模型对话范围,会被放置在本次提问前,拥有强引导和限定性。不建议内容太长,会影响上下文,可使用变量,例如 {{language}}。可在文档中找到对应的限定例子",
|
|
||||||
"placeholder": "限定模型对话范围,会被放置在本次提问前,拥有强引导和限定性。不建议内容太长,会影响上下文,可使用变量,例如 {{language}}。可在文档中找到对应的限定例子",
|
|
||||||
"value": "",
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "switch",
|
|
||||||
"type": "target",
|
|
||||||
"label": "触发器",
|
|
||||||
"valueType": "any",
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "quoteQA",
|
|
||||||
"type": "target",
|
|
||||||
"label": "引用内容",
|
|
||||||
"description": "对象数组格式,结构:\n [{q:'问题',a:'回答'}]",
|
|
||||||
"valueType": "datasetQuote",
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "history",
|
|
||||||
"type": "target",
|
|
||||||
"label": "聊天记录",
|
|
||||||
"valueType": "chatHistory",
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "userChatInput",
|
|
||||||
"type": "target",
|
|
||||||
"label": "用户问题",
|
|
||||||
"required": true,
|
|
||||||
"valueType": "string",
|
|
||||||
"connected": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"key": "answerText",
|
|
||||||
"label": "AI回复",
|
|
||||||
"description": "将在 stream 回复完毕后触发",
|
|
||||||
"valueType": "string",
|
|
||||||
"type": "source",
|
|
||||||
"targets": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "finish",
|
|
||||||
"label": "回复结束",
|
|
||||||
"description": "AI 回复完成后触发",
|
|
||||||
"valueType": "boolean",
|
|
||||||
"type": "source",
|
|
||||||
"targets": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"moduleId": "o62kns",
|
|
||||||
"name": "用户问题(对话入口)",
|
|
||||||
"flowType": "questionInput",
|
|
||||||
"position": {
|
|
||||||
"x": 1696.5940057372968,
|
|
||||||
"y": 2270.5070479742435
|
|
||||||
},
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"key": "userChatInput",
|
|
||||||
"type": "systemInput",
|
|
||||||
"label": "用户问题",
|
|
||||||
"connected": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"key": "userChatInput",
|
|
||||||
"label": "用户问题",
|
|
||||||
"type": "source",
|
|
||||||
"valueType": "string",
|
|
||||||
"targets": [
|
|
||||||
{
|
|
||||||
"moduleId": "ol82hp",
|
|
||||||
"key": "userChatInput"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"moduleId": "he7013",
|
|
||||||
"name": "聊天记录",
|
|
||||||
"flowType": "historyNode",
|
|
||||||
"position": {
|
|
||||||
"x": 1636.793907221069,
|
|
||||||
"y": 1952.7122387165764
|
|
||||||
},
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"key": "maxContext",
|
|
||||||
"type": "numberInput",
|
|
||||||
"label": "最长记录数",
|
|
||||||
"value": 6,
|
|
||||||
"min": 0,
|
|
||||||
"max": 50,
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "history",
|
|
||||||
"type": "hidden",
|
|
||||||
"label": "聊天记录",
|
|
||||||
"connected": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"key": "history",
|
|
||||||
"label": "聊天记录",
|
|
||||||
"valueType": "chatHistory",
|
|
||||||
"type": "source",
|
|
||||||
"targets": [
|
|
||||||
{
|
|
||||||
"moduleId": "ol82hp",
|
|
||||||
"key": "history"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"moduleId": "ssdd86",
|
|
||||||
"name": "文本内容提取",
|
|
||||||
"flowType": "contentExtract",
|
|
||||||
"showStatus": true,
|
|
||||||
"position": {
|
|
||||||
"x": 1031.822028231947,
|
|
||||||
"y": 1231.9793566344022
|
|
||||||
},
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"key": "switch",
|
|
||||||
"type": "target",
|
|
||||||
"label": "触发器",
|
|
||||||
"valueType": "any",
|
|
||||||
"connected": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "description",
|
|
||||||
"type": "textarea",
|
|
||||||
"valueType": "string",
|
|
||||||
"value": "结合上下文,优化用户的问题,要求不能包含\"它\"、\"第几个\"等代名词,需将他们替换成具体的名词。",
|
|
||||||
"label": "提取要求描述",
|
|
||||||
"description": "写一段提取要求,告诉 AI 需要提取哪些内容",
|
|
||||||
"required": true,
|
|
||||||
"placeholder": "例如: \n1. 你是一个实验室预约助手。根据用户问题,提取出姓名、实验室号和预约时间",
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "history",
|
|
||||||
"type": "target",
|
|
||||||
"label": "聊天记录",
|
|
||||||
"valueType": "chatHistory",
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "content",
|
|
||||||
"type": "target",
|
|
||||||
"label": "需要提取的文本",
|
|
||||||
"required": true,
|
|
||||||
"valueType": "string",
|
|
||||||
"connected": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "extractKeys",
|
|
||||||
"type": "custom",
|
|
||||||
"label": "目标字段",
|
|
||||||
"description": "由 '描述' 和 'key' 组成一个目标字段,可提取多个目标字段",
|
|
||||||
"value": [
|
|
||||||
{
|
|
||||||
"desc": "优化后的问题",
|
|
||||||
"key": "q",
|
|
||||||
"required": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"connected": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"key": "success",
|
|
||||||
"label": "字段完全提取",
|
|
||||||
"valueType": "boolean",
|
|
||||||
"type": "source",
|
|
||||||
"targets": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "failed",
|
|
||||||
"label": "提取字段缺失",
|
|
||||||
"valueType": "boolean",
|
|
||||||
"type": "source",
|
|
||||||
"targets": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "fields",
|
|
||||||
"label": "完整提取结果",
|
|
||||||
"description": "一个 JSON 字符串,例如:{\"name:\":\"YY\",\"Time\":\"2023/7/2 18:00\"}",
|
|
||||||
"valueType": "string",
|
|
||||||
"type": "source",
|
|
||||||
"targets": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "q",
|
|
||||||
"label": "提取结果-优化后的问题",
|
|
||||||
"description": "无法提取时不会返回",
|
|
||||||
"valueType": "string",
|
|
||||||
"type": "source",
|
|
||||||
"targets": [
|
|
||||||
{
|
|
||||||
"moduleId": "nkxlso",
|
|
||||||
"key": "userChatInput"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
{{% /details %}}
|
|
||||||
|
|
||||||
## 流程说明
|
|
||||||
|
|
||||||
1. 利用内容提取模块,将用户的问题进行优化。
|
|
||||||
2. 将优化后的问题传递到知识库搜索模块进行搜索。
|
|
||||||
3. 搜索内容传递到 AI 对话模块,进行回答。
|
|
||||||
|
|
||||||
## Tips
|
|
||||||
|
|
||||||
内容提取模块可以将自然语言提取成结构化数据,可以使用其进行一些神奇的操作。
|
|
||||||
@@ -5,4 +5,6 @@ description: "介绍 FastGPT 的常用模块"
|
|||||||
icon: "apps"
|
icon: "apps"
|
||||||
draft: false
|
draft: false
|
||||||
images: []
|
images: []
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<!-- 350 ~ 400 -->
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
title: "问题补全"
|
||||||
|
description: "问题补全模块介绍和使用"
|
||||||
|
icon: "input"
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 364
|
||||||
|
---
|
||||||
|
|
||||||
|
## 特点
|
||||||
|
|
||||||
|
- 可重复添加
|
||||||
|
- 有外部输入
|
||||||
|
- 触发执行
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 背景
|
||||||
|
|
||||||
|
在 RAG 中,我们需要根据输入的问题去数据库里执行 embedding 搜索,查找相关的内容,从而查找到相似的内容(简称知识库搜索)。
|
||||||
|
|
||||||
|
在搜索的过程中,尤其是连续对话的搜索,我们通常会发现后续的问题难以搜索到合适的内容,其中一个原因是知识库搜索只会使用“当前”的问题去执行。看下面的例子:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
用户在提问“第二点是什么”的时候,只会去知识库里查找“第二点是什么”,压根查不到内容。实际上需要查询的是“QA结构是什么”。因此我们需要引入一个【问题补全】模块,来对用户当前的问题进行补全,从而使得知识库搜索能够搜索到合适的内容。使用补全后效果如下:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## 功能
|
||||||
|
|
||||||
|
调用 AI 去对用户当前的问题进行补全。目前主要是补全“指代”词,使得检索词更加的完善可靠,从而增强上下文连续对话的知识库搜索能力。
|
||||||
|
|
||||||
|
遇到最大的难题在于:模型对于【补全】的概念可能不清晰,且对于长上下文往往无法准确的知道应该如何补全。
|
||||||
|
|
||||||
|
## 示例
|
||||||
|
|
||||||
|
- [接入谷歌搜索](/docs/workflow/examples/google_search/)
|
||||||
35
docSite/content/docs/workflow/modules/custom_feedback.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
title: "自定义反馈"
|
||||||
|
description: "自定义反馈模块介绍"
|
||||||
|
icon: "feedback"
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 354
|
||||||
|
---
|
||||||
|
|
||||||
|
该模块为临时模块,后续会针对该模块进行更全面的设计。
|
||||||
|
|
||||||
|
## 特点
|
||||||
|
|
||||||
|
- 可重复添加
|
||||||
|
- 无外部输入
|
||||||
|
- 自动执行
|
||||||
|
|
||||||
|
|
||||||
|
| | |
|
||||||
|
| --------------------- | --------------------- |
|
||||||
|
|  |  |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
|
||||||
|
## 介绍
|
||||||
|
|
||||||
|
自定义反馈模块,可以为你的对话增加一个反馈标记,从而方便在后台更好的分析对话的数据。
|
||||||
|
|
||||||
|
在调试模式下,不会记录反馈内容,而是直接提示: `自动反馈测试: 反馈内容`。
|
||||||
|
|
||||||
|
在对话模式(对话、分享窗口、带 chatId 的 API 调用)时,会将反馈内容记录到对话日志中。(会延迟60s记录)
|
||||||
|
|
||||||
|
## 作用
|
||||||
|
|
||||||
|
自定义反馈模块的功能类似于程序开发的`埋点`,便于你观测的对话中的数据。
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
title: "历史记录"
|
|
||||||
description: "FastGPT 历史记录模块介绍"
|
|
||||||
icon: "history"
|
|
||||||
draft: false
|
|
||||||
toc: true
|
|
||||||
weight: 354
|
|
||||||
---
|
|
||||||
|
|
||||||
# 特点
|
|
||||||
|
|
||||||
- 可重复添加(防止复杂编排时线太乱,重复添加可以更美观)
|
|
||||||
- 无外部输入
|
|
||||||
- 流程入口
|
|
||||||
- 自动执行
|
|
||||||
|
|
||||||
每次对话时,会从数据库取最多 n 条聊天记录作为上下文。注意,不是指本轮对话最多 n 条上下文,本轮对话还包括:提示词、限定词、引用内容和问题。
|
|
||||||
|
|
||||||

|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: "HTTP 模块"
|
title: "新 HTTP 模块"
|
||||||
description: "FastGPT HTTP 模块介绍"
|
description: "FastGPT HTTP 模块介绍"
|
||||||
icon: "http"
|
icon: "http"
|
||||||
draft: false
|
draft: false
|
||||||
@@ -19,86 +19,233 @@ weight: 355
|
|||||||
|
|
||||||
## 介绍
|
## 介绍
|
||||||
|
|
||||||
HTTP 模块会向对应的地址发送一个 POST 请求(Body 中携带 JSON 类型的参数,具体的参数可自定义),并接收一个 JSON 响应值,字段也是自定义。如上图中,我们定义了一个入参:「提取的字段」(定义的 key 为 appointment,类型为 string)和一个出参:「提取结果」(定义的 key 为 response,类型为 string)。
|
HTTP 模块会向对应的地址发送一个 `POST/GET` 请求,携带部分`系统参数`及`自定义参数`,并接收一个 JSON 响应值,字段也是自定义。
|
||||||
|
|
||||||
那么,这个请求的命令为:
|
- 你还可以通过 JSON 传入自定义的请求头。
|
||||||
|
- POST 请求中,数据会被放置在 `body` 中。
|
||||||
|
- GET 请求中,数据会被放置在 `query` 中。
|
||||||
|
- 在出入参数中,你都可以通过 xxx.xxx 来代表嵌套的对象。
|
||||||
|
|
||||||
```bash
|
## 参数结构
|
||||||
curl --location --request POST 'https://xxxx.laf.dev/appointment-lab' \
|
|
||||||
--header 'Content-Type: application/json' \
|
|
||||||
--data-raw '{
|
|
||||||
"appointment":"{\"name\":\"小明\",\"time\":\"2023/08/16 15:00\",\"labname\":\"子良A323\"}"
|
|
||||||
}'
|
|
||||||
```
|
|
||||||
|
|
||||||
响应为:
|
### 系统参数说明
|
||||||
|
|
||||||
|
- appId: 应用的ID
|
||||||
|
- chatId: 当前对话的ID,测试模式下不存在。
|
||||||
|
- responseChatItemId: 当前对话中,响应的消息ID,测试模式下不存在。
|
||||||
|
- variables: 当前对话的全局变量。
|
||||||
|
- data: 自定义传递的参数。
|
||||||
|
|
||||||
|
### 嵌套对象使用
|
||||||
|
|
||||||
|
**入参**
|
||||||
|
|
||||||
|
假设我们设计了`3个`输入。
|
||||||
|
|
||||||
|
- user.name (string)
|
||||||
|
- user.age (number)
|
||||||
|
- type (string)
|
||||||
|
|
||||||
|
最终组成的对象为:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"response": "您已经有一个预约记录了,每人仅能同时预约一个实验室:\n 姓名:小明\n 时间: 2023/08/15 15:00\n 实验室: 子良A323\n "
|
"user": {
|
||||||
|
"name": "",
|
||||||
|
"age": ""
|
||||||
|
},
|
||||||
|
"type": ""
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**出参**
|
||||||
|
|
||||||
|
假设接口的输出结构为:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"message": "测试",
|
||||||
|
"data":{
|
||||||
|
"name": "name",
|
||||||
|
"age": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
那么,自定出参的`key`可以设置为:
|
||||||
|
|
||||||
|
- message (string)
|
||||||
|
- data.name (string)
|
||||||
|
- data.age (number)
|
||||||
|
|
||||||
|
|
||||||
|
## POST 示例
|
||||||
|
|
||||||
|
**自定义入参**
|
||||||
|
|
||||||
|
- user.name (string)
|
||||||
|
- user.age (number)
|
||||||
|
- type (string)
|
||||||
|
|
||||||
|
**自定义出参**
|
||||||
|
|
||||||
|
- message (string)
|
||||||
|
- data.name (string)
|
||||||
|
- data.age (number)
|
||||||
|
|
||||||
|
那么,这个模块发出的请求则是:
|
||||||
|
|
||||||
|
{{< tabs tabTotal="2" >}}
|
||||||
|
{{< tab tabName="POST 请求示例" >}}
|
||||||
|
{{< markdownify >}}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl --location --request POST 'http://xxxx.com' \
|
||||||
|
--header 'Content-Type: application/json' \
|
||||||
|
--data-raw '{
|
||||||
|
"appId": "65782f7ffae5f7854ed4498b",
|
||||||
|
"chatId": "xxxx",
|
||||||
|
"responseChatItemId": "xxxx",
|
||||||
|
"variables": {
|
||||||
|
"cTime": "2023-12-18 13:45:46"
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"user": {
|
||||||
|
"name": "",
|
||||||
|
"age": ""
|
||||||
|
},
|
||||||
|
"type": ""
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
{{< /markdownify >}}
|
||||||
|
{{< /tab >}}
|
||||||
|
|
||||||
|
{{< tab tabName="POST响应" >}}
|
||||||
|
{{< markdownify >}}
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"message": "message",
|
||||||
|
"data": {
|
||||||
|
"name": "name",
|
||||||
|
"age": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
{{< /markdownify >}}
|
||||||
|
{{< /tab >}}
|
||||||
|
{{< /tabs >}}
|
||||||
|
|
||||||
|
## GET 示例
|
||||||
|
|
||||||
|
GET 中,不推荐使用嵌套参数,否则会出现奇怪的问题。此外,GET 请求中,FastGPT 会将参数扁平化,不会将自定义参单独抽到 data 中,同时全局变量也会扁平化,因此需要注意字段 key 是否冲突。
|
||||||
|
|
||||||
|
**自定义入参**
|
||||||
|
|
||||||
|
- name (string)
|
||||||
|
- age (number)
|
||||||
|
- type (string)
|
||||||
|
|
||||||
|
**自定义出参**
|
||||||
|
|
||||||
|
- message (string)
|
||||||
|
- name (string)
|
||||||
|
- age (number)
|
||||||
|
|
||||||
|
那么,这个模块发出的请求则是:
|
||||||
|
|
||||||
|
{{< tabs tabTotal="2" >}}
|
||||||
|
{{< tab tabName="GET 请求示例" >}}
|
||||||
|
{{< markdownify >}}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl --location --request GET 'http://xxx.com/test?name&age&type&appId=65782f7ffae5f7854ed4498b&chatId=xxxx&responseChatItemId=xxxx&cTime=2023-12-18 13:45:46'
|
||||||
|
```
|
||||||
|
|
||||||
|
{{< /markdownify >}}
|
||||||
|
{{< /tab >}}
|
||||||
|
|
||||||
|
{{< tab tabName="GET 响应" >}}
|
||||||
|
{{< markdownify >}}
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"message": "message",
|
||||||
|
"data": {
|
||||||
|
"name": "name",
|
||||||
|
"age": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
{{< /markdownify >}}
|
||||||
|
{{< /tab >}}
|
||||||
|
{{< /tabs >}}
|
||||||
|
|
||||||
|
|
||||||
|
## laf 对接 HTTP 示例
|
||||||
|
|
||||||
{{% alert context="warning" %}}
|
{{% alert context="warning" %}}
|
||||||
如果你不想额外部署服务,可以使用 [Laf](https://laf.dev/) 来快速开发上线接口,即写即发,无需部署。
|
如果你不想额外部署服务,可以使用 [Laf](https://laf.dev/) 来快速开发上线接口,即写即发,无需部署。
|
||||||
|
|
||||||
下面是在 Laf 上编写的一个请求示例:
|
|
||||||
{{% /alert %}}
|
{{% /alert %}}
|
||||||
|
|
||||||
|
下面是在 Laf 编写的 POST 请求示例:
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
import cloud from '@lafjs/cloud';
|
import cloud from '@lafjs/cloud'
|
||||||
const db = cloud.database();
|
const db = cloud.database()
|
||||||
|
|
||||||
|
type RequestType = {
|
||||||
|
appId: string;
|
||||||
|
data: {
|
||||||
|
appointment: string;
|
||||||
|
action: 'post' | 'delete' | 'put' | 'get'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export default async function (ctx: FunctionContext) {
|
export default async function (ctx: FunctionContext) {
|
||||||
const { appointment } = ctx.body;
|
try {
|
||||||
const { name, time, labname } = JSON.parse(appointment);
|
// 从 body 中获取参数
|
||||||
|
const { appId, data: { appointment, action } } = ctx.body as RequestType
|
||||||
|
|
||||||
|
const parseBody = JSON.parse(appointment)
|
||||||
|
if (action === 'get') {
|
||||||
|
return await getRecord(parseBody)
|
||||||
|
}
|
||||||
|
if (action === 'post') {
|
||||||
|
return await createRecord(parseBody)
|
||||||
|
}
|
||||||
|
if (action === 'put') {
|
||||||
|
return await putRecord(parseBody)
|
||||||
|
}
|
||||||
|
if (action === 'delete') {
|
||||||
|
return await removeRecord(parseBody)
|
||||||
|
}
|
||||||
|
|
||||||
const missData = [];
|
|
||||||
if (!name) missData.push('你的姓名');
|
|
||||||
if (!time) missData.push('需要预约的时间');
|
|
||||||
if (!labname) missData.push('实验室名称');
|
|
||||||
|
|
||||||
if (missData.length > 0) {
|
|
||||||
return {
|
return {
|
||||||
response: `请提供: ${missData.join('、')}`
|
response: "异常"
|
||||||
};
|
}
|
||||||
}
|
} catch (err) {
|
||||||
|
|
||||||
const { data: record } = await db
|
|
||||||
.collection('LabAppointment')
|
|
||||||
.where({
|
|
||||||
name,
|
|
||||||
status: 'unStart'
|
|
||||||
})
|
|
||||||
.getOne();
|
|
||||||
|
|
||||||
if (record) {
|
|
||||||
return {
|
return {
|
||||||
response: `您已经有一个预约记录了,每人仅能同时预约一个实验室:
|
response: "异常"
|
||||||
姓名:${record.name}
|
}
|
||||||
时间: ${record.time}
|
|
||||||
实验室: ${record.labname}
|
|
||||||
`
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await db.collection('LabAppointment').add({
|
|
||||||
name,
|
|
||||||
time,
|
|
||||||
labname,
|
|
||||||
status: 'unStart'
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
response: `预约成功。
|
|
||||||
姓名:${name}
|
|
||||||
时间: ${time}
|
|
||||||
实验室: ${labname}
|
|
||||||
`
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## 作用
|
## 作用
|
||||||
|
|
||||||
基于 HTTP 模块可以无限扩展,比如操作数据库、执行联网搜索、发送邮箱等等。如果你有有趣的案例,欢迎提交 PR 到 [编排案例](/docs/workflow/examples)
|
通过 HTTP 模块你可以无限扩展,比如:
|
||||||
|
- 操作数据库
|
||||||
|
- 调用外部数据源
|
||||||
|
- 执行联网搜索
|
||||||
|
- 发送邮箱
|
||||||
|
- ....
|
||||||
|
|
||||||
|
|
||||||
|
## 相关示例
|
||||||
|
|
||||||
|
- [谷歌搜索](/docs/workflow/examples/google_search/)
|
||||||
|
- [实验室预约(操作数据库)](/docs/workflow/examples/lab_appointment/)
|
||||||
32
docSite/content/docs/workflow/modules/text_editor.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
title: "文本加工"
|
||||||
|
description: "FastGPT 文本加工模块介绍"
|
||||||
|
icon: "input"
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 363
|
||||||
|
---
|
||||||
|
|
||||||
|
## 特点
|
||||||
|
|
||||||
|
- 可重复添加
|
||||||
|
- 有外部输入
|
||||||
|
- 触发执行
|
||||||
|
- 手动配置
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## 功能
|
||||||
|
对输入文本进行固定加工处理,入参仅支持字符串和数字格式,入参以变量形式使用在文本编辑区域。
|
||||||
|
|
||||||
|
根据上方示例图的处理方式,对任何输入都会在前面拼接“我的问题是:”。
|
||||||
|
|
||||||
|
|
||||||
|
## 作用
|
||||||
|
|
||||||
|
给任意模块输入自定格式文本,或处理 AI 模块系统提示词。
|
||||||
|
|
||||||
|
## 示例
|
||||||
|
|
||||||
|
- [接入谷歌搜索](/docs/workflow/examples/google_search/)
|
||||||
29
docSite/content/docs/workflow/modules/tfswitch.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
title: "判断器"
|
||||||
|
description: "FastGPT 判断器模块介绍"
|
||||||
|
icon: "input"
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 362
|
||||||
|
---
|
||||||
|
|
||||||
|
## 特点
|
||||||
|
|
||||||
|
- 可重复添加
|
||||||
|
- 有外部输入
|
||||||
|
- 触发执行
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 功能
|
||||||
|
|
||||||
|
对任意输入内容进行 True False 输出,默认情况下,当传入的内容为 false, undefined, null,0,none 时,会输出 false。
|
||||||
|
|
||||||
|
也可以增加自定义规则来补充输出 false 的内容,每行代表一个匹配规则,支持正则表达式。
|
||||||
|
|
||||||
|
根据上方示例图的匹配规则,当我们输入`123` `hi` `你好` 和任意手机号码时(正则匹配)同样也会输出 False 。
|
||||||
|
|
||||||
|
## 作用
|
||||||
|
|
||||||
|
适用场景有:让大模型做判断后输出固定内容,根据大模型回复内容判断是否触发后续模块。
|
||||||
|
|
||||||
19
package.json
@@ -5,27 +5,24 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"prepare": "husky install",
|
"prepare": "husky install",
|
||||||
"format-code": "prettier --config \"./.prettierrc.js\" --write \"./**/src/**/*.{ts,tsx,scss}\"",
|
"format-code": "prettier --config \"./.prettierrc.js\" --write \"./**/src/**/*.{ts,tsx,scss}\"",
|
||||||
"format-doc": "zhlint --dir ./docSite *.md --fix"
|
"format-doc": "zhlint --dir ./docSite *.md --fix",
|
||||||
|
"postinstall": "sh ./scripts/postinstall.sh"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/multer": "^1.4.10",
|
|
||||||
"husky": "^8.0.3",
|
"husky": "^8.0.3",
|
||||||
"i18next": "^22.5.1",
|
|
||||||
"lint-staged": "^13.2.1",
|
"lint-staged": "^13.2.1",
|
||||||
"next-i18next": "^13.3.0",
|
|
||||||
"prettier": "^3.0.3",
|
"prettier": "^3.0.3",
|
||||||
"react-i18next": "^12.3.1",
|
"zhlint": "^0.7.1",
|
||||||
"zhlint": "^0.7.1"
|
"i18next": "^22.5.1",
|
||||||
|
"next-i18next": "^13.3.0",
|
||||||
|
"react-i18next": "^12.3.1"
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"./**/**/*.{ts,tsx,scss}": "npm run format-code",
|
"./**/**/*.{ts,tsx,scss}": "npm run format-code",
|
||||||
"./**/**/*.md": "npm run format-doc"
|
"./**/**/*.md": "npm run format-doc"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.0.0"
|
"node": ">=18.0.0",
|
||||||
},
|
"pnpm": ">=8.6.0"
|
||||||
"dependencies": {
|
|
||||||
"multer": "1.4.5-lts.1",
|
|
||||||
"openai": "4.16.1"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
import axios from 'axios';
|
|
||||||
import { UrlFetchParams, UrlFetchResponse } from './api.d';
|
|
||||||
import { htmlToMarkdown } from '../string/markdown';
|
|
||||||
import * as cheerio from 'cheerio';
|
|
||||||
|
|
||||||
export const formatFileSize = (bytes: number): string => {
|
export const formatFileSize = (bytes: number): string => {
|
||||||
if (bytes === 0) return '0 B';
|
if (bytes === 0) return '0 B';
|
||||||
|
|
||||||
@@ -12,91 +7,3 @@ export const formatFileSize = (bytes: number): string => {
|
|||||||
|
|
||||||
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
||||||
};
|
};
|
||||||
|
|
||||||
export const cheerioToHtml = ({
|
|
||||||
fetchUrl,
|
|
||||||
$,
|
|
||||||
selector
|
|
||||||
}: {
|
|
||||||
fetchUrl: string;
|
|
||||||
$: cheerio.CheerioAPI;
|
|
||||||
selector?: string;
|
|
||||||
}) => {
|
|
||||||
// get origin url
|
|
||||||
const originUrl = new URL(fetchUrl).origin;
|
|
||||||
|
|
||||||
// remove i element
|
|
||||||
$('i,script').remove();
|
|
||||||
|
|
||||||
// remove empty a element
|
|
||||||
$('a')
|
|
||||||
.filter((i, el) => {
|
|
||||||
return $(el).text().trim() === '' && $(el).children().length === 0;
|
|
||||||
})
|
|
||||||
.remove();
|
|
||||||
|
|
||||||
// if link,img startWith /, add origin url
|
|
||||||
$('a').each((i, el) => {
|
|
||||||
const href = $(el).attr('href');
|
|
||||||
if (href && href.startsWith('/')) {
|
|
||||||
$(el).attr('href', originUrl + href);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$('img').each((i, el) => {
|
|
||||||
const src = $(el).attr('src');
|
|
||||||
if (src && src.startsWith('/')) {
|
|
||||||
$(el).attr('src', originUrl + src);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const html = $(selector || 'body')
|
|
||||||
.map((item, dom) => {
|
|
||||||
return $(dom).html();
|
|
||||||
})
|
|
||||||
.get()
|
|
||||||
.join('\n');
|
|
||||||
|
|
||||||
return html;
|
|
||||||
};
|
|
||||||
export const urlsFetch = async ({
|
|
||||||
urlList,
|
|
||||||
selector
|
|
||||||
}: UrlFetchParams): Promise<UrlFetchResponse> => {
|
|
||||||
urlList = urlList.filter((url) => /^(http|https):\/\/[^ "]+$/.test(url));
|
|
||||||
|
|
||||||
const response = (
|
|
||||||
await Promise.all(
|
|
||||||
urlList.map(async (url) => {
|
|
||||||
try {
|
|
||||||
const fetchRes = await axios.get(url, {
|
|
||||||
timeout: 30000
|
|
||||||
});
|
|
||||||
|
|
||||||
const $ = cheerio.load(fetchRes.data);
|
|
||||||
|
|
||||||
const md = htmlToMarkdown(
|
|
||||||
cheerioToHtml({
|
|
||||||
fetchUrl: url,
|
|
||||||
$,
|
|
||||||
selector
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
url,
|
|
||||||
content: md
|
|
||||||
};
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error, 'fetch error');
|
|
||||||
|
|
||||||
return {
|
|
||||||
url,
|
|
||||||
content: ''
|
|
||||||
};
|
|
||||||
}
|
|
||||||
})
|
|
||||||
)
|
|
||||||
).filter((item) => item.content);
|
|
||||||
|
|
||||||
return response;
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { simpleText } from './tools';
|
import { simpleText } from './tools';
|
||||||
import { NodeHtmlMarkdown } from 'node-html-markdown';
|
|
||||||
|
|
||||||
/* Delete redundant text in markdown */
|
/* Delete redundant text in markdown */
|
||||||
export const simpleMarkdownText = (rawText: string) => {
|
export const simpleMarkdownText = (rawText: string) => {
|
||||||
@@ -27,75 +26,11 @@ export const simpleMarkdownText = (rawText: string) => {
|
|||||||
|
|
||||||
// Remove headings and code blocks front spaces
|
// Remove headings and code blocks front spaces
|
||||||
['####', '###', '##', '#', '```', '~~~'].forEach((item, i) => {
|
['####', '###', '##', '#', '```', '~~~'].forEach((item, i) => {
|
||||||
const isMarkdown = i <= 3;
|
|
||||||
const reg = new RegExp(`\\n\\s*${item}`, 'g');
|
const reg = new RegExp(`\\n\\s*${item}`, 'g');
|
||||||
if (reg.test(rawText)) {
|
if (reg.test(rawText)) {
|
||||||
rawText = rawText.replace(
|
rawText = rawText.replace(new RegExp(`(\\n)( *)(${item})`, 'g'), '$1$3');
|
||||||
new RegExp(`(\\n)\\s*(${item})`, 'g'),
|
|
||||||
isMarkdown ? '\n$1$2' : '$1$2'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return rawText.trim();
|
return rawText.trim();
|
||||||
};
|
};
|
||||||
|
|
||||||
/* html string to markdown */
|
|
||||||
export const htmlToMarkdown = (html?: string | null) => {
|
|
||||||
if (!html) return '';
|
|
||||||
|
|
||||||
const surround = (source: string, surroundStr: string) => `${surroundStr}${source}${surroundStr}`;
|
|
||||||
|
|
||||||
const nhm = new NodeHtmlMarkdown(
|
|
||||||
{
|
|
||||||
codeFence: '```',
|
|
||||||
codeBlockStyle: 'fenced',
|
|
||||||
ignore: ['i', 'script']
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: ({ node, parent, options: { codeFence, codeBlockStyle }, visitor }) => {
|
|
||||||
const isCodeBlock = ['PRE', 'WRAPPED-PRE'].includes(parent?.tagName!);
|
|
||||||
|
|
||||||
if (!isCodeBlock) {
|
|
||||||
return {
|
|
||||||
spaceIfRepeatingChar: true,
|
|
||||||
noEscape: true,
|
|
||||||
postprocess: ({ content }) => {
|
|
||||||
// Find longest occurring sequence of running backticks and add one more (so content is escaped)
|
|
||||||
const delimiter =
|
|
||||||
'`' + (content.match(/`+/g)?.sort((a, b) => b.length - a.length)?.[0] || '');
|
|
||||||
const padding = delimiter.length > 1 ? ' ' : '';
|
|
||||||
|
|
||||||
return surround(surround(content, padding), delimiter);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Handle code block */
|
|
||||||
if (codeBlockStyle === 'fenced') {
|
|
||||||
const language =
|
|
||||||
node.getAttribute('class')?.match(/language-(\S+)/)?.[1] ||
|
|
||||||
parent?.getAttribute('class')?.match(/language-(\S+)/)?.[1] ||
|
|
||||||
'';
|
|
||||||
|
|
||||||
return {
|
|
||||||
noEscape: true,
|
|
||||||
prefix: `${codeFence}${language}\n`,
|
|
||||||
postfix: `\n${codeFence}\n`,
|
|
||||||
childTranslators: visitor.instance.codeBlockTranslators
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
noEscape: true,
|
|
||||||
postprocess: ({ content }) => content.replace(/^/gm, ' '),
|
|
||||||
childTranslators: visitor.instance.codeBlockTranslators
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
const markdown = nhm.translate(html).trim();
|
|
||||||
|
|
||||||
return simpleMarkdownText(markdown);
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -13,12 +13,13 @@ export const splitText2Chunks = (props: {
|
|||||||
chunkLen: number;
|
chunkLen: number;
|
||||||
overlapRatio?: number;
|
overlapRatio?: number;
|
||||||
customReg?: string[];
|
customReg?: string[];
|
||||||
|
countTokens?: boolean;
|
||||||
}): {
|
}): {
|
||||||
chunks: string[];
|
chunks: string[];
|
||||||
tokens: number;
|
tokens: number;
|
||||||
overlapRatio?: number;
|
overlapRatio?: number;
|
||||||
} => {
|
} => {
|
||||||
let { text = '', chunkLen, overlapRatio = 0.2, customReg = [] } = props;
|
let { text = '', chunkLen, overlapRatio = 0.2, customReg = [], countTokens = true } = props;
|
||||||
const splitMarker = 'SPLIT_HERE_SPLIT_HERE';
|
const splitMarker = 'SPLIT_HERE_SPLIT_HERE';
|
||||||
const codeBlockMarker = 'CODE_BLOCK_LINE_MARKER';
|
const codeBlockMarker = 'CODE_BLOCK_LINE_MARKER';
|
||||||
const overlapLen = Math.round(chunkLen * overlapRatio);
|
const overlapLen = Math.round(chunkLen * overlapRatio);
|
||||||
@@ -231,9 +232,11 @@ export const splitText2Chunks = (props: {
|
|||||||
step: 0,
|
step: 0,
|
||||||
lastText: '',
|
lastText: '',
|
||||||
mdTitle: ''
|
mdTitle: ''
|
||||||
}).map((chunk) => chunk.replaceAll(codeBlockMarker, '\n')); // restore code block
|
}).map((chunk) => chunk?.replaceAll(codeBlockMarker, '\n') || ''); // restore code block
|
||||||
|
|
||||||
const tokens = chunks.reduce((sum, chunk) => sum + countPromptTokens(chunk, 'system'), 0);
|
const tokens = countTokens
|
||||||
|
? chunks.reduce((sum, chunk) => sum + countPromptTokens(chunk, 'system'), 0)
|
||||||
|
: 0;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
chunks,
|
chunks,
|
||||||
|
|||||||
2
packages/global/core/ai/model.d.ts
vendored
@@ -14,7 +14,7 @@ export type ChatModelItemType = LLMModelItemType & {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type FunctionModelItemType = LLMModelItemType & {
|
export type FunctionModelItemType = LLMModelItemType & {
|
||||||
functionCall: boolean;
|
toolChoice: boolean;
|
||||||
functionPrompt: string;
|
functionPrompt: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,63 +1,5 @@
|
|||||||
import type {
|
import type { LLMModelItemType, VectorModelItemType } from './model.d';
|
||||||
LLMModelItemType,
|
|
||||||
ChatModelItemType,
|
|
||||||
FunctionModelItemType,
|
|
||||||
VectorModelItemType,
|
|
||||||
AudioSpeechModelType,
|
|
||||||
WhisperModelType,
|
|
||||||
ReRankModelItemType
|
|
||||||
} from './model.d';
|
|
||||||
|
|
||||||
export const defaultChatModels: ChatModelItemType[] = [
|
|
||||||
{
|
|
||||||
model: 'gpt-3.5-turbo-1106',
|
|
||||||
name: 'GPT35-1106',
|
|
||||||
price: 0,
|
|
||||||
maxContext: 16000,
|
|
||||||
maxResponse: 4000,
|
|
||||||
quoteMaxToken: 2000,
|
|
||||||
maxTemperature: 1.2,
|
|
||||||
censor: false,
|
|
||||||
vision: false,
|
|
||||||
defaultSystemChatPrompt: ''
|
|
||||||
},
|
|
||||||
{
|
|
||||||
model: 'gpt-3.5-turbo-16k',
|
|
||||||
name: 'GPT35-16k',
|
|
||||||
maxContext: 16000,
|
|
||||||
maxResponse: 16000,
|
|
||||||
price: 0,
|
|
||||||
quoteMaxToken: 8000,
|
|
||||||
maxTemperature: 1.2,
|
|
||||||
censor: false,
|
|
||||||
vision: false,
|
|
||||||
defaultSystemChatPrompt: ''
|
|
||||||
},
|
|
||||||
{
|
|
||||||
model: 'gpt-4',
|
|
||||||
name: 'GPT4-8k',
|
|
||||||
maxContext: 8000,
|
|
||||||
maxResponse: 8000,
|
|
||||||
price: 0,
|
|
||||||
quoteMaxToken: 4000,
|
|
||||||
maxTemperature: 1.2,
|
|
||||||
censor: false,
|
|
||||||
vision: false,
|
|
||||||
defaultSystemChatPrompt: ''
|
|
||||||
},
|
|
||||||
{
|
|
||||||
model: 'gpt-4-vision-preview',
|
|
||||||
name: 'GPT4-Vision',
|
|
||||||
maxContext: 128000,
|
|
||||||
maxResponse: 4000,
|
|
||||||
price: 0,
|
|
||||||
quoteMaxToken: 100000,
|
|
||||||
maxTemperature: 1.2,
|
|
||||||
censor: false,
|
|
||||||
vision: true,
|
|
||||||
defaultSystemChatPrompt: ''
|
|
||||||
}
|
|
||||||
];
|
|
||||||
export const defaultQAModels: LLMModelItemType[] = [
|
export const defaultQAModels: LLMModelItemType[] = [
|
||||||
{
|
{
|
||||||
model: 'gpt-3.5-turbo-16k',
|
model: 'gpt-3.5-turbo-16k',
|
||||||
@@ -67,46 +9,6 @@ export const defaultQAModels: LLMModelItemType[] = [
|
|||||||
price: 0
|
price: 0
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
export const defaultCQModels: FunctionModelItemType[] = [
|
|
||||||
{
|
|
||||||
model: 'gpt-3.5-turbo-1106',
|
|
||||||
name: 'GPT35-1106',
|
|
||||||
maxContext: 16000,
|
|
||||||
maxResponse: 4000,
|
|
||||||
price: 0,
|
|
||||||
functionCall: true,
|
|
||||||
functionPrompt: ''
|
|
||||||
},
|
|
||||||
{
|
|
||||||
model: 'gpt-4',
|
|
||||||
name: 'GPT4-8k',
|
|
||||||
maxContext: 8000,
|
|
||||||
maxResponse: 8000,
|
|
||||||
price: 0,
|
|
||||||
functionCall: true,
|
|
||||||
functionPrompt: ''
|
|
||||||
}
|
|
||||||
];
|
|
||||||
export const defaultExtractModels: FunctionModelItemType[] = [
|
|
||||||
{
|
|
||||||
model: 'gpt-3.5-turbo-1106',
|
|
||||||
name: 'GPT35-1106',
|
|
||||||
maxContext: 16000,
|
|
||||||
maxResponse: 4000,
|
|
||||||
price: 0,
|
|
||||||
functionCall: true,
|
|
||||||
functionPrompt: ''
|
|
||||||
}
|
|
||||||
];
|
|
||||||
export const defaultQGModels: LLMModelItemType[] = [
|
|
||||||
{
|
|
||||||
model: 'gpt-3.5-turbo-1106',
|
|
||||||
name: 'GPT35-1106',
|
|
||||||
maxContext: 1600,
|
|
||||||
maxResponse: 4000,
|
|
||||||
price: 0
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
export const defaultVectorModels: VectorModelItemType[] = [
|
export const defaultVectorModels: VectorModelItemType[] = [
|
||||||
{
|
{
|
||||||
@@ -117,27 +19,3 @@ export const defaultVectorModels: VectorModelItemType[] = [
|
|||||||
maxToken: 3000
|
maxToken: 3000
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
export const defaultReRankModels: ReRankModelItemType[] = [];
|
|
||||||
|
|
||||||
export const defaultAudioSpeechModels: AudioSpeechModelType[] = [
|
|
||||||
{
|
|
||||||
model: 'tts-1',
|
|
||||||
name: 'OpenAI TTS1',
|
|
||||||
price: 0,
|
|
||||||
voices: [
|
|
||||||
{ label: 'Alloy', value: 'Alloy', bufferId: 'openai-Alloy' },
|
|
||||||
{ label: 'Echo', value: 'Echo', bufferId: 'openai-Echo' },
|
|
||||||
{ label: 'Fable', value: 'Fable', bufferId: 'openai-Fable' },
|
|
||||||
{ label: 'Onyx', value: 'Onyx', bufferId: 'openai-Onyx' },
|
|
||||||
{ label: 'Nova', value: 'Nova', bufferId: 'openai-Nova' },
|
|
||||||
{ label: 'Shimmer', value: 'Shimmer', bufferId: 'openai-Shimmer' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
export const defaultWhisperModel: WhisperModelType = {
|
|
||||||
model: 'whisper-1',
|
|
||||||
name: 'Whisper1',
|
|
||||||
price: 0
|
|
||||||
};
|
|
||||||
|
|||||||
6
packages/global/core/app/type.d.ts
vendored
@@ -67,6 +67,9 @@ export type AppSimpleEditFormType = {
|
|||||||
searchMode: `${DatasetSearchModeEnum}`;
|
searchMode: `${DatasetSearchModeEnum}`;
|
||||||
searchEmptyText: string;
|
searchEmptyText: string;
|
||||||
};
|
};
|
||||||
|
cfr: {
|
||||||
|
background: string;
|
||||||
|
};
|
||||||
userGuide: {
|
userGuide: {
|
||||||
welcomeText: string;
|
welcomeText: string;
|
||||||
variables: {
|
variables: {
|
||||||
@@ -111,6 +114,9 @@ export type AppSimpleEditConfigTemplateType = {
|
|||||||
searchMode: `${DatasetSearchModeEnum}`;
|
searchMode: `${DatasetSearchModeEnum}`;
|
||||||
searchEmptyText?: boolean;
|
searchEmptyText?: boolean;
|
||||||
};
|
};
|
||||||
|
cfr?: {
|
||||||
|
background?: boolean;
|
||||||
|
};
|
||||||
userGuide?: {
|
userGuide?: {
|
||||||
welcomeText?: boolean;
|
welcomeText?: boolean;
|
||||||
variables?: boolean;
|
variables?: boolean;
|
||||||
|
|||||||
@@ -3,23 +3,23 @@ import { FlowNodeTypeEnum } from '../module/node/constant';
|
|||||||
import { ModuleOutputKeyEnum, ModuleInputKeyEnum } from '../module/constants';
|
import { ModuleOutputKeyEnum, ModuleInputKeyEnum } from '../module/constants';
|
||||||
import type { FlowNodeInputItemType } from '../module/node/type.d';
|
import type { FlowNodeInputItemType } from '../module/node/type.d';
|
||||||
import { getGuideModule, splitGuideModule } from '../module/utils';
|
import { getGuideModule, splitGuideModule } from '../module/utils';
|
||||||
import { defaultChatModels } from '../ai/model';
|
|
||||||
import { ModuleItemType } from '../module/type.d';
|
import { ModuleItemType } from '../module/type.d';
|
||||||
import { DatasetSearchModeEnum } from '../dataset/constant';
|
import { DatasetSearchModeEnum } from '../dataset/constant';
|
||||||
|
|
||||||
export const getDefaultAppForm = (templateId = 'fastgpt-universal'): AppSimpleEditFormType => {
|
export const getDefaultAppForm = (templateId = 'fastgpt-universal'): AppSimpleEditFormType => {
|
||||||
const defaultChatModel = defaultChatModels[0];
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
templateId,
|
templateId,
|
||||||
aiSettings: {
|
aiSettings: {
|
||||||
model: defaultChatModel?.model,
|
model: 'gpt-3.5-turbo',
|
||||||
systemPrompt: '',
|
systemPrompt: '',
|
||||||
temperature: 0,
|
temperature: 0,
|
||||||
isResponseAnswerText: true,
|
isResponseAnswerText: true,
|
||||||
quotePrompt: '',
|
quotePrompt: '',
|
||||||
quoteTemplate: '',
|
quoteTemplate: '',
|
||||||
maxToken: defaultChatModel ? defaultChatModel.maxResponse / 2 : 4000
|
maxToken: 4000
|
||||||
|
},
|
||||||
|
cfr: {
|
||||||
|
background: ''
|
||||||
},
|
},
|
||||||
dataset: {
|
dataset: {
|
||||||
datasets: [],
|
datasets: [],
|
||||||
@@ -116,6 +116,11 @@ export const appModules2Form = ({
|
|||||||
questionGuide: questionGuide,
|
questionGuide: questionGuide,
|
||||||
tts: ttsConfig
|
tts: ttsConfig
|
||||||
};
|
};
|
||||||
|
} else if (module.flowType === FlowNodeTypeEnum.cfr) {
|
||||||
|
const value = module.inputs.find((item) => item.key === ModuleInputKeyEnum.aiSystemPrompt);
|
||||||
|
if (value) {
|
||||||
|
defaultAppForm.cfr.background = value.value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
10
packages/global/core/chat/type.d.ts
vendored
@@ -40,7 +40,7 @@ export type ChatItemSchema = {
|
|||||||
value: string;
|
value: string;
|
||||||
userGoodFeedback?: string;
|
userGoodFeedback?: string;
|
||||||
userBadFeedback?: string;
|
userBadFeedback?: string;
|
||||||
robotBadFeedback?: string;
|
customFeedbacks?: string[];
|
||||||
adminFeedback?: AdminFbkType;
|
adminFeedback?: AdminFbkType;
|
||||||
[ModuleOutputKeyEnum.responseData]?: ChatHistoryItemResType[];
|
[ModuleOutputKeyEnum.responseData]?: ChatHistoryItemResType[];
|
||||||
};
|
};
|
||||||
@@ -60,6 +60,7 @@ export type ChatItemType = {
|
|||||||
value: any;
|
value: any;
|
||||||
userGoodFeedback?: string;
|
userGoodFeedback?: string;
|
||||||
userBadFeedback?: string;
|
userBadFeedback?: string;
|
||||||
|
customFeedbacks?: ChatItemSchema['customFeedbacks'];
|
||||||
adminFeedback?: ChatItemSchema['feedback'];
|
adminFeedback?: ChatItemSchema['feedback'];
|
||||||
[ModuleOutputKeyEnum.responseData]?: ChatHistoryItemResType[];
|
[ModuleOutputKeyEnum.responseData]?: ChatHistoryItemResType[];
|
||||||
};
|
};
|
||||||
@@ -84,12 +85,15 @@ export type ChatHistoryItemType = HistoryItemType & {
|
|||||||
|
|
||||||
/* ------- response data ------------ */
|
/* ------- response data ------------ */
|
||||||
export type moduleDispatchResType = {
|
export type moduleDispatchResType = {
|
||||||
|
// common
|
||||||
moduleLogo?: string;
|
moduleLogo?: string;
|
||||||
price?: number;
|
price?: number;
|
||||||
runningTime?: number;
|
runningTime?: number;
|
||||||
tokens?: number;
|
tokens?: number;
|
||||||
model?: string;
|
model?: string;
|
||||||
query?: string;
|
query?: string;
|
||||||
|
contextTotalLen?: number;
|
||||||
|
textOutput?: string;
|
||||||
|
|
||||||
// chat
|
// chat
|
||||||
temperature?: number;
|
temperature?: number;
|
||||||
@@ -116,6 +120,10 @@ export type moduleDispatchResType = {
|
|||||||
|
|
||||||
// plugin output
|
// plugin output
|
||||||
pluginOutput?: Record<string, any>;
|
pluginOutput?: Record<string, any>;
|
||||||
|
pluginDetail?: ChatHistoryItemResType[];
|
||||||
|
|
||||||
|
// tf switch
|
||||||
|
tfSwitchResult?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ChatHistoryItemResType = moduleDispatchResType & {
|
export type ChatHistoryItemResType = moduleDispatchResType & {
|
||||||
|
|||||||
15
packages/global/core/module/api.d.ts
vendored
@@ -1,3 +1,18 @@
|
|||||||
import { VectorModelItemType } from '../ai/model.d';
|
import { VectorModelItemType } from '../ai/model.d';
|
||||||
|
|
||||||
export type SelectedDatasetType = { datasetId: string; vectorModel: VectorModelItemType }[];
|
export type SelectedDatasetType = { datasetId: string; vectorModel: VectorModelItemType }[];
|
||||||
|
|
||||||
|
export type HttpBodyType<T = any> = {
|
||||||
|
appId: string;
|
||||||
|
chatId?: string;
|
||||||
|
responseChatItemId?: string;
|
||||||
|
variables: Record<string, any>;
|
||||||
|
data: T;
|
||||||
|
};
|
||||||
|
export type HttpQueryType = {
|
||||||
|
appId: string;
|
||||||
|
chatId?: string;
|
||||||
|
responseChatItemId?: string;
|
||||||
|
variables: Record<string, any>;
|
||||||
|
[key: string]: any;
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,19 +1,17 @@
|
|||||||
export enum ModuleTemplateTypeEnum {
|
export enum ModuleTemplateTypeEnum {
|
||||||
userGuide = 'userGuide',
|
userGuide = 'userGuide',
|
||||||
systemInput = 'systemInput',
|
systemInput = 'systemInput',
|
||||||
|
tools = 'tools',
|
||||||
textAnswer = 'textAnswer',
|
textAnswer = 'textAnswer',
|
||||||
dataset = 'dataset',
|
|
||||||
functionCall = 'functionCall',
|
functionCall = 'functionCall',
|
||||||
externalCall = 'externalCall',
|
externalCall = 'externalCall',
|
||||||
|
|
||||||
personalPlugin = 'personalPlugin',
|
personalPlugin = 'personalPlugin',
|
||||||
communityPlugin = 'communityPlugin',
|
|
||||||
commercialPlugin = 'commercialPlugin',
|
|
||||||
|
|
||||||
other = 'other'
|
other = 'other'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum ModuleDataTypeEnum {
|
export enum ModuleIOValueTypeEnum {
|
||||||
string = 'string',
|
string = 'string',
|
||||||
number = 'number',
|
number = 'number',
|
||||||
boolean = 'boolean',
|
boolean = 'boolean',
|
||||||
@@ -44,6 +42,9 @@ export enum ModuleInputKeyEnum {
|
|||||||
aiModel = 'model',
|
aiModel = 'model',
|
||||||
aiSystemPrompt = 'systemPrompt',
|
aiSystemPrompt = 'systemPrompt',
|
||||||
description = 'description',
|
description = 'description',
|
||||||
|
anyInput = 'system_anyInput',
|
||||||
|
textareaInput = 'system_textareaInput',
|
||||||
|
addInputParam = 'system_addInputParam',
|
||||||
|
|
||||||
// history
|
// history
|
||||||
historyMaxAmount = 'maxContext',
|
historyMaxAmount = 'maxContext',
|
||||||
@@ -69,7 +70,10 @@ export enum ModuleInputKeyEnum {
|
|||||||
extractKeys = 'extractKeys',
|
extractKeys = 'extractKeys',
|
||||||
|
|
||||||
// http
|
// http
|
||||||
httpUrl = 'url',
|
httpReqUrl = 'system_httpReqUrl',
|
||||||
|
httpHeader = 'system_httpHeader',
|
||||||
|
httpMethod = 'system_httpMethod',
|
||||||
|
abandon_httpUrl = 'url',
|
||||||
|
|
||||||
// app
|
// app
|
||||||
runAppSelectApp = 'app',
|
runAppSelectApp = 'app',
|
||||||
@@ -87,6 +91,8 @@ export enum ModuleOutputKeyEnum {
|
|||||||
answerText = 'answerText', // answer module text key
|
answerText = 'answerText', // answer module text key
|
||||||
success = 'success',
|
success = 'success',
|
||||||
failed = 'failed',
|
failed = 'failed',
|
||||||
|
text = 'system_text',
|
||||||
|
addOutputParam = 'system_addOutputParam',
|
||||||
|
|
||||||
// dataset
|
// dataset
|
||||||
datasetIsEmpty = 'isEmpty',
|
datasetIsEmpty = 'isEmpty',
|
||||||
@@ -94,7 +100,11 @@ export enum ModuleOutputKeyEnum {
|
|||||||
datasetQuoteQA = 'quoteQA',
|
datasetQuoteQA = 'quoteQA',
|
||||||
|
|
||||||
// context extract
|
// context extract
|
||||||
contextExtractFields = 'fields'
|
contextExtractFields = 'fields',
|
||||||
|
|
||||||
|
// tf switch
|
||||||
|
resultTrue = 'system_resultTrue',
|
||||||
|
resultFalse = 'system_resultFalse'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum VariableInputEnum {
|
export enum VariableInputEnum {
|
||||||
@@ -102,3 +112,5 @@ export enum VariableInputEnum {
|
|||||||
textarea = 'textarea',
|
textarea = 'textarea',
|
||||||
select = 'select'
|
select = 'select'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const DYNAMIC_INPUT_KEY = 'DYNAMIC_INPUT_KEY';
|
||||||
|
|||||||
@@ -2,36 +2,42 @@ export enum FlowNodeInputTypeEnum {
|
|||||||
systemInput = 'systemInput', // history, userChatInput, variableInput
|
systemInput = 'systemInput', // history, userChatInput, variableInput
|
||||||
|
|
||||||
input = 'input', // one line input
|
input = 'input', // one line input
|
||||||
textarea = 'textarea',
|
|
||||||
numberInput = 'numberInput',
|
numberInput = 'numberInput',
|
||||||
select = 'select',
|
select = 'select',
|
||||||
slider = 'slider',
|
slider = 'slider',
|
||||||
custom = 'custom',
|
|
||||||
target = 'target', // data input
|
target = 'target', // data input
|
||||||
switch = 'switch',
|
switch = 'switch',
|
||||||
|
textarea = 'textarea',
|
||||||
|
|
||||||
|
addInputParam = 'addInputParam', // params input
|
||||||
|
|
||||||
selectApp = 'selectApp',
|
selectApp = 'selectApp',
|
||||||
|
|
||||||
// chat special input
|
// chat special input
|
||||||
aiSettings = 'aiSettings',
|
aiSettings = 'aiSettings',
|
||||||
|
|
||||||
// model select
|
// ai model select
|
||||||
selectChatModel = 'selectChatModel',
|
selectChatModel = 'selectChatModel',
|
||||||
selectCQModel = 'selectCQModel',
|
selectCQModel = 'selectCQModel',
|
||||||
|
selectExtractModel = 'selectExtractModel',
|
||||||
|
|
||||||
// dataset special input
|
// dataset special input
|
||||||
selectDataset = 'selectDataset',
|
selectDataset = 'selectDataset',
|
||||||
selectDatasetParamsModal = 'selectDatasetParamsModal',
|
selectDatasetParamsModal = 'selectDatasetParamsModal',
|
||||||
|
|
||||||
hidden = 'hidden'
|
hidden = 'hidden',
|
||||||
|
custom = 'custom'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum FlowNodeOutputTypeEnum {
|
export enum FlowNodeOutputTypeEnum {
|
||||||
answer = 'answer',
|
answer = 'answer',
|
||||||
source = 'source',
|
source = 'source',
|
||||||
hidden = 'hidden'
|
hidden = 'hidden',
|
||||||
|
|
||||||
|
addOutputParam = 'addOutputParam'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum FlowNodeTypeEnum {
|
export enum FlowNodeTypeEnum {
|
||||||
empty = 'empty',
|
|
||||||
userGuide = 'userGuide',
|
userGuide = 'userGuide',
|
||||||
questionInput = 'questionInput',
|
questionInput = 'questionInput',
|
||||||
historyNode = 'historyNode',
|
historyNode = 'historyNode',
|
||||||
@@ -45,7 +51,10 @@ export enum FlowNodeTypeEnum {
|
|||||||
pluginModule = 'pluginModule',
|
pluginModule = 'pluginModule',
|
||||||
pluginInput = 'pluginInput',
|
pluginInput = 'pluginInput',
|
||||||
pluginOutput = 'pluginOutput',
|
pluginOutput = 'pluginOutput',
|
||||||
|
cfr = 'cfr',
|
||||||
|
|
||||||
// abandon
|
// abandon
|
||||||
variable = 'variable'
|
variable = 'variable'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const EDGE_TYPE = 'default';
|
||||||
|
|||||||
66
packages/global/core/module/node/type.d.ts
vendored
@@ -1,6 +1,7 @@
|
|||||||
import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from './constant';
|
import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from './constant';
|
||||||
import { ModuleDataTypeEnum, ModuleInputKeyEnum, ModuleOutputKeyEnum } from '../constants';
|
import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleOutputKeyEnum } from '../constants';
|
||||||
import { SelectedDatasetType } from '../api';
|
import { SelectedDatasetType } from '../api';
|
||||||
|
import { EditInputFieldMap, EditOutputFieldMap } from './type';
|
||||||
|
|
||||||
export type FlowNodeChangeProps = {
|
export type FlowNodeChangeProps = {
|
||||||
moduleId: string;
|
moduleId: string;
|
||||||
@@ -20,27 +21,34 @@ export type FlowNodeChangeProps = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type FlowNodeInputItemType = {
|
export type FlowNodeInputItemType = {
|
||||||
|
valueType?: `${ModuleIOValueTypeEnum}`; // data type
|
||||||
|
type: `${FlowNodeInputTypeEnum}`; // Node Type. Decide on a render style
|
||||||
key: `${ModuleInputKeyEnum}` | string;
|
key: `${ModuleInputKeyEnum}` | string;
|
||||||
type: `${FlowNodeInputTypeEnum}`; // Decide on a render style
|
|
||||||
value?: any;
|
value?: any;
|
||||||
valueType?: `${ModuleDataTypeEnum}`; // data type
|
|
||||||
label: string;
|
label: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
required?: boolean;
|
required?: boolean;
|
||||||
|
|
||||||
edit?: boolean; // Whether to allow editing
|
edit?: boolean; // Whether to allow editing
|
||||||
connected?: boolean; // unConnected field will be deleted
|
editField?: EditInputFieldMap;
|
||||||
|
defaultEditField?: EditNodeFieldType;
|
||||||
|
|
||||||
|
connected?: boolean; // There are incoming data
|
||||||
|
|
||||||
showTargetInApp?: boolean;
|
showTargetInApp?: boolean;
|
||||||
showTargetInPlugin?: boolean;
|
showTargetInPlugin?: boolean;
|
||||||
|
|
||||||
placeholder?: string; // input,textarea
|
hideInApp?: boolean;
|
||||||
list?: { label: string; value: any }[]; // select
|
hideInPlugin?: boolean;
|
||||||
step?: number; // slider max?: number;
|
|
||||||
max?: number;
|
|
||||||
min?: number;
|
|
||||||
markList?: { label: string; value: any }[]; // slider
|
|
||||||
|
|
||||||
plusField?: boolean; // plus system will show
|
placeholder?: string; // input,textarea
|
||||||
|
|
||||||
|
list?: { label: string; value: any }[]; // select
|
||||||
|
|
||||||
|
markList?: { label: string; value: any }[]; // slider
|
||||||
|
step?: number; // slider
|
||||||
|
max?: number; // slider, number input
|
||||||
|
min?: number; // slider, number input
|
||||||
};
|
};
|
||||||
|
|
||||||
export type FlowNodeOutputTargetItemType = {
|
export type FlowNodeOutputTargetItemType = {
|
||||||
@@ -48,15 +56,41 @@ export type FlowNodeOutputTargetItemType = {
|
|||||||
key: string;
|
key: string;
|
||||||
};
|
};
|
||||||
export type FlowNodeOutputItemType = {
|
export type FlowNodeOutputItemType = {
|
||||||
key: `${ModuleOutputKeyEnum}` | string;
|
|
||||||
label?: string;
|
|
||||||
edit?: boolean;
|
|
||||||
description?: string;
|
|
||||||
valueType?: `${ModuleDataTypeEnum}`;
|
|
||||||
type?: `${FlowNodeOutputTypeEnum}`;
|
type?: `${FlowNodeOutputTypeEnum}`;
|
||||||
|
key: `${ModuleOutputKeyEnum}` | string;
|
||||||
|
valueType?: `${ModuleIOValueTypeEnum}`;
|
||||||
|
|
||||||
|
label?: string;
|
||||||
|
description?: string;
|
||||||
|
|
||||||
|
edit?: boolean;
|
||||||
|
editField?: EditOutputFieldMap;
|
||||||
|
defaultEditField?: EditNodeFieldType;
|
||||||
|
|
||||||
targets: FlowNodeOutputTargetItemType[];
|
targets: FlowNodeOutputTargetItemType[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* --------------- edit field ------------------- */
|
||||||
|
export type EditInputFieldMap = EditOutputFieldMap & {
|
||||||
|
inputType?: boolean;
|
||||||
|
required?: boolean;
|
||||||
|
};
|
||||||
|
export type EditOutputFieldMap = {
|
||||||
|
name?: boolean;
|
||||||
|
key?: boolean;
|
||||||
|
description?: boolean;
|
||||||
|
dataType?: boolean;
|
||||||
|
};
|
||||||
|
export type EditNodeFieldType = {
|
||||||
|
inputType?: `${FlowNodeInputTypeEnum}`; // input type
|
||||||
|
outputType?: `${FlowNodeOutputTypeEnum}`;
|
||||||
|
required?: boolean;
|
||||||
|
key?: string;
|
||||||
|
label?: string;
|
||||||
|
description?: string;
|
||||||
|
valueType?: `${ModuleIOValueTypeEnum}`;
|
||||||
|
};
|
||||||
|
|
||||||
/* ------------- item type --------------- */
|
/* ------------- item type --------------- */
|
||||||
/* ai chat modules props */
|
/* ai chat modules props */
|
||||||
export type AIChatModuleProps = {
|
export type AIChatModuleProps = {
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import type { FlowNodeInputItemType } from '../node/type.d';
|
import type { FlowNodeInputItemType } from '../node/type.d';
|
||||||
import { ModuleInputKeyEnum } from '../constants';
|
import { DYNAMIC_INPUT_KEY, ModuleInputKeyEnum } from '../constants';
|
||||||
import { FlowNodeInputTypeEnum } from '../node/constant';
|
import { FlowNodeInputTypeEnum } from '../node/constant';
|
||||||
import { ModuleDataTypeEnum } from '../constants';
|
import { ModuleIOValueTypeEnum } from '../constants';
|
||||||
|
|
||||||
export const Input_Template_TFSwitch: FlowNodeInputItemType = {
|
export const Input_Template_Switch: FlowNodeInputItemType = {
|
||||||
key: ModuleInputKeyEnum.switch,
|
key: ModuleInputKeyEnum.switch,
|
||||||
type: FlowNodeInputTypeEnum.target,
|
type: FlowNodeInputTypeEnum.target,
|
||||||
label: 'core.module.input.label.switch',
|
label: 'core.module.input.label.switch',
|
||||||
valueType: ModuleDataTypeEnum.any,
|
valueType: ModuleIOValueTypeEnum.any,
|
||||||
showTargetInApp: true,
|
showTargetInApp: true,
|
||||||
showTargetInPlugin: true
|
showTargetInPlugin: true
|
||||||
};
|
};
|
||||||
@@ -19,7 +19,7 @@ export const Input_Template_History: FlowNodeInputItemType = {
|
|||||||
required: true,
|
required: true,
|
||||||
min: 0,
|
min: 0,
|
||||||
max: 30,
|
max: 30,
|
||||||
valueType: ModuleDataTypeEnum.chatHistory,
|
valueType: ModuleIOValueTypeEnum.chatHistory,
|
||||||
value: 6,
|
value: 6,
|
||||||
showTargetInApp: true,
|
showTargetInApp: true,
|
||||||
showTargetInPlugin: true
|
showTargetInPlugin: true
|
||||||
@@ -30,7 +30,29 @@ export const Input_Template_UserChatInput: FlowNodeInputItemType = {
|
|||||||
type: FlowNodeInputTypeEnum.target,
|
type: FlowNodeInputTypeEnum.target,
|
||||||
label: 'core.module.input.label.user question',
|
label: 'core.module.input.label.user question',
|
||||||
required: true,
|
required: true,
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
showTargetInApp: true,
|
showTargetInApp: true,
|
||||||
showTargetInPlugin: true
|
showTargetInPlugin: true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const Input_Template_AddInputParam: FlowNodeInputItemType = {
|
||||||
|
key: ModuleInputKeyEnum.addInputParam,
|
||||||
|
type: FlowNodeInputTypeEnum.addInputParam,
|
||||||
|
valueType: ModuleIOValueTypeEnum.any,
|
||||||
|
label: '',
|
||||||
|
required: false,
|
||||||
|
showTargetInApp: false,
|
||||||
|
showTargetInPlugin: false
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Input_Template_DynamicInput: FlowNodeInputItemType = {
|
||||||
|
key: DYNAMIC_INPUT_KEY,
|
||||||
|
type: FlowNodeInputTypeEnum.target,
|
||||||
|
valueType: ModuleIOValueTypeEnum.any,
|
||||||
|
label: 'core.module.inputType.dynamicTargetInput',
|
||||||
|
description: 'core.module.input.description.dynamic input',
|
||||||
|
required: false,
|
||||||
|
showTargetInApp: false,
|
||||||
|
showTargetInPlugin: true,
|
||||||
|
hideInApp: true
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,13 +1,21 @@
|
|||||||
import type { FlowNodeOutputItemType } from '../node/type';
|
import type { FlowNodeOutputItemType } from '../node/type';
|
||||||
import { ModuleOutputKeyEnum } from '../constants';
|
import { ModuleOutputKeyEnum } from '../constants';
|
||||||
import { FlowNodeOutputTypeEnum } from '../node/constant';
|
import { FlowNodeOutputTypeEnum } from '../node/constant';
|
||||||
import { ModuleDataTypeEnum } from '../constants';
|
import { ModuleIOValueTypeEnum } from '../constants';
|
||||||
|
|
||||||
export const Output_Template_Finish: FlowNodeOutputItemType = {
|
export const Output_Template_Finish: FlowNodeOutputItemType = {
|
||||||
key: ModuleOutputKeyEnum.finish,
|
key: ModuleOutputKeyEnum.finish,
|
||||||
label: 'core.module.output.label.running done',
|
label: 'core.module.output.label.running done',
|
||||||
description: 'core.module.output.description.running done',
|
description: 'core.module.output.description.running done',
|
||||||
valueType: ModuleDataTypeEnum.boolean,
|
valueType: ModuleIOValueTypeEnum.boolean,
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
targets: []
|
targets: []
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const Output_Template_AddOutput: FlowNodeOutputItemType = {
|
||||||
|
key: ModuleOutputKeyEnum.addOutputParam,
|
||||||
|
type: FlowNodeOutputTypeEnum.addOutputParam,
|
||||||
|
valueType: ModuleIOValueTypeEnum.any,
|
||||||
|
label: '',
|
||||||
|
targets: []
|
||||||
|
};
|
||||||
|
|||||||
@@ -2,9 +2,13 @@ import {
|
|||||||
FlowNodeInputTypeEnum,
|
FlowNodeInputTypeEnum,
|
||||||
FlowNodeOutputTypeEnum,
|
FlowNodeOutputTypeEnum,
|
||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../../node/constant';
|
||||||
import { FlowModuleTemplateType } from '../../type.d';
|
import { FlowModuleTemplateType } from '../../../type';
|
||||||
import { ModuleDataTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants';
|
import {
|
||||||
|
ModuleIOValueTypeEnum,
|
||||||
|
ModuleInputKeyEnum,
|
||||||
|
ModuleTemplateTypeEnum
|
||||||
|
} from '../../../constants';
|
||||||
|
|
||||||
export const HistoryModule: FlowModuleTemplateType = {
|
export const HistoryModule: FlowModuleTemplateType = {
|
||||||
id: FlowNodeTypeEnum.historyNode,
|
id: FlowNodeTypeEnum.historyNode,
|
||||||
@@ -12,7 +16,7 @@ export const HistoryModule: FlowModuleTemplateType = {
|
|||||||
flowType: FlowNodeTypeEnum.historyNode,
|
flowType: FlowNodeTypeEnum.historyNode,
|
||||||
avatar: '/imgs/module/history.png',
|
avatar: '/imgs/module/history.png',
|
||||||
name: '聊天记录(弃用)',
|
name: '聊天记录(弃用)',
|
||||||
intro: '用户输入的内容。该模块通常作为应用的入口,用户在发送消息后会首先执行该模块。',
|
intro: '聊天记录,该模块已被弃用',
|
||||||
inputs: [
|
inputs: [
|
||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.historyMaxAmount,
|
key: ModuleInputKeyEnum.historyMaxAmount,
|
||||||
@@ -21,7 +25,7 @@ export const HistoryModule: FlowModuleTemplateType = {
|
|||||||
description:
|
description:
|
||||||
'该记录数不代表模型可接收这么多的历史记录,具体可接收多少历史记录,取决于模型的能力,通常建议不要超过20条。',
|
'该记录数不代表模型可接收这么多的历史记录,具体可接收多少历史记录,取决于模型的能力,通常建议不要超过20条。',
|
||||||
value: 6,
|
value: 6,
|
||||||
valueType: ModuleDataTypeEnum.number,
|
valueType: ModuleIOValueTypeEnum.number,
|
||||||
min: 0,
|
min: 0,
|
||||||
max: 100,
|
max: 100,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
@@ -30,7 +34,7 @@ export const HistoryModule: FlowModuleTemplateType = {
|
|||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.history,
|
key: ModuleInputKeyEnum.history,
|
||||||
type: FlowNodeInputTypeEnum.hidden,
|
type: FlowNodeInputTypeEnum.hidden,
|
||||||
valueType: ModuleDataTypeEnum.chatHistory,
|
valueType: ModuleIOValueTypeEnum.chatHistory,
|
||||||
label: '聊天记录',
|
label: '聊天记录',
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
@@ -40,7 +44,7 @@ export const HistoryModule: FlowModuleTemplateType = {
|
|||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.history,
|
key: ModuleInputKeyEnum.history,
|
||||||
label: '聊天记录',
|
label: '聊天记录',
|
||||||
valueType: ModuleDataTypeEnum.chatHistory,
|
valueType: ModuleIOValueTypeEnum.chatHistory,
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
targets: []
|
targets: []
|
||||||
}
|
}
|
||||||
@@ -5,14 +5,14 @@ import {
|
|||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowModuleTemplateType } from '../../type.d';
|
import { FlowModuleTemplateType } from '../../type.d';
|
||||||
import {
|
import {
|
||||||
ModuleDataTypeEnum,
|
ModuleIOValueTypeEnum,
|
||||||
ModuleInputKeyEnum,
|
ModuleInputKeyEnum,
|
||||||
ModuleOutputKeyEnum,
|
ModuleOutputKeyEnum,
|
||||||
ModuleTemplateTypeEnum
|
ModuleTemplateTypeEnum
|
||||||
} from '../../constants';
|
} from '../../constants';
|
||||||
import {
|
import {
|
||||||
Input_Template_History,
|
Input_Template_History,
|
||||||
Input_Template_TFSwitch,
|
Input_Template_Switch,
|
||||||
Input_Template_UserChatInput
|
Input_Template_UserChatInput
|
||||||
} from '../input';
|
} from '../input';
|
||||||
import { chatNodeSystemPromptTip } from '../tip';
|
import { chatNodeSystemPromptTip } from '../tip';
|
||||||
@@ -27,13 +27,13 @@ export const AiChatModule: FlowModuleTemplateType = {
|
|||||||
intro: 'AI 大模型对话',
|
intro: 'AI 大模型对话',
|
||||||
showStatus: true,
|
showStatus: true,
|
||||||
inputs: [
|
inputs: [
|
||||||
Input_Template_TFSwitch,
|
Input_Template_Switch,
|
||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.aiModel,
|
key: ModuleInputKeyEnum.aiModel,
|
||||||
type: FlowNodeInputTypeEnum.selectChatModel,
|
type: FlowNodeInputTypeEnum.selectChatModel,
|
||||||
label: '对话模型',
|
label: '对话模型',
|
||||||
required: true,
|
required: true,
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
},
|
},
|
||||||
@@ -43,7 +43,7 @@ export const AiChatModule: FlowModuleTemplateType = {
|
|||||||
type: FlowNodeInputTypeEnum.hidden, // Set in the pop-up window
|
type: FlowNodeInputTypeEnum.hidden, // Set in the pop-up window
|
||||||
label: '温度',
|
label: '温度',
|
||||||
value: 0,
|
value: 0,
|
||||||
valueType: ModuleDataTypeEnum.number,
|
valueType: ModuleIOValueTypeEnum.number,
|
||||||
min: 0,
|
min: 0,
|
||||||
max: 10,
|
max: 10,
|
||||||
step: 1,
|
step: 1,
|
||||||
@@ -59,7 +59,7 @@ export const AiChatModule: FlowModuleTemplateType = {
|
|||||||
type: FlowNodeInputTypeEnum.hidden, // Set in the pop-up window
|
type: FlowNodeInputTypeEnum.hidden, // Set in the pop-up window
|
||||||
label: '回复上限',
|
label: '回复上限',
|
||||||
value: 2000,
|
value: 2000,
|
||||||
valueType: ModuleDataTypeEnum.number,
|
valueType: ModuleIOValueTypeEnum.number,
|
||||||
min: 100,
|
min: 100,
|
||||||
max: 4000,
|
max: 4000,
|
||||||
step: 50,
|
step: 50,
|
||||||
@@ -78,7 +78,7 @@ export const AiChatModule: FlowModuleTemplateType = {
|
|||||||
type: FlowNodeInputTypeEnum.hidden,
|
type: FlowNodeInputTypeEnum.hidden,
|
||||||
label: '返回AI内容',
|
label: '返回AI内容',
|
||||||
value: true,
|
value: true,
|
||||||
valueType: ModuleDataTypeEnum.boolean,
|
valueType: ModuleIOValueTypeEnum.boolean,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
},
|
},
|
||||||
@@ -86,7 +86,7 @@ export const AiChatModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleInputKeyEnum.aiChatQuoteTemplate,
|
key: ModuleInputKeyEnum.aiChatQuoteTemplate,
|
||||||
type: FlowNodeInputTypeEnum.hidden,
|
type: FlowNodeInputTypeEnum.hidden,
|
||||||
label: '引用内容模板',
|
label: '引用内容模板',
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
},
|
},
|
||||||
@@ -94,7 +94,7 @@ export const AiChatModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleInputKeyEnum.aiChatQuotePrompt,
|
key: ModuleInputKeyEnum.aiChatQuotePrompt,
|
||||||
type: FlowNodeInputTypeEnum.hidden,
|
type: FlowNodeInputTypeEnum.hidden,
|
||||||
label: '引用内容提示词',
|
label: '引用内容提示词',
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
},
|
},
|
||||||
@@ -102,7 +102,7 @@ export const AiChatModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleInputKeyEnum.aiChatSettingModal,
|
key: ModuleInputKeyEnum.aiChatSettingModal,
|
||||||
type: FlowNodeInputTypeEnum.aiSettings,
|
type: FlowNodeInputTypeEnum.aiSettings,
|
||||||
label: '',
|
label: '',
|
||||||
valueType: ModuleDataTypeEnum.any,
|
valueType: ModuleIOValueTypeEnum.any,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
},
|
},
|
||||||
@@ -112,7 +112,7 @@ export const AiChatModule: FlowModuleTemplateType = {
|
|||||||
type: FlowNodeInputTypeEnum.textarea,
|
type: FlowNodeInputTypeEnum.textarea,
|
||||||
label: '系统提示词',
|
label: '系统提示词',
|
||||||
max: 300,
|
max: 300,
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
description: chatNodeSystemPromptTip,
|
description: chatNodeSystemPromptTip,
|
||||||
placeholder: chatNodeSystemPromptTip,
|
placeholder: chatNodeSystemPromptTip,
|
||||||
showTargetInApp: true,
|
showTargetInApp: true,
|
||||||
@@ -124,7 +124,7 @@ export const AiChatModule: FlowModuleTemplateType = {
|
|||||||
type: FlowNodeInputTypeEnum.target,
|
type: FlowNodeInputTypeEnum.target,
|
||||||
label: '引用内容',
|
label: '引用内容',
|
||||||
description: "对象数组格式,结构:\n [{q:'问题',a:'回答'}]",
|
description: "对象数组格式,结构:\n [{q:'问题',a:'回答'}]",
|
||||||
valueType: ModuleDataTypeEnum.datasetQuote,
|
valueType: ModuleIOValueTypeEnum.datasetQuote,
|
||||||
showTargetInApp: true,
|
showTargetInApp: true,
|
||||||
showTargetInPlugin: true
|
showTargetInPlugin: true
|
||||||
},
|
},
|
||||||
@@ -135,15 +135,15 @@ export const AiChatModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleOutputKeyEnum.history,
|
key: ModuleOutputKeyEnum.history,
|
||||||
label: '新的上下文',
|
label: '新的上下文',
|
||||||
description: '将本次回复内容拼接上历史记录,作为新的上下文返回',
|
description: '将本次回复内容拼接上历史记录,作为新的上下文返回',
|
||||||
valueType: ModuleDataTypeEnum.chatHistory,
|
valueType: ModuleIOValueTypeEnum.chatHistory,
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
targets: []
|
targets: []
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: ModuleOutputKeyEnum.answerText,
|
key: ModuleOutputKeyEnum.answerText,
|
||||||
label: 'AI回复',
|
label: 'AI回复内容',
|
||||||
description: '将在 stream 回复完毕后触发',
|
description: '将在 stream 回复完毕后触发',
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
targets: []
|
targets: []
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../node/constant';
|
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../node/constant';
|
||||||
import { FlowModuleTemplateType } from '../../type.d';
|
import { FlowModuleTemplateType } from '../../type.d';
|
||||||
import { ModuleDataTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants';
|
import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants';
|
||||||
import { Input_Template_TFSwitch } from '../input';
|
import { Input_Template_Switch } from '../input';
|
||||||
import { Output_Template_Finish } from '../output';
|
import { Output_Template_Finish } from '../output';
|
||||||
|
|
||||||
export const AssignedAnswerModule: FlowModuleTemplateType = {
|
export const AssignedAnswerModule: FlowModuleTemplateType = {
|
||||||
@@ -12,14 +12,16 @@ export const AssignedAnswerModule: FlowModuleTemplateType = {
|
|||||||
name: '指定回复',
|
name: '指定回复',
|
||||||
intro: '该模块可以直接回复一段指定的内容。常用于引导、提示',
|
intro: '该模块可以直接回复一段指定的内容。常用于引导、提示',
|
||||||
inputs: [
|
inputs: [
|
||||||
Input_Template_TFSwitch,
|
Input_Template_Switch,
|
||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.answerText,
|
key: ModuleInputKeyEnum.answerText,
|
||||||
type: FlowNodeInputTypeEnum.textarea,
|
type: FlowNodeInputTypeEnum.textarea,
|
||||||
valueType: ModuleDataTypeEnum.any,
|
valueType: ModuleIOValueTypeEnum.any,
|
||||||
label: '回复的内容',
|
label: '回复的内容',
|
||||||
description:
|
description:
|
||||||
'可以使用 \\n 来实现连续换行。\n\n可以通过外部模块输入实现回复,外部模块输入时会覆盖当前填写的内容。\n\n如传入非字符串类型数据将会自动转成字符串',
|
'可以使用 \\n 来实现连续换行。\n可以通过外部模块输入实现回复,外部模块输入时会覆盖当前填写的内容。\n如传入非字符串类型数据将会自动转成字符串',
|
||||||
|
placeholder:
|
||||||
|
'可以使用 \\n 来实现连续换行。\n可以通过外部模块输入实现回复,外部模块输入时会覆盖当前填写的内容。\n如传入非字符串类型数据将会自动转成字符串',
|
||||||
showTargetInApp: true,
|
showTargetInApp: true,
|
||||||
showTargetInPlugin: true
|
showTargetInPlugin: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import {
|
|||||||
FlowNodeTypeEnum
|
FlowNodeTypeEnum
|
||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowModuleTemplateType } from '../../type.d';
|
import { FlowModuleTemplateType } from '../../type.d';
|
||||||
import { ModuleDataTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants';
|
import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants';
|
||||||
import {
|
import {
|
||||||
Input_Template_History,
|
Input_Template_History,
|
||||||
Input_Template_TFSwitch,
|
Input_Template_Switch,
|
||||||
Input_Template_UserChatInput
|
Input_Template_UserChatInput
|
||||||
} from '../input';
|
} from '../input';
|
||||||
|
|
||||||
@@ -24,11 +24,11 @@ export const ClassifyQuestionModule: FlowModuleTemplateType = {
|
|||||||
类型4: 其他问题`,
|
类型4: 其他问题`,
|
||||||
showStatus: true,
|
showStatus: true,
|
||||||
inputs: [
|
inputs: [
|
||||||
Input_Template_TFSwitch,
|
Input_Template_Switch,
|
||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.aiModel,
|
key: ModuleInputKeyEnum.aiModel,
|
||||||
type: FlowNodeInputTypeEnum.selectCQModel,
|
type: FlowNodeInputTypeEnum.selectCQModel,
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
label: '分类模型',
|
label: '分类模型',
|
||||||
required: true,
|
required: true,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
@@ -37,7 +37,7 @@ export const ClassifyQuestionModule: FlowModuleTemplateType = {
|
|||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.aiSystemPrompt,
|
key: ModuleInputKeyEnum.aiSystemPrompt,
|
||||||
type: FlowNodeInputTypeEnum.textarea,
|
type: FlowNodeInputTypeEnum.textarea,
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
label: '背景知识',
|
label: '背景知识',
|
||||||
description:
|
description:
|
||||||
'你可以添加一些特定内容的介绍,从而更好的识别用户的问题类型。这个内容通常是给模型介绍一个它不知道的内容。',
|
'你可以添加一些特定内容的介绍,从而更好的识别用户的问题类型。这个内容通常是给模型介绍一个它不知道的内容。',
|
||||||
@@ -51,7 +51,7 @@ export const ClassifyQuestionModule: FlowModuleTemplateType = {
|
|||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.agents,
|
key: ModuleInputKeyEnum.agents,
|
||||||
type: FlowNodeInputTypeEnum.custom,
|
type: FlowNodeInputTypeEnum.custom,
|
||||||
valueType: ModuleDataTypeEnum.any,
|
valueType: ModuleIOValueTypeEnum.any,
|
||||||
label: '',
|
label: '',
|
||||||
value: [
|
value: [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ import {
|
|||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowModuleTemplateType } from '../../type.d';
|
import { FlowModuleTemplateType } from '../../type.d';
|
||||||
import {
|
import {
|
||||||
ModuleDataTypeEnum,
|
ModuleIOValueTypeEnum,
|
||||||
ModuleInputKeyEnum,
|
ModuleInputKeyEnum,
|
||||||
ModuleOutputKeyEnum,
|
ModuleOutputKeyEnum,
|
||||||
ModuleTemplateTypeEnum
|
ModuleTemplateTypeEnum
|
||||||
} from '../../constants';
|
} from '../../constants';
|
||||||
import { Input_Template_History, Input_Template_TFSwitch } from '../input';
|
import { Input_Template_History, Input_Template_Switch } from '../input';
|
||||||
|
|
||||||
export const ContextExtractModule: FlowModuleTemplateType = {
|
export const ContextExtractModule: FlowModuleTemplateType = {
|
||||||
id: FlowNodeTypeEnum.contentExtract,
|
id: FlowNodeTypeEnum.contentExtract,
|
||||||
@@ -21,11 +21,20 @@ export const ContextExtractModule: FlowModuleTemplateType = {
|
|||||||
intro: '可从文本中提取指定的数据,例如:sql语句、搜索关键词、代码等',
|
intro: '可从文本中提取指定的数据,例如:sql语句、搜索关键词、代码等',
|
||||||
showStatus: true,
|
showStatus: true,
|
||||||
inputs: [
|
inputs: [
|
||||||
Input_Template_TFSwitch,
|
Input_Template_Switch,
|
||||||
|
{
|
||||||
|
key: ModuleInputKeyEnum.aiModel,
|
||||||
|
type: FlowNodeInputTypeEnum.selectExtractModel,
|
||||||
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
|
label: '提取模型',
|
||||||
|
required: true,
|
||||||
|
showTargetInApp: false,
|
||||||
|
showTargetInPlugin: false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.description,
|
key: ModuleInputKeyEnum.description,
|
||||||
type: FlowNodeInputTypeEnum.textarea,
|
type: FlowNodeInputTypeEnum.textarea,
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
label: '提取要求描述',
|
label: '提取要求描述',
|
||||||
description: '给AI一些对应的背景知识或要求描述,引导AI更好的完成任务',
|
description: '给AI一些对应的背景知识或要求描述,引导AI更好的完成任务',
|
||||||
required: true,
|
required: true,
|
||||||
@@ -40,7 +49,7 @@ export const ContextExtractModule: FlowModuleTemplateType = {
|
|||||||
type: FlowNodeInputTypeEnum.target,
|
type: FlowNodeInputTypeEnum.target,
|
||||||
label: '需要提取的文本',
|
label: '需要提取的文本',
|
||||||
required: true,
|
required: true,
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
showTargetInApp: true,
|
showTargetInApp: true,
|
||||||
showTargetInPlugin: true
|
showTargetInPlugin: true
|
||||||
},
|
},
|
||||||
@@ -48,9 +57,9 @@ export const ContextExtractModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleInputKeyEnum.extractKeys,
|
key: ModuleInputKeyEnum.extractKeys,
|
||||||
type: FlowNodeInputTypeEnum.custom,
|
type: FlowNodeInputTypeEnum.custom,
|
||||||
label: '目标字段',
|
label: '目标字段',
|
||||||
valueType: ModuleDataTypeEnum.any,
|
valueType: ModuleIOValueTypeEnum.any,
|
||||||
description: "由 '描述' 和 'key' 组成一个目标字段,可提取多个目标字段",
|
description: "由 '描述' 和 'key' 组成一个目标字段,可提取多个目标字段",
|
||||||
value: [], // {desc: string; key: string; required: boolean;}[]
|
value: [], // {desc: string; key: string; required: boolean; enum: string[]}[]
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
}
|
}
|
||||||
@@ -59,14 +68,14 @@ export const ContextExtractModule: FlowModuleTemplateType = {
|
|||||||
{
|
{
|
||||||
key: ModuleOutputKeyEnum.success,
|
key: ModuleOutputKeyEnum.success,
|
||||||
label: '字段完全提取',
|
label: '字段完全提取',
|
||||||
valueType: ModuleDataTypeEnum.boolean,
|
valueType: ModuleIOValueTypeEnum.boolean,
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
targets: []
|
targets: []
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: ModuleOutputKeyEnum.failed,
|
key: ModuleOutputKeyEnum.failed,
|
||||||
label: '提取字段缺失',
|
label: '提取字段缺失',
|
||||||
valueType: ModuleDataTypeEnum.boolean,
|
valueType: ModuleIOValueTypeEnum.boolean,
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
targets: []
|
targets: []
|
||||||
},
|
},
|
||||||
@@ -74,7 +83,7 @@ export const ContextExtractModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleOutputKeyEnum.contextExtractFields,
|
key: ModuleOutputKeyEnum.contextExtractFields,
|
||||||
label: '完整提取结果',
|
label: '完整提取结果',
|
||||||
description: '一个 JSON 字符串,例如:{"name:":"YY","Time":"2023/7/2 18:00"}',
|
description: '一个 JSON 字符串,例如:{"name:":"YY","Time":"2023/7/2 18:00"}',
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
targets: []
|
targets: []
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
import {
|
||||||
|
FlowNodeInputTypeEnum,
|
||||||
|
FlowNodeOutputTypeEnum,
|
||||||
|
FlowNodeTypeEnum
|
||||||
|
} from '../../node/constant';
|
||||||
|
import { FlowModuleTemplateType } from '../../type.d';
|
||||||
|
import {
|
||||||
|
ModuleIOValueTypeEnum,
|
||||||
|
ModuleInputKeyEnum,
|
||||||
|
ModuleOutputKeyEnum,
|
||||||
|
ModuleTemplateTypeEnum
|
||||||
|
} from '../../constants';
|
||||||
|
import {
|
||||||
|
Input_Template_History,
|
||||||
|
Input_Template_Switch,
|
||||||
|
Input_Template_UserChatInput
|
||||||
|
} from '../input';
|
||||||
|
|
||||||
|
export const AiCFR: FlowModuleTemplateType = {
|
||||||
|
id: FlowNodeTypeEnum.chatNode,
|
||||||
|
templateType: ModuleTemplateTypeEnum.tools,
|
||||||
|
flowType: FlowNodeTypeEnum.cfr,
|
||||||
|
avatar: '/imgs/module/cfr.svg',
|
||||||
|
name: 'core.module.template.cfr',
|
||||||
|
intro: 'core.module.template.cfr intro',
|
||||||
|
showStatus: true,
|
||||||
|
inputs: [
|
||||||
|
Input_Template_Switch,
|
||||||
|
{
|
||||||
|
key: ModuleInputKeyEnum.aiModel,
|
||||||
|
type: FlowNodeInputTypeEnum.selectExtractModel,
|
||||||
|
label: 'core.module.input.label.aiModel',
|
||||||
|
required: true,
|
||||||
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
|
showTargetInApp: false,
|
||||||
|
showTargetInPlugin: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: ModuleInputKeyEnum.aiSystemPrompt,
|
||||||
|
type: FlowNodeInputTypeEnum.textarea,
|
||||||
|
label: 'core.module.input.label.cfr background',
|
||||||
|
max: 300,
|
||||||
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
|
description: 'core.module.input.description.cfr background',
|
||||||
|
placeholder: 'core.module.input.placeholder.cfr background',
|
||||||
|
showTargetInApp: true,
|
||||||
|
showTargetInPlugin: true
|
||||||
|
},
|
||||||
|
Input_Template_History,
|
||||||
|
Input_Template_UserChatInput
|
||||||
|
],
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
key: ModuleOutputKeyEnum.text,
|
||||||
|
label: 'core.module.output.label.cfr result',
|
||||||
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
|
targets: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
@@ -5,31 +5,31 @@ import {
|
|||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowModuleTemplateType } from '../../type.d';
|
import { FlowModuleTemplateType } from '../../type.d';
|
||||||
import {
|
import {
|
||||||
ModuleDataTypeEnum,
|
ModuleIOValueTypeEnum,
|
||||||
ModuleInputKeyEnum,
|
ModuleInputKeyEnum,
|
||||||
ModuleOutputKeyEnum,
|
ModuleOutputKeyEnum,
|
||||||
ModuleTemplateTypeEnum
|
ModuleTemplateTypeEnum
|
||||||
} from '../../constants';
|
} from '../../constants';
|
||||||
import { Input_Template_TFSwitch, Input_Template_UserChatInput } from '../input';
|
import { Input_Template_Switch, Input_Template_UserChatInput } from '../input';
|
||||||
import { Output_Template_Finish } from '../output';
|
import { Output_Template_Finish } from '../output';
|
||||||
import { DatasetSearchModeEnum } from '../../../dataset/constant';
|
import { DatasetSearchModeEnum } from '../../../dataset/constant';
|
||||||
|
|
||||||
export const DatasetSearchModule: FlowModuleTemplateType = {
|
export const DatasetSearchModule: FlowModuleTemplateType = {
|
||||||
id: FlowNodeTypeEnum.datasetSearchNode,
|
id: FlowNodeTypeEnum.datasetSearchNode,
|
||||||
templateType: ModuleTemplateTypeEnum.dataset,
|
templateType: ModuleTemplateTypeEnum.functionCall,
|
||||||
flowType: FlowNodeTypeEnum.datasetSearchNode,
|
flowType: FlowNodeTypeEnum.datasetSearchNode,
|
||||||
avatar: '/imgs/module/db.png',
|
avatar: '/imgs/module/db.png',
|
||||||
name: '知识库搜索',
|
name: '知识库搜索',
|
||||||
intro: '去知识库中搜索对应的答案。可作为 AI 对话引用参考。',
|
intro: '去知识库中搜索对应的答案。可作为 AI 对话引用参考。',
|
||||||
showStatus: true,
|
showStatus: true,
|
||||||
inputs: [
|
inputs: [
|
||||||
Input_Template_TFSwitch,
|
Input_Template_Switch,
|
||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.datasetSelectList,
|
key: ModuleInputKeyEnum.datasetSelectList,
|
||||||
type: FlowNodeInputTypeEnum.selectDataset,
|
type: FlowNodeInputTypeEnum.selectDataset,
|
||||||
label: '关联的知识库',
|
label: '关联的知识库',
|
||||||
value: [],
|
value: [],
|
||||||
valueType: ModuleDataTypeEnum.selectDataset,
|
valueType: ModuleIOValueTypeEnum.selectDataset,
|
||||||
list: [],
|
list: [],
|
||||||
required: true,
|
required: true,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
@@ -40,7 +40,7 @@ export const DatasetSearchModule: FlowModuleTemplateType = {
|
|||||||
type: FlowNodeInputTypeEnum.hidden,
|
type: FlowNodeInputTypeEnum.hidden,
|
||||||
label: '最低相关性',
|
label: '最低相关性',
|
||||||
value: 0.4,
|
value: 0.4,
|
||||||
valueType: ModuleDataTypeEnum.number,
|
valueType: ModuleIOValueTypeEnum.number,
|
||||||
min: 0,
|
min: 0,
|
||||||
max: 1,
|
max: 1,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
@@ -57,7 +57,7 @@ export const DatasetSearchModule: FlowModuleTemplateType = {
|
|||||||
label: '引用上限',
|
label: '引用上限',
|
||||||
description: '单次搜索最大的 Tokens 数量,中文约1字=1.7Tokens,英文约1字=1Tokens',
|
description: '单次搜索最大的 Tokens 数量,中文约1字=1.7Tokens,英文约1字=1Tokens',
|
||||||
value: 1500,
|
value: 1500,
|
||||||
valueType: ModuleDataTypeEnum.number,
|
valueType: ModuleIOValueTypeEnum.number,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
},
|
},
|
||||||
@@ -65,7 +65,7 @@ export const DatasetSearchModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleInputKeyEnum.datasetSearchMode,
|
key: ModuleInputKeyEnum.datasetSearchMode,
|
||||||
type: FlowNodeInputTypeEnum.hidden,
|
type: FlowNodeInputTypeEnum.hidden,
|
||||||
label: 'core.dataset.search.Mode',
|
label: 'core.dataset.search.Mode',
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false,
|
showTargetInPlugin: false,
|
||||||
value: DatasetSearchModeEnum.embedding
|
value: DatasetSearchModeEnum.embedding
|
||||||
@@ -74,7 +74,7 @@ export const DatasetSearchModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleInputKeyEnum.datasetParamsModal,
|
key: ModuleInputKeyEnum.datasetParamsModal,
|
||||||
type: FlowNodeInputTypeEnum.selectDatasetParamsModal,
|
type: FlowNodeInputTypeEnum.selectDatasetParamsModal,
|
||||||
label: '',
|
label: '',
|
||||||
valueType: ModuleDataTypeEnum.any,
|
valueType: ModuleIOValueTypeEnum.any,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
},
|
},
|
||||||
@@ -85,14 +85,14 @@ export const DatasetSearchModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleOutputKeyEnum.datasetIsEmpty,
|
key: ModuleOutputKeyEnum.datasetIsEmpty,
|
||||||
label: '搜索结果为空',
|
label: '搜索结果为空',
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
valueType: ModuleDataTypeEnum.boolean,
|
valueType: ModuleIOValueTypeEnum.boolean,
|
||||||
targets: []
|
targets: []
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: ModuleOutputKeyEnum.datasetUnEmpty,
|
key: ModuleOutputKeyEnum.datasetUnEmpty,
|
||||||
label: '搜索结果不为空',
|
label: '搜索结果不为空',
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
valueType: ModuleDataTypeEnum.boolean,
|
valueType: ModuleIOValueTypeEnum.boolean,
|
||||||
targets: []
|
targets: []
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -101,7 +101,7 @@ export const DatasetSearchModule: FlowModuleTemplateType = {
|
|||||||
description:
|
description:
|
||||||
'始终返回数组,如果希望搜索结果为空时执行额外操作,需要用到上面的两个输入以及目标模块的触发器',
|
'始终返回数组,如果希望搜索结果为空时执行额外操作,需要用到上面的两个输入以及目标模块的触发器',
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
valueType: ModuleDataTypeEnum.datasetQuote,
|
valueType: ModuleIOValueTypeEnum.datasetQuote,
|
||||||
targets: []
|
targets: []
|
||||||
},
|
},
|
||||||
Output_Template_Finish
|
Output_Template_Finish
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
import { ModuleTemplateTypeEnum } from '../../constants';
|
|
||||||
import { FlowNodeTypeEnum } from '../../node/constant';
|
|
||||||
import { FlowModuleTemplateType } from '../../type.d';
|
|
||||||
|
|
||||||
export const EmptyModule: FlowModuleTemplateType = {
|
|
||||||
id: FlowNodeTypeEnum.empty,
|
|
||||||
templateType: ModuleTemplateTypeEnum.other,
|
|
||||||
flowType: FlowNodeTypeEnum.empty,
|
|
||||||
avatar: '/imgs/module/cq.png',
|
|
||||||
name: '该模块已被移除',
|
|
||||||
intro: '',
|
|
||||||
inputs: [],
|
|
||||||
outputs: []
|
|
||||||
};
|
|
||||||
@@ -1,8 +1,16 @@
|
|||||||
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../node/constant';
|
import {
|
||||||
import { FlowModuleTemplateType } from '../../type.d';
|
FlowNodeInputTypeEnum,
|
||||||
import { ModuleDataTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants';
|
FlowNodeOutputTypeEnum,
|
||||||
import { Input_Template_TFSwitch } from '../input';
|
FlowNodeTypeEnum
|
||||||
import { Output_Template_Finish } from '../output';
|
} from '../../node/constant';
|
||||||
|
import { FlowModuleTemplateType } from '../../type';
|
||||||
|
import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants';
|
||||||
|
import {
|
||||||
|
Input_Template_AddInputParam,
|
||||||
|
Input_Template_DynamicInput,
|
||||||
|
Input_Template_Switch
|
||||||
|
} from '../input';
|
||||||
|
import { Output_Template_AddOutput, Output_Template_Finish } from '../output';
|
||||||
|
|
||||||
export const HttpModule: FlowModuleTemplateType = {
|
export const HttpModule: FlowModuleTemplateType = {
|
||||||
id: FlowNodeTypeEnum.httpRequest,
|
id: FlowNodeTypeEnum.httpRequest,
|
||||||
@@ -13,18 +21,86 @@ export const HttpModule: FlowModuleTemplateType = {
|
|||||||
intro: '可以发出一个 HTTP POST 请求,实现更为复杂的操作(联网搜索、数据库查询等)',
|
intro: '可以发出一个 HTTP POST 请求,实现更为复杂的操作(联网搜索、数据库查询等)',
|
||||||
showStatus: true,
|
showStatus: true,
|
||||||
inputs: [
|
inputs: [
|
||||||
Input_Template_TFSwitch,
|
Input_Template_Switch,
|
||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.httpUrl,
|
key: ModuleInputKeyEnum.httpMethod,
|
||||||
type: FlowNodeInputTypeEnum.input,
|
type: FlowNodeInputTypeEnum.select,
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
label: '请求地址',
|
label: 'core.module.input.label.Http Request Method',
|
||||||
description: '请求目标地址',
|
value: 'POST',
|
||||||
placeholder: 'https://api.ai.com/getInventory',
|
list: [
|
||||||
|
{
|
||||||
|
label: 'GET',
|
||||||
|
value: 'GET'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'POST',
|
||||||
|
value: 'POST'
|
||||||
|
}
|
||||||
|
],
|
||||||
required: true,
|
required: true,
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: ModuleInputKeyEnum.httpReqUrl,
|
||||||
|
type: FlowNodeInputTypeEnum.input,
|
||||||
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
|
label: 'core.module.input.label.Http Request Url',
|
||||||
|
description: 'core.module.input.description.Http Request Url',
|
||||||
|
placeholder: 'https://api.ai.com/getInventory',
|
||||||
|
required: false,
|
||||||
|
showTargetInApp: false,
|
||||||
|
showTargetInPlugin: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: ModuleInputKeyEnum.httpHeader,
|
||||||
|
type: FlowNodeInputTypeEnum.textarea,
|
||||||
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
|
label: 'core.module.input.label.Http Request Header',
|
||||||
|
description: 'core.module.input.description.Http Request Header',
|
||||||
|
placeholder: 'core.module.input.description.Http Request Header',
|
||||||
|
required: false,
|
||||||
|
showTargetInApp: false,
|
||||||
|
showTargetInPlugin: false
|
||||||
|
},
|
||||||
|
Input_Template_DynamicInput,
|
||||||
|
{
|
||||||
|
...Input_Template_AddInputParam,
|
||||||
|
editField: {
|
||||||
|
key: true,
|
||||||
|
name: true,
|
||||||
|
description: true,
|
||||||
|
required: true,
|
||||||
|
dataType: true
|
||||||
|
},
|
||||||
|
defaultEditField: {
|
||||||
|
label: '',
|
||||||
|
key: '',
|
||||||
|
description: '',
|
||||||
|
inputType: FlowNodeInputTypeEnum.target,
|
||||||
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
outputs: [Output_Template_Finish]
|
outputs: [
|
||||||
|
Output_Template_Finish,
|
||||||
|
{
|
||||||
|
...Output_Template_AddOutput,
|
||||||
|
editField: {
|
||||||
|
key: true,
|
||||||
|
name: true,
|
||||||
|
description: true,
|
||||||
|
dataType: true
|
||||||
|
},
|
||||||
|
defaultEditField: {
|
||||||
|
label: '',
|
||||||
|
key: '',
|
||||||
|
description: '',
|
||||||
|
outputType: FlowNodeOutputTypeEnum.source,
|
||||||
|
valueType: ModuleIOValueTypeEnum.string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ import {
|
|||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowModuleTemplateType } from '../../type.d';
|
import { FlowModuleTemplateType } from '../../type.d';
|
||||||
import {
|
import {
|
||||||
ModuleDataTypeEnum,
|
ModuleIOValueTypeEnum,
|
||||||
ModuleInputKeyEnum,
|
ModuleInputKeyEnum,
|
||||||
ModuleOutputKeyEnum,
|
ModuleOutputKeyEnum,
|
||||||
ModuleTemplateTypeEnum
|
ModuleTemplateTypeEnum
|
||||||
} from '../../constants';
|
} from '../../constants';
|
||||||
import {
|
import {
|
||||||
Input_Template_History,
|
Input_Template_History,
|
||||||
Input_Template_TFSwitch,
|
Input_Template_Switch,
|
||||||
Input_Template_UserChatInput
|
Input_Template_UserChatInput
|
||||||
} from '../input';
|
} from '../input';
|
||||||
import { Output_Template_Finish } from '../output';
|
import { Output_Template_Finish } from '../output';
|
||||||
@@ -26,11 +26,11 @@ export const RunAppModule: FlowModuleTemplateType = {
|
|||||||
intro: '可以选择一个其他应用进行调用',
|
intro: '可以选择一个其他应用进行调用',
|
||||||
showStatus: true,
|
showStatus: true,
|
||||||
inputs: [
|
inputs: [
|
||||||
Input_Template_TFSwitch,
|
Input_Template_Switch,
|
||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.runAppSelectApp,
|
key: ModuleInputKeyEnum.runAppSelectApp,
|
||||||
type: FlowNodeInputTypeEnum.selectApp,
|
type: FlowNodeInputTypeEnum.selectApp,
|
||||||
valueType: ModuleDataTypeEnum.selectApp,
|
valueType: ModuleIOValueTypeEnum.selectApp,
|
||||||
label: '选择一个应用',
|
label: '选择一个应用',
|
||||||
description: '选择一个其他应用进行调用',
|
description: '选择一个其他应用进行调用',
|
||||||
required: true,
|
required: true,
|
||||||
@@ -45,7 +45,7 @@ export const RunAppModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleOutputKeyEnum.history,
|
key: ModuleOutputKeyEnum.history,
|
||||||
label: '新的上下文',
|
label: '新的上下文',
|
||||||
description: '将该应用回复内容拼接到历史记录中,作为新的上下文返回',
|
description: '将该应用回复内容拼接到历史记录中,作为新的上下文返回',
|
||||||
valueType: ModuleDataTypeEnum.chatHistory,
|
valueType: ModuleIOValueTypeEnum.chatHistory,
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
targets: []
|
targets: []
|
||||||
},
|
},
|
||||||
@@ -53,7 +53,7 @@ export const RunAppModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleOutputKeyEnum.answerText,
|
key: ModuleOutputKeyEnum.answerText,
|
||||||
label: 'AI回复',
|
label: 'AI回复',
|
||||||
description: '将在应用完全结束后触发',
|
description: '将在应用完全结束后触发',
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
targets: []
|
targets: []
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../node/constant';
|
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../node/constant';
|
||||||
import { FlowModuleTemplateType } from '../../type.d';
|
import { FlowModuleTemplateType } from '../../type.d';
|
||||||
import { userGuideTip } from '../tip';
|
import { userGuideTip } from '../tip';
|
||||||
import { ModuleDataTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants';
|
import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants';
|
||||||
|
|
||||||
export const UserGuideModule: FlowModuleTemplateType = {
|
export const UserGuideModule: FlowModuleTemplateType = {
|
||||||
id: FlowNodeTypeEnum.userGuide,
|
id: FlowNodeTypeEnum.userGuide,
|
||||||
@@ -14,7 +14,7 @@ export const UserGuideModule: FlowModuleTemplateType = {
|
|||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.welcomeText,
|
key: ModuleInputKeyEnum.welcomeText,
|
||||||
type: FlowNodeInputTypeEnum.hidden,
|
type: FlowNodeInputTypeEnum.hidden,
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
label: '开场白',
|
label: '开场白',
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
@@ -22,7 +22,7 @@ export const UserGuideModule: FlowModuleTemplateType = {
|
|||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.variables,
|
key: ModuleInputKeyEnum.variables,
|
||||||
type: FlowNodeInputTypeEnum.hidden,
|
type: FlowNodeInputTypeEnum.hidden,
|
||||||
valueType: ModuleDataTypeEnum.any,
|
valueType: ModuleIOValueTypeEnum.any,
|
||||||
label: '对话框变量',
|
label: '对话框变量',
|
||||||
value: [],
|
value: [],
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
@@ -30,7 +30,7 @@ export const UserGuideModule: FlowModuleTemplateType = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.questionGuide,
|
key: ModuleInputKeyEnum.questionGuide,
|
||||||
valueType: ModuleDataTypeEnum.boolean,
|
valueType: ModuleIOValueTypeEnum.boolean,
|
||||||
type: FlowNodeInputTypeEnum.switch,
|
type: FlowNodeInputTypeEnum.switch,
|
||||||
label: '问题引导',
|
label: '问题引导',
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
@@ -39,7 +39,7 @@ export const UserGuideModule: FlowModuleTemplateType = {
|
|||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.tts,
|
key: ModuleInputKeyEnum.tts,
|
||||||
type: FlowNodeInputTypeEnum.hidden,
|
type: FlowNodeInputTypeEnum.hidden,
|
||||||
valueType: ModuleDataTypeEnum.any,
|
valueType: ModuleIOValueTypeEnum.any,
|
||||||
label: '语音播报',
|
label: '语音播报',
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import {
|
|||||||
} from '../../node/constant';
|
} from '../../node/constant';
|
||||||
import { FlowModuleTemplateType } from '../../type.d';
|
import { FlowModuleTemplateType } from '../../type.d';
|
||||||
import {
|
import {
|
||||||
ModuleDataTypeEnum,
|
ModuleIOValueTypeEnum,
|
||||||
ModuleInputKeyEnum,
|
ModuleInputKeyEnum,
|
||||||
ModuleOutputKeyEnum,
|
ModuleOutputKeyEnum,
|
||||||
ModuleTemplateTypeEnum
|
ModuleTemplateTypeEnum
|
||||||
@@ -22,7 +22,7 @@ export const UserInputModule: FlowModuleTemplateType = {
|
|||||||
{
|
{
|
||||||
key: ModuleInputKeyEnum.userChatInput,
|
key: ModuleInputKeyEnum.userChatInput,
|
||||||
type: FlowNodeInputTypeEnum.systemInput,
|
type: FlowNodeInputTypeEnum.systemInput,
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
label: '用户问题',
|
label: '用户问题',
|
||||||
showTargetInApp: false,
|
showTargetInApp: false,
|
||||||
showTargetInPlugin: false
|
showTargetInPlugin: false
|
||||||
@@ -33,7 +33,7 @@ export const UserInputModule: FlowModuleTemplateType = {
|
|||||||
key: ModuleOutputKeyEnum.userChatInput,
|
key: ModuleOutputKeyEnum.userChatInput,
|
||||||
label: '用户问题',
|
label: '用户问题',
|
||||||
type: FlowNodeOutputTypeEnum.source,
|
type: FlowNodeOutputTypeEnum.source,
|
||||||
valueType: ModuleDataTypeEnum.string,
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
targets: []
|
targets: []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
48
packages/global/core/module/type.d.ts
vendored
@@ -1,5 +1,5 @@
|
|||||||
import { FlowNodeTypeEnum } from './node/constant';
|
import { FlowNodeTypeEnum } from './node/constant';
|
||||||
import { ModuleDataTypeEnum, ModuleTemplateTypeEnum, VariableInputEnum } from './constants';
|
import { ModuleIOValueTypeEnum, ModuleTemplateTypeEnum, VariableInputEnum } from './constants';
|
||||||
import { FlowNodeInputItemType, FlowNodeOutputItemType } from './node/type';
|
import { FlowNodeInputItemType, FlowNodeOutputItemType } from './node/type';
|
||||||
|
|
||||||
export type FlowModuleTemplateType = {
|
export type FlowModuleTemplateType = {
|
||||||
@@ -38,7 +38,7 @@ export type ModuleItemType = {
|
|||||||
outputs: FlowNodeOutputItemType[];
|
outputs: FlowNodeOutputItemType[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* function type */
|
/* --------------- function type -------------------- */
|
||||||
// variable
|
// variable
|
||||||
export type VariableItemType = {
|
export type VariableItemType = {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -72,4 +72,48 @@ export type ContextExtractAgentItemType = {
|
|||||||
desc: string;
|
desc: string;
|
||||||
key: string;
|
key: string;
|
||||||
required: boolean;
|
required: boolean;
|
||||||
|
enum?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* -------------- running module -------------- */
|
||||||
|
export type RunningModuleItemType = {
|
||||||
|
name: ModuleItemType['name'];
|
||||||
|
moduleId: ModuleItemType['moduleId'];
|
||||||
|
flowType: ModuleItemType['flowType'];
|
||||||
|
showStatus?: ModuleItemType['showStatus'];
|
||||||
|
} & {
|
||||||
|
inputs: {
|
||||||
|
key: string;
|
||||||
|
value?: any;
|
||||||
|
}[];
|
||||||
|
outputs: {
|
||||||
|
key: string;
|
||||||
|
answer?: boolean;
|
||||||
|
response?: boolean;
|
||||||
|
value?: any;
|
||||||
|
targets: {
|
||||||
|
moduleId: string;
|
||||||
|
key: string;
|
||||||
|
}[];
|
||||||
|
}[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ChatDispatchProps = {
|
||||||
|
res: NextApiResponse;
|
||||||
|
mode: 'test' | 'chat';
|
||||||
|
teamId: string;
|
||||||
|
tmbId: string;
|
||||||
|
user: UserType;
|
||||||
|
appId: string;
|
||||||
|
chatId?: string;
|
||||||
|
responseChatItemId?: string;
|
||||||
|
histories: ChatItemType[];
|
||||||
|
variables: Record<string, any>;
|
||||||
|
stream: boolean;
|
||||||
|
detail: boolean; // response detail
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ModuleDispatchProps<T> = ChatDispatchProps & {
|
||||||
|
outputs: RunningModuleItemType['outputs'];
|
||||||
|
inputs: T;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from './node/constant';
|
import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from './node/constant';
|
||||||
import { ModuleDataTypeEnum, ModuleInputKeyEnum } from './constants';
|
import { ModuleIOValueTypeEnum, ModuleInputKeyEnum } from './constants';
|
||||||
import { FlowNodeInputItemType, FlowNodeOutputItemType } from './node/type';
|
import { FlowNodeInputItemType, FlowNodeOutputItemType } from './node/type';
|
||||||
import { AppTTSConfigType, ModuleItemType, VariableItemType } from './type';
|
import { AppTTSConfigType, ModuleItemType, VariableItemType } from './type';
|
||||||
|
import { Input_Template_Switch } from './template/input';
|
||||||
|
|
||||||
export const getGuideModule = (modules: ModuleItemType[]) =>
|
export const getGuideModule = (modules: ModuleItemType[]) =>
|
||||||
modules.find((item) => item.flowType === FlowNodeTypeEnum.userGuide);
|
modules.find((item) => item.flowType === FlowNodeTypeEnum.userGuide);
|
||||||
@@ -29,42 +30,64 @@ export const splitGuideModule = (guideModules?: ModuleItemType) => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export function formatPluginToPreviewModule(
|
export const getOrInitModuleInputValue = (input: FlowNodeInputItemType) => {
|
||||||
|
if (input.value !== undefined || !input.valueType) return input.value;
|
||||||
|
|
||||||
|
const map: Record<string, any> = {
|
||||||
|
[ModuleIOValueTypeEnum.boolean]: false,
|
||||||
|
[ModuleIOValueTypeEnum.number]: 0,
|
||||||
|
[ModuleIOValueTypeEnum.string]: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
return map[input.valueType];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getModuleInputUiField = (input: FlowNodeInputItemType) => {
|
||||||
|
if (input.type === FlowNodeInputTypeEnum.input || input.type === FlowNodeInputTypeEnum.textarea) {
|
||||||
|
return {
|
||||||
|
placeholder: input.placeholder || input.description
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function plugin2ModuleIO(
|
||||||
pluginId: string,
|
pluginId: string,
|
||||||
modules: ModuleItemType[]
|
modules: ModuleItemType[]
|
||||||
): {
|
): {
|
||||||
inputs: FlowNodeInputItemType[];
|
inputs: FlowNodeInputItemType[];
|
||||||
outputs: FlowNodeOutputItemType[];
|
outputs: FlowNodeOutputItemType[];
|
||||||
} {
|
} {
|
||||||
function getPluginTemplatePluginIdInput(pluginId: string): FlowNodeInputItemType {
|
|
||||||
return {
|
|
||||||
key: ModuleInputKeyEnum.pluginId,
|
|
||||||
type: FlowNodeInputTypeEnum.hidden,
|
|
||||||
label: 'pluginId',
|
|
||||||
value: pluginId,
|
|
||||||
valueType: ModuleDataTypeEnum.string,
|
|
||||||
connected: true,
|
|
||||||
showTargetInApp: false,
|
|
||||||
showTargetInPlugin: false
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
const pluginInput = modules.find((module) => module.flowType === FlowNodeTypeEnum.pluginInput);
|
const pluginInput = modules.find((module) => module.flowType === FlowNodeTypeEnum.pluginInput);
|
||||||
const customOutput = modules.find((module) => module.flowType === FlowNodeTypeEnum.pluginOutput);
|
const pluginOutput = modules.find((module) => module.flowType === FlowNodeTypeEnum.pluginOutput);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
inputs: pluginInput
|
inputs: pluginInput
|
||||||
? [
|
? [
|
||||||
getPluginTemplatePluginIdInput(pluginId),
|
{
|
||||||
|
// plugin id
|
||||||
|
key: ModuleInputKeyEnum.pluginId,
|
||||||
|
type: FlowNodeInputTypeEnum.hidden,
|
||||||
|
label: 'pluginId',
|
||||||
|
value: pluginId,
|
||||||
|
valueType: ModuleIOValueTypeEnum.string,
|
||||||
|
connected: true,
|
||||||
|
showTargetInApp: false,
|
||||||
|
showTargetInPlugin: false
|
||||||
|
},
|
||||||
|
// switch
|
||||||
|
Input_Template_Switch,
|
||||||
...pluginInput.inputs.map((item) => ({
|
...pluginInput.inputs.map((item) => ({
|
||||||
...item,
|
...item,
|
||||||
|
...getModuleInputUiField(item),
|
||||||
|
value: getOrInitModuleInputValue(item),
|
||||||
edit: false,
|
edit: false,
|
||||||
connected: false
|
connected: false
|
||||||
}))
|
}))
|
||||||
]
|
]
|
||||||
: [],
|
: [],
|
||||||
outputs: customOutput
|
outputs: pluginOutput
|
||||||
? customOutput.outputs.map((item) => ({
|
? pluginOutput.outputs.map((item) => ({
|
||||||
...item,
|
...item,
|
||||||
edit: false
|
edit: false
|
||||||
}))
|
}))
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { ModuleTemplateTypeEnum } from '../module/constants';
|
|
||||||
import { ModuleItemType } from '../module/type';
|
import { ModuleItemType } from '../module/type';
|
||||||
|
|
||||||
export const defaultModules: ModuleItemType[] = [
|
export const defaultModules: ModuleItemType[] = [
|
||||||
@@ -28,13 +27,8 @@ export const defaultModules: ModuleItemType[] = [
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
export enum PluginTypeEnum {
|
export enum PluginSourceEnum {
|
||||||
personal = 'personal',
|
personal = 'personal',
|
||||||
community = 'community',
|
community = 'community',
|
||||||
commercial = 'commercial'
|
commercial = 'commercial'
|
||||||
}
|
}
|
||||||
export const PluginType2TemplateTypeMap = {
|
|
||||||
[PluginTypeEnum.personal]: ModuleTemplateTypeEnum.personalPlugin,
|
|
||||||
[PluginTypeEnum.community]: ModuleTemplateTypeEnum.communityPlugin,
|
|
||||||
[PluginTypeEnum.commercial]: ModuleTemplateTypeEnum.commercialPlugin
|
|
||||||
};
|
|
||||||
|
|||||||
21
packages/global/core/plugin/type.d.ts
vendored
@@ -1,6 +1,6 @@
|
|||||||
import { ModuleTemplateTypeEnum } from 'core/module/constants';
|
import { ModuleTemplateTypeEnum } from 'core/module/constants';
|
||||||
import type { ModuleItemType } from '../module/type.d';
|
import type { FlowModuleTemplateType, ModuleItemType } from '../module/type.d';
|
||||||
import { PluginTypeEnum } from './constants';
|
import { PluginSourceEnum } from './constants';
|
||||||
|
|
||||||
export type PluginItemSchema = {
|
export type PluginItemSchema = {
|
||||||
_id: string;
|
_id: string;
|
||||||
@@ -15,12 +15,19 @@ export type PluginItemSchema = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* plugin template */
|
/* plugin template */
|
||||||
export type PluginTemplateType = {
|
export type PluginTemplateType = PluginRuntimeType & {
|
||||||
|
author?: string;
|
||||||
id: string;
|
id: string;
|
||||||
type: `${PluginTypeEnum}`;
|
source: `${PluginSourceEnum}`;
|
||||||
name: string;
|
templateType: FlowModuleTemplateType['templateType'];
|
||||||
avatar: string;
|
|
||||||
intro: string;
|
intro: string;
|
||||||
modules: ModuleItemType[];
|
modules: ModuleItemType[];
|
||||||
templateType?: `${ModuleTemplateTypeEnum}`;
|
};
|
||||||
|
|
||||||
|
export type PluginRuntimeType = {
|
||||||
|
teamId?: string;
|
||||||
|
name: string;
|
||||||
|
avatar: string;
|
||||||
|
showStatus?: boolean;
|
||||||
|
modules: ModuleItemType[];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,17 +2,14 @@
|
|||||||
"name": "@fastgpt/global",
|
"name": "@fastgpt/global",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.5.1",
|
|
||||||
"cheerio": "1.0.0-rc.12",
|
|
||||||
"dayjs": "^1.11.7",
|
"dayjs": "^1.11.7",
|
||||||
|
"openai": "4.23.0",
|
||||||
"encoding": "^0.1.13",
|
"encoding": "^0.1.13",
|
||||||
"js-tiktoken": "^1.0.7",
|
"js-tiktoken": "^1.0.7",
|
||||||
"node-html-markdown": "^1.3.0",
|
"axios": "^1.5.1",
|
||||||
"openai": "^4.20.1",
|
|
||||||
"timezones-list": "^3.0.2"
|
"timezones-list": "^3.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^20.8.5",
|
"@types/node": "^20.8.5"
|
||||||
"@types/turndown": "^5.0.4"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
10
packages/plugins/package.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"name": "@fastgpt/plugins",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.8.5",
|
||||||
|
"@fastgpt/global": "workspace:*",
|
||||||
|
"@fastgpt/service": "workspace:*"
|
||||||
|
}
|
||||||
|
}
|
||||||
21
packages/plugins/tsconfig.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "es2015",
|
||||||
|
"lib": ["dom", "dom.iterable", "esnext"],
|
||||||
|
"allowJs": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strict": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"module": "esnext",
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"incremental": true,
|
||||||
|
"baseUrl": "."
|
||||||
|
},
|
||||||
|
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.d.ts", "../**/*.d.ts"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
@@ -71,7 +71,7 @@ instance.interceptors.response.use(responseSuccess, (err) => Promise.reject(err)
|
|||||||
|
|
||||||
export function request(url: string, data: any, config: ConfigType, method: Method): any {
|
export function request(url: string, data: any, config: ConfigType, method: Method): any {
|
||||||
if (!global.systemEnv || !global.systemEnv?.pluginBaseUrl) {
|
if (!global.systemEnv || !global.systemEnv?.pluginBaseUrl) {
|
||||||
console.log('未部署商业版接口');
|
console.log('未部署商业版接口', url);
|
||||||
return Promise.reject('The The request was denied...');
|
return Promise.reject('The The request was denied...');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,11 +20,12 @@ export async function connectMongo({
|
|||||||
console.log('mongo start connect');
|
console.log('mongo start connect');
|
||||||
try {
|
try {
|
||||||
mongoose.set('strictQuery', true);
|
mongoose.set('strictQuery', true);
|
||||||
|
const maxConnecting = Math.max(20, Number(process.env.DB_MAX_LINK || 20));
|
||||||
await mongoose.connect(process.env.MONGODB_URI as string, {
|
await mongoose.connect(process.env.MONGODB_URI as string, {
|
||||||
bufferCommands: true,
|
bufferCommands: true,
|
||||||
maxConnecting: Number(process.env.DB_MAX_LINK || 5),
|
maxConnecting: maxConnecting,
|
||||||
maxPoolSize: Number(process.env.DB_MAX_LINK || 5),
|
maxPoolSize: maxConnecting,
|
||||||
minPoolSize: Math.min(10, Number(process.env.DB_MAX_LINK || 10)),
|
minPoolSize: Math.max(5, Math.round(Number(process.env.DB_MAX_LINK || 5) * 0.1)),
|
||||||
connectTimeoutMS: 60000,
|
connectTimeoutMS: 60000,
|
||||||
waitQueueTimeoutMS: 60000,
|
waitQueueTimeoutMS: 60000,
|
||||||
socketTimeoutMS: 60000,
|
socketTimeoutMS: 60000,
|
||||||
|
|||||||