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

* rebase fdf933d
 and 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

* rebase fdf933d
 and 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:
Archer
2026-02-12 16:37:50 +08:00
committed by GitHub
parent 6f1c372ce1
commit 76d6234de6
860 changed files with 54412 additions and 16713 deletions
-5
View File
@@ -53,9 +53,4 @@ const McpKeySchema = new Schema({
}
});
try {
} catch (error) {
console.log(error);
}
export const MongoMcpKey = getMongoModel<McpKeyType>(mcpCollectionName, McpKeySchema);
+3 -1
View File
@@ -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);
+5 -2
View File
@@ -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 });
});
}
+4 -1
View File
@@ -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);
+13 -5
View File
@@ -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';
+3 -1
View File
@@ -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 -1
View File
@@ -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);
+3 -1
View File
@@ -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);
+5 -3
View File
@@ -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);
+4 -1
View File
@@ -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>(