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://www.pswp.cn/news/922192.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922192.shtml
英文地址,请注明出处:http://en.pswp.cn/news/922192.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缺失数据处理全指南:方法、案例与最佳实践

如何处理缺失数据&#xff1a;方法、案例与最佳实践 1. 引言 在数据分析和机器学习中&#xff0c;缺失数据是一个普遍存在的问题。如何处理缺失值&#xff0c;往往直接影响到后续分析和建模的效果。处理不当&#xff0c;不仅会浪费数据&#xff0c;还可能导致模型预测结果的不准…

为什么Cesium不使用vue或者react,而是 保留 Knockout

1. Knockout-ES5 插件的语法简化优势 自动深度监听&#xff1a;Cesium 通过集成 Knockout-ES5 插件&#xff0c;允许开发者直接使用普通变量语法&#xff08;如 viewModel.property newValue&#xff09;替代繁琐的 observable() 包装&#xff0c;无需手动声明每个可观察属性。…

Word怎么设置页码总页数不包含封面和目录页

有时候使用页码格式是[第x页/共x页]或[x/x]时会遇到word总页数和实际想要的页数不一致&#xff0c;导致显示不统一&#xff0c;这里介绍一个简单的办法&#xff0c;适用于比较简单的情况。 一、wps版本 文章分节 首先将目录页与正文页进行分节&#xff1a;在目录页后面选择插入…

突破机器人通讯架构瓶颈,CAN/FD、高速485、EtherCAT,哪种总线才是最优解?

引言&#xff1a; 从协作机械臂到人形机器人&#xff0c;一文拆解主流总线技术选型困局 在机器人技术飞速发展的今天&#xff0c;从工厂流水线上的协作机械臂到科技展会上的人形机器人&#xff0c;它们的“神经系统”——通讯总线&#xff0c;正面临着前所未有的挑战。特斯拉O…

Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)

1. Java是什么&#xff1f; Java首先是一种编程语言。它拥有特定的语法、关键字和结构&#xff0c;开发者可以用它来编写指令&#xff0c;让计算机执行任务。核心特点&#xff1a; Java最著名的特点是“一次编写&#xff0c;到处运行”&#xff08;Write Once, Run Anywhere - …

OSPF高级技术 相关知识点

1.多区域OSPFospf 设计多区域原因&#xff1a;① 每个区域的路由器只需同步自己所在区域的链路状态数据库&#xff0c;分区域设 计可以使得每个区域的链路状态数据库得以减少。以降低路由器cpu、内存 的消耗。② 避免某区域内的网络故障&#xff08;例如&#xff1a;接口频繁up…

Linux / Windows 下连续发送多帧 8 字节指令,下位机只响应第一帧,第二帧“丢失”。

串口编程易错点笔记 基于 serial::Serial&#xff08;wjwwood serial 库&#xff09; 场景&#xff1a;Linux / Windows 下连续发送多帧 8 字节指令&#xff0c;下位机只响应第一帧&#xff0c;第二帧“丢失”。1. 现象 serial::Serial ser("/dev/ttyUSB0", 115200);…

三十九、案例-配置文件-参数配置化(了解即可,现在主流使用yml配置文件)

参数配置化-问题引出参数配置化-问题解决参数配置化-代码与过程解析代码&#xff1a; AliOSSUtils&#xff08;工具类&#xff09; package com.itheima.utils;import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import org.springframework.beans.factory.…

Linux之virtio实现原理--pci 基础

一、概述 virtio设备可以基于不同总线来实现&#xff0c;本文介绍基于pci实现的virtio-pci设备。以virtio-blk为例&#xff0c;首先介绍PCI配置空间内容&#xff0c;virtio-pci实现的硬件基础——capability&#xff0c;最后分析PIC设备的初始化以及virtio-pci设备的初始化。 …

Claude-Flow AI协同开发:从“CTO”到“人机共生体”的AI协同开发

6.1 思维的终极融合&#xff1a;从“CTO”到“人机共生体” (Human-AI Symbiote) 在之前的章节中&#xff0c;我们逐步将您的角色从“开发者”提升为“项目经理”&#xff0c;最终定位为整个“人机混合团队的CTO”。这个模型强调的是一种 “指挥-控制” (Command-and-Control) …

TCGA单癌肿按单基因高低分组的转录组差异热图分析作图教程

TCGA单癌肿按单基因高低分组的转录组差异热图分析作图教程分析作图原理过程提取出TCGA中指定的单基因单癌肿的转录组表达数据对该单基因的表达水平的中位数作为阈值把样本分成高表达组和低表达组按该基因的高低表达样本分组来做该癌症的转录组差异分析对差异分析结果中top差异高…

手搓Tomcat

目录 Tomcat是什么&#xff1f; 前置工作准备 构建并启动Tomcat 处理Socket逻辑顺序 获取输入流并读取数据封装到Request 自定义Servlet对象 暂存响应体 按Http协议发送响应数据 部署Tomcat ​ Tomcat是什么&#xff1f; Tomcat 是一个 Web 应用服务器&#xff08;准确…

Linux网络:初识网络

文章目录1. 网络发展1.1 独立模式1.2 网络互联1.3 局域网LAN1.4 广域网WAN2. 认识 “协议”2.1 什么是协议&#xff1f;2.2 为什么要有协议&#xff1f;2.3 深入了解协议序&#xff1a;开网络之篇章&#xff0c;建网络之基础&#xff0c;将近2月过去&#xff0c;暑假期间不曾有…

文件检查与拷贝-简化版

本篇继续来学习shell脚本&#xff0c;对上一篇的文件检查与拷贝脚本进行简化修改。 1 功能说明 在Linux系统中&#xff0c;通过一个shell脚本&#xff0c;实现将一个目录中的所有文件&#xff08;包括子目录中的&#xff09;&#xff0c;拷贝到顶一个指定的目录&#xff0c;要求…

DCA1000 AWR1843 环境安装

mmWaveStudio GUI设计用于表征和评估TI Radar器械。mmWaveStudio通过SPI向mmWave设备发送命令来配置和控制mmWave设备。使用DCA 1000 EVM或TSW 1400 EVM板捕获ADC数据&#xff0c;并在Matlab中处理数据&#xff0c;结果显示在GUI中。mmWaveStudio GUI利用C DLL和一组API通过FTD…

机器学习实操项目01——Numpy入门(基本操作、数组形状操作、复制与试图、多种索引技巧、线性代数)

上一章&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 下一章&#xff1a; 机器学习核心知识点目录&#xff1a;机器学习核心知识点目录 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目…

【vscode】如何离线下载vsxi插件,且在无网环境下离线安装插件-2026最新实验教程

文章目录插件市场也可以从APP进入无网环境下安装插件插件市场 https://marketplace.visualstudio.com/vscode 也可以从APP进入 这里以下载python插件为例 选择版本 无网环境下安装插件

vue2 侦听器watch

一、watch 核心作用监测数据变化&#xff1a;当被监听的数据发生改变时&#xff0c;自动执行指定的处理函数处理副作用&#xff1a;适合执行异步操作&#xff08;如接口请求&#xff09;、复杂逻辑处理等 “副作用” 代码二、基础语法&#xff08;3 种写法&#xff09;简单写法…

今天继续学习Linux系统中shell脚本

首先继续上次的内容看一下另一个案例案例&#xff1a;持续检查服务器负载uptime查看负载情况&#xff08;也可以用top命令&#xff09;[rootlocalhost ~]# uptime22:11:26 up 7:05, 3 users, load average: 0.00, 0.00, 0.00#!/bin/bash #Function:持续检查服务器负载,如果负…

Win系统下配置PCL库第一步之下载Visual Studio和Qt 5.15.2(超详细)

之前在上篇文章Win系统下配置PCL库_windows pcl库 下载-CSDN博客中提到配置PCL库的教程是下载Visual Studio和Qt 5.15.2&#xff0c;后续在测试中我发现前面这两步很重要&#xff0c;一般Qt在线下载器选项选不好的话Qt是装的Qt6&#xff0c;在VTK编译的时候Qt6往往需要C17编译&…