Compare commits

..

15 Commits

Author SHA1 Message Date
Archer
bcf9491999 v4.4.7-2 (#388) 2023-10-11 17:18:43 +08:00
Archer
d0041a98b4 Optimize the file storage structure of the knowledge base (#386) 2023-10-10 22:41:05 +08:00
Carson Yang
29d152784f Docs: delete image cdn for vercel (#385)
Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
2023-10-09 15:03:07 +08:00
Carson Yang
cd7214ba8d Docs: update workflow for building docs image (#384)
Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
2023-10-09 14:32:47 +08:00
Archer
6a84e73a82 fix: packages (#378) 2023-10-08 09:59:05 +08:00
Archer
98ce5103a0 v4.4.6 (#377) 2023-10-07 18:02:20 +08:00
Carson Yang
c65a36d3ab Docs: hide button for questionnaire on mobile device (#376)
Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
2023-10-07 14:57:26 +08:00
Carson Yang
b6e49da288 Docs: update button for questionnaire (#375)
Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
2023-10-06 23:52:45 +08:00
Archer
45998f9cf5 README (#372) 2023-10-06 21:19:44 +08:00
Carson Yang
4197f63751 Update README (#371)
Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
2023-10-06 14:07:37 +08:00
Carson Yang
ace8134a16 Docs: add Dockerfile for docs (#369)
Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
2023-10-06 08:01:16 +08:00
Carson Yang
7f1fecb84e Docs: update theme (#368)
Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
2023-10-04 22:25:07 +08:00
Archer
bf172fab81 perf: markdown more wrap (#365) 2023-10-02 20:19:09 +08:00
Archer
36f5648cae perf: v4.4.6-1 (#364) 2023-09-28 17:30:05 +08:00
Archer
ab57bfcc4a perf: completions api.fix: new chat question guide (#361) 2023-09-27 12:05:13 +08:00
203 changed files with 4537 additions and 26002 deletions

15
.github/imgs/logo-left.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

98
.github/workflows/docs-image.yml vendored Normal file
View File

@@ -0,0 +1,98 @@
name: Build FastGPT docs images and copy image to docker hub
on:
workflow_dispatch:
push:
paths:
- 'docSite/**'
branches:
- 'main'
tags:
- 'v*.*.*'
jobs:
build-fastgpt-docs-images:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 1
- name: Set up QEMU (optional)
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
with:
driver-opts: network=host
- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GH_PAT }}
- name: Set DOCKER_REPO_TAGGED based on branch or tag
run: |
if [[ "${{ github.ref_name }}" == "main" ]]; then
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-docs:latest" >> $GITHUB_ENV
else
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-docs:${{ github.ref_name }}" >> $GITHUB_ENV
fi
- name: Build and publish image for main branch or tag push event
env:
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
run: |
docker buildx build \
--build-arg name=app \
--platform linux/amd64,linux/arm64 \
--label "org.opencontainers.image.source= https://github.com/ ${{ github.repository_owner }}/FastGPT" \
--label "org.opencontainers.image.description=fastgpt image" \
--label "org.opencontainers.image.licenses=Apache" \
--push \
--cache-from=type=local,src=/tmp/.buildx-cache \
--cache-to=type=local,dest=/tmp/.buildx-cache \
-t ${DOCKER_REPO_TAGGED} \
-f docSite/Dockerfile \
.
push-to-docker-hub:
needs: build-fastgpt-docs-images
runs-on: ubuntu-20.04
if: github.repository == 'labring/FastGPT'
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_HUB_NAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
- name: Set DOCKER_REPO_TAGGED based on branch or tag
run: |
if [[ "${{ github.ref_name }}" == "main" ]]; then
echo "IMAGE_TAG=latest" >> $GITHUB_ENV
else
echo "IMAGE_TAG=${{ github.ref_name }}" >> $GITHUB_ENV
fi
- name: Pull image from GitHub Container Registry
run: docker pull ghcr.io/${{ github.repository_owner }}/fastgpt-docs:${{env.IMAGE_TAG}}
- name: Tag image with Docker Hub repository name and version tag
run: docker tag ghcr.io/${{ github.repository_owner }}/fastgpt-docs:${{env.IMAGE_TAG}} ${{ secrets.DOCKER_IMAGE_NAME }}:${{env.IMAGE_TAG}}
- name: Push image to Docker Hub
run: docker push ${{ secrets.DOCKER_IMAGE_NAME }}:${{env.IMAGE_TAG}}
update-docs-image:
needs: build-fastgpt-docs-images
runs-on: ubuntu-20.04
if: github.repository == 'labring/FastGPT'
steps:
- name: Checkout code
uses: actions/checkout@v3
- uses: actions-hub/kubectl@master
env:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
with:
args: rollout restart deployment fastgpt-docs

View File

@@ -1,9 +1,10 @@
name: Build fastgpt images and copy image to docker hub
name: Build FastGPT images and copy image to docker hub
on:
workflow_dispatch:
push:
paths:
- 'projects/app/**'
- 'packages/**'
branches:
- 'main'
tags:
@@ -54,7 +55,7 @@ jobs:
--platform linux/amd64,linux/arm64 \
--label "org.opencontainers.image.source= https://github.com/ ${{ github.repository_owner }}/FastGPT" \
--label "org.opencontainers.image.description=fastgpt image" \
--label "org.opencontainers.image.licenses=MIT" \
--label "org.opencontainers.image.licenses=Apache" \
--push \
--cache-from=type=local,src=/tmp/.buildx-cache \
--cache-to=type=local,dest=/tmp/.buildx-cache \

52
.github/workflows/preview-image.yml vendored Normal file
View File

@@ -0,0 +1,52 @@
name: Preview FastGPT images
on:
pull_request_target:
paths:
- 'projects/app/**'
- 'packages/**'
branches:
- 'main'
workflow_dispatch:
jobs:
build-fastgpt-images:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
with:
driver-opts: network=host
- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GH_PAT }}
- name: Set DOCKER_REPO_TAGGED based on branch or tag
run: |
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-pr:${{ github.event.pull_request.number }}" >> $GITHUB_ENV
- name: Build image for PR
env:
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
run: |
docker buildx build \
--build-arg name=app \
--label "org.opencontainers.image.source= https://github.com/ ${{ github.repository_owner }}/FastGPT" \
--label "org.opencontainers.image.description=fastgpt-pr image" \
--label "org.opencontainers.image.licenses=Apache" \
--cache-from=type=local,src=/tmp/.buildx-cache \
--cache-to=type=local,dest=/tmp/.buildx-cache \
-t ${DOCKER_REPO_TAGGED} \
-f Dockerfile \
.

4
.gitignore vendored
View File

@@ -33,4 +33,6 @@ dist/
# hugo
**/.hugo_build.lock
docSite/public/
docSite/public/
docSite/resources/_gen/
docSite/.vercel

View File

@@ -4,23 +4,36 @@
# FastGPT
<p align="center">
<a href="./README_en.md">English</a> |
<a href="./README.md">简体中文</a>
</p>
FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!
</div>
<p align="center">
<a href="https://fastgpt.run/">线上体验</a>
·
<a href="https://doc.fastgpt.run/docs/intro">相关文档</a>
·
<a href="https://doc.fastgpt.run/docs/development">本地开发</a>
·
<a href="https://github.com/labring/FastGPT#-%E7%9B%B8%E5%85%B3%E9%A1%B9%E7%9B%AE">相关项目</a>
<a href="https://fastgpt.run/">
<img height="21" src="https://img.shields.io/badge/在线使用-fff?style=flat-square&logo=spoj&logoColor=7d09f1" alt="cloud">
</a>
<a href="https://doc.fastgpt.run/docs/intro">
<img height="21" src="https://img.shields.io/badge/相关文档-7d09f1?style=flat-square" alt="document">
</a>
<a href="https://doc.fastgpt.run/docs/development">
<img height="21" src="https://img.shields.io/badge/本地开发-%23fff?style=flat-square&logo=xcode&logoColor=7d09f1" alt="development">
</a>
<a href="/#-%E7%9B%B8%E5%85%B3%E9%A1%B9%E7%9B%AE">
<img height="21" src="https://img.shields.io/badge/相关项目-7d09f1?style=flat-square" alt="project">
</a>
<a href="https://github.com/labring/FastGPT/blob/main/LICENSE">
<img height="21" src="https://img.shields.io/badge/License-Apache--2.0-ffffff?style=flat-square&labelColor=fff&color=7d09f1" alt="license">
</a>
</p>
https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409bd33f6d4
## 🛸 在线体验
## 🛸 在线使用
[fastgpt.run](https://fastgpt.run/)(服务器在新加坡,部分地区可能无法直连)
@@ -39,7 +52,7 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
- [x] 文本内容提取成结构化数据
- [x] HTTP 扩展
- [ ] 嵌入 Laf实现在线编写 HTTP 模块
- [ ] 连续对话引导
- [x] 对话下一步指引
- [ ] 对话多路线选择
- [x] 源文件引用追踪
- [ ] 自定义文件阅读器
@@ -55,7 +68,7 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
- [x] 知识库单点搜索测试
- [x] 对话时反馈引用并可修改与删除
- [x] 完整上下文呈现
- [ ] 完整模块中间值呈现
- [x] 完整模块中间值呈现
4. OpenAPI
- [x] completions 接口(对齐 GPT 接口)
- [ ] 知识库 CRUD
@@ -80,8 +93,8 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
* [部署 FastGPT](https://doc.fastgpt.run/docs/installation)
* [系统配置文件说明](https://doc.fastgpt.run/docs/development/configuration/)
* [多模型配置](https://doc.fastgpt.run/docs/installation/one-api/)
* [版本升级](https://doc.fastgpt.run/docs/installation/upgrading)
* [API 文档](https://doc.fastgpt.run/docs/development/openapi?pre_pathname=%2Fdrive%2Fhome%2F)
* [版本更新/升级介绍](https://doc.fastgpt.run/docs/installation/upgrading)
* [API 文档](https://doc.fastgpt.run/docs/development/openapi/)
## 🏘️ 社区交流群
@@ -89,12 +102,6 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
![](https://otnvvf-imgs.oss.laf.run/wx300.jpg)
## 👀 其他
- [FastGPT 常见问题](https://kjqvjse66l.feishu.cn/docx/HtrgdT0pkonP4kxGx8qcu6XDnGh)
- [docker 部署教程视频](https://www.bilibili.com/video/BV1jo4y147fT/)
- [FastGPT 知识库演示](https://www.bilibili.com/video/BV1Wo4y1p7i1/)
## 💪 相关项目
- [Laf: 3 分钟快速接入三方应用](https://github.com/labring/laf)
@@ -102,10 +109,15 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
- [One API: 多模型管理,支持 Azure、文心一言等](https://github.com/songquanpeng/one-api)
- [TuShan: 5 分钟搭建后台管理系统](https://github.com/msgbyte/tushan)
## 👀 其他
- [保姆级 FastGPT 教程](https://www.bilibili.com/video/BV1n34y1A7Bo/?spm_id_from=333.999.0.0)
- [接入飞书](https://www.bilibili.com/video/BV1Su4y1r7R3/?spm_id_from=333.999.0.0)
- [接入企微](https://www.bilibili.com/video/BV1Tp4y1n72T/?spm_id_from=333.999.0.0)
## 🤝 第三方生态
- [OnWeChat 个人微信/企微机器人](https://doc.fastgpt.run/docs/use-cases/onwechat/)
- [luolinAI: 企微机器人,开箱即用](https://github.com/luolin-ai/FastGPT-Enterprise-WeChatbot)
## 🌟 Star History
@@ -115,7 +127,7 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
本仓库遵循 [FastGPT Open Source License](./LICENSE) 开源协议。
1. 允许作为后台服务直接商用,但不允许直接使用 saas 服务商用。
1. 允许作为后台服务直接商用,但不允许直接使用 SaaS 服务商用。
2. 需保留相关版权信息。
3. 完整请查看 [FastGPT Open Source License](./LICENSE)
4. 联系方式yujinlong@sealos.io, [点击查看定价策略](https://doc.fastgpt.run/docs/commercial)

View File

@@ -1,25 +1,39 @@
<div align="center">
<a href="https://fastgpt.run/"><img src="/.github/imgs/logo.svg" width="120" height="120" alt="fastgpt logo"></a>
# FastGPT
FastGPT is a knowledge-based question answering system built on the LLM. It offers out-of-the-box data processing and model invocation capabilities. Moreover, it allows for workflow orchestration through Flow visualization, thereby enabling complex question and answer scenarios!
<p align="center">
<a href="./README_en.md">English</a> |
<a href="./README.md">简体中文</a>
</p>
FastGPT is a knowledge-based Q&A system built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization!
</div>
<p align="center">
<a href="https://fastgpt.run/">Online</a>
·
<a href="https://doc.fastgpt.run/docs/intro">Document</a>
·
<a href="https://doc.fastgpt.run/docs/development">Development</a>
·
<a href="https://doc.fastgpt.run/docs/installation">Deploy</a>
·
<a href="#powered-by">Power By</a>
<a href="https://fastgpt.run/">
<img height="21" src="https://img.shields.io/badge/Website-fff?style=flat-square&logo=spoj&logoColor=7d09f1" alt="cloud">
</a>
<a href="https://doc.fastgpt.run/docs/intro">
<img height="21" src="https://img.shields.io/badge/Docs-7d09f1?style=flat-square" alt="document">
</a>
<a href="https://doc.fastgpt.run/docs/development">
<img height="21" src="https://img.shields.io/badge/Development-%23fff?style=flat-square&logo=xcode&logoColor=7d09f1" alt="development">
</a>
<a href="/#-%E7%9B%B8%E5%85%B3%E9%A1%B9%E7%9B%AE">
<img height="21" src="https://img.shields.io/badge/Related Projects-7d09f1?style=flat-square" alt="project">
</a>
<a href="https://github.com/labring/FastGPT/blob/main/LICENSE">
<img height="21" src="https://img.shields.io/badge/License-Apache--2.0-ffffff?style=flat-square&labelColor=fff&color=7d09f1" alt="license">
</a>
</p>
## 🛸 Online
https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409bd33f6d4
## 🛸 Use Cloud Services
[fastgpt.run](https://fastgpt.run/)
| | |
@@ -29,35 +43,34 @@ FastGPT is a knowledge-based question answering system built on the LLM. It offe
## 💡 Features
1. Powerful visual orchestration for easy AI application building
1. Powerful visual workflows: Effortlessly craft AI applications
- [x] Provides a simple mode without the need for orchestration operations
- [x] Simple mode on deck - no need for manual arrangement
- [x] User dialogue pre-guidance
- [x] Global variables
- [x] Knowledge base search
- [x] Multi-LLM model dialogue
- [x] Extraction of text content into structured data
- [x] HTTP extension
- [ ] Sandbox JS runtime module
- [ ] Continuous dialogue guidance
- [ ] Dialogue multi-path selection
- [ ] Source file reference tracking
- [x] Dialogue via multiple LLM models
- [x] Text magic - convert to structured data
- [x] Extend with HTTP
- [ ] Embed Laf for on-the-fly HTTP module crafting
- [x] Directions for the next dialogue steps
- [ ] Multiple dialogue paths selection
- [x] Tracking source file references
- [ ] Custom file reader
2. Rich knowledge base preprocessing
2. Extensive knowledge base preprocessing
- [x] Multiple library reuse and mixing
- [x] Chunk record modification and deletion
- [x] Supports direct segment import
- [x] Supports QA split import
- [x] Supports manual input content
- [ ] Supports URL import reading
- [x] Supports batch import of Q&A pairs in CSV format
- [ ] Supports separate vector model settings for knowledge bases
- [ ] Source file storage
- [x] Reuse and mix multiple knowledge bases
- [x] Track chunk modifications and deletions
- [x] Supports manual entries, direct segmentation, and QA split imports
- [x] Supports URL fetching and batch CSV imports
- [x] Supports Set unique vector models for knowledge bases
- [x] Store original files
- [ ] File learning Agent
3. Multiple effect testing channels
- [x] Knowledge base single point search testing
- [x] Single-point knowledge base search test
- [x] Feedback references and ability to modify and delete during dialogue
- [x] Complete context presentation
- [ ] Complete module intermediate value presentation
@@ -77,11 +90,17 @@ FastGPT is a knowledge-based question answering system built on the LLM. It offe
Project tech stack: NextJs + TS + ChakraUI + Mongo + Postgres (Vector plugin)
- **⚡ Deployment**
[![](https://cdn.jsdelivr.us/gh/labring-actions/templates@main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt)
Give it a 2-4 minute wait after deployment as it sets up the database. Initially, it might be a tad slow since we're using the basic settings.
- [Getting Started with Local Development](https://doc.fastgpt.run/docs/development)
- [Deploying FastGPT](https://doc.fastgpt.run/docs/installation)
- [System Configuration File Explanation](https://doc.fastgpt.run/docs/installation/reference)
- [Multi-model Configuration](https://doc.fastgpt.run/docs/installation/reference/models)
- [V3 Upgrade V4 Initialization](https://doc.fastgpt.run/docs/installation/upgrading)
- [Guide on System Configs](https://doc.fastgpt.run/docs/installation/reference)
- [Configuring Multiple Models](https://doc.fastgpt.run/docs/installation/reference/models)
- [Version Updates & Upgrades](https://doc.fastgpt.run/docs/installation/upgrading)
<!-- ## :point_right: RoadMap
- [FastGPT RoadMap](https://kjqvjse66l.feishu.cn/docx/RVUxdqE2WolDYyxEKATcM0XXnte) -->

12
docSite/Dockerfile Normal file
View File

@@ -0,0 +1,12 @@
FROM hugomods/hugo:0.117.0 AS builder
WORKDIR /app
ADD ./docSite hugo
RUN cd /app/hugo && hugo mod get -u github.com/colinwilson/lotusdocs && hugo -v --minify
FROM fholzer/nginx-brotli:latest
LABEL org.opencontainers.image.source https://github.com/labring/FastGPT
COPY --from=builder /app/hugo/public /usr/share/nginx/html

View File

@@ -3,7 +3,7 @@
## 本地运行
1. 安装 go 语言环境。
2. 安装 hugo。 [二进制下载](https://github.com/gohugoio/hugo/releases/tag/v0.117.0)
2. 安装 hugo。 [二进制下载](https://github.com/gohugoio/hugo/releases/tag/v0.117.0),注意需要安装 extended 版本。
3. cd docSite
4. hugo serve
5. 访问 http://localhost:1313

View File

@@ -96,4 +96,50 @@ footer a:hover {
}
.github-badge .bg-lightgrey, .github-badge .bg-lightgray {
background-color: #9f9f9f !important;
}
#fixed-box {
position: fixed;
z-index: 9999;
}
@media (max-width: 600px) {
#fixed-box {
display: none
}
}
.feedback-btn-wrapper {
position: fixed;
z-index: 1000;
bottom: 0;
left: 0;
margin: 2rem;
}
#feedback-btn {
height: 30px;
display: flex;
align-items: center;
padding: 1.2rem 0.7rem;
border-radius: 0.4rem;
cursor: pointer;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1),
0 4px 6px -2px rgba(0, 0, 0, 0.05);
user-select: none;
border: 0;
outline: 0;
color: #fff;
background-color: #4d698e;
transition: filter 0.4s ease;
}
#feedback-btn svg {
width: 1.25rem;
height: 1.25rem;
}
#feedback-btn span {
font-weight: 700;
font-size: 1rem;
margin-left: 0.5rem;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

View File

@@ -1,11 +0,0 @@
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"*": [
"../../../../../.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/gohugoio/hugo-mod-jslibs-dist/popperjs/v2@v2.21100.20000/package/dist/cjs/popper.js/*",
"../../../../../.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/twbs/bootstrap@v5.3.0+incompatible/js/*"
]
}
}
}

View File

@@ -53,7 +53,7 @@ weight: 20
#### 总费用
总费用 = 商业版功能费用 + 用户数量费用
总费用 = 商业版交付费用 + 用户数量费用
## 技术支持
@@ -73,8 +73,7 @@ weight: 20
## 联系方式
微信: allence1004
邮箱: yujinlong@sealos.io
请填写[咨询问卷](https://fael3z0zfze.feishu.cn/share/base/form/shrcnRxj3utrzjywsom96Px4sud),我们会尽快与您联系。
## QA

View File

@@ -11,35 +11,19 @@ weight: 520
**开发环境下**,你需要将示例配置文件 `config.json` 复制成 `config.local.json` 文件才会生效。
这个配置文件中包含了前端页面定制、系统级参数、AI 对话的模型等……
这个配置文件中包含了系统级参数、AI 对话的模型、function 模型等……
{{% alert context="warning" %}}
注意:下面的配置介绍仅是局部介绍,你需要完整挂载整个 `config.json`,不能仅挂载一部分。你可以直接在默认的 config.json 基础上根据下面的介绍进行修改。挂载上去的配置文件不能包含注释。
{{% /alert %}}
## 基础字段粗略说明
这里介绍一些基础的配置字段:
```json
...
// 这个配置文件是系统级参数
"SystemParams": {
"vectorMaxProcess": 15, // 向量生成最大进程,结合数据库性能和 key 来设置
"qaMaxProcess": 15, // QA 生成最大进程,结合数据库性能和 key 来设置
"pgIvfflatProbe": 20 // pg vector 搜索探针。没有设置索引前可忽略,通常 50w 组以上才需要设置。
},
...
```
## 完整配置参数
**使用时,请务必去除注释!**
```json
{
"SystemParams": {
"vectorMaxProcess": 15,
"qaMaxProcess": 15,
"pgIvfflatProbe": 20
"vectorMaxProcess": 15, // 向量生成最大进程,结合数据库性能和 key 来设置
"qaMaxProcess": 15, // QA 生成最大进程,结合数据库性能和 key 来设置
"pgIvfflatProbe": 20 // pg vector 搜索探针。没有设置索引前可忽略,通常 50w 组以上才需要设置。
},
"ChatModels": [
{
@@ -79,27 +63,35 @@ weight: 520
"maxToken": 3000
}
],
"QAModel": {
"QAModel": { // QA 拆分模型
"model": "gpt-3.5-turbo-16k",
"name": "GPT35-16k",
"maxToken": 0,
"maxToken": 16000,
"price": 0
},
"ExtractModel": {
"ExtractModel": { // 内容提取模型
"model": "gpt-3.5-turbo-16k",
"functionCall": true,
"functionCall": true, // 是否使用 functionCall
"name": "GPT35-16k",
"maxToken": 0,
"maxToken": 16000,
"price": 0,
"prompt": ""
},
"CQModel": {
"CQModel": { // Classify Question: 问题分类模型
"model": "gpt-3.5-turbo-16k",
"functionCall": true,
"name": "GPT35-16k",
"maxToken": 0,
"maxToken": 16000,
"price": 0,
"prompt": ""
},
"QGModel": { // Question Generation: 生成下一步指引模型
"model": "gpt-3.5-turbo",
"name": "GPT35-4k",
"maxToken": 4000,
"price": 0,
"prompt": "",
"functionCall": false
}
}
```

View File

@@ -0,0 +1,8 @@
---
weight: 540
title: "设计方案"
description: "FastGPT 部分设计方案"
icon: public
draft: false
images: []
---

View File

@@ -0,0 +1,25 @@
---
weight: 541
title: "数据集"
description: "FastGPT 数据集中文件与数据的设计方案"
icon: dataset
draft: false
images: []
---
## 文件与数据的关系
在 FastGPT 中,文件会通过 MongoDB 的 FS 存储,而具体的数据会通过 PostgreSQL 存储PG 中的数据会有一列 file_id关联对应的文件。考虑到旧版本的兼容以及手动输入、标注数据等我们给 file_id 增加了一些特殊的值,如下:
- manual: 手动输入
- mark: 手动标注的数据
注意file_id 仅在插入数据时会写入,变更时无法修改。
## 文件导入流程
1. 上传文件到 MongoDB 的 FS 中,获取 file_id此时文件标记为 `unused` 状态
2. 浏览器解析文件,获取对应的文本和 chunk
3. 给每个 chunk 打上 file_id
4. 点击上传数据:将文件的状态改为 `used`,并将数据推送到 mongo `training` 表中等待训练
5. 由训练线程从 mongo 中取数据,并在获取向量后插入到 pg。

View File

@@ -10,30 +10,27 @@ weight: 510
本文档介绍了如何设置开发环境以构建和测试 [FastGPT](https://fastgpt.run)。
## Tips
1. 用户默认的时区为 `Asia/Shanghai`,非 linux 环境时候,获取系统时间会异常,本地开发时候,可以将用户的时区调整成 UTC+0
## 前置依赖项
您需要在计算机上安装和配置以下依赖项才能构建 [FastGPT](https://fastgpt.run)
- [Git](http://git-scm.com/)
- [Docker](https://www.docker.com/)
- [Docker Compose](https://docs.docker.com/compose/install/)
- [Docker](https://www.docker.com/)(构建镜像)
- [Node.js v18.x (LTS)](http://nodejs.org)
- [npm](https://www.npmjs.com/) 版本 8.x.x 或 [Yarn](https://yarnpkg.com/)
- [pnpm](https://pnpm.io/) 版本 8.x.x
## 本地开发
## 开始本地开发
要设置一个可工作的开发环境,只需 Fork 项目的 Git 存储库,并部署一个数据库,然后开始进行开发测试。
**Tips**
### Fork 存储库
1. 用户默认的时区为 `Asia/Shanghai`,非 linux 环境时候,获取系统时间会异常,本地开发时候,可以将用户的时区调整成 UTC+0
2. 建议先服务器装好数据库在进行本地开发。
### 1. Fork 存储库
您需要 Fork [存储库](https://github.com/labring/FastGPT)。
### 克隆存储库
### 2. 克隆存储库
克隆您在 GitHub 上 Fork 的存储库:
@@ -41,23 +38,27 @@ weight: 510
git clone git@github.com:<github_username>/FastGPT.git
```
**projects 目录下为 FastGPT 应用代码。NextJS 框架前后端放在一起API 服务位于 `src/pages/api` 目录内。**
**目录简要说明**
**packages 目录为相关的共用包。**
1. `projects` 目录下为 FastGPT 应用代码。其中 `app` 为 FastGPT 核心应用。(后续可能会引入其他应用)
2. NextJS 框架前后端放在一起API 服务位于 `src/pages/api` 目录内。
3. `packages` 目录为共用代码,通过 workspace 被注入到 `projects` 中,已配置 monorepo 自动注入,无需额外打包。
### 安装数据库
### 3. 安装数据库
第一次开发,需要先部署数据库,建议本地开发可以随便找一台 2C2G 的轻量小数据库实践。数据库部署教程:[Docker 快速部署](/docs/installation/docker/)
第一次开发,需要先部署数据库,建议本地开发可以随便找一台 2C2G 的轻量小数据库实践。数据库部署教程:[Docker 快速部署](/docs/installation/docker/)。部署完了,可以本地访问其数据库。
### 初始配置
### 4. 初始配置
**1. 环境变量**
以下文件均在 `projects/app` 路径下。
**环境变量**
复制.env.template 文件,生成一个.env.local 环境变量文件夹,修改.env.local 里内容才是有效的变量。变量说明见 .env.template
**2. config 配置文件**
**config 配置文件**
复制 data/config.json 文件,生成一个 data/config.local.json 配置文件具体参数说明,可参考 [config 配置说](/docs/development/configuration)
复制 data/config.json 文件,生成一个 data/config.local.json 配置文件具体配置参数说明,可参考 [config 配置说](/docs/development/configuration)
**注意json 配置文件不能包含注释,介绍中为了方便看才加入的注释**
@@ -67,23 +68,29 @@ git clone git@github.com:<github_username>/FastGPT.git
- `qaMaxProcess`: QA 生成最大进程
- `pgIvfflatProbe`: PostgreSQL vector 搜索探针,没有添加 vector 索引时可忽略。
### 运行
### 5. 运行
```bash
# 代码根目录下执行,会安装根 package、projects 和 packages 内所有依赖
pnpm i
cd projects/app # FastGPT 主程序
# 切换到应用目录
cd projects/app
# 开发模式运行
pnpm dev
```
### 镜像打包
### 6. 发布 - 镜像打包
```bash
# 根目录下执行
docker build -t dockername/fastgpt --build-arg name=app .
```
## 创建拉取请求
## 提交代码至开源仓库
在进行更改后打开一个拉取请求PR。提交拉取请求后FastGPT 团队/社区的其他人将与您一起审查它。
1. 确保你的代码是 Fork [FastGPT](https://github.com/labring/FastGPT) 仓库
2. 尽可能少量的提交代码,每次提交仅解决一个问题。
3. 向 FastGPT 的 main 分支提交一个 PR提交请求后FastGPT 团队/社区的其他人将与您一起审查它。
如果遇到问题,比如合并冲突或不知道如何打开拉取请求,请查看 GitHub 的[拉取请求教程](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests),了解如何解决合并冲突和其他问题。一旦您的 PR 被合并,您将自豪地被列为[贡献者表](https://github.com/labring/FastGPT/graphs/contributors)中的一员。

View File

@@ -1,5 +1,5 @@
---
title: 'OpenAPI 使用'
title: 'OpenAPI 使用API Key 使用)'
description: 'FastGPT OpenAPI 文档'
icon: 'api'
draft: false
@@ -28,25 +28,27 @@ FastGPT 的 API Key 有 2 类,一类是全局通用的 key一类是携带
## 发起对话
{{% alert icon="🤖 " context="success" %}}
该接口 API Key 需使用应用特定的 key否则会报错。
该接口 API Key 需使用应用特定的 key否则会报错。
有些包的 BaseUrl 需要添加 `v1` 路径,有些不需要,建议都试一下。
{{% /alert %}}
对话接口兼容 openai 的接口!如果你有第三方项目,可以直接通过修改 BaseUrl 和 Authorization 来访问 FastGpt 应用。缺点是你无法获取到响应的token值。
对话接口兼容`GPT`的接口!如果你的项目使用的是标准的`GPT`官方接口,可以直接通过修改 `BaseUrl``Authorization` 来访问 FastGpt 应用。
请求内容
请求参数说明
- headers.Authorization: Bearer apikey
- chatId: string | undefined 。
- 为 undefined 时(不传入),不使用 FastGpt 提供的上下文功能,完全通过传入的 messages 构建上下文。 不会将你的记录存储到数据库中,你也无法在记录汇总中查阅到。
- 为非空字符串时,意味着使用 chatId 进行对话,自动从 FastGpt 数据库取历史记录。并拼接 messages 数组最后一个内容作为完整请求。(自行确保 chatId 唯一,长度不限)
- messages: 与 openai gpt 接口完全一致。
- detail: 是否返回详细值(模块状态,响应的完整结果),会通过event进行区分
- variables: 变量一个对象,效果同全局变量
- 为非空字符串时,意味着使用 chatId 进行对话,自动从 FastGpt 数据库取历史记录,并使用 messages 数组最后一个内容作为用户问题。(自行确保 chatId 唯一,长度不限)
- messages: 结构与 [GPT接口](https://platform.openai.com/docs/api-reference/chat/object) 完全一致。
- detail: 是否返回详细值(模块状态,响应的完整结果),`stream模式`下会通过event进行区分`非stream模式`结果保存在responseData中。
- variables: 变量内容,一个对象,会替换`{{key}}`变量。在`HTTP`模块中会发给接口,可作为身份凭证等标识
**请求示例:**
```bash
curl --location --request POST 'https://fastgpt.run/api/openapi/v1/chat/completions' \
curl --location --request POST 'https://fastgpt.run/api/v1/chat/completions' \
--header 'Authorization: Bearer apikey' \
--header 'Content-Type: application/json' \
--data-raw '{
@@ -223,9 +225,10 @@ data: [{"moduleName":"KB Search","price":1.2000000000000002,"model":"Embedding-2
此部分 API 需使用全局通用的 API Key。
{{% /alert %}}
### 如何获取知识库IDkbId
| 如何获取知识库IDkbId | 如何获取文件IDfile_id |
| --------------------- | --------------------- |
| ![](/imgs/getKbId.png) | ![](/imgs/getfile_id.png) |
![](/imgs/getKbId.png)
### 知识库添加数据
@@ -246,6 +249,8 @@ curl --location --request POST 'https://fastgpt.run/api/core/dataset/data/pushDa
        {
            "a": "test",
            "q": "1111",
"file_id": "关联的文件ID/URL/manual/mark",
"source": "来源名称"
        },
        {
            "a": "test2",
@@ -269,7 +274,8 @@ curl --location --request POST 'https://fastgpt.run/api/core/dataset/data/pushDa
"data": [
{
"q": "生成索引的内容index 模式下最大 tokens 为3000建议不超过 1000",
"a": "预期回答/补充"
"a": "预期回答/补充",
"file_id": "如果推送数据到手动录入,这里可以留空; 如果希望关联到某个文件中需要填写对应文件的ID; 如果希望加入到手动标注中,可设置为: mark",
},
{
"q": "生成索引的内容qa 模式下最大 tokens 为10000建议 8000 左右",
@@ -290,7 +296,16 @@ curl --location --request POST 'https://fastgpt.run/api/core/dataset/data/pushDa
"code": 200,
"statusText": "",
"data": {
"insertLen": 1 // 最终插入成功的数量,可能因为超出 tokens 或者插入异常index 可以重复插入,会自动去重
"insertLen": 1, // 最终插入成功的数量
"overToken": [], // 超出 token 的
"fileIdInvalid": [ // file_id 无效的
{
"a": "飞飞dsaf飞",
"q": "测试是32否收到",
"file_id": "32dwe"
}
],
"error": [] // 其他错误
}
}
```

View File

@@ -11,17 +11,17 @@ weight: 720
### 1. 准备好代理环境(国外服务器可忽略)
确保可以访问 OpenAI具体方案可以参考[Nginx 中转](/docs/installation/proxy/nginx/)
确保可以访问 OpenAI具体方案可以参考[代理方案](/docs/installation/proxy/)。或直接在 Sealos 上 [部署 OneAPI](/docs/installation/one-api),既解决代理问题也能实现多 Key 轮询、接入其他大模型。
### 2. 多模型支持
推荐使用 one-api 项目来管理模型池,兼容 OpenAI 、Azure 国内主流模型等。
FastGPT 使用 one-api 项目来管理模型池,其可以兼容 OpenAI 、Azure 国内主流模型和本地模型等。
具体部署方法可参考该项目的 [README](https://github.com/songquanpeng/one-api),也可以直接通过以下按钮一键部署:
可选择 [Sealos 快速部署 OneAPI](/docs/installation/one-api),更多部署方法可参考该项目的 [README](https://github.com/songquanpeng/one-api),也可以直接通过以下按钮一键部署:
[![](https://fastly.jsdelivr.net/gh/labring-actions/templates@main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Done-api)
## 安装 Docker 和 docker-compose
## 一、安装 Docker 和 docker-compose
{{< tabs tabTotal="3" >}}
{{< tab tabName="Linux" >}}
@@ -29,7 +29,7 @@ weight: 720
```bash
# 安装 Docker
curl -sSL https://get.daocloud.io/docker | sh
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl enable --now docker
# 安装 docker-compose
curl -L https://github.com/docker/compose/releases/download/2.20.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
@@ -37,6 +37,7 @@ chmod +x /usr/local/bin/docker-compose
# 验证安装
docker -v
docker-compose -v
# 如失效,自行百度~
```
{{< /markdownify >}}
@@ -65,93 +66,35 @@ brew install orbstack
{{< /tab >}}
{{< /tabs >}}
## 创建 docker-compose.yml 文件
## 二、创建目录并下载 docker-compose.yml
先创建一个目录(例如 fastgpt并进入该目录创建一个 docker-compose.yml 文件
依次执行下面命令,创建 FastGPT 文件并拉取`docker-compose.yml``config.json`,执行完后目录下会有 2 个文件
非 Linux 环境可手动创建目录并下载这2个文件。
**注意: 配置文件中 Mongo 为 5.x部分服务器不支持需手动更改其镜像版本为 4.4.24**
```bash
mkdir fastgpt
cd fastgpt
touch docker-compose.yml
curl -O https://raw.githubusercontent.com/labring/FastGPT/main/files/deploy/fastgpt/docker-compose.yml
curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
```
粘贴下面的内容,仅需把 `CHAT_API_KEY` 修改成 openai key 即可。如果需要使用中转或 oneapi 还需要修改 `OPENAI_BASE_URL`:
```yaml
# 非 host 版本, 不使用本机代理
version: '3.3'
services:
pg:
image: ankane/pgvector:v0.4.2 # docker
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.4.2 # 阿里云
container_name: pg
restart: always
ports: # 生产环境建议不要暴露
- 5432:5432
networks:
- fastgpt
environment:
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
- POSTGRES_USER=username
- POSTGRES_PASSWORD=password
- POSTGRES_DB=postgres
volumes:
- ./pg/data:/var/lib/postgresql/data
mongo:
image: mongo:5.0.18
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
container_name: mongo
restart: always
ports: # 生产环境建议不要暴露
- 27017:27017
networks:
- fastgpt
environment:
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
- MONGO_INITDB_ROOT_USERNAME=username
- MONGO_INITDB_ROOT_PASSWORD=password
volumes:
- ./mongo/data:/data/db
fastgpt:
container_name: fastgpt
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:latest # 阿里云
image: ghcr.io/labring/fastgpt:latest # github
ports:
- 3000:3000
networks:
- fastgpt
depends_on:
- mongo
- pg
restart: always
environment:
# root 密码,用户名为: root
- DEFAULT_ROOT_PSW=1234
# 中转地址,如果是用官方号,不需要管
- OPENAI_BASE_URL=https://api.openai.com/v1
- CHAT_API_KEY=sk-xxxx
- DB_MAX_LINK=5 # database max link
- TOKEN_KEY=any
- ROOT_KEY=root_key
- FILE_TOKEN_KEY=filetoken
# mongo 配置,不需要改. 如果连不上,可能需要去掉 ?authSource=admin
- MONGODB_URI=mongodb://username:password@mongo:27017/fastgpt?authSource=admin
# pg配置. 不需要改
- PG_URL=postgresql://username:password@pg:5432/postgres
networks:
fastgpt:
```
## 三、启动容器
## 启动容器
修改`docker-compose.yml`中的`OPENAI_BASE_URL``CHAT_API_KEY`即可,对应为 API 的地址和 key。
```bash
# 在 docker-compose.yml 同级目录下执行
docker-compose pull
docker-compose up -d
```
## 访问 FastGPT
## 四、访问 FastGPT
目前可以通过 `ip:3000` 直接访问(注意防火墙)。登录用户名为 `root`,密码为刚刚环境变量里设置的 `DEFAULT_ROOT_PSW`
目前可以通过 `ip:3000` 直接访问(注意防火墙)。登录用户名为 `root`,密码为`docker-compose.yml`环境变量里设置的 `DEFAULT_ROOT_PSW`
如果需要域名访问,请自行安装并配置 Nginx。
@@ -168,28 +111,30 @@ docker-compose up -d
### 如何自定义配置文件?
需要在 `docker-compose.yml` 同级目录创建一个 `config.json` 文件,内容参考: [配置详解](/docs/development/configuration)
修改`config.json`文件,并执行`docker-compose up -d`重起容器。具体配置,参考[配置详解](/docs/development/configuration)
然后修改 `docker-compose.yml` 中的 `fastgpt` 容器内容,增加挂载选项即可:
### 如何检查自定义配置文件是否挂载
```yaml
fastgpt:
container_name: fastgpt
image: ghcr.io/labring/fastgpt:latest # github
ports:
- 3000:3000
networks:
- fastgpt
depends_on:
- mongo
- pg
restart: always
environment:
...
- DEFAULT_ROOT_PSW=1234
...
volumes:
- ./config.json:/app/data/config.json
```
1. `docker logs fastgpt` 可以查看日志,在启动容器后,第一次请求网页,会进行配置文件读取,可以看看有没有读取成功以及有无错误日志。
2. `docker exec -it fastgpt sh` 进入 FastGPT 容器,可以通过`ls data`查看目录下是否成功挂载`config.json`文件。可通过`cat data/config.json`查看配置文件。
> 参考[配置详解](/docs/development/configuration)
### 为什么无法连接 oneapi 和 本地模型镜像。
`docker-compose.yml`中使用了桥接的模式建立了`fastgpt`网络如想通过0.0.0.0或镜像名访问其它镜像,需将其它镜像也加入到网络中。
### 端口冲突怎么解决?
docker-compose 端口定义为:`映射端口:运行端口`
桥接模式下,容器运行端口不会有冲突,但是会有映射端口冲突,只需将映射端口修改成不同端口即可。
如果`容器1`需要连接`容器2`,使用`容器2:运行端口`来进行连接即可。
(自行补习 docker 基本知识)
### 错误排查方式
遇到问题先按下面方式排查。
1. `docker ps -a` 查看所有容器运行状态,检查是否全部 running如有异常尝试`docker logs 容器名`查看对应日志。
2. 不懂 docker 不要瞎改端口,只需要改`OPENAI_BASE_URL``CHAT_API_KEY`即可。

View File

@@ -1,5 +1,5 @@
---
title: '部署 One API实现多模型支持'
title: '接入微软、ChatGLM、本地模型等'
description: '通过接入 One API 来实现对各种大模型的支持'
icon: 'Api'
draft: false
@@ -7,9 +7,8 @@ toc: true
weight: 730
---
默认情况下FastGPT 只配置了 GPT 的 3 个模型,如果你需要接入其他模型,需要进行一些额外配置。
[One API](https://github.com/songquanpeng/one-api) 是一个 OpenAI 接口管理 & 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。
* 默认情况下FastGPT 只配置了 GPT 的 3 个模型,如果你需要接入其他模型,需要进行一些额外配置。
* [One API](https://github.com/songquanpeng/one-api) 是一个 OpenAI 接口管理 & 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。
FastGPT 可以通过接入 One API 来实现对各种大模型的支持。部署方法也很简单。

View File

@@ -23,6 +23,22 @@ Sealos 的服务器在国外,不需要额外处理网络问题,无需服务
>
> 密码就是刚刚一键部署时设置的环境变量
## 修改配置文件和环境变量
在 Sealos 中,你可以打开`应用管理`App Launchpad看到部署的 FastGPT可以打开`数据库`Database看到对应的数据库。
`应用管理`中,选中 FastGPT点击变更可以看到对应的环境变量和配置文件。
![](/imgs/fastgptonsealos1.png)
{{% alert icon="🤖 " context="success" %}}
在 Sealos 上FastGPT 一共运行了 1 个服务和 2 个数据库,如暂停和删除请注意数据库一同操作。(你可以白天启动,晚上暂停它们,省钱大法)
{{% /alert %}}
## 更新
点击重启会自动拉取最新镜像更新,请确保镜像`tag`正确。
## 部署架构图
![](/imgs/sealos-fastgpt.webp)

View File

@@ -4,7 +4,7 @@ description: 'FastGPT 从旧版本升级到 V4.0 操作指南'
icon: 'upgrade'
draft: false
toc: true
weight: 1000
weight: 850
---
如果您是**从旧版本升级到 V4**,由于新版 MongoDB 表变更比较大,需要按照本文档的说明执行一些初始化脚本。

View File

@@ -4,7 +4,7 @@ description: 'FastGPT 从旧版本升级到 V4.1 操作指南'
icon: 'upgrade'
draft: false
toc: true
weight: 999
weight: 849
---
如果您是**从旧版本升级到 V4.1**,由于新版重新设置了对话存储结构,需要初始化原来的存储内容。

View File

@@ -4,7 +4,7 @@ description: 'FastGPT 从旧版本升级到 V4.2 操作指南'
icon: 'upgrade'
draft: false
toc: true
weight: 998
weight: 848
---
99.9%用户不影响,升级 4.2 主要是修改了配置文件中 QAModel 的格式。从原先的数组改成对象:

View File

@@ -4,7 +4,7 @@ description: 'FastGPT 从旧版本升级到 V4.2.1 操作指南'
icon: 'upgrade'
draft: false
toc: true
weight: 997
weight: 847
---
私有部署,如果添加了配置文件,需要在配置文件中修改 `VectorModels` 字段。增加 defaultToken 和 maxToken分别对应直接分段时的默认 token 数量和该模型支持的 token 上限(通常不建议超过 3000

View File

@@ -4,7 +4,7 @@ description: 'FastGPT 从旧版本升级到 V4.3 操作指南'
icon: 'upgrade'
draft: false
toc: true
weight: 996
weight: 846
---
## 执行初始化 API

View File

@@ -4,7 +4,7 @@ description: 'FastGPT 从旧版本升级到 V4.4 操作指南'
icon: 'upgrade'
draft: false
toc: true
weight: 995
weight: 845
---
## 执行初始化 API

View File

@@ -4,7 +4,7 @@ description: 'FastGPT 从旧版本升级到 V4.4.1 操作指南'
icon: 'upgrade'
draft: false
toc: true
weight: 994
weight: 844
---
## 执行初始化 API

View File

@@ -4,7 +4,7 @@ description: 'FastGPT 从旧版本升级到 V4.4.2 操作指南'
icon: 'upgrade'
draft: false
toc: true
weight: 993
weight: 843
---
## 执行初始化 API

View File

@@ -4,7 +4,7 @@ description: 'FastGPT V4.4.5 更新(需执行升级脚本)'
icon: 'upgrade'
draft: false
toc: true
weight: 992
weight: 842
---
## 执行初始化 API
@@ -26,6 +26,6 @@ curl --location --request POST 'https://{{host}}/api/admin/initv445' \
### Fast GPT V4.4.5
1. 新增 - 下一步指引选项,可以通过模型生成 3 个预测问题。
2. 新增 - 分享链接 hook 身份校验。
3. 新增 - Api Key 使用。增加别名、额度限制和过期时间。自带 appId无需额外连接。
2. 商业版新增 - 分享链接限制及 hook 身份校验(可对接已有的用户系统)
3. 商业版新增 - Api Key 使用。增加别名、额度限制和过期时间。自带 appId无需额外连接。
4. 优化 - 全局变量与开场白合并成同一模块。

View File

@@ -0,0 +1,14 @@
---
title: 'V4.4.6'
description: 'FastGPT V4.4.6 更新'
icon: 'upgrade'
draft: false
toc: true
weight: 841
---
## 功能介绍
1. 高级编排新增模块 - 应用调用,可调用其他应用。
2. 新增 - 必要连接校验
3. 修复 - 下一步指引在免登录中身份问题。

View File

@@ -0,0 +1,31 @@
---
title: 'V4.4.7'
description: 'FastGPT V4.4.7 更新(需执行升级脚本)'
icon: 'upgrade'
draft: false
toc: true
weight: 840
---
## 执行初始化 API
发起 1 个 HTTP 请求({{rootkey}} 替换成环境变量里的`rootkey`{{host}}替换成自己域名)
1. https://xxxxx/api/admin/initv445
```bash
curl --location --request POST 'https://{{host}}/api/admin/initv447' \
--header 'rootkey: {{rootkey}}' \
--header 'Content-Type: application/json'
```
初始化 pg 索引以及将 file_id 中空对象转成 manual 对象。如果数据多,可能需要较长时间,可以通过日志查看进度。
## 功能介绍
### Fast GPT V4.4.7
1. 优化了数据库文件 crud。
2. 兼容链接读取,作为 source。
3. 区分手动录入和标注,可追数据至某个文件。
4. 升级 openai sdk。

View File

@@ -26,7 +26,7 @@ weight: 312
## 3. 创建 docker-compose.yml 文件
只需要修改 `OPEN_AI_API_KEY``OPEN_AI_API_BASE` 两个环境变量即可。其中 `OPEN_AI_API_KEY` 为第一步获取的秘钥,`OPEN_AI_API_BASE` 为 FastGPT 的 OpenAPI 地址,例如:`https://fastgpt.run/api/openapi/v1`
只需要修改 `OPEN_AI_API_KEY``OPEN_AI_API_BASE` 两个环境变量即可。其中 `OPEN_AI_API_KEY` 为第一步获取的秘钥,`OPEN_AI_API_BASE` 为 FastGPT 的 OpenAPI 地址,例如:`https://fastgpt.run/api/v1`
随便找一个目录,创建一个 docker-compose.yml 文件,将下面的代码复制进去。
@@ -40,7 +40,7 @@ services:
- seccomp:unconfined
environment:
OPEN_AI_API_KEY: 'fastgpt-z51pkjqm9nrk03a1rx2funoy'
OPEN_AI_API_BASE: 'https://fastgpt.run/api/openapi/v1'
OPEN_AI_API_BASE: 'https://fastgpt.run/api/v1'
MODEL: 'gpt-3.5-turbo'
CHANNEL_TYPE: 'wx'
PROXY: ''

View File

@@ -25,7 +25,7 @@ Tips: 安全起见,你可以设置一个额度或者过期时间,放置 key
## 替换三方应用的变量
```bash
OPENAI_API_BASE_URL: https://fastgpt.run/api/openapi (改成自己部署的域名)
OPENAI_API_BASE_URL: https://fastgpt.run/api (改成自己部署的域名)
OPENAI_API_KEY = 上一步获取到的秘钥
```

View File

@@ -3,6 +3,6 @@ module fastgpt-docs
go 1.21
require (
github.com/colinwilson/lotusdocs v0.0.0-20230919015602-a9717caaab14 // indirect
github.com/colinwilson/lotusdocs v0.1.0 // indirect
github.com/gohugoio/hugo-mod-bootstrap-scss/v5 v5.20300.20003 // indirect
)

View File

@@ -6,6 +6,8 @@ github.com/colinwilson/lotusdocs v0.0.0-20230821033552-c5bcbdd9df80 h1:jKZF8sqr/
github.com/colinwilson/lotusdocs v0.0.0-20230821033552-c5bcbdd9df80/go.mod h1:9zu2REJDi+zdPRcR5/bRYSUR7gkNF4NQLvV38SEoCP8=
github.com/colinwilson/lotusdocs v0.0.0-20230919015602-a9717caaab14 h1:ORzVQia2njOTCs/5cTQZW0Y+YRZlupgwtGx3umABTcc=
github.com/colinwilson/lotusdocs v0.0.0-20230919015602-a9717caaab14/go.mod h1:9zu2REJDi+zdPRcR5/bRYSUR7gkNF4NQLvV38SEoCP8=
github.com/colinwilson/lotusdocs v0.1.0 h1:oTC8pAYQp9XDNaUwE4SEY+id3ByNELxIIFrktYEGxYA=
github.com/colinwilson/lotusdocs v0.1.0/go.mod h1:9zu2REJDi+zdPRcR5/bRYSUR7gkNF4NQLvV38SEoCP8=
github.com/gohugoio/hugo-mod-bootstrap-scss/v5 v5.20300.20003 h1:pt/JGVD5YYRsVVijOHPZI6YKTUvbR4e0hgV9B0S6rbI=
github.com/gohugoio/hugo-mod-bootstrap-scss/v5 v5.20300.20003/go.mod h1:mvM05r93HiefwoaxQTaYiJxtJAhTebwQtU1Xh/J+Okk=
github.com/gohugoio/hugo-mod-jslibs-dist/popperjs/v2 v2.21100.20000/go.mod h1:mFberT6ZtcchrsDtfvJM7aAH2bDKLdOnruUHl0hlapI=

View File

@@ -18,6 +18,9 @@ defaultContentLanguage = 'zh-cn'
weight = 10
disabled = true
[build]
noJSConfigInAssets = true
[module]
[module.hugoVersion]
extended = true

View File

@@ -11,8 +11,12 @@
{{ end -}}
{{ if .Page.Store.Get "hasMermaid" }}
<script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';
{{ $mermaid := resources.Get (printf "%s/%s" ($.Scratch.Get "pathName") "js/mermaid.js") }}
{{ if hugo.IsProduction }}
{{ $mermaid = $mermaid | minify | fingerprint "sha384" }}
{{ end }}
<script src="{{ $mermaid.RelPermalink }}" {{ if hugo.IsProduction }}integrity="{{ $mermaid.Data.Integrity }}"{{ end }}></script>
<script>
const config = {
startOnLoad:true,
logLevel: "error",

View File

@@ -7,11 +7,33 @@
{{ $yearToken := (cond (isset .Site.Params (lower "copyrightYearToken")) $.Site.Params.copyrightYearToken ":YEAR:") }}
{{ replace $.Site.Params.footer.copyright $yearToken (string (now.Format "2006")) | markdownify }}
</p>
<!--change-->
<p class="github-badge">
<span class="badge-subject">云操作系统</span><span class="badge-value bg-blue"><a style="color:#fff" href="https://sealos.io/" target="_blank">Sealos</a></span>
<span class="badge-subject">云开发</span><span class="badge-value bg-brightgreen"><a style="color:#fff" href="https://laf.run" target="_blank">Laf</a></span>
<span class="badge-subject">云原生存储</span><span class="badge-value bg-orange"><a style="color:#fff" href="https://github.com/labring/sealfs" target="_blank">Sealfs</a></span>
</p>
<div id="fixed-box">
<div class="feedback-btn-wrapper">
<a
href="https://fael3z0zfze.feishu.cn/share/base/form/shrcnRxj3utrzjywsom96Px4sud"
style="text-decoration: none"
target="_blank"
>
<button id="feedback-btn" title="Give feedback">
<svg class="inline w-5 h-5" viewBox="0 0 20 20" fill="currentColor">
<path
fill-rule="evenodd"
d="M18 13V5a2 2 0 00-2-2H4a2 2 0 00-2 2v8a2 2 0 002 2h3l3 3 3-3h3a2 2 0 002-2zM5 7a1 1 0 011-1h8a1 1 0 110 2H6a1 1 0 01-1-1zm1 3a1 1 0 100 2h3a1 1 0 100-2H6z"
clip-rule="evenodd"
></path>
</svg>
<span _msttexthash="6039839" _msthash="295">咨询合作</span>
</button>
</a>
</div>
</div>
<!-- End -->
</div>
</div><!--end col-->
</div><!--end row-->

View File

@@ -30,6 +30,8 @@
<meta name="Version" content="v0.1.0" />
<!-- favicon -->
{{ block "favicon" . }}{{ partialCached (printf "%s/%s" ($.Scratch.Get "pathName") "head/favicon.html") . }}{{ end }}
{{- partial (printf "%s/%s" ($.Scratch.Get "pathName") "head/opengraph") . }}
{{- partial (printf "%s/%s" ($.Scratch.Get "pathName") "head/twitter_cards") . }}
<!-- Dark Mode -->
{{ if eq .Site.Params.docs.darkMode true -}}
{{ $darkModeInit := resources.Get (printf "/%s/%s" ($.Scratch.Get "pathName") "js/darkmode-init.js") | js.Build | minify -}}

View File

@@ -42,7 +42,45 @@
<ul>
{{ range .Pages }}
{{ $active := in $currentPage.RelPermalink .RelPermalink }}
<li class="{{ if $active }}current{{ end }} {{ if eq .Site.Params.docs.sidebarIcons true -}}{{ else }}no-icon{{ end }}"><a class="sidebar-nested-link" href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ if .IsSection }}
<li class="sidebar-dropdown nested {{ if eq .Site.Params.docs.sidebarIcons true -}}{{ else }}no-icon{{ end }} {{ if $active }}current active{{ end }}">
<button class="btn">
{{ if eq .Site.Params.docs.sidebarIcons true -}}
<!-- <span class="material-icons me-2">{{- .Params.icon }}</span> -->
{{ end }}
{{- .Title }}
</button>
<div class="sidebar-submenu {{ if $active }}d-block{{ end }}">
<ul>
{{ range .Pages }}
{{ $active := in $currentPage.RelPermalink .RelPermalink }}
{{ if .IsSection }}
<li class="sidebar-dropdown nested {{ if eq .Site.Params.docs.sidebarIcons true -}}{{ else }}no-icon{{ end }} {{ if $active }}current active{{ end }}">
<button class="btn">
{{ if eq .Site.Params.docs.sidebarIcons true -}}
<!-- <span class="material-icons me-2">{{- .Params.icon }}</span> -->
{{ end }}
{{- .Title }}
</button>
<div class="sidebar-submenu {{ if $active }}d-block{{ end }}">
<ul>
{{ range .Pages }}
{{ $active := in $currentPage.RelPermalink .RelPermalink }}
<li class="{{ if $active }}current{{ end }} {{ if eq .Site.Params.docs.sidebarIcons true -}}{{ else }}no-icon{{ end }}"><a class="sidebar-nested-link" href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ end }}
</ul>
</div>
</li>
{{ else }}
<li class="{{ if $active }}current{{ end }} {{ if eq .Site.Params.docs.sidebarIcons true -}}{{ else }}no-icon{{ end }}"><a class="sidebar-nested-link" href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ end }}
{{ end }}
</ul>
</div>
</li>
{{ else }}
<li class="{{ if $active }}current{{ end }} {{ if eq .Site.Params.docs.sidebarIcons true -}}{{ else }}no-icon{{ end }}"><a class="sidebar-nested-link" href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ end }}
{{ end }}
</ul>
</div>

View File

@@ -1 +0,0 @@
{"Target":"docs/scss/style.min.dfae72221c400d9e5816cbed333a16f8ea12c17463fb493c40bab5119dc455b63fe877d0b76b92a7d5c6c595331a243d.css","MediaType":"text/css","Data":{"Integrity":"sha384-365yIhxADZ5YFsvtMzoW+OoSwXRj+0k8QLq1EZ3EVbY/6HfQt2uSp9XGxZUzGiQ9"}}

View File

@@ -1 +0,0 @@
{"Target":"docs/scss/style.css","MediaType":"text/css","Data":{}}

View File

@@ -1 +0,0 @@
{"Target":"scss/style.min.4d48305d7fec6ad346a2319f83fc622c27253ec11be0c970ae5b04baa6074df3868a7239c250d323090fdb718523631c.css","MediaType":"text/css","Data":{"Integrity":"sha384-TUgwXX/satNGojGfg/xiLCclPsEb4MlwrlsEuqYHTfOGinI5wlDTIwkP23GFI2Mc"}}

View File

@@ -1 +0,0 @@
{"Target":"scss/style.css","MediaType":"text/css","Data":{}}

View File

@@ -3,10 +3,6 @@
{
"source": "/",
"destination": "/docs"
},
{
"source": "/imgs/:path*",
"destination": "https://jsdelivr.icloudnative.io/gh/labring/FastGPT@main/docSite/assets/imgs/:path*"
}
],
"headers": [

View File

@@ -1,63 +0,0 @@
{
"FeConfig": {
"show_emptyChat": true,
"show_register": false,
"show_appStore": false,
"show_userDetail": false,
"show_contact": true,
"show_git": true,
"show_doc": true,
"systemTitle": "FastGPT",
"authorText": "Made by FastGPT Team.",
"scripts": []
},
"SystemParams": {
"vectorMaxProcess": 15,
"qaMaxProcess": 15,
"pgIvfflatProbe": 20
},
"ChatModels": [
{
"model": "gpt-3.5-turbo",
"name": "GPT35-4k",
"contextMaxToken": 4000,
"quoteMaxToken": 2000,
"maxTemperature": 1.2,
"price": 0,
"defaultSystem": ""
},
{
"model": "gpt-3.5-turbo-16k",
"name": "GPT35-16k",
"contextMaxToken": 16000,
"quoteMaxToken": 8000,
"maxTemperature": 1.2,
"price": 0,
"defaultSystem": ""
},
{
"model": "gpt-4",
"name": "GPT4-8k",
"contextMaxToken": 8000,
"quoteMaxToken": 4000,
"maxTemperature": 1.2,
"price": 0,
"defaultSystem": ""
}
],
"VectorModels": [
{
"model": "text-embedding-ada-002",
"name": "Embedding-2",
"price": 0,
"defaultToken": 500,
"maxToken": 3000
}
],
"QAModel": {
"model": "gpt-3.5-turbo-16k",
"name": "GPT35-16k",
"maxToken": 16000,
"price": 0
}
}

View File

@@ -11,7 +11,7 @@
"i18next": "^23.2.11",
"lint-staged": "^13.2.1",
"next-i18next": "^14.0.0",
"prettier": "^2.8.7",
"prettier": "^3.0.3",
"react-i18next": "^13.0.2"
},
"lint-staged": {

View File

@@ -0,0 +1,23 @@
import { strIsLink } from './str';
export const fileImgs = [
{ suffix: 'pdf', src: '/imgs/files/pdf.svg' },
{ suffix: 'csv', src: '/imgs/files/csv.svg' },
{ suffix: '(doc|docs)', src: '/imgs/files/doc.svg' },
{ suffix: 'txt', src: '/imgs/files/txt.svg' },
{ suffix: 'md', src: '/imgs/files/markdown.svg' },
{ suffix: '.', src: '/imgs/files/file.svg' }
];
export function getFileIcon(name = '') {
return fileImgs.find((item) => new RegExp(item.suffix, 'gi').test(name))?.src;
}
export function getSpecialFileIcon(name = '') {
if (name === 'manual') {
return '/imgs/files/manual.svg';
} else if (name === 'mark') {
return '/imgs/files/mark.svg';
} else if (strIsLink(name)) {
return '/imgs/files/link.svg';
}
}

View File

@@ -0,0 +1,5 @@
export function strIsLink(str?: string) {
if (!str) return false;
if (/^((http|https)?:\/\/|www\.|\/)[^\s/$.?#].[^\s]*$/i.test(str)) return true;
return false;
}

View File

@@ -0,0 +1,16 @@
import { UserModelSchema } from '../user/type';
import OpenAI from 'openai';
export const openaiBaseUrl = process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1';
export const baseUrl = process.env.ONEAPI_URL || openaiBaseUrl;
export const systemAIChatKey = process.env.CHAT_API_KEY || '';
export const getAIApi = (props?: UserModelSchema['openaiAccount'], timeout = 6000) => {
return new OpenAI({
apiKey: props?.key || systemAIChatKey,
baseURL: props?.baseUrl || baseUrl,
httpAgent: global.httpsAgent,
timeout
});
};

View File

@@ -0,0 +1,6 @@
export enum ChatCompletionRequestMessageRoleEnum {
'System' = 'system',
'User' = 'user',
'Assistant' = 'assistant',
'Function' = 'function'
}

View File

@@ -0,0 +1,57 @@
import { ChatCompletionRequestMessage } from '../type';
import { getAIApi } from '../config';
export const Prompt_QuestionGuide = `我不太清楚问你什么问题,请帮我生成 3 个问题引导我继续提问。问题的长度应小于20个字符按 JSON 格式返回: ["问题1", "问题2", "问题3"]`;
export async function createQuestionGuide({
messages,
model
}: {
messages: ChatCompletionRequestMessage[];
model: string;
}) {
const ai = getAIApi();
const data = await ai.chat.completions.create({
model: model,
temperature: 0,
max_tokens: 200,
messages: [
...messages,
{
role: 'user',
content: Prompt_QuestionGuide
}
],
stream: false
});
const answer = data.choices?.[0].message?.content || '';
const totalTokens = data.usage?.total_tokens || 0;
const start = answer.indexOf('[');
const end = answer.lastIndexOf(']');
if (start === -1 || end === -1) {
return {
result: [],
tokens: totalTokens
};
}
const jsonStr = answer
.substring(start, end + 1)
.replace(/(\\n|\\)/g, '')
.replace(/ /g, '');
try {
return {
result: JSON.parse(jsonStr),
tokens: totalTokens
};
} catch (error) {
return {
result: [],
tokens: totalTokens
};
}
}

6
packages/core/ai/type.d.ts vendored Normal file
View File

@@ -0,0 +1,6 @@
import OpenAI from 'openai';
export type ChatCompletionRequestMessage = OpenAI.Chat.CreateChatCompletionRequestMessage;
export type ChatCompletion = OpenAI.Chat.ChatCompletion;
export type CreateChatCompletionRequest = OpenAI.Chat.ChatCompletionCreateParams;
export type StreamChatType = Stream<OpenAI.Chat.ChatCompletionChunk>;

View File

@@ -1,28 +0,0 @@
import { UserModelSchema } from '../user/type';
import { Configuration, OpenAIApi } from 'openai';
export const openaiBaseUrl = process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1';
export const baseUrl = process.env.ONEAPI_URL || openaiBaseUrl;
export const systemAIChatKey = process.env.CHAT_API_KEY || '';
export const getAIChatApi = (props?: UserModelSchema['openaiAccount']) => {
return new OpenAIApi(
new Configuration({
basePath: props?.baseUrl || baseUrl,
apiKey: props?.key || systemAIChatKey
})
);
};
/* openai axios config */
export const axiosConfig = (props?: UserModelSchema['openaiAccount']) => {
return {
baseURL: props?.baseUrl || baseUrl, // 此处仅对非 npm 模块有效
httpsAgent: global.httpsAgent,
headers: {
Authorization: `Bearer ${props?.key || systemAIChatKey}`,
auth: process.env.OPENAI_BASE_URL_AUTH || ''
}
};
};

View File

@@ -1 +0,0 @@
export { ChatCompletionRequestMessageRoleEnum } from 'openai';

View File

@@ -1 +0,0 @@
export type { CreateChatCompletionRequest, ChatCompletionRequestMessage } from 'openai';

View File

@@ -0,0 +1,15 @@
export enum DatasetSpecialIdEnum {
manual = 'manual',
mark = 'mark'
}
export const datasetSpecialIdMap = {
[DatasetSpecialIdEnum.manual]: {
name: 'kb.Manual Data',
sourceName: 'kb.Manual Input'
},
[DatasetSpecialIdEnum.mark]: {
name: 'kb.Mark Data',
sourceName: 'kb.Manual Mark'
}
};
export const datasetSpecialIds: string[] = [DatasetSpecialIdEnum.manual, DatasetSpecialIdEnum.mark];

View File

@@ -0,0 +1,8 @@
import { datasetSpecialIds } from './constant';
import { strIsLink } from '@fastgpt/common/tools/str';
export function isSpecialFileId(id: string) {
if (datasetSpecialIds.includes(id)) return true;
if (strIsLink(id)) return true;
return false;
}

View File

@@ -2,7 +2,10 @@
"name": "@fastgpt/core",
"version": "1.0.0",
"dependencies": {
"openai": "^3.3.0",
"@fastgpt/common": "workspace:*",
"@fastgpt/support": "workspace:*",
"encoding": "^0.1.13",
"openai": "^4.11.1",
"tunnel": "^0.0.6"
},
"devDependencies": {

View File

@@ -1,4 +1,7 @@
{
"name": "@fastgpt/support",
"version": "1.0.0"
"version": "1.0.0",
"dependencies": {
"@fastgpt/common": "workspace:*"
}
}

308
pnpm-lock.yaml generated
View File

@@ -21,8 +21,8 @@ importers:
specifier: ^14.0.0
version: registry.npmmirror.com/next-i18next@14.0.0(i18next@23.2.11)(next@13.5.2)(react-i18next@13.0.2)(react@18.2.0)
prettier:
specifier: ^2.8.7
version: registry.npmmirror.com/prettier@2.8.7
specifier: ^3.0.3
version: registry.npmmirror.com/prettier@3.0.3
react-i18next:
specifier: ^13.0.2
version: registry.npmmirror.com/react-i18next@13.0.2(i18next@23.2.11)(react-dom@18.2.0)(react@18.2.0)
@@ -31,9 +31,18 @@ importers:
packages/core:
dependencies:
'@fastgpt/common':
specifier: workspace:*
version: link:../common
'@fastgpt/support':
specifier: workspace:*
version: link:../support
encoding:
specifier: ^0.1.13
version: registry.npmmirror.com/encoding@0.1.13
openai:
specifier: ^3.3.0
version: registry.npmmirror.com/openai@3.3.0
specifier: ^4.11.1
version: registry.npmmirror.com/openai@4.11.1(encoding@0.1.13)
tunnel:
specifier: ^0.0.6
version: registry.npmmirror.com/tunnel@0.0.6
@@ -42,16 +51,26 @@ importers:
specifier: ^0.0.4
version: registry.npmmirror.com/@types/tunnel@0.0.4
packages/support: {}
packages/support:
dependencies:
'@fastgpt/common':
specifier: workspace:*
version: link:../common
projects/app:
dependencies:
'@chakra-ui/anatomy':
specifier: ^2.2.1
version: registry.npmmirror.com/@chakra-ui/anatomy@2.2.1
'@chakra-ui/icons':
specifier: ^2.0.17
version: registry.npmmirror.com/@chakra-ui/icons@2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0)
'@chakra-ui/react':
specifier: ^2.7.0
version: registry.npmmirror.com/@chakra-ui/react@2.7.0(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.0.28)(framer-motion@9.0.6)(react-dom@18.2.0)(react@18.2.0)
'@chakra-ui/styled-system':
specifier: ^2.9.1
version: registry.npmmirror.com/@chakra-ui/styled-system@2.9.1
'@chakra-ui/system':
specifier: ^2.5.8
version: registry.npmmirror.com/@chakra-ui/system@2.5.8(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0)
@@ -307,6 +326,7 @@ packages:
resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz}
name: '@aws-crypto/crc32'
version: 3.0.0
requiresBuild: true
dependencies:
'@aws-crypto/util': registry.npmmirror.com/@aws-crypto/util@3.0.0
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
@@ -318,6 +338,7 @@ packages:
resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz}
name: '@aws-crypto/ie11-detection'
version: 3.0.0
requiresBuild: true
dependencies:
tslib: registry.npmmirror.com/tslib@1.14.1
dev: false
@@ -327,6 +348,7 @@ packages:
resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz}
name: '@aws-crypto/sha256-browser'
version: 3.0.0
requiresBuild: true
dependencies:
'@aws-crypto/ie11-detection': registry.npmmirror.com/@aws-crypto/ie11-detection@3.0.0
'@aws-crypto/sha256-js': registry.npmmirror.com/@aws-crypto/sha256-js@3.0.0
@@ -343,6 +365,7 @@ packages:
resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz}
name: '@aws-crypto/sha256-js'
version: 3.0.0
requiresBuild: true
dependencies:
'@aws-crypto/util': registry.npmmirror.com/@aws-crypto/util@3.0.0
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
@@ -354,6 +377,7 @@ packages:
resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz}
name: '@aws-crypto/supports-web-crypto'
version: 3.0.0
requiresBuild: true
dependencies:
tslib: registry.npmmirror.com/tslib@1.14.1
dev: false
@@ -363,6 +387,7 @@ packages:
resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@aws-crypto/util/-/util-3.0.0.tgz}
name: '@aws-crypto/util'
version: 3.0.0
requiresBuild: true
dependencies:
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
'@aws-sdk/util-utf8-browser': registry.npmmirror.com/@aws-sdk/util-utf8-browser@3.259.0
@@ -375,6 +400,7 @@ packages:
name: '@aws-sdk/client-cognito-identity'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-crypto/sha256-browser': registry.npmmirror.com/@aws-crypto/sha256-browser@3.0.0
'@aws-crypto/sha256-js': registry.npmmirror.com/@aws-crypto/sha256-js@3.0.0
@@ -423,6 +449,7 @@ packages:
name: '@aws-sdk/client-sso'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-crypto/sha256-browser': registry.npmmirror.com/@aws-crypto/sha256-browser@3.0.0
'@aws-crypto/sha256-js': registry.npmmirror.com/@aws-crypto/sha256-js@3.0.0
@@ -468,6 +495,7 @@ packages:
name: '@aws-sdk/client-sts'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-crypto/sha256-browser': registry.npmmirror.com/@aws-crypto/sha256-browser@3.0.0
'@aws-crypto/sha256-js': registry.npmmirror.com/@aws-crypto/sha256-js@3.0.0
@@ -517,6 +545,7 @@ packages:
name: '@aws-sdk/credential-provider-cognito-identity'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/client-cognito-identity': registry.npmmirror.com/@aws-sdk/client-cognito-identity@3.418.0
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
@@ -533,6 +562,7 @@ packages:
name: '@aws-sdk/credential-provider-env'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
'@smithy/property-provider': registry.npmmirror.com/@smithy/property-provider@2.0.10
@@ -546,6 +576,7 @@ packages:
name: '@aws-sdk/credential-provider-ini'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/credential-provider-env': registry.npmmirror.com/@aws-sdk/credential-provider-env@3.418.0
'@aws-sdk/credential-provider-process': registry.npmmirror.com/@aws-sdk/credential-provider-process@3.418.0
@@ -567,6 +598,7 @@ packages:
name: '@aws-sdk/credential-provider-node'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/credential-provider-env': registry.npmmirror.com/@aws-sdk/credential-provider-env@3.418.0
'@aws-sdk/credential-provider-ini': registry.npmmirror.com/@aws-sdk/credential-provider-ini@3.418.0
@@ -589,6 +621,7 @@ packages:
name: '@aws-sdk/credential-provider-process'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
'@smithy/property-provider': registry.npmmirror.com/@smithy/property-provider@2.0.10
@@ -603,6 +636,7 @@ packages:
name: '@aws-sdk/credential-provider-sso'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/client-sso': registry.npmmirror.com/@aws-sdk/client-sso@3.418.0
'@aws-sdk/token-providers': registry.npmmirror.com/@aws-sdk/token-providers@3.418.0
@@ -621,6 +655,7 @@ packages:
name: '@aws-sdk/credential-provider-web-identity'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
'@smithy/property-provider': registry.npmmirror.com/@smithy/property-provider@2.0.10
@@ -661,6 +696,7 @@ packages:
name: '@aws-sdk/middleware-host-header'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
'@smithy/protocol-http': registry.npmmirror.com/@smithy/protocol-http@3.0.5
@@ -674,6 +710,7 @@ packages:
name: '@aws-sdk/middleware-logger'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
@@ -686,6 +723,7 @@ packages:
name: '@aws-sdk/middleware-recursion-detection'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
'@smithy/protocol-http': registry.npmmirror.com/@smithy/protocol-http@3.0.5
@@ -699,6 +737,7 @@ packages:
name: '@aws-sdk/middleware-sdk-sts'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/middleware-signing': registry.npmmirror.com/@aws-sdk/middleware-signing@3.418.0
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
@@ -712,6 +751,7 @@ packages:
name: '@aws-sdk/middleware-signing'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
'@smithy/property-provider': registry.npmmirror.com/@smithy/property-provider@2.0.10
@@ -728,6 +768,7 @@ packages:
name: '@aws-sdk/middleware-user-agent'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
'@aws-sdk/util-endpoints': registry.npmmirror.com/@aws-sdk/util-endpoints@3.418.0
@@ -742,6 +783,7 @@ packages:
name: '@aws-sdk/region-config-resolver'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/node-config-provider': registry.npmmirror.com/@smithy/node-config-provider@2.0.12
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
@@ -756,6 +798,7 @@ packages:
name: '@aws-sdk/token-providers'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-crypto/sha256-browser': registry.npmmirror.com/@aws-crypto/sha256-browser@3.0.0
'@aws-crypto/sha256-js': registry.npmmirror.com/@aws-crypto/sha256-js@3.0.0
@@ -802,6 +845,7 @@ packages:
name: '@aws-sdk/types'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -813,6 +857,7 @@ packages:
name: '@aws-sdk/util-endpoints'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -824,6 +869,7 @@ packages:
name: '@aws-sdk/util-locate-window'
version: 3.310.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
tslib: registry.npmmirror.com/tslib@2.5.3
dev: false
@@ -833,6 +879,7 @@ packages:
resolution: {integrity: sha512-c4p4mc0VV/jIeNH0lsXzhJ1MpWRLuboGtNEpqE4s1Vl9ck2amv9VdUUZUmHbg+bVxlMgRQ4nmiovA4qIrqGuyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.418.0.tgz}
name: '@aws-sdk/util-user-agent-browser'
version: 3.418.0
requiresBuild: true
dependencies:
'@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types@3.418.0
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
@@ -846,6 +893,7 @@ packages:
name: '@aws-sdk/util-user-agent-node'
version: 3.418.0
engines: {node: '>=14.0.0'}
requiresBuild: true
peerDependencies:
aws-crt: '>=1.0.0'
peerDependenciesMeta:
@@ -863,6 +911,7 @@ packages:
resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz}
name: '@aws-sdk/util-utf8-browser'
version: 3.259.0
requiresBuild: true
dependencies:
tslib: registry.npmmirror.com/tslib@2.5.3
dev: false
@@ -2487,6 +2536,12 @@ packages:
version: 2.1.2
dev: false
registry.npmmirror.com/@chakra-ui/anatomy@2.2.1:
resolution: {integrity: sha512-bbmyWTGwQo+aHYDMtLIj7k7hcWvwE7GFVDViLFArrrPhfUTDdQTNqhiDp1N7eh2HLyjNhc2MKXV8s2KTQqkmTg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@chakra-ui/anatomy/-/anatomy-2.2.1.tgz}
name: '@chakra-ui/anatomy'
version: 2.2.1
dev: false
registry.npmmirror.com/@chakra-ui/avatar@2.2.11(@chakra-ui/system@2.5.8)(react@18.2.0):
resolution: {integrity: sha512-CJFkoWvlCTDJTUBrKA/aVyG5Zz6TBEIVmmsJtqC6VcQuVDTxkWod8ruXnjb0LT2DUveL7xR5qZM9a5IXcsH3zg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@chakra-ui/avatar/-/avatar-2.2.11.tgz}
id: registry.npmmirror.com/@chakra-ui/avatar/2.2.11
@@ -3854,6 +3909,7 @@ packages:
resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@emotion/memoize/-/memoize-0.7.4.tgz}
name: '@emotion/memoize'
version: 0.7.4
requiresBuild: true
dev: false
optional: true
@@ -4375,6 +4431,7 @@ packages:
name: '@smithy/abort-controller'
version: 2.0.9
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -4386,6 +4443,7 @@ packages:
name: '@smithy/config-resolver'
version: 2.0.10
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/node-config-provider': registry.npmmirror.com/@smithy/node-config-provider@2.0.12
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
@@ -4400,6 +4458,7 @@ packages:
name: '@smithy/credential-provider-imds'
version: 2.0.12
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/node-config-provider': registry.npmmirror.com/@smithy/node-config-provider@2.0.12
'@smithy/property-provider': registry.npmmirror.com/@smithy/property-provider@2.0.10
@@ -4413,6 +4472,7 @@ packages:
resolution: {integrity: sha512-sy0pcbKnawt1iu+qCoSFbs/h9PAaUgvlJEO3lqkE1HFFj4p5RgL98vH+9CyDoj6YY82cG5XsorFmcLqQJHTOYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@smithy/eventstream-codec/-/eventstream-codec-2.0.9.tgz}
name: '@smithy/eventstream-codec'
version: 2.0.9
requiresBuild: true
dependencies:
'@aws-crypto/crc32': registry.npmmirror.com/@aws-crypto/crc32@3.0.0
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
@@ -4425,6 +4485,7 @@ packages:
resolution: {integrity: sha512-BIeCHGfr5JCGN+EMTwZK74ELvjPXOIrI7OLM5OhZJJ6AmZyRv2S9ANJk18AtLwht0TsSm+8WoXIEp8LuxNgUyA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.5.tgz}
name: '@smithy/fetch-http-handler'
version: 2.1.5
requiresBuild: true
dependencies:
'@smithy/protocol-http': registry.npmmirror.com/@smithy/protocol-http@3.0.5
'@smithy/querystring-builder': registry.npmmirror.com/@smithy/querystring-builder@2.0.9
@@ -4439,6 +4500,7 @@ packages:
name: '@smithy/hash-node'
version: 2.0.9
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
'@smithy/util-buffer-from': registry.npmmirror.com/@smithy/util-buffer-from@2.0.0
@@ -4451,6 +4513,7 @@ packages:
resolution: {integrity: sha512-RuJqhYf8nViK96IIO9JbTtjDUuFItVfuuJhWw2yk7fv67yltQ7fZD6IQ2OsHHluoVmstnQJuCg5raXJR696Ubw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@smithy/invalid-dependency/-/invalid-dependency-2.0.9.tgz}
name: '@smithy/invalid-dependency'
version: 2.0.9
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -4462,6 +4525,7 @@ packages:
name: '@smithy/is-array-buffer'
version: 2.0.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
tslib: registry.npmmirror.com/tslib@2.5.3
dev: false
@@ -4472,6 +4536,7 @@ packages:
name: '@smithy/middleware-content-length'
version: 2.0.11
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/protocol-http': registry.npmmirror.com/@smithy/protocol-http@3.0.5
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
@@ -4484,6 +4549,7 @@ packages:
name: '@smithy/middleware-endpoint'
version: 2.0.9
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/middleware-serde': registry.npmmirror.com/@smithy/middleware-serde@2.0.9
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
@@ -4498,6 +4564,7 @@ packages:
name: '@smithy/middleware-retry'
version: 2.0.12
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/node-config-provider': registry.npmmirror.com/@smithy/node-config-provider@2.0.12
'@smithy/protocol-http': registry.npmmirror.com/@smithy/protocol-http@3.0.5
@@ -4515,6 +4582,7 @@ packages:
name: '@smithy/middleware-serde'
version: 2.0.9
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -4526,6 +4594,7 @@ packages:
name: '@smithy/middleware-stack'
version: 2.0.3
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -4537,6 +4606,7 @@ packages:
name: '@smithy/node-config-provider'
version: 2.0.12
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/property-provider': registry.npmmirror.com/@smithy/property-provider@2.0.10
'@smithy/shared-ini-file-loader': registry.npmmirror.com/@smithy/shared-ini-file-loader@2.0.11
@@ -4550,6 +4620,7 @@ packages:
name: '@smithy/node-http-handler'
version: 2.1.5
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/abort-controller': registry.npmmirror.com/@smithy/abort-controller@2.0.9
'@smithy/protocol-http': registry.npmmirror.com/@smithy/protocol-http@3.0.5
@@ -4564,6 +4635,7 @@ packages:
name: '@smithy/property-provider'
version: 2.0.10
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -4575,6 +4647,7 @@ packages:
name: '@smithy/protocol-http'
version: 3.0.5
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -4586,6 +4659,7 @@ packages:
name: '@smithy/querystring-builder'
version: 2.0.9
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
'@smithy/util-uri-escape': registry.npmmirror.com/@smithy/util-uri-escape@2.0.0
@@ -4598,6 +4672,7 @@ packages:
name: '@smithy/querystring-parser'
version: 2.0.9
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -4609,6 +4684,7 @@ packages:
name: '@smithy/service-error-classification'
version: 2.0.2
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
dev: false
@@ -4619,6 +4695,7 @@ packages:
name: '@smithy/shared-ini-file-loader'
version: 2.0.11
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -4630,6 +4707,7 @@ packages:
name: '@smithy/signature-v4'
version: 2.0.9
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/eventstream-codec': registry.npmmirror.com/@smithy/eventstream-codec@2.0.9
'@smithy/is-array-buffer': registry.npmmirror.com/@smithy/is-array-buffer@2.0.0
@@ -4647,6 +4725,7 @@ packages:
name: '@smithy/smithy-client'
version: 2.1.7
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/middleware-stack': registry.npmmirror.com/@smithy/middleware-stack@2.0.3
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
@@ -4660,6 +4739,7 @@ packages:
name: '@smithy/types'
version: 2.3.3
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
tslib: registry.npmmirror.com/tslib@2.5.3
dev: false
@@ -4669,6 +4749,7 @@ packages:
resolution: {integrity: sha512-NBnJ0NiY8z6E82Xd5VYUFQfKwK/wA/+QkKmpYUYP+cpH3aCzE6g2gvixd9vQKYjsIdRfNPCf+SFAozt8ljozOw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@smithy/url-parser/-/url-parser-2.0.9.tgz}
name: '@smithy/url-parser'
version: 2.0.9
requiresBuild: true
dependencies:
'@smithy/querystring-parser': registry.npmmirror.com/@smithy/querystring-parser@2.0.9
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
@@ -4681,6 +4762,7 @@ packages:
name: '@smithy/util-base64'
version: 2.0.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/util-buffer-from': registry.npmmirror.com/@smithy/util-buffer-from@2.0.0
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -4691,6 +4773,7 @@ packages:
resolution: {integrity: sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz}
name: '@smithy/util-body-length-browser'
version: 2.0.0
requiresBuild: true
dependencies:
tslib: registry.npmmirror.com/tslib@2.5.3
dev: false
@@ -4701,6 +4784,7 @@ packages:
name: '@smithy/util-body-length-node'
version: 2.1.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
tslib: registry.npmmirror.com/tslib@2.5.3
dev: false
@@ -4711,6 +4795,7 @@ packages:
name: '@smithy/util-buffer-from'
version: 2.0.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/is-array-buffer': registry.npmmirror.com/@smithy/is-array-buffer@2.0.0
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -4722,6 +4807,7 @@ packages:
name: '@smithy/util-config-provider'
version: 2.0.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
tslib: registry.npmmirror.com/tslib@2.5.3
dev: false
@@ -4732,6 +4818,7 @@ packages:
name: '@smithy/util-defaults-mode-browser'
version: 2.0.11
engines: {node: '>= 10.0.0'}
requiresBuild: true
dependencies:
'@smithy/property-provider': registry.npmmirror.com/@smithy/property-provider@2.0.10
'@smithy/smithy-client': registry.npmmirror.com/@smithy/smithy-client@2.1.7
@@ -4746,6 +4833,7 @@ packages:
name: '@smithy/util-defaults-mode-node'
version: 2.0.13
engines: {node: '>= 10.0.0'}
requiresBuild: true
dependencies:
'@smithy/config-resolver': registry.npmmirror.com/@smithy/config-resolver@2.0.10
'@smithy/credential-provider-imds': registry.npmmirror.com/@smithy/credential-provider-imds@2.0.12
@@ -4762,6 +4850,7 @@ packages:
name: '@smithy/util-hex-encoding'
version: 2.0.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
tslib: registry.npmmirror.com/tslib@2.5.3
dev: false
@@ -4772,6 +4861,7 @@ packages:
name: '@smithy/util-middleware'
version: 2.0.2
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -4783,6 +4873,7 @@ packages:
name: '@smithy/util-retry'
version: 2.0.2
engines: {node: '>= 14.0.0'}
requiresBuild: true
dependencies:
'@smithy/service-error-classification': registry.npmmirror.com/@smithy/service-error-classification@2.0.2
'@smithy/types': registry.npmmirror.com/@smithy/types@2.3.3
@@ -4795,6 +4886,7 @@ packages:
name: '@smithy/util-stream'
version: 2.0.12
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/fetch-http-handler': registry.npmmirror.com/@smithy/fetch-http-handler@2.1.5
'@smithy/node-http-handler': registry.npmmirror.com/@smithy/node-http-handler@2.1.5
@@ -4812,6 +4904,7 @@ packages:
name: '@smithy/util-uri-escape'
version: 2.0.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
tslib: registry.npmmirror.com/tslib@2.5.3
dev: false
@@ -4822,6 +4915,7 @@ packages:
name: '@smithy/util-utf8'
version: 2.0.0
engines: {node: '>=14.0.0'}
requiresBuild: true
dependencies:
'@smithy/util-buffer-from': registry.npmmirror.com/@smithy/util-buffer-from@2.0.0
tslib: registry.npmmirror.com/tslib@2.5.3
@@ -5493,6 +5587,15 @@ packages:
'@types/express': registry.npmmirror.com/@types/express@4.17.17
dev: true
registry.npmmirror.com/@types/node-fetch@2.6.6:
resolution: {integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node-fetch/-/node-fetch-2.6.6.tgz}
name: '@types/node-fetch'
version: 2.6.6
dependencies:
'@types/node': registry.npmmirror.com/@types/node@18.14.0
form-data: registry.npmmirror.com/form-data@4.0.0
dev: false
registry.npmmirror.com/@types/node@18.14.0:
resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-18.14.0.tgz}
name: '@types/node'
@@ -5734,6 +5837,15 @@ packages:
version: 2.0.6
dev: false
registry.npmmirror.com/abort-controller@3.0.0:
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/abort-controller/-/abort-controller-3.0.0.tgz}
name: abort-controller
version: 3.0.0
engines: {node: '>=6.5'}
dependencies:
event-target-shim: registry.npmmirror.com/event-target-shim@5.0.1
dev: false
registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.10.0):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz}
id: registry.npmmirror.com/acorn-jsx/5.3.2
@@ -5764,6 +5876,15 @@ packages:
- supports-color
dev: false
registry.npmmirror.com/agentkeepalive@4.5.0:
resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz}
name: agentkeepalive
version: 4.5.0
engines: {node: '>= 8.0.0'}
dependencies:
humanize-ms: registry.npmmirror.com/humanize-ms@1.2.1
dev: false
registry.npmmirror.com/aggregate-error@3.1.0:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz}
name: aggregate-error
@@ -6024,16 +6145,6 @@ packages:
engines: {node: '>=4'}
dev: true
registry.npmmirror.com/axios@0.26.1:
resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz}
name: axios
version: 0.26.1
dependencies:
follow-redirects: registry.npmmirror.com/follow-redirects@1.15.3
transitivePeerDependencies:
- debug
dev: false
registry.npmmirror.com/axios@1.3.3:
resolution: {integrity: sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/axios/-/axios-1.3.3.tgz}
name: axios
@@ -6122,6 +6233,12 @@ packages:
version: 1.0.2
dev: true
registry.npmmirror.com/base-64@0.1.0:
resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/base-64/-/base-64-0.1.0.tgz}
name: base-64
version: 0.1.0
dev: false
registry.npmmirror.com/base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz}
name: base64-js
@@ -6159,6 +6276,7 @@ packages:
resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bowser/-/bowser-2.11.0.tgz}
name: bowser
version: 2.11.0
requiresBuild: true
dev: false
optional: true
@@ -6326,6 +6444,12 @@ packages:
version: 1.1.4
dev: false
registry.npmmirror.com/charenc@0.0.2:
resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz}
name: charenc
version: 0.0.2
dev: false
registry.npmmirror.com/chokidar@3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz}
name: chokidar
@@ -6614,6 +6738,12 @@ packages:
which: registry.npmmirror.com/which@2.0.2
dev: true
registry.npmmirror.com/crypt@0.0.2:
resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz}
name: crypt
version: 0.0.2
dev: false
registry.npmmirror.com/crypto@1.0.1:
resolution: {integrity: sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/crypto/-/crypto-1.0.1.tgz}
name: crypto
@@ -7192,6 +7322,15 @@ packages:
engines: {node: '>=0.3.1'}
dev: false
registry.npmmirror.com/digest-fetch@1.3.0:
resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/digest-fetch/-/digest-fetch-1.3.0.tgz}
name: digest-fetch
version: 1.3.0
dependencies:
base-64: registry.npmmirror.com/base-64@0.1.0
md5: registry.npmmirror.com/md5@2.3.0
dev: false
registry.npmmirror.com/dingbat-to-unicode@1.0.1:
resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz}
name: dingbat-to-unicode
@@ -7354,6 +7493,14 @@ packages:
version: 2.0.0
dev: false
registry.npmmirror.com/encoding@0.1.13:
resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz}
name: encoding
version: 0.1.13
dependencies:
iconv-lite: registry.npmmirror.com/iconv-lite@0.6.3
dev: false
registry.npmmirror.com/enhanced-resolve@5.15.0:
resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz}
name: enhanced-resolve
@@ -7841,6 +7988,13 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
registry.npmmirror.com/event-target-shim@5.0.1:
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/event-target-shim/-/event-target-shim-5.0.1.tgz}
name: event-target-shim
version: 5.0.1
engines: {node: '>=6'}
dev: false
registry.npmmirror.com/execa@7.1.1:
resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/execa/-/execa-7.1.1.tgz}
name: execa
@@ -7900,6 +8054,7 @@ packages:
name: fast-xml-parser
version: 4.2.5
hasBin: true
requiresBuild: true
dependencies:
strnum: registry.npmmirror.com/strnum@1.0.5
dev: false
@@ -8012,6 +8167,12 @@ packages:
is-callable: registry.npmmirror.com/is-callable@1.2.7
dev: true
registry.npmmirror.com/form-data-encoder@1.7.2:
resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz}
name: form-data-encoder
version: 1.7.2
dev: false
registry.npmmirror.com/form-data@4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz}
name: form-data
@@ -8030,6 +8191,16 @@ packages:
engines: {node: '>=0.4.x'}
dev: false
registry.npmmirror.com/formdata-node@4.4.1:
resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/formdata-node/-/formdata-node-4.4.1.tgz}
name: formdata-node
version: 4.4.1
engines: {node: '>= 12.20'}
dependencies:
node-domexception: registry.npmmirror.com/node-domexception@1.0.0
web-streams-polyfill: registry.npmmirror.com/web-streams-polyfill@4.0.0-beta.3
dev: false
registry.npmmirror.com/formidable@2.1.1:
resolution: {integrity: sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/formidable/-/formidable-2.1.1.tgz}
name: formidable
@@ -8472,6 +8643,14 @@ packages:
engines: {node: '>=14.18.0'}
dev: true
registry.npmmirror.com/humanize-ms@1.2.1:
resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz}
name: humanize-ms
version: 1.2.1
dependencies:
ms: registry.npmmirror.com/ms@2.1.3
dev: false
registry.npmmirror.com/husky@8.0.3:
resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/husky/-/husky-8.0.3.tgz}
name: husky
@@ -8692,6 +8871,12 @@ packages:
has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0
dev: true
registry.npmmirror.com/is-buffer@1.1.6:
resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz}
name: is-buffer
version: 1.1.6
dev: false
registry.npmmirror.com/is-buffer@2.0.5:
resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz}
name: is-buffer
@@ -9423,6 +9608,16 @@ packages:
version: 3.0.3
dev: false
registry.npmmirror.com/md5@2.3.0:
resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz}
name: md5
version: 2.3.0
dependencies:
charenc: registry.npmmirror.com/charenc@0.0.2
crypt: registry.npmmirror.com/crypt@0.0.2
is-buffer: registry.npmmirror.com/is-buffer@1.1.6
dev: false
registry.npmmirror.com/mdast-util-definitions@5.1.2:
resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz}
name: mdast-util-definitions
@@ -9616,6 +9811,7 @@ packages:
resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/memory-pager/-/memory-pager-1.5.0.tgz}
name: memory-pager
version: 1.5.0
requiresBuild: true
dev: false
optional: true
@@ -10287,6 +10483,29 @@ packages:
next: registry.npmmirror.com/next@13.5.2(@babel/core@7.22.20)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3)
dev: false
registry.npmmirror.com/node-domexception@1.0.0:
resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz}
name: node-domexception
version: 1.0.0
engines: {node: '>=10.5.0'}
dev: false
registry.npmmirror.com/node-fetch@2.7.0(encoding@0.1.13):
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz}
id: registry.npmmirror.com/node-fetch/2.7.0
name: node-fetch
version: 2.7.0
engines: {node: 4.x || >=6.0.0}
peerDependencies:
encoding: ^0.1.0
peerDependenciesMeta:
encoding:
optional: true
dependencies:
encoding: registry.npmmirror.com/encoding@0.1.13
whatwg-url: registry.npmmirror.com/whatwg-url@5.0.0
dev: false
registry.npmmirror.com/node-releases@2.0.13:
resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz}
name: node-releases
@@ -10449,15 +10668,23 @@ packages:
mimic-fn: registry.npmmirror.com/mimic-fn@4.0.0
dev: true
registry.npmmirror.com/openai@3.3.0:
resolution: {integrity: sha512-uqxI/Au+aPRnsaQRe8CojU0eCR7I0mBiKjD3sNMzY6DaC1ZVrc85u98mtJW6voDug8fgGN+DIZmTDxTthxb7dQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/openai/-/openai-3.3.0.tgz}
registry.npmmirror.com/openai@4.11.1(encoding@0.1.13):
resolution: {integrity: sha512-GU0HQWbejXuVAQlDjxIE8pohqnjptFDIm32aPlNT1H9ucMz1VJJD0DaTJRQsagNaJ97awWjjVLEG7zCM6sm4SA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/openai/-/openai-4.11.1.tgz}
id: registry.npmmirror.com/openai/4.11.1
name: openai
version: 3.3.0
version: 4.11.1
hasBin: true
dependencies:
axios: registry.npmmirror.com/axios@0.26.1
form-data: registry.npmmirror.com/form-data@4.0.0
'@types/node': registry.npmmirror.com/@types/node@18.14.0
'@types/node-fetch': registry.npmmirror.com/@types/node-fetch@2.6.6
abort-controller: registry.npmmirror.com/abort-controller@3.0.0
agentkeepalive: registry.npmmirror.com/agentkeepalive@4.5.0
digest-fetch: registry.npmmirror.com/digest-fetch@1.3.0
form-data-encoder: registry.npmmirror.com/form-data-encoder@1.7.2
formdata-node: registry.npmmirror.com/formdata-node@4.4.1
node-fetch: registry.npmmirror.com/node-fetch@2.7.0(encoding@0.1.13)
transitivePeerDependencies:
- debug
- encoding
dev: false
registry.npmmirror.com/option@0.2.4:
@@ -10770,11 +10997,11 @@ packages:
engines: {node: '>= 0.8.0'}
dev: true
registry.npmmirror.com/prettier@2.8.7:
resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prettier/-/prettier-2.8.7.tgz}
registry.npmmirror.com/prettier@3.0.3:
resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/prettier/-/prettier-3.0.3.tgz}
name: prettier
version: 2.8.7
engines: {node: '>=10.13.0'}
version: 3.0.3
engines: {node: '>=14'}
hasBin: true
dev: true
@@ -11726,6 +11953,7 @@ packages:
resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz}
name: sparse-bitfield
version: 3.0.3
requiresBuild: true
dependencies:
memory-pager: registry.npmmirror.com/memory-pager@1.5.0
dev: false
@@ -11898,6 +12126,7 @@ packages:
resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strnum/-/strnum-1.0.5.tgz}
name: strnum
version: 1.0.5
requiresBuild: true
dev: false
optional: true
@@ -12061,6 +12290,12 @@ packages:
url-parse: registry.npmmirror.com/url-parse@1.5.10
dev: false
registry.npmmirror.com/tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz}
name: tr46
version: 0.0.3
dev: false
registry.npmmirror.com/tr46@3.0.0:
resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz}
name: tr46
@@ -12476,6 +12711,7 @@ packages:
name: uuid
version: 8.3.2
hasBin: true
requiresBuild: true
dev: false
optional: true
@@ -12565,12 +12801,25 @@ packages:
version: 2.0.1
dev: false
registry.npmmirror.com/web-streams-polyfill@4.0.0-beta.3:
resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz}
name: web-streams-polyfill
version: 4.0.0-beta.3
engines: {node: '>= 14'}
dev: false
registry.npmmirror.com/web-worker@1.2.0:
resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz}
name: web-worker
version: 1.2.0
dev: false
registry.npmmirror.com/webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz}
name: webidl-conversions
version: 3.0.1
dev: false
registry.npmmirror.com/webidl-conversions@7.0.0:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz}
name: webidl-conversions
@@ -12614,6 +12863,15 @@ packages:
webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0
dev: false
registry.npmmirror.com/whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz}
name: whatwg-url
version: 5.0.0
dependencies:
tr46: registry.npmmirror.com/tr46@0.0.3
webidl-conversions: registry.npmmirror.com/webidl-conversions@3.0.1
dev: false
registry.npmmirror.com/which-boxed-primitive@1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz}
name: which-boxed-primitive

View File

@@ -15,8 +15,9 @@ OPENAI_BASE_URL=https://api.openai.com/v1
# 通用key。可以是 openai 的也可以是 oneapi 的。
# 此处逻辑:优先走 ONEAPI_URL如果填写了 ONEAPI_URLkey 也需要是 ONEAPI 的 key
CHAT_API_KEY=sk-xxxx
# db
# mongo 数据库连接参数
MONGODB_URI=mongodb://username:password@0.0.0.0:27017/fastgpt?authSource=admin
# PG 数据库连接参数
PG_URL=postgresql://username:password@host:port/postgres
# 首页路径
HOME_URL=/

View File

@@ -1,16 +1,4 @@
{
"FeConfig": {
"show_emptyChat": true,
"show_contact": true,
"show_git": true,
"show_doc": true,
"systemTitle": "FastGPT",
"authorText": "Made by FastGPT Team.",
"limit": {
"exportLimitMinutes": 0
},
"scripts": []
},
"SystemParams": {
"vectorMaxProcess": 15,
"qaMaxProcess": 15,

View File

@@ -1,6 +1,6 @@
{
"name": "app",
"version": "4.4.5",
"version": "4.4.7",
"private": false,
"scripts": {
"dev": "next dev",
@@ -9,8 +9,10 @@
"lint": "next lint"
},
"dependencies": {
"@chakra-ui/anatomy": "^2.2.1",
"@chakra-ui/icons": "^2.0.17",
"@chakra-ui/react": "^2.7.0",
"@chakra-ui/styled-system": "^2.9.1",
"@chakra-ui/system": "^2.5.8",
"@emotion/react": "^11.10.6",
"@emotion/styled": "^11.10.6",
@@ -92,6 +94,7 @@
"typescript": "4.9.5"
},
"engines": {
"node": ">=18.0.0"
"node": ">=18.0.0",
"pnpm": ">=8.6.0"
}
}

View File

@@ -9,6 +9,6 @@
- [计费规则](https://doc.fastgpt.run/docs/pricing/)
**其他问题**
| 交流群 | 小助手 |
| ----------------------- | -------------------- |
| ![](https://otnvvf-imgs.oss.laf.run/wxqun300.jpg) | ![](https://otnvvf-imgs.oss.laf.run/wx300.jpg) |
| 添加小助手进入交流群 |
| ----------------------- |
| ![](https://otnvvf-imgs.oss.laf.run/wx300.jpg) |

View File

@@ -1,10 +1,6 @@
### Fast GPT V4.4.5
### Fast GPT V4.4.7
1. 新增 - 下一步指引选项,可以通过模型生成 3 个预测问题
2. 新增 - 分享链接 hook 身份校验。
3. 新增 - Api Key 使用。增加别名、额度限制和过期时间。自带 appId无需额外连接。
4. 去除 - 限定词。目前旧应用仍生效9/25 后全面去除,请及时替换。
5. 新增 - 引用模板/引用提示词设置,可以 DIY 引用内容的格式,从而更好的适配场景。[参考文档](https://doc.fastgpt.run/docs/use-cases/prompt/)
6. [使用文档](https://doc.fastgpt.run/docs/intro/)
7. [点击查看高级编排介绍文档](https://doc.fastgpt.run/docs/workflow)
8. [点击查看商业版](https://doc.fastgpt.run/docs/commercial/)
1. 优化数据集管理,区分手动录入和标注,可追数据至某个文件,保留链接读取的原始链接
2. [使用文档](https://doc.fastgpt.run/docs/intro/)
3. [点击查看高级编排介绍文档](https://doc.fastgpt.run/docs/workflow)
4. [点击查看商业版](https://doc.fastgpt.run/docs/commercial/)

View File

@@ -0,0 +1,187 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="140px" height="140px" viewBox="0 0 140 140" enable-background="new 0 0 140 140" xml:space="preserve"> <image id="image0" width="140" height="140" x="0" y="0"
href="data:image/png;base64,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" />
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1696841646763" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2367" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M185.78023917 244.70891583a668.28725918 668.28725918 0 0 0 121.17266584 53.53692476 665.15318203 665.15318203 0 0 0-34.64702231 183.62637022H91.72167743a419.67636227 419.67636227 0 0 1 94.05856174-237.16329498z m227.58241722-142.44192964a672.20323745 672.20323745 0 0 0-84.326223 139.79071526 609.56829772 609.56829772 0 0 1-99.6923923-42.47897884 420.36764571 420.36764571 0 0 1 184.0186153-97.31173642z m381.2622336 97.31044188a607.36887719 607.36887719 0 0 1-99.69109776 42.48027338 672.20323745 672.20323745 0 0 0-84.326223-139.79071526c69.74454391 16.75132524 132.56071902 50.73424941 184.0186153 97.31044188z m43.56509646 45.13148776a419.67636227 419.67636227 0 0 1 94.08704158 237.16329498h-180.52336198a664.06835895 664.06835895 0 0 0-34.70657106-183.62637022 668.28725918 668.28725918 0 0 0 121.17266584-53.53692476z m0 534.58216834a668.28725918 668.28725918 0 0 0-121.17266583-53.53692476 663.64763402 663.64763402 0 0 0 34.70657106-183.62637022h180.52336197a419.58574459 419.58574459 0 0 1-94.0572672 237.16329498zM694.93379223 781.91122963c34.70657106 11.23788674 68.02798617 25.5179384 99.72216668 42.48027339a420.21747927 420.21747927 0 0 1-184.04838968 97.31044187A671.42004179 671.42004179 0 0 0 694.96356661 781.91122963z m-213.06158142-28.07853511v155.75884484a607.60966131 607.60966131 0 0 1-93.63524773-143.31574298 605.26136889 605.26136889 0 0 1 93.63524773-12.44310186z m0-211.70490533v151.54123916a662.9537615 662.9537615 0 0 0-116.59258944 15.96683503 600.07803765 600.07803765 0 0 1-32.74922919-167.50807419h149.34181863z m-93.63524773-284.43335995a608.06145517 608.06145517 0 0 1 93.63524773-143.31574298v155.75884484a594.47398147 594.47398147 0 0 1-93.63524773-12.44310186z m93.63524773 72.60676804v151.57101353h-149.31204425c3.0136851-58.44710843 14.19072853-114.63395303 32.68968043-167.50807419 37.748736 8.6759955 76.70398167 14.10011085 116.62236382 15.96683503z m60.25557838-60.16366618v-155.75884484a607.00770101 607.00770101 0 0 1 93.60547335 143.31574298c-30.42812208 6.50764389-61.67180325 10.78609289-93.60547335 12.44310186z m0 211.73467971V330.33097165a660.18215506 660.18215506 0 0 0 116.59258944-15.99660942 601.1926351 601.1926351 0 0 1 32.71816027 167.5080742h-149.31204423z m93.60547335 284.40358557a606.55590717 606.55590717 0 0 1-93.60547335 143.34551736v-155.75884484c31.93496462 1.6880779 63.17735127 5.93545797 93.60547335 12.41332748z m-93.60547335-72.60676803V542.12778919h149.31204425a601.1926351 601.1926351 0 0 1-32.71945481 167.50807419 662.98483042 662.98483042 0 0 0-116.59258944-15.96683503zM229.34404109 824.42127739a606.97792663 606.97792663 0 0 1 99.72216668-42.51004776 670.24460105 670.24460105 0 0 0 84.35729193 139.7920098 420.30809695 420.30809695 0 0 1-184.07945861-97.31173641z m-43.56380192-45.13019322a419.58574459 419.58574459 0 0 1-94.05856174-237.16329498H272.27740286c3.01239056 63.9903213 14.88330651 125.60128126 34.67679669 183.62637022a668.28725918 668.28725918 0 0 0-121.17266584 53.53692476z m703.53624178 32.17574874A479.71963638 479.71963638 0 0 0 994.03944897 512c0-135.30255107-55.91758064-257.37880462-145.66662447-344.95949685A480.23097901 480.23097901 0 0 0 512 29.96184557a480.23097901 480.23097901 0 0 0-336.3728245 137.07865758c-14.61145347 14.28134622-28.22999609 29.49475998-40.9721363 45.49266394A479.6290187 479.6290187 0 0 0 29.9592565 512c0 266.2062611 215.80341349 482.03944897 482.03944896 482.03944897a480.23097901 480.23097901 0 0 0 336.34305011-137.11102104h0.02977438a484.14825182 484.14825182 0 0 0 40.9721363-45.4913694z" fill="#21A3DD" p-id="2368"></path></svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1696841469699" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11288" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M254.976 100.8h514.048a154.176 154.176 0 0 1 154.176 154.176v514.048a154.176 154.176 0 0 1-154.176 154.176h-514.048a154.176 154.176 0 0 1-154.176-154.176v-514.048a154.176 154.176 0 0 1 154.176-154.176z" fill="#1693F6" opacity=".3" p-id="11289"></path><path d="M192 128a64 64 0 0 0-64 64v640a64 64 0 0 0 64 64h640a64 64 0 0 0 64-64v-640a64 64 0 0 0-64-64h-640m0-128h640a192 192 0 0 1 192 192v640a192 192 0 0 1-192 192h-640a192 192 0 0 1-192-192v-640a192 192 0 0 1 192-192z" fill="#1693F6" p-id="11290"></path><path d="M320 832m-64 0l0 0q-64 0-64-64l0-512q0-64 64-64l0 0q64 0 64 64l0 512q0 64-64 64Z" fill="#1693F6" p-id="11291"></path></svg>

After

Width:  |  Height:  |  Size: 974 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1696841493938" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="16677" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M102.4 332.8L170.666667 264.533333l42.666666 42.666667-68.266666 68.266667 42.666666 42.666666L256 345.6l42.666667 42.666667-68.266667 68.266666 12.8 34.133334L469.333333 268.8 315.733333 102.4c-25.6-21.333333-72.533333-17.066667-93.866666 8.533333L76.8 247.466667c-21.333333 21.333333-12.8 51.2 8.533333 72.533333l17.066667 12.8zM85.333333 896c-4.266667 17.066667 8.533333 29.866667 25.6 25.6l260.266667-81.066667L170.666667 644.266667 85.333333 896zM934.4 302.933333c21.333333-21.333333 21.333333-51.2 0-72.533333L810.666667 110.933333c-21.333333-21.333333-55.466667-21.333333-76.8 0l-89.6 85.333334 200.533333 192 89.6-85.333334zM614.4 226.133333l-413.866667 392.533334L401.066667 810.666667l413.866666-396.8zM947.2 699.733333l-187.733333-174.933333-230.4 217.6 42.666666 42.666667 72.533334-68.266667 42.666666 42.666667-72.533333 68.266666 42.666667 42.666667 72.533333-68.266667 42.666667 42.666667-72.533334 68.266667 12.8 12.8c21.333333 21.333333 55.466667 29.866667 81.066667 8.533333l145.066667-136.533333c21.333333-29.866667 29.866667-76.8 8.533333-98.133334z" p-id="16678" fill="#d4237a"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -96,6 +96,7 @@
"module question": "Question",
"module quoteList": "Quotes",
"module runningTime": "Time",
"module search response": "Search Result",
"module similarity": "Similarity",
"module temperature": "Temperature",
"module time": "Running Time",
@@ -105,6 +106,7 @@
},
"common": {
"Add": "Add",
"Close": "Clow",
"Collect": "Collect",
"Copy": "Copy",
"Copy Successful": "Copy Successful",
@@ -125,8 +127,11 @@
"Output": "Output",
"Password inconsistency": "Password inconsistency",
"Rename": "Rename",
"Rename Failed": "Rename Failed",
"Rename Success": "Rename Success",
"Search": "Search",
"Status": "Status",
"Unknow": "Unknow",
"Update Successful": "Update Successful",
"export": ""
},
@@ -212,10 +217,14 @@
"Filename": "Filename",
"Files": "{{total}} Files",
"Folder Name": "Input folder name",
"Insert Data": "Insert",
"Manual Data": "Manual Data",
"Manual Input": "Manual Input",
"Manual Mark": "Manual Mark",
"Mark Data": "Mark Data",
"Move Failed": "Move Failed",
"My Dataset": "My Dataset",
"No Folder": "No Folder",
"Other Data": "Other Data",
"Select Dataset": "Select Dataset",
"Select Folder": "Enter folder",
"Upload Time": "Upload Time",

View File

@@ -96,6 +96,7 @@
"module question": "问题",
"module quoteList": "引用内容",
"module runningTime": "运行时长",
"module search response": "搜索结果",
"module similarity": "相似度",
"module temperature": "温度",
"module time": "运行时长",
@@ -105,6 +106,7 @@
},
"common": {
"Add": "添加",
"Close": "关闭",
"Collect": "收藏",
"Copy": "复制",
"Copy Successful": "复制成功",
@@ -125,8 +127,11 @@
"Output": "输出",
"Password inconsistency": "两次密码不一致",
"Rename": "重命名",
"Rename Failed": "重命名失败",
"Rename Success": "重命名成功",
"Search": "搜索",
"Status": "状态",
"Unknow": "未知",
"Update Successful": "更新成功",
"export": ""
},
@@ -212,10 +217,14 @@
"Filename": "文件名",
"Files": "文件: {{total}}个",
"Folder Name": "输入文件夹名称",
"Insert Data": "插入",
"Manual Data": "手动录入",
"Manual Input": "手动录入",
"Manual Mark": "手动标注",
"Mark Data": "标注数据",
"Move Failed": "移动出现错误~",
"My Dataset": "我的知识库",
"No Folder": "没有子目录了~",
"Other Data": "其他数据",
"Select Dataset": "选择该知识库",
"Select Folder": "进入文件夹",
"Upload Time": "上传时间",
@@ -236,7 +245,7 @@
"key tips": "你可以使用 API 秘钥访问一些特定的接口"
},
"outlink": {
"Copy Iframe": "复制嵌入",
"Copy Iframe": "嵌入网页",
"Copy Link": "复制",
"Create API Key": "创建新 Key",
"Create Link": "创建链接",

View File

@@ -2,9 +2,9 @@ import { GET, POST, DELETE, PUT } from './request';
import type { AppSchema } from '@/types/mongoSchema';
import type { AppListItemType, AppUpdateParams } from '@/types/app';
import { RequestPaging } from '../types/index';
import type { Props as CreateAppProps } from '@/pages/api/app/create';
import { addDays } from 'date-fns';
import { GetAppChatLogsParams } from './request/app';
import type { CreateAppParams } from '@/types/app';
/**
* 获取模型列表
@@ -14,7 +14,7 @@ export const getMyModels = () => GET<AppListItemType[]>('/app/myApps');
/**
* 创建一个模型
*/
export const postCreateApp = (data: CreateAppProps) => POST<string>('/app/create', data);
export const postCreateApp = (data: CreateAppParams) => POST<string>('/app/create', data);
/**
* 根据 ID 删除模型

View File

@@ -1,5 +1,6 @@
import { ChatCompletionRequestMessage } from '@fastgpt/core/aiApi/type';
import { ChatCompletionRequestMessage } from '@fastgpt/core/ai/type';
export type CreateQuestionGuideProps = {
messages: ChatCompletionRequestMessage[];
shareId?: string;
};

View File

@@ -12,7 +12,7 @@ interface StreamFetchProps {
abortSignal: AbortController;
}
export const streamFetch = ({
url = '/api/openapi/v1/chat/completions',
url = '/api/v1/chat/completions',
data,
onMessage,
abortSignal

View File

@@ -1,5 +1,5 @@
import React, { useCallback, useMemo, useState } from 'react';
import { ModalBody, Box, useTheme } from '@chakra-ui/react';
import { ModalBody, Box, useTheme, Flex, Progress } from '@chakra-ui/react';
import { getDatasetDataItemById } from '@/api/core/dataset/data';
import { useLoading } from '@/hooks/useLoading';
import { useToast } from '@/hooks/useToast';
@@ -8,22 +8,19 @@ import { QuoteItemType } from '@/types/chat';
import MyIcon from '@/components/Icon';
import InputDataModal, { RawFileText } from '@/pages/kb/detail/components/InputDataModal';
import MyModal from '../MyModal';
import type { PgDataItemType } from '@/types/core/dataset/data';
import { useTranslation } from 'react-i18next';
import { useRouter } from 'next/router';
type SearchType = PgDataItemType & {
kb_id?: string;
};
const QuoteModal = ({
onUpdateQuote,
rawSearch = [],
onClose
}: {
onUpdateQuote: (quoteId: string, sourceText?: string) => Promise<void>;
rawSearch: SearchType[];
rawSearch: QuoteItemType[];
onClose: () => void;
}) => {
const { t } = useTranslation();
const theme = useTheme();
const router = useRouter();
const { toast } = useToast();
@@ -36,7 +33,7 @@ const QuoteModal = ({
* click edit, get new kbDataItem
*/
const onclickEdit = useCallback(
async (item: SearchType) => {
async (item: QuoteItemType) => {
if (!item.id) return;
try {
setIsLoading(true);
@@ -95,9 +92,30 @@ const QuoteModal = ({
_hover={{ '& .edit': { display: 'flex' } }}
overflow={'hidden'}
>
{item.source && !isShare && (
<RawFileText filename={item.source} fileId={item.file_id} />
{!isShare && (
<Flex alignItems={'center'} mb={1}>
<RawFileText
filename={item.source || t('common.Unknow') || 'Unknow'}
fileId={item.file_id}
/>
<Box flex={'1'} />
{item.score && (
<>
<Progress
mx={2}
w={['60px', '100px']}
value={item.score * 100}
size="sm"
borderRadius={'20px'}
colorScheme="gray"
border={theme.borders.base}
/>
<Box>{item.score.toFixed(4)}</Box>
</>
)}
</Flex>
)}
<Box>{item.q}</Box>
<Box>{item.a}</Box>
{item.id && !isShare && (

View File

@@ -12,15 +12,7 @@ const QuoteModal = dynamic(() => import('./QuoteModal'), { ssr: false });
const ContextModal = dynamic(() => import('./ContextModal'), { ssr: false });
const WholeResponseModal = dynamic(() => import('./WholeResponseModal'), { ssr: false });
const ResponseTags = ({
chatId,
contentId,
responseData = []
}: {
chatId?: string;
contentId?: string;
responseData?: ChatHistoryItemResType[];
}) => {
const ResponseTags = ({ responseData = [] }: { responseData?: ChatHistoryItemResType[] }) => {
const { isPc } = useGlobalStore();
const { t } = useTranslation();
const [quoteModalData, setQuoteModalData] = useState<QuoteItemType[]>();
@@ -41,9 +33,13 @@ const ResponseTags = ({
return {
chatAccount: responseData.filter((item) => item.moduleType === FlowModuleTypeEnum.chatNode)
.length,
quoteList: chatData?.quoteList,
quoteList: responseData
.filter((item) => item.moduleType === FlowModuleTypeEnum.chatNode)
.map((item) => item.quoteList)
.flat()
.filter((item) => item) as QuoteItemType[],
historyPreview: chatData?.historyPreview,
runningTime: responseData.reduce((sum, item) => sum + (item.runningTime || 0), 0).toFixed(2)
runningTime: +responseData.reduce((sum, item) => sum + (item.runningTime || 0), 0).toFixed(2)
};
}, [responseData]);
@@ -56,20 +52,20 @@ const ResponseTags = ({
return responseData.length === 0 ? null : (
<Flex alignItems={'center'} mt={2} flexWrap={'wrap'}>
{quoteList.length > 0 && (
<MyTooltip label="查看引用">
<Tag
colorSchema="blue"
cursor={'pointer'}
{...TagStyles}
onClick={() => setQuoteModalData(quoteList)}
>
{quoteList.length}
</Tag>
</MyTooltip>
)}
{chatAccount === 1 && (
<>
{quoteList.length > 0 && (
<MyTooltip label="查看引用">
<Tag
colorSchema="blue"
cursor={'pointer'}
{...TagStyles}
onClick={() => setQuoteModalData(quoteList)}
>
{quoteList.length}
</Tag>
</MyTooltip>
)}
{historyPreview.length > 0 && (
<MyTooltip label={'点击查看完整对话记录'}>
<Tag
@@ -120,4 +116,4 @@ const ResponseTags = ({
);
};
export default ResponseTags;
export default React.memo(ResponseTags);

View File

@@ -31,7 +31,7 @@ const SelectDataset = ({
setParentId={setParentId}
tips={t('chat.Select Mark Kb Desc')}
>
<ModalBody flex={['1 0 0', '0 0 auto']} maxH={'80vh'} overflowY={'auto'}>
<ModalBody flex={'1 0 0'} overflowY={'auto'}>
<Grid
gridTemplateColumns={['repeat(1,1fr)', 'repeat(2,1fr)', 'repeat(3,1fr)']}
gridGap={3}

View File

@@ -16,18 +16,28 @@ import {
ExportChatType
} from '@/types/chat';
import { useToast } from '@/hooks/useToast';
import { voiceBroadcast, cancelBroadcast, hasVoiceApi } from '@/utils/web/voice';
import { useAudioPlay } from '@/utils/web/voice';
import { getErrText } from '@/utils/tools';
import { useCopyData } from '@/hooks/useCopyData';
import { Box, Card, Flex, Input, Textarea, Button, useTheme, BoxProps } from '@chakra-ui/react';
import {
Box,
Card,
Flex,
Input,
Textarea,
Button,
useTheme,
BoxProps,
FlexProps
} from '@chakra-ui/react';
import { feConfigs } from '@/store/static';
import { event } from '@/utils/plugin/eventbus';
import { adaptChat2GptMessages } from '@/utils/common/adapt/message';
import { useMarkdown } from '@/hooks/useMarkdown';
import { AppModuleItemType, VariableItemType } from '@/types/app';
import { AppModuleItemType } from '@/types/app';
import { VariableInputEnum } from '@/constants/app';
import { useForm } from 'react-hook-form';
import { MessageItemType } from '@/pages/api/openapi/v1/chat/completions';
import type { MessageItemType } from '@/types/core/chat/type';
import { fileDownload } from '@/utils/web/file';
import { htmlTemplate } from '@/constants/common';
import { useRouter } from 'next/router';
@@ -53,11 +63,14 @@ import styles from './index.module.scss';
import Script from 'next/script';
import { postQuestionGuide } from '@/api/core/ai/agent/api';
import { splitGuideModule } from './utils';
import { DatasetSpecialIdEnum } from '@fastgpt/core/dataset/constant';
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 24);
const textareaMinH = '22px';
type generatingMessageProps = { text?: string; name?: string; status?: 'running' | 'finish' };
export type StartChatFnProps = {
chatList: ChatSiteItemType[];
messages: MessageItemType[];
@@ -69,7 +82,7 @@ export type StartChatFnProps = {
export type ComponentRef = {
getChatHistory: () => ChatSiteItemType[];
resetVariables: (data?: Record<string, any>) => void;
resetHistory: (chatId: ChatSiteItemType[]) => void;
resetHistory: (history: ChatSiteItemType[]) => void;
scrollToBottom: (behavior?: 'smooth' | 'auto') => void;
};
@@ -79,55 +92,22 @@ enum FeedbackTypeEnum {
hidden = 'hidden'
}
const VariableLabel = ({
required = false,
children
}: {
required?: boolean;
children: React.ReactNode | string;
}) => (
<Box as={'label'} display={'inline-block'} position={'relative'} mb={1}>
{children}
{required && (
<Box position={'absolute'} top={'-2px'} right={'-10px'} color={'red.500'} fontWeight={'bold'}>
*
</Box>
)}
</Box>
);
const Empty = () => {
const { data: chatProblem } = useMarkdown({ url: '/chatProblem.md' });
const { data: versionIntro } = useMarkdown({ url: '/versionIntro.md' });
return (
<Box pt={6} w={'85%'} maxW={'600px'} m={'auto'} alignItems={'center'} justifyContent={'center'}>
{/* version intro */}
<Card p={4} mb={10} minH={'200px'}>
<Markdown source={versionIntro} />
</Card>
<Card p={4} minH={'600px'}>
<Markdown source={chatProblem} />
</Card>
</Box>
);
};
const ChatAvatar = ({ src, type }: { src?: string; type: 'Human' | 'AI' }) => {
const theme = useTheme();
return (
<Box
w={['28px', '34px']}
h={['28px', '34px']}
p={'2px'}
borderRadius={'lg'}
border={theme.borders.base}
boxShadow={'0 0 5px rgba(0,0,0,0.1)'}
bg={type === 'Human' ? 'white' : 'myBlue.100'}
>
<Avatar src={src} w={'100%'} h={'100%'} />
</Box>
);
type Props = {
feedbackType?: `${FeedbackTypeEnum}`;
showMarkIcon?: boolean; // admin mark dataset
showVoiceIcon?: boolean;
showEmptyIntro?: boolean;
appAvatar?: string;
userAvatar?: string;
userGuideModule?: AppModuleItemType;
active?: boolean;
onUpdateVariable?: (e: Record<string, any>) => void;
onStartChat?: (e: StartChatFnProps) => Promise<{
responseText: string;
[TaskResponseKeyEnum.responseData]: ChatHistoryItemResType[];
isNewChat?: boolean;
}>;
onDelMessage?: (e: { contentId?: string; index: number }) => void;
};
const ChatBox = (
@@ -136,7 +116,6 @@ const ChatBox = (
showMarkIcon = false,
showVoiceIcon = true,
showEmptyIntro = false,
chatId,
appAvatar,
userAvatar,
userGuideModule,
@@ -144,35 +123,19 @@ const ChatBox = (
onUpdateVariable,
onStartChat,
onDelMessage
}: {
feedbackType?: `${FeedbackTypeEnum}`;
showMarkIcon?: boolean; // admin mark dataset
showVoiceIcon?: boolean;
showEmptyIntro?: boolean;
chatId?: string;
appAvatar?: string;
userAvatar?: string;
userGuideModule?: AppModuleItemType;
active?: boolean;
onUpdateVariable?: (e: Record<string, any>) => void;
onStartChat?: (e: StartChatFnProps) => Promise<{
responseText: string;
[TaskResponseKeyEnum.responseData]: ChatHistoryItemResType[];
}>;
onDelMessage?: (e: { contentId?: string; index: number }) => void;
},
}: Props,
ref: ForwardedRef<ComponentRef>
) => {
const ChatBoxRef = useRef<HTMLDivElement>(null);
const theme = useTheme();
const router = useRouter();
const { t } = useTranslation();
const { copyData } = useCopyData();
const { toast } = useToast();
const { isPc } = useGlobalStore();
const TextareaDom = useRef<HTMLTextAreaElement>(null);
const chatController = useRef(new AbortController());
const questionGuideController = useRef(new AbortController());
const isNewChatReplace = useRef(false);
const [refresh, setRefresh] = useState(false);
const [variables, setVariables] = useState<Record<string, any>>({}); // settings variable
@@ -250,6 +213,7 @@ const ChatBox = (
);
// eslint-disable-next-line react-hooks/exhaustive-deps
const generatingMessage = useCallback(
// concat text to end of message
({ text = '', status, name }: generatingMessageProps) => {
setChatHistory((state) =>
state.map((item, index) => {
@@ -275,14 +239,6 @@ const ChatBox = (
[generatingScroll, setChatHistory]
);
// 复制内容
const onclickCopy = useCallback(
(value: string) => {
copyData(value);
},
[copyData]
);
// 重置输入内容
const resetInputVal = useCallback((val: string) => {
if (!TextareaDom.current) return;
@@ -308,7 +264,8 @@ const ChatBox = (
const result = await postQuestionGuide(
{
messages: adaptChat2GptMessages({ messages: history, reserveId: false }).slice(-6)
messages: adaptChat2GptMessages({ messages: history, reserveId: false }).slice(-6),
shareId: router.query.shareId as string
},
abortSignal
);
@@ -320,7 +277,7 @@ const ChatBox = (
}
} catch (error) {}
},
[questionGuide, scrollToBottom]
[questionGuide, scrollToBottom, router.query.shareId]
);
/**
@@ -381,7 +338,11 @@ const ChatBox = (
const messages = adaptChat2GptMessages({ messages: newChatList, reserveId: true });
const { responseData, responseText } = await onStartChat({
const {
responseData,
responseText,
isNewChat = false
} = await onStartChat({
chatList: newChatList,
messages,
controller: abortSignal,
@@ -389,6 +350,8 @@ const ChatBox = (
variables
});
isNewChatReplace.current = isNewChat;
// set finish status
setChatHistory((state) =>
state.map((item, index) => {
@@ -469,6 +432,17 @@ const ChatBox = (
},
[chatHistory, onDelMessage, sendPrompt, variables]
);
// delete one message
const delOneMessage = useCallback(
({ dataId, index }: { dataId?: string; index: number }) => {
setChatHistory((state) => state.filter((chat) => chat.dataId !== dataId));
onDelMessage?.({
contentId: dataId,
index
});
},
[onDelMessage]
);
// output data
useImperativeHandle(ref, () => ({
@@ -489,23 +463,7 @@ const ChatBox = (
scrollToBottom
}));
const controlIconStyle = {
w: '14px',
cursor: 'pointer',
p: 1,
bg: 'white',
borderRadius: 'lg',
boxShadow: '0 0 5px rgba(0,0,0,0.1)',
border: theme.borders.base,
mr: 3
};
const controlContainerStyle = {
className: 'control',
color: 'myGray.400',
display: 'flex',
pl: 1,
mt: 2
};
/* style start */
const MessageCardStyle: BoxProps = {
px: 4,
py: 3,
@@ -539,31 +497,27 @@ const ChatBox = (
name: t(chatContent.moduleName || 'Running')
};
}, [chatHistory, isChatting, t]);
/* style end */
// page change and abort request
useEffect(() => {
isNewChatReplace.current = false;
return () => {
chatController.current?.abort('leave');
questionGuideController.current?.abort('leave');
// close voice
cancelBroadcast();
if (!isNewChatReplace.current) {
questionGuideController.current?.abort('leave');
}
};
}, [router.query]);
// page destroy and abort request
useEffect(() => {
const listen = () => {
cancelBroadcast();
};
window.addEventListener('beforeunload', listen);
return () => {
window.removeEventListener('beforeunload', listen);
};
}, []);
// add guide text listener
useEffect(() => {
const windowMessage = ({ data }: MessageEvent<{ type: 'sendPrompt'; text: string }>) => {
if (data?.type === 'sendPrompt' && data?.text) {
handleSubmit((item) => sendPrompt(item, data.text))();
}
};
window.addEventListener('message', windowMessage);
event.on('guideClick', ({ text }: { text: string }) => {
if (!text) return;
handleSubmit((data) => sendPrompt(data, text))();
@@ -571,6 +525,7 @@ const ChatBox = (
return () => {
event.off('guideClick');
window.removeEventListener('message', windowMessage);
};
}, [handleSubmit, sendPrompt]);
@@ -667,45 +622,17 @@ const ChatBox = (
<>
{/* control icon */}
<Flex w={'100%'} alignItems={'center'} justifyContent={'flex-end'}>
<Flex {...controlContainerStyle} justifyContent={'flex-end'} mr={3}>
<MyTooltip label={t('common.Copy')}>
<MyIcon
{...controlIconStyle}
name={'copy'}
_hover={{ color: 'myBlue.700' }}
onClick={() => onclickCopy(item.value)}
/>
</MyTooltip>
{!!onDelMessage && (
<MyTooltip label={t('chat.retry')}>
<MyIcon
{...controlIconStyle}
name={'retryLight'}
_hover={{ color: 'green.500' }}
onClick={() => retryInput(index)}
/>
</MyTooltip>
)}
{onDelMessage && (
<MyTooltip label={t('common.Delete')}>
<MyIcon
{...controlIconStyle}
mr={0}
name={'delete'}
_hover={{ color: 'red.600' }}
onClick={() => {
setChatHistory((state) =>
state.filter((chat) => chat.dataId !== item.dataId)
);
onDelMessage({
contentId: item.dataId,
index
});
}}
/>
</MyTooltip>
)}
</Flex>
<ChatController
chat={item}
onDelete={
onDelMessage
? () => {
delOneMessage({ dataId: item.dataId, index });
}
: undefined
}
onRetry={() => retryInput(index)}
/>
<ChatAvatar src={userAvatar} type={'Human'} />
</Flex>
{/* content */}
@@ -726,57 +653,23 @@ const ChatBox = (
{item.obj === 'AI' && (
<>
{/* control icon */}
<Flex w={'100%'} alignItems={'flex-end'}>
<Flex w={'100%'} alignItems={'center'}>
<ChatAvatar src={appAvatar} type={'AI'} />
<Flex
{...controlContainerStyle}
ml={3}
<ChatController
ml={2}
chat={item}
display={index === chatHistory.length - 1 && isChatting ? 'none' : 'flex'}
>
<MyTooltip label={'复制'}>
<MyIcon
{...controlIconStyle}
name={'copy'}
_hover={{ color: 'myBlue.700' }}
onClick={() => onclickCopy(item.value)}
/>
</MyTooltip>
{onDelMessage && (
<MyTooltip label={'删除'}>
<MyIcon
{...controlIconStyle}
name={'delete'}
_hover={{ color: 'red.600' }}
onClick={() => {
setChatHistory((state) =>
state.filter((chat) => chat.dataId !== item.dataId)
);
onDelMessage({
contentId: item.dataId,
index
});
}}
/>
</MyTooltip>
)}
{showVoiceIcon && hasVoiceApi && (
<MyTooltip label={'语音播报'}>
<MyIcon
{...controlIconStyle}
name={'voice'}
_hover={{ color: '#E74694' }}
onClick={() => voiceBroadcast({ text: item.value })}
/>
</MyTooltip>
)}
{/* admin mark icon */}
{showMarkIcon && (
<MyTooltip label={t('chat.Mark')}>
<MyIcon
{...controlIconStyle}
name={'markLight'}
_hover={{ color: '#67c13b' }}
onClick={() => {
showVoiceIcon={showVoiceIcon}
onDelete={
onDelMessage
? () => {
delOneMessage({ dataId: item.dataId, index });
}
: undefined
}
onMark={
showMarkIcon
? () => {
if (!item.dataId) return;
if (item.adminFeedback) {
setAdminMarkData({
@@ -793,67 +686,39 @@ const ChatBox = (
a: item.value
});
}
}}
/>
</MyTooltip>
)}
{feedbackType === FeedbackTypeEnum.admin && (
<MyTooltip label={t('chat.Read User Feedback')}>
<MyIcon
display={item.userFeedback ? 'block' : 'none'}
{...controlIconStyle}
color={'white'}
bg={'#FC9663'}
fontWeight={'bold'}
name={'badLight'}
onClick={() =>
}
: undefined
}
onReadFeedback={
feedbackType === FeedbackTypeEnum.admin
? () =>
setReadFeedbackData({
chatItemId: item.dataId || '',
content: item.userFeedback || '',
isMarked: !!item.adminFeedback
})
}
/>
</MyTooltip>
)}
{feedbackType === FeedbackTypeEnum.user && (
<MyTooltip
label={
item.userFeedback
? `取消反馈。\n您当前反馈内容为:\n${item.userFeedback}`
: '反馈'
}
>
<MyIcon
{...controlIconStyle}
{...(!!item.userFeedback
? {
color: 'white',
bg: '#FC9663',
fontWeight: 'bold',
onClick: () => {
if (!item.dataId) return;
setChatHistory((state) =>
state.map((chatItem) =>
chatItem.dataId === item.dataId
? { ...chatItem, userFeedback: undefined }
: chatItem
)
);
try {
userUpdateChatFeedback({ chatItemId: item.dataId });
} catch (error) {}
}
}
: {
_hover: { color: '#FB7C3C' },
onClick: () => setFeedbackId(item.dataId)
})}
name={'badLight'}
/>
</MyTooltip>
)}
</Flex>
: undefined
}
onFeedback={
feedbackType === FeedbackTypeEnum.user
? item.userFeedback
? () => {
if (!item.dataId) return;
setChatHistory((state) =>
state.map((chatItem) =>
chatItem.dataId === item.dataId
? { ...chatItem, userFeedback: undefined }
: chatItem
)
);
try {
userUpdateChatFeedback({ chatItemId: item.dataId });
} catch (error) {}
}
: () => setFeedbackId(item.dataId)
: undefined
}
/>
{/* chatting status */}
{statusBoxData && index === chatHistory.length - 1 && (
<Flex
@@ -885,11 +750,7 @@ const ChatBox = (
source={item.value}
isChatting={index === chatHistory.length - 1 && isChatting}
/>
<ResponseTags
chatId={chatId}
contentId={item.dataId}
responseData={item.responseData}
/>
<ResponseTags responseData={item.responseData} />
{/* question guide */}
{index === chatHistory.length - 1 &&
!isChatting &&
@@ -949,7 +810,7 @@ const ChatBox = (
</Box>
</Box>
</Box>
{/* input */}
{/* message input */}
{onStartChat && variableIsFinish && active ? (
<Box m={['0 auto', '10px auto']} w={'100%'} maxW={['auto', 'min(750px, 100%)']} px={[0, 5]}>
<Box
@@ -988,8 +849,8 @@ const ChatBox = (
textarea.style.height = `${textarea.scrollHeight}px`;
}}
onKeyDown={(e) => {
// 触发快捷发送
if (isPc && e.keyCode === 13 && !e.shiftKey) {
// enter send.(pc or iframe && enter and unPress shift)
if ((isPc || window !== parent) && e.keyCode === 13 && !e.shiftKey) {
handleSubmit((data) => sendPrompt(data, TextareaDom.current?.value))();
e.preventDefault();
}
@@ -1078,6 +939,7 @@ const ChatBox = (
}}
/>
)}
{/* admin mark data */}
{showMarkIcon && (
<>
{/* select one dataset to insert markData */}
@@ -1141,7 +1003,8 @@ const ChatBox = (
defaultValues={{
dataId: adminMarkData.dataId,
q: adminMarkData.q,
a: adminMarkData.a
a: adminMarkData.a,
file_id: DatasetSpecialIdEnum.mark
}}
/>
)}
@@ -1160,9 +1023,8 @@ export const useChatBox = () => {
const historyDom = document.getElementById('history');
if (!historyDom) return;
const dom = Array.from(historyDom.children).map((child, i) => {
const avatar = `<img src="${
child.querySelector<HTMLImageElement>('.avatar')?.src
}" alt="" />`;
const avatar = `<img src="${child.querySelector<HTMLImageElement>('.avatar')
?.src}" alt="" />`;
const chatContent = child.querySelector<HTMLDivElement>('.markdown');
@@ -1225,3 +1087,207 @@ export const useChatBox = () => {
onExportChat
};
};
function VariableLabel({
required = false,
children
}: {
required?: boolean;
children: React.ReactNode | string;
}) {
return (
<Box as={'label'} display={'inline-block'} position={'relative'} mb={1}>
{children}
{required && (
<Box
position={'absolute'}
top={'-2px'}
right={'-10px'}
color={'red.500'}
fontWeight={'bold'}
>
*
</Box>
)}
</Box>
);
}
function ChatAvatar({ src, type }: { src?: string; type: 'Human' | 'AI' }) {
const theme = useTheme();
return (
<Box
w={['28px', '34px']}
h={['28px', '34px']}
p={'2px'}
borderRadius={'lg'}
border={theme.borders.base}
boxShadow={'0 0 5px rgba(0,0,0,0.1)'}
bg={type === 'Human' ? 'white' : 'myBlue.100'}
>
<Avatar src={src} w={'100%'} h={'100%'} />
</Box>
);
}
function Empty() {
const { data: chatProblem } = useMarkdown({ url: '/chatProblem.md' });
const { data: versionIntro } = useMarkdown({ url: '/versionIntro.md' });
return (
<Box pt={6} w={'85%'} maxW={'600px'} m={'auto'} alignItems={'center'} justifyContent={'center'}>
{/* version intro */}
<Card p={4} mb={10} minH={'200px'}>
<Markdown source={versionIntro} />
</Card>
<Card p={4} minH={'600px'}>
<Markdown source={chatProblem} />
</Card>
</Box>
);
}
function ChatController({
chat,
display,
showVoiceIcon,
onReadFeedback,
onMark,
onRetry,
onDelete,
onFeedback,
ml,
mr
}: {
chat: ChatSiteItemType;
showVoiceIcon?: boolean;
onRetry?: () => void;
onDelete?: () => void;
onMark?: () => void;
onReadFeedback?: () => void;
onFeedback?: () => void;
} & FlexProps) {
const theme = useTheme();
const { t } = useTranslation();
const { copyData } = useCopyData();
const { audioLoading, audioPlaying, hasAudio, playAudio, cancelAudio } = useAudioPlay({});
const controlIconStyle = {
w: '14px',
cursor: 'pointer',
p: 1,
bg: 'white',
borderRadius: 'lg',
boxShadow: '0 0 5px rgba(0,0,0,0.1)',
border: theme.borders.base,
mr: 3
};
const controlContainerStyle = {
className: 'control',
color: 'myGray.400',
display: 'flex',
pl: 1
};
return (
<Flex {...controlContainerStyle} ml={ml} mr={mr} display={display}>
<MyTooltip label={'复制'}>
<MyIcon
{...controlIconStyle}
name={'copy'}
_hover={{ color: 'myBlue.700' }}
onClick={() => copyData(chat.value)}
/>
</MyTooltip>
{!!onDelete && (
<>
{onRetry && (
<MyTooltip label={t('chat.retry')}>
<MyIcon
{...controlIconStyle}
name={'retryLight'}
_hover={{ color: 'green.500' }}
onClick={onRetry}
/>
</MyTooltip>
)}
<MyTooltip label={'删除'}>
<MyIcon
{...controlIconStyle}
name={'delete'}
_hover={{ color: 'red.600' }}
onClick={onDelete}
/>
</MyTooltip>
</>
)}
{showVoiceIcon &&
hasAudio &&
(audioLoading ? (
<MyTooltip label={'加载中...'}>
<MyIcon {...controlIconStyle} name={'loading'} />
</MyTooltip>
) : audioPlaying ? (
<MyTooltip label={'终止播放'}>
<MyIcon
{...controlIconStyle}
name={'pause'}
_hover={{ color: '#E74694' }}
onClick={() => cancelAudio()}
/>
</MyTooltip>
) : (
<MyTooltip label={'语音播报'}>
<MyIcon
{...controlIconStyle}
name={'voice'}
_hover={{ color: '#E74694' }}
onClick={() => playAudio(chat.value)}
/>
</MyTooltip>
))}
{!!onMark && (
<MyTooltip label={t('chat.Mark')}>
<MyIcon
{...controlIconStyle}
name={'markLight'}
_hover={{ color: '#67c13b' }}
onClick={onMark}
/>
</MyTooltip>
)}
{!!onReadFeedback && (
<MyTooltip label={t('chat.Read User Feedback')}>
<MyIcon
display={chat.userFeedback ? 'block' : 'none'}
{...controlIconStyle}
color={'white'}
bg={'#FC9663'}
fontWeight={'bold'}
name={'badLight'}
onClick={onReadFeedback}
/>
</MyTooltip>
)}
{!!onFeedback && (
<MyTooltip
label={chat.userFeedback ? `取消反馈。\n您当前反馈内容为:\n${chat.userFeedback}` : '反馈'}
>
<MyIcon
{...controlIconStyle}
{...(!!chat.userFeedback
? {
color: 'white',
bg: '#FC9663',
fontWeight: 'bold',
onClick: onFeedback
}
: {
_hover: { color: '#FB7C3C' },
onClick: onFeedback
})}
name={'badLight'}
/>
</MyTooltip>
)}
</Flex>
);
}

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1696179048209" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4182" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M373.333333 85.333333H266.666667a53.393333 53.393333 0 0 0-53.333334 53.333334v746.666666a53.393333 53.393333 0 0 0 53.333334 53.333334h106.666666a53.393333 53.393333 0 0 0 53.333334-53.333334V138.666667a53.393333 53.393333 0 0 0-53.333334-53.333334z m10.666667 800a10.666667 10.666667 0 0 1-10.666667 10.666667H266.666667a10.666667 10.666667 0 0 1-10.666667-10.666667V138.666667a10.666667 10.666667 0 0 1 10.666667-10.666667h106.666666a10.666667 10.666667 0 0 1 10.666667 10.666667z m373.333333-800H650.666667a53.393333 53.393333 0 0 0-53.333334 53.333334v746.666666a53.393333 53.393333 0 0 0 53.333334 53.333334h106.666666a53.393333 53.393333 0 0 0 53.333334-53.333334V138.666667a53.393333 53.393333 0 0 0-53.333334-53.333334z m10.666667 800a10.666667 10.666667 0 0 1-10.666667 10.666667H650.666667a10.666667 10.666667 0 0 1-10.666667-10.666667V138.666667a10.666667 10.666667 0 0 1 10.666667-10.666667h106.666666a10.666667 10.666667 0 0 1 10.666667 10.666667z" p-id="4183"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style=" background: rgb(255, 255, 255); display: block; shape-rendering: auto;" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
<g transform="rotate(0 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.9166666666666666s" repeatCount="indefinite"></animate>
</rect>
</g><g transform="rotate(30 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.8333333333333334s" repeatCount="indefinite"></animate>
</rect>
</g><g transform="rotate(60 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.75s" repeatCount="indefinite"></animate>
</rect>
</g><g transform="rotate(90 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.6666666666666666s" repeatCount="indefinite"></animate>
</rect>
</g><g transform="rotate(120 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.5833333333333334s" repeatCount="indefinite"></animate>
</rect>
</g><g transform="rotate(150 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.5s" repeatCount="indefinite"></animate>
</rect>
</g><g transform="rotate(180 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.4166666666666667s" repeatCount="indefinite"></animate>
</rect>
</g><g transform="rotate(210 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.3333333333333333s" repeatCount="indefinite"></animate>
</rect>
</g><g transform="rotate(240 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.25s" repeatCount="indefinite"></animate>
</rect>
</g><g transform="rotate(270 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.16666666666666666s" repeatCount="indefinite"></animate>
</rect>
</g><g transform="rotate(300 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.08333333333333333s" repeatCount="indefinite"></animate>
</rect>
</g><g transform="rotate(330 50 50)">
<rect x="47.5" y="24" rx="2.5" ry="6" width="5" height="12" fill="#3370ff">
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="0s" repeatCount="indefinite"></animate>
</rect>
</g>
<!-- [ldio] generated by https://loading.io/ --></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -87,7 +87,9 @@ const iconPaths = {
searchLight: () => import('./icons/light/search.svg'),
plusFill: () => import('./icons/fill/plus.svg'),
moveLight: () => import('./icons/light/move.svg'),
questionGuide: () => import('./icons/app/questionGuide.svg')
questionGuide: () => import('./icons/app/questionGuide.svg'),
loading: () => import('./icons/light/loading.svg'),
pause: () => import('./icons/common/pause.svg')
};
export type IconName = keyof typeof iconPaths;

View File

@@ -102,7 +102,7 @@ const Layout = ({ children }: { children: JSX.Element }) => {
</>
)}
</Box>
<Loading loading={loading} />
<Loading loading={loading} zIndex={9999} />
</>
);
};

View File

@@ -4,16 +4,18 @@ import { Spinner, Flex, Box } from '@chakra-ui/react';
const Loading = ({
fixed = true,
text = '',
bg = 'rgba(255,255,255,0.5)'
bg = 'rgba(255,255,255,0.5)',
zIndex = 1000
}: {
fixed?: boolean;
text?: string;
bg?: string;
zIndex?: number;
}) => {
return (
<Flex
position={fixed ? 'fixed' : 'absolute'}
zIndex={1000}
zIndex={zIndex}
bg={bg}
top={0}
left={0}

View File

@@ -4,6 +4,7 @@ import ReactMarkdown from 'react-markdown';
import RemarkGfm from 'remark-gfm';
import RemarkMath from 'remark-math';
import RehypeKatex from 'rehype-katex';
import RemarkBreaks from 'remark-breaks';
import { event } from '@/utils/plugin/eventbus';
import 'katex/dist/katex.min.css';
@@ -19,34 +20,36 @@ function MyLink(e: any) {
{text}
</Link>
) : (
<Box as={'ul'}>
<Box as={'li'}>
<Box
as={'span'}
color={'blue.600'}
textDecoration={'underline'}
cursor={'pointer'}
onClick={() => {
event.emit('guideClick', { text });
}}
>
{text}
</Box>
<Box as={'li'} mb={1}>
<Box
as={'span'}
color={'blue.600'}
textDecoration={'underline'}
cursor={'pointer'}
onClick={() => {
event.emit('guideClick', { text });
}}
>
{text}
</Box>
</Box>
);
}
const Guide = ({ text }: { text: string }) => {
const formatText = useMemo(() => text.replace(/\[(.*?)\]($|\n)/g, '[$1]()\n'), [text]);
const formatText = useMemo(
() => text.replace(/\[(.*?)\]($|\n)/g, '[$1]()').replace(/\\n/g, '\n&nbsp;'),
[text]
);
return (
<ReactMarkdown
className={`markdown ${styles.markdown}`}
remarkPlugins={[RemarkGfm, RemarkMath]}
remarkPlugins={[RemarkGfm, RemarkMath, RemarkBreaks]}
rehypePlugins={[RehypeKatex]}
components={{
a: MyLink,
p: 'div',
img: Image
}}
>

View File

@@ -171,11 +171,10 @@
.markdown ol li > *:first-child {
margin-top: 0;
}
.markdown ul ul,
.markdown ul ol,
.markdown ol ol,
.markdown ol ul {
.markdown ul,
.markdown ol {
margin-bottom: 0;
padding-left: 14px;
}
.markdown dl {
padding: 0;

View File

@@ -62,6 +62,8 @@ const Markdown = ({ source, isChatting = false }: { source: string; isChatting?:
[]
);
const formatSource = source.replace(/\\n/g, '\n&nbsp;');
return (
<ReactMarkdown
className={`markdown ${styles.markdown}
@@ -73,9 +75,9 @@ const Markdown = ({ source, isChatting = false }: { source: string; isChatting?:
components={components}
linkTarget={'_blank'}
>
{source}
{formatSource}
</ReactMarkdown>
);
};
export default Markdown;
export default React.memo(Markdown);

View File

@@ -8,7 +8,7 @@ const PageContainer = ({ children, ...props }: BoxProps) => {
<Box
h={'100%'}
bg={'white'}
borderRadius={[0, '2xl']}
borderRadius={props?.borderRadius || [0, '2xl']}
border={['none', theme.borders.lg]}
overflow={'overlay'}
>

Some files were not shown because too many files have changed in this diff Show More