FastGPT源码解析 Agent 智能体应用创建流程和代码分析
FastGPT对话智能体创建流程和代码分析
平台作为agent平台,平台所有功能都是围绕Agent创建和使用为核心的。平台整合各种基础能力,如大模型、知识库、工作流、插件等模块,通过可视化,在界面上创建智能体,使用全部基础能力,完成各种应用应用智能体的创建、配置、测试、发布、使用等流程
1. 智能体类型概述
FastGPT支持多种类型的智能体应用,定义在 AppTypeEnum
中:
export enum AppTypeEnum {folder = 'folder', // 文件夹simple = 'simple', // 简单对话机器人workflow = 'advanced', // 工作流应用plugin = 'plugin', // 插件应用httpPlugin = 'httpPlugin' // HTTP插件
}
2. 智能体创建流程
2.1 前端创建界面
核心文件: projects/app/src/pageComponents/app/list/CreateModal.tsx
创建流程包含以下步骤:
- 选择应用类型:简单机器人、工作流或插件
- 设置基本信息:名称、头像、介绍
- 选择创建方式:
- 空白模板
- 预设模板
- cURL导入(仅插件)
const CreateModal = ({ onClose, type, onOpenTemplateModal }) => {const { register, setValue, watch, handleSubmit } = useForm<FormType>({defaultValues: {avatar: typeData.avatar,name: '',curlContent: ''}});const { runAsync: onclickCreate, loading: isCreating } = useRequest2(async ({ avatar, name, curlContent }: FormType, templateId?: string) => {// 从空模板创建if (!templateId && currentCreateType !== 'curl') {return postCreateApp({parentId,avatar: avatar,name: name,type,modules: emptyTemplates[type].nodes,edges: emptyTemplates[type].edges,chatConfig: emptyTemplates[type].chatConfig});}// 从模板或cURL创建const { workflow, appAvatar } = await (async () => {if (templateId) {const templateDetail = await getTemplateMarketItemDetail(templateId);return {appAvatar: templateDetail.avatar,workflow: templateDetail.workflow};}if (curlContent) {return {appAvatar: avatar,workflow: parsePluginFromCurlString(curlContent)};}return Promise.reject('No template or curl content');})();return postCreateApp({parentId,avatar: appAvatar,name: name,type,modules: workflow.nodes || [],edges: workflow.edges || [],chatConfig: workflow.chatConfig || {}});});
};
2.2 后端创建API
核心文件: projects/app/src/pages/api/core/app/create.ts
async function handler(req: ApiRequestProps<CreateAppBody>) {const { parentId, name, avatar, type, modules, edges, chatConfig } = req.body;if (!name || !type || !Array.isArray(modules)) {return Promise.reject(CommonErrEnum.inheritPermissionError);}// 权限验证const [{ teamId, tmbId, userId }] = await Promise.all([authUserPer({ req, authToken: true, per: WritePermissionVal }),...(parentId? [authApp({ req, appId: parentId, per: WritePermissionVal, authToken: true })]: [])]);// 上限校验await checkTeamAppLimit(teamId);// 创建应用const appId = await onCreateApp({parentId,name,avatar,type,modules,edges,chatConfig,teamId,tmbId,userAvatar: tmb?.user?.avatar,username: tmb?.user?.username});return appId;
}export const onCreateApp = async ({parentId,name,avatar,type,modules,edges,chatConfig,teamId,tmbId,pluginData,session
}) => {const create = async (session: ClientSession) => {// 创建应用记录const [{ _id: appId }] = await MongoApp.create([{...parseParentIdInMongo(parentId),avatar,name,teamId,tmbId,modules,edges,chatConfig,type,version: 'v2',pluginData,'pluginData.nodeVersion': defaultNodeVersion}], { session, ordered: true });// 创建版本记录if (!AppFolderTypeList.includes(type!)) {await MongoAppVersion.create([{tmbId,appId,nodes: modules,edges,chatConfig,versionName: name,username,avatar: userAvatar,isPublish: true}], { session, ordered: true });}return appId;};return session ? create(session) : await mongoSessionRun(create);
};
3. 数据存储结构
3.1 应用Schema
核心文件: packages/service/core/app/schema.ts
const AppSchema = new Schema({parentId: {type: Schema.Types.ObjectId,ref: AppCollectionName,default: null},teamId: {type: Schema.Types.ObjectId,ref: TeamCollectionName,required: true},tmbId: {type: Schema.Types.ObjectId,ref: TeamMemberCollectionName,required: true},name: {type: String,required: true},type: {type: String,default: AppTypeEnum.workflow,enum: Object.values(AppTypeEnum)},avatar: {type: String,default: '/icon/logo.svg'},intro: {type: String,default: ''},// 工作流节点和连线modules: {type: Array,default: []},edges: {type: Array,default: []},// 聊天配置chatConfig: {type: chatConfigType},// 插件配置pluginData: {type: {nodeVersion: String,pluginUniId: String,apiSchemaStr: String,customHeaders: String}},// 定时触发配置scheduledTriggerConfig: {cronString: String,timezone: String,defaultPrompt: String},inheritPermission: {type: Boolean,default: true}
});
3.2 聊天配置类型
export type AppChatConfigType = {welcomeText?: string; // 欢迎语variables?: VariableItemType[]; // 变量配置autoExecute?: AppAutoExecuteConfigType; // 自动执行questionGuide?: AppQGConfigType; // 问题引导ttsConfig?: AppTTSConfigType; // 语音合成whisperConfig?: AppWhisperConfigType; // 语音识别chatInputGuide?: ChatInputGuideConfigType; // 输入引导fileSelectConfig?: AppFileSelectConfigType; // 文件选择instruction?: string; // 插件说明
};
4. 预设模板系统
4.1 模板定义
核心文件: projects/app/src/web/core/app/templates.ts
FastGPT提供三种基础模板:
export const emptyTemplates: Record<AppTypeEnum.simple | AppTypeEnum.plugin | AppTypeEnum.workflow,{name: string;avatar: string;nodes: AppSchema['modules'];edges: AppSchema['edges'];chatConfig: AppSchema['chatConfig'];}
> = {// 简单对话机器人模板[AppTypeEnum.simple]: {avatar: 'core/workflow/template/aiChat',name: '简单机器人',nodes: [{nodeId: 'userGuide',name: '系统配置',flowNodeType: FlowNodeTypeEnum.systemConfig,// ... 系统配置节点},{nodeId: '448745',name: '工作流开始',flowNodeType: FlowNodeTypeEnum.workflowStart,// ... 开始节点配置},{nodeId: 'loOvhld2ZTKa',name: 'AI对话',flowNodeType: FlowNodeTypeEnum.chatNode,// ... AI对话节点配置}],edges: [{source: '448745',target: 'loOvhld2ZTKa',sourceHandle: '448745-source-right',targetHandle: 'loOvhld2ZTKa-target-left'}],chatConfig: {}},// 工作流模板[AppTypeEnum.workflow]: {avatar: 'core/app/type/workflowFill',name: '空白工作流',nodes: [// 系统配置节点// 工作流开始节点],edges: [],chatConfig: {}},// 插件模板[AppTypeEnum.plugin]: {avatar: 'core/app/type/pluginFill',name: '空白插件',nodes: [// 插件输入节点// 插件输出节点// 插件配置节点],edges: [],chatConfig: {}}
};
4.2 cURL解析功能
对于插件类型,支持从cURL字符串解析生成工作流:
export const parsePluginFromCurlString = (curl: string) => {const { url, method, headers, body, params, bodyArray } = parseCurl(curl);// 解析参数生成插件输入const allInputs = Array.from(new Map([...params, ...bodyArray].map((item) => [item.key, item])).values());const formatPluginStartInputs = allInputs.map((item) => {const valueType = item.value === null ? 'string' : typeof item.value;// 根据值类型生成对应的输入配置return {renderTypeList: valueTypeItem.renderTypeList,valueType: valueTypeItem.valueType,key: item.key,label: item.key,required: false,toolDescription: item.key};});// 生成HTTP请求节点return {nodes: [// 插件输入节点// HTTP请求节点// 插件输出节点// 插件配置节点],edges: [// 连接各节点],chatConfig: {}};
};
5. 工作流执行引擎
5.1 工作流调度器
核心文件: packages/service/core/workflow/dispatch/index.ts
// 节点类型与处理函数映射
const callbackMap: Record<FlowNodeTypeEnum, Function> = {[FlowNodeTypeEnum.workflowStart]: dispatchWorkflowStart,[FlowNodeTypeEnum.answerNode]: dispatchAnswer,[FlowNodeTypeEnum.chatNode]: dispatchChatCompletion,[FlowNodeTypeEnum.datasetSearchNode]: dispatchDatasetSearch,[FlowNodeTypeEnum.datasetConcatNode]: dispatchDatasetConcat,[FlowNodeTypeEnum.classifyQuestion]: dispatchClassifyQuestion,[FlowNodeTypeEnum.contentExtract]: dispatchContentExtract,[FlowNodeTypeEnum.httpRequest468]: dispatchHttp468Request,[FlowNodeTypeEnum.tools]: dispatchRunTools,[FlowNodeTypeEnum.pluginModule]: dispatchRunPlugin,// ... 更多节点类型
};export async function dispatchWorkFlow(data: Props): Promise<DispatchFlowResponse> {let {runtimeNodes = [],runtimeEdges = [],histories = [],variables = {},stream = false,...props} = data;// 初始化系统变量variables = {...getSystemVariable(data),...externalProvider.externalWorkflowVariables,...variables};// 节点执行状态检查async function checkNodeCanRun(node: RuntimeNodeItemType,skippedNodeIdList = new Set<string>()): Promise<RuntimeNodeItemType[]> {// 获取节点运行状态const status = checkNodeRunStatus({node,runtimeEdges});if (status === 'run') {return nodeRunWithActive(node);}if (status === 'skip') {return nodeRunWithSkip(node);}}// 执行节点async function nodeRunWithActive(node: RuntimeNodeItemType) {// 获取节点运行参数const params = getNodeRunParams(node);const dispatchData: ModuleDispatchProps = {...props,variables,histories,node,runtimeNodes,runtimeEdges,params};// 执行节点处理函数const dispatchRes = await callbackMap[node.flowNodeType](dispatchData);// 更新节点输出node.outputs.forEach((outputItem) => {if (dispatchRes[outputItem.key] !== undefined) {outputItem.value = dispatchRes[outputItem.key];}});return dispatchRes;}// 开始执行工作流const entryNodes = runtimeNodes.filter((item) => item.isEntry);await Promise.all(entryNodes.map((node) => checkNodeCanRun(node)));return {flowResponses: chatResponses,flowUsages: chatNodeUsages,assistantResponses: chatAssistantResponse,newVariables: variables};
}
5.2 AI模型管理
核心文件: packages/service/core/ai/model.ts
export const getDefaultLLMModel = () => global?.systemDefaultModel.llm!;export const getLLMModel = (model?: string) => {if (!model) return getDefaultLLMModel();return global.llmModelMap.get(model) || getDefaultLLMModel();
};export const getEmbeddingModel = (model?: string) => {if (!model) return getDefaultEmbeddingModel();return global.embeddingModelMap.get(model) || getDefaultEmbeddingModel();
};export const findAIModel = (model: string): SystemModelItemType | undefined => {return (global.llmModelMap.get(model) ||global.embeddingModelMap.get(model) ||global.ttsModelMap.get(model) ||global.sttModelMap.get(model) ||global.reRankModelMap.get(model));
};
6. 节点类型系统
6.1 核心节点类型
export enum FlowNodeTypeEnum {// 基础节点workflowStart = 'workflowStart', // 工作流开始answerNode = 'answerNode', // 指定回复chatNode = 'chatNode', // AI对话// 数据处理datasetSearchNode = 'datasetSearchNode', // 知识库搜索datasetConcatNode = 'datasetConcatNode', // 知识库拼接// 智能处理classifyQuestion = 'classifyQuestion', // 问题分类contentExtract = 'contentExtract', // 内容提取// 工具节点httpRequest468 = 'httpRequest468', // HTTP请求tools = 'tools', // 工具调用code = 'code', // 代码执行// 插件节点pluginModule = 'pluginModule', // 插件模块pluginInput = 'pluginInput', // 插件输入pluginOutput = 'pluginOutput', // 插件输出// 交互节点userSelect = 'userSelect', // 用户选择formInput = 'formInput', // 表单输入// 控制流ifElseNode = 'ifElseNode', // 条件分支loop = 'loop', // 循环loopStart = 'loopStart', // 循环开始loopEnd = 'loopEnd', // 循环结束// 配置节点systemConfig = 'systemConfig', // 系统配置pluginConfig = 'pluginConfig' // 插件配置
}
6.2 节点输入输出系统
export type FlowNodeInputItemType = {key: string;renderTypeList: FlowNodeInputTypeEnum[];valueType: WorkflowIOValueTypeEnum;label: string;description?: string;required?: boolean;toolDescription?: string;defaultValue?: any;value?: any;// ... 更多配置
};export type FlowNodeOutputItemType = {id: string;key: string;label: string;description?: string;valueType: WorkflowIOValueTypeEnum;type: FlowNodeOutputTypeEnum;// ... 更多配置
};
7. 智能体配置系统
7.1 变量系统
export type VariableItemType = {id: string;key: string;label: string;type: VariableInputEnum;required: boolean;description: string;valueType?: WorkflowIOValueTypeEnum;defaultValue?: any;// 输入配置maxLength?: number;max?: number;min?: number;enums?: { value: string; label: string }[];
};
7.2 聊天功能配置
// TTS配置
export type AppTTSConfigType = {type: 'none' | 'web' | 'model';model?: string;voice?: string;speed?: number;
};// 语音识别配置
export type AppWhisperConfigType = {open: boolean;autoSend: boolean;autoTTSResponse: boolean;
};// 问题引导配置
export type AppQGConfigType = {open: boolean;model?: string;customPrompt?: string;
};// 自动执行配置
export type AppAutoExecuteConfigType = {open: boolean;defaultPrompt: string;
};
8. 核心创建流程总结
- 前端界面 → 用户选择应用类型和创建方式
- 模板选择 → 根据类型加载对应的预设模板
- 参数配置 → 设置应用名称、头像等基本信息
- 权限验证 → 验证用户权限和团队限制
- 数据创建 → 在数据库中创建应用记录和版本记录
- 工作流初始化 → 根据模板生成初始节点和连线
- 跳转编辑 → 创建完成后跳转到应用详情页进行进一步配置
9. 关键代码文件路径
前端核心文件
projects/app/src/pageComponents/app/list/CreateModal.tsx
- 创建弹窗projects/app/src/web/core/app/templates.ts
- 模板定义projects/app/src/web/core/app/api.ts
- API调用projects/app/src/pageComponents/app/detail/
- 应用详情页
后端核心文件
projects/app/src/pages/api/core/app/create.ts
- 创建APIpackages/service/core/app/schema.ts
- 数据模型packages/service/core/app/controller.ts
- 应用控制器packages/service/core/workflow/dispatch/index.ts
- 工作流引擎packages/service/core/ai/model.ts
- AI模型管理
类型定义文件
packages/global/core/app/type.d.ts
- 应用类型定义packages/global/core/app/constants.ts
- 应用常量packages/global/core/workflow/node/constant.ts
- 节点类型定义
这套系统提供了完整的智能体创建、配置和运行能力,支持从简单对话到复杂工作流的各种应用场景。