mirror of
https://github.com/labring/FastGPT.git
synced 2026-05-05 01:02:59 +08:00
V4.14.7 features (#6406)
* Agent features (#6345) * Test agent (#6220) * squash: compress all commits into one * feat: plan response in ui * response ui * perf: agent config * merge * tool select ux * perf: chat ui * perf: agent editform * tmp code * feat: save chat * Complete agent parent (#6049) * add role and tools filling * add: file-upload --------- Co-authored-by: xxyyh <2289112474@qq> * perf: top agent code * top agent (#6062) Co-authored-by: xxyyh <2289112474@qq> * fix: ts * skill editor ui * ui * perf: rewrite type with zod * skill edit ui * skill agent (#6089) * cp skill chat * rebasefdf933dand add skill chat * 1. skill 的 CRUD 2. skill 的信息渲染到前端界面 * solve comment * remove chatid and chatItemId * skill match * perf: skill manage * fix: ts --------- Co-authored-by: xxyyh <2289112474@qq> Co-authored-by: archer <545436317@qq.com> * fix: ts * fix: loop import * skill tool config (#6114) Co-authored-by: xxyyh <2289112474@qq> * feat: load tool in agent * skill memory (#6126) Co-authored-by: xxyyh <2289112474@qq> * perf: agent skill editor * perf: helperbot ui * agent code * perf: context * fix: request context * agent usage * perf: agent context and pause * perf: plan response * Test agent sigle skill (#6184) * feat:top box fill * prompt fix --------- Co-authored-by: xxyyh <2289112474@qq> * perf: agent chat ui * Test agent new (#6219) * have-replan * agent --------- Co-authored-by: xxyyh <2289112474@qq> * fix: ts --------- Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com> Co-authored-by: xxyyh <2289112474@qq> * feat: consolidate agent and MCP improvements This commit consolidates 17 commits including: - MCP tools enhancements and fixes - Agent system improvements and optimizations - Auth limit and prompt updates - Tool response compression and error tracking - Simple app adaptation - Code quality improvements (TypeScript, ESLint, Zod) - Version type migration to schema - Remove deprecated useRequest2 - Add LLM error tracking - Toolset ID validation fixes --------- Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com> Co-authored-by: xxyyh <2289112474@qq> * fix: transform avatar copy;perf: filter invalid tool * update llm response storage time * fix: openapi schema * update skill desc * feat: cache hit data * i18n * lock * chat logs support error filter & user search (#6373) * chat log support searching by user name * support error filter * fix * fix overflow * optimize * fix init script * fix * perf: get log users * updat ecomment * fix: ts * fix: test --------- Co-authored-by: archer <545436317@qq.com> * Fix: agent (#6376) * Agent features (#6345) * Test agent (#6220) * squash: compress all commits into one * feat: plan response in ui * response ui * perf: agent config * merge * tool select ux * perf: chat ui * perf: agent editform * tmp code * feat: save chat * Complete agent parent (#6049) * add role and tools filling * add: file-upload --------- Co-authored-by: xxyyh <2289112474@qq> * perf: top agent code * top agent (#6062) Co-authored-by: xxyyh <2289112474@qq> * fix: ts * skill editor ui * ui * perf: rewrite type with zod * skill edit ui * skill agent (#6089) * cp skill chat * rebasefdf933dand add skill chat * 1. skill 的 CRUD 2. skill 的信息渲染到前端界面 * solve comment * remove chatid and chatItemId * skill match * perf: skill manage * fix: ts --------- Co-authored-by: xxyyh <2289112474@qq> Co-authored-by: archer <545436317@qq.com> * fix: ts * fix: loop import * skill tool config (#6114) Co-authored-by: xxyyh <2289112474@qq> * feat: load tool in agent * skill memory (#6126) Co-authored-by: xxyyh <2289112474@qq> * perf: agent skill editor * perf: helperbot ui * agent code * perf: context * fix: request context * agent usage * perf: agent context and pause * perf: plan response * Test agent sigle skill (#6184) * feat:top box fill * prompt fix --------- Co-authored-by: xxyyh <2289112474@qq> * perf: agent chat ui * Test agent new (#6219) * have-replan * agent --------- Co-authored-by: xxyyh <2289112474@qq> * fix: ts --------- Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com> Co-authored-by: xxyyh <2289112474@qq> * feat: consolidate agent and MCP improvements This commit consolidates 17 commits including: - MCP tools enhancements and fixes - Agent system improvements and optimizations - Auth limit and prompt updates - Tool response compression and error tracking - Simple app adaptation - Code quality improvements (TypeScript, ESLint, Zod) - Version type migration to schema - Remove deprecated useRequest2 - Add LLM error tracking - Toolset ID validation fixes --------- Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com> Co-authored-by: xxyyh <2289112474@qq> * 1. 把辅助生成前端上的 system prompt 加入到上下文中 2. mcp工具的前端渲染(图标) 3. 文件读取工具和文件上传进行关联 4. 添加了辅助生成返回格式出错的重试方案 5. ask 不出现在 plan 步骤中 6. 添加了辅助生成的头像和交互 UI * fix:read_file * helperbot ui * ts error * helper ui * delete Unused import * perf: helper bot * lock --------- Co-authored-by: Archer <545436317@qq.com> Co-authored-by: xxyyh <2289112474@qq> * fix date variable required & model auth (#6386) * fix date variable required & model auth * doc * feat: add chat id to finish callback * fix: iphone safari shareId (#6387) * fix: iphone safari shareId * fix: mcp file list can't setting * fix: reason output field * fix: skip JSON validation for HTTP tool body with variable (#6392) * fix: skip JSON validation for HTTP tool body with variable * doc * workflow fitview * perf: selecting memory * perf: cp api * ui * perf: toolcall auto adapt * fix: catch workflow error * fix: ts * perf: pagination type * remove * ignore * update doc * fix: simple app tool select * add default avatar to logs user * perf: loading user * select dataset ui * rename version * feat: add global/common test * perf: packages/global/common test * feat: package/global/ai,app test * add global/chat test * global/core test * global/core test * feat: packages/global all test * perf: test * add server api test * perf: init shell * perf: init4150 shell * remove invalid code * update doc * remove log * fix: chat effect * fix: plan fake tool (#6398) * 1. 提示词防注入功能 2. 无工具不进入 plan,防止虚拟工具生成 * Agent-dataset * dataset * dataset presetInfo * prefix * perf: prompt --------- Co-authored-by: xxyyh <2289112474@qq> Co-authored-by: archer <545436317@qq.com> * fix: review * adapt kimi2.5 think toolcall * feat: invoke fastgpt user info (#6403) feat: invoke fastgpt user info * fix: invoke fastgpt user info return orgs (#6404) * skill and version * retry helperbot (#6405) Co-authored-by: xxyyh <2289112474@qq> * update template * remove log * doc * update doc * doc * perf: internal ip check * adapt get paginationRecords * tool call adapt * fix: test * doc * fix: agent initial version * adapt completions v1 * feat: instrumentation check * rename skill * add workflow demo mode tracks (#6407) * chore: 统一 skills 目录命名为小写 将 .claude/Skills/ 重命名为 .claude/skills/ 以保持命名一致性。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * add workflow demo mode tracks * code * optimize * fix: improve workflowDemoTrack based on PR review - Add comment to empty catch block for maintainability - Add @param docs to onDemoChange clarifying nodeCount usage - Replace silent .catch with console.debug for dev debugging - Handle appId changes by reporting old data before re-init Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: archer <545436317@qq.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * remove repeat skill * fix(workflow): filter out orphan edges to prevent runtime errors (#6399) * fix(workflow): filter out orphan edges to prevent runtime errors Runtime edges that reference non-existent nodes (orphan edges) can cause unexpected behavior or crashes during workflow dispatch. This change adds a pre-check to filter out such edges before execution begins, ensuring system stability even with inconsistent graph data. * fix(workflow): enhance orphan edge filtering with logging and tests - Refactor: Extract logic to 'filterOrphanEdges' in utils.ts for better reusability - Feat: Add performance monitoring (warn if >100ms) and comprehensive logging - Feat: Support detailed edge inspection in debug mode - Docs: Add JSDoc explaining causes of orphan edges (migration, manual edits) - Test: Add unit tests covering edge cases and performance (1000 edges) Addresses PR review feedback regarding logging, variable naming, and testing." * move code * move code * add more unit test --------- Co-authored-by: archer <545436317@qq.com> * test * perf: test * add server/common/string test * fix: resolve $ref references in MCP tool input schemas (#6395) (#6409) * fix: resolve $ref references in MCP tool input schemas (#6395) * add test code --------- Co-authored-by: archer <545436317@qq.com> * chore(docs): add fastgpt, fastgpt-plugin version choice guide (#6411) * chore(doc): add fastgpt version description * doc * doc --------- Co-authored-by: archer <545436317@qq.com> * fix:dataset cite and description info (#6410) * 1. 添加知识库引用(plan 步骤和直接知识库调用) 2. 提示词框中的@知识库工具 3. plan 中 step 的 description dataset_search 改为中文 * fix: i18n * prompt * prompt --------- Co-authored-by: xxyyh <2289112474@qq> * fix: tool call * perf: workflow props * fix: merge ECharts toolbox options instead of overwriting (#6269) (#6412) * feat: integrate logtape and otel (#6400) * fix: deps * feat(logger): integrate logtape and otel * wip(log): add basic infras logs * wip(log): add request id and inject it into context * wip(log): add basic tx logs * wip(log): migrate * wip(log): category * wip(log): more sub category * fix: type * fix: sessionRun * fix: export getLogger from client.ts * chore: improve logs * docs: update signoz and changelog * change type * fix: ts * remove skill.md * fix: lockfile specifier * fix: test --------- Co-authored-by: archer <545436317@qq.com> * init log * doc * remove invalid log * fix: review * template * replace new log * fix: ts * remove log * chore: migrate all addLog to logtape * move skill * chore: migrate all addLog to logtape (#6417) * update skill * remove log * fix: tool check --------- Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com> Co-authored-by: xxyyh <2289112474@qq> Co-authored-by: heheer <heheer@sealos.io> Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: xuyafei1996 <54217479+xuyafei1996@users.noreply.github.com> Co-authored-by: ToukoYui <2331631097@qq.com> Co-authored-by: roy <whoeverimf5@gmail.com>
This commit is contained in:
@@ -53,9 +53,4 @@ const McpKeySchema = new Schema({
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
|
||||
export const MongoMcpKey = getMongoModel<McpKeyType>(mcpCollectionName, McpKeySchema);
|
||||
|
||||
@@ -5,6 +5,7 @@ import {
|
||||
TeamCollectionName,
|
||||
TeamMemberCollectionName
|
||||
} from '@fastgpt/global/support/user/team/constant';
|
||||
import { getLogger, LogCategories } from '../../common/logger';
|
||||
|
||||
const OpenApiSchema = new Schema(
|
||||
{
|
||||
@@ -61,7 +62,8 @@ try {
|
||||
OpenApiSchema.index({ teamId: 1 });
|
||||
OpenApiSchema.index({ apiKey: 1 });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build OpenAPI indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoOpenApi = getMongoModel<OpenApiSchema>('openapi', OpenApiSchema);
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
import { MongoOpenApi } from './schema';
|
||||
import { getLogger, LogCategories } from '../../common/logger';
|
||||
|
||||
const logger = getLogger(LogCategories.MODULE.OPENAPI.TOOLS);
|
||||
|
||||
export function updateApiKeyUsedTime(id: string) {
|
||||
MongoOpenApi.findByIdAndUpdate(id, {
|
||||
lastUsedTime: new Date()
|
||||
}).catch((err) => {
|
||||
console.log('update apiKey used time error', err);
|
||||
logger.error('Failed to update API key last used time', { apiKeyId: id, error: err });
|
||||
});
|
||||
}
|
||||
|
||||
@@ -23,6 +26,6 @@ export function updateApiKeyUsage({
|
||||
}
|
||||
}
|
||||
).catch((err) => {
|
||||
console.log('update apiKey totalPoints error', err);
|
||||
logger.error('Failed to update API key usage points', { apikey, error: err });
|
||||
});
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import {
|
||||
TeamMemberCollectionName
|
||||
} from '@fastgpt/global/support/user/team/constant';
|
||||
import { AppCollectionName } from '../../core/app/schema';
|
||||
import { getLogger, LogCategories } from '../../common/logger';
|
||||
|
||||
const OutLinkSchema = new Schema({
|
||||
shareId: {
|
||||
@@ -104,11 +105,13 @@ OutLinkSchema.virtual('associatedApp', {
|
||||
justOne: true
|
||||
});
|
||||
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
|
||||
try {
|
||||
OutLinkSchema.index({ shareId: -1 });
|
||||
OutLinkSchema.index({ teamId: 1, tmbId: 1, appId: 1 });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logger.error('Failed to build outlink indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoOutLink = getMongoModel<SchemaType>('outlinks', OutLinkSchema);
|
||||
|
||||
@@ -2,6 +2,9 @@ import { axios } from '../../common/api/axios';
|
||||
import { MongoOutLink } from './schema';
|
||||
import { FastGPTProUrl } from '../../common/system/constants';
|
||||
import { type ChatHistoryItemResType } from '@fastgpt/global/core/chat/type';
|
||||
import { getLogger, LogCategories } from '../../common/logger';
|
||||
|
||||
const logger = getLogger(LogCategories.MODULE.OUTLINK.TOOLS);
|
||||
|
||||
export const addOutLinkUsage = ({
|
||||
shareId,
|
||||
@@ -17,18 +20,20 @@ export const addOutLinkUsage = ({
|
||||
lastTime: new Date()
|
||||
}
|
||||
).catch((err) => {
|
||||
console.log('update shareChat error', err);
|
||||
logger.error('Failed to update outlink usage', { shareId, error: err });
|
||||
});
|
||||
};
|
||||
|
||||
export const pushResult2Remote = async ({
|
||||
outLinkUid,
|
||||
shareId,
|
||||
chatId,
|
||||
outLinkUid,
|
||||
appName,
|
||||
flowResponses
|
||||
}: {
|
||||
shareId: string;
|
||||
chatId: string;
|
||||
outLinkUid?: string; // raw id, not parse
|
||||
shareId?: string;
|
||||
appName: string;
|
||||
flowResponses?: ChatHistoryItemResType[];
|
||||
}) => {
|
||||
@@ -46,8 +51,11 @@ export const pushResult2Remote = async ({
|
||||
data: {
|
||||
token: outLinkUid,
|
||||
appName,
|
||||
responseData: flowResponses
|
||||
responseData: flowResponses,
|
||||
chatId
|
||||
}
|
||||
});
|
||||
} catch (error) {}
|
||||
} catch (error) {
|
||||
logger.error('Failed to push outlink result to remote hook', { shareId, error });
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Auth app permission */
|
||||
import { MongoApp } from '../../../core/app/schema';
|
||||
import { type AppDetailType } from '@fastgpt/global/core/app/type.d';
|
||||
import { type AppDetailType } from '@fastgpt/global/core/app/type';
|
||||
import {
|
||||
NullRoleVal,
|
||||
PerResourceTypeEnum,
|
||||
@@ -30,10 +30,10 @@ export const authPluginByTmbId = async ({
|
||||
appId: string;
|
||||
per: PermissionValueType;
|
||||
}) => {
|
||||
const { source } = splitCombineToolId(appId);
|
||||
if (source === AppToolSourceEnum.personal) {
|
||||
const { authAppId } = splitCombineToolId(appId);
|
||||
if (authAppId) {
|
||||
const { app } = await authAppByTmbId({
|
||||
appId,
|
||||
appId: authAppId,
|
||||
tmbId,
|
||||
per
|
||||
});
|
||||
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
} from '@fastgpt/global/support/permission/utils';
|
||||
import type { CollaboratorItemType } from '@fastgpt/global/support/permission/collaborator';
|
||||
import { pickCollaboratorIdFields } from './utils';
|
||||
import { getLogger, LogCategories } from '../../common/logger';
|
||||
|
||||
export type SyncChildrenPermissionResourceType = {
|
||||
_id: string;
|
||||
@@ -213,6 +214,7 @@ export async function resumeInheritPermission({
|
||||
resourceModel: typeof Model;
|
||||
session?: ClientSession;
|
||||
}) {
|
||||
const logger = getLogger(LogCategories.MODULE.PERMISSION.INHERIT);
|
||||
const isFolder = folderTypeList.includes(resource.type);
|
||||
// Folder resource, need to sync children
|
||||
const [parentClbs, oldMyClbs] = await Promise.all([
|
||||
@@ -239,7 +241,11 @@ export async function resumeInheritPermission({
|
||||
);
|
||||
if (parentManage) parentManage.permission = ManageRoleVal;
|
||||
|
||||
console.log(collaborators);
|
||||
logger.debug('Resuming inherited permissions', {
|
||||
resourceId: resource._id,
|
||||
resourceType,
|
||||
collaboratorCount: collaborators.length
|
||||
});
|
||||
|
||||
const fn = async (session: ClientSession) => {
|
||||
if (isFolder) {
|
||||
|
||||
@@ -3,6 +3,7 @@ import { connectionMongo, getMongoModel } from '../../../common/mongo';
|
||||
import { MemberGroupCollectionName } from './memberGroupSchema';
|
||||
import { type GroupMemberSchemaType } from '@fastgpt/global/support/permission/memberGroup/type';
|
||||
import { GroupMemberRole } from '@fastgpt/global/support/permission/memberGroup/constant';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
const { Schema } = connectionMongo;
|
||||
|
||||
export const GroupMemberCollectionName = 'team_group_members';
|
||||
@@ -33,6 +34,8 @@ GroupMemberSchema.virtual('group', {
|
||||
justOne: true
|
||||
});
|
||||
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
|
||||
try {
|
||||
GroupMemberSchema.index({
|
||||
groupId: 1
|
||||
@@ -42,7 +45,7 @@ try {
|
||||
tmbId: 1
|
||||
});
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logger.error('Failed to build group member indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoGroupMemberModel = getMongoModel<GroupMemberSchemaType>(
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { TeamCollectionName } from '@fastgpt/global/support/user/team/constant';
|
||||
import { connectionMongo, getMongoModel } from '../../../common/mongo';
|
||||
import { type MemberGroupSchemaType } from '@fastgpt/global/support/permission/memberGroup/type';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
const { Schema } = connectionMongo;
|
||||
|
||||
export const MemberGroupCollectionName = 'team_member_groups';
|
||||
@@ -32,6 +33,8 @@ export const MemberGroupSchema = new Schema(
|
||||
}
|
||||
);
|
||||
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
|
||||
try {
|
||||
MemberGroupSchema.index(
|
||||
{
|
||||
@@ -43,7 +46,7 @@ try {
|
||||
}
|
||||
);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logger.error('Failed to build member group indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoMemberGroupModel = getMongoModel<MemberGroupSchemaType>(
|
||||
|
||||
@@ -35,6 +35,7 @@ export const getMyModels = async ({
|
||||
resourceType: PerResourceTypeEnum.model
|
||||
}).lean();
|
||||
|
||||
// 未配置权限的,默认是有权限
|
||||
const permissionConfiguredModelSet = new Set(rps.map((rp) => rp.resourceName));
|
||||
const unconfiguredModels = global.systemModelList.filter(
|
||||
(model) => !permissionConfiguredModelSet.has(model.model)
|
||||
|
||||
@@ -5,6 +5,7 @@ import {
|
||||
TeamMemberCollectionName
|
||||
} from '@fastgpt/global/support/user/team/constant';
|
||||
import { type OrgMemberSchemaType } from '@fastgpt/global/support/user/team/org/type';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
const { Schema } = connectionMongo;
|
||||
|
||||
export const OrgMemberCollectionName = 'team_org_members';
|
||||
@@ -40,6 +41,8 @@ OrgMemberSchema.virtual('org', {
|
||||
justOne: true
|
||||
});
|
||||
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
|
||||
try {
|
||||
OrgMemberSchema.index(
|
||||
{
|
||||
@@ -56,7 +59,7 @@ try {
|
||||
tmbId: 1
|
||||
});
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logger.error('Failed to build org member indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoOrgMemberModel = getMongoModel<OrgMemberSchemaType>(
|
||||
|
||||
@@ -5,6 +5,7 @@ import { connectionMongo, getMongoModel } from '../../../common/mongo';
|
||||
import { OrgMemberCollectionName } from './orgMemberSchema';
|
||||
import { getNanoid } from '@fastgpt/global/common/string/tools';
|
||||
import { DEFAULT_ORG_AVATAR } from '@fastgpt/global/common/system/constants';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
const { Schema } = connectionMongo;
|
||||
|
||||
export const OrgSchema = new Schema(
|
||||
@@ -56,6 +57,8 @@ OrgSchema.virtual('members', {
|
||||
}
|
||||
});
|
||||
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
|
||||
try {
|
||||
OrgSchema.index({
|
||||
teamId: 1,
|
||||
@@ -71,7 +74,7 @@ try {
|
||||
}
|
||||
);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logger.error('Failed to build org indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoOrgModel = getMongoModel<OrgSchemaType>(OrgCollectionName, OrgSchema);
|
||||
|
||||
@@ -3,6 +3,7 @@ import {
|
||||
TeamMemberCollectionName
|
||||
} from '@fastgpt/global/support/user/team/constant';
|
||||
import { connectionMongo, getMongoModel } from '../../common/mongo';
|
||||
import { getLogger, LogCategories } from '../../common/logger';
|
||||
import type { ResourcePermissionType } from '@fastgpt/global/support/permission/type';
|
||||
import { PerResourceTypeEnum } from '@fastgpt/global/support/permission/constant';
|
||||
import { MemberGroupCollectionName } from './memberGroup/memberGroupSchema';
|
||||
@@ -237,7 +238,8 @@ try {
|
||||
}
|
||||
);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build permission indexes', { error });
|
||||
}
|
||||
|
||||
ResourcePermissionSchema.pre('save', function (next) {
|
||||
|
||||
@@ -55,7 +55,7 @@ export const checkTeamAppTypeLimit = async ({
|
||||
MongoApp.countDocuments({
|
||||
teamId,
|
||||
type: {
|
||||
$in: [AppTypeEnum.simple, AppTypeEnum.workflow]
|
||||
$in: [AppTypeEnum.chatAgent, AppTypeEnum.simple, AppTypeEnum.workflow]
|
||||
}
|
||||
})
|
||||
]);
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import type { TmpDataEnum } from '@fastgpt/global/support/tmpData/constant';
|
||||
import type { TmpDataEnum } from '@fastgpt/global/support/tmpData/constants';
|
||||
import {
|
||||
TmpDataExpireTime,
|
||||
type TmpDataMetadata,
|
||||
type TmpDataType
|
||||
} from '@fastgpt/global/support/tmpData/constant';
|
||||
} from '@fastgpt/global/support/tmpData/constants';
|
||||
import { MongoTmpData } from './schema';
|
||||
import { type TmpDataSchema } from '@fastgpt/global/support/tmpData/type';
|
||||
import { addMilliseconds } from 'date-fns';
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { getMongoModel, Schema } from '../../common/mongo';
|
||||
import type { TmpDataSchema as SchemaType } from '@fastgpt/global/support/tmpData/type';
|
||||
import { getLogger, LogCategories } from '../../common/logger';
|
||||
|
||||
const collectionName = 'tmp_datas';
|
||||
|
||||
@@ -22,7 +23,8 @@ try {
|
||||
TmpDataSchema.index({ dataId: -1 });
|
||||
TmpDataSchema.index({ expireAt: -1 }, { expireAfterSeconds: 5 });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build tmp data indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoTmpData = getMongoModel<SchemaType<Object>>(collectionName, TmpDataSchema);
|
||||
|
||||
@@ -13,6 +13,7 @@ import { retryFn } from '@fastgpt/global/common/system/utils';
|
||||
export function getI18nAppType(type: AppTypeEnum): string {
|
||||
if (type === AppTypeEnum.folder) return i18nT('account_team:type.Folder');
|
||||
if (type === AppTypeEnum.simple) return i18nT('app:type.Chat_Agent');
|
||||
if (type === AppTypeEnum.chatAgent) return 'Agent';
|
||||
if (type === AppTypeEnum.workflow) return i18nT('account_team:type.Workflow bot');
|
||||
if (type === AppTypeEnum.workflowTool) return i18nT('app:toolType_workflow');
|
||||
if (type === AppTypeEnum.httpPlugin) return i18nT('account_team:type.Http plugin');
|
||||
|
||||
@@ -3,6 +3,7 @@ const { Schema } = connectionMongo;
|
||||
import type { UserAuthSchemaType } from '@fastgpt/global/support/user/auth/type';
|
||||
import { userAuthTypeMap } from '@fastgpt/global/support/user/auth/constants';
|
||||
import { addMinutes } from 'date-fns';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
const UserAuthSchema = new Schema({
|
||||
key: {
|
||||
@@ -35,7 +36,8 @@ try {
|
||||
UserAuthSchema.index({ key: 1, type: 1 });
|
||||
UserAuthSchema.index({ expiredTime: 1 }, { expireAfterSeconds: 0 });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build user auth indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoUserAuth = getMongoModel<UserAuthSchemaType>('auth_codes', UserAuthSchema);
|
||||
|
||||
@@ -5,6 +5,7 @@ import { UserTagsEnum, type UserModelSchema } from '@fastgpt/global/support/user
|
||||
import { UserStatusEnum, userStatusMap } from '@fastgpt/global/support/user/constant';
|
||||
import { TeamMemberCollectionName } from '@fastgpt/global/support/user/team/constant';
|
||||
import { LangEnum } from '@fastgpt/global/common/i18n/type';
|
||||
import { getLogger, LogCategories } from '../../common/logger';
|
||||
|
||||
export const userCollectionName = 'users';
|
||||
|
||||
@@ -79,7 +80,8 @@ try {
|
||||
// Admin charts
|
||||
UserSchema.index({ createTime: -1 });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build user indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoUser = getMongoModel<UserModelSchema>(userCollectionName, UserSchema);
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import { retryFn } from '@fastgpt/global/common/system/utils';
|
||||
import { getAllKeysByPrefix, getGlobalRedisConnection } from '../../common/redis';
|
||||
import { addLog } from '../../common/system/log';
|
||||
import { ERROR_ENUM } from '@fastgpt/global/common/error/errorCode';
|
||||
import { getNanoid } from '@fastgpt/global/common/string/tools';
|
||||
import { getLogger, LogCategories } from '../../common/logger';
|
||||
|
||||
const logger = getLogger(LogCategories.MODULE.USER.ACCOUNT);
|
||||
|
||||
const redisPrefix = 'session:';
|
||||
const getSessionKey = (key: string) => `${redisPrefix}${key}`;
|
||||
@@ -46,7 +48,7 @@ const setSession = async ({
|
||||
await redis.expire(formatKey, expireSeconds);
|
||||
}
|
||||
} catch (error) {
|
||||
addLog.error('Set session error:', error);
|
||||
logger.error('Failed to set session', { error });
|
||||
return Promise.reject(error);
|
||||
}
|
||||
});
|
||||
@@ -78,7 +80,7 @@ const getSession = async (key: string): Promise<SessionType> => {
|
||||
ip: data.ip
|
||||
};
|
||||
} catch (error) {
|
||||
addLog.error('Parse session error:', error);
|
||||
logger.error('Failed to parse session', { error });
|
||||
delSession(formatKey);
|
||||
return Promise.reject(ERROR_ENUM.unAuthorization);
|
||||
}
|
||||
|
||||
@@ -18,6 +18,9 @@ import { DefaultGroupName } from '@fastgpt/global/support/user/team/group/consta
|
||||
import { getAIApi } from '../../../core/ai/config';
|
||||
import { createRootOrg } from '../../permission/org/controllers';
|
||||
import { getS3AvatarSource } from '../../../common/s3/sources/avatar';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
const logger = getLogger(LogCategories.MODULE.USER.TEAM);
|
||||
|
||||
async function getTeamMember(match: Record<string, any>): Promise<TeamTmbItemType> {
|
||||
const tmb = await MongoTeamMember.findOne(match).populate<{ team: TeamSchema }>('team').lean();
|
||||
@@ -139,10 +142,10 @@ export async function createDefaultTeam({
|
||||
{ session }
|
||||
);
|
||||
await createRootOrg({ teamId: tmb.teamId, session });
|
||||
console.log('create default team, group and root org', userId);
|
||||
logger.info('Default team created', { userId, teamId: tmb.teamId, tmbId: tmb._id });
|
||||
return tmb;
|
||||
} else {
|
||||
console.log('default team exist', userId);
|
||||
logger.info('Default team exists', { userId });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,7 +160,6 @@ export async function updateTeam({
|
||||
}: UpdateTeamProps & { teamId: string }) {
|
||||
// auth openai key
|
||||
if (openaiAccount?.key) {
|
||||
console.log('auth user openai key', openaiAccount?.key);
|
||||
const baseUrl = openaiAccount?.baseUrl || 'https://api.openai.com/v1';
|
||||
openaiAccount.baseUrl = baseUrl;
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import type { Processor } from 'bullmq';
|
||||
import { type TeamDeleteJobData } from './index';
|
||||
import { addLog } from '../../../../common/system/log';
|
||||
import { MongoImage } from '../../../../common/file/image/schema';
|
||||
import { MongoOpenApi } from '../../../openapi/schema';
|
||||
import { MongoGroupMemberModel } from '../../../permission/memberGroup/groupMemberSchema';
|
||||
@@ -22,18 +21,21 @@ import { onDelAllApp } from './utils';
|
||||
import { MongoEvaluation } from '../../../../core/app/evaluation/evalSchema';
|
||||
import { MongoEvalItem } from '../../../../core/app/evaluation/evalItemSchema';
|
||||
import { MongoTeamSub } from '../../../../support/wallet/sub/schema';
|
||||
import { getLogger, LogCategories } from '../../../../common/logger';
|
||||
|
||||
const logger = getLogger(LogCategories.MODULE.USER.TEAM);
|
||||
|
||||
export const teamDeleteProcessor: Processor<TeamDeleteJobData> = async (job) => {
|
||||
const { teamId } = job.data;
|
||||
const startTime = Date.now();
|
||||
|
||||
addLog.info(`[Team Delete] Start deleting team: ${teamId}`);
|
||||
logger.info('Team delete started', { teamId });
|
||||
|
||||
try {
|
||||
// 1. 检查团队是否存在
|
||||
const team = await MongoTeam.findById(teamId);
|
||||
if (!team) {
|
||||
addLog.warn(`[Team Delete] Team not found: ${teamId}`);
|
||||
logger.warn('Team not found for deletion', { teamId });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -136,11 +138,12 @@ export const teamDeleteProcessor: Processor<TeamDeleteJobData> = async (job) =>
|
||||
team.meta = undefined;
|
||||
await team.save();
|
||||
|
||||
addLog.info(`[Team Delete] Successfully deleted team: ${teamId}`, {
|
||||
duration: Date.now() - startTime
|
||||
logger.info('Team delete completed', {
|
||||
teamId,
|
||||
durationMs: Date.now() - startTime
|
||||
});
|
||||
} catch (error: any) {
|
||||
addLog.error(`[Team Delete] Failed to delete team: ${teamId}`, error);
|
||||
logger.error('Team delete failed', { teamId, error });
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
TeamCollectionName
|
||||
} from '@fastgpt/global/support/user/team/constant';
|
||||
import { getRandomUserAvatar } from '@fastgpt/global/support/user/utils';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
const TeamMemberSchema = new Schema({
|
||||
teamId: {
|
||||
@@ -70,7 +71,8 @@ try {
|
||||
TeamMemberSchema.index({ teamId: 1 }, { background: true });
|
||||
TeamMemberSchema.index({ userId: 1 }, { background: true });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build team member indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoTeamMember = getMongoModel<TeamMemberType>(
|
||||
|
||||
@@ -3,6 +3,7 @@ const { Schema } = connectionMongo;
|
||||
import { type TeamSchema as TeamType } from '@fastgpt/global/support/user/team/type.d';
|
||||
import { userCollectionName } from '../../user/schema';
|
||||
import { TeamCollectionName } from '@fastgpt/global/support/user/team/constant';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
const TeamSchema = new Schema({
|
||||
name: {
|
||||
@@ -71,7 +72,8 @@ try {
|
||||
TeamSchema.index({ ownerId: 1 });
|
||||
TeamSchema.index({ 'meta.wecom.corpId': 1 }, { sparse: true, unique: true });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build team indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoTeam = getMongoModel<TeamType>(TeamCollectionName, TeamSchema);
|
||||
|
||||
@@ -5,6 +5,7 @@ import {
|
||||
TeamCollectionName,
|
||||
TeamTagsCollectionName
|
||||
} from '@fastgpt/global/support/user/team/constant';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
const TeamTagSchema = new Schema({
|
||||
teamId: {
|
||||
@@ -29,7 +30,8 @@ const TeamTagSchema = new Schema({
|
||||
try {
|
||||
TeamTagSchema.index({ teamId: 1 });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build team tag indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoTeamTags = getMongoModel<TeamTagsSchemaType>(
|
||||
|
||||
@@ -4,6 +4,7 @@ const { Schema } = connectionMongo;
|
||||
import type { TeamCouponSchema } from '@fastgpt/global/support/wallet/sub/coupon/type';
|
||||
import { TeamCollectionName } from '@fastgpt/global/support/user/team/constant';
|
||||
import { CouponTypeEnum } from '@fastgpt/global/support/wallet/sub/coupon/constants';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
export const couponCollectionName = 'team_sub_coupons';
|
||||
|
||||
@@ -39,7 +40,8 @@ const CouponSchema = new Schema({
|
||||
try {
|
||||
CouponSchema.index({ key: 1 }, { unique: true });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build coupon indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoTeamCoupon = getMongoModel<TeamCouponSchema>(couponCollectionName, CouponSchema);
|
||||
|
||||
@@ -3,6 +3,7 @@ const { Schema } = connectionMongo;
|
||||
import { TeamCollectionName } from '@fastgpt/global/support/user/team/constant';
|
||||
import { DiscountCouponTypeEnum } from '@fastgpt/global/support/wallet/sub/discountCoupon/constants';
|
||||
import type { DiscountCouponSchemaType } from '@fastgpt/global/openapi/support/wallet/discountCoupon/api';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
export const discountCouponCollectionName = 'team_discount_coupons';
|
||||
|
||||
@@ -33,7 +34,8 @@ try {
|
||||
DiscountCouponSchema.index({ status: 1, type: 1 });
|
||||
DiscountCouponSchema.index({ teamId: 1, status: 1 });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build discount coupon indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoDiscountCoupon = getMongoModel<DiscountCouponSchemaType>(
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
SubTypeEnum
|
||||
} from '@fastgpt/global/support/wallet/sub/constants';
|
||||
import type { TeamSubSchemaType } from '@fastgpt/global/support/wallet/sub/type';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
export const subCollectionName = 'team_subscriptions';
|
||||
|
||||
@@ -100,7 +101,8 @@ try {
|
||||
}
|
||||
);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build subscription indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoTeamSub = getMongoModel<TeamSubSchemaType>(subCollectionName, SubSchema);
|
||||
|
||||
@@ -21,6 +21,9 @@ import {
|
||||
CacheKeyEnumTime,
|
||||
incrValueToCache
|
||||
} from '../../../common/redis/cache';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
const logger = getLogger(LogCategories.MODULE.WALLET.SUB);
|
||||
|
||||
export const getStandardPlansConfig = () => {
|
||||
return global?.subPlans?.standard;
|
||||
@@ -200,7 +203,7 @@ export const getTeamPlanStatus = async ({
|
||||
dayjs(standardPlan.expiredTime).isBefore(new Date())) ||
|
||||
teamStandardPlans.length === 0
|
||||
) {
|
||||
console.log('Init free stand plan', { teamId });
|
||||
logger.info('Initializing free standard plan', { teamId });
|
||||
await initTeamFreePlan({ teamId });
|
||||
return getTeamPlanStatus({ teamId });
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { UsageItemTypeEnum, UsageSourceEnum } from '@fastgpt/global/support/wallet/usage/constants';
|
||||
import { MongoUsage } from './schema';
|
||||
import { type ClientSession } from '../../../common/mongo';
|
||||
import { addLog } from '../../../common/system/log';
|
||||
import { type ChatNodeUsageType } from '@fastgpt/global/support/wallet/bill/type';
|
||||
import type {
|
||||
PushUsageItemsProps,
|
||||
@@ -12,26 +11,29 @@ import { i18nT } from '../../../../web/i18n/utils';
|
||||
import { formatModelChars2Points } from './utils';
|
||||
import { mongoSessionRun } from '../../../common/mongo/sessionRun';
|
||||
import { MongoUsageItem } from './usageItemSchema';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
const logger = getLogger(LogCategories.MODULE.WALLET.USAGE);
|
||||
|
||||
export async function createUsage(data: CreateUsageProps) {
|
||||
try {
|
||||
return await global.createUsageHandler(data);
|
||||
} catch (error) {
|
||||
addLog.error('createUsage error', error);
|
||||
logger.error('Failed to create usage', { error });
|
||||
}
|
||||
}
|
||||
export async function concatUsage(data: ConcatUsageProps) {
|
||||
try {
|
||||
await global.concatUsageHandler(data);
|
||||
} catch (error) {
|
||||
addLog.error('concatUsage error', error);
|
||||
logger.error('Failed to concat usage', { error });
|
||||
}
|
||||
}
|
||||
export async function pushUsageItems(data: PushUsageItemsProps) {
|
||||
try {
|
||||
await global.pushUsageItemsHandler(data);
|
||||
} catch (error) {
|
||||
addLog.error('pushUsageItems error', error);
|
||||
logger.error('Failed to push usage items', { error });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
import { UsageCollectionName, UsageItemCollectionName } from './constants';
|
||||
import { AppCollectionName } from '../../../core/app/schema';
|
||||
import { DatasetCollectionName } from '../../../core/dataset/schema';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
const UsageSchema = new Schema(
|
||||
{
|
||||
@@ -75,7 +76,8 @@ try {
|
||||
|
||||
UsageSchema.index({ time: 1 }, { expireAfterSeconds: 360 * 24 * 60 * 60 });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build usage indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoUsage = getMongoModel<UsageSchemaType>(UsageCollectionName, UsageSchema);
|
||||
|
||||
@@ -3,6 +3,7 @@ const { Schema } = connectionMongo;
|
||||
import type { UsageItemSchemaType } from '@fastgpt/global/support/wallet/usage/type';
|
||||
import { UsageCollectionName, UsageItemCollectionName } from './constants';
|
||||
import { TeamCollectionName } from '@fastgpt/global/support/user/team/constant';
|
||||
import { getLogger, LogCategories } from '../../../common/logger';
|
||||
|
||||
const UsageItemSchema = new Schema({
|
||||
teamId: {
|
||||
@@ -44,7 +45,8 @@ try {
|
||||
UsageItemSchema.index({ usageId: 'hashed' });
|
||||
UsageItemSchema.index({ time: 1 }, { expireAfterSeconds: 360 * 24 * 60 * 60 });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
const logger = getLogger(LogCategories.INFRA.MONGO);
|
||||
logger.error('Failed to build usage item indexes', { error });
|
||||
}
|
||||
|
||||
export const MongoUsageItem = getMongoModel<UsageItemSchemaType>(
|
||||
|
||||
Reference in New Issue
Block a user