4.6.4 (#588)
BIN
docSite/assets/imgs/webSync1.jpg
Normal file
|
After Width: | Height: | Size: 268 KiB |
BIN
docSite/assets/imgs/webSync10.jpg
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
docSite/assets/imgs/webSync2.jpg
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
docSite/assets/imgs/webSync3.jpg
Normal file
|
After Width: | Height: | Size: 190 KiB |
BIN
docSite/assets/imgs/webSync4.jpg
Normal file
|
After Width: | Height: | Size: 139 KiB |
BIN
docSite/assets/imgs/webSync5.jpg
Normal file
|
After Width: | Height: | Size: 322 KiB |
BIN
docSite/assets/imgs/webSync6.jpg
Normal file
|
After Width: | Height: | Size: 836 KiB |
BIN
docSite/assets/imgs/webSync7.jpg
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
docSite/assets/imgs/webSync8.jpg
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
docSite/assets/imgs/webSync9.jpg
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
78
docSite/content/docs/course/webSync.md
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
---
|
||||||
|
title: 'Web 站点同步'
|
||||||
|
description: 'FastGPT Web 站点同步功能介绍和使用方式'
|
||||||
|
icon: 'language'
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 105
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 什么是 Web 站点同步
|
||||||
|
|
||||||
|
Web 站点同步利用爬虫的技术,可以通过一个入口网站,自动捕获`同域名`下的所有网站,目前最多支持`200`个子页面。出于合规与安全角度,FastGPT 仅支持`静态站点`的爬取,主要用于各个文档站点快速构建知识库。
|
||||||
|
|
||||||
|
Tips: 国内的媒体站点基本不可用,公众号、csdn、知乎等。可以通过终端发送`curl`请求检测是否为静态站点,例如:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl ai.fastgpt.in
|
||||||
|
```
|
||||||
|
|
||||||
|
## 如何使用
|
||||||
|
|
||||||
|
### 1. 新建知识库,选择 Web 站点同步
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 2. 点击配置站点信息
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 3. 填写网址和选择器
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
好了, 现在点击开始同步,静等系统自动抓取网站信息即可。
|
||||||
|
|
||||||
|
|
||||||
|
## 创建应用,绑定知识库
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 选择器如何使用
|
||||||
|
|
||||||
|
选择器是 HTML CSS JS 的产物,你可以通过选择器来定位到你需要抓取的具体内容,而不是整个站点。使用方式为:
|
||||||
|
|
||||||
|
### 首先打开浏览器调试面板(通常是 F12,或者【右键 - 检查】)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 输入对应元素的选择器
|
||||||
|
|
||||||
|
[菜鸟教程 css 选择器](https://www.runoob.com/cssref/css-selectors.html),具体选择器的使用方式可以参考菜鸟教程。
|
||||||
|
|
||||||
|
上图中,我们选中了一个区域,对应的是`div`标签,它有 `data-prismjs-copy`, `data-prismjs-copy-success`, `data-prismjs-copy-error` 三个属性,这里我们用到一个就够。所以选择器是:
|
||||||
|
**`div[data-prismjs-copy]`**
|
||||||
|
|
||||||
|
除了属性选择器,常见的还有类和ID选择器。例如:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
上图 class 里的是类名(可能包含多个类名,都是空格隔开的,选择一个即可),选择器可以为:**`.docs-content`**
|
||||||
|
|
||||||
|
### 多选择器使用
|
||||||
|
|
||||||
|
在开头的演示中,我们对 FastGPT 文档是使用了多选择器的方式来选择,通过逗号隔开了两个选择器。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
我们希望选中上图两个标签中的内容,此时就需要两组选择器。一组是:`.docs-content .mb-0.d-flex`,含义是 `docs-content` 类下同时包含 `mb-0`和`d-flex` 两个类的子元素;
|
||||||
|
|
||||||
|
另一组是`.docs-content div[data-prismjs-copy]`,含义是`docs-content` 类下包含`data-prismjs-copy`属性的`div`元素。
|
||||||
|
|
||||||
|
把两组选择器用逗号隔开即可:`.docs-content .mb-0.d-flex, .docs-content div[data-prismjs-copy]`
|
||||||
@ -1,16 +1,15 @@
|
|||||||
---
|
---
|
||||||
title: '接入微软、ChatGLM、本地模型等'
|
title: '接入微软、ChatGLM、本地模型等'
|
||||||
description: '通过接入 One API 来实现对各种大模型的支持'
|
description: '部署和接入 OneAPI,实现对各种大模型的支持'
|
||||||
icon: 'Api'
|
icon: 'Api'
|
||||||
draft: false
|
draft: false
|
||||||
toc: true
|
toc: true
|
||||||
weight: 708
|
weight: 708
|
||||||
---
|
---
|
||||||
|
|
||||||
* 默认情况下,FastGPT 只配置了 GPT 的 3 个模型,如果你需要接入其他模型,需要进行一些额外配置。
|
* 默认情况下,FastGPT 只配置了 GPT 的模型,如果你需要接入其他模型,需要进行一些额外配置。
|
||||||
* [One API](https://github.com/songquanpeng/one-api) 是一个 OpenAI 接口管理 & 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。
|
* [One API](https://github.com/songquanpeng/one-api) 是一个 OpenAI 接口管理 & 分发系统,可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。
|
||||||
|
* FastGPT 可以通过接入 OneAPI 来实现对不同大模型的支持。OneAPI 的部署方法也很简单。
|
||||||
FastGPT 可以通过接入 One API 来实现对各种大模型的支持。部署方法也很简单。
|
|
||||||
|
|
||||||
## MySQL 版本
|
## MySQL 版本
|
||||||
|
|
||||||
|
|||||||
@ -179,7 +179,7 @@ curl --location --request POST 'https://fastgpt.run/api/core/dataset/searchTest'
|
|||||||
{{< tab tabName="响应示例" >}}
|
{{< tab tabName="响应示例" >}}
|
||||||
{{< markdownify >}}
|
{{< markdownify >}}
|
||||||
|
|
||||||
返回 top limit 结果
|
返回 top k 结果, limit 为预估条数,会按每条数据 800 tokens 的长度进行预估,20条也就是返回 16000 tokens 长度的数据,最多测试 30000 tokens 的数据。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
{
|
{
|
||||||
|
|||||||
41
docSite/content/docs/development/upgrading/464.md
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
---
|
||||||
|
title: 'V4.6.4(需要初始化)'
|
||||||
|
description: 'FastGPT V4.6.4'
|
||||||
|
icon: 'upgrade'
|
||||||
|
draft: false
|
||||||
|
toc: true
|
||||||
|
weight: 832
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1。执行初始化 API
|
||||||
|
|
||||||
|
发起 1 个 HTTP 请求 ({{rootkey}} 替换成环境变量里的 `rootkey`,{{host}} 替换成自己域名)
|
||||||
|
|
||||||
|
1. https://xxxxx/api/admin/initv464
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl --location --request POST 'https://{{host}}/api/admin/initv464' \
|
||||||
|
--header 'rootkey: {{rootkey}}' \
|
||||||
|
--header 'Content-Type: application/json'
|
||||||
|
```
|
||||||
|
|
||||||
|
初始化说明:
|
||||||
|
1. 初始化 PG 的createTime字段
|
||||||
|
2. 初始化 Mongo 中 chat 的 feedback 字段
|
||||||
|
|
||||||
|
|
||||||
|
## V4.6.4 功能介绍
|
||||||
|
|
||||||
|
1. 重写 - 分享链接身份逻辑,采用 localID 记录用户的ID。
|
||||||
|
2. 商业版新增 - 分享链接 SSO 方案,通过`身份鉴权`地址,仅需`3个接口`即可完全接入已有用户系统。具体参考[分享链接身份鉴权](/docs/development/openapi/share/)
|
||||||
|
3. 调整 - 知识库搜索模块 topk 逻辑,采用 MaxToken 计算,兼容不同长度的文本块
|
||||||
|
4. 调整鉴权顺序,提高 apikey 的优先级,避免cookie抢占 apikey 的鉴权。
|
||||||
|
5. 链接读取支持多选择器。参考[Web 站点同步用法](/docs/course/webSync)
|
||||||
|
6. 修复 - 分享链接图片上传鉴权问题
|
||||||
|
7. 修复 - Mongo 连接池未释放问题。
|
||||||
|
8. 修复 - Dataset Intro 无法更新
|
||||||
|
9. 修复 - md 代码块问题
|
||||||
|
10. 修复 - root 权限问题
|
||||||
|
11. 优化 docker file
|
||||||
|
|
||||||
|
|
||||||
2
packages/global/common/system/constants.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export const HUMAN_ICON = `/icon/human.svg`;
|
||||||
|
export const LOGO_ICON = `/icon/logo.svg`;
|
||||||
@ -9,6 +9,7 @@ export type FeConfigsType = {
|
|||||||
hide_app_flow?: boolean;
|
hide_app_flow?: boolean;
|
||||||
concatMd?: string;
|
concatMd?: string;
|
||||||
docUrl?: string;
|
docUrl?: string;
|
||||||
|
chatbotUrl?: string;
|
||||||
openAPIDocUrl?: string;
|
openAPIDocUrl?: string;
|
||||||
systemTitle?: string;
|
systemTitle?: string;
|
||||||
googleClientVerKey?: string;
|
googleClientVerKey?: string;
|
||||||
|
|||||||
8
packages/global/core/chat/api.d.ts
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
export type UpdateChatFeedbackProps = {
|
||||||
|
chatId: string;
|
||||||
|
chatItemId: string;
|
||||||
|
shareId?: string;
|
||||||
|
outLinkUid?: string;
|
||||||
|
userBadFeedback?: string;
|
||||||
|
userGoodFeedback?: string;
|
||||||
|
};
|
||||||
@ -50,9 +50,6 @@ export enum ChatStatusEnum {
|
|||||||
finish = 'finish'
|
finish = 'finish'
|
||||||
}
|
}
|
||||||
|
|
||||||
export const HUMAN_ICON = `/icon/human.svg`;
|
|
||||||
export const LOGO_ICON = `/icon/logo.svg`;
|
|
||||||
|
|
||||||
export const IMG_BLOCK_KEY = 'img-block';
|
export const IMG_BLOCK_KEY = 'img-block';
|
||||||
export const FILE_BLOCK_KEY = 'file-block';
|
export const FILE_BLOCK_KEY = 'file-block';
|
||||||
|
|
||||||
|
|||||||
7
packages/global/core/chat/type.d.ts
vendored
@ -38,7 +38,9 @@ export type ChatItemSchema = {
|
|||||||
time: Date;
|
time: Date;
|
||||||
obj: `${ChatRoleEnum}`;
|
obj: `${ChatRoleEnum}`;
|
||||||
value: string;
|
value: string;
|
||||||
userFeedback?: string;
|
userGoodFeedback?: string;
|
||||||
|
userBadFeedback?: string;
|
||||||
|
robotBadFeedback?: string;
|
||||||
adminFeedback?: AdminFbkType;
|
adminFeedback?: AdminFbkType;
|
||||||
[ModuleOutputKeyEnum.responseData]?: ChatHistoryItemResType[];
|
[ModuleOutputKeyEnum.responseData]?: ChatHistoryItemResType[];
|
||||||
};
|
};
|
||||||
@ -56,7 +58,8 @@ export type ChatItemType = {
|
|||||||
dataId?: string;
|
dataId?: string;
|
||||||
obj: ChatItemSchema['obj'];
|
obj: ChatItemSchema['obj'];
|
||||||
value: any;
|
value: any;
|
||||||
userFeedback?: string;
|
userGoodFeedback?: string;
|
||||||
|
userBadFeedback?: string;
|
||||||
adminFeedback?: ChatItemSchema['feedback'];
|
adminFeedback?: ChatItemSchema['feedback'];
|
||||||
[ModuleOutputKeyEnum.responseData]?: ChatHistoryItemResType[];
|
[ModuleOutputKeyEnum.responseData]?: ChatHistoryItemResType[];
|
||||||
};
|
};
|
||||||
|
|||||||
3
packages/global/core/dataset/api.d.ts
vendored
@ -25,6 +25,8 @@ export type CreateDatasetCollectionParams = {
|
|||||||
chunkSize?: number;
|
chunkSize?: number;
|
||||||
fileId?: string;
|
fileId?: string;
|
||||||
rawLink?: string;
|
rawLink?: string;
|
||||||
|
qaPrompt?: string;
|
||||||
|
hashRawText?: string;
|
||||||
metadata?: Record<string, any>;
|
metadata?: Record<string, any>;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -40,6 +42,7 @@ export type PgSearchRawType = {
|
|||||||
export type PushDatasetDataChunkProps = {
|
export type PushDatasetDataChunkProps = {
|
||||||
q: string; // embedding content
|
q: string; // embedding content
|
||||||
a?: string; // bonus content
|
a?: string; // bonus content
|
||||||
|
chunkIndex?: number;
|
||||||
indexes?: Omit<DatasetDataIndexItemType, 'dataId'>[];
|
indexes?: Omit<DatasetDataIndexItemType, 'dataId'>[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
3
packages/global/core/dataset/type.d.ts
vendored
@ -45,6 +45,8 @@ export type DatasetCollectionSchemaType = {
|
|||||||
chunkSize: number;
|
chunkSize: number;
|
||||||
fileId?: string;
|
fileId?: string;
|
||||||
rawLink?: string;
|
rawLink?: string;
|
||||||
|
qaPrompt?: string;
|
||||||
|
hashRawText?: string;
|
||||||
metadata?: Record<string, any>;
|
metadata?: Record<string, any>;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -134,6 +136,7 @@ export type DatasetDataItemType = {
|
|||||||
sourceId?: string;
|
sourceId?: string;
|
||||||
q: string;
|
q: string;
|
||||||
a: string;
|
a: string;
|
||||||
|
chunkIndex: number;
|
||||||
indexes: DatasetDataIndexItemType[];
|
indexes: DatasetDataIndexItemType[];
|
||||||
isOwner: boolean;
|
isOwner: boolean;
|
||||||
canWrite: boolean;
|
canWrite: boolean;
|
||||||
|
|||||||
@ -1,4 +1,22 @@
|
|||||||
|
export enum UserStatusEnum {
|
||||||
|
active = 'active',
|
||||||
|
forbidden = 'forbidden'
|
||||||
|
}
|
||||||
|
export const userStatusMap = {
|
||||||
|
[UserStatusEnum.active]: {
|
||||||
|
label: 'support.user.status.active'
|
||||||
|
},
|
||||||
|
[UserStatusEnum.forbidden]: {
|
||||||
|
label: 'support.user.status.forbidden'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export enum OAuthEnum {
|
export enum OAuthEnum {
|
||||||
github = 'github',
|
github = 'github',
|
||||||
google = 'google'
|
google = 'google'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum UserAuthTypeEnum {
|
||||||
|
register = 'register',
|
||||||
|
findPassword = 'findPassword'
|
||||||
|
}
|
||||||
|
|||||||
3
packages/global/support/user/type.d.ts
vendored
@ -1,4 +1,4 @@
|
|||||||
import { InformTypeEnum } from './constant';
|
import { InformTypeEnum, UserStatusEnum } from './constant';
|
||||||
import { TeamItemType } from './team/type';
|
import { TeamItemType } from './team/type';
|
||||||
|
|
||||||
export type UserModelSchema = {
|
export type UserModelSchema = {
|
||||||
@ -12,6 +12,7 @@ export type UserModelSchema = {
|
|||||||
openaiKey: string;
|
openaiKey: string;
|
||||||
createTime: number;
|
createTime: number;
|
||||||
timezone: string;
|
timezone: string;
|
||||||
|
status: `${UserStatusEnum}`;
|
||||||
openaiAccount?: {
|
openaiAccount?: {
|
||||||
key: string;
|
key: string;
|
||||||
baseUrl: string;
|
baseUrl: string;
|
||||||
|
|||||||
@ -70,7 +70,7 @@ instance.interceptors.request.use(requestStart, (err) => Promise.reject(err));
|
|||||||
instance.interceptors.response.use(responseSuccess, (err) => Promise.reject(err));
|
instance.interceptors.response.use(responseSuccess, (err) => Promise.reject(err));
|
||||||
|
|
||||||
export function request(url: string, data: any, config: ConfigType, method: Method): any {
|
export function request(url: string, data: any, config: ConfigType, method: Method): any {
|
||||||
if (!global.systemEnv?.pluginBaseUrl) {
|
if (global.systemEnv && !global.systemEnv?.pluginBaseUrl) {
|
||||||
return Promise.reject('该功能为商业版特有...');
|
return Promise.reject('该功能为商业版特有...');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,10 @@ const ImageSchema = new Schema({
|
|||||||
ref: TeamCollectionName,
|
ref: TeamCollectionName,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
|
createTime: {
|
||||||
|
type: Date,
|
||||||
|
default: () => new Date()
|
||||||
|
},
|
||||||
binary: {
|
binary: {
|
||||||
type: Buffer
|
type: Buffer
|
||||||
},
|
},
|
||||||
@ -25,7 +29,10 @@ try {
|
|||||||
console.log(error);
|
console.log(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const MongoImage: Model<{ teamId: string; binary: Buffer; metadata?: Record<string, any> }> =
|
export const MongoImage: Model<{
|
||||||
models['image'] || model('image', ImageSchema);
|
teamId: string;
|
||||||
|
binary: Buffer;
|
||||||
|
metadata?: { fileId?: string };
|
||||||
|
}> = models['image'] || model('image', ImageSchema);
|
||||||
|
|
||||||
MongoImage.syncIndexes();
|
MongoImage.syncIndexes();
|
||||||
|
|||||||
@ -1,26 +0,0 @@
|
|||||||
/* add logger */
|
|
||||||
export const addLog = {
|
|
||||||
info: (msg: string, obj?: Record<string, any>) => {
|
|
||||||
global.logger?.info(msg, { meta: obj });
|
|
||||||
},
|
|
||||||
error: (msg: string, error?: any) => {
|
|
||||||
global.logger?.error(msg, {
|
|
||||||
meta: {
|
|
||||||
stack: error?.stack,
|
|
||||||
...(error?.config && {
|
|
||||||
config: {
|
|
||||||
headers: error.config.headers,
|
|
||||||
url: error.config.url,
|
|
||||||
data: error.config.data
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
...(error?.response && {
|
|
||||||
response: {
|
|
||||||
status: error.response.status,
|
|
||||||
statusText: error.response.statusText
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@ -1,6 +1,4 @@
|
|||||||
import mongoose from './index';
|
import mongoose from './index';
|
||||||
import { createLogger, format, transports } from 'winston';
|
|
||||||
import 'winston-mongodb';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* connect MongoDB and init data
|
* connect MongoDB and init data
|
||||||
@ -36,7 +34,6 @@ export async function connectMongo({
|
|||||||
});
|
});
|
||||||
|
|
||||||
console.log('mongo connected');
|
console.log('mongo connected');
|
||||||
initLogger();
|
|
||||||
|
|
||||||
afterHook && (await afterHook());
|
afterHook && (await afterHook());
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -45,35 +42,3 @@ export async function connectMongo({
|
|||||||
global.mongodb = undefined;
|
global.mongodb = undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function initLogger() {
|
|
||||||
global.logger = createLogger({
|
|
||||||
transports: [
|
|
||||||
new transports.MongoDB({
|
|
||||||
db: process.env.MONGODB_URI as string,
|
|
||||||
collection: 'server_logs',
|
|
||||||
options: {
|
|
||||||
useUnifiedTopology: true
|
|
||||||
},
|
|
||||||
cappedSize: 500000000,
|
|
||||||
tryReconnect: true,
|
|
||||||
metaKey: 'meta',
|
|
||||||
format: format.combine(format.timestamp(), format.json())
|
|
||||||
}),
|
|
||||||
new transports.Console({
|
|
||||||
format: format.combine(
|
|
||||||
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
|
||||||
format.printf((info) => {
|
|
||||||
if (info.level === 'error') {
|
|
||||||
console.log(info.meta);
|
|
||||||
return `[${info.level.toLocaleUpperCase()}]: ${[info.timestamp]}: ${info.message}`;
|
|
||||||
}
|
|
||||||
return `[${info.level.toLocaleUpperCase()}]: ${[info.timestamp]}: ${info.message}${
|
|
||||||
info.meta ? `: ${JSON.stringify(info.meta)}` : ''
|
|
||||||
}`;
|
|
||||||
})
|
|
||||||
)
|
|
||||||
})
|
|
||||||
]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|||||||
1
packages/service/common/mongo/type.d.ts
vendored
@ -3,5 +3,4 @@ import type { Logger } from 'winston';
|
|||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
var mongodb: Mongoose | undefined;
|
var mongodb: Mongoose | undefined;
|
||||||
var logger: Logger;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -171,9 +171,10 @@ export async function initPg() {
|
|||||||
tmb_id VARCHAR(50) NOT NULL,
|
tmb_id VARCHAR(50) NOT NULL,
|
||||||
dataset_id VARCHAR(50) NOT NULL,
|
dataset_id VARCHAR(50) NOT NULL,
|
||||||
collection_id VARCHAR(50) NOT NULL,
|
collection_id VARCHAR(50) NOT NULL,
|
||||||
data_id VARCHAR(50) NOT NULL
|
data_id VARCHAR(50) NOT NULL,
|
||||||
|
createTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
);
|
);
|
||||||
CREATE INDEX IF NOT EXISTS vector_index ON ${PgDatasetTableName} USING hnsw (vector vector_ip_ops) WITH (m = 24, ef_construction = 64);
|
CREATE INDEX IF NOT EXISTS vector_index ON ${PgDatasetTableName} USING hnsw (vector vector_ip_ops) WITH (m = 32, ef_construction = 64);
|
||||||
`);
|
`);
|
||||||
|
|
||||||
console.log('init pg successful');
|
console.log('init pg successful');
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import type { NextApiResponse } from 'next';
|
import type { NextApiResponse } from 'next';
|
||||||
import { sseResponseEventEnum } from './constant';
|
import { sseResponseEventEnum } from './constant';
|
||||||
import { proxyError, ERROR_RESPONSE, ERROR_ENUM } from '@fastgpt/global/common/error/errorCode';
|
import { proxyError, ERROR_RESPONSE, ERROR_ENUM } from '@fastgpt/global/common/error/errorCode';
|
||||||
import { addLog } from '../mongo/controller';
|
import { addLog } from '../system/log';
|
||||||
import { clearCookie } from '../../support/permission/controller';
|
import { clearCookie } from '../../support/permission/controller';
|
||||||
|
|
||||||
export interface ResponseType<T = any> {
|
export interface ResponseType<T = any> {
|
||||||
|
|||||||
15
packages/service/common/system/config/controller.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { SystemConfigsTypeEnum } from '@fastgpt/global/common/system/config/constants';
|
||||||
|
import { MongoSystemConfigs } from './schema';
|
||||||
|
import { FeConfigsType } from '@fastgpt/global/common/system/types';
|
||||||
|
|
||||||
|
export const getFastGPTFeConfig = async () => {
|
||||||
|
const res = await MongoSystemConfigs.findOne({
|
||||||
|
type: SystemConfigsTypeEnum.fastgpt
|
||||||
|
}).sort({
|
||||||
|
createTime: -1
|
||||||
|
});
|
||||||
|
|
||||||
|
const config: FeConfigsType = res?.value?.FeConfig || {};
|
||||||
|
|
||||||
|
return config;
|
||||||
|
};
|
||||||
@ -19,14 +19,15 @@ const systemConfigSchema = new Schema({
|
|||||||
type: Date,
|
type: Date,
|
||||||
default: () => new Date()
|
default: () => new Date()
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
systemConfigSchema.index({ createTime: -1 }, { expireAfterSeconds: 90 * 24 * 60 * 60 });
|
systemConfigSchema.index({ createTime: -1 }, { expireAfterSeconds: 90 * 24 * 60 * 60 });
|
||||||
|
systemConfigSchema.index({ type: 1 });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const MongoSystemConfigs: Model<SystemConfigsType>=
|
export const MongoSystemConfigs: Model<SystemConfigsType> =
|
||||||
models[collectionName] || model(collectionName, systemConfigSchema);
|
models[collectionName] || model(collectionName, systemConfigSchema);
|
||||||
MongoSystemConfigs.syncIndexes();
|
MongoSystemConfigs.syncIndexes();
|
||||||
|
|||||||
66
packages/service/common/system/log.ts
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
import dayjs from 'dayjs';
|
||||||
|
|
||||||
|
/* add logger */
|
||||||
|
export const addLog = {
|
||||||
|
log(level: 'info' | 'warn' | 'error', msg: string, obj: Record<string, any> = {}) {
|
||||||
|
console.log(
|
||||||
|
`[${level.toLocaleUpperCase()}] ${dayjs().format(
|
||||||
|
'YYYY-MM-DD HH:mm:ss'
|
||||||
|
)} ${msg}: ${JSON.stringify(obj)}`
|
||||||
|
);
|
||||||
|
|
||||||
|
const lokiUrl = process.env.LOKI_LOG_URL as string;
|
||||||
|
if (!lokiUrl) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
fetch(lokiUrl, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
streams: [
|
||||||
|
{
|
||||||
|
stream: {
|
||||||
|
level
|
||||||
|
},
|
||||||
|
values: [
|
||||||
|
[
|
||||||
|
`${Date.now() * 1000000}`,
|
||||||
|
JSON.stringify({
|
||||||
|
message: msg,
|
||||||
|
...obj
|
||||||
|
})
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
});
|
||||||
|
} catch (error) {}
|
||||||
|
},
|
||||||
|
info(msg: string, obj?: Record<string, any>) {
|
||||||
|
this.log('info', msg, obj);
|
||||||
|
},
|
||||||
|
warn(msg: string, obj?: Record<string, any>) {
|
||||||
|
this.log('warn', msg, obj);
|
||||||
|
},
|
||||||
|
error(msg: string, error?: any) {
|
||||||
|
this.log('error', msg, {
|
||||||
|
stack: error?.stack,
|
||||||
|
...(error?.config && {
|
||||||
|
config: {
|
||||||
|
headers: error.config.headers,
|
||||||
|
url: error.config.url,
|
||||||
|
data: error.config.data
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
...(error?.response && {
|
||||||
|
response: {
|
||||||
|
status: error.response.status,
|
||||||
|
statusText: error.response.statusText
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -54,7 +54,14 @@ const ChatItemSchema = new Schema({
|
|||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: ''
|
||||||
},
|
},
|
||||||
userFeedback: {
|
userGoodFeedback: {
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
userFeedback: String,
|
||||||
|
userBadFeedback: {
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
robotBadFeedback: {
|
||||||
type: String
|
type: String
|
||||||
},
|
},
|
||||||
adminFeedback: {
|
adminFeedback: {
|
||||||
@ -77,7 +84,10 @@ try {
|
|||||||
ChatItemSchema.index({ userId: 1 });
|
ChatItemSchema.index({ userId: 1 });
|
||||||
ChatItemSchema.index({ appId: 1 });
|
ChatItemSchema.index({ appId: 1 });
|
||||||
ChatItemSchema.index({ chatId: 1 });
|
ChatItemSchema.index({ chatId: 1 });
|
||||||
ChatItemSchema.index({ userFeedback: 1 });
|
ChatItemSchema.index({ userGoodFeedback: 1 });
|
||||||
|
ChatItemSchema.index({ userBadFeedback: 1 });
|
||||||
|
ChatItemSchema.index({ robotBadFeedback: 1 });
|
||||||
|
ChatItemSchema.index({ adminFeedback: 1 });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,8 @@ import type { CreateDatasetCollectionParams } from '@fastgpt/global/core/dataset
|
|||||||
import { MongoDatasetCollection } from './schema';
|
import { MongoDatasetCollection } from './schema';
|
||||||
|
|
||||||
export async function createOneCollection({
|
export async function createOneCollection({
|
||||||
|
teamId,
|
||||||
|
tmbId,
|
||||||
name,
|
name,
|
||||||
parentId,
|
parentId,
|
||||||
datasetId,
|
datasetId,
|
||||||
@ -14,8 +16,8 @@ export async function createOneCollection({
|
|||||||
chunkSize = 0,
|
chunkSize = 0,
|
||||||
fileId,
|
fileId,
|
||||||
rawLink,
|
rawLink,
|
||||||
teamId,
|
qaPrompt,
|
||||||
tmbId,
|
hashRawText,
|
||||||
metadata = {}
|
metadata = {}
|
||||||
}: CreateDatasetCollectionParams & { teamId: string; tmbId: string }) {
|
}: CreateDatasetCollectionParams & { teamId: string; tmbId: string }) {
|
||||||
const { _id } = await MongoDatasetCollection.create({
|
const { _id } = await MongoDatasetCollection.create({
|
||||||
@ -29,6 +31,8 @@ export async function createOneCollection({
|
|||||||
chunkSize,
|
chunkSize,
|
||||||
fileId,
|
fileId,
|
||||||
rawLink,
|
rawLink,
|
||||||
|
qaPrompt,
|
||||||
|
hashRawText,
|
||||||
metadata
|
metadata
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -71,3 +75,19 @@ export function createDefaultCollection({
|
|||||||
updateTime: new Date('2099')
|
updateTime: new Date('2099')
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check same collection
|
||||||
|
export const getSameRawTextCollection = async ({
|
||||||
|
datasetId,
|
||||||
|
hashRawText
|
||||||
|
}: {
|
||||||
|
datasetId: string;
|
||||||
|
hashRawText?: string;
|
||||||
|
}) => {
|
||||||
|
const collection = await MongoDatasetCollection.findOne({
|
||||||
|
datasetId,
|
||||||
|
hashRawText
|
||||||
|
});
|
||||||
|
|
||||||
|
return collection;
|
||||||
|
};
|
||||||
|
|||||||
@ -72,6 +72,12 @@ const DatasetCollectionSchema = new Schema({
|
|||||||
rawLink: {
|
rawLink: {
|
||||||
type: String
|
type: String
|
||||||
},
|
},
|
||||||
|
qaPrompt: {
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
hashRawText: {
|
||||||
|
type: String
|
||||||
|
},
|
||||||
metadata: {
|
metadata: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: {}
|
default: {}
|
||||||
@ -82,6 +88,7 @@ try {
|
|||||||
DatasetCollectionSchema.index({ datasetId: 1 });
|
DatasetCollectionSchema.index({ datasetId: 1 });
|
||||||
DatasetCollectionSchema.index({ datasetId: 1, parentId: 1 });
|
DatasetCollectionSchema.index({ datasetId: 1, parentId: 1 });
|
||||||
DatasetCollectionSchema.index({ updateTime: -1 });
|
DatasetCollectionSchema.index({ updateTime: -1 });
|
||||||
|
DatasetCollectionSchema.index({ hashRawText: -1 });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,22 +16,22 @@ export async function delDatasetRelevantData({ datasetIds }: { datasetIds: strin
|
|||||||
datasetId: { $in: datasetIds }
|
datasetId: { $in: datasetIds }
|
||||||
});
|
});
|
||||||
|
|
||||||
// delete related files
|
await delay(2000);
|
||||||
await Promise.all(
|
|
||||||
datasetIds.map((id) => delFileByMetadata({ bucketName: BucketNameEnum.dataset, datasetId: id }))
|
|
||||||
);
|
|
||||||
|
|
||||||
await delay(500);
|
|
||||||
|
|
||||||
// delete pg data
|
|
||||||
await deletePgDataById(`dataset_id IN ('${datasetIds.join("','")}')`);
|
|
||||||
// delete dataset.datas
|
// delete dataset.datas
|
||||||
await MongoDatasetData.deleteMany({ datasetId: { $in: datasetIds } });
|
await MongoDatasetData.deleteMany({ datasetId: { $in: datasetIds } });
|
||||||
|
// delete pg data
|
||||||
|
await deletePgDataById(`dataset_id IN ('${datasetIds.join("','")}')`);
|
||||||
|
|
||||||
// delete collections
|
// delete collections
|
||||||
await MongoDatasetCollection.deleteMany({
|
await MongoDatasetCollection.deleteMany({
|
||||||
datasetId: { $in: datasetIds }
|
datasetId: { $in: datasetIds }
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// delete related files
|
||||||
|
await Promise.all(
|
||||||
|
datasetIds.map((id) => delFileByMetadata({ bucketName: BucketNameEnum.dataset, datasetId: id }))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* delete all data by collectionIds
|
* delete all data by collectionIds
|
||||||
@ -51,6 +51,18 @@ export async function delCollectionRelevantData({
|
|||||||
collectionId: { $in: collectionIds }
|
collectionId: { $in: collectionIds }
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await delay(2000);
|
||||||
|
|
||||||
|
// delete dataset.datas
|
||||||
|
await MongoDatasetData.deleteMany({ collectionId: { $in: collectionIds } });
|
||||||
|
// delete pg data
|
||||||
|
await deletePgDataById(`collection_id IN ('${collectionIds.join("','")}')`);
|
||||||
|
|
||||||
|
// delete collections
|
||||||
|
await MongoDatasetCollection.deleteMany({
|
||||||
|
_id: { $in: collectionIds }
|
||||||
|
});
|
||||||
|
|
||||||
// delete file and imgs
|
// delete file and imgs
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
delImgByFileIdList(filterFileIds),
|
delImgByFileIdList(filterFileIds),
|
||||||
@ -59,13 +71,6 @@ export async function delCollectionRelevantData({
|
|||||||
fileIdList: filterFileIds
|
fileIdList: filterFileIds
|
||||||
})
|
})
|
||||||
]);
|
]);
|
||||||
|
|
||||||
await delay(500);
|
|
||||||
|
|
||||||
// delete pg data
|
|
||||||
await deletePgDataById(`collection_id IN ('${collectionIds.join("','")}')`);
|
|
||||||
// delete dataset.datas
|
|
||||||
await MongoDatasetData.deleteMany({ collectionId: { $in: collectionIds } });
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* delete one data by mongoDataId
|
* delete one data by mongoDataId
|
||||||
|
|||||||
@ -71,7 +71,6 @@ const DatasetDataSchema = new Schema({
|
|||||||
],
|
],
|
||||||
default: []
|
default: []
|
||||||
},
|
},
|
||||||
// metadata
|
|
||||||
updateTime: {
|
updateTime: {
|
||||||
type: Date,
|
type: Date,
|
||||||
default: () => new Date()
|
default: () => new Date()
|
||||||
@ -89,6 +88,7 @@ try {
|
|||||||
DatasetDataSchema.index({ teamId: 1 });
|
DatasetDataSchema.index({ teamId: 1 });
|
||||||
DatasetDataSchema.index({ datasetId: 1 });
|
DatasetDataSchema.index({ datasetId: 1 });
|
||||||
DatasetDataSchema.index({ collectionId: 1 });
|
DatasetDataSchema.index({ collectionId: 1 });
|
||||||
|
DatasetDataSchema.index({ updateTime: -1 });
|
||||||
// full text index
|
// full text index
|
||||||
DatasetDataSchema.index({ datasetId: 1, fullTextToken: 'text' });
|
DatasetDataSchema.index({ datasetId: 1, fullTextToken: 'text' });
|
||||||
DatasetDataSchema.index({ inited: 1 });
|
DatasetDataSchema.index({ inited: 1 });
|
||||||
|
|||||||
@ -13,8 +13,7 @@
|
|||||||
"nextjs-cors": "^2.1.2",
|
"nextjs-cors": "^2.1.2",
|
||||||
"pg": "^8.10.0",
|
"pg": "^8.10.0",
|
||||||
"tunnel": "^0.0.6",
|
"tunnel": "^0.0.6",
|
||||||
"winston": "^3.10.0",
|
"dayjs": "^1.11.7"
|
||||||
"winston-mongodb": "^5.1.1"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/cookie": "^0.5.2",
|
"@types/cookie": "^0.5.2",
|
||||||
|
|||||||
@ -3,10 +3,16 @@ const { Schema, model, models } = connectionMongo;
|
|||||||
import { hashStr } from '@fastgpt/global/common/string/tools';
|
import { hashStr } from '@fastgpt/global/common/string/tools';
|
||||||
import { PRICE_SCALE } from '@fastgpt/global/support/wallet/bill/constants';
|
import { PRICE_SCALE } from '@fastgpt/global/support/wallet/bill/constants';
|
||||||
import type { UserModelSchema } from '@fastgpt/global/support/user/type';
|
import type { UserModelSchema } from '@fastgpt/global/support/user/type';
|
||||||
|
import { UserStatusEnum, userStatusMap } from '@fastgpt/global/support/user/constant';
|
||||||
|
|
||||||
export const userCollectionName = 'users';
|
export const userCollectionName = 'users';
|
||||||
|
|
||||||
const UserSchema = new Schema({
|
const UserSchema = new Schema({
|
||||||
|
status: {
|
||||||
|
type: String,
|
||||||
|
enum: Object.keys(userStatusMap),
|
||||||
|
default: UserStatusEnum.active
|
||||||
|
},
|
||||||
username: {
|
username: {
|
||||||
// 可以是手机/邮箱,新的验证都只用手机
|
// 可以是手机/邮箱,新的验证都只用手机
|
||||||
type: String,
|
type: String,
|
||||||
|
|||||||
297
pnpm-lock.yaml
generated
@ -85,6 +85,9 @@ importers:
|
|||||||
cookie:
|
cookie:
|
||||||
specifier: ^0.5.0
|
specifier: ^0.5.0
|
||||||
version: registry.npmmirror.com/cookie@0.5.0
|
version: registry.npmmirror.com/cookie@0.5.0
|
||||||
|
dayjs:
|
||||||
|
specifier: ^1.11.7
|
||||||
|
version: registry.npmmirror.com/dayjs@1.11.10
|
||||||
encoding:
|
encoding:
|
||||||
specifier: ^0.1.13
|
specifier: ^0.1.13
|
||||||
version: registry.npmmirror.com/encoding@0.1.13
|
version: registry.npmmirror.com/encoding@0.1.13
|
||||||
@ -109,12 +112,6 @@ importers:
|
|||||||
tunnel:
|
tunnel:
|
||||||
specifier: ^0.0.6
|
specifier: ^0.0.6
|
||||||
version: registry.npmmirror.com/tunnel@0.0.6
|
version: registry.npmmirror.com/tunnel@0.0.6
|
||||||
winston:
|
|
||||||
specifier: ^3.10.0
|
|
||||||
version: registry.npmmirror.com/winston@3.11.0
|
|
||||||
winston-mongodb:
|
|
||||||
specifier: ^5.1.1
|
|
||||||
version: registry.npmmirror.com/winston-mongodb@5.1.1(winston@3.11.0)
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@types/cookie':
|
'@types/cookie':
|
||||||
specifier: ^0.5.2
|
specifier: ^0.5.2
|
||||||
@ -3283,23 +3280,6 @@ packages:
|
|||||||
react: registry.npmmirror.com/react@18.2.0
|
react: registry.npmmirror.com/react@18.2.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
registry.npmmirror.com/@colors/colors@1.6.0:
|
|
||||||
resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@colors/colors/-/colors-1.6.0.tgz}
|
|
||||||
name: '@colors/colors'
|
|
||||||
version: 1.6.0
|
|
||||||
engines: {node: '>=0.1.90'}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/@dabh/diagnostics@2.0.3:
|
|
||||||
resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz}
|
|
||||||
name: '@dabh/diagnostics'
|
|
||||||
version: 2.0.3
|
|
||||||
dependencies:
|
|
||||||
colorspace: registry.npmmirror.com/colorspace@1.1.4
|
|
||||||
enabled: registry.npmmirror.com/enabled@2.0.0
|
|
||||||
kuler: registry.npmmirror.com/kuler@2.0.0
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/@emotion/babel-plugin@11.11.0:
|
registry.npmmirror.com/@emotion/babel-plugin@11.11.0:
|
||||||
resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz}
|
resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz}
|
||||||
name: '@emotion/babel-plugin'
|
name: '@emotion/babel-plugin'
|
||||||
@ -4802,12 +4782,6 @@ packages:
|
|||||||
'@types/node': registry.npmmirror.com/@types/node@20.8.7
|
'@types/node': registry.npmmirror.com/@types/node@20.8.7
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/@types/triple-beam@1.3.4:
|
|
||||||
resolution: {integrity: sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/triple-beam/-/triple-beam-1.3.4.tgz}
|
|
||||||
name: '@types/triple-beam'
|
|
||||||
version: 1.3.4
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/@types/tunnel@0.0.4:
|
registry.npmmirror.com/@types/tunnel@0.0.4:
|
||||||
resolution: {integrity: sha512-bQgDBL5XiqrrPUaZd9bZ2esOXcU4GTmgg0n6LHDqoMJezO3VFRZsW8qN6Gp64/LAmjtzNU3iAHBfV3Z2ht5DSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/tunnel/-/tunnel-0.0.4.tgz}
|
resolution: {integrity: sha512-bQgDBL5XiqrrPUaZd9bZ2esOXcU4GTmgg0n6LHDqoMJezO3VFRZsW8qN6Gp64/LAmjtzNU3iAHBfV3Z2ht5DSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/tunnel/-/tunnel-0.0.4.tgz}
|
||||||
name: '@types/tunnel'
|
name: '@types/tunnel'
|
||||||
@ -5218,12 +5192,6 @@ packages:
|
|||||||
version: 0.0.7
|
version: 0.0.7
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/async@3.2.4:
|
|
||||||
resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async/-/async-3.2.4.tgz}
|
|
||||||
name: async
|
|
||||||
version: 3.2.4
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/asynciterator.prototype@1.0.0:
|
registry.npmmirror.com/asynciterator.prototype@1.0.0:
|
||||||
resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz}
|
resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz}
|
||||||
name: asynciterator.prototype
|
name: asynciterator.prototype
|
||||||
@ -5363,15 +5331,6 @@ packages:
|
|||||||
version: 2.2.0
|
version: 2.2.0
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
registry.npmmirror.com/bl@2.2.1:
|
|
||||||
resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bl/-/bl-2.2.1.tgz}
|
|
||||||
name: bl
|
|
||||||
version: 2.2.1
|
|
||||||
dependencies:
|
|
||||||
readable-stream: registry.npmmirror.com/readable-stream@2.3.8
|
|
||||||
safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/bluebird@3.4.7:
|
registry.npmmirror.com/bluebird@3.4.7:
|
||||||
resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz}
|
resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz}
|
||||||
name: bluebird
|
name: bluebird
|
||||||
@ -5506,13 +5465,6 @@ packages:
|
|||||||
node-releases: registry.npmmirror.com/node-releases@2.0.13
|
node-releases: registry.npmmirror.com/node-releases@2.0.13
|
||||||
update-browserslist-db: registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1)
|
update-browserslist-db: registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1)
|
||||||
|
|
||||||
registry.npmmirror.com/bson@1.1.6:
|
|
||||||
resolution: {integrity: sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bson/-/bson-1.1.6.tgz}
|
|
||||||
name: bson
|
|
||||||
version: 1.1.6
|
|
||||||
engines: {node: '>=0.6.19'}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/bson@5.5.1:
|
registry.npmmirror.com/bson@5.5.1:
|
||||||
resolution: {integrity: sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bson/-/bson-5.5.1.tgz}
|
resolution: {integrity: sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bson/-/bson-5.5.1.tgz}
|
||||||
name: bson
|
name: bson
|
||||||
@ -5798,15 +5750,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz}
|
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz}
|
||||||
name: color-name
|
name: color-name
|
||||||
version: 1.1.4
|
version: 1.1.4
|
||||||
|
dev: true
|
||||||
registry.npmmirror.com/color-string@1.9.1:
|
|
||||||
resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz}
|
|
||||||
name: color-string
|
|
||||||
version: 1.9.1
|
|
||||||
dependencies:
|
|
||||||
color-name: registry.npmmirror.com/color-name@1.1.4
|
|
||||||
simple-swizzle: registry.npmmirror.com/simple-swizzle@0.2.2
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/color2k@2.0.2:
|
registry.npmmirror.com/color2k@2.0.2:
|
||||||
resolution: {integrity: sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color2k/-/color2k-2.0.2.tgz}
|
resolution: {integrity: sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color2k/-/color2k-2.0.2.tgz}
|
||||||
@ -5814,30 +5758,12 @@ packages:
|
|||||||
version: 2.0.2
|
version: 2.0.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
registry.npmmirror.com/color@3.2.1:
|
|
||||||
resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color/-/color-3.2.1.tgz}
|
|
||||||
name: color
|
|
||||||
version: 3.2.1
|
|
||||||
dependencies:
|
|
||||||
color-convert: registry.npmmirror.com/color-convert@1.9.3
|
|
||||||
color-string: registry.npmmirror.com/color-string@1.9.1
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/colorette@2.0.20:
|
registry.npmmirror.com/colorette@2.0.20:
|
||||||
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz}
|
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz}
|
||||||
name: colorette
|
name: colorette
|
||||||
version: 2.0.20
|
version: 2.0.20
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/colorspace@1.1.4:
|
|
||||||
resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/colorspace/-/colorspace-1.1.4.tgz}
|
|
||||||
name: colorspace
|
|
||||||
version: 1.1.4
|
|
||||||
dependencies:
|
|
||||||
color: registry.npmmirror.com/color@3.2.1
|
|
||||||
text-hex: registry.npmmirror.com/text-hex@1.0.0
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/combined-stream@1.0.8:
|
registry.npmmirror.com/combined-stream@1.0.8:
|
||||||
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz}
|
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz}
|
||||||
name: combined-stream
|
name: combined-stream
|
||||||
@ -6634,13 +6560,6 @@ packages:
|
|||||||
engines: {node: '>=0.4.0'}
|
engines: {node: '>=0.4.0'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
registry.npmmirror.com/denque@1.5.1:
|
|
||||||
resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/denque/-/denque-1.5.1.tgz}
|
|
||||||
name: denque
|
|
||||||
version: 1.5.1
|
|
||||||
engines: {node: '>=0.10'}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/dequal@2.0.3:
|
registry.npmmirror.com/dequal@2.0.3:
|
||||||
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz}
|
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz}
|
||||||
name: dequal
|
name: dequal
|
||||||
@ -6887,12 +6806,6 @@ packages:
|
|||||||
version: 9.2.2
|
version: 9.2.2
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/enabled@2.0.0:
|
|
||||||
resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/enabled/-/enabled-2.0.0.tgz}
|
|
||||||
name: enabled
|
|
||||||
version: 2.0.0
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/encoding@0.1.13:
|
registry.npmmirror.com/encoding@0.1.13:
|
||||||
resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz}
|
resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz}
|
||||||
name: encoding
|
name: encoding
|
||||||
@ -7737,12 +7650,6 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
format: registry.npmmirror.com/format@0.2.2
|
format: registry.npmmirror.com/format@0.2.2
|
||||||
|
|
||||||
registry.npmmirror.com/fecha@4.2.3:
|
|
||||||
resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fecha/-/fecha-4.2.3.tgz}
|
|
||||||
name: fecha
|
|
||||||
version: 4.2.3
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/file-entry-cache@6.0.1:
|
registry.npmmirror.com/file-entry-cache@6.0.1:
|
||||||
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz}
|
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz}
|
||||||
name: file-entry-cache
|
name: file-entry-cache
|
||||||
@ -7793,12 +7700,6 @@ packages:
|
|||||||
version: 3.2.9
|
version: 3.2.9
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/fn.name@1.1.0:
|
|
||||||
resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fn.name/-/fn.name-1.1.0.tgz}
|
|
||||||
name: fn.name
|
|
||||||
version: 1.1.0
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/focus-lock@1.0.0:
|
registry.npmmirror.com/focus-lock@1.0.0:
|
||||||
resolution: {integrity: sha512-a8Ge6cdKh9za/GZR/qtigTAk7SrGore56EFcoMshClsh7FLk1zwszc/ltuMfKhx56qeuyL/jWQ4J4axou0iJ9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/focus-lock/-/focus-lock-1.0.0.tgz}
|
resolution: {integrity: sha512-a8Ge6cdKh9za/GZR/qtigTAk7SrGore56EFcoMshClsh7FLk1zwszc/ltuMfKhx56qeuyL/jWQ4J4axou0iJ9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/focus-lock/-/focus-lock-1.0.0.tgz}
|
||||||
name: focus-lock
|
name: focus-lock
|
||||||
@ -8534,12 +8435,6 @@ packages:
|
|||||||
name: is-arrayish
|
name: is-arrayish
|
||||||
version: 0.2.1
|
version: 0.2.1
|
||||||
|
|
||||||
registry.npmmirror.com/is-arrayish@0.3.2:
|
|
||||||
resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz}
|
|
||||||
name: is-arrayish
|
|
||||||
version: 0.3.2
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/is-async-function@2.0.0:
|
registry.npmmirror.com/is-async-function@2.0.0:
|
||||||
resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-async-function/-/is-async-function-2.0.0.tgz}
|
resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-async-function/-/is-async-function-2.0.0.tgz}
|
||||||
name: is-async-function
|
name: is-async-function
|
||||||
@ -8741,13 +8636,6 @@ packages:
|
|||||||
call-bind: registry.npmmirror.com/call-bind@1.0.5
|
call-bind: registry.npmmirror.com/call-bind@1.0.5
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/is-stream@2.0.1:
|
|
||||||
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz}
|
|
||||||
name: is-stream
|
|
||||||
version: 2.0.1
|
|
||||||
engines: {node: '>=8'}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/is-stream@3.0.0:
|
registry.npmmirror.com/is-stream@3.0.0:
|
||||||
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz}
|
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz}
|
||||||
name: is-stream
|
name: is-stream
|
||||||
@ -9039,12 +8927,6 @@ packages:
|
|||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
registry.npmmirror.com/kuler@2.0.0:
|
|
||||||
resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kuler/-/kuler-2.0.0.tgz}
|
|
||||||
name: kuler
|
|
||||||
version: 2.0.0
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/language-subtag-registry@0.3.22:
|
registry.npmmirror.com/language-subtag-registry@0.3.22:
|
||||||
resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz}
|
resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz}
|
||||||
name: language-subtag-registry
|
name: language-subtag-registry
|
||||||
@ -9243,20 +9125,6 @@ packages:
|
|||||||
wrap-ansi: registry.npmmirror.com/wrap-ansi@8.1.0
|
wrap-ansi: registry.npmmirror.com/wrap-ansi@8.1.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/logform@2.6.0:
|
|
||||||
resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/logform/-/logform-2.6.0.tgz}
|
|
||||||
name: logform
|
|
||||||
version: 2.6.0
|
|
||||||
engines: {node: '>= 12.0.0'}
|
|
||||||
dependencies:
|
|
||||||
'@colors/colors': registry.npmmirror.com/@colors/colors@1.6.0
|
|
||||||
'@types/triple-beam': registry.npmmirror.com/@types/triple-beam@1.3.4
|
|
||||||
fecha: registry.npmmirror.com/fecha@4.2.3
|
|
||||||
ms: registry.npmmirror.com/ms@2.1.3
|
|
||||||
safe-stable-stringify: registry.npmmirror.com/safe-stable-stringify@2.4.3
|
|
||||||
triple-beam: registry.npmmirror.com/triple-beam@1.4.1
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/longest-streak@3.1.0:
|
registry.npmmirror.com/longest-streak@3.1.0:
|
||||||
resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/longest-streak/-/longest-streak-3.1.0.tgz}
|
resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/longest-streak/-/longest-streak-3.1.0.tgz}
|
||||||
name: longest-streak
|
name: longest-streak
|
||||||
@ -10013,41 +9881,6 @@ packages:
|
|||||||
whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0
|
whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
registry.npmmirror.com/mongodb@3.7.4:
|
|
||||||
resolution: {integrity: sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mongodb/-/mongodb-3.7.4.tgz}
|
|
||||||
name: mongodb
|
|
||||||
version: 3.7.4
|
|
||||||
engines: {node: '>=4'}
|
|
||||||
peerDependencies:
|
|
||||||
aws4: '*'
|
|
||||||
bson-ext: '*'
|
|
||||||
kerberos: '*'
|
|
||||||
mongodb-client-encryption: '*'
|
|
||||||
mongodb-extjson: '*'
|
|
||||||
snappy: '*'
|
|
||||||
peerDependenciesMeta:
|
|
||||||
aws4:
|
|
||||||
optional: true
|
|
||||||
bson-ext:
|
|
||||||
optional: true
|
|
||||||
kerberos:
|
|
||||||
optional: true
|
|
||||||
mongodb-client-encryption:
|
|
||||||
optional: true
|
|
||||||
mongodb-extjson:
|
|
||||||
optional: true
|
|
||||||
snappy:
|
|
||||||
optional: true
|
|
||||||
dependencies:
|
|
||||||
bl: registry.npmmirror.com/bl@2.2.1
|
|
||||||
bson: registry.npmmirror.com/bson@1.1.6
|
|
||||||
denque: registry.npmmirror.com/denque@1.5.1
|
|
||||||
optional-require: registry.npmmirror.com/optional-require@1.1.8
|
|
||||||
safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1
|
|
||||||
optionalDependencies:
|
|
||||||
saslprep: registry.npmmirror.com/saslprep@1.0.3
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/mongodb@5.9.0:
|
registry.npmmirror.com/mongodb@5.9.0:
|
||||||
resolution: {integrity: sha512-g+GCMHN1CoRUA+wb1Agv0TI4YTSiWr42B5ulkiAfLLHitGK1R+PkSAf3Lr5rPZwi/3F04LiaZEW0Kxro9Fi2TA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mongodb/-/mongodb-5.9.0.tgz}
|
resolution: {integrity: sha512-g+GCMHN1CoRUA+wb1Agv0TI4YTSiWr42B5ulkiAfLLHitGK1R+PkSAf3Lr5rPZwi/3F04LiaZEW0Kxro9Fi2TA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mongodb/-/mongodb-5.9.0.tgz}
|
||||||
name: mongodb
|
name: mongodb
|
||||||
@ -10469,14 +10302,6 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
wrappy: registry.npmmirror.com/wrappy@1.0.2
|
wrappy: registry.npmmirror.com/wrappy@1.0.2
|
||||||
|
|
||||||
registry.npmmirror.com/one-time@1.0.0:
|
|
||||||
resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/one-time/-/one-time-1.0.0.tgz}
|
|
||||||
name: one-time
|
|
||||||
version: 1.0.0
|
|
||||||
dependencies:
|
|
||||||
fn.name: registry.npmmirror.com/fn.name@1.1.0
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/onetime@5.1.2:
|
registry.npmmirror.com/onetime@5.1.2:
|
||||||
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz}
|
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz}
|
||||||
name: onetime
|
name: onetime
|
||||||
@ -10521,15 +10346,6 @@ packages:
|
|||||||
version: 0.2.4
|
version: 0.2.4
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
registry.npmmirror.com/optional-require@1.1.8:
|
|
||||||
resolution: {integrity: sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/optional-require/-/optional-require-1.1.8.tgz}
|
|
||||||
name: optional-require
|
|
||||||
version: 1.1.8
|
|
||||||
engines: {node: '>=4'}
|
|
||||||
dependencies:
|
|
||||||
require-at: registry.npmmirror.com/require-at@1.0.6
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/optionator@0.9.3:
|
registry.npmmirror.com/optionator@0.9.3:
|
||||||
resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz}
|
resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz}
|
||||||
name: optionator
|
name: optionator
|
||||||
@ -11342,6 +11158,7 @@ packages:
|
|||||||
inherits: registry.npmmirror.com/inherits@2.0.4
|
inherits: registry.npmmirror.com/inherits@2.0.4
|
||||||
string_decoder: registry.npmmirror.com/string_decoder@1.3.0
|
string_decoder: registry.npmmirror.com/string_decoder@1.3.0
|
||||||
util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2
|
util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2
|
||||||
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/readdirp@3.6.0:
|
registry.npmmirror.com/readdirp@3.6.0:
|
||||||
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz}
|
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz}
|
||||||
@ -11558,13 +11375,6 @@ packages:
|
|||||||
version: 3.3.0
|
version: 3.3.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
registry.npmmirror.com/require-at@1.0.6:
|
|
||||||
resolution: {integrity: sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/require-at/-/require-at-1.0.6.tgz}
|
|
||||||
name: require-at
|
|
||||||
version: 1.0.6
|
|
||||||
engines: {node: '>=4'}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/resolve-from@4.0.0:
|
registry.npmmirror.com/resolve-from@4.0.0:
|
||||||
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz}
|
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz}
|
||||||
name: resolve-from
|
name: resolve-from
|
||||||
@ -11711,29 +11521,11 @@ packages:
|
|||||||
is-regex: registry.npmmirror.com/is-regex@1.1.4
|
is-regex: registry.npmmirror.com/is-regex@1.1.4
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/safe-stable-stringify@2.4.3:
|
|
||||||
resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz}
|
|
||||||
name: safe-stable-stringify
|
|
||||||
version: 2.4.3
|
|
||||||
engines: {node: '>=10'}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/safer-buffer@2.1.2:
|
registry.npmmirror.com/safer-buffer@2.1.2:
|
||||||
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz}
|
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz}
|
||||||
name: safer-buffer
|
name: safer-buffer
|
||||||
version: 2.1.2
|
version: 2.1.2
|
||||||
|
|
||||||
registry.npmmirror.com/saslprep@1.0.3:
|
|
||||||
resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/saslprep/-/saslprep-1.0.3.tgz}
|
|
||||||
name: saslprep
|
|
||||||
version: 1.0.3
|
|
||||||
engines: {node: '>=6'}
|
|
||||||
requiresBuild: true
|
|
||||||
dependencies:
|
|
||||||
sparse-bitfield: registry.npmmirror.com/sparse-bitfield@3.0.3
|
|
||||||
dev: false
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
registry.npmmirror.com/sass@1.69.4:
|
registry.npmmirror.com/sass@1.69.4:
|
||||||
resolution: {integrity: sha512-+qEreVhqAy8o++aQfCJwp0sklr2xyEzkm9Pp/Igu9wNPoe7EZEQ8X/MBvvXggI2ql607cxKg/RKOwDj6pp2XDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sass/-/sass-1.69.4.tgz}
|
resolution: {integrity: sha512-+qEreVhqAy8o++aQfCJwp0sklr2xyEzkm9Pp/Igu9wNPoe7EZEQ8X/MBvvXggI2ql607cxKg/RKOwDj6pp2XDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sass/-/sass-1.69.4.tgz}
|
||||||
name: sass
|
name: sass
|
||||||
@ -11841,14 +11633,6 @@ packages:
|
|||||||
version: 3.0.7
|
version: 3.0.7
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/simple-swizzle@0.2.2:
|
|
||||||
resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz}
|
|
||||||
name: simple-swizzle
|
|
||||||
version: 0.2.2
|
|
||||||
dependencies:
|
|
||||||
is-arrayish: registry.npmmirror.com/is-arrayish@0.3.2
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/slash@3.0.0:
|
registry.npmmirror.com/slash@3.0.0:
|
||||||
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz}
|
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz}
|
||||||
name: slash
|
name: slash
|
||||||
@ -11945,12 +11729,6 @@ packages:
|
|||||||
deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
|
deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/stack-trace@0.0.10:
|
|
||||||
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stack-trace/-/stack-trace-0.0.10.tgz}
|
|
||||||
name: stack-trace
|
|
||||||
version: 0.0.10
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/state-toggle@1.0.3:
|
registry.npmmirror.com/state-toggle@1.0.3:
|
||||||
resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/state-toggle/-/state-toggle-1.0.3.tgz}
|
resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/state-toggle/-/state-toggle-1.0.3.tgz}
|
||||||
name: state-toggle
|
name: state-toggle
|
||||||
@ -12062,6 +11840,7 @@ packages:
|
|||||||
version: 1.3.0
|
version: 1.3.0
|
||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1
|
safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/strip-ansi@6.0.1:
|
registry.npmmirror.com/strip-ansi@6.0.1:
|
||||||
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz}
|
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz}
|
||||||
@ -12194,12 +11973,6 @@ packages:
|
|||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/text-hex@1.0.0:
|
|
||||||
resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/text-hex/-/text-hex-1.0.0.tgz}
|
|
||||||
name: text-hex
|
|
||||||
version: 1.0.0
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/text-table@0.2.0:
|
registry.npmmirror.com/text-table@0.2.0:
|
||||||
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz}
|
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz}
|
||||||
name: text-table
|
name: text-table
|
||||||
@ -12295,13 +12068,6 @@ packages:
|
|||||||
deprecated: Use String.prototype.trim() instead
|
deprecated: Use String.prototype.trim() instead
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/triple-beam@1.4.1:
|
|
||||||
resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/triple-beam/-/triple-beam-1.4.1.tgz}
|
|
||||||
name: triple-beam
|
|
||||||
version: 1.4.1
|
|
||||||
engines: {node: '>= 14.0.0'}
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/trough@1.0.5:
|
registry.npmmirror.com/trough@1.0.5:
|
||||||
resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/trough/-/trough-1.0.5.tgz}
|
resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/trough/-/trough-1.0.5.tgz}
|
||||||
name: trough
|
name: trough
|
||||||
@ -13079,57 +12845,6 @@ packages:
|
|||||||
isexe: registry.npmmirror.com/isexe@2.0.0
|
isexe: registry.npmmirror.com/isexe@2.0.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
registry.npmmirror.com/winston-mongodb@5.1.1(winston@3.11.0):
|
|
||||||
resolution: {integrity: sha512-tlDksYDCsSka6vLzB/cg19B+kRbVH/y9JQdXVXc5r4TSLEgX1Ivj/vHyedYlYzNMAZkSSfexwI/dSDn3f9/Qkg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/winston-mongodb/-/winston-mongodb-5.1.1.tgz}
|
|
||||||
id: registry.npmmirror.com/winston-mongodb/5.1.1
|
|
||||||
name: winston-mongodb
|
|
||||||
version: 5.1.1
|
|
||||||
engines: {node: '>=6.8.1'}
|
|
||||||
peerDependencies:
|
|
||||||
winston: ^3.0.0
|
|
||||||
dependencies:
|
|
||||||
mongodb: registry.npmmirror.com/mongodb@3.7.4
|
|
||||||
winston: registry.npmmirror.com/winston@3.11.0
|
|
||||||
winston-transport: registry.npmmirror.com/winston-transport@4.6.0
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- aws4
|
|
||||||
- bson-ext
|
|
||||||
- kerberos
|
|
||||||
- mongodb-client-encryption
|
|
||||||
- mongodb-extjson
|
|
||||||
- snappy
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/winston-transport@4.6.0:
|
|
||||||
resolution: {integrity: sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/winston-transport/-/winston-transport-4.6.0.tgz}
|
|
||||||
name: winston-transport
|
|
||||||
version: 4.6.0
|
|
||||||
engines: {node: '>= 12.0.0'}
|
|
||||||
dependencies:
|
|
||||||
logform: registry.npmmirror.com/logform@2.6.0
|
|
||||||
readable-stream: registry.npmmirror.com/readable-stream@3.6.2
|
|
||||||
triple-beam: registry.npmmirror.com/triple-beam@1.4.1
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/winston@3.11.0:
|
|
||||||
resolution: {integrity: sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/winston/-/winston-3.11.0.tgz}
|
|
||||||
name: winston
|
|
||||||
version: 3.11.0
|
|
||||||
engines: {node: '>= 12.0.0'}
|
|
||||||
dependencies:
|
|
||||||
'@colors/colors': registry.npmmirror.com/@colors/colors@1.6.0
|
|
||||||
'@dabh/diagnostics': registry.npmmirror.com/@dabh/diagnostics@2.0.3
|
|
||||||
async: registry.npmmirror.com/async@3.2.4
|
|
||||||
is-stream: registry.npmmirror.com/is-stream@2.0.1
|
|
||||||
logform: registry.npmmirror.com/logform@2.6.0
|
|
||||||
one-time: registry.npmmirror.com/one-time@1.0.0
|
|
||||||
readable-stream: registry.npmmirror.com/readable-stream@3.6.2
|
|
||||||
safe-stable-stringify: registry.npmmirror.com/safe-stable-stringify@2.4.3
|
|
||||||
stack-trace: registry.npmmirror.com/stack-trace@0.0.10
|
|
||||||
triple-beam: registry.npmmirror.com/triple-beam@1.4.1
|
|
||||||
winston-transport: registry.npmmirror.com/winston-transport@4.6.0
|
|
||||||
dev: false
|
|
||||||
|
|
||||||
registry.npmmirror.com/wrap-ansi@8.1.0:
|
registry.npmmirror.com/wrap-ansi@8.1.0:
|
||||||
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz}
|
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz}
|
||||||
name: wrap-ansi
|
name: wrap-ansi
|
||||||
|
|||||||
@ -21,3 +21,5 @@ MONGODB_URI=mongodb://username:password@0.0.0.0:27017/fastgpt?authSource=admin
|
|||||||
PG_URL=postgresql://username:password@host:port/postgres
|
PG_URL=postgresql://username:password@host:port/postgres
|
||||||
# 首页路径
|
# 首页路径
|
||||||
HOME_URL=/
|
HOME_URL=/
|
||||||
|
# Loki Log Path
|
||||||
|
# LOKI_LOG_URL=
|
||||||
@ -1,11 +1,18 @@
|
|||||||
### Fast GPT V4.6.3
|
### Fast GPT V4.6.4
|
||||||
|
|
||||||
1. 商业版新增 - web站点同步
|
1. 重写 - 分享链接身份逻辑,采用 localID 记录用户的ID。
|
||||||
2. 新增 - 集合元数据记录
|
2. 商业版新增 - 分享链接 SSO 方案,通过`身份鉴权`地址,仅需`3个接口`即可完全接入已有用户系统。具体参考[分享链接身份鉴权](https://doc.fastgpt.in/docs/development/openapi/share/)
|
||||||
3. 优化 - url 读取内容
|
3. 调整 - 知识库搜索模块 topk 逻辑,采用 MaxToken 计算,兼容不同长度的文本块
|
||||||
4. 优化 - 流读取文件,防止内存溢出
|
4. 调整鉴权顺序,提高 apikey 的优先级,避免cookie抢占 apikey 的鉴权。
|
||||||
5. [知识库结构详解](https://doc.fastgpt.in/docs/use-cases/datasetengine/)
|
5. 链接读取支持多选择器。参考[Web 站点同步用法](https://doc.fastgpt.in/docs/course/webSync)
|
||||||
6. [知识库提示词详解](https://doc.fastgpt.in/docs/use-cases/ai_settings/#引用模板--引用提示词)
|
6. 修复 - 分享链接图片上传鉴权问题
|
||||||
7. [使用文档](https://doc.fastgpt.in/docs/intro/)
|
7. 修复 - Mongo 连接池未释放问题。
|
||||||
8. [点击查看高级编排介绍文档](https://doc.fastgpt.in/docs/workflow)
|
8. 修复 - Dataset Intro 无法更新
|
||||||
9. [点击查看商业版](https://doc.fastgpt.in/docs/commercial/)
|
9. 修复 - md 代码块问题
|
||||||
|
10. 修复 - root 权限问题
|
||||||
|
11. 优化 docker file
|
||||||
|
12. [知识库结构详解](https://doc.fastgpt.in/docs/use-cases/datasetengine/)
|
||||||
|
13. [知识库提示词详解](https://doc.fastgpt.in/docs/use-cases/ai_settings/#引用模板--引用提示词)
|
||||||
|
14. [使用文档](https://doc.fastgpt.in/docs/intro/)
|
||||||
|
15. [点击查看高级编排介绍文档](https://doc.fastgpt.in/docs/workflow)
|
||||||
|
16. [点击查看商业版](https://doc.fastgpt.in/docs/commercial/)
|
||||||
|
|||||||
@ -65,7 +65,6 @@
|
|||||||
"Confirm to clear share chat history": " Are you sure to delete all chats?",
|
"Confirm to clear share chat history": " Are you sure to delete all chats?",
|
||||||
"Converting to text": "Converting to text...",
|
"Converting to text": "Converting to text...",
|
||||||
"Exit Chat": "Exit",
|
"Exit Chat": "Exit",
|
||||||
"Feedback Close": "Close Feedback",
|
|
||||||
"Feedback Failed": "Feedback Failed",
|
"Feedback Failed": "Feedback Failed",
|
||||||
"Feedback Mark": "Mark",
|
"Feedback Mark": "Mark",
|
||||||
"Feedback Modal": "Feedback",
|
"Feedback Modal": "Feedback",
|
||||||
@ -81,7 +80,6 @@
|
|||||||
"Question Guide Tips": "I guess what you're asking is",
|
"Question Guide Tips": "I guess what you're asking is",
|
||||||
"Quote": "Quote",
|
"Quote": "Quote",
|
||||||
"Read Mark Description": "Read mark description",
|
"Read Mark Description": "Read mark description",
|
||||||
"Read User Feedback": "Read user feedback",
|
|
||||||
"Select Mark Kb": "Select Dataset",
|
"Select Mark Kb": "Select Dataset",
|
||||||
"Select Mark Kb Desc": "Select a dataset to store the expected answers",
|
"Select Mark Kb Desc": "Select a dataset to store the expected answers",
|
||||||
"You need to a chat app": "You need to a chat app",
|
"You need to a chat app": "You need to a chat app",
|
||||||
@ -201,6 +199,9 @@
|
|||||||
"confirm": {
|
"confirm": {
|
||||||
"Common Tip": "Operational Confirm"
|
"Common Tip": "Operational Confirm"
|
||||||
},
|
},
|
||||||
|
"course": {
|
||||||
|
"Read Course": "Read Course"
|
||||||
|
},
|
||||||
"empty": {
|
"empty": {
|
||||||
"Common Tip": "No data"
|
"Common Tip": "No data"
|
||||||
},
|
},
|
||||||
@ -234,6 +235,10 @@
|
|||||||
},
|
},
|
||||||
"speech": {
|
"speech": {
|
||||||
"error tip": "Speech Failed"
|
"error tip": "Speech Failed"
|
||||||
|
},
|
||||||
|
"system": {
|
||||||
|
"Help Chatbot": "Chatbot Helper",
|
||||||
|
"Use Helper": "UsingHelp"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"core": {
|
"core": {
|
||||||
@ -257,6 +262,9 @@
|
|||||||
"TTS Tip": "After this function is enabled, the voice playback function can be used after each conversation. Use of this feature may incur additional charges.",
|
"TTS Tip": "After this function is enabled, the voice playback function can be used after each conversation. Use of this feature may incur additional charges.",
|
||||||
"Welcome Text": "Welcome Text",
|
"Welcome Text": "Welcome Text",
|
||||||
"create app": "Create App",
|
"create app": "Create App",
|
||||||
|
"logs": {
|
||||||
|
"Source And Time": "Source & Time"
|
||||||
|
},
|
||||||
"setting": "App Setting",
|
"setting": "App Setting",
|
||||||
"simple": {
|
"simple": {
|
||||||
"mode template select": "Template"
|
"mode template select": "Template"
|
||||||
@ -283,6 +291,16 @@
|
|||||||
"Speaking": "I'm listening...",
|
"Speaking": "I'm listening...",
|
||||||
"Stop Speak": "Stop Speak",
|
"Stop Speak": "Stop Speak",
|
||||||
"Type a message": "Input problem",
|
"Type a message": "Input problem",
|
||||||
|
"error": {
|
||||||
|
"Messages empty": "Interface content is empty, maybe the text is too long ~"
|
||||||
|
},
|
||||||
|
"feedback": {
|
||||||
|
"Close User Good Feedback": "",
|
||||||
|
"Close User Like": "The user like\nClick to close the tag",
|
||||||
|
"No Content": "The user did not fill in the specific feedback content",
|
||||||
|
"Read User dislike": "User dislike\nClick to view content",
|
||||||
|
"Feedback Close": "Close Feedback"
|
||||||
|
},
|
||||||
"markdown": {
|
"markdown": {
|
||||||
"Edit Question": "Edit Question",
|
"Edit Question": "Edit Question",
|
||||||
"Quick Question": "Ask the question immediately",
|
"Quick Question": "Ask the question immediately",
|
||||||
@ -295,9 +313,6 @@
|
|||||||
},
|
},
|
||||||
"tts": {
|
"tts": {
|
||||||
"Stop Speech": "Stop"
|
"Stop Speech": "Stop"
|
||||||
},
|
|
||||||
"error": {
|
|
||||||
"Messages empty": "Interface content is empty, maybe the text is too long ~"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dataset": {
|
"dataset": {
|
||||||
@ -379,13 +394,13 @@
|
|||||||
"id": "Data ID"
|
"id": "Data ID"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
|
"Start Sync Failed": "Start Sync Failed",
|
||||||
"unAuthDataset": "No access to this knowledge base ",
|
"unAuthDataset": "No access to this knowledge base ",
|
||||||
"unAuthDatasetCollection": "Not authorized to manipulate this data set ",
|
"unAuthDatasetCollection": "Not authorized to manipulate this data set ",
|
||||||
"unAuthDatasetData": "Not authorized to manipulate this data ",
|
"unAuthDatasetData": "Not authorized to manipulate this data ",
|
||||||
"unAuthDatasetFile": "No permission to manipulate this file ",
|
"unAuthDatasetFile": "No permission to manipulate this file ",
|
||||||
"unCreateCollection": "No permission to manipulate this data ",
|
"unCreateCollection": "No permission to manipulate this data ",
|
||||||
"unLinkCollection": "not a network link collection ",
|
"unLinkCollection": "not a network link collection "
|
||||||
"Start Sync Failed": "Start Sync Failed"
|
|
||||||
},
|
},
|
||||||
"file": "File",
|
"file": "File",
|
||||||
"folder": "Folder",
|
"folder": "Folder",
|
||||||
@ -462,6 +477,7 @@
|
|||||||
"Confirm Create Tips": "Confirm to synchronize the site, the synchronization task will start later, please confirm!",
|
"Confirm Create Tips": "Confirm to synchronize the site, the synchronization task will start later, please confirm!",
|
||||||
"Confirm Update Tips": "Are you sure to update the site configuration? The synchronization starts immediately with the new configuration. Please confirm",
|
"Confirm Update Tips": "Are you sure to update the site configuration? The synchronization starts immediately with the new configuration. Please confirm",
|
||||||
"Selector": "Selector",
|
"Selector": "Selector",
|
||||||
|
"Selector Course": "Selector using tutorial",
|
||||||
"Start Sync": "Start Sync",
|
"Start Sync": "Start Sync",
|
||||||
"UnValid Website Tip": "Your site may not be static and cannot be synchronized"
|
"UnValid Website Tip": "Your site may not be static and cannot be synchronized"
|
||||||
}
|
}
|
||||||
@ -669,6 +685,10 @@
|
|||||||
"Visual AI orchestration": "Visual AI orchestration",
|
"Visual AI orchestration": "Visual AI orchestration",
|
||||||
"Why FastGPT": "Why {{title}}",
|
"Why FastGPT": "Why {{title}}",
|
||||||
"desc": "AI knowledge base question and answer platform based on LLM large model",
|
"desc": "AI knowledge base question and answer platform based on LLM large model",
|
||||||
|
"navbar": {
|
||||||
|
"Use guidance": "Use Guidance",
|
||||||
|
"chatbot": "Chatbot"
|
||||||
|
},
|
||||||
"slogan": "Let the AI know more about you"
|
"slogan": "Let the AI know more about you"
|
||||||
},
|
},
|
||||||
"module": {
|
"module": {
|
||||||
|
|||||||
@ -65,7 +65,6 @@
|
|||||||
"Confirm to clear share chat history": "确认删除所有聊天记录?",
|
"Confirm to clear share chat history": "确认删除所有聊天记录?",
|
||||||
"Converting to text": "正在转换为文本...",
|
"Converting to text": "正在转换为文本...",
|
||||||
"Exit Chat": "退出聊天",
|
"Exit Chat": "退出聊天",
|
||||||
"Feedback Close": "关闭反馈",
|
|
||||||
"Feedback Failed": "提交反馈异常",
|
"Feedback Failed": "提交反馈异常",
|
||||||
"Feedback Mark": "标注",
|
"Feedback Mark": "标注",
|
||||||
"Feedback Modal": "结果反馈",
|
"Feedback Modal": "结果反馈",
|
||||||
@ -81,7 +80,6 @@
|
|||||||
"Question Guide Tips": "猜你想问",
|
"Question Guide Tips": "猜你想问",
|
||||||
"Quote": "引用",
|
"Quote": "引用",
|
||||||
"Read Mark Description": "查看标注功能介绍",
|
"Read Mark Description": "查看标注功能介绍",
|
||||||
"Read User Feedback": "查看用户反馈",
|
|
||||||
"Select Mark Kb": "选择知识库",
|
"Select Mark Kb": "选择知识库",
|
||||||
"Select Mark Kb Desc": "选择一个知识库存储预期答案",
|
"Select Mark Kb Desc": "选择一个知识库存储预期答案",
|
||||||
"You need to a chat app": "你需要创建一个应用",
|
"You need to a chat app": "你需要创建一个应用",
|
||||||
@ -201,6 +199,9 @@
|
|||||||
"confirm": {
|
"confirm": {
|
||||||
"Common Tip": "操作确认"
|
"Common Tip": "操作确认"
|
||||||
},
|
},
|
||||||
|
"course": {
|
||||||
|
"Read Course": "查看教程"
|
||||||
|
},
|
||||||
"empty": {
|
"empty": {
|
||||||
"Common Tip": "没有什么数据噢~"
|
"Common Tip": "没有什么数据噢~"
|
||||||
},
|
},
|
||||||
@ -234,6 +235,10 @@
|
|||||||
},
|
},
|
||||||
"speech": {
|
"speech": {
|
||||||
"error tip": "语音转文字失败"
|
"error tip": "语音转文字失败"
|
||||||
|
},
|
||||||
|
"system": {
|
||||||
|
"Help Chatbot": "机器人助手",
|
||||||
|
"Use Helper": "使用帮助"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"core": {
|
"core": {
|
||||||
@ -257,6 +262,9 @@
|
|||||||
"TTS Tip": "开启后,每次对话后可使用语音播放功能。使用该功能可能产生额外费用。",
|
"TTS Tip": "开启后,每次对话后可使用语音播放功能。使用该功能可能产生额外费用。",
|
||||||
"Welcome Text": "对话开场白",
|
"Welcome Text": "对话开场白",
|
||||||
"create app": "创建属于你的 AI 应用",
|
"create app": "创建属于你的 AI 应用",
|
||||||
|
"logs": {
|
||||||
|
"Source And Time": "来源 & 时间"
|
||||||
|
},
|
||||||
"setting": "应用信息设置",
|
"setting": "应用信息设置",
|
||||||
"simple": {
|
"simple": {
|
||||||
"mode template select": "简易模板"
|
"mode template select": "简易模板"
|
||||||
@ -283,6 +291,16 @@
|
|||||||
"Speaking": "我在听,请说...",
|
"Speaking": "我在听,请说...",
|
||||||
"Stop Speak": "停止录音",
|
"Stop Speak": "停止录音",
|
||||||
"Type a message": "输入问题",
|
"Type a message": "输入问题",
|
||||||
|
"error": {
|
||||||
|
"Messages empty": "接口内容为空,可能文本超长了~"
|
||||||
|
},
|
||||||
|
"feedback": {
|
||||||
|
"Close User Good Feedback": "",
|
||||||
|
"Close User Like": "用户表示赞同\n点击关闭该标记",
|
||||||
|
"No Content": "用户没有填写具体反馈内容",
|
||||||
|
"Read User dislike": "用户表示反对\n点击查看内容",
|
||||||
|
"Feedback Close": "关闭反馈"
|
||||||
|
},
|
||||||
"markdown": {
|
"markdown": {
|
||||||
"Edit Question": "编辑问题",
|
"Edit Question": "编辑问题",
|
||||||
"Quick Question": "点我立即提问",
|
"Quick Question": "点我立即提问",
|
||||||
@ -295,9 +313,6 @@
|
|||||||
},
|
},
|
||||||
"tts": {
|
"tts": {
|
||||||
"Stop Speech": "停止"
|
"Stop Speech": "停止"
|
||||||
},
|
|
||||||
"error": {
|
|
||||||
"Messages empty": "接口内容为空,可能文本超长了~"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dataset": {
|
"dataset": {
|
||||||
@ -462,6 +477,7 @@
|
|||||||
"Confirm Create Tips": "确认同步该站点,同步任务将随后开启,请确认!",
|
"Confirm Create Tips": "确认同步该站点,同步任务将随后开启,请确认!",
|
||||||
"Confirm Update Tips": "确认更新站点配置?会立即按新的配置开始同步,请确认!",
|
"Confirm Update Tips": "确认更新站点配置?会立即按新的配置开始同步,请确认!",
|
||||||
"Selector": "选择器",
|
"Selector": "选择器",
|
||||||
|
"Selector Course": "选择器使用教程",
|
||||||
"Start Sync": "开始同步",
|
"Start Sync": "开始同步",
|
||||||
"UnValid Website Tip": "您的站点可能非静态站点,无法同步"
|
"UnValid Website Tip": "您的站点可能非静态站点,无法同步"
|
||||||
}
|
}
|
||||||
@ -669,6 +685,10 @@
|
|||||||
"Visual AI orchestration": "可视化 AI 编排",
|
"Visual AI orchestration": "可视化 AI 编排",
|
||||||
"Why FastGPT": "为什么选择 {{title}}",
|
"Why FastGPT": "为什么选择 {{title}}",
|
||||||
"desc": "基于 LLM 大模型的 AI 知识库问答平台",
|
"desc": "基于 LLM 大模型的 AI 知识库问答平台",
|
||||||
|
"navbar": {
|
||||||
|
"Use guidance": "使用引导",
|
||||||
|
"chatbot": "问答机器人"
|
||||||
|
},
|
||||||
"slogan": "让 AI 更懂你的知识"
|
"slogan": "让 AI 更懂你的知识"
|
||||||
},
|
},
|
||||||
"module": {
|
"module": {
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
"datasets": true,
|
"datasets": true,
|
||||||
"similarity": false,
|
"similarity": false,
|
||||||
"limit": false,
|
"limit": false,
|
||||||
"searchMode": "embedding",
|
"searchMode": false,
|
||||||
"searchEmptyText": false
|
"searchEmptyText": false
|
||||||
},
|
},
|
||||||
"userGuide": {
|
"userGuide": {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Image } from '@chakra-ui/react';
|
import { Image } from '@chakra-ui/react';
|
||||||
import type { ImageProps } from '@chakra-ui/react';
|
import type { ImageProps } from '@chakra-ui/react';
|
||||||
import { LOGO_ICON } from '@fastgpt/global/core/chat/constants';
|
import { LOGO_ICON } from '@fastgpt/global/common/system/constants';
|
||||||
|
|
||||||
const Avatar = ({ w = '30px', src, ...props }: ImageProps) => {
|
const Avatar = ({ w = '30px', src, ...props }: ImageProps) => {
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -3,13 +3,15 @@ import { ModalBody, Textarea, ModalFooter, Button } from '@chakra-ui/react';
|
|||||||
import MyModal from '../MyModal';
|
import MyModal from '../MyModal';
|
||||||
import { useRequest } from '@/web/common/hooks/useRequest';
|
import { useRequest } from '@/web/common/hooks/useRequest';
|
||||||
import { useTranslation } from 'next-i18next';
|
import { useTranslation } from 'next-i18next';
|
||||||
import { userUpdateChatFeedback } from '@/web/core/chat/api';
|
import { updateChatUserFeedback } from '@/web/core/chat/api';
|
||||||
|
|
||||||
const FeedbackModal = ({
|
const FeedbackModal = ({
|
||||||
|
chatId,
|
||||||
chatItemId,
|
chatItemId,
|
||||||
onSuccess,
|
onSuccess,
|
||||||
onClose
|
onClose
|
||||||
}: {
|
}: {
|
||||||
|
chatId: string;
|
||||||
chatItemId: string;
|
chatItemId: string;
|
||||||
onSuccess: (e: string) => void;
|
onSuccess: (e: string) => void;
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
@ -19,14 +21,15 @@ const FeedbackModal = ({
|
|||||||
|
|
||||||
const { mutate, isLoading } = useRequest({
|
const { mutate, isLoading } = useRequest({
|
||||||
mutationFn: async () => {
|
mutationFn: async () => {
|
||||||
const val = ref.current?.value || 'N/A';
|
const val = ref.current?.value || t('core.chat.feedback.No Content');
|
||||||
return userUpdateChatFeedback({
|
return updateChatUserFeedback({
|
||||||
|
chatId,
|
||||||
chatItemId,
|
chatItemId,
|
||||||
userFeedback: val
|
userBadFeedback: val
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onSuccess() {
|
onSuccess() {
|
||||||
onSuccess(ref.current?.value || 'N/A');
|
onSuccess(ref.current?.value || t('core.chat.feedback.No Content'));
|
||||||
},
|
},
|
||||||
successToast: t('chat.Feedback Success'),
|
successToast: t('chat.Feedback Success'),
|
||||||
errorToast: t('chat.Feedback Failed')
|
errorToast: t('chat.Feedback Failed')
|
||||||
@ -40,11 +43,7 @@ const FeedbackModal = ({
|
|||||||
title={t('chat.Feedback Modal')}
|
title={t('chat.Feedback Modal')}
|
||||||
>
|
>
|
||||||
<ModalBody>
|
<ModalBody>
|
||||||
<Textarea
|
<Textarea ref={ref} rows={10} placeholder={t('chat.Feedback Modal Tip')} />
|
||||||
ref={ref}
|
|
||||||
rows={10}
|
|
||||||
placeholder={t('chat.Feedback Modal Tip') || 'chat.Feedback Modal Tip'}
|
|
||||||
/>
|
|
||||||
</ModalBody>
|
</ModalBody>
|
||||||
<ModalFooter>
|
<ModalFooter>
|
||||||
<Button variant={'base'} mr={2} onClick={onClose}>
|
<Button variant={'base'} mr={2} onClick={onClose}>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import React, { useCallback, useMemo, useState } from 'react';
|
import React, { useCallback, useState } from 'react';
|
||||||
import { ModalBody, Box, useTheme, Flex, Progress, Link, Image } from '@chakra-ui/react';
|
import { ModalBody, Box, useTheme, Flex, Progress, Link } from '@chakra-ui/react';
|
||||||
import { getDatasetDataItemById } from '@/web/core/dataset/api';
|
import { getDatasetDataItemById } from '@/web/core/dataset/api';
|
||||||
import { useLoading } from '@/web/common/hooks/useLoading';
|
import { useLoading } from '@/web/common/hooks/useLoading';
|
||||||
import { useToast } from '@/web/common/hooks/useToast';
|
import { useToast } from '@/web/common/hooks/useToast';
|
||||||
@ -11,7 +11,6 @@ import InputDataModal, {
|
|||||||
} from '@/pages/dataset/detail/components/InputDataModal';
|
} from '@/pages/dataset/detail/components/InputDataModal';
|
||||||
import MyModal from '../MyModal';
|
import MyModal from '../MyModal';
|
||||||
import { useTranslation } from 'next-i18next';
|
import { useTranslation } from 'next-i18next';
|
||||||
import { useRouter } from 'next/router';
|
|
||||||
import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type';
|
import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type';
|
||||||
import MyTooltip from '../MyTooltip';
|
import MyTooltip from '../MyTooltip';
|
||||||
import NextLink from 'next/link';
|
import NextLink from 'next/link';
|
||||||
@ -19,21 +18,20 @@ import { useSystemStore } from '@/web/common/system/useSystemStore';
|
|||||||
|
|
||||||
const QuoteModal = ({
|
const QuoteModal = ({
|
||||||
rawSearch = [],
|
rawSearch = [],
|
||||||
onClose
|
onClose,
|
||||||
|
isShare
|
||||||
}: {
|
}: {
|
||||||
rawSearch: SearchDataResponseItemType[];
|
rawSearch: SearchDataResponseItemType[];
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
|
isShare: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { isPc } = useSystemStore();
|
const { isPc } = useSystemStore();
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const router = useRouter();
|
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
const { setIsLoading, Loading } = useLoading();
|
const { setIsLoading, Loading } = useLoading();
|
||||||
const [editInputData, setEditInputData] = useState<InputDataType & { collectionId: string }>();
|
const [editInputData, setEditInputData] = useState<InputDataType & { collectionId: string }>();
|
||||||
|
|
||||||
const isShare = useMemo(() => router.pathname === '/chat/share', [router.pathname]);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* click edit, get new DataItem
|
* click edit, get new DataItem
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -1,40 +1,19 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { ModalBody, ModalFooter, Button } from '@chakra-ui/react';
|
import { ModalBody, ModalFooter, Button } from '@chakra-ui/react';
|
||||||
import MyModal from '../MyModal';
|
import MyModal from '../MyModal';
|
||||||
import { useRequest } from '@/web/common/hooks/useRequest';
|
|
||||||
import { useTranslation } from 'next-i18next';
|
import { useTranslation } from 'next-i18next';
|
||||||
import { userUpdateChatFeedback } from '@/web/core/chat/api';
|
|
||||||
|
|
||||||
const ReadFeedbackModal = ({
|
const ReadFeedbackModal = ({
|
||||||
chatItemId,
|
|
||||||
content,
|
content,
|
||||||
isMarked,
|
onCloseFeedback,
|
||||||
onMark,
|
|
||||||
onSuccess,
|
|
||||||
onClose
|
onClose
|
||||||
}: {
|
}: {
|
||||||
chatItemId: string;
|
|
||||||
content: string;
|
content: string;
|
||||||
isMarked: boolean;
|
onCloseFeedback: () => void;
|
||||||
onMark: () => void;
|
|
||||||
onSuccess: () => void;
|
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { mutate, isLoading } = useRequest({
|
|
||||||
mutationFn: async () => {
|
|
||||||
return userUpdateChatFeedback({
|
|
||||||
chatItemId,
|
|
||||||
userFeedback: undefined
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onSuccess() {
|
|
||||||
onSuccess();
|
|
||||||
},
|
|
||||||
errorToast: t('chat.Feedback Update Failed')
|
|
||||||
});
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MyModal
|
<MyModal
|
||||||
isOpen={true}
|
isOpen={true}
|
||||||
@ -44,14 +23,9 @@ const ReadFeedbackModal = ({
|
|||||||
>
|
>
|
||||||
<ModalBody>{content}</ModalBody>
|
<ModalBody>{content}</ModalBody>
|
||||||
<ModalFooter>
|
<ModalFooter>
|
||||||
<Button mr={2} isLoading={isLoading} variant={'base'} onClick={mutate}>
|
<Button mr={2} onClick={onCloseFeedback}>
|
||||||
{t('chat.Feedback Close')}
|
{t('core.chat.feedback.Feedback Close')}
|
||||||
</Button>
|
</Button>
|
||||||
{!isMarked && (
|
|
||||||
<Button mr={2} onClick={onMark}>
|
|
||||||
{t('chat.Feedback Mark')}
|
|
||||||
</Button>
|
|
||||||
)}
|
|
||||||
</ModalFooter>
|
</ModalFooter>
|
||||||
</MyModal>
|
</MyModal>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -13,12 +13,19 @@ import { getSourceNameIcon } from '@fastgpt/global/core/dataset/utils';
|
|||||||
import ChatBoxDivider from '@/components/core/chat/Divider';
|
import ChatBoxDivider from '@/components/core/chat/Divider';
|
||||||
import MyIcon from '../Icon';
|
import MyIcon from '../Icon';
|
||||||
import { getFileAndOpen } from '@/web/core/dataset/utils';
|
import { getFileAndOpen } from '@/web/core/dataset/utils';
|
||||||
|
import { strIsLink } from '@fastgpt/global/common/string/tools';
|
||||||
|
|
||||||
const QuoteModal = dynamic(() => import('./QuoteModal'), { ssr: false });
|
const QuoteModal = dynamic(() => import('./QuoteModal'), { ssr: false });
|
||||||
const ContextModal = dynamic(() => import('./ContextModal'), { ssr: false });
|
const ContextModal = dynamic(() => import('./ContextModal'), { ssr: false });
|
||||||
const WholeResponseModal = dynamic(() => import('./WholeResponseModal'), { ssr: false });
|
const WholeResponseModal = dynamic(() => import('./WholeResponseModal'), { ssr: false });
|
||||||
|
|
||||||
const ResponseTags = ({ responseData = [] }: { responseData?: ChatHistoryItemResType[] }) => {
|
const ResponseTags = ({
|
||||||
|
responseData = [],
|
||||||
|
isShare
|
||||||
|
}: {
|
||||||
|
responseData?: ChatHistoryItemResType[];
|
||||||
|
isShare: boolean;
|
||||||
|
}) => {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const { isPc } = useSystemStore();
|
const { isPc } = useSystemStore();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@ -62,12 +69,13 @@ const ResponseTags = ({ responseData = [] }: { responseData?: ChatHistoryItemRes
|
|||||||
.map((item) => ({
|
.map((item) => ({
|
||||||
sourceName: item.sourceName,
|
sourceName: item.sourceName,
|
||||||
sourceId: item.sourceId,
|
sourceId: item.sourceId,
|
||||||
icon: getSourceNameIcon({ sourceId: item.sourceId, sourceName: item.sourceName })
|
icon: getSourceNameIcon({ sourceId: item.sourceId, sourceName: item.sourceName }),
|
||||||
|
canReadQuote: !isShare || strIsLink(item.sourceId)
|
||||||
})),
|
})),
|
||||||
historyPreview: chatData?.historyPreview,
|
historyPreview: chatData?.historyPreview,
|
||||||
runningTime: +responseData.reduce((sum, item) => sum + (item.runningTime || 0), 0).toFixed(2)
|
runningTime: +responseData.reduce((sum, item) => sum + (item.runningTime || 0), 0).toFixed(2)
|
||||||
};
|
};
|
||||||
}, [responseData]);
|
}, [isShare, responseData]);
|
||||||
|
|
||||||
const TagStyles: BoxProps = {
|
const TagStyles: BoxProps = {
|
||||||
mr: 2,
|
mr: 2,
|
||||||
@ -97,7 +105,6 @@ const ResponseTags = ({ responseData = [] }: { responseData?: ChatHistoryItemRes
|
|||||||
}}
|
}}
|
||||||
overflow={'hidden'}
|
overflow={'hidden'}
|
||||||
position={'relative'}
|
position={'relative'}
|
||||||
onClick={() => setQuoteModalData(quoteList)}
|
|
||||||
>
|
>
|
||||||
<Image src={item.icon} alt={''} mr={1} w={'12px'} />
|
<Image src={item.icon} alt={''} mr={1} w={'12px'} />
|
||||||
<Box className="textEllipsis" flex={'1 0 0'}>
|
<Box className="textEllipsis" flex={'1 0 0'}>
|
||||||
@ -106,7 +113,7 @@ const ResponseTags = ({ responseData = [] }: { responseData?: ChatHistoryItemRes
|
|||||||
|
|
||||||
<Box
|
<Box
|
||||||
className="controller"
|
className="controller"
|
||||||
display={['flex', 'none']}
|
display={'none'}
|
||||||
pr={2}
|
pr={2}
|
||||||
position={'absolute'}
|
position={'absolute'}
|
||||||
right={0}
|
right={0}
|
||||||
@ -127,9 +134,13 @@ const ResponseTags = ({ responseData = [] }: { responseData?: ChatHistoryItemRes
|
|||||||
_hover={{
|
_hover={{
|
||||||
color: 'green.600'
|
color: 'green.600'
|
||||||
}}
|
}}
|
||||||
|
onClick={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
setQuoteModalData(quoteList);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</MyTooltip>
|
</MyTooltip>
|
||||||
{item.sourceId && (
|
{item.sourceId && item.canReadQuote && (
|
||||||
<MyTooltip label={t('core.chat.quote.Read Source')}>
|
<MyTooltip label={t('core.chat.quote.Read Source')}>
|
||||||
<MyIcon
|
<MyIcon
|
||||||
ml={4}
|
ml={4}
|
||||||
@ -201,7 +212,11 @@ const ResponseTags = ({ responseData = [] }: { responseData?: ChatHistoryItemRes
|
|||||||
</MyTooltip>
|
</MyTooltip>
|
||||||
|
|
||||||
{!!quoteModalData && (
|
{!!quoteModalData && (
|
||||||
<QuoteModal rawSearch={quoteModalData} onClose={() => setQuoteModalData(undefined)} />
|
<QuoteModal
|
||||||
|
rawSearch={quoteModalData}
|
||||||
|
isShare={isShare}
|
||||||
|
onClose={() => setQuoteModalData(undefined)}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
{!!contextModalData && (
|
{!!contextModalData && (
|
||||||
<ContextModal context={contextModalData} onClose={() => setContextModalData(undefined)} />
|
<ContextModal context={contextModalData} onClose={() => setContextModalData(undefined)} />
|
||||||
|
|||||||
@ -43,7 +43,7 @@ import { useRouter } from 'next/router';
|
|||||||
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
||||||
import { useTranslation } from 'next-i18next';
|
import { useTranslation } from 'next-i18next';
|
||||||
import { customAlphabet } from 'nanoid';
|
import { customAlphabet } from 'nanoid';
|
||||||
import { adminUpdateChatFeedback, userUpdateChatFeedback } from '@/web/core/chat/api';
|
import { updateChatAdminFeedback, updateChatUserFeedback } from '@/web/core/chat/api';
|
||||||
import type { AdminMarkType } from './SelectMarkCollection';
|
import type { AdminMarkType } from './SelectMarkCollection';
|
||||||
|
|
||||||
import MyIcon from '@/components/Icon';
|
import MyIcon from '@/components/Icon';
|
||||||
@ -51,7 +51,6 @@ import Avatar from '@/components/Avatar';
|
|||||||
import Markdown, { CodeClassName } from '@/components/Markdown';
|
import Markdown, { CodeClassName } from '@/components/Markdown';
|
||||||
import MySelect from '@/components/Select';
|
import MySelect from '@/components/Select';
|
||||||
import MyTooltip from '../MyTooltip';
|
import MyTooltip from '../MyTooltip';
|
||||||
import ChatBoxDivider from '@/components/core/chat/Divider';
|
|
||||||
import dynamic from 'next/dynamic';
|
import dynamic from 'next/dynamic';
|
||||||
const ResponseTags = dynamic(() => import('./ResponseTags'));
|
const ResponseTags = dynamic(() => import('./ResponseTags'));
|
||||||
const FeedbackModal = dynamic(() => import('./FeedbackModal'));
|
const FeedbackModal = dynamic(() => import('./FeedbackModal'));
|
||||||
@ -64,7 +63,6 @@ import { splitGuideModule } from '@fastgpt/global/core/module/utils';
|
|||||||
import type { AppTTSConfigType } from '@fastgpt/global/core/module/type.d';
|
import type { AppTTSConfigType } from '@fastgpt/global/core/module/type.d';
|
||||||
import MessageInput from './MessageInput';
|
import MessageInput from './MessageInput';
|
||||||
import { ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants';
|
import { ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants';
|
||||||
import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant';
|
|
||||||
|
|
||||||
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 24);
|
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 24);
|
||||||
|
|
||||||
@ -104,6 +102,9 @@ type Props = {
|
|||||||
userGuideModule?: ModuleItemType;
|
userGuideModule?: ModuleItemType;
|
||||||
showFileSelector?: boolean;
|
showFileSelector?: boolean;
|
||||||
active?: boolean; // can use
|
active?: boolean; // can use
|
||||||
|
chatId?: string;
|
||||||
|
shareId?: string;
|
||||||
|
outLinkUid?: string;
|
||||||
onUpdateVariable?: (e: Record<string, any>) => void;
|
onUpdateVariable?: (e: Record<string, any>) => void;
|
||||||
onStartChat?: (e: StartChatFnProps) => Promise<{
|
onStartChat?: (e: StartChatFnProps) => Promise<{
|
||||||
responseText: string;
|
responseText: string;
|
||||||
@ -124,6 +125,9 @@ const ChatBox = (
|
|||||||
userGuideModule,
|
userGuideModule,
|
||||||
showFileSelector,
|
showFileSelector,
|
||||||
active = true,
|
active = true,
|
||||||
|
chatId,
|
||||||
|
shareId,
|
||||||
|
outLinkUid,
|
||||||
onUpdateVariable,
|
onUpdateVariable,
|
||||||
onStartChat,
|
onStartChat,
|
||||||
onDelMessage
|
onDelMessage
|
||||||
@ -133,7 +137,6 @@ const ChatBox = (
|
|||||||
const ChatBoxRef = useRef<HTMLDivElement>(null);
|
const ChatBoxRef = useRef<HTMLDivElement>(null);
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { shareId } = router.query as { shareId?: string };
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
const { isPc, setLoading } = useSystemStore();
|
const { isPc, setLoading } = useSystemStore();
|
||||||
@ -147,10 +150,8 @@ const ChatBox = (
|
|||||||
const [chatHistory, setChatHistory] = useState<ChatSiteItemType[]>([]);
|
const [chatHistory, setChatHistory] = useState<ChatSiteItemType[]>([]);
|
||||||
const [feedbackId, setFeedbackId] = useState<string>();
|
const [feedbackId, setFeedbackId] = useState<string>();
|
||||||
const [readFeedbackData, setReadFeedbackData] = useState<{
|
const [readFeedbackData, setReadFeedbackData] = useState<{
|
||||||
// read feedback modal data
|
|
||||||
chatItemId: string;
|
chatItemId: string;
|
||||||
content: string;
|
content: string;
|
||||||
isMarked: boolean;
|
|
||||||
}>();
|
}>();
|
||||||
const [adminMarkData, setAdminMarkData] = useState<AdminMarkType & { chatItemId: string }>();
|
const [adminMarkData, setAdminMarkData] = useState<AdminMarkType & { chatItemId: string }>();
|
||||||
const [questionGuides, setQuestionGuide] = useState<string[]>([]);
|
const [questionGuides, setQuestionGuide] = useState<string[]>([]);
|
||||||
@ -653,7 +654,6 @@ const ChatBox = (
|
|||||||
<Box mt={['6px', 2]} textAlign={'right'}>
|
<Box mt={['6px', 2]} textAlign={'right'}>
|
||||||
<Card
|
<Card
|
||||||
className="markdown"
|
className="markdown"
|
||||||
whiteSpace={'pre-wrap'}
|
|
||||||
{...MessageCardStyle}
|
{...MessageCardStyle}
|
||||||
bg={'myBlue.300'}
|
bg={'myBlue.300'}
|
||||||
borderRadius={'8px 0 8px 8px'}
|
borderRadius={'8px 0 8px 8px'}
|
||||||
@ -706,33 +706,90 @@ const ChatBox = (
|
|||||||
}
|
}
|
||||||
: undefined
|
: undefined
|
||||||
}
|
}
|
||||||
onReadFeedback={
|
onAddUserLike={(() => {
|
||||||
|
if (feedbackType !== FeedbackTypeEnum.user || item.userBadFeedback) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return () => {
|
||||||
|
if (!item.dataId || !chatId) return;
|
||||||
|
|
||||||
|
const isGoodFeedback = !!item.userGoodFeedback;
|
||||||
|
setChatHistory((state) =>
|
||||||
|
state.map((chatItem) =>
|
||||||
|
chatItem.dataId === item.dataId
|
||||||
|
? {
|
||||||
|
...chatItem,
|
||||||
|
userGoodFeedback: isGoodFeedback ? undefined : 'yes'
|
||||||
|
}
|
||||||
|
: chatItem
|
||||||
|
)
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
updateChatUserFeedback({
|
||||||
|
chatId,
|
||||||
|
chatItemId: item.dataId,
|
||||||
|
shareId,
|
||||||
|
outLinkUid,
|
||||||
|
userGoodFeedback: isGoodFeedback ? undefined : 'yes'
|
||||||
|
});
|
||||||
|
} catch (error) {}
|
||||||
|
};
|
||||||
|
})()}
|
||||||
|
onCloseUserLike={
|
||||||
feedbackType === FeedbackTypeEnum.admin
|
feedbackType === FeedbackTypeEnum.admin
|
||||||
? () =>
|
? () => {
|
||||||
setReadFeedbackData({
|
if (!item.dataId || !chatId) return;
|
||||||
chatItemId: item.dataId || '',
|
setChatHistory((state) =>
|
||||||
content: item.userFeedback || '',
|
state.map((chatItem) =>
|
||||||
isMarked: !!item.adminFeedback
|
chatItem.dataId === item.dataId
|
||||||
})
|
? { ...chatItem, userGoodFeedback: undefined }
|
||||||
|
: chatItem
|
||||||
|
)
|
||||||
|
);
|
||||||
|
updateChatUserFeedback({
|
||||||
|
chatId,
|
||||||
|
chatItemId: item.dataId,
|
||||||
|
userGoodFeedback: undefined
|
||||||
|
});
|
||||||
|
}
|
||||||
: undefined
|
: undefined
|
||||||
}
|
}
|
||||||
onFeedback={
|
onAddUserDislike={(() => {
|
||||||
feedbackType === FeedbackTypeEnum.user
|
if (feedbackType !== FeedbackTypeEnum.user || item.userGoodFeedback) {
|
||||||
? item.userFeedback
|
return;
|
||||||
? () => {
|
}
|
||||||
if (!item.dataId) return;
|
if (item.userBadFeedback) {
|
||||||
setChatHistory((state) =>
|
return () => {
|
||||||
state.map((chatItem) =>
|
if (!item.dataId || !chatId) return;
|
||||||
chatItem.dataId === item.dataId
|
setChatHistory((state) =>
|
||||||
? { ...chatItem, userFeedback: undefined }
|
state.map((chatItem) =>
|
||||||
: chatItem
|
chatItem.dataId === item.dataId
|
||||||
)
|
? { ...chatItem, userBadFeedback: undefined }
|
||||||
);
|
: chatItem
|
||||||
try {
|
)
|
||||||
userUpdateChatFeedback({ chatItemId: item.dataId });
|
);
|
||||||
} catch (error) {}
|
try {
|
||||||
}
|
updateChatUserFeedback({
|
||||||
: () => setFeedbackId(item.dataId)
|
chatId,
|
||||||
|
chatItemId: item.dataId,
|
||||||
|
shareId,
|
||||||
|
outLinkUid
|
||||||
|
});
|
||||||
|
} catch (error) {}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return () => setFeedbackId(item.dataId);
|
||||||
|
}
|
||||||
|
})()}
|
||||||
|
onReadUserDislike={
|
||||||
|
feedbackType === FeedbackTypeEnum.admin
|
||||||
|
? () => {
|
||||||
|
if (!item.dataId) return;
|
||||||
|
setReadFeedbackData({
|
||||||
|
chatItemId: item.dataId || '',
|
||||||
|
content: item.userBadFeedback || ''
|
||||||
|
});
|
||||||
|
}
|
||||||
: undefined
|
: undefined
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
@ -786,7 +843,7 @@ const ChatBox = (
|
|||||||
isChatting={index === chatHistory.length - 1 && isChatting}
|
isChatting={index === chatHistory.length - 1 && isChatting}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<ResponseTags responseData={item.responseData} />
|
<ResponseTags responseData={item.responseData} isShare={!!shareId} />
|
||||||
|
|
||||||
{/* admin mark content */}
|
{/* admin mark content */}
|
||||||
{showMarkIcon && item.adminFeedback && (
|
{showMarkIcon && item.adminFeedback && (
|
||||||
@ -828,16 +885,16 @@ const ChatBox = (
|
|||||||
showFileSelector={showFileSelector}
|
showFileSelector={showFileSelector}
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
|
|
||||||
{/* user feedback modal */}
|
{/* user feedback modal */}
|
||||||
{!!feedbackId && (
|
{!!feedbackId && chatId && (
|
||||||
<FeedbackModal
|
<FeedbackModal
|
||||||
|
chatId={chatId}
|
||||||
chatItemId={feedbackId}
|
chatItemId={feedbackId}
|
||||||
onClose={() => setFeedbackId(undefined)}
|
onClose={() => setFeedbackId(undefined)}
|
||||||
onSuccess={(content: string) => {
|
onSuccess={(content: string) => {
|
||||||
setChatHistory((state) =>
|
setChatHistory((state) =>
|
||||||
state.map((item) =>
|
state.map((item) =>
|
||||||
item.dataId === feedbackId ? { ...item, userFeedback: content } : item
|
item.dataId === feedbackId ? { ...item, userBadFeedback: content } : item
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
setFeedbackId(undefined);
|
setFeedbackId(undefined);
|
||||||
@ -847,27 +904,23 @@ const ChatBox = (
|
|||||||
{/* admin read feedback modal */}
|
{/* admin read feedback modal */}
|
||||||
{!!readFeedbackData && (
|
{!!readFeedbackData && (
|
||||||
<ReadFeedbackModal
|
<ReadFeedbackModal
|
||||||
{...readFeedbackData}
|
content={readFeedbackData.content}
|
||||||
onClose={() => setReadFeedbackData(undefined)}
|
onClose={() => setReadFeedbackData(undefined)}
|
||||||
onMark={() => {
|
onCloseFeedback={() => {
|
||||||
const index = chatHistory.findIndex(
|
|
||||||
(item) => item.dataId === readFeedbackData.chatItemId
|
|
||||||
);
|
|
||||||
if (index === -1) return setReadFeedbackData(undefined);
|
|
||||||
setAdminMarkData({
|
|
||||||
chatItemId: readFeedbackData.chatItemId,
|
|
||||||
q: chatHistory[index - 1]?.value || '',
|
|
||||||
a: chatHistory[index]?.value || ''
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
onSuccess={() => {
|
|
||||||
setChatHistory((state) =>
|
setChatHistory((state) =>
|
||||||
state.map((chatItem) =>
|
state.map((chatItem) =>
|
||||||
chatItem.dataId === readFeedbackData.chatItemId
|
chatItem.dataId === readFeedbackData.chatItemId
|
||||||
? { ...chatItem, userFeedback: undefined }
|
? { ...chatItem, userBadFeedback: undefined }
|
||||||
: chatItem
|
: chatItem
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
try {
|
||||||
|
if (!chatId) return;
|
||||||
|
updateChatUserFeedback({
|
||||||
|
chatId,
|
||||||
|
chatItemId: readFeedbackData.chatItemId
|
||||||
|
});
|
||||||
|
} catch (error) {}
|
||||||
setReadFeedbackData(undefined);
|
setReadFeedbackData(undefined);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@ -879,7 +932,7 @@ const ChatBox = (
|
|||||||
setAdminMarkData={(e) => setAdminMarkData({ ...e, chatItemId: adminMarkData.chatItemId })}
|
setAdminMarkData={(e) => setAdminMarkData({ ...e, chatItemId: adminMarkData.chatItemId })}
|
||||||
onClose={() => setAdminMarkData(undefined)}
|
onClose={() => setAdminMarkData(undefined)}
|
||||||
onSuccess={(adminFeedback) => {
|
onSuccess={(adminFeedback) => {
|
||||||
adminUpdateChatFeedback({
|
updateChatAdminFeedback({
|
||||||
chatItemId: adminMarkData.chatItemId,
|
chatItemId: adminMarkData.chatItemId,
|
||||||
...adminFeedback
|
...adminFeedback
|
||||||
});
|
});
|
||||||
@ -895,15 +948,16 @@ const ChatBox = (
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (readFeedbackData) {
|
if (readFeedbackData && chatId) {
|
||||||
userUpdateChatFeedback({
|
updateChatUserFeedback({
|
||||||
|
chatId,
|
||||||
chatItemId: readFeedbackData.chatItemId,
|
chatItemId: readFeedbackData.chatItemId,
|
||||||
userFeedback: undefined
|
userBadFeedback: undefined
|
||||||
});
|
});
|
||||||
setChatHistory((state) =>
|
setChatHistory((state) =>
|
||||||
state.map((chatItem) =>
|
state.map((chatItem) =>
|
||||||
chatItem.dataId === readFeedbackData.chatItemId
|
chatItem.dataId === readFeedbackData.chatItemId
|
||||||
? { ...chatItem, userFeedback: undefined }
|
? { ...chatItem, userBadFeedback: undefined }
|
||||||
: chatItem
|
: chatItem
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@ -1054,11 +1108,13 @@ function ChatController({
|
|||||||
display,
|
display,
|
||||||
showVoiceIcon,
|
showVoiceIcon,
|
||||||
ttsConfig,
|
ttsConfig,
|
||||||
onReadFeedback,
|
onReadUserDislike,
|
||||||
|
onCloseUserLike,
|
||||||
onMark,
|
onMark,
|
||||||
onRetry,
|
onRetry,
|
||||||
onDelete,
|
onDelete,
|
||||||
onFeedback,
|
onAddUserDislike,
|
||||||
|
onAddUserLike,
|
||||||
ml,
|
ml,
|
||||||
mr
|
mr
|
||||||
}: {
|
}: {
|
||||||
@ -1069,8 +1125,10 @@ function ChatController({
|
|||||||
onRetry?: () => void;
|
onRetry?: () => void;
|
||||||
onDelete?: () => void;
|
onDelete?: () => void;
|
||||||
onMark?: () => void;
|
onMark?: () => void;
|
||||||
onReadFeedback?: () => void;
|
onReadUserDislike?: () => void;
|
||||||
onFeedback?: () => void;
|
onCloseUserLike?: () => void;
|
||||||
|
onAddUserLike?: () => void;
|
||||||
|
onAddUserDislike?: () => void;
|
||||||
} & FlexProps) {
|
} & FlexProps) {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@ -1184,39 +1242,62 @@ function ChatController({
|
|||||||
/>
|
/>
|
||||||
</MyTooltip>
|
</MyTooltip>
|
||||||
)}
|
)}
|
||||||
{!!onReadFeedback && (
|
{!!onCloseUserLike && chat.userGoodFeedback && (
|
||||||
<MyTooltip label={t('chat.Read User Feedback')}>
|
<MyTooltip label={t('core.chat.feedback.Close User Like')}>
|
||||||
|
<MyIcon
|
||||||
|
{...controlIconStyle}
|
||||||
|
color={'white'}
|
||||||
|
bg={'green.500'}
|
||||||
|
fontWeight={'bold'}
|
||||||
|
name={'core/chat/feedback/goodLight'}
|
||||||
|
onClick={onCloseUserLike}
|
||||||
|
/>
|
||||||
|
</MyTooltip>
|
||||||
|
)}
|
||||||
|
{!!onReadUserDislike && chat.userBadFeedback && (
|
||||||
|
<MyTooltip label={t('core.chat.feedback.Read User dislike')}>
|
||||||
<MyIcon
|
<MyIcon
|
||||||
display={chat.userFeedback ? 'block' : 'none'}
|
|
||||||
{...controlIconStyle}
|
{...controlIconStyle}
|
||||||
color={'white'}
|
color={'white'}
|
||||||
bg={'#FC9663'}
|
bg={'#FC9663'}
|
||||||
fontWeight={'bold'}
|
fontWeight={'bold'}
|
||||||
name={'core/chat/feedback/badLight'}
|
name={'core/chat/feedback/badLight'}
|
||||||
onClick={onReadFeedback}
|
onClick={onReadUserDislike}
|
||||||
/>
|
/>
|
||||||
</MyTooltip>
|
</MyTooltip>
|
||||||
)}
|
)}
|
||||||
{!!onFeedback && (
|
{!!onAddUserLike && (
|
||||||
<MyTooltip
|
<MyIcon
|
||||||
label={chat.userFeedback ? `取消反馈。\n您当前反馈内容为:\n${chat.userFeedback}` : '反馈'}
|
{...controlIconStyle}
|
||||||
>
|
{...(!!chat.userGoodFeedback
|
||||||
<MyIcon
|
? {
|
||||||
{...controlIconStyle}
|
color: 'white',
|
||||||
{...(!!chat.userFeedback
|
bg: 'green.500',
|
||||||
? {
|
fontWeight: 'bold'
|
||||||
color: 'white',
|
}
|
||||||
bg: '#FC9663',
|
: {
|
||||||
fontWeight: 'bold',
|
_hover: { color: 'green.600' }
|
||||||
onClick: onFeedback
|
})}
|
||||||
}
|
name={'core/chat/feedback/goodLight'}
|
||||||
: {
|
onClick={onAddUserLike}
|
||||||
_hover: { color: '#FB7C3C' },
|
/>
|
||||||
onClick: onFeedback
|
)}
|
||||||
})}
|
{!!onAddUserDislike && (
|
||||||
name={'core/chat/feedback/badLight'}
|
<MyIcon
|
||||||
/>
|
{...controlIconStyle}
|
||||||
</MyTooltip>
|
{...(!!chat.userBadFeedback
|
||||||
|
? {
|
||||||
|
color: 'white',
|
||||||
|
bg: '#FC9663',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
onClick: onAddUserDislike
|
||||||
|
}
|
||||||
|
: {
|
||||||
|
_hover: { color: '#FB7C3C' },
|
||||||
|
onClick: onAddUserDislike
|
||||||
|
})}
|
||||||
|
name={'core/chat/feedback/badLight'}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
</Flex>
|
</Flex>
|
||||||
);
|
);
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 2.0 KiB |
@ -0,0 +1,9 @@
|
|||||||
|
<?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="1702264142648"
|
||||||
|
class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2973"
|
||||||
|
data-spm-anchor-id="a313x.manage_type_myprojects.0.i0.65e73a81QqWlcB" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
width="128" height="128">
|
||||||
|
<path
|
||||||
|
d="M743.328 985.536l-316.704 0c-12.896 0-23.392-10.368-23.392-23.104s10.496-23.072 23.392-23.072l316.704 0c67.296 0 99.808-36.512 115.168-67.136 0.768-1.856 1.024-3.552 1.408-5.568 2.912-14.624 7.84-39.168 40.192-77.92 23.328-27.968 19.328-57.664 14.624-92.032-1.472-10.912-2.944-21.76-3.552-32.512-2.688-45.856 9.344-65.664 26.048-93.12 3.04-4.928 6.304-10.304 9.792-16.32 15.328-26.432 14.464-59.232-2.304-87.712-20.48-34.816-59.008-55.648-103.008-55.648-77.952 0-167.808 2.656-168.672 2.656-7.776 0.288-13.888-2.72-18.464-8-4.64-5.28-6.528-12.352-5.28-19.2 0.32-1.6 29.664-160.48 29.664-230.304 0-71.616-54.336-79.328-77.632-79.328-36.832 0-66.784 39.2-66.784 87.424 0 59.936 0 80.16-31.68 123.904-43.712 60.352-126.24 161.632-188.416 161.632L275.04 450.176l0 512.224c0 12.768-10.496 23.104-23.392 23.104L117.76 985.504c-49.056 0-88.992-39.392-88.992-87.808L28.768 491.808c0-48.384 39.904-87.776 88.992-87.776l196.704 0c27.84 0 89.696-58.496 150.304-142.272 22.976-31.712 22.976-39.168 22.976-97.088 0-74.944 49.856-133.6 113.536-133.6 57.408 0 124.448 32.896 124.448 125.504 0 56.128-16.8 160.576-25.44 210.656 33.184-0.8 89.856-1.952 141.408-1.952 60.864 0 114.56 29.376 143.488 78.624 25.216 42.88 26.144 92.928 2.464 133.792-3.68 6.336-7.104 11.968-10.272 17.184-15.52 25.472-21.344 35.008-19.488 66.656 0.576 9.568 1.952 19.296 3.232 29.024 5.088 37.408 11.424 83.968-24.896 127.488-24.832 29.792-28.192 46.496-30.432 57.536-1.056 5.28-2.176 10.752-4.928 16.256C870.336 952.544 814.56 985.536 743.328 985.536L743.328 985.536zM117.76 450.208c-23.232 0-42.176 18.656-42.176 41.6l0 405.952c0 22.976 18.944 41.632 42.176 41.632l110.496 0L228.256 450.208 117.76 450.208 117.76 450.208zM117.76 450.208"
|
||||||
|
p-id="2974"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.1 KiB |
@ -78,6 +78,7 @@ const iconPaths = {
|
|||||||
'support/account/promotionLight': () => import('./icons/support/account/promotionLight.svg'),
|
'support/account/promotionLight': () => import('./icons/support/account/promotionLight.svg'),
|
||||||
'core/app/logsLight': () => import('./icons/core/app/logsLight.svg'),
|
'core/app/logsLight': () => import('./icons/core/app/logsLight.svg'),
|
||||||
'core/chat/feedback/badLight': () => import('./icons/core/chat/feedback/badLight.svg'),
|
'core/chat/feedback/badLight': () => import('./icons/core/chat/feedback/badLight.svg'),
|
||||||
|
'core/chat/feedback/goodLight': () => import('./icons/core/chat/feedback/goodLight.svg'),
|
||||||
'core/app/markLight': () => import('./icons/core/app/markLight.svg'),
|
'core/app/markLight': () => import('./icons/core/app/markLight.svg'),
|
||||||
'common/retryLight': () => import('./icons/common/retryLight.svg'),
|
'common/retryLight': () => import('./icons/common/retryLight.svg'),
|
||||||
'common/rightArrowLight': () => import('./icons/common/rightArrowLight.svg'),
|
'common/rightArrowLight': () => import('./icons/common/rightArrowLight.svg'),
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import { Box, Flex, Link } from '@chakra-ui/react';
|
|||||||
import { useRouter } from 'next/router';
|
import { useRouter } from 'next/router';
|
||||||
import { useUserStore } from '@/web/support/user/useUserStore';
|
import { useUserStore } from '@/web/support/user/useUserStore';
|
||||||
import { useChatStore } from '@/web/core/chat/storeChat';
|
import { useChatStore } from '@/web/core/chat/storeChat';
|
||||||
import { HUMAN_ICON } from '@fastgpt/global/core/chat/constants';
|
import { HUMAN_ICON } from '@fastgpt/global/common/system/constants';
|
||||||
import { feConfigs } from '@/web/common/system/staticData';
|
import { feConfigs } from '@/web/common/system/staticData';
|
||||||
import NextLink from 'next/link';
|
import NextLink from 'next/link';
|
||||||
import Badge from '../Badge';
|
import Badge from '../Badge';
|
||||||
@ -175,18 +175,17 @@ const Navbar = ({ unread }: { unread: number }) => {
|
|||||||
</Link>
|
</Link>
|
||||||
</Box>
|
</Box>
|
||||||
)}
|
)}
|
||||||
{feConfigs?.docUrl && (
|
{(feConfigs?.docUrl || feConfigs?.chatbotUrl) && (
|
||||||
<MyTooltip label={t('home.Docs')} placement={'right-end'}>
|
<MyTooltip label={t('common.system.Use Helper')} placement={'right-end'}>
|
||||||
<Box
|
<Link
|
||||||
{...itemStyles}
|
{...itemStyles}
|
||||||
|
href={feConfigs?.chatbotUrl || getDocPath('/docs/intro')}
|
||||||
|
target="_blank"
|
||||||
mb={0}
|
mb={0}
|
||||||
color={'#9096a5'}
|
color={'#9096a5'}
|
||||||
onClick={() => {
|
|
||||||
window.open(getDocPath('/docs/intro'));
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<MyIcon name={'common/courseLight'} width={'26px'} height={'26px'} />
|
<MyIcon name={'common/courseLight'} width={'26px'} height={'26px'} />
|
||||||
</Box>
|
</Link>
|
||||||
</MyTooltip>
|
</MyTooltip>
|
||||||
)}
|
)}
|
||||||
{feConfigs?.show_git && (
|
{feConfigs?.show_git && (
|
||||||
|
|||||||
@ -49,7 +49,7 @@ const QuestionGuide = ({ text }: { text: string }) => {
|
|||||||
</Box>
|
</Box>
|
||||||
<Box
|
<Box
|
||||||
className="controller"
|
className="controller"
|
||||||
display={['flex', 'none']}
|
display={'none'}
|
||||||
pr={2}
|
pr={2}
|
||||||
position={'absolute'}
|
position={'absolute'}
|
||||||
right={0}
|
right={0}
|
||||||
|
|||||||
@ -173,7 +173,6 @@
|
|||||||
}
|
}
|
||||||
.markdown ul,
|
.markdown ul,
|
||||||
.markdown ol {
|
.markdown ol {
|
||||||
margin-bottom: 0;
|
|
||||||
padding-left: 14px;
|
padding-left: 14px;
|
||||||
}
|
}
|
||||||
.markdown dl {
|
.markdown dl {
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import { useSystemStore } from '@/web/common/system/useSystemStore';
|
|||||||
import { getPreviewPluginModule } from '@/web/core/plugin/api';
|
import { getPreviewPluginModule } from '@/web/core/plugin/api';
|
||||||
import { getErrText } from '@fastgpt/global/common/error/utils';
|
import { getErrText } from '@fastgpt/global/common/error/utils';
|
||||||
import { useConfirm } from '@/web/common/hooks/useConfirm';
|
import { useConfirm } from '@/web/common/hooks/useConfirm';
|
||||||
import { LOGO_ICON } from '@fastgpt/global/core/chat/constants';
|
import { LOGO_ICON } from '@fastgpt/global/common/system/constants';
|
||||||
|
|
||||||
type Props = FlowModuleItemType & {
|
type Props = FlowModuleItemType & {
|
||||||
children?: React.ReactNode | React.ReactNode[] | string;
|
children?: React.ReactNode | React.ReactNode[] | string;
|
||||||
|
|||||||
@ -82,7 +82,7 @@ const InviteModal = ({
|
|||||||
>
|
>
|
||||||
<ModalCloseButton onClick={onClose} />
|
<ModalCloseButton onClick={onClose} />
|
||||||
<ModalBody>
|
<ModalBody>
|
||||||
<Box mb={2}>{t('common.Username')}</Box>
|
<Box mb={2}>{t('user.Account')}</Box>
|
||||||
<TagTextarea defaultValues={inviteUsernames} onUpdate={setInviteUsernames} />
|
<TagTextarea defaultValues={inviteUsernames} onUpdate={setInviteUsernames} />
|
||||||
<Box mt={4}>
|
<Box mt={4}>
|
||||||
<MySelect list={inviteTypes} value={selectedInviteType} onchange={setSelectInviteType} />
|
<MySelect list={inviteTypes} value={selectedInviteType} onchange={setSelectInviteType} />
|
||||||
|
|||||||
@ -1,8 +1,3 @@
|
|||||||
export enum UserAuthTypeEnum {
|
|
||||||
register = 'register',
|
|
||||||
findPassword = 'findPassword'
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum TrackEventName {
|
export enum TrackEventName {
|
||||||
windowError = 'windowError',
|
windowError = 'windowError',
|
||||||
pageError = 'pageError',
|
pageError = 'pageError',
|
||||||
|
|||||||
@ -1,9 +1,8 @@
|
|||||||
export const Prompt_AgentQA = {
|
export const Prompt_AgentQA = {
|
||||||
description: `<context></context> 标记中是一段文本,学习它们,并整理学习成果。
|
description: `<context></context> 标记中是一段文本,学习和分析它,并整理学习成果:
|
||||||
|
|
||||||
学习要求:
|
|
||||||
- 提出问题并给出每个问题的答案。
|
- 提出问题并给出每个问题的答案。
|
||||||
- 答案需详细完整,给出相关原文描述。答案可以包含普通文字、链接、代码、表格、公示、媒体链接等 markdown 元素。
|
- 答案需详细完整,给出相关原文描述。
|
||||||
|
- 答案可以包含普通文字、链接、代码、表格、公示、媒体链接等 markdown 元素。
|
||||||
- 最多提出 30 个问题。
|
- 最多提出 30 个问题。
|
||||||
`,
|
`,
|
||||||
fixedText: `最后,你需要按下面的格式返回多个问题和答案:
|
fixedText: `最后,你需要按下面的格式返回多个问题和答案:
|
||||||
|
|||||||
@ -7,7 +7,8 @@ import {
|
|||||||
useTheme,
|
useTheme,
|
||||||
Divider,
|
Divider,
|
||||||
Select,
|
Select,
|
||||||
Input
|
Input,
|
||||||
|
Link
|
||||||
} from '@chakra-ui/react';
|
} from '@chakra-ui/react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { UserUpdateParams } from '@/types/user';
|
import { UserUpdateParams } from '@/types/user';
|
||||||
@ -249,32 +250,52 @@ const UserInfo = () => {
|
|||||||
</Flex>
|
</Flex>
|
||||||
</Box>
|
</Box>
|
||||||
{feConfigs?.docUrl && (
|
{feConfigs?.docUrl && (
|
||||||
<>
|
<Link
|
||||||
<Flex
|
href={getDocPath('/docs/intro')}
|
||||||
mt={4}
|
target="_blank"
|
||||||
w={['85%', '300px']}
|
display={'flex'}
|
||||||
py={3}
|
mt={4}
|
||||||
px={6}
|
w={['85%', '300px']}
|
||||||
border={theme.borders.sm}
|
py={3}
|
||||||
borderWidth={'1.5px'}
|
px={6}
|
||||||
borderRadius={'md'}
|
border={theme.borders.sm}
|
||||||
alignItems={'center'}
|
borderWidth={'1.5px'}
|
||||||
cursor={'pointer'}
|
borderRadius={'md'}
|
||||||
userSelect={'none'}
|
alignItems={'center'}
|
||||||
onClick={() => {
|
userSelect={'none'}
|
||||||
window.open(getDocPath('/docs/intro'));
|
textDecoration={'none !important'}
|
||||||
}}
|
>
|
||||||
>
|
<MyIcon name={'common/courseLight'} w={'18px'} />
|
||||||
<MyIcon name={'common/courseLight'} w={'18px'} />
|
<Box ml={2} flex={1}>
|
||||||
<Box ml={2} flex={1}>
|
{t('system.Help Document')}
|
||||||
{t('system.Help Document')}
|
</Box>
|
||||||
</Box>
|
<Box w={'8px'} h={'8px'} borderRadius={'50%'} bg={'#67c13b'} />
|
||||||
<Box w={'8px'} h={'8px'} borderRadius={'50%'} bg={'#67c13b'} />
|
<Box fontSize={'md'} ml={2}>
|
||||||
<Box fontSize={'md'} ml={2}>
|
V{systemVersion}
|
||||||
V{systemVersion}
|
</Box>
|
||||||
</Box>
|
</Link>
|
||||||
</Flex>
|
)}
|
||||||
</>
|
{feConfigs?.chatbotUrl && (
|
||||||
|
<Link
|
||||||
|
href={feConfigs.chatbotUrl}
|
||||||
|
target="_blank"
|
||||||
|
display={'flex'}
|
||||||
|
mt={4}
|
||||||
|
w={['85%', '300px']}
|
||||||
|
py={3}
|
||||||
|
px={6}
|
||||||
|
border={theme.borders.sm}
|
||||||
|
borderWidth={'1.5px'}
|
||||||
|
borderRadius={'md'}
|
||||||
|
alignItems={'center'}
|
||||||
|
userSelect={'none'}
|
||||||
|
textDecoration={'none !important'}
|
||||||
|
>
|
||||||
|
<MyIcon name={'core/app/aiLight'} w={'18px'} />
|
||||||
|
<Box ml={2} flex={1}>
|
||||||
|
{t('common.system.Help Chatbot')}
|
||||||
|
</Box>
|
||||||
|
</Link>
|
||||||
)}
|
)}
|
||||||
{feConfigs?.show_openai_account && (
|
{feConfigs?.show_openai_account && (
|
||||||
<>
|
<>
|
||||||
@ -283,7 +304,7 @@ const UserInfo = () => {
|
|||||||
<MyTooltip label={'点击配置账号'}>
|
<MyTooltip label={'点击配置账号'}>
|
||||||
<Flex
|
<Flex
|
||||||
w={['85%', '300px']}
|
w={['85%', '300px']}
|
||||||
py={3}
|
py={4}
|
||||||
px={6}
|
px={6}
|
||||||
border={theme.borders.sm}
|
border={theme.borders.sm}
|
||||||
borderWidth={'1.5px'}
|
borderWidth={'1.5px'}
|
||||||
|
|||||||
45
projects/app/src/pages/api/admin/init464.ts
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||||
|
import { jsonRes } from '@fastgpt/service/common/response';
|
||||||
|
|
||||||
|
import { authCert } from '@fastgpt/service/support/permission/auth/common';
|
||||||
|
import { PgClient } from '@fastgpt/service/common/pg';
|
||||||
|
import { PgDatasetTableName } from '@fastgpt/global/core/dataset/constant';
|
||||||
|
import { MongoChatItem } from '@fastgpt/service/core/chat/chatItemSchema';
|
||||||
|
import { connectToDatabase } from '@/service/mongo';
|
||||||
|
|
||||||
|
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||||
|
try {
|
||||||
|
const { limit = 50, maxSize = 3 } = req.body as { limit: number; maxSize: number };
|
||||||
|
await authCert({ req, authRoot: true });
|
||||||
|
await connectToDatabase();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await PgClient.query(
|
||||||
|
`ALTER TABLE ${PgDatasetTableName} ADD COLUMN createTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP;`
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await MongoChatItem.updateMany(
|
||||||
|
{ userFeedback: { $exists: true } },
|
||||||
|
{ $rename: { userFeedback: 'userBadFeedback' } }
|
||||||
|
);
|
||||||
|
console.log(result);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonRes(res, {
|
||||||
|
data: {}
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
|
||||||
|
jsonRes(res, {
|
||||||
|
code: 500,
|
||||||
|
error
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -6,7 +6,7 @@ import {
|
|||||||
delFileByFileIdList,
|
delFileByFileIdList,
|
||||||
getGFSCollection
|
getGFSCollection
|
||||||
} from '@fastgpt/service/common/file/gridfs/controller';
|
} from '@fastgpt/service/common/file/gridfs/controller';
|
||||||
import { addLog } from '@fastgpt/service/common/mongo/controller';
|
import { addLog } from '@fastgpt/service/common/system/log';
|
||||||
import { MongoDatasetCollection } from '@fastgpt/service/core/dataset/collection/schema';
|
import { MongoDatasetCollection } from '@fastgpt/service/core/dataset/collection/schema';
|
||||||
import { delay } from '@fastgpt/global/common/system/utils';
|
import { delay } from '@fastgpt/global/common/system/utils';
|
||||||
|
|
||||||
|
|||||||
@ -379,14 +379,14 @@ function datasetTemplate({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'similarity',
|
key: 'similarity',
|
||||||
value: 0.4,
|
value: 0.1,
|
||||||
type: FlowNodeInputTypeEnum.slider,
|
type: FlowNodeInputTypeEnum.slider,
|
||||||
label: '相关度',
|
label: '相关度',
|
||||||
connected: true
|
connected: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'limit',
|
key: 'limit',
|
||||||
value: 8,
|
value: 2000,
|
||||||
type: FlowNodeInputTypeEnum.slider,
|
type: FlowNodeInputTypeEnum.slider,
|
||||||
label: '单次搜索上限',
|
label: '单次搜索上限',
|
||||||
connected: true
|
connected: true
|
||||||
|
|||||||
@ -60,12 +60,30 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
$addFields: {
|
$addFields: {
|
||||||
feedbackCount: {
|
userGoodFeedbackCount: {
|
||||||
$size: {
|
$size: {
|
||||||
$filter: {
|
$filter: {
|
||||||
input: '$chatitems',
|
input: '$chatitems',
|
||||||
as: 'item',
|
as: 'item',
|
||||||
cond: { $ifNull: ['$$item.userFeedback', false] }
|
cond: { $ifNull: ['$$item.userGoodFeedback', false] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
userBadFeedbackCount: {
|
||||||
|
$size: {
|
||||||
|
$filter: {
|
||||||
|
input: '$chatitems',
|
||||||
|
as: 'item',
|
||||||
|
cond: { $ifNull: ['$$item.userBadFeedback', false] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
robotBadFeedbackCount: {
|
||||||
|
$size: {
|
||||||
|
$filter: {
|
||||||
|
input: '$chatitems',
|
||||||
|
as: 'item',
|
||||||
|
cond: { $ifNull: ['$$item.robotBadFeedback', false] }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -80,7 +98,14 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ $sort: { feedbackCount: -1, updateTime: -1 } },
|
{
|
||||||
|
$sort: {
|
||||||
|
userBadFeedbackCount: -1,
|
||||||
|
userGoodFeedbackCount: -1,
|
||||||
|
robotBadFeedbackCount: -1,
|
||||||
|
updateTime: -1
|
||||||
|
}
|
||||||
|
},
|
||||||
{ $skip: (pageNum - 1) * pageSize },
|
{ $skip: (pageNum - 1) * pageSize },
|
||||||
{ $limit: pageSize },
|
{ $limit: pageSize },
|
||||||
{
|
{
|
||||||
@ -91,7 +116,9 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
|||||||
source: 1,
|
source: 1,
|
||||||
time: '$updateTime',
|
time: '$updateTime',
|
||||||
messageCount: { $size: '$chatitems' },
|
messageCount: { $size: '$chatitems' },
|
||||||
feedbackCount: 1,
|
userGoodFeedbackCount: 1,
|
||||||
|
userBadFeedbackCount: 1,
|
||||||
|
robotBadFeedbackCount: 1,
|
||||||
markCount: 1
|
markCount: 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,52 @@
|
|||||||
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||||
|
import { jsonRes } from '@fastgpt/service/common/response';
|
||||||
|
import { connectToDatabase } from '@/service/mongo';
|
||||||
|
import { MongoChatItem } from '@fastgpt/service/core/chat/chatItemSchema';
|
||||||
|
import { UpdateChatFeedbackProps } from '@fastgpt/global/core/chat/api';
|
||||||
|
import { autChatCrud } from '@/service/support/permission/auth/chat';
|
||||||
|
|
||||||
|
/* 初始化我的聊天框,需要身份验证 */
|
||||||
|
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||||
|
const { chatId, chatItemId, shareId, outLinkUid, userBadFeedback, userGoodFeedback } =
|
||||||
|
req.body as UpdateChatFeedbackProps;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await connectToDatabase();
|
||||||
|
|
||||||
|
await autChatCrud({
|
||||||
|
req,
|
||||||
|
authToken: true,
|
||||||
|
chatId,
|
||||||
|
shareId,
|
||||||
|
outLinkUid,
|
||||||
|
per: 'r'
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!chatItemId) {
|
||||||
|
throw new Error('chatItemId is required');
|
||||||
|
}
|
||||||
|
|
||||||
|
await MongoChatItem.findOneAndUpdate(
|
||||||
|
{
|
||||||
|
dataId: chatItemId
|
||||||
|
},
|
||||||
|
{
|
||||||
|
$unset: {
|
||||||
|
...(userBadFeedback === undefined && { userBadFeedback: '' }),
|
||||||
|
...(userGoodFeedback === undefined && { userGoodFeedback: '' })
|
||||||
|
},
|
||||||
|
$set: {
|
||||||
|
...(userBadFeedback !== undefined && { userBadFeedback }),
|
||||||
|
...(userGoodFeedback !== undefined && { userGoodFeedback })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
jsonRes(res);
|
||||||
|
} catch (err) {
|
||||||
|
jsonRes(res, {
|
||||||
|
code: 500,
|
||||||
|
error: err
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,35 +0,0 @@
|
|||||||
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
||||||
import { jsonRes } from '@fastgpt/service/common/response';
|
|
||||||
import { connectToDatabase } from '@/service/mongo';
|
|
||||||
import { MongoChatItem } from '@fastgpt/service/core/chat/chatItemSchema';
|
|
||||||
|
|
||||||
/* 初始化我的聊天框,需要身份验证 */
|
|
||||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
|
||||||
try {
|
|
||||||
await connectToDatabase();
|
|
||||||
const { chatItemId, userFeedback = undefined } = req.body as {
|
|
||||||
chatItemId: string;
|
|
||||||
userFeedback?: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!chatItemId) {
|
|
||||||
throw new Error('chatItemId is required');
|
|
||||||
}
|
|
||||||
|
|
||||||
await MongoChatItem.findOneAndUpdate(
|
|
||||||
{
|
|
||||||
dataId: chatItemId
|
|
||||||
},
|
|
||||||
{
|
|
||||||
...(userFeedback ? { userFeedback } : { $unset: { userFeedback: '' } })
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
jsonRes(res);
|
|
||||||
} catch (err) {
|
|
||||||
jsonRes(res, {
|
|
||||||
code: 500,
|
|
||||||
error: err
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -43,7 +43,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
|||||||
const { history } = await getChatItems({
|
const { history } = await getChatItems({
|
||||||
chatId,
|
chatId,
|
||||||
limit: 30,
|
limit: 30,
|
||||||
field: `dataId obj value adminFeedback userFeedback ${ModuleOutputKeyEnum.responseData}`
|
field: `dataId obj value adminFeedback userBadFeedback userGoodFeedback robotBadFeedback ${ModuleOutputKeyEnum.responseData}`
|
||||||
});
|
});
|
||||||
|
|
||||||
jsonRes<InitChatResponse>(res, {
|
jsonRes<InitChatResponse>(res, {
|
||||||
|
|||||||
@ -42,7 +42,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
|||||||
const { history } = await getChatItems({
|
const { history } = await getChatItems({
|
||||||
chatId,
|
chatId,
|
||||||
limit: 30,
|
limit: 30,
|
||||||
field: `dataId obj value userFeedback ${
|
field: `dataId obj value userGoodFeedback userBadFeedback ${
|
||||||
shareChat.responseDetail ? `adminFeedback ${ModuleOutputKeyEnum.responseData}` : ''
|
shareChat.responseDetail ? `adminFeedback ${ModuleOutputKeyEnum.responseData}` : ''
|
||||||
} `
|
} `
|
||||||
});
|
});
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
|
|||||||
import { jsonRes } from '@fastgpt/service/common/response';
|
import { jsonRes } from '@fastgpt/service/common/response';
|
||||||
import { connectToDatabase } from '@/service/mongo';
|
import { connectToDatabase } from '@/service/mongo';
|
||||||
import { MongoUser } from '@fastgpt/service/support/user/schema';
|
import { MongoUser } from '@fastgpt/service/support/user/schema';
|
||||||
import { addLog } from '@fastgpt/service/common/mongo/controller';
|
import { addLog } from '@fastgpt/service/common/system/log';
|
||||||
import { authDataset } from '@fastgpt/service/support/permission/auth/dataset';
|
import { authDataset } from '@fastgpt/service/support/permission/auth/dataset';
|
||||||
import { MongoDatasetData } from '@fastgpt/service/core/dataset/data/schema';
|
import { MongoDatasetData } from '@fastgpt/service/core/dataset/data/schema';
|
||||||
import { findDatasetIdTreeByTopDatasetId } from '@fastgpt/service/core/dataset/controller';
|
import { findDatasetIdTreeByTopDatasetId } from '@fastgpt/service/core/dataset/controller';
|
||||||
|
|||||||
@ -33,11 +33,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
|
|||||||
fileIds: collections.map((item) => item?.fileId || '').filter(Boolean)
|
fileIds: collections.map((item) => item?.fileId || '').filter(Boolean)
|
||||||
});
|
});
|
||||||
|
|
||||||
// delete collection
|
|
||||||
await MongoDatasetCollection.deleteMany({
|
|
||||||
_id: { $in: delIdList }
|
|
||||||
});
|
|
||||||
|
|
||||||
jsonRes(res);
|
jsonRes(res);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
jsonRes(res, {
|
jsonRes(res, {
|
||||||
|
|||||||
@ -68,13 +68,10 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
|
|||||||
});
|
});
|
||||||
|
|
||||||
// delete old collection
|
// delete old collection
|
||||||
await Promise.all([
|
await delCollectionRelevantData({
|
||||||
delCollectionRelevantData({
|
collectionIds: [collection._id],
|
||||||
collectionIds: [collection._id],
|
fileIds: collection.fileId ? [collection.fileId] : []
|
||||||
fileIds: collection.fileId ? [collection.fileId] : []
|
});
|
||||||
}),
|
|
||||||
MongoDatasetCollection.findByIdAndRemove(collection._id)
|
|
||||||
]);
|
|
||||||
|
|
||||||
jsonRes(res);
|
jsonRes(res);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@ -136,7 +136,7 @@ export async function pushDataToDatasetCollection({
|
|||||||
model,
|
model,
|
||||||
q: item.q,
|
q: item.q,
|
||||||
a: item.a,
|
a: item.a,
|
||||||
chunkIndex: i,
|
chunkIndex: item.chunkIndex ?? i,
|
||||||
indexes: item.indexes
|
indexes: item.indexes
|
||||||
}))
|
}))
|
||||||
);
|
);
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
|
|||||||
import { jsonRes, responseWriteController } from '@fastgpt/service/common/response';
|
import { jsonRes, responseWriteController } from '@fastgpt/service/common/response';
|
||||||
import { connectToDatabase } from '@/service/mongo';
|
import { connectToDatabase } from '@/service/mongo';
|
||||||
import { MongoUser } from '@fastgpt/service/support/user/schema';
|
import { MongoUser } from '@fastgpt/service/support/user/schema';
|
||||||
import { addLog } from '@fastgpt/service/common/mongo/controller';
|
import { addLog } from '@fastgpt/service/common/system/log';
|
||||||
import { authDataset } from '@fastgpt/service/support/permission/auth/dataset';
|
import { authDataset } from '@fastgpt/service/support/permission/auth/dataset';
|
||||||
import { MongoDatasetData } from '@fastgpt/service/core/dataset/data/schema';
|
import { MongoDatasetData } from '@fastgpt/service/core/dataset/data/schema';
|
||||||
import { findDatasetIdTreeByTopDatasetId } from '@fastgpt/service/core/dataset/controller';
|
import { findDatasetIdTreeByTopDatasetId } from '@fastgpt/service/core/dataset/controller';
|
||||||
|
|||||||
@ -6,10 +6,8 @@ import { connectToDatabase } from '@/service/mongo';
|
|||||||
import { authDataset } from '@fastgpt/service/support/permission/auth/dataset';
|
import { authDataset } from '@fastgpt/service/support/permission/auth/dataset';
|
||||||
import { authTeamBalance } from '@/service/support/permission/auth/bill';
|
import { authTeamBalance } from '@/service/support/permission/auth/bill';
|
||||||
import { pushGenerateVectorBill } from '@/service/support/wallet/bill/push';
|
import { pushGenerateVectorBill } from '@/service/support/wallet/bill/push';
|
||||||
import { countModelPrice } from '@/service/support/wallet/bill/utils';
|
|
||||||
import { searchDatasetData } from '@/service/core/dataset/data/pg';
|
import { searchDatasetData } from '@/service/core/dataset/data/pg';
|
||||||
import { updateApiKeyUsage } from '@fastgpt/service/support/openapi/tools';
|
import { updateApiKeyUsage } from '@fastgpt/service/support/openapi/tools';
|
||||||
import { ModelTypeEnum } from '@/service/core/ai/model';
|
|
||||||
import { BillSourceEnum } from '@fastgpt/global/support/wallet/bill/constants';
|
import { BillSourceEnum } from '@fastgpt/global/support/wallet/bill/constants';
|
||||||
|
|
||||||
export default withNextCors(async function handler(req: NextApiRequest, res: NextApiResponse<any>) {
|
export default withNextCors(async function handler(req: NextApiRequest, res: NextApiResponse<any>) {
|
||||||
@ -38,7 +36,7 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex
|
|||||||
const { searchRes, tokenLen } = await searchDatasetData({
|
const { searchRes, tokenLen } = await searchDatasetData({
|
||||||
text,
|
text,
|
||||||
model: dataset.vectorModel,
|
model: dataset.vectorModel,
|
||||||
limit: Math.min(limit, 50),
|
limit: Math.min(limit * 800, 30000),
|
||||||
datasetIds: [datasetId],
|
datasetIds: [datasetId],
|
||||||
searchMode
|
searchMode
|
||||||
});
|
});
|
||||||
|
|||||||
@ -20,6 +20,7 @@ import {
|
|||||||
import { SimpleModeTemplate_FastGPT_Universal } from '@/global/core/app/constants';
|
import { SimpleModeTemplate_FastGPT_Universal } from '@/global/core/app/constants';
|
||||||
import { getSimpleTemplatesFromPlus } from '@/service/core/app/utils';
|
import { getSimpleTemplatesFromPlus } from '@/service/core/app/utils';
|
||||||
import { PluginTypeEnum } from '@fastgpt/global/core/plugin/constants';
|
import { PluginTypeEnum } from '@fastgpt/global/core/plugin/constants';
|
||||||
|
import { getFastGPTFeConfig } from '@fastgpt/service/common/system/config/controller';
|
||||||
|
|
||||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||||
await getInitConfig();
|
await getInitConfig();
|
||||||
@ -73,7 +74,17 @@ export async function getInitConfig() {
|
|||||||
process.env.NODE_ENV === 'development' ? 'data/config.local.json' : '/app/data/config.json';
|
process.env.NODE_ENV === 'development' ? 'data/config.local.json' : '/app/data/config.json';
|
||||||
const res = JSON.parse(readFileSync(filename, 'utf-8')) as ConfigFileType;
|
const res = JSON.parse(readFileSync(filename, 'utf-8')) as ConfigFileType;
|
||||||
|
|
||||||
setDefaultData(res);
|
// get config from database
|
||||||
|
const dbFeConfig = await getFastGPTFeConfig();
|
||||||
|
const concatConfig: ConfigFileType = {
|
||||||
|
...res,
|
||||||
|
FeConfig: {
|
||||||
|
...res.FeConfig,
|
||||||
|
...dbFeConfig
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
setDefaultData(concatConfig);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
setDefaultData();
|
setDefaultData();
|
||||||
console.log('get init config error, set default', error);
|
console.log('get init config error, set default', error);
|
||||||
@ -83,6 +94,23 @@ export async function getInitConfig() {
|
|||||||
getSystemVersion();
|
getSystemVersion();
|
||||||
getModelPrice();
|
getModelPrice();
|
||||||
getSystemPlugin();
|
getSystemPlugin();
|
||||||
|
|
||||||
|
console.log({
|
||||||
|
FeConfig: global.feConfigs,
|
||||||
|
SystemParams: global.systemEnv,
|
||||||
|
ChatModels: global.chatModels,
|
||||||
|
QAModels: global.qaModels,
|
||||||
|
CQModels: global.cqModels,
|
||||||
|
ExtractModels: global.extractModels,
|
||||||
|
QGModels: global.qgModels,
|
||||||
|
VectorModels: global.vectorModels,
|
||||||
|
ReRankModels: global.reRankModels,
|
||||||
|
AudioSpeechModels: global.reRankModels,
|
||||||
|
WhisperModel: global.whisperModel,
|
||||||
|
price: global.priceMd,
|
||||||
|
simpleModeTemplates: global.simpleModeTemplates,
|
||||||
|
communityPlugins: global.communityPlugins
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function initGlobal() {
|
export function initGlobal() {
|
||||||
@ -125,8 +153,6 @@ export function setDefaultData(res?: ConfigFileType) {
|
|||||||
global.whisperModel = res?.WhisperModel || defaultWhisperModel;
|
global.whisperModel = res?.WhisperModel || defaultWhisperModel;
|
||||||
|
|
||||||
global.priceMd = '';
|
global.priceMd = '';
|
||||||
|
|
||||||
console.log(res);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getSystemVersion() {
|
export function getSystemVersion() {
|
||||||
@ -173,7 +199,6 @@ ${global.audioSpeechModels
|
|||||||
.join('\n')}
|
.join('\n')}
|
||||||
${`| 语音输入-${global.whisperModel.name} | ${global.whisperModel.price}/分钟 |`}
|
${`| 语音输入-${global.whisperModel.name} | ${global.whisperModel.price}/分钟 |`}
|
||||||
`;
|
`;
|
||||||
console.log(global.priceMd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getSimpleModeTemplates() {
|
async function getSimpleModeTemplates() {
|
||||||
@ -209,8 +234,6 @@ async function getSimpleModeTemplates() {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
global.simpleModeTemplates = [SimpleModeTemplate_FastGPT_Universal];
|
global.simpleModeTemplates = [SimpleModeTemplate_FastGPT_Universal];
|
||||||
}
|
}
|
||||||
console.log('simple mode templates: ');
|
|
||||||
console.log(global.simpleModeTemplates);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSystemPlugin() {
|
function getSystemPlugin() {
|
||||||
@ -236,6 +259,4 @@ function getSystemPlugin() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
global.communityPlugins = fileTemplates;
|
global.communityPlugins = fileTemplates;
|
||||||
console.log('community plugins: ');
|
|
||||||
console.log(fileTemplates);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import { createJWT, setCookie } from '@fastgpt/service/support/permission/contro
|
|||||||
import { connectToDatabase } from '@/service/mongo';
|
import { connectToDatabase } from '@/service/mongo';
|
||||||
import { getUserDetail } from '@fastgpt/service/support/user/controller';
|
import { getUserDetail } from '@fastgpt/service/support/user/controller';
|
||||||
import type { PostLoginProps } from '@fastgpt/global/support/user/api.d';
|
import type { PostLoginProps } from '@fastgpt/global/support/user/api.d';
|
||||||
|
import { UserStatusEnum } from '@fastgpt/global/support/user/constant';
|
||||||
|
|
||||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||||
try {
|
try {
|
||||||
@ -16,13 +17,20 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 检测用户是否存在
|
// 检测用户是否存在
|
||||||
const authCert = await MongoUser.findOne({
|
const authCert = await MongoUser.findOne(
|
||||||
username
|
{
|
||||||
});
|
username
|
||||||
|
},
|
||||||
|
'status'
|
||||||
|
);
|
||||||
if (!authCert) {
|
if (!authCert) {
|
||||||
throw new Error('用户未注册');
|
throw new Error('用户未注册');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (authCert.status === UserStatusEnum.forbidden) {
|
||||||
|
throw new Error('账号已停用,无法登录');
|
||||||
|
}
|
||||||
|
|
||||||
const user = await MongoUser.findOne({
|
const user = await MongoUser.findOne({
|
||||||
username,
|
username,
|
||||||
password
|
password
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
|
|||||||
import { authApp } from '@fastgpt/service/support/permission/auth/app';
|
import { authApp } from '@fastgpt/service/support/permission/auth/app';
|
||||||
import { authCert } from '@fastgpt/service/support/permission/auth/common';
|
import { authCert } from '@fastgpt/service/support/permission/auth/common';
|
||||||
import { sseErrRes, jsonRes } from '@fastgpt/service/common/response';
|
import { sseErrRes, jsonRes } from '@fastgpt/service/common/response';
|
||||||
import { addLog } from '@fastgpt/service/common/mongo/controller';
|
import { addLog } from '@fastgpt/service/common/system/log';
|
||||||
import { withNextCors } from '@fastgpt/service/common/middle/cors';
|
import { withNextCors } from '@fastgpt/service/common/middle/cors';
|
||||||
import { ChatRoleEnum, ChatSourceEnum } from '@fastgpt/global/core/chat/constants';
|
import { ChatRoleEnum, ChatSourceEnum } from '@fastgpt/global/core/chat/constants';
|
||||||
import { sseResponseEventEnum } from '@fastgpt/service/common/response/constant';
|
import { sseResponseEventEnum } from '@fastgpt/service/common/response/constant';
|
||||||
|
|||||||
@ -18,7 +18,8 @@ import { useTranslation } from 'next-i18next';
|
|||||||
import { usePagination } from '@/web/common/hooks/usePagination';
|
import { usePagination } from '@/web/common/hooks/usePagination';
|
||||||
import { getAppChatLogs } from '@/web/core/app/api';
|
import { getAppChatLogs } from '@/web/core/app/api';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import { ChatSourceMap, HUMAN_ICON } from '@fastgpt/global/core/chat/constants';
|
import { ChatSourceMap } from '@fastgpt/global/core/chat/constants';
|
||||||
|
import { HUMAN_ICON } from '@fastgpt/global/common/system/constants';
|
||||||
import { AppLogsListItemType } from '@/types/app';
|
import { AppLogsListItemType } from '@/types/app';
|
||||||
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
||||||
import ChatBox, { type ComponentRef } from '@/components/ChatBox';
|
import ChatBox, { type ComponentRef } from '@/components/ChatBox';
|
||||||
@ -48,7 +49,8 @@ const Logs = ({ appId }: { appId: string }) => {
|
|||||||
data: logs,
|
data: logs,
|
||||||
isLoading,
|
isLoading,
|
||||||
Pagination,
|
Pagination,
|
||||||
getData
|
getData,
|
||||||
|
pageNum
|
||||||
} = usePagination<AppLogsListItemType>({
|
} = usePagination<AppLogsListItemType>({
|
||||||
api: getAppChatLogs,
|
api: getAppChatLogs,
|
||||||
pageSize: 20,
|
pageSize: 20,
|
||||||
@ -90,8 +92,7 @@ const Logs = ({ appId }: { appId: string }) => {
|
|||||||
<Table variant={'simple'} fontSize={'sm'}>
|
<Table variant={'simple'} fontSize={'sm'}>
|
||||||
<Thead>
|
<Thead>
|
||||||
<Tr>
|
<Tr>
|
||||||
<Th>{t('app.Logs Source')}</Th>
|
<Th>{t('core.app.logs.Source And Time')}</Th>
|
||||||
<Th>{t('app.Logs Time')}</Th>
|
|
||||||
<Th>{t('app.Logs Title')}</Th>
|
<Th>{t('app.Logs Title')}</Th>
|
||||||
<Th>{t('app.Logs Message Total')}</Th>
|
<Th>{t('app.Logs Message Total')}</Th>
|
||||||
<Th>{t('app.Feedback Count')}</Th>
|
<Th>{t('app.Feedback Count')}</Th>
|
||||||
@ -107,35 +108,55 @@ const Logs = ({ appId }: { appId: string }) => {
|
|||||||
title={'点击查看对话详情'}
|
title={'点击查看对话详情'}
|
||||||
onClick={() => setDetailLogsId(item.id)}
|
onClick={() => setDetailLogsId(item.id)}
|
||||||
>
|
>
|
||||||
<Td>{t(ChatSourceMap[item.source]?.name || 'UnKnow')}</Td>
|
<Td>
|
||||||
<Td>{dayjs(item.time).format('YYYY/MM/DD HH:mm')}</Td>
|
<Box>{t(ChatSourceMap[item.source]?.name || 'UnKnow')}</Box>
|
||||||
|
<Box color={'myGray.500'}>{dayjs(item.time).format('YYYY/MM/DD HH:mm')}</Box>
|
||||||
|
</Td>
|
||||||
<Td className="textEllipsis" maxW={'250px'}>
|
<Td className="textEllipsis" maxW={'250px'}>
|
||||||
{item.title}
|
{item.title}
|
||||||
</Td>
|
</Td>
|
||||||
<Td>{item.messageCount}</Td>
|
<Td>{item.messageCount}</Td>
|
||||||
<Td w={'100px'}>
|
<Td w={'100px'}>
|
||||||
{!!item?.feedbackCount ? (
|
{!!item?.userGoodFeedbackCount && (
|
||||||
<Box display={'inline-block'}>
|
<Flex
|
||||||
<Flex
|
mb={item?.userGoodFeedbackCount ? 1 : 0}
|
||||||
bg={'#FFF2EC'}
|
bg={'green.100'}
|
||||||
|
color={'green.600'}
|
||||||
|
px={3}
|
||||||
|
py={1}
|
||||||
|
alignItems={'center'}
|
||||||
|
justifyContent={'center'}
|
||||||
|
borderRadius={'lg'}
|
||||||
|
fontWeight={'bold'}
|
||||||
|
>
|
||||||
|
<MyIcon
|
||||||
|
mr={1}
|
||||||
|
name={'core/chat/feedback/goodLight'}
|
||||||
|
color={'green.600'}
|
||||||
|
w={'14px'}
|
||||||
|
/>
|
||||||
|
{item.userGoodFeedbackCount}
|
||||||
|
</Flex>
|
||||||
|
)}
|
||||||
|
{!!item?.userBadFeedbackCount && (
|
||||||
|
<Flex
|
||||||
|
bg={'#FFF2EC'}
|
||||||
|
color={'#C96330'}
|
||||||
|
px={3}
|
||||||
|
py={1}
|
||||||
|
alignItems={'center'}
|
||||||
|
justifyContent={'center'}
|
||||||
|
borderRadius={'lg'}
|
||||||
|
fontWeight={'bold'}
|
||||||
|
>
|
||||||
|
<MyIcon
|
||||||
|
mr={1}
|
||||||
|
name={'core/chat/feedback/badLight'}
|
||||||
color={'#C96330'}
|
color={'#C96330'}
|
||||||
px={3}
|
w={'14px'}
|
||||||
py={1}
|
/>
|
||||||
alignItems={'center'}
|
{item.userBadFeedbackCount}
|
||||||
borderRadius={'lg'}
|
</Flex>
|
||||||
fontWeight={'bold'}
|
|
||||||
>
|
|
||||||
<MyIcon
|
|
||||||
mr={1}
|
|
||||||
name={'core/chat/feedback/badLight'}
|
|
||||||
color={'#C96330'}
|
|
||||||
w={'14px'}
|
|
||||||
/>
|
|
||||||
{item.feedbackCount}
|
|
||||||
</Flex>
|
|
||||||
</Box>
|
|
||||||
) : (
|
|
||||||
<>-</>
|
|
||||||
)}
|
)}
|
||||||
</Td>
|
</Td>
|
||||||
<Td>{item.markCount}</Td>
|
<Td>{item.markCount}</Td>
|
||||||
@ -168,7 +189,10 @@ const Logs = ({ appId }: { appId: string }) => {
|
|||||||
<DetailLogsModal
|
<DetailLogsModal
|
||||||
appId={appId}
|
appId={appId}
|
||||||
chatId={detailLogsId}
|
chatId={detailLogsId}
|
||||||
onClose={() => setDetailLogsId(undefined)}
|
onClose={() => {
|
||||||
|
setDetailLogsId(undefined);
|
||||||
|
getData(pageNum);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<MyModal
|
<MyModal
|
||||||
@ -297,6 +321,7 @@ function DetailLogsModal({
|
|||||||
showMarkIcon
|
showMarkIcon
|
||||||
showVoiceIcon={false}
|
showVoiceIcon={false}
|
||||||
userGuideModule={chat?.app?.userGuideModule}
|
userGuideModule={chat?.app?.userGuideModule}
|
||||||
|
chatId={chatId}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
import { OutLinkSchema } from '@fastgpt/global/support/outLink/type';
|
||||||
|
import React from 'react';
|
||||||
|
import MyModal from '@/components/MyModal';
|
||||||
|
|
||||||
|
const EmbModal = ({ share }: { share: OutLinkSchema }) => {
|
||||||
|
return <MyModal isOpen>EmbModal</MyModal>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default EmbModal;
|
||||||
@ -91,11 +91,10 @@ const Share = ({ appId }: { appId: string }) => {
|
|||||||
<Thead>
|
<Thead>
|
||||||
<Tr>
|
<Tr>
|
||||||
<Th>名称</Th>
|
<Th>名称</Th>
|
||||||
<Th>金额消耗(¥)</Th>
|
<Th>金额消耗</Th>
|
||||||
<Th>返回详情</Th>
|
<Th>返回详情</Th>
|
||||||
{feConfigs?.isPlus && (
|
{feConfigs?.isPlus && (
|
||||||
<>
|
<>
|
||||||
<Th>金额限制(¥)</Th>
|
|
||||||
<Th>IP限流(人/分钟)</Th>
|
<Th>IP限流(人/分钟)</Th>
|
||||||
<Th>过期时间</Th>
|
<Th>过期时间</Th>
|
||||||
<Th>身份校验</Th>
|
<Th>身份校验</Th>
|
||||||
@ -109,13 +108,19 @@ const Share = ({ appId }: { appId: string }) => {
|
|||||||
{shareChatList.map((item) => (
|
{shareChatList.map((item) => (
|
||||||
<Tr key={item._id}>
|
<Tr key={item._id}>
|
||||||
<Td>{item.name}</Td>
|
<Td>{item.name}</Td>
|
||||||
<Td>{formatPrice(item.total)}</Td>
|
<Td>
|
||||||
|
{formatPrice(item.total)}
|
||||||
|
{feConfigs?.isPlus
|
||||||
|
? `${
|
||||||
|
item.limit && item.limit.credit > -1
|
||||||
|
? ` / ${item.limit.credit}元`
|
||||||
|
: ' / 无限制'
|
||||||
|
}`
|
||||||
|
: ''}
|
||||||
|
</Td>
|
||||||
<Td>{item.responseDetail ? '✔' : '✖'}</Td>
|
<Td>{item.responseDetail ? '✔' : '✖'}</Td>
|
||||||
{feConfigs?.isPlus && (
|
{feConfigs?.isPlus && (
|
||||||
<>
|
<>
|
||||||
<Td>
|
|
||||||
{item.limit && item.limit.credit > -1 ? `${item.limit.credit}元` : '无限制'}
|
|
||||||
</Td>
|
|
||||||
<Td>{item?.limit?.QPM || '-'}</Td>
|
<Td>{item?.limit?.QPM || '-'}</Td>
|
||||||
<Td>
|
<Td>
|
||||||
{item?.limit?.expiredTime
|
{item?.limit?.expiredTime
|
||||||
|
|||||||
@ -349,6 +349,7 @@ const Chat = ({ appId, chatId }: { appId: string; chatId: string }) => {
|
|||||||
onUpdateVariable={(e) => {}}
|
onUpdateVariable={(e) => {}}
|
||||||
onStartChat={startChat}
|
onStartChat={startChat}
|
||||||
onDelMessage={(e) => delOneHistoryItem({ ...e, chatId })}
|
onDelMessage={(e) => delOneHistoryItem({ ...e, chatId })}
|
||||||
|
chatId={chatId}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|||||||
@ -358,6 +358,9 @@ const OutLink = ({
|
|||||||
onUpdateVariable={(e) => {}}
|
onUpdateVariable={(e) => {}}
|
||||||
onStartChat={startChat}
|
onStartChat={startChat}
|
||||||
onDelMessage={(e) => delOneHistoryItem({ ...e, chatId, shareId, outLinkUid })}
|
onDelMessage={(e) => delOneHistoryItem({ ...e, chatId, shareId, outLinkUid })}
|
||||||
|
chatId={chatId}
|
||||||
|
shareId={shareId}
|
||||||
|
outLinkUid={outLinkUid}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|||||||
@ -35,7 +35,7 @@ export type FileItemType = {
|
|||||||
id: string; // fileId / raw Link
|
id: string; // fileId / raw Link
|
||||||
filename: string;
|
filename: string;
|
||||||
chunks: PushDatasetDataChunkProps[];
|
chunks: PushDatasetDataChunkProps[];
|
||||||
text: string; // raw text
|
rawText: string; // raw text
|
||||||
icon: string;
|
icon: string;
|
||||||
tokens: number; // total tokens
|
tokens: number; // total tokens
|
||||||
type: DatasetCollectionTypeEnum.file | DatasetCollectionTypeEnum.link;
|
type: DatasetCollectionTypeEnum.file | DatasetCollectionTypeEnum.link;
|
||||||
@ -152,7 +152,7 @@ const FileSelect = ({
|
|||||||
filename: file.name,
|
filename: file.name,
|
||||||
icon,
|
icon,
|
||||||
tokens: filterData.reduce((sum, item) => sum + countPromptTokens(item.q), 0),
|
tokens: filterData.reduce((sum, item) => sum + countPromptTokens(item.q), 0),
|
||||||
text: `${header.join(',')}\n${data
|
rawText: `${header.join(',')}\n${data
|
||||||
.map((item) => `"${item[0]}","${item[1]}"`)
|
.map((item) => `"${item[0]}","${item[1]}"`)
|
||||||
.join('\n')}`,
|
.join('\n')}`,
|
||||||
chunks: filterData,
|
chunks: filterData,
|
||||||
@ -192,7 +192,7 @@ const FileSelect = ({
|
|||||||
id: nanoid(),
|
id: nanoid(),
|
||||||
filename: file.name,
|
filename: file.name,
|
||||||
icon,
|
icon,
|
||||||
text,
|
rawText: text,
|
||||||
tokens: splitRes.tokens,
|
tokens: splitRes.tokens,
|
||||||
type: DatasetCollectionTypeEnum.file,
|
type: DatasetCollectionTypeEnum.file,
|
||||||
fileId,
|
fileId,
|
||||||
@ -228,7 +228,7 @@ const FileSelect = ({
|
|||||||
id: nanoid(),
|
id: nanoid(),
|
||||||
filename: url,
|
filename: url,
|
||||||
icon: '/imgs/files/link.svg',
|
icon: '/imgs/files/link.svg',
|
||||||
text: content,
|
rawText: content,
|
||||||
tokens: splitRes.tokens,
|
tokens: splitRes.tokens,
|
||||||
type: DatasetCollectionTypeEnum.link,
|
type: DatasetCollectionTypeEnum.link,
|
||||||
rawLink: url,
|
rawLink: url,
|
||||||
@ -270,7 +270,7 @@ const FileSelect = ({
|
|||||||
id: nanoid(),
|
id: nanoid(),
|
||||||
filename,
|
filename,
|
||||||
icon: '/imgs/files/txt.svg',
|
icon: '/imgs/files/txt.svg',
|
||||||
text: content,
|
rawText: content,
|
||||||
tokens: splitRes.tokens,
|
tokens: splitRes.tokens,
|
||||||
type: DatasetCollectionTypeEnum.file,
|
type: DatasetCollectionTypeEnum.file,
|
||||||
fileId: fileIds[0],
|
fileId: fileIds[0],
|
||||||
|
|||||||
@ -49,7 +49,7 @@ const ImportData = ({
|
|||||||
collectionTrainingType: DatasetCollectionTrainingModeEnum.chunk
|
collectionTrainingType: DatasetCollectionTrainingModeEnum.chunk
|
||||||
},
|
},
|
||||||
[ImportTypeEnum.qa]: {
|
[ImportTypeEnum.qa]: {
|
||||||
defaultChunkLen: agentModel?.maxContext * 0.6 || 8000,
|
defaultChunkLen: agentModel?.maxContext * 0.55 || 8000,
|
||||||
chunkOverlapRatio: 0,
|
chunkOverlapRatio: 0,
|
||||||
unitPrice: agentModel?.price || 3,
|
unitPrice: agentModel?.price || 3,
|
||||||
mode: TrainingModeEnum.qa,
|
mode: TrainingModeEnum.qa,
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import { useRequest } from '@/web/common/hooks/useRequest';
|
|||||||
import { postDatasetCollection } from '@/web/core/dataset/api';
|
import { postDatasetCollection } from '@/web/core/dataset/api';
|
||||||
import { formatPrice } from '@fastgpt/global/support/wallet/bill/tools';
|
import { formatPrice } from '@fastgpt/global/support/wallet/bill/tools';
|
||||||
import { splitText2Chunks } from '@fastgpt/global/common/string/textSplitter';
|
import { splitText2Chunks } from '@fastgpt/global/common/string/textSplitter';
|
||||||
|
import { hashStr } from '@fastgpt/global/common/string/tools';
|
||||||
import { useToast } from '@/web/common/hooks/useToast';
|
import { useToast } from '@/web/common/hooks/useToast';
|
||||||
import { getErrText } from '@fastgpt/global/common/error/utils';
|
import { getErrText } from '@fastgpt/global/common/error/utils';
|
||||||
import {
|
import {
|
||||||
@ -158,7 +159,9 @@ const Provider = ({
|
|||||||
fileId: file.fileId,
|
fileId: file.fileId,
|
||||||
rawLink: file.rawLink,
|
rawLink: file.rawLink,
|
||||||
chunkSize: chunkLen,
|
chunkSize: chunkLen,
|
||||||
trainingType: collectionTrainingType
|
trainingType: collectionTrainingType,
|
||||||
|
qaPrompt: mode === TrainingModeEnum.qa ? prompt : '',
|
||||||
|
hashRawText: hashStr(file.rawText)
|
||||||
});
|
});
|
||||||
|
|
||||||
// upload data
|
// upload data
|
||||||
@ -193,7 +196,7 @@ const Provider = ({
|
|||||||
setFiles((state) =>
|
setFiles((state) =>
|
||||||
state.map((file) => {
|
state.map((file) => {
|
||||||
const splitRes = splitText2Chunks({
|
const splitRes = splitText2Chunks({
|
||||||
text: file.text,
|
text: file.rawText,
|
||||||
chunkLen,
|
chunkLen,
|
||||||
overlapRatio: chunkOverlapRatio
|
overlapRatio: chunkOverlapRatio
|
||||||
});
|
});
|
||||||
@ -287,7 +290,7 @@ export const PreviewFileOrChunk = () => {
|
|||||||
px={[4, 8]}
|
px={[4, 8]}
|
||||||
my={4}
|
my={4}
|
||||||
contentEditable
|
contentEditable
|
||||||
dangerouslySetInnerHTML={{ __html: previewFile.text }}
|
dangerouslySetInnerHTML={{ __html: previewFile.rawText }}
|
||||||
fontSize={'sm'}
|
fontSize={'sm'}
|
||||||
whiteSpace={'pre-wrap'}
|
whiteSpace={'pre-wrap'}
|
||||||
wordBreak={'break-all'}
|
wordBreak={'break-all'}
|
||||||
|
|||||||
@ -1,11 +1,13 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useTranslation } from 'next-i18next';
|
import { useTranslation } from 'next-i18next';
|
||||||
import MyModal from '@/components/MyModal';
|
import MyModal from '@/components/MyModal';
|
||||||
import { Box, Button, Input, ModalBody, ModalFooter, Textarea } from '@chakra-ui/react';
|
import { Box, Button, Input, Link, ModalBody, ModalFooter, Textarea } from '@chakra-ui/react';
|
||||||
import { useRequest } from '@/web/common/hooks/useRequest';
|
import { useRequest } from '@/web/common/hooks/useRequest';
|
||||||
import { postFetchUrls } from '@/web/common/tools/api';
|
import { postFetchUrls } from '@/web/common/tools/api';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { UrlFetchResponse } from '@fastgpt/global/common/file/api.d';
|
import { UrlFetchResponse } from '@fastgpt/global/common/file/api.d';
|
||||||
|
import { getDocPath } from '@/web/common/system/doc';
|
||||||
|
import { feConfigs } from '@/web/common/system/staticData';
|
||||||
|
|
||||||
const UrlFetchModal = ({
|
const UrlFetchModal = ({
|
||||||
onClose,
|
onClose,
|
||||||
@ -68,7 +70,12 @@ const UrlFetchModal = ({
|
|||||||
<Box mt={4}>
|
<Box mt={4}>
|
||||||
<Box fontWeight={'bold'}>
|
<Box fontWeight={'bold'}>
|
||||||
{t('core.dataset.website.Selector')}({t('common.choosable')})
|
{t('core.dataset.website.Selector')}({t('common.choosable')})
|
||||||
</Box>{' '}
|
</Box>
|
||||||
|
{feConfigs?.docUrl && (
|
||||||
|
<Link href={getDocPath('/docs/course/websync/#选择器如何使用')} target="_blank">
|
||||||
|
{t('core.dataset.website.Selector Course')}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
<Input {...register('selector')} placeholder="body .content #document" />
|
<Input {...register('selector')} placeholder="body .content #document" />
|
||||||
</Box>
|
</Box>
|
||||||
</ModalBody>
|
</ModalBody>
|
||||||
|
|||||||
@ -1,11 +1,13 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import MyModal from '@/components/MyModal';
|
import MyModal from '@/components/MyModal';
|
||||||
import { useTranslation } from 'next-i18next';
|
import { useTranslation } from 'next-i18next';
|
||||||
import { Box, Button, Input, ModalBody, ModalFooter } from '@chakra-ui/react';
|
import { Box, Button, Input, Link, ModalBody, ModalFooter } from '@chakra-ui/react';
|
||||||
import { strIsLink } from '@fastgpt/global/common/string/tools';
|
import { strIsLink } from '@fastgpt/global/common/string/tools';
|
||||||
import { useToast } from '@/web/common/hooks/useToast';
|
import { useToast } from '@/web/common/hooks/useToast';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { useConfirm } from '@/web/common/hooks/useConfirm';
|
import { useConfirm } from '@/web/common/hooks/useConfirm';
|
||||||
|
import { getDocPath } from '@/web/common/system/doc';
|
||||||
|
import { feConfigs } from '@/web/common/system/staticData';
|
||||||
|
|
||||||
type FormType = {
|
type FormType = {
|
||||||
url?: string | undefined;
|
url?: string | undefined;
|
||||||
@ -49,6 +51,16 @@ const WebsiteConfigModal = ({
|
|||||||
<ModalBody>
|
<ModalBody>
|
||||||
<Box fontSize={'sm'} color={'myGray.600'}>
|
<Box fontSize={'sm'} color={'myGray.600'}>
|
||||||
{t('core.dataset.website.Config Description')}
|
{t('core.dataset.website.Config Description')}
|
||||||
|
{feConfigs?.docUrl && (
|
||||||
|
<Link
|
||||||
|
href={getDocPath('/docs/course/websync')}
|
||||||
|
target="_blank"
|
||||||
|
textDecoration={'underline'}
|
||||||
|
fontWeight={'bold'}
|
||||||
|
>
|
||||||
|
{t('common.course.Read Course')}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
<Box mt={2}>
|
<Box mt={2}>
|
||||||
<Box>{t('core.dataset.website.Base Url')}</Box>
|
<Box>{t('core.dataset.website.Base Url')}</Box>
|
||||||
|
|||||||
@ -13,15 +13,7 @@ import { jiebaSplit } from '../utils';
|
|||||||
import { reRankRecall } from '../../ai/rerank';
|
import { reRankRecall } from '../../ai/rerank';
|
||||||
import { countPromptTokens } from '@fastgpt/global/common/string/tiktoken';
|
import { countPromptTokens } from '@fastgpt/global/common/string/tiktoken';
|
||||||
|
|
||||||
export async function insertData2Pg({
|
export async function insertData2Pg(props: {
|
||||||
mongoDataId,
|
|
||||||
input,
|
|
||||||
model,
|
|
||||||
teamId,
|
|
||||||
tmbId,
|
|
||||||
datasetId,
|
|
||||||
collectionId
|
|
||||||
}: {
|
|
||||||
mongoDataId: string;
|
mongoDataId: string;
|
||||||
input: string;
|
input: string;
|
||||||
model: string;
|
model: string;
|
||||||
@ -29,42 +21,42 @@ export async function insertData2Pg({
|
|||||||
tmbId: string;
|
tmbId: string;
|
||||||
datasetId: string;
|
datasetId: string;
|
||||||
collectionId: string;
|
collectionId: string;
|
||||||
}) {
|
retry?: number;
|
||||||
let retry = 2;
|
}): Promise<{ insertId: string; vectors: number[][]; tokenLen: number }> {
|
||||||
async function insertPg(): Promise<{ insertId: string; vectors: number[][]; tokenLen: number }> {
|
const { mongoDataId, input, model, teamId, tmbId, datasetId, collectionId, retry = 3 } = props;
|
||||||
try {
|
try {
|
||||||
// get vector
|
// get vector
|
||||||
const { vectors, tokenLen } = await getVectorsByText({
|
const { vectors, tokenLen } = await getVectorsByText({
|
||||||
model,
|
model,
|
||||||
input: [input]
|
input: [input]
|
||||||
});
|
});
|
||||||
const { rows } = await PgClient.insert(PgDatasetTableName, {
|
const { rows } = await PgClient.insert(PgDatasetTableName, {
|
||||||
values: [
|
values: [
|
||||||
[
|
[
|
||||||
{ key: 'vector', value: `[${vectors[0]}]` },
|
{ key: 'vector', value: `[${vectors[0]}]` },
|
||||||
{ key: 'team_id', value: String(teamId) },
|
{ key: 'team_id', value: String(teamId) },
|
||||||
{ key: 'tmb_id', value: String(tmbId) },
|
{ key: 'tmb_id', value: String(tmbId) },
|
||||||
{ key: 'dataset_id', value: datasetId },
|
{ key: 'dataset_id', value: datasetId },
|
||||||
{ key: 'collection_id', value: collectionId },
|
{ key: 'collection_id', value: collectionId },
|
||||||
{ key: 'data_id', value: String(mongoDataId) }
|
{ key: 'data_id', value: String(mongoDataId) }
|
||||||
]
|
|
||||||
]
|
]
|
||||||
});
|
]
|
||||||
return {
|
});
|
||||||
insertId: rows[0].id,
|
return {
|
||||||
vectors,
|
insertId: rows[0].id,
|
||||||
tokenLen
|
vectors,
|
||||||
};
|
tokenLen
|
||||||
} catch (error) {
|
};
|
||||||
if (--retry < 0) {
|
} catch (error) {
|
||||||
return Promise.reject(error);
|
if (retry <= 0) {
|
||||||
}
|
return Promise.reject(error);
|
||||||
await delay(500);
|
|
||||||
return insertPg();
|
|
||||||
}
|
}
|
||||||
|
await delay(500);
|
||||||
|
return insertData2Pg({
|
||||||
|
...props,
|
||||||
|
retry: retry - 1
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return insertPg();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function updatePgDataById({
|
export async function updatePgDataById({
|
||||||
@ -128,8 +120,9 @@ export async function searchDatasetData(props: SearchProps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const rerank =
|
const rerank =
|
||||||
searchMode === DatasetSearchModeEnum.embeddingReRank ||
|
global.reRankModels?.[0] &&
|
||||||
searchMode === DatasetSearchModeEnum.embFullTextReRank;
|
(searchMode === DatasetSearchModeEnum.embeddingReRank ||
|
||||||
|
searchMode === DatasetSearchModeEnum.embFullTextReRank);
|
||||||
|
|
||||||
const oneChunkToken = 50;
|
const oneChunkToken = 50;
|
||||||
const { embeddingLimit, fullTextLimit } = (() => {
|
const { embeddingLimit, fullTextLimit } = (() => {
|
||||||
@ -188,8 +181,6 @@ export async function searchDatasetData(props: SearchProps) {
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
// token slice
|
|
||||||
|
|
||||||
if (!rerank) {
|
if (!rerank) {
|
||||||
return {
|
return {
|
||||||
searchRes: filterResultsByMaxTokens(
|
searchRes: filterResultsByMaxTokens(
|
||||||
@ -264,7 +255,7 @@ export async function embeddingRecall({
|
|||||||
{
|
{
|
||||||
_id: { $in: filterRows.map((item) => item.data_id?.trim()) }
|
_id: { $in: filterRows.map((item) => item.data_id?.trim()) }
|
||||||
},
|
},
|
||||||
'datasetId collectionId q a indexes'
|
'datasetId collectionId q a chunkIndex indexes'
|
||||||
).lean()
|
).lean()
|
||||||
]);
|
]);
|
||||||
const formatResult = filterRows
|
const formatResult = filterRows
|
||||||
@ -281,6 +272,7 @@ export async function embeddingRecall({
|
|||||||
id: String(data._id),
|
id: String(data._id),
|
||||||
q: data.q,
|
q: data.q,
|
||||||
a: data.a,
|
a: data.a,
|
||||||
|
chunkIndex: data.chunkIndex,
|
||||||
indexes: data.indexes,
|
indexes: data.indexes,
|
||||||
datasetId: String(data.datasetId),
|
datasetId: String(data.datasetId),
|
||||||
collectionId: String(data.collectionId),
|
collectionId: String(data.collectionId),
|
||||||
@ -322,7 +314,8 @@ export async function fullTextRecall({ text, limit, datasetIds = [] }: SearchPro
|
|||||||
collectionId: 1,
|
collectionId: 1,
|
||||||
q: 1,
|
q: 1,
|
||||||
a: 1,
|
a: 1,
|
||||||
indexes: 1
|
indexes: 1,
|
||||||
|
chunkIndex: 1
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
.sort({ score: { $meta: 'textScore' } })
|
.sort({ score: { $meta: 'textScore' } })
|
||||||
@ -354,6 +347,7 @@ export async function fullTextRecall({ text, limit, datasetIds = [] }: SearchPro
|
|||||||
sourceId: collection?.fileId || collection?.rawLink,
|
sourceId: collection?.fileId || collection?.rawLink,
|
||||||
q: item.q,
|
q: item.q,
|
||||||
a: item.a,
|
a: item.a,
|
||||||
|
chunkIndex: item.chunkIndex,
|
||||||
indexes: item.indexes,
|
indexes: item.indexes,
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
score: item.score
|
score: item.score
|
||||||
@ -395,8 +389,6 @@ export async function reRankSearchResult({
|
|||||||
|
|
||||||
return mergeResult;
|
return mergeResult;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { DatasetDataIndexTypeEnum, TrainingModeEnum } from '@fastgpt/global/core
|
|||||||
import { sendOneInform } from '../support/user/inform/api';
|
import { sendOneInform } from '../support/user/inform/api';
|
||||||
import { getAIApi } from '@fastgpt/service/core/ai/config';
|
import { getAIApi } from '@fastgpt/service/core/ai/config';
|
||||||
import type { ChatMessageItemType } from '@fastgpt/global/core/ai/type.d';
|
import type { ChatMessageItemType } from '@fastgpt/global/core/ai/type.d';
|
||||||
import { addLog } from '@fastgpt/service/common/mongo/controller';
|
import { addLog } from '@fastgpt/service/common/system/log';
|
||||||
import { splitText2Chunks } from '@fastgpt/global/common/string/textSplitter';
|
import { splitText2Chunks } from '@fastgpt/global/common/string/textSplitter';
|
||||||
import { replaceVariable } from '@fastgpt/global/common/string/tools';
|
import { replaceVariable } from '@fastgpt/global/common/string/tools';
|
||||||
import { Prompt_AgentQA } from '@/global/core/prompt/agent';
|
import { Prompt_AgentQA } from '@/global/core/prompt/agent';
|
||||||
@ -56,6 +56,7 @@ export async function generateQA(): Promise<any> {
|
|||||||
collectionId: 1,
|
collectionId: 1,
|
||||||
q: 1,
|
q: 1,
|
||||||
model: 1,
|
model: 1,
|
||||||
|
chunkIndex: 1,
|
||||||
billId: 1,
|
billId: 1,
|
||||||
prompt: 1
|
prompt: 1
|
||||||
})
|
})
|
||||||
@ -130,7 +131,7 @@ ${replaceVariable(Prompt_AgentQA.fixedText, { text })}`;
|
|||||||
const ai = getAIApi(undefined, 600000);
|
const ai = getAIApi(undefined, 600000);
|
||||||
const chatResponse = await ai.chat.completions.create({
|
const chatResponse = await ai.chat.completions.create({
|
||||||
model,
|
model,
|
||||||
temperature: 0.01,
|
temperature: 0.3,
|
||||||
messages,
|
messages,
|
||||||
stream: false
|
stream: false
|
||||||
});
|
});
|
||||||
@ -144,7 +145,10 @@ ${replaceVariable(Prompt_AgentQA.fixedText, { text })}`;
|
|||||||
teamId: data.teamId,
|
teamId: data.teamId,
|
||||||
tmbId: data.tmbId,
|
tmbId: data.tmbId,
|
||||||
collectionId: data.collectionId,
|
collectionId: data.collectionId,
|
||||||
data: qaArr,
|
data: qaArr.map((item) => ({
|
||||||
|
...item,
|
||||||
|
chunkIndex: data.chunkIndex
|
||||||
|
})),
|
||||||
mode: TrainingModeEnum.chunk,
|
mode: TrainingModeEnum.chunk,
|
||||||
billId: data.billId
|
billId: data.billId
|
||||||
});
|
});
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { insertData2Dataset } from '@/service/core/dataset/data/controller';
|
|||||||
import { MongoDatasetTraining } from '@fastgpt/service/core/dataset/training/schema';
|
import { MongoDatasetTraining } from '@fastgpt/service/core/dataset/training/schema';
|
||||||
import { TrainingModeEnum } from '@fastgpt/global/core/dataset/constant';
|
import { TrainingModeEnum } from '@fastgpt/global/core/dataset/constant';
|
||||||
import { sendOneInform } from '../support/user/inform/api';
|
import { sendOneInform } from '../support/user/inform/api';
|
||||||
import { addLog } from '@fastgpt/service/common/mongo/controller';
|
import { addLog } from '@fastgpt/service/common/system/log';
|
||||||
import { getErrText } from '@fastgpt/global/common/error/utils';
|
import { getErrText } from '@fastgpt/global/common/error/utils';
|
||||||
import { authTeamBalance } from '@/service/support/permission/auth/bill';
|
import { authTeamBalance } from '@/service/support/permission/auth/bill';
|
||||||
import { pushGenerateVectorBill } from '@/service/support/wallet/bill/push';
|
import { pushGenerateVectorBill } from '@/service/support/wallet/bill/push';
|
||||||
|
|||||||
@ -223,6 +223,7 @@ function filterQuote({
|
|||||||
score: item.score?.toFixed(4)
|
score: item.score?.toFixed(4)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const sliceResult = sliceMessagesTB({
|
const sliceResult = sliceMessagesTB({
|
||||||
maxTokens: model.quoteMaxToken,
|
maxTokens: model.quoteMaxToken,
|
||||||
messages: quoteQA.map((item, index) => ({
|
messages: quoteQA.map((item, index) => ({
|
||||||
@ -234,13 +235,30 @@ function filterQuote({
|
|||||||
// slice filterSearch
|
// slice filterSearch
|
||||||
const filterQuoteQA = quoteQA.slice(0, sliceResult.length);
|
const filterQuoteQA = quoteQA.slice(0, sliceResult.length);
|
||||||
|
|
||||||
|
// filterQuoteQA按collectionId聚合在一起后,再按chunkIndex从小到大排序
|
||||||
|
const sortQuoteQAMap: Record<string, SearchDataResponseItemType[]> = {};
|
||||||
|
filterQuoteQA.forEach((item) => {
|
||||||
|
if (sortQuoteQAMap[item.collectionId]) {
|
||||||
|
sortQuoteQAMap[item.collectionId].push(item);
|
||||||
|
} else {
|
||||||
|
sortQuoteQAMap[item.collectionId] = [item];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const sortQuoteQAList = Object.values(sortQuoteQAMap).flat();
|
||||||
|
sortQuoteQAList.sort((a, b) => {
|
||||||
|
if (a.collectionId === b.collectionId) {
|
||||||
|
return a.chunkIndex - b.chunkIndex;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
const quoteText =
|
const quoteText =
|
||||||
filterQuoteQA.length > 0
|
filterQuoteQA.length > 0
|
||||||
? `${filterQuoteQA.map((item, index) => getValue(item, index)).join('\n')}`
|
? `${filterQuoteQA.map((item, index) => getValue(item, index)).join('\n')}`
|
||||||
: '';
|
: '';
|
||||||
|
|
||||||
return {
|
return {
|
||||||
filterQuoteQA,
|
filterQuoteQA: sortQuoteQAList,
|
||||||
quoteText
|
quoteText
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -45,9 +45,16 @@ export async function autChatCrud({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// req auth
|
// req auth
|
||||||
const { tmbId, role } = await authUserRole(props);
|
const { teamId, tmbId, role } = await authUserRole(props);
|
||||||
|
|
||||||
|
if (String(teamId) !== String(chat.teamId)) return Promise.reject(ChatErrEnum.unAuthChat);
|
||||||
|
|
||||||
if (role === TeamMemberRoleEnum.owner) return { uid: outLinkUid };
|
if (role === TeamMemberRoleEnum.owner) return { uid: outLinkUid };
|
||||||
if (String(tmbId) === String(chat.tmbId)) return { uid: outLinkUid };
|
if (String(tmbId) === String(chat.tmbId)) return { uid: outLinkUid };
|
||||||
|
|
||||||
|
// admin
|
||||||
|
if (per === 'r' && role === TeamMemberRoleEnum.admin) return { uid: outLinkUid };
|
||||||
|
|
||||||
return Promise.reject(ChatErrEnum.unAuthChat);
|
return Promise.reject(ChatErrEnum.unAuthChat);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
import { DatasetDataItemType, DatasetDataSchemaType } from '@fastgpt/global/core/dataset/type';
|
import { DatasetDataItemType } from '@fastgpt/global/core/dataset/type';
|
||||||
import { AuthResponseType } from '@fastgpt/global/support/permission/type';
|
|
||||||
import { MongoDatasetData } from '@fastgpt/service/core/dataset/data/schema';
|
import { MongoDatasetData } from '@fastgpt/service/core/dataset/data/schema';
|
||||||
import { authDatasetCollection } from '@fastgpt/service/support/permission/auth/dataset';
|
import { authDatasetCollection } from '@fastgpt/service/support/permission/auth/dataset';
|
||||||
import { AuthModeType } from '@fastgpt/service/support/permission/type';
|
import { AuthModeType } from '@fastgpt/service/support/permission/type';
|
||||||
@ -27,6 +26,7 @@ export async function authDatasetData({
|
|||||||
id: String(datasetData._id),
|
id: String(datasetData._id),
|
||||||
q: datasetData.q,
|
q: datasetData.q,
|
||||||
a: datasetData.a,
|
a: datasetData.a,
|
||||||
|
chunkIndex: datasetData.chunkIndex,
|
||||||
indexes: datasetData.indexes,
|
indexes: datasetData.indexes,
|
||||||
datasetId: String(datasetData.datasetId),
|
datasetId: String(datasetData.datasetId),
|
||||||
collectionId: String(datasetData.collectionId),
|
collectionId: String(datasetData.collectionId),
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { BillSourceEnum, PRICE_SCALE } from '@fastgpt/global/support/wallet/bill
|
|||||||
import { getAudioSpeechModel, getQAModel } from '@/service/core/ai/model';
|
import { getAudioSpeechModel, getQAModel } from '@/service/core/ai/model';
|
||||||
import type { ChatHistoryItemResType } from '@fastgpt/global/core/chat/type.d';
|
import type { ChatHistoryItemResType } from '@fastgpt/global/core/chat/type.d';
|
||||||
import { formatPrice } from '@fastgpt/global/support/wallet/bill/tools';
|
import { formatPrice } from '@fastgpt/global/support/wallet/bill/tools';
|
||||||
import { addLog } from '@fastgpt/service/common/mongo/controller';
|
import { addLog } from '@fastgpt/service/common/system/log';
|
||||||
import type { ConcatBillProps, CreateBillProps } from '@fastgpt/global/support/wallet/bill/api.d';
|
import type { ConcatBillProps, CreateBillProps } from '@fastgpt/global/support/wallet/bill/api.d';
|
||||||
import { defaultQGModels } from '@fastgpt/global/core/ai/model';
|
import { defaultQGModels } from '@fastgpt/global/core/ai/model';
|
||||||
import { POST } from '@fastgpt/service/common/api/plusRequest';
|
import { POST } from '@fastgpt/service/common/api/plusRequest';
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import { MongoApp } from '@fastgpt/service/core/app/schema';
|
|||||||
import { ChatSourceEnum } from '@fastgpt/global/core/chat/constants';
|
import { ChatSourceEnum } from '@fastgpt/global/core/chat/constants';
|
||||||
import { MongoChatItem } from '@fastgpt/service/core/chat/chatItemSchema';
|
import { MongoChatItem } from '@fastgpt/service/core/chat/chatItemSchema';
|
||||||
import { MongoChat } from '@fastgpt/service/core/chat/chatSchema';
|
import { MongoChat } from '@fastgpt/service/core/chat/chatSchema';
|
||||||
import { addLog } from '@fastgpt/service/common/mongo/controller';
|
import { addLog } from '@fastgpt/service/common/system/log';
|
||||||
import { chatContentReplaceBlock } from '@fastgpt/global/core/chat/utils';
|
import { chatContentReplaceBlock } from '@fastgpt/global/core/chat/utils';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
|||||||
4
projects/app/src/types/app.d.ts
vendored
@ -59,6 +59,8 @@ export type AppLogsListItemType = {
|
|||||||
time: Date;
|
time: Date;
|
||||||
title: string;
|
title: string;
|
||||||
messageCount: number;
|
messageCount: number;
|
||||||
feedbackCount: number;
|
userGoodFeedbackCount: number;
|
||||||
|
userBadFeedbackCount: number;
|
||||||
|
robotBadFeedbackCount: number;
|
||||||
markCount: number;
|
markCount: number;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -99,10 +99,14 @@ function responseError(err: any) {
|
|||||||
// 有报错响应
|
// 有报错响应
|
||||||
if (err?.code in TOKEN_ERROR_CODE) {
|
if (err?.code in TOKEN_ERROR_CODE) {
|
||||||
clearToken();
|
clearToken();
|
||||||
window.location.replace(
|
|
||||||
`/login?lastRoute=${encodeURIComponent(location.pathname + location.search)}`
|
if (window.location.pathname !== '/chat/share') {
|
||||||
);
|
window.location.replace(
|
||||||
return Promise.reject({ message: 'token过期,重新登录' });
|
`/login?lastRoute=${encodeURIComponent(location.pathname + location.search)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.reject({ message: '无权操作' });
|
||||||
}
|
}
|
||||||
if (err?.response?.data) {
|
if (err?.response?.data) {
|
||||||
return Promise.reject(err?.response?.data);
|
return Promise.reject(err?.response?.data);
|
||||||
|
|||||||