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://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編譯&…