Compare commits

...

6 Commits

Author SHA1 Message Date
Archer
5b676ff4ad config (#662) 2023-12-27 20:43:01 +08:00
Archer
759a2330e6 V4.6.6-1 (#656) 2023-12-27 11:07:39 +08:00
Archer
86286efb54 fix: init (#653) 2023-12-26 10:10:36 +08:00
Carson Yang
99e8ba2256 Docs: update qr-code (#646)
Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
2023-12-23 00:26:33 +08:00
Carson Yang
f84fd93cbb Update README (#645)
Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
2023-12-23 00:19:23 +08:00
Archer
cd682d4275 4.6.5- CoreferenceResolution Module (#631) 2023-12-22 10:47:31 +08:00
268 changed files with 7362 additions and 84331 deletions

View File

@@ -8,4 +8,5 @@ README.md
.yalc/
yalc.lock
testApi/
testApi/
*.local.*

3
.gitignore vendored
View File

@@ -35,4 +35,5 @@ dist/
**/.hugo_build.lock
docSite/public/
docSite/resources/_gen/
docSite/.vercel
docSite/.vercel
*.local.*

View File

@@ -76,6 +76,11 @@ COPY --from=builder --chown=nextjs:nodejs /app/projects/$name/.next/static /app/
COPY --from=builder /app/projects/$name/package.json ./package.json
# copy woker
COPY --from=workerDeps /app/worker /app/worker
# copy config
COPY ./projects/$name/data/config.json /app/data/config.json
COPY ./projects/$name/data/pluginTemplates /app/data/pluginTemplates
COPY ./projects/$name/data/simpleTemplates /app/data/simpleTemplates
ENV NODE_ENV production
ENV NEXT_TELEMETRY_DISABLED 1

View File

@@ -194,8 +194,9 @@ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409b
<a href="https://github.com/labring/FastGPT/stargazers" target="_blank" style="display: block" align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/analyze-repo-stars-history/thumbnail.png?repo_id=605673387&image_size=auto&color_scheme=dark">
<img alt="Star History of labring/FastGPT" src="https://next.ossinsight.io/widgets/official/analyze-repo-stars-history/thumbnail.png?repo_id=605673387&image_size=auto&color_scheme=light">
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date" />
</picture>
</a>

View File

@@ -156,4 +156,10 @@ Project tech stack: NextJs + TS + ChakraUI + Mongo + Postgres (Vector plugin)
## 🌟 Star History
[![Star History Chart](https://api.star-history.com/svg?repos=labring/FastGPT&type=Date)](https://star-history.com/#labring/FastGPT&Date)
<a href="https://github.com/labring/FastGPT/stargazers" target="_blank" style="display: block" align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date" />
</picture>
</a>

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 485 KiB

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 336 KiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

@@ -11,6 +11,6 @@ FastGPT 是一个由用户和贡献者参与推动的开源项目,如果您对
+ 📱 扫码加入社区微信交流群👇
<img width="400px" src="/wechat-fastgpt.webp" />
<img width="400px" src="https://oss.laf.run/htr4n1-images/fastgpt-qr-code.jpg" />
+ 🐞 请将任何 FastGPT 的 Bug、问题和需求提交到 [GitHub Issue](https://github.com/labring/fastgpt/issues/new/choose)。

View File

@@ -14,9 +14,7 @@ weight: 708
这个配置文件中包含了系统级参数、AI 对话的模型、function 模型等……
## 完整配置参数
**使用时,请务必去除注释!**
## 旧版本配置文件
```json
{
@@ -92,7 +90,7 @@ weight: 708
"maxContext": 16000,
"maxResponse": 4000,
"price": 0,
"functionCall": true, // 是否支持function call 不支持的模型需要设置为 false会走提示词生成
"toolChoice": true, // 是否支持openai的 toolChoice 不支持的模型需要设置为 false会走提示词生成
"functionPrompt": ""
},
{
@@ -101,7 +99,7 @@ weight: 708
"maxContext": 8000,
"maxResponse": 8000,
"price": 0,
"functionCall": true,
"toolChoice": true,
"functionPrompt": ""
}
],
@@ -112,7 +110,7 @@ weight: 708
"maxContext": 16000,
"maxResponse": 4000,
"price": 0,
"functionCall": true,
"toolChoice": true,
"functionPrompt": ""
}
],
@@ -134,6 +132,7 @@ weight: 708
"maxToken": 3000
}
],
"ReRankModels": [], // 重排模型,暂时填空数组
"AudioSpeechModels": [
{
"model": "tts-1",
@@ -158,3 +157,151 @@ weight: 708
}
}
```
## 4.6.6-alpha 版本完整配置参数
**使用时,请务必去除注释!**
以下配置适用于V4.6.6-alpha版本以后
```json
{
"systemEnv": {
"pluginBaseUrl": "", // 商业版接口地址
"vectorMaxProcess": 15, // 向量生成最大进程,结合数据库性能和 key 来设置
"qaMaxProcess": 15, // QA 生成最大进程,结合数据库性能和 key 来设置
"pgHNSWEfSearch": 100 // pg vector 索引参数,越大精度高但速度慢
},
"chatModels": [ // 对话模型
{
"model": "gpt-3.5-turbo-1106",
"name": "GPT35-1106",
"price": 0, // 除以 100000 后等于1个token的价格
"maxContext": 16000, // 最大上下文长度
"maxResponse": 4000, // 最大回复长度
"quoteMaxToken": 2000, // 最大引用内容长度
"maxTemperature": 1.2, // 最大温度值
"censor": false, // 是否开启敏感词过滤(商业版)
"vision": false, // 支持图片输入
"defaultSystemChatPrompt": ""
},
{
"model": "gpt-3.5-turbo-16k",
"name": "GPT35-16k",
"maxContext": 16000,
"maxResponse": 16000,
"price": 0,
"quoteMaxToken": 8000,
"maxTemperature": 1.2,
"censor": false,
"vision": false,
"defaultSystemChatPrompt": ""
},
{
"model": "gpt-4",
"name": "GPT4-8k",
"maxContext": 8000,
"maxResponse": 8000,
"price": 0,
"quoteMaxToken": 4000,
"maxTemperature": 1.2,
"censor": false,
"vision": false,
"defaultSystemChatPrompt": ""
},
{
"model": "gpt-4-vision-preview",
"name": "GPT4-Vision",
"maxContext": 128000,
"maxResponse": 4000,
"price": 0,
"quoteMaxToken": 100000,
"maxTemperature": 1.2,
"censor": false,
"vision": true,
"defaultSystemChatPrompt": ""
}
],
"qaModels": [ // QA 生成模型
{
"model": "gpt-3.5-turbo-16k",
"name": "GPT35-16k",
"maxContext": 16000,
"maxResponse": 16000,
"price": 0
}
],
"cqModels": [ // 问题分类模型
{
"model": "gpt-3.5-turbo-1106",
"name": "GPT35-1106",
"maxContext": 16000,
"maxResponse": 4000,
"price": 0,
"toolChoice": true, // 是否支持openai的 toolChoice 不支持的模型需要设置为 false会走提示词生成
"functionPrompt": ""
},
{
"model": "gpt-4",
"name": "GPT4-8k",
"maxContext": 8000,
"maxResponse": 8000,
"price": 0,
"toolChoice": true,
"functionPrompt": ""
}
],
"extractModels": [ // 内容提取模型
{
"model": "gpt-3.5-turbo-1106",
"name": "GPT35-1106",
"maxContext": 16000,
"maxResponse": 4000,
"price": 0,
"toolChoice": true,
"functionPrompt": ""
}
],
"qgModels": [ // 生成下一步指引
{
"model": "gpt-3.5-turbo-1106",
"name": "GPT35-1106",
"maxContext": 1600,
"maxResponse": 4000,
"price": 0
}
],
"vectorModels": [ // 向量模型
{
"model": "text-embedding-ada-002",
"name": "Embedding-2",
"price": 0.2,
"defaultToken": 700,
"maxToken": 3000
}
],
"reRankModels": [], // 重排模型,暂时填空数组
"audioSpeechModels": [
{
"model": "tts-1",
"name": "OpenAI TTS1",
"price": 0,
"baseUrl": "",
"key": "",
"voices": [
{ "label": "Alloy", "value": "alloy", "bufferId": "openai-Alloy" },
{ "label": "Echo", "value": "echo", "bufferId": "openai-Echo" },
{ "label": "Fable", "value": "fable", "bufferId": "openai-Fable" },
{ "label": "Onyx", "value": "onyx", "bufferId": "openai-Onyx" },
{ "label": "Nova", "value": "nova", "bufferId": "openai-Nova" },
{ "label": "Shimmer", "value": "shimmer", "bufferId": "openai-Shimmer" }
]
}
],
"whisperModel": {
"model": "whisper-1",
"name": "Whisper1",
"price": 0
}
}
```

View File

@@ -107,4 +107,4 @@ docker build -t dockername/fastgpt --build-arg name=app .
遇到困难了吗?有任何问题吗? 加入微信群与开发者和用户保持沟通。
<center><image width="400px" src="/wechat-fastgpt.webp" /></center>
<center><image width="400px" src="https://oss.laf.run/htr4n1-images/fastgpt-qr-code.jpg" /></center>

View File

@@ -0,0 +1,33 @@
---
title: 'V4.6.5(需要改配置文件)'
description: 'FastGPT V4.6.5'
icon: 'upgrade'
draft: false
toc: true
weight: 831
---
## 配置文件变更
由于 openai 已开始弃用 function call改为 toolChoice。FastGPT 同步的修改了对于的配置和调用方式,需要对配置文件做一些修改:
[点击查看最新的配置文件](/docs/development/configuration/)
1. 主要是修改模型的`functionCall`字段,改成`toolChoice`即可。设置为`true`的模型,会默认走 openai 的 tools 模式;未设置或设置为`false`的,会走提示词生成模式。
问题补全模型与内容提取模型使用同一组配置。
2. 增加 `"ReRankModels": []`
## V4.6.5 功能介绍
1. 新增 - [问题补全模块](/docs/workflow/modules/coreferenceresolution/)
2. 新增 - [文本编辑模块](/docs/workflow/modules/text_editor/)
3. 新增 - [判断器模块](/docs/workflow/modules/tfswitch/)
4. 新增 - [自定义反馈模块](/docs/workflow/modules/custom_feedback/)
5. 新增 - 【内容提取】模块支持选择模型,以及字段枚举
6. 优化 - docx读取兼容表格表格转markdown
7. 优化 - 高级编排连接线交互
8. 优化 - 由于 html2md 导致的 cpu密集计算阻断线程问题
9. 修复 - 高级编排提示词提取描述

View File

@@ -0,0 +1,22 @@
---
title: 'V4.6.6(需要改配置文件)'
description: 'FastGPT V4.6.6'
icon: 'upgrade'
draft: false
toc: true
weight: 831
---
**版本仍在开发中……**
## 配置文件变更
为了减少代码重复度,我们对配置文件做了一些修改:[点击查看最新的配置文件](/docs/development/configuration/)
## V4.6.6 即将更新
1. UI 优化未来将逐步替换新的UI设计。

View File

@@ -10,7 +10,7 @@ weight: -10
FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!
{{% alert icon="🤖 " context="success" %}}
FastGPT 在线体验[https://fastgpt.run](https://fastgpt.run)
FastGPT 在线使用[https://ai.fastgpt.in](https://ai.fastgpt.in)
{{% /alert %}}
| | |

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -5,4 +5,6 @@ description: "介绍 FastGPT 的常用模块"
icon: "apps"
draft: false
images: []
---
---
<!-- 350 ~ 400 -->

View File

@@ -0,0 +1,39 @@
---
title: "问题补全"
description: "问题补全模块介绍和使用"
icon: "input"
draft: false
toc: true
weight: 364
---
## 特点
- 可重复添加
- 有外部输入
- 触发执行
![](/imgs/coreferenceResolution1.png)
## 背景
在 RAG 中,我们需要根据输入的问题去数据库里执行 embedding 搜索,查找相关的内容,从而查找到相似的内容(简称知识库搜索)。
在搜索的过程中,尤其是连续对话的搜索,我们通常会发现后续的问题难以搜索到合适的内容,其中一个原因是知识库搜索只会使用“当前”的问题去执行。看下面的例子:
![](/imgs/coreferenceResolution2.png)
用户在提问“第二点是什么”的时候只会去知识库里查找“第二点是什么”压根查不到内容。实际上需要查询的是“QA结构是什么”。因此我们需要引入一个【问题补全】模块来对用户当前的问题进行补全从而使得知识库搜索能够搜索到合适的内容。使用补全后效果如下
![](/imgs/coreferenceResolution3.png)
## 功能
调用 AI 去对用户当前的问题进行补全。目前主要是补全“指代”词,使得检索词更加的完善可靠,从而增强上下文连续对话的知识库搜索能力。
遇到最大的难题在于:模型对于【补全】的概念可能不清晰,且对于长上下文往往无法准确的知道应该如何补全。
## 示例
- [接入谷歌搜索](/docs/workflow/examples/google_search/)

View File

@@ -26,3 +26,7 @@ weight: 363
## 作用
给任意模块输入自定格式文本,或处理 AI 模块系统提示词。
## 示例
- [接入谷歌搜索](/docs/workflow/examples/google_search/)

View File

@@ -25,4 +25,5 @@ weight: 362
## 作用
适用场景有:让大模型做判断后输出固定内容,根据大模型回复内容判断是否触发后续模块。
适用场景有:让大模型做判断后输出固定内容,根据大模型回复内容判断是否触发后续模块。

View File

@@ -68,7 +68,7 @@ defaultContentLanguage = 'zh-cn'
# twitter = "" # YOUR_TWITTER_ID
# instagram = "colinwilson" # YOUR_INSTAGRAM_ID
# rss = true # show rss icon with link
wechat = "/wechat-fastgpt.webp"
wechat = "https://oss.laf.run/htr4n1-images/fastgpt-qr-code.jpg"
[params.docs] # Parameters for the /docs 'template'
title = "" # default html title for documentation pages/sections

View File

@@ -6,16 +6,18 @@
"prepare": "husky install",
"format-code": "prettier --config \"./.prettierrc.js\" --write \"./**/src/**/*.{ts,tsx,scss}\"",
"format-doc": "zhlint --dir ./docSite *.md --fix",
"gen:theme-typings": "chakra-cli tokens projects/app/src/web/styles/theme.ts --out node_modules/.pnpm/node_modules/@chakra-ui/styled-system/dist/theming.types.d.ts",
"postinstall": "sh ./scripts/postinstall.sh"
},
"devDependencies": {
"@chakra-ui/cli": "^2.4.1",
"husky": "^8.0.3",
"lint-staged": "^13.2.1",
"prettier": "^3.0.3",
"zhlint": "^0.7.1",
"i18next": "^22.5.1",
"lint-staged": "^13.2.1",
"next-i18next": "^13.3.0",
"react-i18next": "^12.3.1"
"prettier": "^3.0.3",
"react-i18next": "^12.3.1",
"zhlint": "^0.7.1"
},
"lint-staged": {
"./**/**/*.{ts,tsx,scss}": "npm run format-code",

View File

@@ -0,0 +1,62 @@
/* read file to txt */
import * as pdfjsLib from 'pdfjs-dist';
export const readPdfFile = async ({ pdf }: { pdf: string | URL | ArrayBuffer }) => {
pdfjsLib.GlobalWorkerOptions.workerSrc = '/js/pdf.worker.js';
type TokenType = {
str: string;
dir: string;
width: number;
height: number;
transform: number[];
fontName: string;
hasEOL: boolean;
};
const readPDFPage = async (doc: any, pageNo: number) => {
const page = await doc.getPage(pageNo);
const tokenizedText = await page.getTextContent();
const viewport = page.getViewport({ scale: 1 });
const pageHeight = viewport.height;
const headerThreshold = pageHeight * 0.07; // 假设页头在页面顶部5%的区域内
const footerThreshold = pageHeight * 0.93; // 假设页脚在页面底部5%的区域内
const pageTexts: TokenType[] = tokenizedText.items.filter((token: TokenType) => {
return (
!token.transform ||
(token.transform[5] > headerThreshold && token.transform[5] < footerThreshold)
);
});
// concat empty string 'hasEOL'
for (let i = 0; i < pageTexts.length; i++) {
const item = pageTexts[i];
if (item.str === '' && pageTexts[i - 1]) {
pageTexts[i - 1].hasEOL = item.hasEOL;
pageTexts.splice(i, 1);
i--;
}
}
page.cleanup();
return pageTexts
.map((token) => {
const paragraphEnd = token.hasEOL && /([。?!.?!\n\r]|(\r\n))$/.test(token.str);
return paragraphEnd ? `${token.str}\n` : token.str;
})
.join('');
};
const doc = await pdfjsLib.getDocument(pdf).promise;
const pageTextPromises = [];
for (let pageNo = 1; pageNo <= doc.numPages; pageNo++) {
pageTextPromises.push(readPDFPage(doc, pageNo));
}
const pageTexts = await Promise.all(pageTextPromises);
return pageTexts.join('');
};

View File

@@ -28,9 +28,47 @@ export const simpleMarkdownText = (rawText: string) => {
['####', '###', '##', '#', '```', '~~~'].forEach((item, i) => {
const reg = new RegExp(`\\n\\s*${item}`, 'g');
if (reg.test(rawText)) {
rawText = rawText.replace(new RegExp(`(\\n)\\s*(${item})`, 'g'), '$1$2');
rawText = rawText.replace(new RegExp(`(\\n)( *)(${item})`, 'g'), '$1$3');
}
});
return rawText.trim();
};
/**
* format markdown
* 1. upload base64
* 2. replace \
*/
export const uploadMarkdownBase64 = async ({
rawText,
uploadImgController
}: {
rawText: string;
uploadImgController: (base64: string) => Promise<string>;
}) => {
// match base64, upload and replace it
const base64Regex = /data:image\/.*;base64,([^\)]+)/g;
const base64Arr = rawText.match(base64Regex) || [];
// upload base64 and replace it
await Promise.all(
base64Arr.map(async (base64Img) => {
try {
const str = await uploadImgController(base64Img);
rawText = rawText.replace(base64Img, str);
} catch (error) {
rawText = rawText.replace(base64Img, '');
rawText = rawText.replace(/!\[.*\]\(\)/g, '');
}
})
);
// Remove white space on both sides of the picture
const trimReg = /(!\[.*\]\(.*\))\s*/g;
if (trimReg.test(rawText)) {
rawText = rawText.replace(trimReg, '$1');
}
return simpleMarkdownText(rawText);
};

View File

@@ -31,7 +31,7 @@ export const splitText2Chunks = (props: {
// The larger maxLen is, the next sentence is less likely to trigger splitting
const stepReges: { reg: RegExp; maxLen: number }[] = [
...customReg.map((text) => ({ reg: new RegExp(`([${text}])`, 'g'), maxLen: chunkLen * 1.4 })),
...customReg.map((text) => ({ reg: new RegExp(`(${text})`, 'g'), maxLen: chunkLen * 1.4 })),
{ reg: /^(#\s[^\n]+)\n/gm, maxLen: chunkLen * 1.2 },
{ reg: /^(##\s[^\n]+)\n/gm, maxLen: chunkLen * 1.2 },
{ reg: /^(###\s[^\n]+)\n/gm, maxLen: chunkLen * 1.2 },
@@ -64,13 +64,22 @@ export const splitText2Chunks = (props: {
}
];
}
const isCustomSteep = checkIsCustomStep(step);
const isMarkdownSplit = checkIsMarkdownSplit(step);
const independentChunk = checkIndependentChunk(step);
const { reg } = stepReges[step];
const splitTexts = text
.replace(reg, independentChunk ? `${splitMarker}$1` : `$1${splitMarker}`)
.replace(
reg,
(() => {
if (isCustomSteep) return splitMarker;
if (independentChunk) return `${splitMarker}$1`;
return `$1${splitMarker}`;
})()
)
.split(`${splitMarker}`)
.filter((part) => part.trim());
@@ -128,11 +137,6 @@ export const splitText2Chunks = (props: {
const independentChunk = checkIndependentChunk(step);
const isCustomStep = checkIsCustomStep(step);
// mini text
if (text.length <= chunkLen) {
return [text];
}
// oversize
if (step >= stepReges.length) {
if (text.length < chunkLen * 3) {
@@ -221,6 +225,8 @@ export const splitText2Chunks = (props: {
} else {
chunks.push(`${mdTitle}${lastText}`);
}
} else if (lastText && chunks.length === 0) {
chunks.push(lastText);
}
return chunks;

View File

@@ -1,4 +1,29 @@
export type FeConfigsType = {
import type {
ChatModelItemType,
FunctionModelItemType,
LLMModelItemType,
VectorModelItemType,
AudioSpeechModels,
WhisperModelType,
ReRankModelItemType
} from '../../../core/ai/model.d';
/* fastgpt main */
export type FastGPTConfigFileType = {
feConfigs: FastGPTFeConfigsType;
systemEnv: SystemEnvType;
chatModels: ChatModelItemType[];
qaModels: LLMModelItemType[];
cqModels: FunctionModelItemType[];
extractModels: FunctionModelItemType[];
qgModels: LLMModelItemType[];
vectorModels: VectorModelItemType[];
reRankModels: ReRankModelItemType[];
audioSpeechModels: AudioSpeechModelType[];
whisperModel: WhisperModelType;
};
export type FastGPTFeConfigsType = {
show_emptyChat?: boolean;
show_register?: boolean;
show_appStore?: boolean;
@@ -34,6 +59,6 @@ export type SystemEnvType = {
};
declare global {
var feConfigs: FeConfigsType;
var feConfigs: FastGPTFeConfigsType;
var systemEnv: SystemEnvType;
}

View File

@@ -14,7 +14,7 @@ export type ChatModelItemType = LLMModelItemType & {
};
export type FunctionModelItemType = LLMModelItemType & {
functionCall: boolean;
toolChoice: boolean;
functionPrompt: string;
};
@@ -24,6 +24,7 @@ export type VectorModelItemType = {
defaultToken: number;
price: number;
maxToken: number;
weight: number;
};
export type ReRankModelItemType = {

View File

@@ -1,63 +1,5 @@
import type {
LLMModelItemType,
ChatModelItemType,
FunctionModelItemType,
VectorModelItemType,
AudioSpeechModelType,
WhisperModelType,
ReRankModelItemType
} from './model.d';
import type { LLMModelItemType, VectorModelItemType } from './model.d';
export const defaultChatModels: ChatModelItemType[] = [
{
model: 'gpt-3.5-turbo-1106',
name: 'GPT35-1106',
price: 0,
maxContext: 16000,
maxResponse: 4000,
quoteMaxToken: 2000,
maxTemperature: 1.2,
censor: false,
vision: false,
defaultSystemChatPrompt: ''
},
{
model: 'gpt-3.5-turbo-16k',
name: 'GPT35-16k',
maxContext: 16000,
maxResponse: 16000,
price: 0,
quoteMaxToken: 8000,
maxTemperature: 1.2,
censor: false,
vision: false,
defaultSystemChatPrompt: ''
},
{
model: 'gpt-4',
name: 'GPT4-8k',
maxContext: 8000,
maxResponse: 8000,
price: 0,
quoteMaxToken: 4000,
maxTemperature: 1.2,
censor: false,
vision: false,
defaultSystemChatPrompt: ''
},
{
model: 'gpt-4-vision-preview',
name: 'GPT4-Vision',
maxContext: 128000,
maxResponse: 4000,
price: 0,
quoteMaxToken: 100000,
maxTemperature: 1.2,
censor: false,
vision: true,
defaultSystemChatPrompt: ''
}
];
export const defaultQAModels: LLMModelItemType[] = [
{
model: 'gpt-3.5-turbo-16k',
@@ -67,46 +9,6 @@ export const defaultQAModels: LLMModelItemType[] = [
price: 0
}
];
export const defaultCQModels: FunctionModelItemType[] = [
{
model: 'gpt-3.5-turbo-1106',
name: 'GPT35-1106',
maxContext: 16000,
maxResponse: 4000,
price: 0,
functionCall: true,
functionPrompt: ''
},
{
model: 'gpt-4',
name: 'GPT4-8k',
maxContext: 8000,
maxResponse: 8000,
price: 0,
functionCall: true,
functionPrompt: ''
}
];
export const defaultExtractModels: FunctionModelItemType[] = [
{
model: 'gpt-3.5-turbo-1106',
name: 'GPT35-1106',
maxContext: 16000,
maxResponse: 4000,
price: 0,
functionCall: true,
functionPrompt: ''
}
];
export const defaultQGModels: LLMModelItemType[] = [
{
model: 'gpt-3.5-turbo-1106',
name: 'GPT35-1106',
maxContext: 1600,
maxResponse: 4000,
price: 0
}
];
export const defaultVectorModels: VectorModelItemType[] = [
{
@@ -114,30 +16,7 @@ export const defaultVectorModels: VectorModelItemType[] = [
name: 'Embedding-2',
price: 0,
defaultToken: 500,
maxToken: 3000
maxToken: 3000,
weight: 100
}
];
export const defaultReRankModels: ReRankModelItemType[] = [];
export const defaultAudioSpeechModels: AudioSpeechModelType[] = [
{
model: 'tts-1',
name: 'OpenAI TTS1',
price: 0,
voices: [
{ label: 'Alloy', value: 'Alloy', bufferId: 'openai-Alloy' },
{ label: 'Echo', value: 'Echo', bufferId: 'openai-Echo' },
{ label: 'Fable', value: 'Fable', bufferId: 'openai-Fable' },
{ label: 'Onyx', value: 'Onyx', bufferId: 'openai-Onyx' },
{ label: 'Nova', value: 'Nova', bufferId: 'openai-Nova' },
{ label: 'Shimmer', value: 'Shimmer', bufferId: 'openai-Shimmer' }
]
}
];
export const defaultWhisperModel: WhisperModelType = {
model: 'whisper-1',
name: 'Whisper1',
price: 0
};

View File

@@ -67,6 +67,9 @@ export type AppSimpleEditFormType = {
searchMode: `${DatasetSearchModeEnum}`;
searchEmptyText: string;
};
cfr: {
background: string;
};
userGuide: {
welcomeText: string;
variables: {
@@ -111,6 +114,9 @@ export type AppSimpleEditConfigTemplateType = {
searchMode: `${DatasetSearchModeEnum}`;
searchEmptyText?: boolean;
};
cfr?: {
background?: boolean;
};
userGuide?: {
welcomeText?: boolean;
variables?: boolean;

View File

@@ -3,23 +3,23 @@ import { FlowNodeTypeEnum } from '../module/node/constant';
import { ModuleOutputKeyEnum, ModuleInputKeyEnum } from '../module/constants';
import type { FlowNodeInputItemType } from '../module/node/type.d';
import { getGuideModule, splitGuideModule } from '../module/utils';
import { defaultChatModels } from '../ai/model';
import { ModuleItemType } from '../module/type.d';
import { DatasetSearchModeEnum } from '../dataset/constant';
export const getDefaultAppForm = (templateId = 'fastgpt-universal'): AppSimpleEditFormType => {
const defaultChatModel = defaultChatModels[0];
return {
templateId,
aiSettings: {
model: defaultChatModel?.model,
model: 'gpt-3.5-turbo',
systemPrompt: '',
temperature: 0,
isResponseAnswerText: true,
quotePrompt: '',
quoteTemplate: '',
maxToken: defaultChatModel ? defaultChatModel.maxResponse / 2 : 4000
maxToken: 4000
},
cfr: {
background: ''
},
dataset: {
datasets: [],
@@ -116,6 +116,11 @@ export const appModules2Form = ({
questionGuide: questionGuide,
tts: ttsConfig
};
} else if (module.flowType === FlowNodeTypeEnum.cfr) {
const value = module.inputs.find((item) => item.key === ModuleInputKeyEnum.aiSystemPrompt);
if (value) {
defaultAppForm.cfr.background = value.value;
}
}
});

View File

@@ -93,6 +93,7 @@ export type moduleDispatchResType = {
model?: string;
query?: string;
contextTotalLen?: number;
textOutput?: string;
// chat
temperature?: number;
@@ -119,9 +120,7 @@ export type moduleDispatchResType = {
// plugin output
pluginOutput?: Record<string, any>;
// text editor
textOutput?: string;
pluginDetail?: ChatHistoryItemResType[];
// tf switch
tfSwitchResult?: boolean;

View File

@@ -89,6 +89,7 @@ export type DatasetTrainingSchemaType = {
q: string;
a: string;
chunkIndex: number;
weight: number;
indexes: Omit<DatasetDataIndexItemType, 'dataId'>[];
};

View File

@@ -38,7 +38,6 @@ export enum FlowNodeOutputTypeEnum {
}
export enum FlowNodeTypeEnum {
empty = 'empty',
userGuide = 'userGuide',
questionInput = 'questionInput',
historyNode = 'historyNode',
@@ -52,10 +51,10 @@ export enum FlowNodeTypeEnum {
pluginModule = 'pluginModule',
pluginInput = 'pluginInput',
pluginOutput = 'pluginOutput',
textEditor = 'textEditor',
cfr = 'cfr',
// abandon
variable = 'variable'
}
export const EDGE_TYPE = 'smoothstep';
export const EDGE_TYPE = 'default';

View File

@@ -141,7 +141,7 @@ export const AiChatModule: FlowModuleTemplateType = {
},
{
key: ModuleOutputKeyEnum.answerText,
label: 'AI回复',
label: 'AI回复内容',
description: '将在 stream 回复完毕后触发',
valueType: ModuleIOValueTypeEnum.string,
type: FlowNodeOutputTypeEnum.source,

View File

@@ -36,10 +36,11 @@ export const ContextExtractModule: FlowModuleTemplateType = {
type: FlowNodeInputTypeEnum.textarea,
valueType: ModuleIOValueTypeEnum.string,
label: '提取要求描述',
description: '给AI一些对应的背景知识或要求描述引导AI更好的完成任务',
description:
'给AI一些对应的背景知识或要求描述引导AI更好的完成任务。\n该输入框可使用全局变量。',
required: true,
placeholder:
'例如: \n1. 你是一个实验室预约助手,你的任务是帮助用户预约实验室。\n2. 你是谷歌搜索助手,需要从文本中提取出合适的搜索词。',
'例如: \n1. 当前时间为: {{cTime}}。你是一个实验室预约助手,你的任务是帮助用户预约实验室,从文本中获取对应的预约信息。\n2. 你是谷歌搜索助手,需要从文本中提取出合适的搜索词。',
showTargetInApp: true,
showTargetInPlugin: true
},

View File

@@ -0,0 +1,61 @@
import {
FlowNodeInputTypeEnum,
FlowNodeOutputTypeEnum,
FlowNodeTypeEnum
} from '../../node/constant';
import { FlowModuleTemplateType } from '../../type.d';
import {
ModuleIOValueTypeEnum,
ModuleInputKeyEnum,
ModuleOutputKeyEnum,
ModuleTemplateTypeEnum
} from '../../constants';
import {
Input_Template_History,
Input_Template_Switch,
Input_Template_UserChatInput
} from '../input';
export const AiCFR: FlowModuleTemplateType = {
id: FlowNodeTypeEnum.chatNode,
templateType: ModuleTemplateTypeEnum.tools,
flowType: FlowNodeTypeEnum.cfr,
avatar: '/imgs/module/cfr.svg',
name: 'core.module.template.cfr',
intro: 'core.module.template.cfr intro',
showStatus: true,
inputs: [
Input_Template_Switch,
{
key: ModuleInputKeyEnum.aiModel,
type: FlowNodeInputTypeEnum.selectExtractModel,
label: 'core.module.input.label.aiModel',
required: true,
valueType: ModuleIOValueTypeEnum.string,
showTargetInApp: false,
showTargetInPlugin: false
},
{
key: ModuleInputKeyEnum.aiSystemPrompt,
type: FlowNodeInputTypeEnum.textarea,
label: 'core.module.input.label.cfr background',
max: 300,
valueType: ModuleIOValueTypeEnum.string,
description: 'core.module.input.description.cfr background',
placeholder: 'core.module.input.placeholder.cfr background',
showTargetInApp: true,
showTargetInPlugin: true
},
Input_Template_History,
Input_Template_UserChatInput
],
outputs: [
{
key: ModuleOutputKeyEnum.text,
label: 'core.module.output.label.cfr result',
valueType: ModuleIOValueTypeEnum.string,
type: FlowNodeOutputTypeEnum.source,
targets: []
}
]
};

View File

@@ -1,14 +0,0 @@
import { ModuleTemplateTypeEnum } from '../../constants';
import { FlowNodeTypeEnum } from '../../node/constant';
import { FlowModuleTemplateType } from '../../type.d';
export const EmptyModule: FlowModuleTemplateType = {
id: FlowNodeTypeEnum.empty,
templateType: ModuleTemplateTypeEnum.other,
flowType: FlowNodeTypeEnum.empty,
avatar: '/imgs/module/cq.png',
name: '该模块已被移除',
intro: '',
inputs: [],
outputs: []
};

View File

@@ -38,7 +38,7 @@ export type ModuleItemType = {
outputs: FlowNodeOutputItemType[];
};
/* function type */
/* --------------- function type -------------------- */
// variable
export type VariableItemType = {
id: string;
@@ -74,3 +74,46 @@ export type ContextExtractAgentItemType = {
required: boolean;
enum?: string;
};
/* -------------- running module -------------- */
export type RunningModuleItemType = {
name: ModuleItemType['name'];
moduleId: ModuleItemType['moduleId'];
flowType: ModuleItemType['flowType'];
showStatus?: ModuleItemType['showStatus'];
} & {
inputs: {
key: string;
value?: any;
}[];
outputs: {
key: string;
answer?: boolean;
response?: boolean;
value?: any;
targets: {
moduleId: string;
key: string;
}[];
}[];
};
export type ChatDispatchProps = {
res: NextApiResponse;
mode: 'test' | 'chat';
teamId: string;
tmbId: string;
user: UserType;
appId: string;
chatId?: string;
responseChatItemId?: string;
histories: ChatItemType[];
variables: Record<string, any>;
stream: boolean;
detail: boolean; // response detail
};
export type ModuleDispatchProps<T> = ChatDispatchProps & {
outputs: RunningModuleItemType['outputs'];
inputs: T;
};

View File

@@ -15,14 +15,19 @@ export type PluginItemSchema = {
};
/* plugin template */
export type PluginTemplateType = {
export type PluginTemplateType = PluginRuntimeType & {
author?: string;
id: string;
source: `${PluginSourceEnum}`;
templateType: FlowModuleTemplateType['templateType'];
intro: string;
modules: ModuleItemType[];
};
export type PluginRuntimeType = {
teamId?: string;
name: string;
avatar: string;
intro: string;
showStatus?: boolean;
modules: ModuleItemType[];
};

View File

@@ -2,11 +2,12 @@
"name": "@fastgpt/global",
"version": "1.0.0",
"dependencies": {
"axios": "^1.5.1",
"dayjs": "^1.11.7",
"openai": "4.23.0",
"encoding": "^0.1.13",
"js-tiktoken": "^1.0.7",
"axios": "^1.5.1",
"openai": "4.23.0",
"pdfjs-dist": "^4.0.269",
"timezones-list": "^3.0.2"
},
"devDependencies": {

View File

@@ -20,11 +20,12 @@ export async function connectMongo({
console.log('mongo start connect');
try {
mongoose.set('strictQuery', true);
const maxConnecting = Math.max(30, Number(process.env.DB_MAX_LINK || 20));
await mongoose.connect(process.env.MONGODB_URI as string, {
bufferCommands: true,
maxConnecting: Number(process.env.DB_MAX_LINK || 5),
maxPoolSize: Number(process.env.DB_MAX_LINK || 5),
minPoolSize: Math.min(10, Number(process.env.DB_MAX_LINK || 10)),
maxConnecting: maxConnecting,
maxPoolSize: maxConnecting,
minPoolSize: 20,
connectTimeoutMS: 60000,
waitQueueTimeoutMS: 60000,
socketTimeoutMS: 60000,

View File

@@ -9,7 +9,8 @@ export const connectPg = async (): Promise<Pool> => {
global.pgClient = new Pool({
connectionString: process.env.PG_URL,
max: Number(process.env.DB_MAX_LINK || 5),
max: Number(process.env.DB_MAX_LINK || 20),
min: 10,
keepAlive: true,
idleTimeoutMillis: 60000,
connectionTimeoutMillis: 20000

View File

@@ -1,15 +1,15 @@
import { SystemConfigsTypeEnum } from '@fastgpt/global/common/system/config/constants';
import { MongoSystemConfigs } from './schema';
import { FeConfigsType } from '@fastgpt/global/common/system/types';
import { FastGPTConfigFileType } from '@fastgpt/global/common/system/types';
export const getFastGPTFeConfig = async () => {
export const getFastGPTConfigFromDB = async () => {
const res = await MongoSystemConfigs.findOne({
type: SystemConfigsTypeEnum.fastgpt
}).sort({
createTime: -1
});
const config: FeConfigsType = res?.value?.FeConfig || {};
const config = res?.value || {};
return config;
return config as Omit<FastGPTConfigFileType, 'systemEnv'>;
};

View File

@@ -22,7 +22,6 @@ const systemConfigSchema = new Schema({
});
try {
systemConfigSchema.index({ createTime: -1 }, { expireAfterSeconds: 90 * 24 * 60 * 60 });
systemConfigSchema.index({ type: 1 });
} catch (error) {
console.log(error);

View File

@@ -1,14 +1,12 @@
import type { NextApiResponse } from 'next';
import { getAIApi } from '../config';
import { defaultAudioSpeechModels } from '../../../../global/core/ai/model';
import { UserModelSchema } from '@fastgpt/global/support/user/type';
export async function text2Speech({
res,
onSuccess,
onError,
input,
model = defaultAudioSpeechModels[0].model,
model,
voice,
speed = 1
}: {

View File

@@ -0,0 +1,59 @@
import { replaceVariable } from '@fastgpt/global/common/string/tools';
import { getAIApi } from '../config';
const prompt = `
您的任务是生成根据用户问题,从不同角度,生成两个不同版本的问题,以便可以从矢量数据库检索相关文档。例如:
问题: FastGPT如何使用
OUTPUT: ["FastGPT使用教程。","怎么使用FastGPT"]
-------------------
问题: FastGPT如何收费
OUTPUT: ["FastGPT收费标准。","FastGPT是如何计费的"]
-------------------
问题: 怎么FastGPT部署
OUTPUT: ["FastGPT的部署方式。","如何部署FastGPT"]
-------------------
问题 question: {{q}}
OUTPUT:
`;
export const searchQueryExtension = async ({ query, model }: { query: string; model: string }) => {
const ai = getAIApi(undefined, 480000);
const result = await ai.chat.completions.create({
model,
temperature: 0,
messages: [
{
role: 'user',
content: replaceVariable(prompt, { q: query })
}
],
stream: false
});
const answer = result.choices?.[0]?.message?.content || '';
if (!answer) {
return {
queries: [query],
model,
inputTokens: 0,
responseTokens: 0
};
}
try {
return {
queries: JSON.parse(answer) as string[],
model,
inputTokens: result.usage?.prompt_tokens || 0,
responseTokens: result.usage?.completion_tokens || 0
};
} catch (error) {
return {
queries: [query],
model,
inputTokens: 0,
responseTokens: 0
};
}
};

View File

@@ -79,6 +79,10 @@ const TrainingDataSchema = new Schema({
type: Number,
default: 0
},
weight: {
type: Number,
default: 0
},
indexes: {
type: [
{

View File

@@ -3,7 +3,7 @@ import { FlowModuleTemplateType } from '@fastgpt/global/core/module/type';
import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant';
import { plugin2ModuleIO } from '@fastgpt/global/core/module/utils';
import { PluginSourceEnum } from '@fastgpt/global/core/plugin/constants';
import type { PluginTemplateType } from '@fastgpt/global/core/plugin/type.d';
import type { PluginRuntimeType, PluginTemplateType } from '@fastgpt/global/core/plugin/type.d';
import { ModuleTemplateTypeEnum } from '@fastgpt/global/core/module/constants';
/*
@@ -41,6 +41,7 @@ const getPluginTemplateById = async (id: string): Promise<PluginTemplateType> =>
if (!item) return Promise.reject('plugin not found');
return {
id: String(item._id),
teamId: String(item.teamId),
name: item.name,
avatar: item.avatar,
intro: item.intro,
@@ -74,16 +75,14 @@ export async function getPluginPreviewModule({
}
/* run plugin time */
export async function getPluginRuntimeById(id: string): Promise<PluginTemplateType> {
export async function getPluginRuntimeById(id: string): Promise<PluginRuntimeType> {
const plugin = await getPluginTemplateById(id);
return {
id: plugin.id,
source: plugin.source,
templateType: plugin.templateType,
teamId: plugin.teamId,
name: plugin.name,
avatar: plugin.avatar,
intro: plugin.intro,
showStatus: plugin.showStatus,
modules: plugin.modules
};
}

View File

@@ -56,7 +56,7 @@ export async function parseHeaderCert({
async function authCookieToken(cookie?: string, token?: string) {
// 获取 cookie
const cookies = Cookie.parse(cookie || '');
const cookieToken = cookies.token || token;
const cookieToken = token || cookies.token;
if (!cookieToken) {
return Promise.reject(ERROR_ENUM.unAuthorization);
@@ -127,7 +127,7 @@ export async function parseHeaderCert({
authType: AuthUserTypeEnum.apikey
};
}
if (authToken && (cookie || token)) {
if (authToken && (token || cookie)) {
// user token(from fastgpt web)
const res = await authCookieToken(cookie, token);
return {
@@ -182,7 +182,7 @@ export async function parseHeaderCert({
export const setCookie = (res: NextApiResponse, token: string) => {
res.setHeader(
'Set-Cookie',
`token=${token}; Path=/; HttpOnly; Max-Age=604800; Samesite=None; Secure;`
`token=${token}; Path=/; HttpOnly; Max-Age=604800; Samesite=Strict; Secure;`
);
};
/* clear cookie */

View File

@@ -0,0 +1,66 @@
export type CompressImgProps = {
maxW?: number;
maxH?: number;
maxSize?: number;
};
export const compressBase64ImgAndUpload = ({
base64Img,
maxW = 1080,
maxH = 1080,
maxSize = 1024 * 500, // 300kb
uploadController
}: CompressImgProps & {
base64Img: string;
uploadController: (base64: string) => Promise<string>;
}) => {
return new Promise<string>((resolve, reject) => {
const fileType =
/^data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,/.exec(base64Img)?.[1] || 'image/jpeg';
const img = new Image();
img.src = base64Img;
img.onload = async () => {
let width = img.width;
let height = img.height;
if (width > height) {
if (width > maxW) {
height *= maxW / width;
width = maxW;
}
} else {
if (height > maxH) {
width *= maxH / height;
height = maxH;
}
}
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext('2d');
if (!ctx) {
return reject('压缩图片异常');
}
ctx.drawImage(img, 0, 0, width, height);
const compressedDataUrl = canvas.toDataURL(fileType, 1);
// 移除 canvas 元素
canvas.remove();
if (compressedDataUrl.length > maxSize) {
return reject('图片太大了');
}
try {
const src = await uploadController(compressedDataUrl);
resolve(src);
} catch (error) {
reject(error);
}
};
img.onerror = reject;
});
};

View File

@@ -0,0 +1,53 @@
import { uploadMarkdownBase64 } from '@fastgpt/global/common/string/markdown';
import { htmlStr2Md } from '../string/markdown';
/**
* read file raw text
*/
export const readFileRawText = (file: File) => {
return new Promise((resolve: (_: string) => void, reject) => {
try {
const reader = new FileReader();
reader.onload = () => {
resolve(reader.result as string);
};
reader.onerror = (err) => {
console.log('error txt read:', err);
reject('Read file error');
};
reader.readAsText(file);
} catch (error) {
reject(error);
}
});
};
export const readMdFile = async ({
file,
uploadImgController
}: {
file: File;
uploadImgController: (base64: string) => Promise<string>;
}) => {
const md = await readFileRawText(file);
const rawText = await uploadMarkdownBase64({
rawText: md,
uploadImgController
});
return rawText;
};
export const readHtmlFile = async ({
file,
uploadImgController
}: {
file: File;
uploadImgController: (base64: string) => Promise<string>;
}) => {
const md = htmlStr2Md(await readFileRawText(file));
const rawText = await uploadMarkdownBase64({
rawText: md,
uploadImgController
});
return rawText;
};

View File

@@ -0,0 +1,35 @@
import TurndownService from 'turndown';
// @ts-ignore
import * as turndownPluginGfm from 'joplin-turndown-plugin-gfm';
const turndownService = new TurndownService({
headingStyle: 'atx',
bulletListMarker: '-',
codeBlockStyle: 'fenced',
fence: '```',
emDelimiter: '_',
strongDelimiter: '**',
linkStyle: 'inlined',
linkReferenceStyle: 'full'
});
export const htmlStr2Md = (html: string) => {
// 浏览器html字符串转dom
const parser = new DOMParser();
const dom = parser.parseFromString(html, 'text/html');
turndownService.remove(['i', 'script', 'iframe']);
turndownService.addRule('codeBlock', {
filter: 'pre',
replacement(_, node) {
const content = node.textContent?.trim() || '';
// @ts-ignore
const codeName = node?._attrsByQName?.class?.data?.trim() || '';
return `\n\`\`\`${codeName}\n${content}\n\`\`\`\n`;
}
});
turndownService.use(turndownPluginGfm.gfm);
return turndownService.turndown(dom);
};

View File

@@ -1,6 +1,12 @@
{
"name": "@fastgpt/web",
"version": "1.0.0",
"dependencies": {},
"devDependencies": {}
"dependencies": {
"@fastgpt/global": "workspace:*",
"joplin-turndown-plugin-gfm": "^1.0.12",
"turndown": "^7.1.2"
},
"devDependencies": {
"@types/turndown": "^5.0.4"
}
}

759
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,4 @@
LOG_DEPTH=3
# 默认用户密码,用户名为 root每次重启时会自动更新。
DEFAULT_ROOT_PSW=123456
# 数据库最大连接数

View File

@@ -1,16 +1,16 @@
{
"SystemParams": {
"systemEnv": {
"pluginBaseUrl": "",
"vectorMaxProcess": 15,
"qaMaxProcess": 15,
"pgHNSWEfSearch": 100
},
"ChatModels": [
"chatModels": [
{
"model": "gpt-3.5-turbo-1106",
"name": "GPT35-1106",
"model": "gpt-3.5-turbo",
"name": "GPT35",
"price": 0,
"maxContext": 16000,
"maxContext": 4000,
"maxResponse": 4000,
"quoteMaxToken": 2000,
"maxTemperature": 1.2,
@@ -55,7 +55,7 @@
"defaultSystemChatPrompt": ""
}
],
"QAModels": [
"qaModels": [
{
"model": "gpt-3.5-turbo-16k",
"name": "GPT35-16k",
@@ -64,14 +64,14 @@
"price": 0
}
],
"CQModels": [
"cqModels": [
{
"model": "gpt-3.5-turbo",
"name": "GPT35",
"maxContext": 4000,
"maxResponse": 4000,
"price": 0,
"functionCall": true,
"toolChoice": true,
"functionPrompt": ""
},
{
@@ -80,22 +80,22 @@
"maxContext": 8000,
"maxResponse": 8000,
"price": 0,
"functionCall": true,
"toolChoice": true,
"functionPrompt": ""
}
],
"ExtractModels": [
"extractModels": [
{
"model": "gpt-3.5-turbo-1106",
"name": "GPT35-1106",
"maxContext": 16000,
"maxResponse": 4000,
"price": 0,
"functionCall": true,
"toolChoice": true,
"functionPrompt": ""
}
],
"QGModels": [
"qgModels": [
{
"model": "gpt-3.5-turbo-1106",
"name": "GPT35-1106",
@@ -104,17 +104,18 @@
"price": 0
}
],
"VectorModels": [
"vectorModels": [
{
"model": "text-embedding-ada-002",
"name": "Embedding-2",
"price": 0.2,
"defaultToken": 700,
"maxToken": 3000
"maxToken": 3000,
"weight": 100
}
],
"ReRankModels": [],
"AudioSpeechModels": [
"reRankModels": [],
"audioSpeechModels": [
{
"model": "tts-1",
"name": "OpenAI TTS1",
@@ -129,7 +130,7 @@
]
}
],
"WhisperModel": {
"whisperModel": {
"model": "whisper-1",
"name": "Whisper1",
"price": 0

View File

@@ -10,6 +10,9 @@
"quoteTemplate": false,
"quotePrompt": false
},
"cfr": {
"background": true
},
"dataset": {
"datasets": true,
"similarity": false,

View File

@@ -7,7 +7,7 @@ module.exports = {
i18n: {
defaultLocale: 'zh',
locales: ['en', 'zh'],
localeDetection: true
localeDetection: false
},
localePath:
typeof window === 'undefined' ? require('path').resolve('./public/locales') : '/public/locales',

View File

@@ -1,6 +1,6 @@
{
"name": "app",
"version": "4.6.5",
"version": "4.6.6",
"private": false,
"scripts": {
"dev": "next dev",
@@ -17,32 +17,38 @@
"@chakra-ui/system": "^2.6.1",
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
"@fastgpt/plugins": "workspace:*",
"@fastgpt/global": "workspace:*",
"@fastgpt/plugins": "workspace:*",
"@fastgpt/service": "workspace:*",
"@fastgpt/web": "workspace:*",
"@node-rs/jieba": "^1.7.2",
"@tanstack/react-query": "^4.24.10",
"@types/nprogress": "^0.2.0",
"axios": "^1.5.1",
"date-fns": "^2.30.0",
"dayjs": "^1.11.7",
"echarts": "^5.4.1",
"next": "13.5.2",
"echarts-gl": "^2.0.9",
"formidable": "^2.1.1",
"framer-motion": "^9.0.6",
"hyperdown": "^2.4.29",
"i18next": "^22.5.1",
"immer": "^9.0.19",
"jschardet": "^3.0.0",
"jsonwebtoken": "^9.0.2",
"lodash": "^4.17.21",
"mammoth": "^1.6.0",
"mermaid": "^10.2.3",
"nanoid": "^4.0.1",
"next": "13.5.2",
"next-i18next": "^13.3.0",
"nprogress": "^0.2.0",
"papaparse": "^5.4.1",
"react": "18.2.0",
"react-day-picker": "^8.7.1",
"react-dom": "18.2.0",
"react-hook-form": "^7.43.1",
"react-i18next": "^12.3.1",
"react-markdown": "^8.0.7",
"react-syntax-highlighter": "^15.5.0",
"reactflow": "^11.7.4",
@@ -52,13 +58,7 @@
"remark-math": "^5.1.1",
"request-ip": "^3.3.0",
"sass": "^1.58.3",
"zustand": "^4.3.5",
"i18next": "^22.5.1",
"next-i18next": "^13.3.0",
"react-i18next": "^12.3.1",
"axios": "^1.5.1",
"nanoid": "^4.0.1",
"dayjs": "^1.11.7"
"zustand": "^4.3.5"
},
"devDependencies": {
"@svgr/webpack": "^6.5.1",

View File

@@ -1,13 +1,14 @@
### Fast GPT V4.6.4
### Fast GPT V4.6.5
1. 重写 - 分享链接身份逻辑,采用 localID 记录用户的ID。
2. 商业版新增 - 分享链接 SSO 方案,通过`身份鉴权`地址,仅需`3个接口`即可完全接入已有用户系统。具体参考[分享链接身份鉴权](https://doc.fastgpt.in/docs/development/openapi/share/)
3. 新增 - 分享链接更多嵌入方式提示更多DIY方式。
4. 优化 - 历史记录模块。弃用旧的历史记录模块,直接在对应地方填写数值即可。
5. 调整 - 知识库搜索模块 topk 逻辑,采用 MaxToken 计算,兼容不同长度的文本块
6. 链接读取支持多选择器。参考[Web 站点同步用法](https://doc.fastgpt.in/docs/course/websync)
7. [知识库结构详解](https://doc.fastgpt.in/docs/use-cases/datasetengine/)
8. [知识库提示词详解](https://doc.fastgpt.in/docs/use-cases/ai_settings/#引用模板--引用提示词)
9. [使用文档](https://doc.fastgpt.in/docs/intro/)
10. [点击查看高级编排介绍文档](https://doc.fastgpt.in/docs/workflow)
11. [点击查看商业版](https://doc.fastgpt.in/docs/commercial/)
1. 新增 - [问题补全模块](https://doc.fastgpt.in/docs/workflow/modules/coreferenceresolution/)
2. 新增 - [文本编辑模块](https://doc.fastgpt.in/docs/workflow/modules/text_editor/)
3. 新增 - [判断器模块](https://doc.fastgpt.in/docs/workflow/modules/tfswitch/)
4. 新增 - [自定义反馈模块](https://doc.fastgpt.in/docs/workflow/modules/custom_feedback/)
5. 新增 - 【内容提取】模块支持选择模型,以及字段枚举
6. 优化 - docx读取兼容表格表格转markdown
7. 优化 - 高级编排连接线交互
8. 优化 - 由于 html2md 导致的 cpu密集计算阻断线程问题
9. 修复 - 高级编排提示词提取描述
10. [使用文档](https://doc.fastgpt.in/docs/intro/)
11. [点击查看高级编排介绍文档](https://doc.fastgpt.in/docs/workflow)
12. [点击查看商业版](https://doc.fastgpt.in/docs/commercial/)

View File

@@ -1,3 +1,520 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1440" height="900" viewBox="0 0 1440 900" fill="none"><defs><path id="path_0"
transform="translate(0 0) rotate(0 720 450)"
d="M0,900L1440,900L1440,0L0,0L0,900Z" /><linearGradient id="linear_0" x1="45.776671171188354%" y1="3.4534157006028896%" x2="45.77667520943754%" y2="95.15074645348403%" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#4D3AF9" stop-opacity="1" /><stop offset="0.4571722174852774" stop-color="#3B4DFE" stop-opacity="1" /><stop offset="1" stop-color="#1A68FF" stop-opacity="1" /></linearGradient><linearGradient id="linear_1" x1="50%" y1="2.535076530612245%" x2="51%" y2="100%" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#4581FF" stop-opacity="1" /><stop offset="1" stop-color="#1C57FE" stop-opacity="1" /></linearGradient><linearGradient id="linear_2" x1="50%" y1="2.535076530612245%" x2="51%" y2="100%" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#4581FF" stop-opacity="1" /><stop offset="1" stop-color="#1C57FE" stop-opacity="1" /></linearGradient><linearGradient id="linear_3" x1="50%" y1="0%" x2="51%" y2="100%" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#29BFA8" stop-opacity="1" /><stop offset="1" stop-color="#34D1B6" stop-opacity="1" /></linearGradient><linearGradient id="linear_4" x1="50%" y1="2.535076530612245%" x2="51%" y2="100%" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#4581FF" stop-opacity="1" /><stop offset="1" stop-color="#1C57FE" stop-opacity="1" /></linearGradient></defs><g opacity="1" transform="translate(0 0) rotate(0 720 450)"><mask id="mask-0" fill="white"><use xlink:href="#path_0"></use></mask><g mask="url(#mask-0)"><path id="Mask" fill-rule="evenodd" fill="url(#linear_0)" transform="translate(0 0) rotate(0 720 450)" opacity="1" d="M0,900L1440,900L1440,0L0,0L0,900Z " /></g><g mask="url(#mask-0)"><path id="Oval" fill-rule="evenodd" fill="url(#linear_1)" transform="translate(51.66666666666667 412.5) rotate(0 37.5 37.5)" opacity="1" d="M75,37.5C75,16.79 58.21,0 37.5,0C16.79,0 0,16.79 0,37.5C0,58.21 16.79,75 37.5,75C58.21,75 75,58.21 75,37.5Z " /></g><g mask="url(#mask-0)"><path id="Oval Copy 2" fill-rule="evenodd" fill="url(#linear_2)" transform="translate(1049.166666666667 -3.333333333333333) rotate(0 30.833333333333336 30.833333333333336)" opacity="0.69" d="M61.67,30.83C61.67,13.81 47.86,0 30.83,0C13.81,0 0,13.81 0,30.83C0,47.86 13.81,61.67 30.83,61.67C47.86,61.67 61.67,47.86 61.67,30.83Z " /></g><g mask="url(#mask-0)"><g opacity="0.55" transform="translate(-64.16666666666667 547.4999999999999) rotate(0 50 226.5)"><path id="Rectangle 2" fill-rule="evenodd" style="fill:#5088FF" transform="translate(14.63769413070223 15.28431509376342) rotate(-45 35.20283757354478 34.876453649023716)" opacity="1" d="M8.17,61.88L70.41,69.75L47.22,22.97L0,0L8.17,61.88Z " /><path id="Rectangle 3" fill-rule="evenodd" fill="url(#linear_3)" transform="translate(0 50.20419426048581) rotate(0 26.487523940001577 201.14790286975716)" opacity="1" d="M0,402.3L51.51,402.3L52.98,23.25L0,0L0,402.3Z " /><path id="Rectangle 3 Copy" fill-rule="evenodd" fill="url(#linear_4)" transform="translate(48.48484848484848 50.20419426048581) rotate(0 25.75757575757576 201.14790286975716)" opacity="1" d="M0,402.3L51.52,402.3L51.52,0L0,21.68L0,402.3Z " /></g></g></g></svg>
<svg width="1440" height="790" viewBox="0 0 1440 790" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_840_3557)">
<rect width="1440" height="1554.93" fill="url(#paint0_linear_840_3557)" />
<g opacity="0.8">
<g filter="url(#filter0_f_840_3557)">
<path d="M880.644 1048.09C1001.07 777.557 1142.27 561.127 1561.69 561.127V1784.79H182.987C158.071 1782.01 154.749 1725.69 274.347 1589.17C423.845 1418.52 760.215 1318.63 880.644 1048.09Z"
fill="url(#paint1_linear_840_3557)" />
</g>
<g filter="url(#filter1_f_840_3557)">
<path d="M880.644 912.883C1001.07 642.346 1142.27 425.916 1561.69 425.916V1649.58H182.987C158.071 1646.8 154.749 1590.48 274.347 1453.96C423.845 1283.31 760.215 1183.42 880.644 912.883Z"
fill="url(#paint2_linear_840_3557)" />
</g>
<g filter="url(#filter2_f_840_3557)">
<path d="M910.644 912.883C1031.07 642.346 1172.27 425.916 1591.69 425.916V1649.58H212.987C188.071 1646.8 184.749 1590.48 304.347 1453.96C453.845 1283.31 790.215 1183.42 910.644 912.883Z"
fill="url(#paint3_linear_840_3557)" fill-opacity="0.6" />
</g>
<g filter="url(#filter3_f_840_3557)">
<path d="M378.148 168.195C426.329 59.5163 695.475 171.617 695.475 -31.249L-103.612 -2.20793V880.857C-34.991 801.16 84.6279 552.269 102.148 407.365C124.049 226.234 329.967 276.873 378.148 168.195Z"
fill="url(#paint4_linear_840_3557)" fill-opacity="0.5" />
</g>
<g filter="url(#filter4_f_840_3557)">
<path d="M321.937 142.838C370.118 34.1595 462.149 175.301 462.149 -27.5647H-159.823V883.985C-91.2019 804.288 28.4171 526.913 45.9374 382.008C67.8378 200.878 273.756 251.516 321.937 142.838Z"
fill="url(#paint5_linear_840_3557)" fill-opacity="0.7" />
</g>
<g filter="url(#filter5_f_840_3557)">
<path d="M321.937 142.838C370.118 34.1592 659.226 175.301 659.226 -27.5649H-159.823V912.138C-91.2018 832.441 20.288 523.626 45.9374 382.008C82.7516 178.746 273.757 251.516 321.937 142.838Z"
fill="url(#paint6_linear_840_3557)" fill-opacity="0.3" />
</g>
<g filter="url(#filter6_f_840_3557)">
<path d="M1160.33 90.5001C1112.15 24.1581 843 92.5893 843 -31.249L1642.09 -13.5211V525.54C1573.47 476.89 1453.85 324.956 1436.33 236.5C1414.43 125.93 1208.51 156.842 1160.33 90.5001Z"
fill="url(#paint7_linear_840_3557)" fill-opacity="0.5" />
</g>
<g filter="url(#filter7_f_840_3557)">
<path d="M1195.98 75.0211C1154.87 8.67914 1076.33 94.8384 1076.33 -29H1607.12V527.45C1548.55 478.799 1446.47 309.477 1431.52 221.021C1412.83 110.451 1237.1 141.363 1195.98 75.0211Z"
fill="url(#paint8_linear_840_3557)" fill-opacity="0.6" />
</g>
<g filter="url(#filter8_f_840_3557)">
<path d="M1183.95 75.0211C1140.42 8.67914 879.249 94.8384 879.249 -29H1619.16V544.636C1557.17 495.985 1456.45 307.471 1433.28 221.021C1400.02 96.9411 1227.47 141.363 1183.95 75.0211Z"
fill="url(#paint9_linear_840_3557)" fill-opacity="0.3" />
</g>
</g>
<path d="M-70.5413 -25.0416C423.19 -27.0733 916.922 -29.5053 1410.65 -32.3374C1613.26 171.573 1751.4 466.358 2003.66 551.32C2218.17 623.724 2399.55 687.261 2596.67 837.608C1188.12 835.392 -220.336 835.392 -1628.71 837.608C-1492.29 758.648 -1357.59 677.195 -1210.07 652.906C-1089.86 632.774 -969.772 654.199 -849.425 644.225C-518.074 616.243 -330.676 208.606 -70.5413 -25.0416Z"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M-1284.49 667.689C-680.247 749.235 -86.3136 971.8 523.621 964.228C1133.56 956.655 1726.3 725.87 2331.74 656.237"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M-1026.3 642.662C-517.139 840.57 14.24 1199.45 554.083 1160.93C1098.69 1122.15 1610.96 769.829 2134.47 589.283"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M-825.341 642.664C-379.065 871.418 90.0907 1192.52 578.092 1144.68C1067.48 1096.57 1522.09 758.473 1981.33 546.065"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M-664.989 594.648C-262.686 773.901 167.522 999.145 597.201 947.521C1031.57 895.343 1445.32 659.94 1859.32 485.766"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M-533.668 495.451C-159.402 621.14 225.246 750.893 613.068 712.198C1002.68 673.319 1381.44 520.293 1759.8 394.696"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M-424.305 378.626C-75.8938 458.417 272.65 520.846 626.352 498.128C980.053 475.409 1328.99 379.087 1677.01 295.417"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M-331.73 264.677C322.905 357.028 955.389 307.066 1607.11 201.878" stroke="#1767F9"
stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M-252.432 164.481C348.775 210.01 947.204 180.365 1547.35 120.891" stroke="#1767F9"
stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M-183.93 82.362C375.685 100.001 936.092 84.8555 1495.64 54.6567" stroke="#1767F9"
stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M-123.644 19.6628C400.924 22.8951 925.757 16.4305 1450.13 4.33252" stroke="#1767F9"
stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M1275 -31.689C1421.46 178.963 1527.79 582.999 1740.32 678.12C1806.97 708.042 1872.57 691.973 1940.48 699.361C2046.28 710.905 2117.56 754.771 2205.64 836.871"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M1139.7 -30.9485C1214.29 135.93 1262.89 303.547 1321.54 482.153C1347.47 560.929 1406.45 777.676 1478.06 819.696C1606.01 895.054 1677.3 709.706 1816.36 837.058"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M1004.61 -30.2087C1050.9 155.417 1085.09 342.704 1118.15 534.055C1130.78 607.013 1162.05 919.343 1216.48 955.452C1301.45 1011.88 1348.73 709.522 1428.07 837.428"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M869.624 -29.5576C890.916 197.441 905.728 424.809 920.342 652.823C929.203 791.35 927.285 953.887 964.183 1085.39C988.715 1033.12 994.666 828.105 1041.61 837.71"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M734.787 -29.0005C718.454 364.23 732.472 773.991 691.541 1163.8C677.06 1081.24 696.963 895.986 656.164 837.621"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M600.184 -28.6396C552.177 240.748 529.099 509.028 496.235 782.756C491.012 826.53 474.679 1144.68 436.128 1165.83C350.496 1212.93 368.747 830.594 272.072 837.612"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M465.746 -28.4609C390.298 205.833 347.78 447.331 298.12 693.446C287.474 746.086 242.245 1059.99 177.508 1106.62C55.2438 1194.54 25.4215 738.79 -110.729 837.698"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M331.428 -27.3401C220.669 197.257 162.677 446.882 81.6743 692.997C59.7209 759.675 -10.0408 1005.97 -80.3976 1034.23C-234.997 1096.29 -323.472 677.667 -492.289 837.249"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M197.259 -26.5129C71.6218 158.189 -5.34748 380.385 -105.262 591.592C-160.278 707.861 -231.362 877.879 -337.625 907.616C-430.596 933.198 -515.037 843.525 -600.405 806.585C-702.766 762.256 -776.164 773.708 -872.508 836.876"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<path d="M63.3342 -25.5923C-137.619 202.884 -309.544 735.287 -593.88 775.552C-701.135 790.698 -808.455 732.332 -915.114 723.928C-1037.97 714.231 -1141.13 762.53 -1251.23 836.873"
stroke="#1767F9" stroke-opacity="0.2" stroke-width="0.953599" stroke-miterlimit="10" />
<g filter="url(#filter9_d_840_3557)">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M-55.9287 563.247L-55.4835 567.249L-36.8704 664.385L-35.5979 669.183L-33.6794 673.806L-31.1666 678.2L-28.114 682.313L-24.5789 686.096L-20.6207 689.496L-16.3008 692.464L-11.6823 694.953L-6.82928 696.916L-1.80666 698.311L3.32027 699.095L8.4863 699.229L112.617 695.16L116.878 694.683L120.748 693.632L124.203 692.056L127.219 690.004L124.432 692.855L121.884 695.328L119.222 698.054L121.883 695.329L121.884 695.328L124.432 692.855L127.219 690.004L129.777 687.522L124.435 692.853L124.434 692.854L124.432 692.855L121.884 695.328L119.222 698.054L114.139 703.126L109.178 708.075L106.657 710.523L103.703 712.56L100.338 714.139L96.5836 715.213L92.4652 715.734L-7.62892 721.098L-12.5699 721.038L-17.4626 720.349L-22.2458 719.07L-26.858 717.238L-31.2384 714.895L-35.3268 712.084L-39.064 708.851L-42.3923 705.242L-45.2558 701.305L-47.6007 697.088L-49.3755 692.64L-50.5313 688.01L-67.1749 593.762L-67.5552 589.855L-67.3109 586.158L-63.694 576.261L-62.3212 573.067L-59.4581 566.456L-56.5243 559.681L-53.5189 552.741L-54.9015 555.958L-55.7202 559.473L-55.9287 563.247Z"
fill="url(#paint10_linear_840_3557)" />
<path fill-rule="evenodd" clip-rule="evenodd"
d="M-35.6235 541.035L-31.4027 540.596L-26.9199 540.656L66.7862 547.1L70.8197 547.61L74.8148 548.558L78.7338 549.91L82.5393 551.634L86.1934 553.698L89.658 556.072L92.8941 558.726L95.8622 561.632L98.5215 564.761L100.83 568.086L102.745 571.58L104.222 575.216L134.475 666.156L134.475 666.159L135.045 670.278L135.051 674.227L134.511 677.968L133.441 681.46L131.857 684.659L129.778 687.522L127.22 690.004L124.203 692.056L120.748 693.632L116.879 694.683L112.617 695.16L8.48855 699.229L3.7256 699.394L-1.53434 698.637L-6.82925 696.916L-11.6823 694.953L-16.3008 692.464L-20.6207 689.496L-24.5788 686.096L-28.114 682.313L-31.1665 678.2L-33.6791 673.806L-35.5979 669.183L-36.8704 664.385L-55.4834 567.249L-55.9287 563.247L-55.7202 559.473L-54.9015 555.958L-53.516 552.734L-51.6067 549.83L-49.2154 547.273L-46.3829 545.09L-43.1486 543.306L-39.5501 541.946L-35.6235 541.035ZM134.475 666.156L104.222 575.216L133.326 661.908L134.475 666.156Z"
fill="url(#paint11_linear_840_3557)" />
<path d="M133.925 666.287L134.482 670.317L134.488 674.187L133.96 677.845L132.916 681.251L131.373 684.367L129.351 687.152L126.862 689.566L123.926 691.563L120.556 693.101L116.773 694.128L112.575 694.598L8.46903 698.666L8.46656 698.666L3.75628 698.83L-1.40625 698.086L-6.63645 696.387L-11.4423 694.442L-16.0068 691.983L-20.2767 689.049L-24.1885 685.688L-27.6807 681.952L-30.6942 677.891L-33.1725 673.557L-35.0632 669.002L-36.3209 664.26L-54.9261 567.165L-55.3637 563.231L-55.1605 559.553L-54.3642 556.135L-53.0181 553.002L-51.1624 550.18L-48.8353 547.691L-46.0731 545.562L-42.9118 543.818L-39.3862 542.486L-35.5303 541.591L-31.3772 541.16L-26.943 541.219L66.7316 547.661L70.7191 548.165L74.6574 549.099L78.5252 550.434L82.2841 552.137L85.8951 554.177L89.3197 556.523L92.5178 559.146L95.4497 562.016L98.0746 565.105L100.351 568.383L102.236 571.822L103.693 575.411L133.925 666.287Z"
stroke="url(#paint12_linear_840_3557)" stroke-opacity="0.4" stroke-width="1.1265" />
<g opacity="0.9">
<path d="M60.2163 594.205L68.0712 594.419L75.7403 629.021C75.7929 633.977 75.8523 644.12 75.669 645.04C75.6409 645.18 75.0891 645.463 74.1343 645.852L74.4415 647.267L77.7979 643.695L74.6109 651.899C72.835 658.306 61.909 663.606 42.6378 664.7C20.7273 665.945 7.00971 660.675 4.59185 653.2C2.83889 649.198 -5.78533 604.651 -6.29329 601.483C-6.82084 598.192 -4.22121 592.445 -4.22121 592.445L2.96305 592.641C8.04514 589.947 15.9615 588.311 25.9283 587.745C40.5744 586.913 53.7724 589.164 60.2163 594.205Z"
fill="url(#paint13_linear_840_3557)" />
<path d="M67.9714 593.284L67.5523 591.354L67.5109 591.173C65.3579 582.247 48.2816 578.014 28.6242 579.131C8.96571 580.247 -5.89717 586.221 -4.15137 595.243L-3.69298 597.354L-3.67531 597.353C-3.65481 597.502 -3.62821 597.652 -3.59541 597.803C-2.12166 604.591 11.8219 609.369 34.9052 608.058C57.9886 606.747 69.5427 600.521 68.069 593.733C68.0362 593.582 67.9976 593.433 67.9535 593.285L67.9714 593.284Z"
fill="#E7F4FF" />
<path d="M-1.39079 607.957L1.58237 621.65C1.58853 621.682 1.59579 621.714 1.60307 621.746L1.61388 621.795C3.08587 628.574 17.028 633.345 40.1113 632.034C63.1947 630.723 74.7503 624.504 73.2783 617.724C73.2677 617.676 73.2566 617.628 73.2449 617.579L70.2736 603.887L70.027 603.901C69.4958 610.187 58.0443 615.667 36.8193 616.873C15.5943 618.078 2.07081 614.016 -1.14416 607.943L-1.39079 607.957Z"
fill="#E7F4FF" />
<path d="M3.52431 630.593L6.51291 644.357L6.52976 644.356C8.71317 651.972 22.7352 657.369 45.3337 656.086C67.9322 654.802 79.2973 647.963 78.1605 640.288L78.1773 640.287L75.1887 626.523C76.7896 633.896 65.3385 640.597 42.2551 641.908C19.1718 643.219 5.12518 637.966 3.52431 630.593Z"
fill="#E7F4FF" />
<path d="M-3.27031 596.868L-3.32552 596.871L-3.68358 595.222C-4.49448 591.015 -1.4555 587.386 4.46743 584.64C10.357 581.91 18.9269 580.144 28.7234 579.587C38.5185 579.031 47.6401 579.81 54.559 581.822C61.5201 583.847 66.0414 587.048 67.0461 591.208C67.0463 591.208 67.0465 591.209 67.0467 591.21L67.0857 591.38L67.0863 591.383L67.4056 592.854L67.3495 592.857L67.496 593.347C67.5367 593.483 67.5721 593.621 67.6024 593.76C67.9375 595.303 67.5431 596.848 66.3595 598.34C65.1719 599.837 63.2019 601.261 60.4396 602.531C54.9161 605.069 46.3176 606.947 34.8061 607.601C23.2945 608.255 14.0998 607.387 7.62196 605.53C4.38241 604.602 1.84948 603.434 0.04872 602.106C-1.74595 600.784 -2.79367 599.32 -3.12878 597.777C-3.15904 597.638 -3.18354 597.499 -3.20241 597.362L-3.27031 596.868ZM2.05132 621.634L2.05146 621.634L2.04901 621.623L-0.568892 609.566C1.57803 612.139 5.56631 614.2 11.03 615.579C17.534 617.22 26.2758 617.934 36.9185 617.33C47.5611 616.725 55.7838 615.048 61.4252 612.717C66.1642 610.759 69.1709 608.3 70.1621 605.55L72.7783 617.606L72.7781 617.606L72.7809 617.617C72.7917 617.662 72.8019 617.706 72.8116 617.751C73.1463 619.292 72.7517 620.836 71.5677 622.326C70.3798 623.821 68.4094 625.243 65.6468 626.511C60.1227 629.047 51.5238 630.924 40.0122 631.578C28.5006 632.231 19.3062 631.365 12.8288 629.511C9.5895 628.584 7.0569 627.417 5.25653 626.092C3.46224 624.771 2.41514 623.309 2.08053 621.768L2.07997 621.766L2.06916 621.717L2.06887 621.716C2.06131 621.682 2.0558 621.658 2.05132 621.634ZM6.98872 644.299L6.92276 644.069L4.7451 634.04C6.69644 636.473 10.1275 638.489 14.75 639.94C21.4301 642.037 30.7795 643.022 42.3543 642.364C53.9291 641.707 62.6282 639.697 68.2461 636.902C72.1335 634.967 74.616 632.615 75.4762 630.023L77.6539 640.052L77.6882 640.284C78.2175 643.857 75.8503 647.369 70.3761 650.173C64.9224 652.966 56.4982 654.989 45.2345 655.629C33.9709 656.269 24.8841 655.24 18.3648 653.127C11.8211 651.005 8.00522 647.845 6.98872 644.299Z"
stroke="white" stroke-opacity="0.4" stroke-width="0.934774" />
</g>
</g>
<g filter="url(#filter10_d_840_3557)">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M97.531 286.901L97.166 289.3L92.8506 348.738L92.8429 351.729L93.2387 354.719L94.016 357.668L95.1511 360.538L96.6188 363.291L98.3923 365.887L100.444 368.288L102.744 370.457L105.262 372.357L107.968 373.952L110.83 375.208L113.815 376.092L175.057 389.963L177.611 390.35L180.027 390.342L182.284 389.963L184.359 389.239L182.293 390.464L180.424 391.506L178.45 392.677L180.423 391.506L180.424 391.506L182.293 390.464L184.359 389.239L186.235 388.194L182.295 390.463L182.294 390.463L182.293 390.464L180.424 391.506L178.45 392.677L174.7 394.836L171.041 396.943L169.192 397.975L167.155 398.7L164.95 399.094L162.597 399.133L160.119 398.795L101.025 386.307L98.1589 385.501L95.4186 384.337L92.8343 382.846L90.4355 381.061L88.2514 379.014L86.3102 376.741L84.6393 374.276L83.265 371.656L82.2123 368.918L81.5052 366.098L81.1659 363.233L81.2152 360.358L86.2265 302.907L86.6145 300.574L87.3332 298.461L90.9819 293.264L92.2789 291.62L94.9763 288.218L97.7404 284.733L100.572 281.162L99.2656 282.819L98.241 284.737L97.531 286.901Z"
fill="url(#paint14_linear_840_3557)" />
<path fill-rule="evenodd" clip-rule="evenodd"
d="M112.813 277.139L115.338 277.543L117.938 278.276L171.472 296.641L173.74 297.566L175.918 298.741L177.988 300.14L179.934 301.736L181.739 303.508L183.385 305.43L184.855 307.479L186.129 309.633L187.189 311.869L188.014 314.164L188.584 316.496L188.876 318.843L192.301 376.491L192.301 376.492L191.991 378.978L191.378 381.278L190.48 383.371L189.313 385.236L187.892 386.852L186.236 388.194L184.36 389.239L182.284 389.963L180.027 390.342L177.611 390.35L175.057 389.963L113.817 376.092L111.019 375.445L108.075 374.184L105.262 372.357L102.744 370.457L100.444 368.288L98.3923 365.887L96.6188 363.291L95.1511 360.538L94.016 357.668L93.2388 354.719L92.8429 351.729L92.8506 348.738L97.166 289.3L97.531 286.901L98.241 284.737L99.2656 282.819L100.575 281.159L102.139 279.766L103.929 278.651L105.919 277.822L108.079 277.288L110.386 277.057L112.813 277.139ZM192.301 376.491L188.876 318.843L192.295 373.839L192.301 376.491Z"
fill="url(#paint15_linear_840_3557)" />
<path d="M191.912 376.48L191.609 378.904L191.011 381.151L190.136 383.191L189.001 385.004L187.623 386.571L186.017 387.871L184.2 388.884L182.187 389.586L179.994 389.954L177.64 389.962L175.129 389.581L113.904 375.714L113.902 375.714L111.14 375.075L108.259 373.84L105.485 372.039L102.994 370.16L100.725 368.02L98.7009 365.651L96.9511 363.09L95.5038 360.375L94.3853 357.547L93.6202 354.644L93.231 351.704L93.2386 348.752L97.5519 289.343L97.9098 286.991L98.5992 284.89L99.5916 283.032L100.858 281.426L102.372 280.078L104.108 278.997L106.04 278.191L108.145 277.671L110.398 277.446L112.776 277.526L115.255 277.922L117.822 278.647L171.336 297.004L173.575 297.918L175.717 299.073L177.756 300.451L179.674 302.026L181.455 303.773L183.079 305.669L184.529 307.691L185.786 309.815L186.83 312.018L187.642 314.276L188.201 316.567L188.489 318.878L191.912 376.48Z"
stroke="url(#paint16_linear_840_3557)" stroke-opacity="0.4" stroke-width="0.776052" />
<g opacity="0.9">
<g clip-path="url(#clip1_840_3557)">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M162.265 319.674C164.781 323.14 166.777 326.839 168.187 330.667C169.64 334.629 170.414 338.562 170.472 342.35C170.523 346.116 169.871 349.512 168.526 352.441C168.226 353.094 167.895 353.717 167.533 354.311L169.518 352.609L166.153 356.25C165.214 357.385 164.133 358.373 162.917 359.206C162.885 359.228 162.852 359.25 162.819 359.272L162.807 359.283L162.812 359.278C160.419 360.893 157.615 361.826 154.487 362.06C151.242 362.296 147.786 361.77 144.203 360.481L144.077 360.435C139.924 358.923 135.789 356.408 132.068 353.146L122.972 349.873C121.456 349.328 120.199 347.601 120.17 346.02L119.996 336.557C118.069 332.054 116.995 327.406 116.898 323.079C116.811 319.3 117.439 315.883 118.748 312.928C119.76 310.655 121.148 308.734 122.883 307.192L122.862 307.194L123.059 307.038C123.399 306.745 123.751 306.466 124.117 306.201L127.952 303.168C127.704 303.394 127.466 303.624 127.239 303.855L127.266 303.835L127.191 303.904C126.872 304.23 126.574 304.558 126.302 304.875C128.217 303.915 130.347 303.333 132.658 303.133C135.933 302.852 139.424 303.366 143.049 304.652L143.169 304.695C146.77 305.991 150.271 307.974 153.587 310.596C156.83 313.154 159.749 316.215 162.265 319.674ZM129.625 301.844C129.034 302.24 128.472 302.694 127.952 303.168L129.625 301.844ZM128.85 327.25C128.88 328.9 130.193 330.702 131.775 331.271C133.363 331.842 134.62 330.965 134.59 329.315C134.56 327.665 133.247 325.863 131.665 325.294C130.083 324.725 128.82 325.6 128.85 327.25ZM140.81 331.553C140.84 333.203 142.153 335.005 143.735 335.574C145.316 336.143 146.58 335.268 146.55 333.618C146.52 331.969 145.207 330.167 143.625 329.597C142.043 329.028 140.779 329.903 140.81 331.553ZM152.77 335.856C152.8 337.506 154.113 339.308 155.694 339.877C157.276 340.447 158.54 339.572 158.51 337.922C158.48 336.272 157.167 334.47 155.585 333.901C154.003 333.332 152.739 334.207 152.77 335.856Z"
fill="url(#paint17_linear_840_3557)" />
</g>
<g clip-path="url(#clip2_840_3557)">
<path d="M172.714 326.375C171.361 322.566 169.415 318.883 166.943 315.432C164.47 311.987 161.585 308.938 158.365 306.387C155.073 303.774 151.585 301.795 147.984 300.499L147.864 300.456C144.239 299.17 140.735 298.652 137.436 298.925C134.25 299.189 131.395 300.167 128.954 301.844C126.513 303.521 124.6 305.803 123.275 308.636C121.908 311.572 121.219 314.968 121.242 318.726C121.267 323.029 122.268 327.653 124.131 332.135L124.146 341.545C124.148 343.117 125.384 344.836 126.9 345.382L135.996 348.655C139.684 351.906 143.802 354.415 147.954 355.927L148.08 355.973C151.663 357.262 155.132 357.792 158.401 357.564C161.599 357.335 164.472 356.388 166.931 354.743C169.395 353.099 171.332 350.838 172.687 348.028C174.09 345.117 174.804 341.742 174.816 337.997C174.822 334.231 174.11 330.318 172.714 326.375ZM136.071 326.902C134.489 326.333 133.199 324.538 133.196 322.898C133.194 321.257 134.48 320.39 136.062 320.959C137.644 321.528 138.934 323.322 138.936 324.963C138.939 326.604 137.659 327.473 136.071 326.902ZM148.031 331.205C146.449 330.636 145.158 328.841 145.156 327.201C145.153 325.56 146.44 324.693 148.022 325.262C149.603 325.831 150.894 327.626 150.896 329.266C150.899 330.907 149.612 331.774 148.031 331.205ZM159.99 335.508C158.409 334.939 157.118 333.145 157.116 331.504C157.113 329.864 158.4 328.996 159.981 329.565C161.563 330.134 162.854 331.929 162.856 333.57C162.859 335.21 161.572 336.078 159.99 335.508Z"
fill="url(#paint18_linear_840_3557)" />
<path d="M158.22 306.692L158.221 306.692C161.395 309.207 164.239 312.212 166.678 315.61C169.117 319.014 171.035 322.644 172.369 326.4C173.745 330.288 174.448 334.146 174.442 337.86C174.43 341.555 173.726 344.883 172.343 347.752C171.006 350.523 169.097 352.752 166.666 354.373L166.666 354.373C164.242 355.996 161.41 356.929 158.257 357.155C155.033 357.38 151.614 356.857 148.08 355.586L147.955 355.541C147.955 355.541 147.955 355.541 147.955 355.541C143.861 354.049 139.8 351.575 136.164 348.37L136.085 348.3L135.995 348.268L126.9 344.995C125.591 344.524 124.522 343.039 124.52 341.679L124.506 332.269L124.506 332.177L124.466 332.081C122.628 327.662 121.641 323.102 121.617 318.859L121.617 318.859C121.593 315.153 122.273 311.804 123.621 308.909C124.928 306.115 126.814 303.866 129.221 302.212C131.627 300.558 134.442 299.594 137.584 299.333C140.836 299.064 144.29 299.575 147.866 300.843L147.984 300.886C151.536 302.164 154.975 304.115 158.22 306.692ZM132.822 322.763C132.824 324.617 134.282 326.645 136.071 327.289C137.867 327.935 139.314 326.951 139.311 325.098C139.308 323.244 137.85 321.216 136.061 320.572C134.272 319.928 132.819 320.909 132.822 322.763ZM144.782 327.066C144.784 328.92 146.242 330.948 148.031 331.592C149.82 332.236 151.273 331.255 151.271 329.401C151.268 327.547 149.81 325.519 148.021 324.875C146.232 324.231 144.779 325.212 144.782 327.066ZM156.741 331.369C156.744 333.223 158.202 335.252 159.991 335.895C161.78 336.539 163.233 335.558 163.23 333.704C163.228 331.851 161.77 329.822 159.981 329.178C158.192 328.535 156.739 329.516 156.741 331.369Z"
stroke="url(#paint19_linear_840_3557)" stroke-opacity="0.8"
stroke-width="0.782645" />
</g>
</g>
</g>
<g filter="url(#filter11_d_840_3557)">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M1490.37 488.023L1490.12 491.469L1477.55 575.366L1476.62 579.522L1475.14 583.551L1473.14 587.404L1470.66 591.035L1467.77 594.4L1464.49 597.451L1460.89 600.145L1457.02 602.439L1452.93 604.29L1448.67 605.66L1444.31 606.51L1439.88 606.805L1350.5 606.934L1346.83 606.674L1343.48 605.908L1340.46 604.677L1337.8 603.023L1340.29 605.37L1342.56 607.4L1344.94 609.644L1342.56 607.401L1342.56 607.4L1340.29 605.37L1337.8 603.023L1335.52 600.985L1340.29 605.368L1340.29 605.369L1340.29 605.37L1342.56 607.4L1344.94 609.644L1349.47 613.814L1353.89 617.884L1356.14 619.894L1358.74 621.537L1361.68 622.774L1364.94 623.564L1368.48 623.868L1454.46 624.988L1458.69 624.764L1462.86 624.004L1466.91 622.741L1470.8 621.011L1474.47 618.851L1477.88 616.3L1480.97 613.399L1483.7 610.19L1486.02 606.716L1487.88 603.021L1489.25 599.147L1490.08 595.139L1501.07 513.785L1501.26 510.424L1500.92 507.264L1497.47 498.907L1496.19 496.218L1493.5 490.651L1490.75 484.947L1487.94 479.103L1489.23 481.812L1490.06 484.796L1490.37 488.023Z"
fill="url(#paint20_linear_840_3557)" />
<g filter="url(#filter12_b_840_3557)">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M1472.19 469.692L1468.56 469.463L1464.72 469.669L1384.63 478.448L1381.19 479.024L1377.8 479.976L1374.49 481.271L1371.29 482.881L1368.23 484.777L1365.34 486.932L1362.66 489.319L1360.22 491.912L1358.05 494.686L1356.18 497.616L1354.66 500.677L1353.53 503.845L1330.76 582.836L1330.76 582.838L1330.41 586.388L1330.54 589.773L1331.14 592.961L1332.17 595.916L1333.64 598.603L1335.52 600.985L1337.8 603.023L1340.46 604.677L1343.48 605.908L1346.83 606.674L1350.5 606.934L1439.88 606.805L1443.97 606.781L1448.45 605.949L1452.93 604.29L1457.02 602.439L1460.89 600.145L1464.49 597.451L1467.77 594.4L1470.66 591.035L1473.14 587.404L1475.14 583.551L1476.62 579.522L1477.55 575.366L1490.12 491.469L1490.37 488.023L1490.06 484.796L1489.23 481.812L1487.93 479.097L1486.2 476.674L1484.06 474.566L1481.55 472.793L1478.72 471.377L1475.59 470.336L1472.19 469.692ZM1330.76 582.836L1353.53 503.845L1331.59 579.155L1330.76 582.836Z"
fill="url(#paint21_linear_840_3557)" />
<path d="M1331.3 582.943L1330.97 586.404L1331.09 589.712L1331.67 592.818L1332.68 595.69L1334.11 598.297L1335.93 600.604L1338.14 602.578L1340.71 604.182L1343.64 605.378L1346.91 606.125L1350.52 606.381L1439.88 606.251L1439.88 606.251L1443.92 606.228L1448.3 605.413L1452.72 603.778L1456.77 601.947L1460.59 599.684L1464.14 597.026L1467.37 594.016L1470.22 590.698L1472.66 587.119L1474.63 583.327L1476.09 579.366L1477 575.265L1489.57 491.408L1489.81 488.03L1489.51 484.896L1488.71 482.007L1487.46 479.38L1485.77 477.035L1483.7 474.992L1481.27 473.269L1478.51 471.889L1475.45 470.873L1472.12 470.242L1468.56 470.017L1464.77 470.221L1384.71 478.996L1381.31 479.565L1377.98 480.501L1374.72 481.777L1371.56 483.364L1368.54 485.235L1365.69 487.361L1363.05 489.716L1360.64 492.273L1358.5 495.006L1356.67 497.889L1355.17 500.895L1354.05 504.015L1331.3 582.943Z"
stroke="url(#paint22_linear_840_3557)" stroke-opacity="0.6"
stroke-width="1.10656" />
</g>
<g clip-path="url(#clip3_840_3557)">
<path d="M1426.6 497.89C1427.69 497.833 1428.7 497.927 1429.61 498.154L1428.4 493.752L1433.23 500.28C1434.91 502.173 1435.43 505.031 1434.37 508.304L1433.62 510.61L1444.81 509.828C1445.13 509.806 1445.44 509.799 1445.75 509.793C1446.06 509.803 1446.37 509.812 1446.65 509.855C1446.72 509.864 1446.78 509.873 1446.84 509.882L1445.82 505.276L1450.59 511.724C1450.68 511.821 1450.76 511.92 1450.84 512.02C1450.99 512.213 1451.13 512.438 1451.26 512.648C1451.39 512.874 1451.49 513.101 1451.59 513.345C1451.7 513.588 1451.76 513.834 1451.83 514.096C1451.89 514.357 1451.93 514.62 1451.96 514.9C1451.98 515.18 1451.99 515.462 1452 515.743C1451.99 516.025 1451.97 516.324 1451.93 516.608C1451.9 516.908 1451.84 517.194 1451.77 517.496C1451.71 517.798 1451.61 518.102 1451.51 518.407L1448.04 529.09L1450.46 528.921C1451.63 528.838 1452.72 528.92 1453.69 529.146L1452.98 525.188L1457.58 531.373C1459.19 533.207 1459.68 535.916 1458.67 539.022C1456.66 545.205 1449.82 550.598 1443.42 551.046L1440.85 551.225L1437.37 561.909C1435.71 567.081 1429.97 571.615 1424.61 571.99L1408.82 573.094L1408.83 573.057L1403.78 566.543L1411.16 565.893L1411.33 565.358C1411.44 565.005 1411.53 564.655 1411.57 564.308C1411.62 563.96 1411.61 563.632 1411.57 563.306C1411.53 562.98 1411.46 562.688 1411.33 562.415C1411.21 562.142 1411.06 561.886 1410.88 561.648C1409.93 560.462 1408.18 559.88 1406.11 560.057C1405.65 560.088 1405.18 560.168 1404.71 560.28C1404.23 560.392 1403.75 560.534 1403.26 560.725C1402.77 560.916 1402.31 561.12 1401.84 561.373C1401.36 561.625 1400.91 561.907 1400.48 562.219C1399.3 563.068 1397.78 564.474 1397.12 566.492L1394.65 574.084L1378.98 575.18C1378.66 575.203 1378.35 575.209 1378.04 575.199C1377.73 575.19 1377.42 575.164 1377.12 575.138C1376.82 575.096 1376.54 575.053 1376.25 574.98C1375.98 574.905 1375.71 574.83 1375.45 574.739C1375.18 574.648 1374.94 574.524 1374.7 574.399C1374.46 574.275 1374.25 574.134 1374.03 573.976C1373.82 573.819 1373.63 573.66 1373.44 573.486C1373.25 573.311 1373.08 573.12 1372.92 572.912C1372.77 572.717 1372.64 572.52 1372.51 572.311L1372.49 572.269C1372.46 572.215 1372.43 572.161 1372.4 572.106L1368.09 566.543L1372.28 566.173L1377.03 551.555L1385.13 550.989C1386.76 550.875 1388.55 550.108 1390.19 548.82C1390.65 548.458 1391.07 548.085 1391.47 547.666C1391.86 547.263 1392.23 546.83 1392.56 546.384C1392.88 545.939 1393.16 545.481 1393.41 545.009C1393.66 544.538 1393.85 544.071 1394 543.607C1395.1 540.024 1392.99 537.212 1389.38 537.465L1381.43 538.021L1381.43 538.015L1381.43 538.016L1376.48 531.352L1383.84 530.607L1386.33 522.933C1386.53 522.324 1386.8 521.711 1387.11 521.094C1387.44 520.476 1387.82 519.886 1388.25 519.308C1388.68 518.73 1389.16 518.164 1389.7 517.642C1390.23 517.103 1390.8 516.61 1391.39 516.161C1391.98 515.713 1392.61 515.294 1393.26 514.92C1393.9 514.546 1394.56 514.233 1395.22 513.968C1395.88 513.703 1396.56 513.483 1397.22 513.328C1397.88 513.172 1398.54 513.063 1399.17 513.035L1410.38 512.251L1411.18 509.784C1411.24 509.608 1411.3 509.416 1411.37 509.239C1411.4 509.178 1411.42 509.117 1411.45 509.054C1411.49 508.932 1411.54 508.808 1411.6 508.691C1411.64 508.602 1411.68 508.509 1411.72 508.416C1411.76 508.323 1411.81 508.23 1411.84 508.141C1411.89 508.052 1411.94 507.959 1411.98 507.865C1412.03 507.772 1412.08 507.679 1412.12 507.59C1412.21 507.411 1412.32 507.231 1412.43 507.052L1412.75 506.513C1412.86 506.333 1412.98 506.152 1413.11 505.971C1413.17 505.881 1413.23 505.794 1413.29 505.708C1413.35 505.621 1413.41 505.535 1413.48 505.444C1413.6 505.264 1413.74 505.098 1413.87 504.931C1413.91 504.89 1413.94 504.848 1413.97 504.806C1414.08 504.676 1414.19 504.542 1414.3 504.416C1414.44 504.25 1414.59 504.083 1414.74 503.916C1414.9 503.748 1415.04 503.597 1415.21 503.429C1415.36 503.278 1415.53 503.109 1415.7 502.957L1416.19 502.5C1416.3 502.397 1416.42 502.301 1416.54 502.202C1416.59 502.154 1416.65 502.106 1416.71 502.056C1416.8 501.988 1416.89 501.915 1416.98 501.842C1417.07 501.769 1417.16 501.696 1417.24 501.628C1417.42 501.49 1417.61 501.351 1417.78 501.23C1417.98 501.091 1418.15 500.97 1418.34 500.847L1418.9 500.479C1419.03 500.391 1419.17 500.31 1419.31 500.233C1419.36 500.202 1419.42 500.172 1419.47 500.142C1419.65 500.035 1419.85 499.927 1420.05 499.819C1420.15 499.765 1420.25 499.716 1420.34 499.666C1420.44 499.616 1420.54 499.566 1420.64 499.512C1420.83 499.42 1421.03 499.328 1421.24 499.235C1421.43 499.143 1421.64 499.066 1421.84 498.989C1421.95 498.951 1422.05 498.913 1422.14 498.874C1422.24 498.836 1422.34 498.798 1422.44 498.76C1422.65 498.683 1422.85 498.622 1423.05 498.561L1423.65 498.378C1423.85 498.317 1424.05 498.272 1424.26 498.226L1424.35 498.206C1424.53 498.167 1424.69 498.13 1424.86 498.106C1424.95 498.091 1425.05 498.072 1425.15 498.054C1425.25 498.035 1425.35 498.016 1425.45 498.002C1425.64 497.973 1425.85 497.943 1426.03 497.93L1426.6 497.89Z"
fill="url(#paint23_linear_840_3557)" />
</g>
<g opacity="0.9" clip-path="url(#clip4_840_3557)">
<path d="M1419.65 565.329L1403.86 566.433L1406.37 558.697C1406.49 558.344 1406.57 557.994 1406.61 557.647C1406.66 557.299 1406.65 556.971 1406.61 556.645C1406.57 556.319 1406.5 556.027 1406.38 555.754C1406.25 555.481 1406.1 555.225 1405.92 554.987C1404.97 553.801 1403.23 553.219 1401.15 553.396C1400.7 553.427 1400.23 553.507 1399.75 553.619C1399.27 553.731 1398.79 553.873 1398.3 554.064C1397.82 554.255 1397.36 554.459 1396.88 554.712C1396.4 554.964 1395.95 555.246 1395.52 555.558C1394.34 556.407 1392.82 557.813 1392.16 559.831L1389.7 567.423L1374.02 568.519C1373.7 568.542 1373.39 568.548 1373.08 568.538C1372.77 568.528 1372.47 568.503 1372.16 568.477C1371.86 568.435 1371.58 568.392 1371.29 568.319C1371.02 568.244 1370.75 568.169 1370.49 568.078C1370.22 567.987 1369.98 567.863 1369.74 567.738C1369.5 567.614 1369.29 567.473 1369.08 567.315C1368.86 567.158 1368.67 566.999 1368.48 566.825C1368.29 566.65 1368.12 566.459 1367.96 566.251C1367.8 566.043 1367.67 565.833 1367.53 565.608C1367.41 565.382 1367.28 565.156 1367.2 564.911C1367.1 564.668 1367.01 564.423 1366.95 564.161C1366.89 563.9 1366.84 563.637 1366.8 563.358C1366.78 563.078 1366.75 562.798 1366.76 562.515C1366.75 562.234 1366.79 561.934 1366.82 561.635C1366.85 561.335 1366.9 561.034 1366.98 560.731C1367.04 560.429 1367.13 560.126 1367.23 559.822L1372.08 544.894L1380.17 544.328C1381.8 544.214 1383.6 543.447 1385.23 542.158C1385.69 541.797 1386.11 541.424 1386.51 541.005C1386.9 540.602 1387.27 540.169 1387.6 539.723C1387.92 539.278 1388.2 538.82 1388.45 538.348C1388.71 537.877 1388.89 537.41 1389.04 536.946C1390.14 533.362 1388.03 530.551 1384.42 530.804L1376.47 531.36L1381.38 516.272C1381.57 515.663 1381.84 515.05 1382.15 514.433C1382.49 513.815 1382.86 513.225 1383.29 512.647C1383.73 512.069 1384.21 511.503 1384.74 510.981C1385.27 510.442 1385.84 509.949 1386.43 509.5C1387.02 509.052 1387.65 508.633 1388.3 508.259C1388.94 507.885 1389.6 507.572 1390.27 507.307C1390.93 507.042 1391.6 506.822 1392.26 506.667C1392.92 506.511 1393.58 506.402 1394.21 506.374L1405.42 505.59L1406.22 503.123C1406.28 502.947 1406.34 502.755 1406.41 502.578C1406.49 502.4 1406.55 502.208 1406.64 502.03C1406.72 501.852 1406.81 501.658 1406.89 501.48C1406.98 501.302 1407.07 501.107 1407.16 500.929C1407.25 500.75 1407.36 500.57 1407.47 500.391L1407.79 499.852C1407.9 499.672 1408.02 499.491 1408.15 499.31C1408.27 499.129 1408.39 498.964 1408.52 498.783C1408.64 498.603 1408.78 498.437 1408.91 498.27C1409.05 498.104 1409.19 497.922 1409.34 497.755C1409.48 497.589 1409.63 497.422 1409.79 497.255C1409.94 497.087 1410.09 496.936 1410.26 496.768C1410.4 496.617 1410.57 496.448 1410.74 496.296L1411.23 495.839C1411.4 495.686 1411.57 495.549 1411.75 495.395C1411.93 495.258 1412.11 495.104 1412.29 494.967C1412.46 494.829 1412.65 494.69 1412.83 494.569C1413.02 494.43 1413.19 494.309 1413.38 494.186L1413.94 493.818C1414.13 493.695 1414.33 493.587 1414.51 493.481C1414.69 493.374 1414.89 493.266 1415.09 493.158C1415.29 493.05 1415.48 492.959 1415.68 492.851C1415.88 492.759 1416.07 492.667 1416.28 492.574C1416.48 492.482 1416.68 492.405 1416.89 492.328C1417.09 492.251 1417.28 492.176 1417.49 492.099C1417.69 492.022 1417.89 491.961 1418.09 491.9L1418.69 491.717C1418.89 491.656 1419.09 491.611 1419.3 491.565C1419.51 491.518 1419.71 491.474 1419.9 491.445C1420.09 491.416 1420.3 491.37 1420.49 491.341C1420.68 491.312 1420.89 491.282 1421.07 491.269L1421.64 491.229C1427.89 490.901 1431.39 495.556 1429.41 501.643L1428.66 503.949L1439.85 503.167C1440.17 503.145 1440.48 503.138 1440.79 503.132C1441.1 503.142 1441.41 503.151 1441.69 503.194C1441.99 503.236 1442.27 503.279 1442.55 503.338C1442.83 503.397 1443.09 503.488 1443.36 503.579C1443.62 503.67 1443.87 503.778 1444.11 503.902C1444.35 504.026 1444.56 504.168 1444.78 504.309C1445 504.45 1445.19 504.625 1445.38 504.8C1445.57 504.974 1445.73 505.166 1445.88 505.359C1446.03 505.552 1446.17 505.777 1446.3 505.987C1446.43 506.213 1446.53 506.44 1446.64 506.684C1446.74 506.927 1446.8 507.173 1446.87 507.435C1446.93 507.696 1446.98 507.959 1447 508.239C1447.02 508.519 1447.03 508.801 1447.04 509.082C1447.03 509.364 1447.01 509.663 1446.97 509.947C1446.94 510.247 1446.88 510.533 1446.81 510.835C1446.75 511.137 1446.65 511.441 1446.55 511.746L1443.08 522.429L1445.5 522.26C1451.98 521.806 1455.67 526.339 1453.71 532.361C1451.7 538.543 1444.86 543.937 1438.46 544.385L1435.89 544.564L1432.42 555.248C1430.75 560.42 1425.01 564.954 1419.65 565.329Z"
fill="url(#paint24_linear_840_3557)" />
</g>
</g>
<g filter="url(#filter13_d_840_3557)">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M1244.77 55.2975L1245.04 57.4023L1247.77 109.473L1247.73 112.09L1247.33 114.698L1246.6 117.264L1245.55 119.755L1244.22 122.137L1242.62 124.377L1240.79 126.442L1238.74 128.298L1236.5 129.916L1234.11 131.263L1231.58 132.312L1228.95 133.033L1175.14 144.09L1172.9 144.383L1170.78 144.334L1168.81 143.963L1167.01 143.293L1168.8 144.401L1170.41 145.345L1172.12 146.405L1170.42 145.346L1170.41 145.345L1168.8 144.401L1167.01 143.293L1165.39 142.346L1168.8 144.4L1168.8 144.401L1168.8 144.401L1170.41 145.345L1172.12 146.405L1175.36 148.359L1178.53 150.267L1180.13 151.202L1181.9 151.872L1183.82 152.255L1185.87 152.331L1188.05 152.078L1239.96 142.193L1242.48 141.539L1244.9 140.569L1247.19 139.31L1249.32 137.79L1251.26 136.038L1253 134.084L1254.51 131.957L1255.76 129.69L1256.72 127.313L1257.39 124.859L1257.74 122.358L1257.75 119.842L1254.37 69.4982L1254.07 67.4506L1253.48 65.5889L1250.38 60.9791L1249.28 59.5176L1246.98 56.4947L1244.62 53.3971L1242.21 50.2238L1243.32 51.6961L1244.18 53.3918L1244.77 55.2975Z"
fill="url(#paint25_linear_840_3557)" />
<g filter="url(#filter14_b_840_3557)">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M1231.57 46.4894L1229.35 46.7977L1227.07 47.3938L1179.91 62.5175L1177.91 63.2871L1175.99 64.2765L1174.15 65.4634L1172.42 66.8262L1170.81 68.3439L1169.34 69.9962L1168.02 71.763L1166.86 73.6249L1165.9 75.5621L1165.13 77.5555L1164.6 79.5857L1164.3 81.6331L1160.29 132.001L1160.29 132.003L1160.52 134.183L1161.01 136.205L1161.76 138.052L1162.75 139.704L1163.96 141.142L1165.39 142.345L1167.01 143.293L1168.81 143.963L1170.78 144.334L1172.9 144.383L1175.14 144.089L1228.95 133.032L1231.41 132.516L1234.01 131.464L1236.5 129.916L1238.74 128.298L1240.79 126.441L1242.62 124.377L1244.22 122.137L1245.55 119.755L1246.6 117.264L1247.33 114.698L1247.73 112.089L1247.77 109.473L1245.04 57.4019L1244.77 55.2972L1244.18 53.3914L1243.32 51.6958L1242.2 50.2204L1240.86 48.9747L1239.31 47.9676L1237.59 47.2075L1235.71 46.7024L1233.69 46.4604L1231.57 46.4894ZM1160.29 132.001L1164.3 81.6331L1160.34 129.682L1160.29 132.001Z"
fill="url(#paint26_linear_840_3557)" />
<path d="M1160.68 131.998L1160.9 134.116L1161.38 136.085L1162.11 137.878L1163.07 139.477L1164.24 140.866L1165.61 142.026L1167.18 142.94L1168.92 143.586L1170.82 143.945L1172.87 143.993L1175.07 143.705L1228.87 132.652L1228.87 132.651L1231.3 132.142L1233.83 131.116L1236.28 129.592L1238.49 127.995L1240.51 126.167L1242.32 124.134L1243.89 121.928L1245.2 119.584L1246.23 117.135L1246.95 114.615L1247.34 112.056L1247.38 109.479L1244.66 57.4376L1244.38 55.3801L1243.82 53.5377L1242.99 51.903L1241.91 50.4825L1240.62 49.2827L1239.13 48.311L1237.46 47.5756L1235.63 47.0854L1233.67 46.8498L1231.6 46.8782L1229.43 47.18L1227.17 47.7676L1180.04 62.8846L1178.07 63.6428L1176.18 64.6138L1174.38 65.7803L1172.68 67.1212L1171.09 68.6155L1169.64 70.2427L1168.34 71.9824L1167.2 73.8145L1166.25 75.7188L1165.51 77.6753L1164.98 79.6638L1164.69 81.6764L1160.68 131.998Z"
stroke="url(#paint27_linear_840_3557)" stroke-opacity="0.6"
stroke-width="0.778219" />
</g>
<g opacity="0.9">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M1216.75 68.9201C1215.59 67.2258 1213.78 66.2582 1213.45 66.1666C1213.12 66.0749 1212.86 66.0912 1212.86 66.0912L1214.2 68.6642C1213.2 69.2027 1212.35 70.3147 1212.13 71.4898L1210.77 78.8634C1210.75 78.9539 1210.74 79.0426 1210.73 79.1296L1198.13 83.431C1198.13 83.3479 1198.12 83.2655 1198.11 83.1843L1197.29 76.7346L1197.29 76.735C1197.29 76.735 1197.26 76.0812 1197 75.6964C1195.83 74.0021 1194.03 73.0346 1193.69 72.9429C1193.36 72.8512 1193.11 72.8675 1193.11 72.8675L1194.43 75.414C1193.1 76.1308 1192.16 77.7674 1192.33 79.1008L1193.1 85.1468L1190.62 85.9928C1186.05 87.5544 1182.19 92.736 1182.01 97.5661L1181.58 109.227C1181.39 114.057 1184.95 116.707 1189.53 115.145L1212.39 107.342L1213.74 109.644L1192.19 117.002C1191.1 117.373 1190.15 118.426 1189.77 119.568L1189.24 118.867L1187.06 118.513C1187.06 118.513 1187.01 119.166 1187.28 119.55C1188.44 121.245 1189.57 122.019 1190.11 122.21C1190.5 122.349 1190.92 122.376 1191.12 122.381C1191.39 122.395 1191.68 122.354 1191.99 122.249L1214.08 114.709C1215.45 114.241 1216.6 112.686 1216.66 111.237C1216.67 110.882 1216.62 110.566 1216.51 110.299C1216.47 110.163 1216.43 110.025 1216.38 109.897C1215.74 108.233 1213.83 107.189 1213.12 107.097C1213.12 107.096 1213.12 107.096 1213.11 107.095L1217.14 105.72C1221.71 104.159 1225.57 98.9772 1225.75 94.1471L1226.19 82.4861C1226.25 80.9234 1225.91 79.5889 1225.28 78.5514L1225.29 78.5528C1225.29 78.5528 1224.86 77.8174 1224.6 77.4357C1223.43 75.7414 1221.62 74.8285 1221.2 74.6428C1220.78 74.4572 1220.06 74.2147 1220.06 74.2147L1221.4 76.1514C1220.44 76.0528 1219.37 76.1813 1218.23 76.5678L1215.76 77.4138L1217 70.6791C1217.07 70.3351 1217.07 70.0155 1217.02 69.7297C1216.99 69.5043 1216.92 69.1599 1216.75 68.9201ZM1214.71 88.1871C1215.06 88.5192 1215.26 89.0344 1215.23 89.679L1215.21 90.2214L1214.71 88.1871ZM1196.89 99.9633C1196.42 100.659 1195.74 101.225 1195 101.478C1194.1 101.785 1193.33 101.549 1192.93 100.941L1196.89 99.9633Z"
fill="url(#paint28_linear_840_3557)" />
<g clip-path="url(#clip5_840_3557)">
<path d="M1213.09 75.1799L1215.57 74.3339C1220.14 72.7724 1223.7 75.4221 1223.52 80.2522L1223.08 91.9133C1222.9 96.7434 1219.05 101.925 1214.47 103.487L1186.86 112.912C1182.29 114.473 1178.73 111.823 1178.91 106.993L1179.35 95.3323C1179.53 90.5022 1183.38 85.3206 1187.96 83.759L1190.44 82.913L1189.67 76.867C1189.5 75.5147 1190.46 73.8506 1191.82 73.1503C1193.19 72.45 1194.43 72.9786 1194.6 74.3309L1195.44 80.9505C1195.45 81.0317 1195.46 81.1141 1195.46 81.1972L1208.06 76.8957C1208.07 76.8087 1208.08 76.7201 1208.1 76.6296L1209.47 69.256C1209.75 67.7497 1211.06 66.3469 1212.41 66.1231C1213.75 65.8992 1214.62 66.9389 1214.34 68.4452L1213.09 75.1799ZM1190.04 95.136L1189.95 97.4682C1189.9 98.9172 1190.96 99.7121 1192.34 99.2437C1193.71 98.7752 1194.87 97.2207 1194.92 95.7717L1195.01 93.4395C1195.06 91.9905 1193.99 91.1955 1192.62 91.664C1191.25 92.1325 1190.09 93.687 1190.04 95.136ZM1207.6 89.1417L1207.51 91.4739C1207.46 92.9229 1208.52 93.7178 1209.9 93.2493C1211.27 92.7809 1212.42 91.2264 1212.48 89.7774L1212.57 87.4451C1212.62 85.9961 1211.55 85.2012 1210.18 85.6697C1208.81 86.1381 1207.65 87.6927 1207.6 89.1417ZM1189.32 120.015C1187.95 120.484 1186.88 119.689 1186.94 118.24C1186.99 116.791 1188.15 115.236 1189.52 114.768L1211.61 107.228C1212.98 106.759 1214.05 107.554 1213.99 109.003C1213.94 110.452 1212.78 112.007 1211.41 112.475L1189.32 120.015Z"
fill="url(#paint29_linear_840_3557)" />
<path d="M1212.58 75.2641L1212.46 75.9324L1213.07 75.7245L1215.55 74.8785C1219.84 73.4142 1223.18 75.8989 1223.01 80.4283L1222.57 92.0893C1222.4 96.6187 1218.78 101.478 1214.49 102.942L1186.88 112.367C1182.59 113.831 1179.25 111.347 1179.42 106.817L1179.86 95.1562C1180.03 90.6269 1183.65 85.7679 1187.94 84.3036L1190.42 83.4576L1191.02 83.2497L1190.95 82.6498L1190.18 76.6038L1189.67 76.867L1190.18 76.6038C1190.04 75.5322 1190.81 74.2135 1191.89 73.6586C1192.97 73.1036 1193.95 73.5225 1194.09 74.5941C1194.09 74.5941 1194.09 74.5941 1194.09 74.5941L1194.93 81.2137L1194.93 81.2139C1194.94 81.2782 1194.94 81.3437 1194.95 81.4101L1194.96 81.9062L1195.44 81.7418L1208.04 77.4403L1208.52 77.2759L1208.58 76.7573C1208.58 76.6879 1208.59 76.6174 1208.61 76.5457L1208.61 76.5455L1209.97 69.1718C1210.19 67.9782 1211.24 66.8666 1212.3 66.6892C1213.37 66.5118 1214.05 67.3357 1213.83 68.5293L1212.58 75.2641ZM1189.52 95.312L1189.43 97.6443C1189.37 99.394 1190.66 100.354 1192.32 99.7883C1193.97 99.2226 1195.37 97.3454 1195.44 95.5956L1195.52 93.2634C1195.59 91.5136 1194.3 90.5537 1192.64 91.1194C1190.98 91.6851 1189.59 93.5623 1189.52 95.312ZM1207.08 89.3177L1206.99 91.6499C1206.93 93.3997 1208.22 94.3596 1209.88 93.7939C1211.53 93.2282 1212.93 91.3511 1213 89.6013L1213.08 87.2691C1213.15 85.5193 1211.86 84.5594 1210.2 85.1251C1208.54 85.6908 1207.15 87.5679 1207.08 89.3177ZM1189.34 119.471C1188.25 119.842 1187.41 119.212 1187.45 118.064C1187.49 116.915 1188.41 115.684 1189.5 115.312L1211.59 107.772C1212.67 107.401 1213.52 108.031 1213.48 109.179C1213.43 110.327 1212.52 111.559 1211.43 111.931L1189.34 119.471Z"
stroke="url(#paint30_linear_840_3557)" stroke-opacity="0.4"
stroke-width="1.08995" />
</g>
</g>
</g>
</g>
<defs>
<filter id="filter0_f_840_3557" x="92.914" y="485.027" width="1544.88" height="1375.86"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="38.05" result="effect1_foregroundBlur_840_3557" />
</filter>
<filter id="filter1_f_840_3557" x="-13.886" y="243.016" width="1758.48" height="1589.46"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="91.45" result="effect1_foregroundBlur_840_3557" />
</filter>
<filter id="filter2_f_840_3557" x="16.114" y="243.016" width="1758.48" height="1589.46"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="91.45" result="effect1_foregroundBlur_840_3557" />
</filter>
<filter id="filter3_f_840_3557" x="-184.739" y="-112.376" width="961.341" height="1074.36"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="40.5634" result="effect1_foregroundBlur_840_3557" />
</filter>
<filter id="filter4_f_840_3557" x="-219.823" y="-87.5647" width="741.972" height="1031.55"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="30" result="effect1_foregroundBlur_840_3557" />
</filter>
<filter id="filter5_f_840_3557" x="-199.823" y="-67.5649" width="899.049" height="1019.7"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="20" result="effect1_foregroundBlur_840_3557" />
</filter>
<filter id="filter6_f_840_3557" x="761.873" y="-112.376" width="961.341" height="719.043"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="40.5634" result="effect1_foregroundBlur_840_3557" />
</filter>
<filter id="filter7_f_840_3557" x="1036.33" y="-69" width="610.788" height="636.45"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="20" result="effect1_foregroundBlur_840_3557" />
</filter>
<filter id="filter8_f_840_3557" x="849.249" y="-59" width="799.909" height="633.636"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="15" result="effect1_foregroundBlur_840_3557" />
</filter>
<filter id="filter9_d_840_3557" x="-82.7739" y="540.596" width="233.044" height="214.744"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
result="hardAlpha" />
<feMorphology radius="7.60935" operator="erode" in="SourceAlpha"
result="effect1_dropShadow_840_3557" />
<feOffset dy="19.0234" />
<feGaussianBlur stdDeviation="11.414" />
<feColorMatrix type="matrix"
values="0 0 0 0 0 0 0 0 0 0.128299 0 0 0 0 0.801872 0 0 0 0.15 0" />
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_840_3557" />
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_840_3557" result="shape" />
</filter>
<filter id="filter10_d_840_3557" x="65.9472" y="277.057" width="141.573" height="156.318"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
result="hardAlpha" />
<feMorphology radius="7.60935" operator="erode" in="SourceAlpha"
result="effect1_dropShadow_840_3557" />
<feOffset dy="19.0234" />
<feGaussianBlur stdDeviation="11.414" />
<feColorMatrix type="matrix"
values="0 0 0 0 0 0 0 0 0 0.128299 0 0 0 0 0.801872 0 0 0 0.15 0" />
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_840_3557" />
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_840_3557" result="shape" />
</filter>
<filter id="filter11_d_840_3557" x="1315.19" y="469.463" width="201.282" height="189.767"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
result="hardAlpha" />
<feMorphology radius="7.60935" operator="erode" in="SourceAlpha"
result="effect1_dropShadow_840_3557" />
<feOffset dy="19.0234" />
<feGaussianBlur stdDeviation="11.414" />
<feColorMatrix type="matrix"
values="0 0 0 0 0 0 0 0 0 0.128299 0 0 0 0 0.801872 0 0 0 0.15 0" />
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_840_3557" />
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_840_3557" result="shape" />
</filter>
<filter id="filter12_b_840_3557" x="1314.37" y="453.419" width="192.043" height="169.559"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feGaussianBlur in="BackgroundImageFix" stdDeviation="8.02187" />
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_840_3557" />
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_840_3557"
result="shape" />
</filter>
<filter id="filter13_d_840_3557" x="1145.07" y="46.4604" width="127.896" height="140.113"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
result="hardAlpha" />
<feMorphology radius="7.60935" operator="erode" in="SourceAlpha"
result="effect1_dropShadow_840_3557" />
<feOffset dy="19.0234" />
<feGaussianBlur stdDeviation="11.414" />
<feColorMatrix type="matrix"
values="0 0 0 0 0 0 0 0 0 0.128299 0 0 0 0 0.801872 0 0 0 0.15 0" />
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_840_3557" />
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_840_3557" result="shape" />
</filter>
<filter id="filter14_b_840_3557" x="1155.27" y="41.4442" width="97.517" height="107.955"
filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feGaussianBlur in="BackgroundImageFix" stdDeviation="2.50814" />
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_840_3557" />
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_840_3557"
result="shape" />
</filter>
<linearGradient id="paint0_linear_840_3557" x1="720" y1="0" x2="720" y2="883.5"
gradientUnits="userSpaceOnUse">
<stop stop-color="#F5F6FF" />
<stop offset="0.461461" stop-color="#F6F9FF" />
<stop offset="0.875" stop-color="#E4EAFF" />
</linearGradient>
<linearGradient id="paint1_linear_840_3557" x1="865.352" y1="561.127" x2="865.352" y2="1784.79"
gradientUnits="userSpaceOnUse">
<stop stop-color="#C2CFFF" />
<stop offset="0.28125" stop-color="#638EFF" />
<stop offset="0.526042" stop-color="#6691FF" />
<stop offset="0.703125" stop-color="#618EFF" />
<stop offset="0.833333" stop-color="#618FFF" />
<stop offset="1" stop-color="#7398FF" />
</linearGradient>
<linearGradient id="paint2_linear_840_3557" x1="947.5" y1="497.5" x2="1380.5" y2="1069"
gradientUnits="userSpaceOnUse">
<stop offset="0.153575" stop-color="#CAECFF" stop-opacity="0.9" />
<stop offset="0.4375" stop-color="#ACBEFF" />
<stop offset="0.703125" stop-color="#618DFF" />
<stop offset="0.833333" stop-color="#628EFF" />
<stop offset="1" stop-color="#0058FF" />
</linearGradient>
<linearGradient id="paint3_linear_840_3557" x1="977.5" y1="497.5" x2="1410.5" y2="1069"
gradientUnits="userSpaceOnUse">
<stop offset="0.153575" stop-color="#CAECFF" stop-opacity="0.9" />
<stop offset="0.4375" stop-color="#ACBEFF" />
<stop offset="0.703125" stop-color="#618DFF" />
<stop offset="0.833333" stop-color="#628EFF" />
<stop offset="1" stop-color="#0058FF" />
</linearGradient>
<linearGradient id="paint4_linear_840_3557" x1="78.1487" y1="573.637" x2="-256.389" y2="244.696"
gradientUnits="userSpaceOnUse">
<stop stop-color="#ABBDFF" />
<stop offset="0.0001" stop-color="#CEF0FF" />
<stop offset="0.322917" stop-color="#83A6FF" />
<stop offset="0.734375" stop-color="#4D7FFF" />
<stop offset="1" stop-color="#4E71FD" />
</linearGradient>
<linearGradient id="paint5_linear_840_3557" x1="21.9374" y1="548.281" x2="-312.6" y2="219.339"
gradientUnits="userSpaceOnUse">
<stop stop-color="#CEE8FF" />
<stop offset="0.333333" stop-color="#83B5FF" />
<stop offset="0.666667" stop-color="#4D8AFF" />
<stop offset="1" stop-color="#4E89FD" />
</linearGradient>
<linearGradient id="paint6_linear_840_3557" x1="21.9378" y1="548.28" x2="-312.6" y2="219.339"
gradientUnits="userSpaceOnUse">
<stop stop-color="#E2E1FF" />
<stop offset="0.333333" stop-color="#A8A6FF" />
<stop offset="0.666667" stop-color="#4D8AFF" />
<stop offset="1" stop-color="#4E89FD" />
</linearGradient>
<linearGradient id="paint7_linear_840_3557" x1="1460.33" y1="338" x2="1643.38" y2="43.152"
gradientUnits="userSpaceOnUse">
<stop stop-color="#ABBDFF" />
<stop offset="0.0001" stop-color="#CEF0FF" />
<stop offset="0.322917" stop-color="#83A6FF" />
<stop offset="0.734375" stop-color="#4D7FFF" />
<stop offset="1" stop-color="#4E71FD" />
</linearGradient>
<linearGradient id="paint8_linear_840_3557" x1="1452" y1="322.521" x2="1646.33" y2="55.3989"
gradientUnits="userSpaceOnUse">
<stop stop-color="#CEE8FF" />
<stop offset="0.333333" stop-color="#83B5FF" />
<stop offset="0.666667" stop-color="#4D8AFF" />
<stop offset="1" stop-color="#4E89FD" />
</linearGradient>
<linearGradient id="paint9_linear_840_3557" x1="1454.96" y1="322.521" x2="1645.63" y2="45.0681"
gradientUnits="userSpaceOnUse">
<stop stop-color="#E2E1FF" />
<stop offset="0.333333" stop-color="#A8A6FF" />
<stop offset="0.666667" stop-color="#4D8AFF" />
<stop offset="1" stop-color="#4E89FD" />
</linearGradient>
<linearGradient id="paint10_linear_840_3557" x1="-119.125" y1="597.79" x2="128.987" y2="740.818"
gradientUnits="userSpaceOnUse">
<stop stop-color="#CFE1FF" />
<stop offset="0.35896" stop-color="#3FA3FF" />
<stop offset="0.683604" stop-color="#2D9AFF" />
<stop offset="1" stop-color="#A4C3FF" />
</linearGradient>
<linearGradient id="paint11_linear_840_3557" x1="-12.1107" y1="736.572" x2="85.6238" y2="543.022"
gradientUnits="userSpaceOnUse">
<stop stop-color="#3290FF" />
<stop offset="0.390625" stop-color="#55A3FF" />
<stop offset="1" stop-color="#79BFFF" />
</linearGradient>
<linearGradient id="paint12_linear_840_3557" x1="-23.9854" y1="713.67" x2="96.0805" y2="542.236"
gradientUnits="userSpaceOnUse">
<stop offset="0.180663" stop-color="white" stop-opacity="0.35" />
<stop offset="0.533255" stop-color="white" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint13_linear_840_3557" x1="35.717" y1="587.576" x2="35.717" y2="664.883"
gradientUnits="userSpaceOnUse">
<stop stop-color="#9CC9FF" />
<stop offset="1" stop-color="#9AC9FF" />
</linearGradient>
<linearGradient id="paint14_linear_840_3557" x1="55.3621" y1="297.15" x2="177.464" y2="419.09"
gradientUnits="userSpaceOnUse">
<stop stop-color="#BCD7FF" />
<stop offset="0.35896" stop-color="#699EFF" />
<stop offset="0.683604" stop-color="#4A8AFF" />
<stop offset="1" stop-color="#4B9EFF" />
</linearGradient>
<linearGradient id="paint15_linear_840_3557" x1="100.049" y1="371.005" x2="194.054" y2="333.268"
gradientUnits="userSpaceOnUse">
<stop stop-color="#679BFF" />
<stop offset="0.525226" stop-color="#68A5FF" />
<stop offset="0.89375" stop-color="#7FB2FF" />
</linearGradient>
<linearGradient id="paint16_linear_840_3557" x1="92.6638" y1="379.433" x2="189.281" y2="298.378"
gradientUnits="userSpaceOnUse">
<stop offset="0.180663" stop-color="white" stop-opacity="0.35" />
<stop offset="0.533255" stop-color="white" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint17_linear_840_3557" x1="129.228" y1="360.436" x2="156.999" y2="303.538"
gradientUnits="userSpaceOnUse">
<stop stop-color="#A6C9FF" />
<stop offset="1" stop-color="#72B3FF" />
</linearGradient>
<linearGradient id="paint18_linear_840_3557" x1="147.987" y1="300.5" x2="130.326" y2="349.584"
gradientUnits="userSpaceOnUse">
<stop stop-color="#E7F3FF" />
<stop offset="1" stop-color="#E7F3FF" />
</linearGradient>
<linearGradient id="paint19_linear_840_3557" x1="123.476" y1="343.82" x2="172.132" y2="333.675"
gradientUnits="userSpaceOnUse">
<stop stop-color="white" />
<stop offset="1" stop-color="white" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint20_linear_840_3557" x1="1545.73" y1="515.433" x2="1338.05" y2="646.635"
gradientUnits="userSpaceOnUse">
<stop stop-color="#9CBDFE" />
<stop offset="0.35896" stop-color="#579AFF" />
<stop offset="0.683604" stop-color="#5196FF" />
<stop offset="1" stop-color="#76A4FE" />
</linearGradient>
<linearGradient id="paint21_linear_840_3557" x1="1458.83" y1="638.093" x2="1368.35" y2="475.607"
gradientUnits="userSpaceOnUse">
<stop offset="0.320833" stop-color="#5A9EFF" />
<stop offset="0.604167" stop-color="#7EB2FF" />
<stop offset="0.89375" stop-color="#A4C9FF" />
</linearGradient>
<linearGradient id="paint22_linear_840_3557" x1="1468.22" y1="618.053" x2="1359.36" y2="475.296"
gradientUnits="userSpaceOnUse">
<stop offset="0.180663" stop-color="white" stop-opacity="0.35" />
<stop offset="0.533255" stop-color="white" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint23_linear_840_3557" x1="1413.64" y1="493.752" x2="1413.64" y2="575.204"
gradientUnits="userSpaceOnUse">
<stop stop-color="#C3D8FF" />
<stop offset="1" stop-color="#A1C2FF" />
</linearGradient>
<linearGradient id="paint24_linear_840_3557" x1="1428.45" y1="490.753" x2="1433.59" y2="564.353"
gradientUnits="userSpaceOnUse">
<stop offset="0.0208333" stop-color="#F1F9FF" />
<stop offset="1" stop-color="#F1F9FF" />
</linearGradient>
<linearGradient id="paint25_linear_840_3557" x1="1281.47" y1="65.0044" x2="1172.52" y2="169.527"
gradientUnits="userSpaceOnUse">
<stop stop-color="#9CC0FE" />
<stop offset="0.35896" stop-color="#6098FF" />
<stop offset="0.683604" stop-color="#518FFF" />
<stop offset="1" stop-color="#A2BCFF" />
</linearGradient>
<linearGradient id="paint26_linear_840_3557" x1="1244.21" y1="149.548" x2="1169.76" y2="62.8069"
gradientUnits="userSpaceOnUse">
<stop stop-color="#669DFF" />
<stop offset="0.479167" stop-color="#89B8FF" />
<stop offset="1" stop-color="#A2C3FF" />
</linearGradient>
<linearGradient id="paint27_linear_840_3557" x1="1247.4" y1="136.327" x2="1164.3" y2="63.7239"
gradientUnits="userSpaceOnUse">
<stop offset="0.180663" stop-color="white" stop-opacity="0.35" />
<stop offset="0.533255" stop-color="white" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint28_linear_840_3557" x1="1204.78" y1="71.8343" x2="1218.86" y2="113.075"
gradientUnits="userSpaceOnUse">
<stop offset="0.0208333" stop-color="#A7C6FF" />
<stop offset="1" stop-color="#ABC8FF" />
</linearGradient>
<linearGradient id="paint29_linear_840_3557" x1="1202.12" y1="69.6006" x2="1216.2" y2="110.841"
gradientUnits="userSpaceOnUse">
<stop stop-color="#F7FCFF" />
<stop offset="1" stop-color="#F3FAFF" />
</linearGradient>
<linearGradient id="paint30_linear_840_3557" x1="1225.45" y1="113.607" x2="1173.97" y2="88.5136"
gradientUnits="userSpaceOnUse">
<stop stop-color="white" />
<stop offset="1" stop-color="white" stop-opacity="0" />
</linearGradient>
<clipPath id="clip0_840_3557">
<rect width="1440" height="1554.93" fill="white" />
</clipPath>
<clipPath id="clip1_840_3557">
<rect width="64.1261" height="64.1261" fill="white"
transform="matrix(0.956305 0.292372 0.0348995 0.999391 111.689 291.145)" />
</clipPath>
<clipPath id="clip2_840_3557">
<rect width="64.1261" height="64.1261" fill="white"
transform="matrix(0.956305 0.292372 0.0348995 0.999391 117.168 285.666)" />
</clipPath>
<clipPath id="clip3_840_3557">
<rect width="95.4896" height="95.4896" fill="white"
transform="matrix(0.997564 -0.0697565 -0.309017 0.951057 1388.25 493.176)" />
</clipPath>
<clipPath id="clip4_840_3557">
<rect width="95.4896" height="95.4896" fill="white"
transform="matrix(0.997564 -0.0697565 -0.309017 0.951057 1383.29 486.514)" />
</clipPath>
<clipPath id="clip5_840_3557">
<rect width="56.013" height="56.013" fill="white"
transform="matrix(0.946375 -0.323069 -0.0375396 0.999295 1175.79 73.9841)" />
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 72 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="1703041511149" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7024" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M512.512 128a384 384 0 1 1-384 384 384 384 0 0 1 384-384z m0 96a288 288 0 1 0 288 288 288 288 0 0 0-288-288z" fill="#3671FD" opacity=".2" p-id="7025"></path><path d="M512.512 64a448 448 0 1 1-302.56 117.6A32.032 32.032 0 1 1 253.312 228.8a384 384 0 1 0 298.016-98.88l-6.816-0.608v140.032a32 32 0 0 1-28.256 31.776l-3.744 0.224a32 32 0 0 1-31.776-28.288l-0.224-3.712V64z" fill="#3671FD" p-id="7026"></path><path d="M336.32 313.376l216.224 165.344a52.288 52.288 0 1 1-73.28 73.312l-165.376-216.224a16 16 0 0 1 22.4-22.4z" fill="#FE9C23" p-id="7027"></path></svg>

After

Width:  |  Height:  |  Size: 893 B

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -231,7 +231,9 @@
},
"app": {
"App params config": "App Config",
"Chat Variable": "",
"Next Step Guide": "Next step guide",
"Question Guide": "",
"Question Guide Tip": "At the end of the conversation, three leading questions will be asked.",
"Save and preview": "Save",
"Select TTS": "Select TTS",
@@ -245,7 +247,9 @@
"Out Ad Edit": "You are about to exit the Advanced orchestration page, please confirm",
"Prompt Editor": "Prompt Editor",
"Save and out": "Save out",
"UnSave": "UnSave"
"UnSave": "UnSave",
"cfr background prompt": "Question completion - Chat background description",
"cfr background tip": "Describing the scope of the current conversation makes it easier for AI to complete first or vague questions, thereby enhancing the knowledge base's ability to continue conversations. \nIf is empty, the problem completion function is not used."
},
"feedback": {
"Custom feedback": "Custom feedback",
@@ -295,7 +299,10 @@
"Stop Speak": "Stop Speak",
"Type a message": "Input problem",
"error": {
"Messages empty": "Interface content is empty, maybe the text is too long ~"
"Chat error": "Chat error",
"Messages empty": "Interface content is empty, maybe the text is too long ~",
"Select dataset empty": "You didn't choose any dataset.",
"user input empty": "User question is empty"
},
"feedback": {
"Close User Good Feedback": "",
@@ -315,6 +322,7 @@
"Read Source": "Read Source"
},
"response": {
"Plugin Resonse Detail": "Plugin Detail",
"context total length": "Context Length",
"module cq": "Question classification list",
"module cq result": "Classification Result",
@@ -442,6 +450,8 @@
"Chunk Split": "Chunk Split",
"Chunk Split Tip": "Select the files and split the by sentences",
"Csv format error": "The csv file format is incorrect, please ensure that the index and content columns are two",
"Custom split char": "Custom split char",
"Custom split char Tips": "Allows you to block according to custom delimiters. It is usually used for processed data, using specific delimiters to precisely block it.",
"Estimated Price": "Estimated Price",
"Estimated Price Tips": "Index generation is billed as: {{price}}/1k tokens",
"Fetch Error": "Get link failed",
@@ -541,6 +551,7 @@
"Http Request Url": "",
"TFSwitch textarea": "",
"anyInput": "",
"cfr background": "The background knowledge of the current conversation makes it easy to complete the first question and the fuzzy question, and only needs to briefly describe the scope of the current conversation.",
"dynamic input": "",
"textEditor textarea": "The passed variable can be referenced by {{key}}."
},
@@ -549,11 +560,16 @@
"Http Request Method": "",
"Http Request Url": "",
"TFSwitch textarea": "",
"aiModel": "",
"anyInput": "",
"cfr background": "Background",
"chat history": "chat history",
"switch": "Switch",
"textEditor textarea": "Text Edit",
"user question": "User question"
},
"placeholder": {
"cfr background": "Questions about the introduction and use of python. \nThe current dialogue is related to the game GTA5."
}
},
"inputType": {
@@ -574,6 +590,7 @@
"running done": "Triggered when the module call ends"
},
"label": {
"cfr result": "",
"result false": "",
"result true": "",
"running done": "End of module call ",
@@ -584,6 +601,8 @@
"TFSwitch": "",
"TFSwitch intro": "",
"UnKnow Module": "UnKnow Module",
"cfr": "",
"cfr intro": "Refine the current issue based on history, making it more conducive to knowledge base search, while improving continuous conversation capabilities.",
"textEditor": "Text Editor",
"textEditor intro": "Output of fixed or incoming text after edit"
},
@@ -837,6 +856,17 @@
"To Edit Plugin": "To Edit",
"Update Your Plugin": "Update Plugin"
},
"support": {
"user": {
"auth": {
"Sending Code": "Sending"
},
"login": {
"Github": "Github",
"Google": "Google"
}
}
},
"system": {
"Help Document": "Document"
},

View File

@@ -231,7 +231,9 @@
},
"app": {
"App params config": "应用配置",
"Chat Variable": "对话框变量",
"Next Step Guide": "下一步指引",
"Question Guide": "问题引导",
"Question Guide Tip": "对话结束后,会为生成 3 个引导性问题。",
"Save and preview": "保存并预览",
"Select TTS": "选择语音播放模式",
@@ -245,7 +247,9 @@
"Out Ad Edit": "您即将退出高级编排页面,请确认",
"Prompt Editor": "提示词编辑",
"Save and out": "保存并退出",
"UnSave": "不保存"
"UnSave": "不保存",
"cfr background prompt": "问题补全 - 对话背景描述",
"cfr background tip": "描述当前对话的范围便于AI补全首次问题或模糊的问题从而增强知识库连续对话的能力。\n为空时表示不使用问题补全功能。"
},
"feedback": {
"Custom feedback": "自定义反馈",
@@ -295,7 +299,10 @@
"Stop Speak": "停止录音",
"Type a message": "输入问题",
"error": {
"Messages empty": "接口内容为空,可能文本超长了~"
"Chat error": "对话出现异常",
"Messages empty": "接口内容为空,可能文本超长了~",
"Select dataset empty": "你没有选择知识库",
"user input empty": "传入的用户问题为空"
},
"feedback": {
"Close User Good Feedback": "",
@@ -315,6 +322,7 @@
"Read Source": "查看来源"
},
"response": {
"Plugin Resonse Detail": "插件详情",
"context total length": "上下文总长度",
"module cq": "问题分类列表",
"module cq result": "分类结果",
@@ -442,6 +450,8 @@
"Chunk Split": "直接分段",
"Chunk Split Tip": "选择文本文件,直接将其按分段进行处理",
"Csv format error": "csv 文件格式有误,请确保 index 和 content 两列",
"Custom split char": "自定义分隔符",
"Custom split char Tips": "允许你根据自定义的分隔符进行分块。通常用于已处理好的数据,使用特定的分隔符来精确分块。",
"Estimated Price": "预估价格",
"Estimated Price Tips": "索引生成计费为: {{price}}/1k tokens",
"Fetch Error": "获取链接失败",
@@ -479,7 +489,7 @@
"embeddingReRank": "增强语义检索",
"embeddingReRank desc": "超额进行向量 topk 查询后再使用 Rerank 进行排序,相关度通常差异明显。"
},
"search mode": "索模式"
"search mode": "索模式"
},
"status": {
"active": "已就绪",
@@ -541,6 +551,7 @@
"Http Request Url": "新的HTTP请求地址。如果出现两个“请求地址”可以删除该模块重新加入会拉取最新的模块配置。",
"TFSwitch textarea": "允许定义一些字符串来实现 false 匹配,每行一个,支持正则表达式。",
"anyInput": "可传入任意内容",
"cfr background": "描述当前对话的范围便于AI补全首次问题或模糊的问题从而增强知识库连续对话的能力。\n为空时表示【首次对话】不使用问题补全功能。",
"dynamic input": "接收用户动态添加的参数,会在运行时将这些参数平铺传入",
"textEditor textarea": "可以通过 {{key}} 的方式引用传入的变量。变量仅支持字符串或数字。"
},
@@ -549,11 +560,16 @@
"Http Request Method": "请求方式",
"Http Request Url": "请求地址",
"TFSwitch textarea": "自定义 False 匹配规则",
"aiModel": "AI 模型",
"anyInput": "任意内容输入",
"cfr background": "背景知识",
"chat history": "聊天记录",
"switch": "触发器",
"textEditor textarea": "文本编辑",
"user question": "用户问题"
},
"placeholder": {
"cfr background": "关于 python 的介绍和使用等问题。\n当前对话与游戏《GTA5》有关。"
}
},
"inputType": {
@@ -574,6 +590,7 @@
"running done": "模块调用结束时触发"
},
"label": {
"cfr result": "补全结果",
"result false": "False",
"result true": "True",
"running done": "模块调用结束",
@@ -584,6 +601,8 @@
"TFSwitch": "判断器",
"TFSwitch intro": "根据传入的内容进行 True False 输出。默认情况下,当传入的内容为 false, undefined, null, 0, none 时,会输出 false。你也可以增加一些自定义的字符串来补充输出 false 的内容。",
"UnKnow Module": "未知模块",
"cfr": "问题补全",
"cfr intro": "根据历史记录,完善当前问题,使其更利于知识库搜索,同时提高连续对话能力。",
"textEditor": "文本加工",
"textEditor intro": "可对固定或传入的文本进行加工后输出"
},
@@ -837,6 +856,17 @@
"To Edit Plugin": "去编辑",
"Update Your Plugin": "更新插件"
},
"support": {
"user": {
"auth": {
"Sending Code": "正在发送"
},
"login": {
"Github": "Github 登录",
"Google": "Google 登录"
}
}
},
"system": {
"Help Document": "帮助文档"
},

View File

@@ -18,11 +18,11 @@ const Badge = ({
{count > 0 && (
<Box position={'absolute'} right={0} top={0} transform={'translate(70%,-50%)'}>
{isDot ? (
<Box w={'5px'} h={'5px'} bg={'myRead.600'} borderRadius={'20px'}></Box>
<Box w={'5px'} h={'5px'} bg={'red.600'} borderRadius={'20px'}></Box>
) : (
<Box
color={'white'}
bg={'myRead.600'}
bg={'red.600'}
lineHeight={0.9}
borderRadius={'100px'}
px={'4px'}

View File

@@ -49,7 +49,7 @@ const FeedbackModal = ({
<Textarea ref={ref} rows={10} placeholder={t('chat.Feedback Modal Tip')} />
</ModalBody>
<ModalFooter>
<Button variant={'base'} mr={2} onClick={onClose}>
<Button variant={'whiteBase'} mr={2} onClick={onClose}>
{t('Cancel')}
</Button>
<Button isLoading={isLoading} onClick={mutate}>

View File

@@ -216,7 +216,7 @@ ${images.map((img) => JSON.stringify({ src: img.src })).join('\n')}
pl={5}
alignItems={'center'}
bg={'white'}
color={'blue.500'}
color={'primary.500'}
visibility={isSpeaking && isTransCription ? 'visible' : 'hidden'}
>
<Spinner size={'sm'} mr={4} />
@@ -244,7 +244,7 @@ ${images.map((img) => JSON.stringify({ src: img.src })).join('\n')}
alignItems={'center'}
justifyContent={'center'}
rounded={'md'}
color={'blue.500'}
color={'primary.500'}
top={0}
left={0}
bottom={0}
@@ -260,7 +260,7 @@ ${images.map((img) => JSON.stringify({ src: img.src })).join('\n')}
h={'16px'}
color={'myGray.700'}
cursor={'pointer'}
_hover={{ color: 'blue.500' }}
_hover={{ color: 'primary.500' }}
position={'absolute'}
bg={'white'}
right={'-8px'}
@@ -396,7 +396,7 @@ ${images.map((img) => JSON.stringify({ src: img.src })).join('\n')}
name={isSpeaking ? 'core/chat/stopSpeechFill' : 'core/chat/recordFill'}
width={['20px', '22px']}
height={['20px', '22px']}
color={'blue.500'}
color={'primary.500'}
/>
</MyTooltip>
</Flex>
@@ -415,7 +415,7 @@ ${images.map((img) => JSON.stringify({ src: img.src })).join('\n')}
h={['28px', '32px']}
w={['28px', '32px']}
borderRadius={'md'}
bg={isSpeaking || isChatting ? '' : !havInput ? '#E5E5E5' : 'blue.500'}
bg={isSpeaking || isChatting ? '' : !havInput ? '#E5E5E5' : 'primary.500'}
cursor={havInput ? 'pointer' : 'not-allowed'}
lineHeight={1}
onClick={() => {

View File

@@ -26,6 +26,43 @@ const QuoteModal = ({
isShare: boolean;
}) => {
const { t } = useTranslation();
return (
<>
<MyModal
isOpen={true}
onClose={onClose}
h={['90vh', '80vh']}
isCentered
minW={['90vw', '600px']}
iconSrc="/imgs/modal/quote.svg"
title={
<Box>
{t('core.chat.Quote Amount', { amount: rawSearch.length })}
<Box fontSize={'sm'} color={'myGray.500'} fontWeight={'normal'}>
{t('core.chat.quote.Quote Tip')}
</Box>
</Box>
}
>
<ModalBody whiteSpace={'pre-wrap'} textAlign={'justify'} wordBreak={'break-all'}>
<QuoteList rawSearch={rawSearch} isShare={isShare} />
</ModalBody>
</MyModal>
</>
);
};
export default QuoteModal;
export const QuoteList = React.memo(function QuoteList({
rawSearch = [],
isShare
}: {
rawSearch: SearchDataResponseItemType[];
isShare: boolean;
}) {
const { t } = useTranslation();
const { isPc } = useSystemStore();
const theme = useTheme();
const { toast } = useToast();
@@ -60,124 +97,104 @@ const QuoteModal = ({
return (
<>
<MyModal
isOpen={true}
onClose={onClose}
h={['90vh', '80vh']}
isCentered
minW={['90vw', '600px']}
iconSrc="/imgs/modal/quote.svg"
title={
<Box>
{t('core.chat.Quote Amount', { amount: rawSearch.length })}
<Box fontSize={'sm'} color={'myGray.500'} fontWeight={'normal'}>
{t('core.chat.quote.Quote Tip')}
</Box>
</Box>
}
>
<ModalBody whiteSpace={'pre-wrap'} textAlign={'justify'} wordBreak={'break-all'}>
{rawSearch.map((item, i) => (
<Box
key={i}
flex={'1 0 0'}
p={2}
borderRadius={'lg'}
border={theme.borders.base}
_notLast={{ mb: 2 }}
position={'relative'}
overflow={'hidden'}
_hover={{ '& .hover-data': { display: 'flex' } }}
bg={i % 2 === 0 ? 'white' : 'myWhite.500'}
>
<Flex alignItems={'flex-end'} mb={3} fontSize={'sm'}>
<RawSourceText
fontWeight={'bold'}
color={'black'}
sourceName={item.sourceName}
sourceId={item.sourceId}
canView={!isShare}
/>
<Box flex={1} />
{!isShare && (
<Link
as={NextLink}
className="hover-data"
display={'none'}
alignItems={'center'}
color={'blue.500'}
href={`/dataset/detail?datasetId=${item.datasetId}&currentTab=dataCard&collectionId=${item.collectionId}`}
>
{t('core.dataset.Go Dataset')}
<MyIcon name={'common/rightArrowLight'} w={'10px'} />
</Link>
)}
</Flex>
{rawSearch.map((item, i) => (
<Box
key={i}
flex={'1 0 0'}
p={2}
borderRadius={'lg'}
border={theme.borders.base}
_notLast={{ mb: 2 }}
position={'relative'}
overflow={'hidden'}
_hover={{ '& .hover-data': { display: 'flex' } }}
bg={i % 2 === 0 ? 'white' : 'myWhite.500'}
>
<Flex alignItems={'flex-end'} mb={3} fontSize={'sm'}>
<RawSourceText
fontWeight={'bold'}
color={'black'}
sourceName={item.sourceName}
sourceId={item.sourceId}
canView={!isShare}
/>
<Box flex={1} />
{!isShare && (
<Link
as={NextLink}
className="hover-data"
display={'none'}
alignItems={'center'}
color={'primary.500'}
href={`/dataset/detail?datasetId=${item.datasetId}&currentTab=dataCard&collectionId=${item.collectionId}`}
>
{t('core.dataset.Go Dataset')}
<MyIcon name={'common/rightArrowLight'} w={'10px'} />
</Link>
)}
</Flex>
<Box color={'black'}>{item.q}</Box>
<Box color={'myGray.600'}>{item.a}</Box>
{!isShare && (
<Flex alignItems={'center'} fontSize={'sm'} mt={3} gap={4} color={'myGray.500'}>
{isPc && (
<MyTooltip label={t('core.dataset.data.id')}>
<Flex border={theme.borders.base} py={'1px'} px={3} borderRadius={'3px'}>
# {item.id}
</Flex>
</MyTooltip>
)}
<MyTooltip label={t('core.dataset.Quote Length')}>
<Flex alignItems={'center'}>
<MyIcon name="common/text/t" w={'14px'} mr={1} color={'myGray.500'} />
{item.q.length + (item.a?.length || 0)}
</Flex>
</MyTooltip>
{!isShare && item.score && (
<MyTooltip label={t('core.dataset.Similarity')}>
<Flex alignItems={'center'}>
<MyIcon name={'kbTest'} w={'12px'} />
<Progress
mx={2}
w={['60px', '90px']}
value={item.score * 100}
size="sm"
borderRadius={'20px'}
colorScheme="myGray"
border={theme.borders.base}
/>
<Box>{item.score.toFixed(4)}</Box>
</Flex>
</MyTooltip>
)}
<Box flex={1} />
{item.id && (
<MyTooltip label={t('core.dataset.data.Edit')}>
<Box
bg={'rgba(255,255,255,0.9)'}
alignItems={'center'}
justifyContent={'center'}
boxShadow={'-10px 0 10px rgba(255,255,255,1)'}
>
<MyIcon
name={'edit'}
w={['16px', '18px']}
h={['16px', '18px']}
cursor={'pointer'}
color={'myGray.600'}
_hover={{
color: 'blue.600'
}}
onClick={() => onclickEdit(item)}
/>
</Box>
</MyTooltip>
)}
</Flex>
<Box color={'black'}>{item.q}</Box>
<Box color={'myGray.600'}>{item.a}</Box>
{!isShare && (
<Flex alignItems={'center'} fontSize={'sm'} mt={3} gap={4} color={'myGray.500'}>
{isPc && (
<MyTooltip label={t('core.dataset.data.id')}>
<Flex border={theme.borders.base} py={'1px'} px={3} borderRadius={'3px'}>
# {item.id}
</Flex>
</MyTooltip>
)}
</Box>
))}
</ModalBody>
<Loading fixed={false} />
</MyModal>
<MyTooltip label={t('core.dataset.Quote Length')}>
<Flex alignItems={'center'}>
<MyIcon name="common/text/t" w={'14px'} mr={1} color={'myGray.500'} />
{item.q.length + (item.a?.length || 0)}
</Flex>
</MyTooltip>
{!isShare && item.score && (
<MyTooltip label={t('core.dataset.Similarity')}>
<Flex alignItems={'center'}>
<MyIcon name={'kbTest'} w={'12px'} />
<Progress
mx={2}
w={['60px', '90px']}
value={item.score * 100}
size="sm"
borderRadius={'20px'}
colorScheme="myGray"
border={theme.borders.base}
/>
<Box>{item.score.toFixed(4)}</Box>
</Flex>
</MyTooltip>
)}
<Box flex={1} />
{item.id && (
<MyTooltip label={t('core.dataset.data.Edit')}>
<Box
bg={'rgba(255,255,255,0.9)'}
alignItems={'center'}
justifyContent={'center'}
boxShadow={'-10px 0 10px rgba(255,255,255,1)'}
>
<MyIcon
name={'edit'}
w={['16px', '18px']}
h={['16px', '18px']}
cursor={'pointer'}
color={'myGray.600'}
_hover={{
color: 'primary.600'
}}
onClick={() => onclickEdit(item)}
/>
</Box>
</MyTooltip>
)}
</Flex>
)}
</Box>
))}
{editInputData && editInputData.id && (
<InputDataModal
onClose={() => setEditInputData(undefined)}
@@ -191,8 +208,7 @@ const QuoteModal = ({
collectionId={editInputData.collectionId}
/>
)}
<Loading fixed={false} />
</>
);
};
export default QuoteModal;
});

View File

@@ -147,7 +147,7 @@ const ResponseTags = ({
name="common/routePushLight"
w={'14px'}
cursor={'pointer'}
_hover={{ color: 'blue.500' }}
_hover={{ color: 'primary.500' }}
onClick={async (e) => {
e.stopPropagation();
@@ -222,7 +222,11 @@ const ResponseTags = ({
<ContextModal context={contextModalData} onClose={() => setContextModalData(undefined)} />
)}
{isOpenWholeModal && (
<WholeResponseModal response={responseData} onClose={onCloseWholeModal} />
<WholeResponseModal
response={responseData}
isShare={isShare}
onClose={onCloseWholeModal}
/>
)}
</Flex>
</>

View File

@@ -70,7 +70,7 @@ const SelectMarkCollection = ({
}}
{...(selected
? {
bg: 'blue.200'
bg: 'primary.200'
}
: {})}
onClick={() => {
@@ -132,7 +132,7 @@ const SelectMarkCollection = ({
CustomFooter={
<ModalFooter>
<Button
variant={'base'}
variant={'whiteBase'}
mr={2}
onClick={() => {
setAdminMarkData({

View File

@@ -3,13 +3,14 @@ import { Box, useTheme, Flex, Image } from '@chakra-ui/react';
import type { ChatHistoryItemResType } from '@fastgpt/global/core/chat/type.d';
import { useTranslation } from 'next-i18next';
import { moduleTemplatesFlat } from '@/web/core/modules/template/system';
import Tabs from '../Tabs';
import Tabs from '../Tabs';
import MyModal from '../MyModal';
import MyTooltip from '../MyTooltip';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import { formatPrice } from '@fastgpt/global/support/wallet/bill/tools';
import Markdown from '../Markdown';
import { QuoteList } from './QuoteModal';
import { DatasetSearchModeMap } from '@fastgpt/global/core/dataset/constant';
function Row({
@@ -37,7 +38,9 @@ function Row({
fontSize={'sm'}
{...(isCodeBlock
? { transform: 'translateY(-3px)' }
: { px: 3, py: 1, border: theme.borders.base })}
: value
? { px: 3, py: 1, border: theme.borders.base }
: {})}
>
{value && <Markdown source={strValue} />}
{rawDom}
@@ -48,13 +51,51 @@ function Row({
const WholeResponseModal = ({
response,
isShare,
onClose
}: {
response: ChatHistoryItemResType[];
isShare: boolean;
onClose: () => void;
}) => {
const { t } = useTranslation();
return (
<MyModal
isCentered
isOpen={true}
onClose={onClose}
h={['90vh', '80vh']}
minW={['90vw', '600px']}
iconSrc="/imgs/modal/wholeRecord.svg"
title={
<Flex alignItems={'center'}>
{t('chat.Complete Response')}
<MyTooltip label={'从左往右,为各个模块的响应顺序'}>
<QuestionOutlineIcon ml={2} />
</MyTooltip>
</Flex>
}
>
<Flex h={'100%'} flexDirection={'column'}>
<ResponseBox response={response} isShare={isShare} />
</Flex>
</MyModal>
);
};
export default WholeResponseModal;
const ResponseBox = React.memo(function ResponseBox({
response,
isShare
}: {
response: ChatHistoryItemResType[];
isShare: boolean;
}) {
const theme = useTheme();
const { t } = useTranslation();
const list = useMemo(
() =>
response.map((item, i) => ({
@@ -83,145 +124,129 @@ const WholeResponseModal = ({
const activeModule = useMemo(() => response[Number(currentTab)], [currentTab, response]);
return (
<MyModal
isCentered
isOpen={true}
onClose={onClose}
h={['90vh', '80vh']}
w={['90vw', '500px']}
iconSrc="/imgs/modal/wholeRecord.svg"
title={
<Flex alignItems={'center'}>
{t('chat.Complete Response')}
<MyTooltip label={'从左往右,为各个模块的响应顺序'}>
<QuestionOutlineIcon ml={2} />
</MyTooltip>
</Flex>
}
>
<Flex h={'100%'} flexDirection={'column'}>
<Box>
<Tabs list={list} activeId={currentTab} onChange={setCurrentTab} />
</Box>
<Box py={2} px={4} flex={'1 0 0'} overflow={'auto'}>
<Row label={t('core.chat.response.module name')} value={t(activeModule.moduleName)} />
{activeModule?.price !== undefined && (
<Row
label={t('core.chat.response.module price')}
value={`${formatPrice(activeModule?.price)}`}
/>
)}
<>
<Box>
<Tabs list={list} activeId={currentTab} onChange={setCurrentTab} />
</Box>
<Box py={2} px={4} flex={'1 0 0'} overflow={'auto'}>
<Row label={t('core.chat.response.module name')} value={t(activeModule.moduleName)} />
{activeModule?.price !== undefined && (
<Row
label={t('core.chat.response.module time')}
value={`${activeModule?.runningTime || 0}s`}
label={t('core.chat.response.module price')}
value={`${formatPrice(activeModule?.price)}`}
/>
<Row label={t('core.chat.response.module tokens')} value={`${activeModule?.tokens}`} />
<Row label={t('core.chat.response.module model')} value={activeModule?.model} />
<Row label={t('core.chat.response.module query')} value={activeModule?.query} />
)}
<Row
label={t('core.chat.response.module time')}
value={`${activeModule?.runningTime || 0}s`}
/>
<Row label={t('core.chat.response.module tokens')} value={`${activeModule?.tokens}`} />
<Row label={t('core.chat.response.module model')} value={activeModule?.model} />
<Row label={t('core.chat.response.module query')} value={activeModule?.query} />
<Row
label={t('core.chat.response.context total length')}
value={activeModule?.contextTotalLen}
/>
{/* ai chat */}
<Row label={t('core.chat.response.module temperature')} value={activeModule?.temperature} />
<Row label={t('core.chat.response.module maxToken')} value={activeModule?.maxToken} />
<Row
label={t('core.chat.response.module historyPreview')}
rawDom={
activeModule.historyPreview ? (
<Box px={3} py={2} border={theme.borders.base} borderRadius={'md'}>
{activeModule.historyPreview?.map((item, i) => (
<Box
key={i}
_notLast={{
borderBottom: '1px solid',
borderBottomColor: 'myWhite.700',
mb: 2
}}
pb={2}
>
<Box fontWeight={'bold'}>{item.obj}</Box>
<Box whiteSpace={'pre-wrap'}>{item.value}</Box>
</Box>
))}
</Box>
) : (
''
)
}
/>
{activeModule.quoteList && activeModule.quoteList.length > 0 && (
<Row
label={t('core.chat.response.context total length')}
value={activeModule?.contextTotalLen}
label={t('core.chat.response.module quoteList')}
rawDom={<QuoteList isShare={isShare} rawSearch={activeModule.quoteList} />}
/>
)}
{/* ai chat */}
{/* dataset search */}
{activeModule?.searchMode && (
<Row
label={t('core.chat.response.module temperature')}
value={activeModule?.temperature}
label={t('core.dataset.search.search mode')}
// @ts-ignore
value={t(DatasetSearchModeMap[activeModule.searchMode]?.title)}
/>
<Row label={t('core.chat.response.module maxToken')} value={activeModule?.maxToken} />
)}
<Row label={t('core.chat.response.module similarity')} value={activeModule?.similarity} />
<Row label={t('core.chat.response.module limit')} value={activeModule?.limit} />
{/* classify question */}
<Row
label={t('core.chat.response.module cq')}
value={(() => {
if (!activeModule?.cqList) return '';
return activeModule.cqList.map((item) => `* ${item.value}`).join('\n');
})()}
/>
<Row label={t('core.chat.response.module cq result')} value={activeModule?.cqResult} />
{/* extract */}
<Row
label={t('core.chat.response.module extract description')}
value={activeModule?.extractDescription}
/>
{activeModule?.extractResult && (
<Row
label={t('core.chat.response.module historyPreview')}
rawDom={
activeModule.historyPreview ? (
<>
{activeModule.historyPreview?.map((item, i) => (
<Box
key={i}
_notLast={{
borderBottom: '1px solid',
borderBottomColor: 'myWhite.700',
mb: 2
}}
pb={2}
>
<Box fontWeight={'bold'}>{item.obj}</Box>
<Box whiteSpace={'pre-wrap'}>{item.value}</Box>
</Box>
))}
</>
) : (
''
)
}
label={t('core.chat.response.module extract result')}
value={`~~~json\n${JSON.stringify(activeModule?.extractResult, null, 2)}`}
/>
{activeModule.quoteList && activeModule.quoteList.length > 0 && (
<Row
label={t('core.chat.response.module quoteList')}
value={`~~~json\n${JSON.stringify(activeModule.quoteList, null, 2)}`}
/>
)}
)}
{/* dataset search */}
{activeModule?.searchMode && (
<Row
label={t('core.dataset.search.search mode')}
// @ts-ignore
value={t(DatasetSearchModeMap[activeModule.searchMode]?.title)}
/>
)}
<Row label={t('core.chat.response.module similarity')} value={activeModule?.similarity} />
<Row label={t('core.chat.response.module limit')} value={activeModule?.limit} />
{/* classify question */}
{/* http */}
{activeModule?.body && (
<Row
label={t('core.chat.response.module cq')}
value={(() => {
if (!activeModule?.cqList) return '';
return activeModule.cqList.map((item) => `* ${item.value}`).join('\n');
})()}
label={t('core.chat.response.module http body')}
value={`~~~json\n${JSON.stringify(activeModule?.body, null, 2)}`}
/>
<Row label={t('core.chat.response.module cq result')} value={activeModule?.cqResult} />
{/* extract */}
)}
{activeModule?.httpResult && (
<Row
label={t('core.chat.response.module extract description')}
value={activeModule?.extractDescription}
label={t('core.chat.response.module http result')}
value={`~~~json\n${JSON.stringify(activeModule?.httpResult, null, 2)}`}
/>
{activeModule?.extractResult && (
<Row
label={t('core.chat.response.module extract result')}
value={`~~~json\n${JSON.stringify(activeModule?.extractResult, null, 2)}`}
/>
)}
)}
{/* http */}
{activeModule?.body && (
<Row
label={t('core.chat.response.module http body')}
value={`~~~json\n${JSON.stringify(activeModule?.body, null, 2)}`}
/>
)}
{activeModule?.httpResult && (
<Row
label={t('core.chat.response.module http result')}
value={`~~~json\n${JSON.stringify(activeModule?.httpResult, null, 2)}`}
/>
)}
{/* plugin */}
{activeModule?.pluginDetail && activeModule?.pluginDetail.length > 0 && (
<Row
label={t('core.chat.response.Plugin Resonse Detail')}
rawDom={<ResponseBox response={activeModule.pluginDetail} isShare={isShare} />}
/>
)}
{activeModule?.pluginOutput && (
<Row
label={t('core.chat.response.plugin output')}
value={`~~~json\n${JSON.stringify(activeModule?.pluginOutput, null, 2)}`}
/>
)}
{/* plugin */}
{activeModule?.pluginOutput && (
<Row
label={t('core.chat.response.plugin output')}
value={`~~~json\n${JSON.stringify(activeModule?.pluginOutput, null, 2)}`}
/>
)}
{/* text editor */}
<Row label={t('core.chat.response.text output')} value={activeModule?.textOutput} />
</Box>
</Flex>
</MyModal>
{/* text output */}
<Row label={t('core.chat.response.text output')} value={activeModule?.textOutput} />
</Box>
</>
);
};
export default WholeResponseModal;
});

View File

@@ -349,7 +349,13 @@ const ChatBox = (
responseText,
isNewChat = false
} = await onStartChat({
chatList: newChatList,
chatList: newChatList.map((item) => ({
dataId: item.dataId,
obj: item.obj,
value: item.value,
status: item.status,
moduleName: item.moduleName
})),
messages,
controller: abortSignal,
generatingMessage,
@@ -386,7 +392,7 @@ const ChatBox = (
}, 100);
} catch (err: any) {
toast({
title: getErrText(err, '聊天出错了~'),
title: t(getErrText(err, 'core.chat.error.Chat error')),
status: 'error',
duration: 5000,
isClosable: true
@@ -419,7 +425,8 @@ const ChatBox = (
generatingMessage,
createQuestionGuide,
generatingScroll,
isPc
isPc,
t
]
);
@@ -498,7 +505,7 @@ const ChatBox = (
const colorMap = {
loading: 'myGray.700',
running: '#67c13b',
finish: 'blue.500'
finish: 'primary.500'
};
if (!isChatting) return;
const chatContent = chatHistory[chatHistory.length - 1];
@@ -666,7 +673,7 @@ const ChatBox = (
<Card
className="markdown"
{...MessageCardStyle}
bg={'blue.200'}
bg={'primary.200'}
borderRadius={'8px 0 8px 8px'}
textAlign={'left'}
>
@@ -1138,7 +1145,7 @@ function ChatAvatar({ src, type }: { src?: string; type: 'Human' | 'AI' }) {
borderRadius={'lg'}
border={theme.borders.base}
boxShadow={'0 0 5px rgba(0,0,0,0.1)'}
bg={type === 'Human' ? 'white' : 'blue.50'}
bg={type === 'Human' ? 'white' : 'primary.50'}
>
<Avatar src={src} w={'100%'} h={'100%'} />
</Box>
@@ -1219,7 +1226,7 @@ function ChatController({
<MyIcon
{...controlIconStyle}
name={'copy'}
_hover={{ color: 'blue.600' }}
_hover={{ color: 'primary.600' }}
onClick={() => copyData(chat.value)}
/>
</MyTooltip>

View File

@@ -19,7 +19,7 @@ const CommunityModal = ({ onClose }: { onClose: () => void }) => {
</ModalBody>
<ModalFooter>
<Button variant={'base'} onClick={onClose}>
<Button variant={'whiteBase'} onClick={onClose}>
</Button>
</ModalFooter>

View File

@@ -39,7 +39,7 @@ const Layout = ({ children }: { children: JSX.Element }) => {
const router = useRouter();
const { colorMode, setColorMode } = useColorMode();
const { Loading } = useLoading();
const { loading, setScreenWidth, isPc, loadGitStar } = useSystemStore();
const { loading, setScreenWidth, isPc } = useSystemStore();
const { userInfo } = useUserStore();
const isChatPage = useMemo(
@@ -61,12 +61,11 @@ const Layout = ({ children }: { children: JSX.Element }) => {
window.addEventListener('resize', resize);
resize();
loadGitStar();
return () => {
window.removeEventListener('resize', resize);
};
}, [loadGitStar, setScreenWidth]);
}, [setScreenWidth]);
const { data: unread = 0 } = useQuery(['getUnreadCount'], getUnreadCount, {
enabled: !!userInfo && !!feConfigs.isPlus,
@@ -75,14 +74,14 @@ const Layout = ({ children }: { children: JSX.Element }) => {
return (
<>
<Box h={'100%'} bg={'myWhite.600'}>
<Box h={'100%'} bg={'myGray.100'}>
{isPc === true && (
<>
{pcUnShowLayoutRoute[router.pathname] ? (
<Auth>{children}</Auth>
) : (
<>
<Box h={'100%'} position={'fixed'} left={0} top={0} w={'70px'}>
<Box h={'100%'} position={'fixed'} left={0} top={0} w={'64px'}>
<Navbar unread={unread} />
</Box>
<Box h={'100%'} ml={'70px'} overflow={'overlay'}>

View File

@@ -1,5 +1,5 @@
import React, { useMemo } from 'react';
import { Box, Flex, Link } from '@chakra-ui/react';
import { Box, BoxProps, Flex, Link, LinkProps } from '@chakra-ui/react';
import { useRouter } from 'next/router';
import { useUserStore } from '@/web/support/user/useUserStore';
import { useChatStore } from '@/web/core/chat/storeChat';
@@ -77,19 +77,16 @@ const Navbar = ({ unread }: { unread: number }) => {
[lastChatAppId, lastChatId, t]
);
const itemStyles: any = {
const itemStyles: BoxProps & LinkProps = {
my: 3,
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
cursor: 'pointer',
w: '54px',
h: '54px',
borderRadius: 'md',
_hover: {
bg: 'myWhite.600'
}
w: '48px',
h: '58px',
borderRadius: 'md'
};
return (
@@ -97,10 +94,8 @@ const Navbar = ({ unread }: { unread: number }) => {
flexDirection={'column'}
alignItems={'center'}
pt={6}
bg={'white'}
h={'100%'}
w={'100%'}
boxShadow={'2px 0px 8px 0px rgba(0,0,0,0.1)'}
userSelect={'none'}
>
{/* logo */}
@@ -113,13 +108,7 @@ const Navbar = ({ unread }: { unread: number }) => {
cursor={'pointer'}
onClick={() => router.push('/account')}
>
<Avatar
w={'36px'}
h={'36px'}
borderRadius={'50%'}
src={userInfo?.avatar}
fallbackSrc={HUMAN_ICON}
/>
<Avatar w={'36px'} h={'36px'} src={userInfo?.avatar} fallbackSrc={HUMAN_ICON} />
</Box>
{/* 导航列表 */}
<Box flex={1}>
@@ -129,13 +118,17 @@ const Navbar = ({ unread }: { unread: number }) => {
{...itemStyles}
{...(item.activeLink.includes(router.pathname)
? {
color: 'blue.600',
bg: 'white !important',
boxShadow: '1px 1px 10px rgba(0,0,0,0.2)'
color: 'primary.600',
bg: 'white',
boxShadow:
'0px 0px 1px 0px rgba(19, 51, 107, 0.08), 0px 4px 4px 0px rgba(19, 51, 107, 0.05)'
}
: {
color: 'myGray.500',
backgroundColor: 'transparent'
bg: 'transparent',
_hover: {
bg: 'rgba(255,255,255,0.9)'
}
})}
{...(item.link !== router.asPath
? {

View File

@@ -25,9 +25,15 @@ const Loading = ({
justifyContent={'center'}
flexDirection={'column'}
>
<Spinner thickness="4px" speed="0.65s" emptyColor="myGray.100" color="blue.500" size="xl" />
<Spinner
thickness="4px"
speed="0.65s"
emptyColor="myGray.100"
color="primary.500"
size="xl"
/>
{text && (
<Box mt={2} color="blue.600" fontWeight={'bold'}>
<Box mt={2} color="primary.600" fontWeight={'bold'}>
{text}
</Box>
)}

View File

@@ -23,7 +23,7 @@ function MyLink(e: any) {
<Box as={'li'} mb={1}>
<Box
as={'span'}
color={'blue.700'}
color={'primary.700'}
textDecoration={'underline'}
cursor={'pointer'}
onClick={() => {

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