V4.8.17 feature (#3485)
* feat: add third party account config (#3443) * temp * editor workflow variable style * add team to dispatch * i18n * delete console * change openai account position * fix * fix * fix * fix * fix * 4.8.17 test (#3461) * perf: external provider config * perf: ui * feat: add template config (#3434) * change template position * template config * delete console * delete * fix * fix * perf: Mongo visutal field (#3464) * remve invalid code * perf: team member visutal code * perf: virtual search; perf: search test data * fix: ts * fix: image response headers * perf: template code * perf: auth layout;perf: auto save (#3472) * perf: auth layout * perf: auto save * perf: auto save * fix: template guide display & http input support external variables (#3475) * fix: template guide display * http editor support external workflow variables * perf: auto save;fix: ifelse checker line break; (#3478) * perf: auto save * perf: auto save * fix: ifelse checker line break * perf: doc * perf: doc * fix: update var type error * 4.8.17 test (#3479) * perf: auto save * perf: auto save * perf: template code * 4.8.17 test (#3480) * perf: auto save * perf: auto save * perf: model price model * feat: add react memo * perf: model provider filter * fix: ts (#3481) * perf: auto save * perf: auto save * fix: ts * simple app tool select (#3473) * workflow plugin userguide & simple tool ui * simple tool filter * reuse component * change component to hook * fix * perf: too selector modal (#3484) * perf: auto save * perf: auto save * perf: markdown render * perf: too selector * fix: app version require tmbId * perf: templates refresh * perf: templates refresh * hide auto save error tip * perf: toolkit guide --------- Co-authored-by: heheer <heheer@sealos.io>
This commit is contained in:
@@ -4,14 +4,14 @@ import type { FastGPTFeConfigsType } from '@fastgpt/global/common/system/types/i
|
||||
import type { FastGPTConfigFileType } from '@fastgpt/global/common/system/types/index.d';
|
||||
import { PluginSourceEnum } from '@fastgpt/global/core/plugin/constants';
|
||||
import { getFastGPTConfigFromDB } from '@fastgpt/service/common/system/config/controller';
|
||||
import { PluginTemplateType } from '@fastgpt/global/core/plugin/type';
|
||||
import { FastGPTProUrl } from '@fastgpt/service/common/system/constants';
|
||||
import { isProduction } from '@fastgpt/global/common/system/constants';
|
||||
import { initFastGPTConfig } from '@fastgpt/service/common/system/tools';
|
||||
import json5 from 'json5';
|
||||
import { SystemPluginTemplateItemType } from '@fastgpt/global/core/workflow/type';
|
||||
import { defaultGroup } from '@fastgpt/web/core/workflow/constants';
|
||||
import { defaultGroup, defaultTemplateTypes } from '@fastgpt/web/core/workflow/constants';
|
||||
import { MongoPluginGroups } from '@fastgpt/service/core/app/plugin/pluginGroupSchema';
|
||||
import { MongoTemplateTypes } from '@fastgpt/service/core/app/templates/templateTypeSchema';
|
||||
|
||||
export const readConfigData = (name: string) => {
|
||||
const splitName = name.split('.');
|
||||
@@ -164,7 +164,7 @@ function getSystemPlugin() {
|
||||
global.communityPlugins = fileTemplates;
|
||||
}
|
||||
|
||||
export async function initSystemPlugins() {
|
||||
export async function initSystemPluginGroups() {
|
||||
try {
|
||||
const { groupOrder, ...restDefaultGroup } = defaultGroup;
|
||||
await MongoPluginGroups.updateOne(
|
||||
@@ -182,3 +182,27 @@ export async function initSystemPlugins() {
|
||||
console.error('Error initializing system plugins:', error);
|
||||
}
|
||||
}
|
||||
|
||||
export async function initAppTemplateTypes() {
|
||||
try {
|
||||
await Promise.all(
|
||||
defaultTemplateTypes.map((templateType) => {
|
||||
const { typeOrder, ...rest } = templateType;
|
||||
|
||||
return MongoTemplateTypes.updateOne(
|
||||
{
|
||||
typeId: templateType.typeId
|
||||
},
|
||||
{
|
||||
$set: rest
|
||||
},
|
||||
{
|
||||
upsert: true
|
||||
}
|
||||
);
|
||||
})
|
||||
);
|
||||
} catch (error) {
|
||||
console.error('Error initializing system templates:', error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,11 +4,14 @@ import { createDatasetTrainingMongoWatch } from '@/service/core/dataset/training
|
||||
import { MongoSystemConfigs } from '@fastgpt/service/common/system/config/schema';
|
||||
import { MongoSystemPlugin } from '@fastgpt/service/core/app/plugin/systemPluginSchema';
|
||||
import { debounce } from 'lodash';
|
||||
import { MongoAppTemplate } from '@fastgpt/service/core/app/templates/templateSchema';
|
||||
import { getAppTemplatesAndLoadThem } from '@fastgpt/templates/register';
|
||||
|
||||
export const startMongoWatch = async () => {
|
||||
reloadConfigWatch();
|
||||
refetchSystemPlugins();
|
||||
createDatasetTrainingMongoWatch();
|
||||
refetchAppTemplates();
|
||||
};
|
||||
|
||||
const reloadConfigWatch = () => {
|
||||
@@ -38,3 +41,18 @@ const refetchSystemPlugins = () => {
|
||||
}, 500)
|
||||
);
|
||||
};
|
||||
|
||||
const refetchAppTemplates = () => {
|
||||
const changeStream = MongoAppTemplate.watch();
|
||||
|
||||
changeStream.on(
|
||||
'change',
|
||||
debounce(async (change) => {
|
||||
setTimeout(() => {
|
||||
try {
|
||||
getAppTemplatesAndLoadThem(true);
|
||||
} catch (error) {}
|
||||
}, 5000);
|
||||
}, 500)
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
import { isProduction } from '@fastgpt/global/common/system/constants';
|
||||
import { readdirSync, readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
// Get template from memory or file system
|
||||
const loadTemplateMarketItems = async () => {
|
||||
if (isProduction && global.appMarketTemplates) return global.appMarketTemplates;
|
||||
|
||||
const templatesDir = path.join(process.cwd(), 'public', 'appMarketTemplates');
|
||||
const templateNames = readdirSync(templatesDir);
|
||||
|
||||
global.appMarketTemplates = templateNames.map((name) => {
|
||||
try {
|
||||
const filePath = path.join(templatesDir, name, 'template.json');
|
||||
const fileContent = readFileSync(filePath, 'utf-8');
|
||||
const data = JSON.parse(fileContent);
|
||||
return {
|
||||
id: name,
|
||||
...data
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`Error fetching template ${name}:`, error);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
global.appMarketTemplates.sort((a, b) => (b.weight ?? 0) - (a.weight ?? 0));
|
||||
|
||||
return global.appMarketTemplates;
|
||||
};
|
||||
|
||||
export const getTemplateMarketItemDetail = async (id: string) => {
|
||||
const templateMarketItems = await loadTemplateMarketItems();
|
||||
return templateMarketItems.find((item) => item.id === id);
|
||||
};
|
||||
|
||||
export const getTemplateMarketItemList = async () => {
|
||||
const templateMarketItems = await loadTemplateMarketItems();
|
||||
return templateMarketItems.map((item) => ({
|
||||
id: item.id,
|
||||
name: item.name,
|
||||
avatar: item.avatar,
|
||||
intro: item.intro,
|
||||
author: item.author,
|
||||
tags: item.tags,
|
||||
type: item.type
|
||||
}));
|
||||
};
|
||||
@@ -1,4 +1,4 @@
|
||||
import { getUserChatInfoAndAuthTeamPoints } from '@/service/support/permission/auth/team';
|
||||
import { getUserChatInfoAndAuthTeamPoints } from '@fastgpt/service/support/permission/auth/team';
|
||||
import { pushChatUsage } from '@/service/support/wallet/usage/push';
|
||||
import { getNextTimeByCronStringAndTimezone } from '@fastgpt/global/common/string/time';
|
||||
import { getNanoid } from '@fastgpt/global/common/string/tools';
|
||||
@@ -39,7 +39,7 @@ export const getScheduleTriggerApp = async () => {
|
||||
if (!app.scheduledTriggerConfig) return;
|
||||
// random delay 0 ~ 60s
|
||||
await delay(Math.floor(Math.random() * 60 * 1000));
|
||||
const { user } = await getUserChatInfoAndAuthTeamPoints(app.tmbId);
|
||||
const { timezone, externalProvider } = await getUserChatInfoAndAuthTeamPoints(app.tmbId);
|
||||
|
||||
// Get app latest version
|
||||
const { nodes, edges, chatConfig } = await getAppLatestVersion(app._id, app);
|
||||
@@ -57,7 +57,8 @@ export const getScheduleTriggerApp = async () => {
|
||||
const { flowUsages, assistantResponses, flowResponses } = await retryFn(() => {
|
||||
return dispatchWorkFlow({
|
||||
chatId,
|
||||
user,
|
||||
timezone,
|
||||
externalProvider,
|
||||
mode: 'chat',
|
||||
runningAppInfo: {
|
||||
id: String(app._id),
|
||||
|
||||
@@ -7,7 +7,7 @@ import type {
|
||||
} from '@fastgpt/global/support/outLink/api.d';
|
||||
import { ShareChatAuthProps } from '@fastgpt/global/support/permission/chat';
|
||||
import { authOutLinkValid } from '@fastgpt/service/support/permission/publish/authLink';
|
||||
import { getUserChatInfoAndAuthTeamPoints } from '@/service/support/permission/auth/team';
|
||||
import { getUserChatInfoAndAuthTeamPoints } from '@fastgpt/service/support/permission/auth/team';
|
||||
import { AuthUserTypeEnum } from '@fastgpt/global/support/permission/constant';
|
||||
import { OutLinkErrEnum } from '@fastgpt/global/common/error/code/outLink';
|
||||
import { OutLinkSchema } from '@fastgpt/global/support/outLink/type';
|
||||
@@ -57,7 +57,7 @@ export async function authOutLinkChatStart({
|
||||
const { outLinkConfig, appId } = await authOutLinkValid({ shareId });
|
||||
|
||||
// check ai points and chat limit
|
||||
const [{ user }, { uid }] = await Promise.all([
|
||||
const [{ timezone, externalProvider }, { uid }] = await Promise.all([
|
||||
getUserChatInfoAndAuthTeamPoints(outLinkConfig.tmbId),
|
||||
authOutLinkChatLimit({ outLink: outLinkConfig, ip, outLinkUid, question })
|
||||
]);
|
||||
@@ -69,7 +69,8 @@ export async function authOutLinkChatStart({
|
||||
authType: AuthUserTypeEnum.token,
|
||||
responseDetail: outLinkConfig.responseDetail,
|
||||
showNodeStatus: outLinkConfig.showNodeStatus,
|
||||
user,
|
||||
timezone,
|
||||
externalProvider,
|
||||
appId,
|
||||
uid
|
||||
};
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
import { UserErrEnum } from '@fastgpt/global/common/error/code/user';
|
||||
import { TeamMemberWithUserSchema } from '@fastgpt/global/support/user/team/type';
|
||||
import { MongoTeamMember } from '@fastgpt/service/support/user/team/teamMemberSchema';
|
||||
import { checkTeamAIPoints } from '@fastgpt/service/support/permission/teamLimit';
|
||||
import { GET } from '@fastgpt/service/common/api/plusRequest';
|
||||
import {
|
||||
AuthTeamTagTokenProps,
|
||||
@@ -9,20 +6,6 @@ import {
|
||||
} from '@fastgpt/global/support/user/team/tag';
|
||||
import { TeamMemberRoleEnum } from '@fastgpt/global/support/user/team/constant';
|
||||
|
||||
export async function getUserChatInfoAndAuthTeamPoints(tmbId: string) {
|
||||
const tmb = (await MongoTeamMember.findById(tmbId, 'teamId userId').populate(
|
||||
'userId',
|
||||
'timezone openaiAccount'
|
||||
)) as TeamMemberWithUserSchema;
|
||||
if (!tmb) return Promise.reject(UserErrEnum.unAuthUser);
|
||||
|
||||
await checkTeamAIPoints(tmb.teamId);
|
||||
|
||||
return {
|
||||
user: tmb.userId
|
||||
};
|
||||
}
|
||||
|
||||
export function authTeamTagToken(data: AuthTeamTagTokenProps) {
|
||||
return GET<AuthTokenFromTeamDomainResponse['data']>('/support/user/team/tag/authTeamToken', data);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user