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
- 節點類型定義
這套系統提供了完整的智能體創建、配置和運行能力,支持從簡單對話到復雜工作流的各種應用場景。