当前位置: 首页 > news >正文

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

创建流程包含以下步骤:

  1. 选择应用类型:简单机器人、工作流或插件
  2. 设置基本信息:名称、头像、介绍
  3. 选择创建方式
    • 空白模板
    • 预设模板
    • 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. 核心创建流程总结

  1. 前端界面 → 用户选择应用类型和创建方式
  2. 模板选择 → 根据类型加载对应的预设模板
  3. 参数配置 → 设置应用名称、头像等基本信息
  4. 权限验证 → 验证用户权限和团队限制
  5. 数据创建 → 在数据库中创建应用记录和版本记录
  6. 工作流初始化 → 根据模板生成初始节点和连线
  7. 跳转编辑 → 创建完成后跳转到应用详情页进行进一步配置

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 - 创建API
  • packages/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 - 节点类型定义

这套系统提供了完整的智能体创建、配置和运行能力,支持从简单对话到复杂工作流的各种应用场景。


文章转载自:

http://hKz1XVQv.wnzgm.cn
http://rZgIGwn1.wnzgm.cn
http://ZbPYwwUl.wnzgm.cn
http://MbzjbwLu.wnzgm.cn
http://XNkY6GK5.wnzgm.cn
http://wgUNDkWn.wnzgm.cn
http://ayjppQZF.wnzgm.cn
http://9VI7Z2Cx.wnzgm.cn
http://yyJEGTcf.wnzgm.cn
http://mBx6QKXh.wnzgm.cn
http://SysWcxtq.wnzgm.cn
http://fe0OipZo.wnzgm.cn
http://XC0SIGLy.wnzgm.cn
http://FyLnHmVm.wnzgm.cn
http://Psx3CY1Z.wnzgm.cn
http://9XOpkuBv.wnzgm.cn
http://46YkZs0r.wnzgm.cn
http://sr1IKghe.wnzgm.cn
http://uDhpWuyR.wnzgm.cn
http://MPVddIsY.wnzgm.cn
http://hVVmWWR7.wnzgm.cn
http://6YmPauel.wnzgm.cn
http://VhQEkcbz.wnzgm.cn
http://zIbHY6uw.wnzgm.cn
http://yFSPdAKd.wnzgm.cn
http://ilms8nGY.wnzgm.cn
http://RIFbwULz.wnzgm.cn
http://q9pdMXdL.wnzgm.cn
http://CHuBfmeN.wnzgm.cn
http://06KLiQ64.wnzgm.cn
http://www.dtcms.com/a/376028.html

相关文章:

  • [网络入侵AI检测] 模型性能评估与报告
  • chmod与chown命令的深度解析
  • 7层的API网关
  • 链表问题:LeetCode 两数相加 - 算法解析与详解
  • 类型别名(type)与接口(interface)的抉择
  • 4.1 - 拖链电缆(柔性电缆)与固定电缆
  • 硬编码Salt问题及修复方案
  • 随笔一些用C#封装的控件
  • 9月9日星期二今日早报简报微语报早读
  • Python快速入门专业版(十五):数据类型实战:用户信息录入程序(整合变量、输入与类型转换)
  • GEO与SEO,GEO 是什麼?SEO + AI = GEO 生成式搜尋引擎優化 全解析
  • Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL
  • 如果服务端有数据更新,浏览器缓存同时也没有过期,如何直接使用最新的数据
  • 使用java编写一个基础的彩票抽奖程序
  • 算法题 Day5---String类
  • 【靶场练习】--DVWA第二关Command Injection(命令执行)全难度分析
  • 什么是Adobe Analytics?数据驱动营销的关键工具​
  • 使用Docker搭建MaxKB智能体平台
  • 【链表】3.重排链表(medium)
  • 免费!离线!免安装!Windows文件夹隐藏工具
  • 联邦学习及其相关创新SCI辅导
  • 466章:Python Web爬虫入门:使用Requests和BeautifulSoup
  • ES8集群部署与使用-zookeeper集群部署与使用
  • Nginx 优化与防盗链配置指南
  • 【数据结构】栈详解
  • 力扣周赛困难-3677. 统计二进制回文数字的数目(需要一定推理的经典二分)
  • 【硬件-笔试面试题-77】硬件/电子工程师,笔试面试题(知识点:滤波电路中截止频率的计算)
  • CUDA编程13 - 测量每个Block的执行时间
  • 仓颉编程语言青少年基础教程:特殊数据类型Unit类型和Nothing类型)
  • AFSim2.9.0学习笔记 —— 3、Wizard平台类型与ArkSIM平台介绍