4.7-production (#1053)

* 4.7-alpha3 (#62)

* doc

* Optimize possible null Pointers and parts of Ux

* fix: mulity index training error

* feat: doc and rename question guide

* fix ios speech input (#59)

* fix: prompt editor variables nowrap (#61)

* change openapi import in http module with curl import (#60)

* chore(ui): dataset import modal ui (#58)

* chore(ui): dataset import modal ui

* use component

* fix height

* 4.7 (#63)

* fix: claude3 image type verification failed (#1038) (#1040)

* perf: curl import modal

* doc img

* perf: adapt cohere rerank

* perf: code

* perf: input style

* doc

---------

Co-authored-by: xiaotian <dimsky@163.com>

* fix: ts

* docker deploy

* perf: prompt call

* doc

* ts

* finish ui

* perf: outlink detail ux

* perf: user schema

* fix: plugin update

* feat: get current time plugin

* fix: ts

* perf: fetch anamation

* perf: mark ux

* doc

* perf: select app ux

* fix: split text custom string conflict

* peref: inform readed

* doc

* memo flow component

* perf: version

* faq

* feat: flow max runtimes

* feat: similarity tip

* feat: auto detect file encoding

* Supports asymmetric vector model

* fix: ts

* perf: max w

* move code

* perf: hide whisper

* fix: ts

* feat: system msg modal

* perf: catch error

* perf: inform tip

* fix: inform

---------

Co-authored-by: heheer <71265218+newfish-cmyk@users.noreply.github.com>
Co-authored-by: xiaotian <dimsky@163.com>
This commit is contained in:
Archer
2024-03-26 12:09:31 +08:00
committed by GitHub
parent ef15ca894e
commit 911512b36d
180 changed files with 2179 additions and 1361 deletions

View File

@@ -29,7 +29,11 @@ function Error() {
{`出现未捕获的异常。
1. 私有部署用户90%由于配置文件不正确导致。
2. 部分系统不兼容相关API。大部分是苹果的safari 浏览器导致,可以尝试更换 chrome。
3. 请关闭浏览器翻译功能,部分翻译导致页面崩溃。`}
3. 请关闭浏览器翻译功能,部分翻译导致页面崩溃。
排除3后打开控制台的 console 查看具体报错信息。
如果提示 xxx undefined 的话,就是配置文件有错误。
`}
</Box>
);
}

View File

@@ -27,7 +27,7 @@ import {
} from '@fastgpt/global/support/wallet/bill/constants';
// import { usePagination } from '@/web/common/hooks/usePagination';
import MyBox from '@/components/common/MyBox';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { standardSubLevelMap, subModeMap } from '@fastgpt/global/support/wallet/sub/constants';
import MySelect from '@fastgpt/web/components/common/MySelect';
import MyModal from '@fastgpt/web/components/common/MyModal';

View File

@@ -403,7 +403,7 @@ const PlanUsage = () => {
</Flex>
{isFreeTeam && (
<Box mt="2" color={'#485264'} fontSize="sm">
15使
30使
</Box>
)}
</Box>
@@ -504,9 +504,9 @@ const PlanUsage = () => {
const Other = () => {
const theme = useTheme();
const { toast } = useToast();
const { feConfigs, systemVersion } = useSystemStore();
const { feConfigs } = useSystemStore();
const { t } = useTranslation();
const { userInfo, updateUserInfo, initUserInfo, teamPlanStatus } = useUserStore();
const { userInfo, updateUserInfo } = useUserStore();
const { reset } = useForm<UserUpdateParams>({
defaultValues: userInfo as UserType
});
@@ -552,10 +552,6 @@ const Other = () => {
<Box ml={2} flex={1}>
{t('system.Help Document')}
</Box>
<Box w={'8px'} h={'8px'} borderRadius={'50%'} bg={'#67c13b'} />
<Box fontSize={'md'} ml={2}>
V{systemVersion}
</Box>
</Link>
)}
<Link

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { Box, Flex, useTheme } from '@chakra-ui/react';
import { Box, Button, Flex, useTheme } from '@chakra-ui/react';
import { getInforms, readInform } from '@/web/support/user/inform/api';
import type { UserInformSchema } from '@fastgpt/global/support/user/inform/type';
import { formatTimeToChatTime } from '@/utils/tools';
@@ -7,8 +7,10 @@ import { useSystemStore } from '@/web/common/system/useSystemStore';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { usePagination } from '@fastgpt/web/hooks/usePagination';
import { useLoading } from '@fastgpt/web/hooks/useLoading';
import { useTranslation } from 'next-i18next';
const InformTable = () => {
const { t } = useTranslation();
const theme = useTheme();
const { Loading } = useLoading();
const { isPc } = useSystemStore();
@@ -22,7 +24,7 @@ const InformTable = () => {
pageNum
} = usePagination<UserInformSchema>({
api: getInforms,
pageSize: isPc ? 20 : 10
pageSize: 20
});
return (
@@ -35,35 +37,44 @@ const InformTable = () => {
py={2}
px={4}
borderRadius={'md'}
cursor={item.read ? 'default' : 'pointer'}
position={'relative'}
_notLast={{ mb: 3 }}
onClick={async () => {
if (!item.read) {
await readInform(item._id);
getData(pageNum);
}
}}
>
<Flex alignItems={'center'} justifyContent={'space-between'}>
<Flex alignItems={'center'}>
<Box fontWeight={'bold'}>{item.title}</Box>
<Box ml={2} color={'myGray.500'}>
{formatTimeToChatTime(item.time)}
<Box ml={2} color={'myGray.500'} flex={'1 0 0'}>
({formatTimeToChatTime(item.time)})
</Box>
{!item.read && (
<Button
variant={'whitePrimary'}
size={'xs'}
onClick={async () => {
if (!item.read) {
await readInform(item._id);
getData(pageNum);
}
}}
>
{t('support.inform.Read')}
</Button>
)}
</Flex>
<Box fontSize={'sm'} color={'myGray.600'} whiteSpace={'pre-wrap'}>
<Box mt={2} fontSize={'sm'} color={'myGray.600'} whiteSpace={'pre-wrap'}>
{item.content}
</Box>
{!item.read && (
<Box
w={'5px'}
h={'5px'}
borderRadius={'10px'}
bg={'red.600'}
position={'absolute'}
bottom={'8px'}
right={'8px'}
></Box>
<>
<Box
w={'5px'}
h={'5px'}
borderRadius={'10px'}
bg={'red.600'}
position={'absolute'}
top={'8px'}
left={'8px'}
/>
</>
)}
</Box>
))}

View File

@@ -3,7 +3,7 @@ import { ModalBody, Box, Flex, Input, ModalFooter, Button } from '@chakra-ui/rea
import MyModal from '@fastgpt/web/components/common/MyModal';
import { useTranslation } from 'next-i18next';
import { useForm } from 'react-hook-form';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import type { UserType } from '@fastgpt/global/support/user/type.d';
const OpenAIAccountModal = ({

View File

@@ -3,7 +3,7 @@ import { ModalBody, Box, Flex, Input, ModalFooter, Button } from '@chakra-ui/rea
import MyModal from '@fastgpt/web/components/common/MyModal';
import { useTranslation } from 'next-i18next';
import { useForm } from 'react-hook-form';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { updatePasswordByOld } from '@/web/support/user/api';
type FormType = {

View File

@@ -4,7 +4,7 @@ import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useRouter } from 'next/router';
import dynamic from 'next/dynamic';
import { useUserStore } from '@/web/support/user/useUserStore';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import PageContainer from '@/components/PageContainer';
import SideTabs from '@/components/SideTabs';
import Tabs from '@/components/Tabs';
@@ -34,7 +34,7 @@ enum TabEnum {
const Account = ({ currentTab }: { currentTab: `${TabEnum}` }) => {
const { t } = useTranslation();
const { userInfo, setUserInfo } = useUserStore();
const { feConfigs, isPc } = useSystemStore();
const { feConfigs, isPc, systemVersion } = useSystemStore();
const tabList = [
{
@@ -148,6 +148,12 @@ const Account = ({ currentTab }: { currentTab: `${TabEnum}` }) => {
activeId={currentTab}
onChange={setCurrentTab}
/>
<Flex alignItems={'center'}>
<Box w={'8px'} h={'8px'} borderRadius={'50%'} bg={'#67c13b'} />
<Box fontSize={'md'} ml={2}>
V{systemVersion}
</Box>
</Flex>
</Flex>
) : (
<Box mb={3}>

View File

@@ -2,9 +2,9 @@ import type { NextApiRequest, NextApiResponse } from 'next';
import { jsonRes } from '@fastgpt/service/common/response';
import { connectToDatabase } from '@/service/mongo';
import { authFileToken } from '@fastgpt/service/support/permission/controller';
import { detect } from 'jschardet';
import { getDownloadStream, getFileById } from '@fastgpt/service/common/file/gridfs/controller';
import { CommonErrEnum } from '@fastgpt/global/common/error/code/common';
import { detectFileEncoding } from '@fastgpt/global/common/file/tools';
export default async function handler(req: NextApiRequest, res: NextApiResponse<any>) {
try {
@@ -37,7 +37,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
}
}
const encoding = detect(buffers)?.encoding || 'utf-8';
const encoding = detectFileEncoding(buffers);
res.setHeader('Content-Type', `${file.contentType}; charset=${encoding}`);
res.setHeader('Cache-Control', 'public, max-age=3600');

View File

@@ -25,8 +25,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
reRankModels:
global.reRankModels?.map((item) => ({
...item,
requestUrl: undefined,
requestAuth: undefined
requestUrl: '',
requestAuth: ''
})) || [],
whisperModel: global.whisperModel,
audioSpeechModels: global.audioSpeechModels,
@@ -42,7 +42,7 @@ const defaultFeConfigs: FastGPTFeConfigsType = {
openAPIDocUrl: 'https://doc.fastgpt.in/docs/development/openapi',
systemTitle: 'FastGPT',
concatMd:
'* 项目开源地址: [FastGPT GitHub](https://github.com/labring/FastGPT)\n* 交流群: ![](https://oss.laf.run/htr4n1-images/fastgpt-qr-code.jpg)',
'项目开源地址: [FastGPT GitHub](https://github.com/labring/FastGPT)\n交流群: ![](https://oss.laf.run/htr4n1-images/fastgpt-qr-code.jpg)',
limit: {
exportDatasetLimitMinutes: 0,
websiteSyncLimitMinuted: 0
@@ -150,7 +150,7 @@ function getSystemPlugin() {
const filterFiles = files.filter((item) => item.endsWith('.json'));
// read json file
const fileTemplates: PluginTemplateType[] = filterFiles.map((filename) => {
const fileTemplates: (PluginTemplateType & { weight: number })[] = filterFiles.map((filename) => {
const content = readFileSync(`${basePath}/${filename}`, 'utf-8');
return {
...JSON.parse(content),
@@ -159,5 +159,7 @@ function getSystemPlugin() {
};
});
fileTemplates.sort((a, b) => b.weight - a.weight);
global.communityPlugins = fileTemplates;
}

View File

@@ -72,7 +72,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
userChatInput: text
},
stream: true,
detail: true
detail: true,
maxRunTimes: 200
});
responseWrite({

View File

@@ -1,12 +1,12 @@
import type { NextApiRequest, NextApiResponse } from 'next';
import { jsonRes } from '@fastgpt/service/common/response';
import * as SwaggerParser from '@apidevtools/swagger-parser';
import SwaggerParser from '@apidevtools/swagger-parser';
export default async function handler(req: NextApiRequest, res: NextApiResponse<any>) {
try {
const apiURL = req.body.url as string;
const api = await (SwaggerParser as any).validate(apiURL);
const api = await SwaggerParser.validate(apiURL);
return jsonRes(res, {
data: api

View File

@@ -17,6 +17,18 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
const { teamId, tmbId } = await authPluginCrud({ req, authToken: true, id, per: 'owner' });
const updateData = {
name: props.name,
intro: props.intro,
avatar: props.avatar,
parentId: props.parentId,
...(props.modules &&
props.modules.length > 0 && {
modules: props.modules
}),
metadata: props.metadata
};
if (props.metadata?.apiSchemaStr) {
await mongoSessionRun(async (session) => {
// update children
@@ -26,13 +38,13 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
parent: body,
session
});
await MongoPlugin.findByIdAndUpdate(id, props, { session });
await MongoPlugin.findByIdAndUpdate(id, updateData, { session });
});
jsonRes(res, {});
} else {
jsonRes(res, {
data: await MongoPlugin.findByIdAndUpdate(id, props)
data: await MongoPlugin.findByIdAndUpdate(id, updateData)
});
}
} catch (err) {

View File

@@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
import { jsonRes } from '@fastgpt/service/common/response';
import { connectToDatabase } from '@/service/mongo';
import { readMongoImg } from '@fastgpt/service/common/file/image/controller';
import { guessImageTypeFromBase64 } from '@fastgpt/service/common/file/utils';
import { guessBase64ImageType } from '@fastgpt/service/common/file/utils';
// get the models available to the system
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
@@ -11,8 +11,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
const { id } = req.query as { id: string };
const binary = await readMongoImg({ id });
const imageType = guessImageTypeFromBase64(binary.toString('base64'));
res.setHeader('Content-Type', imageType);
res.setHeader('Content-Type', guessBase64ImageType(binary.toString('base64')));
res.send(binary);
} catch (error) {
jsonRes(res, {

View File

@@ -184,7 +184,8 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex
userChatInput: text
},
stream,
detail
detail,
maxRunTimes: 200
});
// save chat

View File

@@ -9,17 +9,19 @@ import { updateApiKeyUsage } from '@fastgpt/service/support/openapi/tools';
import { getUsageSourceByAuthType } from '@fastgpt/global/support/wallet/usage/tools';
import { getVectorModel } from '@fastgpt/service/core/ai/model';
import { checkTeamAIPoints } from '@fastgpt/service/support/permission/teamLimit';
import { EmbeddingTypeEnm } from '@fastgpt/global/core/ai/constants';
type Props = {
input: string | string[];
model: string;
dimensions?: number;
billId?: string;
type: `${EmbeddingTypeEnm}`;
};
export default withNextCors(async function handler(req: NextApiRequest, res: NextApiResponse<any>) {
try {
let { input, model, billId } = req.body as Props;
let { input, model, billId, type } = req.body as Props;
await connectToDatabase();
if (!Array.isArray(input) && typeof input !== 'string') {
@@ -38,7 +40,8 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex
const { tokens, vectors } = await getVectorsByText({
input: query,
model: getVectorModel(model)
model: getVectorModel(model),
type
});
res.json({

View File

@@ -2,7 +2,7 @@ import React, { useCallback, useRef, useState } from 'react';
import { Box, Flex, IconButton, useTheme, useDisclosure } from '@chakra-ui/react';
import { SmallCloseIcon } from '@chakra-ui/icons';
import { ModuleItemType } from '@fastgpt/global/core/module/type';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { AppSchema } from '@fastgpt/global/core/app/type.d';
import { useTranslation } from 'next-i18next';
import { useCopyData } from '@/web/common/hooks/useCopyData';
@@ -16,7 +16,7 @@ import { useFlowProviderStore } from '@/components/core/module/Flow/FlowProvider
import { flowNode2Modules, filterExportModules } from '@/components/core/module/utils';
import { useAppStore } from '@/web/core/app/store/useAppStore';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { getErrText } from '@fastgpt/global/common/error/utils';
const ImportSettings = dynamic(() => import('@/components/core/module/Flow/ImportSettings'));

View File

@@ -16,7 +16,7 @@ import { useToast } from '@fastgpt/web/hooks/useToast';
import { useSelectFile } from '@/web/common/file/hooks/useSelectFile';
import { compressImgFileAndUpload } from '@/web/common/file/controller';
import { getErrText } from '@fastgpt/global/common/error/utils';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import Avatar from '@/components/Avatar';
import MyModal from '@fastgpt/web/components/common/MyModal';
import { useAppStore } from '@/web/core/app/store/useAppStore';

View File

@@ -102,7 +102,10 @@ const SelectUsingWayModal = ({ share, onClose }: { share: OutLinkSchema; onClose
data-open-icon="${getValues('scriptOpenIcon')}"
data-close-icon="${getValues('scriptCloseIcon')}"
defer
/>`
/>
<script>
console.log("Chat box loaded")
</script>`
}
};

View File

@@ -14,7 +14,8 @@ import {
ModalBody,
Input,
Switch,
Link
Link,
IconButton
} from '@chakra-ui/react';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import MyIcon from '@fastgpt/web/components/common/Icon';
@@ -31,7 +32,7 @@ import { useCopyData } from '@/web/common/hooks/useCopyData';
import { useForm } from 'react-hook-form';
import { defaultOutLinkForm } from '@/constants/app';
import type { OutLinkEditType, OutLinkSchema } from '@fastgpt/global/support/outLink/type.d';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { OutLinkTypeEnum } from '@fastgpt/global/support/outLink/constant';
import { useTranslation } from 'next-i18next';
import { useToast } from '@fastgpt/web/hooks/useToast';
@@ -42,6 +43,7 @@ import dayjs from 'dayjs';
import { getDocPath } from '@/web/common/system/doc';
import dynamic from 'next/dynamic';
import MyMenu from '@/components/MyMenu';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
const SelectUsingWayModal = dynamic(() => import('./SelectUsingWayModal'));
@@ -53,6 +55,10 @@ const Share = ({ appId }: { appId: string }) => {
const [editLinkData, setEditLinkData] = useState<OutLinkEditType>();
const [selectedLinkData, setSelectedLinkData] = useState<OutLinkSchema>();
const { toast } = useToast();
const { ConfirmModal, openConfirm } = useConfirm({
content: t('support.outlink.Delete link tip'),
type: 'delete'
});
const {
isFetching,
@@ -130,25 +136,25 @@ const Share = ({ appId }: { appId: string }) => {
)}
<Td>{item.lastTime ? formatTimeToChatTime(item.lastTime) : t('common.Un used')}</Td>
<Td display={'flex'} alignItems={'center'}>
<Button
onClick={() => setSelectedLinkData(item)}
size={'sm'}
mr={3}
variant={'whitePrimary'}
>
{t('core.app.outLink.Select Mode')}
</Button>
<MyMenu
Button={
<MyIcon
<IconButton
icon={<MyIcon name={'more'} w={'14px'} />}
name={'more'}
_hover={{ bg: 'myGray.100 ' }}
cursor={'pointer'}
borderRadius={'md'}
w={'14px'}
p={2}
variant={'whiteBase'}
size={'sm'}
aria-label={''}
/>
}
menuList={[
{
label: t('core.app.outLink.Select Mode'),
icon: 'copy',
onClick: () => {
setSelectedLinkData(item);
}
},
{
label: t('common.Edit'),
icon: 'edit',
@@ -163,7 +169,8 @@ const Share = ({ appId }: { appId: string }) => {
{
label: t('common.Delete'),
icon: 'delete',
onClick: async () => {
type: 'danger',
onClick: openConfirm(async () => {
setIsLoading(true);
try {
await delShareChatById(item._id);
@@ -172,7 +179,7 @@ const Share = ({ appId }: { appId: string }) => {
console.log(error);
}
setIsLoading(false);
}
})
}
]}
/>
@@ -219,6 +226,7 @@ const Share = ({ appId }: { appId: string }) => {
onClose={() => setSelectedLinkData(undefined)}
/>
)}
<ConfirmModal />
<Loading loading={isFetching} fixed={false} />
</Box>
);

View File

@@ -1,8 +1,8 @@
import React, { useState } from 'react';
import { Box, Flex, Button, IconButton } from '@chakra-ui/react';
import { DragHandleIcon } from '@chakra-ui/icons';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { useRouter } from 'next/router';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { AppSchema } from '@fastgpt/global/core/app/type.d';

View File

@@ -7,8 +7,8 @@ import { useSystemStore } from '@/web/common/system/useSystemStore';
import { appModules2Form, getDefaultAppForm } from '@fastgpt/global/core/app/utils';
import type { AppSimpleEditFormType } from '@fastgpt/global/core/app/type.d';
import { chatNodeSystemPromptTip, welcomeTextTip } from '@fastgpt/global/core/module/template/tip';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { useRouter } from 'next/router';
import { useTranslation } from 'next-i18next';
import { AppTypeEnum } from '@fastgpt/global/core/app/constants';

View File

@@ -20,7 +20,7 @@ import {
} from '@chakra-ui/react';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { useAppStore } from '@/web/core/app/store/useAppStore';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { getTeamsTags } from '@/web/support/user/team/api';
import { useQuery } from '@tanstack/react-query';

View File

@@ -13,7 +13,7 @@ import {
} from '@chakra-ui/react';
import RowTabs from '@fastgpt/web/components/common/Tabs/RowTabs';
import { useWorkflowStore } from '@/web/core/workflow/store/workflow';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { useQuery } from '@tanstack/react-query';
import EmptyTip from '@/components/EmptyTip';
import { FlowNodeTemplateType } from '@fastgpt/global/core/module/type';

View File

@@ -23,7 +23,7 @@ import { postCreateApp } from '@/web/core/app/api';
import { useRouter } from 'next/router';
import { appTemplates } from '@/web/core/app/templates';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import Avatar from '@/components/Avatar';
import MyTooltip from '@/components/MyTooltip';
import MyModal from '@fastgpt/web/components/common/MyModal';

View File

@@ -5,7 +5,7 @@ import { useQuery } from '@tanstack/react-query';
import { AddIcon } from '@chakra-ui/icons';
import { delModelById } from '@/web/core/app/api';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { serviceSideProps } from '@/web/common/utils/i18n';
import { useTranslation } from 'next-i18next';
import MyIcon from '@fastgpt/web/components/common/Icon';

View File

@@ -17,7 +17,7 @@ import Avatar from '@/components/Avatar';
import MyTooltip from '@/components/MyTooltip';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useTranslation } from 'next-i18next';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import Tabs from '@/components/Tabs';
import { useUserStore } from '@/web/support/user/useUserStore';
import { AppListItemType } from '@fastgpt/global/core/app/type';

View File

@@ -2,7 +2,7 @@ import React, { useMemo, useRef, useState } from 'react';
import { ModalFooter, ModalBody, Input, Button } from '@chakra-ui/react';
import MyModal from '@fastgpt/web/components/common/MyModal';
import { useTranslation } from 'next-i18next';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
const EditFolderModal = ({
onClose,

View File

@@ -26,12 +26,12 @@ import {
} from '@/web/core/dataset/api';
import { useQuery } from '@tanstack/react-query';
import { debounce } from 'lodash';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { useTranslation } from 'next-i18next';
import MyIcon from '@fastgpt/web/components/common/Icon';
import MyInput from '@/components/MyInput';
import dayjs from 'dayjs';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { useLoading } from '@fastgpt/web/hooks/useLoading';
import { useRouter } from 'next/router';
import { useSystemStore } from '@/web/common/system/useSystemStore';
@@ -707,6 +707,7 @@ const CollectionCard = () => {
<Box>{t('common.Delete')}</Box>
</Flex>
),
type: 'danger',
onClick: () =>
openDeleteConfirm(
() => {

View File

@@ -25,7 +25,7 @@ import { useQuery } from '@tanstack/react-query';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { debounce } from 'lodash';
import { getErrText } from '@fastgpt/global/common/error/utils';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { useTranslation } from 'next-i18next';
import { useRouter } from 'next/router';
import MyIcon from '@fastgpt/web/components/common/Icon';
@@ -302,7 +302,10 @@ const DataCard = () => {
>
<Flex zIndex={1} alignItems={'center'} justifyContent={'space-between'}>
<Box
border={theme.borders.base}
borderWidth={'1px'}
borderColor={'primary.200'}
bg={'primary.50'}
color={'primary.600'}
px={2}
fontSize={'sm'}
mr={1}
@@ -310,7 +313,7 @@ const DataCard = () => {
>
# {item.chunkIndex ?? '-'}
</Box>
<Box className={'textEllipsis'} color={'myGray.500'} fontSize={'xs'}>
<Box className={'textEllipsis'} fontSize={'xs'}>
ID:{item._id}
</Box>
</Flex>

View File

@@ -5,7 +5,7 @@ import { Box, Button, Input, Link, ModalBody, ModalFooter } from '@chakra-ui/rea
import { strIsLink } from '@fastgpt/global/common/string/tools';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { useForm } from 'react-hook-form';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { getDocPath } from '@/web/common/system/doc';
import { useSystemStore } from '@/web/common/system/useSystemStore';

View File

@@ -15,7 +15,7 @@ const PreviewData = ({
const { sources, setSources } = useImportStore();
return (
<Flex flexDirection={'column'} h={'100%'} maxW={'1080px'}>
<Flex flexDirection={'column'} h={'100%'}>
<Box flex={'1 0 0 '}>
<Preview showPreviewChunks={showPreviewChunks} sources={sources} />
</Box>

View File

@@ -15,7 +15,7 @@ import {
import { useImportStore, type FormType } from '../Provider';
import { useTranslation } from 'next-i18next';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { postCreateTrainingUsage } from '@/web/support/wallet/usage/api';
import { useDatasetStore } from '@/web/core/dataset/store/dataset';
import { chunksUpload, fileCollectionCreate } from '@/web/core/dataset/utils';

View File

@@ -8,7 +8,7 @@ import MyIcon from '@fastgpt/web/components/common/Icon';
import { formatFileSize } from '@fastgpt/global/common/file/tools';
import { useTranslation } from 'next-i18next';
import { getNanoid } from '@fastgpt/global/common/string/tools';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { readFileRawContent } from '@fastgpt/web/common/file/read';
import { getUploadBase64ImgController } from '@/web/common/file/controller';
import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants';

View File

@@ -8,7 +8,7 @@ import MyIcon from '@fastgpt/web/components/common/Icon';
import { formatFileSize } from '@fastgpt/global/common/file/tools';
import { useTranslation } from 'next-i18next';
import { getNanoid } from '@fastgpt/global/common/string/tools';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import MyTooltip from '@/components/MyTooltip';
import { useImportStore } from '../Provider';
import { useSystemStore } from '@/web/common/system/useSystemStore';

View File

@@ -5,7 +5,7 @@ import { DeleteIcon } from '@chakra-ui/icons';
import { delDatasetById } from '@/web/core/dataset/api';
import { useSelectFile } from '@/web/common/file/hooks/useSelectFile';
import { useDatasetStore } from '@/web/core/dataset/store/dataset';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { useForm } from 'react-hook-form';
import { compressImgFileAndUpload } from '@/web/common/file/controller';
import type { DatasetItemType } from '@fastgpt/global/core/dataset/type.d';
@@ -14,7 +14,7 @@ import MyTooltip from '@/components/MyTooltip';
import { useTranslation } from 'next-i18next';
import PermissionRadio from '@/components/support/permission/Radio';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants';
import MySelect from '@fastgpt/web/components/common/MySelect';
import AIModelSelector from '@/components/Select/AIModelSelector';

View File

@@ -1,5 +1,5 @@
import React, { useMemo, useState } from 'react';
import { Box, Flex, Button, Textarea, useTheme, Grid } from '@chakra-ui/react';
import { Box, Flex, Button, Textarea, useTheme, Grid, HStack } from '@chakra-ui/react';
import { UseFormRegister, useFieldArray, useForm } from 'react-hook-form';
import {
postInsertData2Dataset,
@@ -12,12 +12,11 @@ import { useToast } from '@fastgpt/web/hooks/useToast';
import MyIcon from '@fastgpt/web/components/common/Icon';
import MyModal from '@fastgpt/web/components/common/MyModal';
import MyTooltip from '@/components/MyTooltip';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import { useQuery } from '@tanstack/react-query';
import { useTranslation } from 'next-i18next';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { countPromptTokens } from '@fastgpt/global/common/string/tiktoken';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { getDefaultIndex } from '@fastgpt/global/core/dataset/utils';
import { DatasetDataIndexItemType } from '@fastgpt/global/core/dataset/type';
import SideTabs from '@/components/SideTabs';
@@ -27,8 +26,8 @@ import { getDocPath } from '@/web/common/system/doc';
import RawSourceBox from '@/components/core/dataset/RawSourceBox';
import MyBox from '@/components/common/MyBox';
import { getErrText } from '@fastgpt/global/common/error/utils';
import RowTabs from '@fastgpt/web/components/common/Tabs/RowTabs';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
export type InputDataType = {
q: string;
@@ -232,9 +231,9 @@ const InputDataModal = ({
return (
<MyModal isOpen={true} isCentered w={'90vw'} maxW={'1440px'} h={'90vh'}>
<MyBox isLoading={isLoading} display={'flex'} h={'100%'}>
<Box p={5} borderRight={theme.borders.base}>
<Box p={5} bg={'myGray.50'} borderLeftRadius={'md'} borderRight={theme.borders.base}>
<RawSourceBox
w={'200px'}
w={'210px'}
className="textEllipsis3"
whiteSpace={'pre-wrap'}
sourceName={collection.sourceName}
@@ -256,32 +255,40 @@ const InputDataModal = ({
}}
/>
</Box>
<Flex flexDirection={'column'} py={3} flex={1} h={'100%'}>
<Box fontSize={'lg'} px={5} fontWeight={'bold'} mb={4}>
<Flex flexDirection={'column'} pb={8} flex={1} h={'100%'}>
<Box fontSize={'lg'} px={5} py={3} fontWeight={'medium'}>
{currentTab === TabEnum.content && (
<>{dataId ? t('dataset.data.Update Data') : t('dataset.data.Input Data')}</>
)}
{currentTab === TabEnum.index && <> {t('dataset.data.Index Edit')}</>}
</Box>
<Box flex={1} px={5} overflow={'auto'}>
<Box flex={1} px={9} overflow={'auto'}>
{currentTab === TabEnum.content && <InputTab maxToken={maxToken} register={register} />}
{currentTab === TabEnum.index && (
<Grid gridTemplateColumns={['1fr', '1fr 1fr']} gridGap={4}>
<Grid mt={3} gridTemplateColumns={['1fr', '1fr 1fr']} gridGap={4}>
{indexes?.map((index, i) => (
<Box
key={index.dataId || i}
p={3}
p={4}
borderRadius={'md'}
border={theme.borders.base}
bg={i % 2 !== 0 ? 'myWhite.400' : ''}
border={
index.defaultIndex
? '1.5px solid var(--light-fastgpt-primary-opacity-01, rgba(51, 112, 255, 0.10))'
: '1.5px solid var(--Gray-Modern-200, #E8EBF0)'
}
bg={index.defaultIndex ? 'primary.50' : 'myGray.25'}
_hover={{
'& .delete': {
display: index.defaultIndex ? 'none' : 'block'
}
}}
>
<Flex mb={1}>
<Box flex={1}>
<Flex mb={2}>
<Box
flex={1}
fontWeight={'medium'}
color={index.defaultIndex ? 'primary.700' : 'myGray.900'}
>
{index.defaultIndex
? t('dataset.data.Default Index')
: t('dataset.data.Custom Index Number', { number: i })}
@@ -296,16 +303,23 @@ const InputDataModal = ({
/>
</Flex>
{index.defaultIndex ? (
<Box>{t('core.dataset.data.Default Index Tip')}</Box>
<Box fontSize={'sm'} fontWeight={'medium'} color={'myGray.600'}>
{t('core.dataset.data.Default Index Tip')}
</Box>
) : (
<Textarea
maxLength={maxToken}
fontSize={'sm'}
rows={10}
borderColor={'transparent'}
px={0}
pt={0}
_focus={{
borderColor: 'primary.400',
px: 3
px: 3,
py: 2,
borderColor: 'primary.500',
boxShadow: '0px 0px 0px 2.4px rgba(51, 112, 255, 0.15)',
bg: 'white'
}}
placeholder={t('dataset.data.Index Placeholder')}
{...register(`indexes.${i}.text`, {
@@ -316,14 +330,19 @@ const InputDataModal = ({
</Box>
))}
<Flex
flexDirection={'column'}
alignItems={'center'}
justifyContent={'center'}
borderRadius={'md'}
border={theme.borders.base}
color={'myGray.600'}
fontWeight={'medium'}
border={'1.5px solid var(--Gray-Modern-200, #E8EBF0)'}
bg={'myGray.25'}
cursor={'pointer'}
_hover={{
bg: 'primary.50'
bg: 'primary.50',
color: 'primary.600',
border:
'1.5px solid var(--light-fastgpt-primary-opacity-01, rgba(51, 112, 255, 0.10))'
}}
minH={'100px'}
onClick={() =>
@@ -334,14 +353,14 @@ const InputDataModal = ({
})
}
>
<MyIcon name={'common/addCircleLight'} w={'16px'} />
<MyIcon name={'common/addLight'} w={'18px'} mr={1.5} />
<Box>{t('dataset.data.Add Index')}</Box>
</Flex>
</Grid>
)}
</Box>
{/* footer */}
<Flex justifyContent={'flex-end'} px={5} mt={4}>
<Flex justifyContent={'flex-end'} px={9} mt={6}>
<Button variant={'whiteBase'} mr={3} onClick={onClose}>
{t('common.Close')}
</Button>
@@ -364,10 +383,6 @@ const InputDataModal = ({
export default React.memo(InputDataModal);
enum InputTypeEnum {
q = 'q',
a = 'a'
}
const InputTab = ({
maxToken,
register
@@ -376,70 +391,46 @@ const InputTab = ({
register: UseFormRegister<InputDataType>;
}) => {
const { t } = useTranslation();
const { isPc } = useSystemStore();
const [inputType, setInputType] = useState(InputTypeEnum.q);
return (
<Flex flexDirection={'column'} h={'100%'}>
<Box>
<RowTabs
list={[
{
label: (
<Flex alignItems={'center'}>
<Box as="span" color={'red.600'}>
*
</Box>
{t('core.dataset.data.Main Content')}
<MyTooltip label={t('core.dataset.data.Data Content Tip')}>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
</Flex>
),
value: InputTypeEnum.q
},
{
label: (
<Flex alignItems={'center'}>
{t('core.dataset.data.Auxiliary Data')}
<MyTooltip label={t('core.dataset.data.Auxiliary Data Tip')}>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
</Flex>
),
value: InputTypeEnum.a
}
]}
value={inputType}
onChange={(e) => setInputType(e as InputTypeEnum)}
/>
</Box>
<Box mt={3} flex={'1 0 0'}>
{inputType === InputTypeEnum.q && (
<HStack h={'100%'} spacing={6}>
<Flex flexDirection={'column'} w={'50%'} h={'100%'}>
<Flex pt={3} pb={2} fontWeight={'medium'} fontSize={'md'} alignItems={'center'}>
<Box color={'red.600'}>*</Box>
<Box color={'myGray.900'}>{t('core.dataset.data.Main Content')}</Box>
<QuestionTip label={t('core.dataset.data.Data Content Tip')} ml={1} />
</Flex>
<Box flex={'1 0 0'}>
<Textarea
placeholder={t('core.dataset.data.Data Content Placeholder', { maxToken })}
maxLength={maxToken}
h={'100%'}
bg={'myWhite.400'}
tabIndex={1}
bg={'myGray.50'}
h={'full'}
{...register(`q`, {
required: true
})}
/>
)}
{inputType === InputTypeEnum.a && (
</Box>
</Flex>
<Flex flexDirection={'column'} w={'50%'} h={'100%'}>
<Flex pt={3} pb={2} fontWeight={'medium'} fontSize={'md'} alignItems={'center'}>
<Box color={'myGray.900'}>{t('core.dataset.data.Auxiliary Data')}</Box>
<QuestionTip label={t('core.dataset.data.Auxiliary Data Tip')} ml={1} />
</Flex>
<Box flex={'1 0 0'}>
<Textarea
placeholder={t('core.dataset.data.Auxiliary Data Placeholder', {
maxToken: maxToken * 1.5
})}
h={'100%'}
bg={'myWhite.400'}
rows={isPc ? 24 : 12}
tabIndex={1}
bg={'myGray.50'}
maxLength={maxToken * 1.5}
{...register('a')}
/>
)}
</Box>
</Flex>
</Box>
</Flex>
</HStack>
);
};

View File

@@ -18,7 +18,7 @@ import { useDatasetStore } from '@/web/core/dataset/store/dataset';
import { useSearchTestStore, SearchTestStoreItemType } from '@/web/core/dataset/store/searchTest';
import { postSearchText } from '@/web/core/dataset/api';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { formatTimeToChatTime } from '@/utils/tools';
import { getErrText } from '@fastgpt/global/common/error/utils';
import { useToast } from '@fastgpt/web/hooks/useToast';

View File

@@ -15,7 +15,6 @@ import { serviceSideProps } from '@/web/common/utils/i18n';
import { useTranslation } from 'next-i18next';
import { getTrainingQueueLen } from '@/web/core/dataset/api';
import MyTooltip from '@/components/MyTooltip';
import Script from 'next/script';
import CollectionCard from './components/CollectionCard';
import { useDatasetStore } from '@/web/core/dataset/store/dataset';
import { useUserStore } from '@/web/support/user/useUserStore';
@@ -24,8 +23,8 @@ import {
DatasetTypeEnum,
DatasetTypeMap
} from '@fastgpt/global/core/dataset/constants';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import DatasetTypeTag from '@/components/core/dataset/DatasetTypeTag';
import Head from 'next/head';
import MyBox from '@/components/common/MyBox';

View File

@@ -7,7 +7,7 @@ import { getErrText } from '@fastgpt/global/common/error/utils';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { useRouter } from 'next/router';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import Avatar from '@/components/Avatar';
import MyTooltip from '@/components/MyTooltip';
import MyModal from '@fastgpt/web/components/common/MyModal';

View File

@@ -18,7 +18,7 @@ import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants';
import { useTranslation } from 'next-i18next';
import { useQuery } from '@tanstack/react-query';
import { getDatasets, putDatasetById, getDatasetPaths } from '@/web/core/dataset/api';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
const MoveModal = ({
onClose,

View File

@@ -1,19 +1,9 @@
import React, { useMemo, useRef } from 'react';
import {
Box,
Flex,
Grid,
useTheme,
useDisclosure,
Card,
MenuButton,
Image,
Button
} from '@chakra-ui/react';
import { Box, Flex, Grid, useDisclosure, Image, Button } from '@chakra-ui/react';
import { useRouter } from 'next/router';
import { useDatasetStore } from '@/web/core/dataset/store/dataset';
import PageContainer from '@/components/PageContainer';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { AddIcon } from '@chakra-ui/icons';
import { useQuery } from '@tanstack/react-query';
import {
@@ -31,7 +21,7 @@ import dynamic from 'next/dynamic';
import { DatasetTypeEnum, DatasetTypeMap } from '@fastgpt/global/core/dataset/constants';
import { FolderImgUrl, FolderIcon } from '@fastgpt/global/common/file/image/constants';
import MyMenu from '@/components/MyMenu';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useEditTitle } from '@/web/common/hooks/useEditTitle';
import EditFolderModal, { useEditFolder } from '../component/EditFolderModal';
@@ -389,6 +379,7 @@ const Kb = () => {
{t('common.Delete')}
</Flex>
),
type: 'danger',
onClick: () => {
openConfirm(
() => onclickDelDataset(dataset._id),

View File

@@ -1,7 +1,7 @@
import React, { useCallback } from 'react';
import { Box, Flex, IconButton, useTheme, useDisclosure } from '@chakra-ui/react';
import { PluginItemSchema } from '@fastgpt/global/core/plugin/type';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { useTranslation } from 'next-i18next';
import { useCopyData } from '@/web/common/hooks/useCopyData';
import dynamic from 'next/dynamic';

View File

@@ -81,7 +81,7 @@ const Render = ({ pluginId }: Props) => {
export default function FlowEdit(props: any) {
return (
<FlowProvider mode={'plugin'} filterAppIds={[]}>
<FlowProvider mode={'plugin'}>
<Render {...props} />
</FlowProvider>
);

View File

@@ -7,13 +7,13 @@ import { getErrText } from '@fastgpt/global/common/error/utils';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { useRouter } from 'next/router';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { delOnePlugin, postCreatePlugin, putUpdatePlugin } from '@/web/core/plugin/api';
import Avatar from '@/components/Avatar';
import MyTooltip from '@/components/MyTooltip';
import MyModal from '@fastgpt/web/components/common/MyModal';
import { useTranslation } from 'next-i18next';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { customAlphabet } from 'nanoid';
import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants';

View File

@@ -21,7 +21,7 @@ import { useForm } from 'react-hook-form';
import { compressImgFileAndUpload } from '@/web/common/file/controller';
import { getErrText } from '@fastgpt/global/common/error/utils';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import Avatar from '@/components/Avatar';
import MyTooltip from '@/components/MyTooltip';
import { useTranslation } from 'next-i18next';
@@ -36,7 +36,7 @@ import {
} from '@/web/core/plugin/api';
import { str2OpenApiSchema } from '@fastgpt/global/core/plugin/httpPlugin/utils';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useConfirm } from '@/web/common/hooks/useConfirm';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { AddIcon } from '@chakra-ui/icons';
import MyModal from '@fastgpt/web/components/common/MyModal';
import { EditFormType } from './type';
@@ -100,12 +100,6 @@ const HttpPluginEditModal = ({
}
}, [apiSchemaStr, t, toast]);
const {
isOpen: isOpenUrlImport,
onOpen: onOpenUrlImport,
onClose: onCloseUrlImport
} = useDisclosure();
const { mutate: onCreate, isLoading: isCreating } = useRequest({
mutationFn: async (data: CreateOnePluginParams) => {
return postCreatePlugin(data);
@@ -194,8 +188,6 @@ const HttpPluginEditModal = ({
const schema = await getApiSchemaByUrl(schemaUrl);
setValue('metadata.apiSchemaStr', JSON.stringify(schema, null, 2));
onCloseUrlImport();
},
errorToast: t('plugin.Invalid Schema')
});
@@ -251,7 +243,13 @@ const HttpPluginEditModal = ({
<Box color={'myGray.800'} fontWeight={'bold'} mt={3}>
{t('plugin.Intro')}
</Box>
<Textarea {...register('intro')} bg={'myWhite.600'} rows={3} mt={3} />
<Textarea
{...register('intro')}
bg={'myWhite.600'}
rows={3}
mt={3}
placeholder={t('core.plugin.Http plugin intro placeholder')}
/>
</>
<Box mt={4}>
<Box
@@ -263,32 +261,24 @@ const HttpPluginEditModal = ({
<Box my={'auto'}>{'OpenAPI Schema'}</Box>
<Box>
{isOpenUrlImport ? (
<Flex alignItems={'center'}>
<Input
mr={2}
placeholder={'https://...'}
h={'30px'}
onBlur={(e) => setSchemaUrl(e.target.value)}
/>
<Button size={'sm'} isLoading={isLoadingUrlApi} onClick={onClickUrlLoadApi}>
{t('common.Confirm')}
</Button>
<Button ml={2} variant={'whiteBase'} size={'sm'} onClick={onCloseUrlImport}>
{t('common.Cancel')}
</Button>
</Flex>
) : (
<Flex alignItems={'center'}>
<Input
mr={2}
placeholder={t('plugin.Import from URL')}
h={'30px'}
w={['150px', '250px']}
fontSize={'sm'}
onBlur={(e) => setSchemaUrl(e.target.value)}
/>
<Button
variant={'whiteBase'}
size={'sm'}
fontSize={'xs'}
leftIcon={<AddIcon fontSize={'xs'} />}
onClick={onOpenUrlImport}
variant={'whitePrimary'}
isLoading={isLoadingUrlApi}
onClick={onClickUrlLoadApi}
>
{t('plugin.Import from URL')}
{t('common.Import')}
</Button>
)}
</Flex>
</Box>
</Box>
<Textarea
@@ -466,34 +456,42 @@ const HttpPluginEditModal = ({
<Box color={'myGray.800'} fontWeight={'bold'} mt={3}>
{t('plugin.Plugin List')}
</Box>
<TableContainer maxH={400} overflowY={'auto'} mt={3}>
<Table border={'1px solid'} borderColor={'myGray.200'}>
<Thead>
<Th>{t('Name')}</Th>
<Th>{t('plugin.Description')}</Th>
<Th>{t('plugin.Method')}</Th>
<Th>{t('plugin.Path')}</Th>
</Thead>
<Tbody>
{apiData?.pathData?.map((item, index) => (
<Tr key={index}>
<Td>{item.name}</Td>
<Td
fontSize={'sm'}
textColor={'gray.600'}
w={'auto'}
maxW={80}
whiteSpace={'pre-wrap'}
>
{item.description}
</Td>
<Td>{item.method}</Td>
<Td>{item.path}</Td>
</Tr>
))}
</Tbody>
</Table>
</TableContainer>
<Box
mt={3}
borderRadius={'md'}
overflow={'hidden'}
borderWidth={'1px'}
borderBottom="none"
>
<TableContainer maxH={400} overflowY={'auto'}>
<Table bg={'white'}>
<Thead bg={'myGray.50'}>
<Th>{t('Name')}</Th>
<Th>{t('plugin.Description')}</Th>
<Th>{t('plugin.Method')}</Th>
<Th>{t('plugin.Path')}</Th>
</Thead>
<Tbody>
{apiData?.pathData?.map((item, index) => (
<Tr key={index}>
<Td>{item.name}</Td>
<Td
fontSize={'sm'}
textColor={'gray.600'}
w={'auto'}
maxW={80}
whiteSpace={'pre-wrap'}
>
{item.description}
</Td>
<Td>{item.method}</Td>
<Td>{item.path}</Td>
</Tr>
))}
</Tbody>
</Table>
</TableContainer>
</Box>
</>
</ModalBody>

View File

@@ -35,7 +35,7 @@ const FAQ = () => {
},
{
title: '免费版数据会清除么?',
desc: '免费版用户(免费版且未购买额外套餐)15天无使用记录后,系统会自动清除账号下所有知识库内容。'
desc: '免费版用户(免费版且未购买额外套餐)30天无使用记录后,系统会自动清除账号下所有知识库内容。'
}
];

View File

@@ -7,7 +7,7 @@ import { postCheckStandardSub, postUpdateStandardSub } from '@/web/support/walle
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { standardSubLevelMap } from '@fastgpt/global/support/wallet/sub/constants';
import { StandardSubPlanParams } from '@fastgpt/global/support/wallet/sub/api';
import { useRequest } from '@/web/common/hooks/useRequest';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { StandardSubPlanUpdateResponse } from '@fastgpt/global/support/wallet/sub/api.d';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { formatStorePrice2Read } from '@fastgpt/global/support/wallet/usage/tools';