FastGPT源码解析 Agent 大模型对接接口和使用详解

FastGPT 大模型对接核心代码分析

核心架构概览

FastGPT 采用统一模型抽象层设计,通过标准化接口对接多种大模型,支持 LLM、Embedding、ReRank、TTS、STT 等多种 AI 能力。

支持各种大模型能力的配置,包括本地ollama、各个AI云厂商的API接入配置,支持知识库的分词、排序、向量化处理,支持Agent的对话和业务逻辑处理,完成完整的Agent可视化配置支撑。

核心文件主要主要在packages/global/core/ai/目录,有model.ts、model.d.ts、config.ts、index.ts、ReRank.ts等

1. 模型管理架构

全局模型映射

// 全局模型存储结构
declare global {var llmModelMap: Map<string, LLMModelItemType>;var embeddingModelMap: Map<string, EmbeddingModelItemType>;var reRankModelMap: Map<string, ReRankModelItemType>;var ttsModelMap: Map<string, TTSModelType>;var sttModelMap: Map<string, STTModelType>;var systemDefaultModel: {llm: LLMModelItemType;embedding: EmbeddingModelItemType;rerank?: ReRankModelItemType;tts?: TTSModelType;stt?: STTModelType;};
}

模型获取接口

// 统一的模型获取接口
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 getReRankModel = (model?: string) => {if (!model) return getDefaultRerankModel();return global.reRankModelMap.get(model) || getDefaultRerankModel();
};// 通用模型查找
export const findAIModel = (model: string) => {return (global.llmModelMap.get(model) ||global.embeddingModelMap.get(model) ||global.ttsModelMap.get(model) ||global.sttModelMap.get(model) ||global.reRankModelMap.get(model));
};

2. LLM 模型对接

模型配置结构

export type LLMModelItemType = {provider: ModelProviderIdType;           // 提供商: OpenAI/Claude/GLM等model: string;                           // 模型名称name: string;                            // 显示名称// 能力参数maxContext: number;                      // 最大上下文长度maxResponse: number;                     // 最大响应长度quoteMaxToken: number;                   // 最大引用TokenmaxTemperature?: number;                 // 最大温度值// 功能支持vision?: boolean;                        // 视觉能力reasoning?: boolean;                     // 推理能力functionCall: boolean;                   // 函数调用toolChoice: boolean;                     // 工具选择// 专用功能datasetProcess?: boolean;                // 知识库处理usedInClassify?: boolean;               // 问题分类usedInExtractFields?: boolean;          // 内容提取usedInToolCall?: boolean;               // 工具调用// 自定义配置defaultSystemChatPrompt?: string;        // 默认系统提示词defaultConfig?: Record<string, any>;     // 默认请求配置fieldMap?: Record<string, string>;       // 字段映射// 直连配置requestUrl?: string;                     // 自定义请求URLrequestAuth?: string;                    // 自定义认证
};

统一 API 客户端

export const getAIApi = (props?: { userKey?: OpenaiAccountType; timeout?: number 
}) => {const { userKey, timeout } = props || {};// 优先级: 用户配置 > 全局配置 > 环境变量const baseUrl = userKey?.baseUrl || global?.systemEnv?.oneapiUrl || openaiBaseUrl;const apiKey = userKey?.key || global?.systemEnv?.chatApiKey || openaiBaseKey;return new OpenAI({baseURL: baseUrl,apiKey,httpAgent: global.httpsAgent,timeout,maxRetries: 2});
};

聊天完成接口

export const createChatCompletion = async ({body, userKey, timeout, options
}) => {const modelConstantsData = getLLMModel(body.model);const ai = getAIApi({ userKey, timeout });// 支持自定义请求路径和认证const response = await ai.chat.completions.create(body, {...options,...(modelConstantsData.requestUrl ? { path: modelConstantsData.requestUrl } : {}),headers: {...options?.headers,...(modelConstantsData.requestAuth ? { Authorization: `Bearer ${modelConstantsData.requestAuth}` } : {})}});// 判断响应类型const isStreamResponse = typeof response === 'object' && response !== null && ('iterator' in response || 'controller' in response);return { response, isStreamResponse };
};

3. Embedding 模型对接

Embedding 配置

export type EmbeddingModelItemType = {provider: ModelProviderIdType;model: string;name: string;// Token 配置defaultToken: number;                    // 默认分块TokenmaxToken: number;                        // 最大Tokenweight: number;                          // 训练权重// 处理配置normalization?: boolean;                 // 归一化处理hidden?: boolean;                        // 是否隐藏// 自定义配置defaultConfig?: Record<string, any>;     // 通用配置dbConfig?: Record<string, any>;          // 存储配置queryConfig?: Record<string, any>;       // 查询配置
};

向量化实现

export async function getVectorsByText({ model, input, type 
}: GetVectorProps) {const ai = getAIApi();// 根据类型选择配置const config = {...model.defaultConfig,...(type === EmbeddingTypeEnm.db && model.dbConfig),...(type === EmbeddingTypeEnm.query && model.queryConfig),model: model.model,input: [input]};const result = await ai.embeddings.create(config,model.requestUrl ? {path: model.requestUrl,headers: model.requestAuth ? {Authorization: `Bearer ${model.requestAuth}`} : undefined} : {});// 处理向量数据const vectors = await Promise.all(result.data.map(item => unityDimensional(item.embedding))  // 统一维度.map(item => {if (model.normalization) return normalization(item);  // 归一化return item;}));return { tokens: await countPromptTokens(input), vectors };
}// 统一向量维度到1536
function unityDimensional(vector: number[]) {if (vector.length > 1536) {return vector.slice(0, 1536);}const zeroVector = new Array(1536 - vector.length).fill(0);return vector.concat(zeroVector);
}// L2归一化处理
function normalization(vector: number[]) {if (vector.some(item => item > 1)) {const norm = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));return vector.map(val => val / norm);}return vector;
}

4. ReRank 模型对接

ReRank 实现

export function reRankRecall({model = getDefaultRerankModel(),query,documents
}: {model?: ReRankModelItemType;query: string;documents: { id: string; text: string }[];
}): Promise<ReRankCallResult> {const { baseUrl, authorization } = getAxiosConfig();return POST<PostReRankResponse>(model.requestUrl ? model.requestUrl : `${baseUrl}/rerank`,{model: model.model,query,documents: documents.map(doc => doc.text)},{headers: {Authorization: model.requestAuth ? `Bearer ${model.requestAuth}` : authorization},timeout: 30000}).then(data => {return data?.results?.map(item => ({id: documents[item.index].id,score: item.relevance_score}));});
}

5. 模型配置管理

配置文件结构

{"llmModels": [{"provider": "OpenAI","model": "gpt-4o-mini","name": "gpt-4o-mini","maxContext": 128000,"maxResponse": 16000,"quoteMaxToken": 120000,"vision": true,"datasetProcess": true,"usedInClassify": true,"usedInExtractFields": true,"usedInToolCall": true,"toolChoice": true,"functionCall": false,"defaultConfig": {},"fieldMap": {}}],"vectorModels": [{"provider": "OpenAI","model": "text-embedding-3-small","name": "text-embedding-3-small","defaultToken": 512,"maxToken": 3000,"weight": 100}],"reRankModels": [],"audioSpeechModels": [{"provider": "OpenAI","model": "tts-1","name": "OpenAI TTS1","voices": [{ "label": "Alloy", "value": "alloy" },{ "label": "Echo", "value": "echo" }]}],"whisperModel": {"provider": "OpenAI","model": "whisper-1","name": "Whisper1"}
}

动态模型管理

// 模型配置更新
export const updateModelConfig = async (modelData: any) => {// 验证模型配置const validatedModel = validateModelConfig(modelData);// 更新全局映射if (validatedModel.type === 'llm') {global.llmModelMap.set(validatedModel.model, validatedModel);} else if (validatedModel.type === 'embedding') {global.embeddingModelMap.set(validatedModel.model, validatedModel);}// 持久化配置await saveModelConfig(validatedModel);
};// 模型测试
export const testModel = async (modelConfig: any) => {try {if (modelConfig.type === 'llm') {const response = await createChatCompletion({body: {model: modelConfig.model,messages: [{ role: 'user', content: 'Hello' }],max_tokens: 10}});return { success: true, response };}if (modelConfig.type === 'embedding') {const result = await getVectorsByText({model: modelConfig,input: 'test text'});return { success: true, vectors: result.vectors };}} catch (error) {return { success: false, error: error.message };}
};

6. 多提供商支持

提供商适配

// 支持的模型提供商
export enum ModelProviderIdType {OpenAI = 'OpenAI',Anthropic = 'Anthropic',Google = 'Google',Baidu = 'Baidu',ByteDance = 'ByteDance',Moonshot = 'Moonshot',DeepSeek = 'DeepSeek',Other = 'Other'
}// 提供商特殊处理
const providerAdapters = {[ModelProviderIdType.OpenAI]: {formatRequest: (body) => body,formatResponse: (response) => response},[ModelProviderIdType.Anthropic]: {formatRequest: (body) => ({...body,// Claude 特殊格式转换}),formatResponse: (response) => ({// 响应格式标准化})}
};

字段映射处理

// 处理不同模型的字段差异
const applyFieldMapping = (body: any, fieldMap: Record<string, string>) => {const mappedBody = { ...body };Object.entries(fieldMap).forEach(([from, to]) => {if (mappedBody[from] !== undefined) {mappedBody[to] = mappedBody[from];delete mappedBody[from];}});return mappedBody;
};// 示例: o1 模型字段映射
const o1FieldMap = {"max_tokens": "max_completion_tokens"
};

7. 错误处理与监控

统一错误处理

const handleModelError = (error: any, modelConfig: any) => {addLog.error(`Model ${modelConfig.model} error`, {error: error.message,provider: modelConfig.provider,requestUrl: modelConfig.requestUrl});// 根据错误类型返回友好提示if (error.code === 'insufficient_quota') {return '模型配额不足,请检查账户余额';}if (error.code === 'model_not_found') {return '模型不存在,请检查模型配置';}return `模型调用失败: ${error.message}`;
};

性能监控

const monitorModelPerformance = async (modelCall: () => Promise<any>) => {const startTime = Date.now();try {const result = await modelCall();const duration = Date.now() - startTime;addLog.info('Model call success', {duration,tokens: result.tokens,cost: result.cost});return result;} catch (error) {const duration = Date.now() - startTime;addLog.error('Model call failed', {duration,error: error.message});throw error;}
};

总结

FastGPT 大模型对接核心实现了统一、灵活、可扩展的模型管理架构:

  1. 统一抽象: 通过标准化接口屏蔽不同模型的差异
  2. 多模型支持: LLM、Embedding、ReRank、TTS、STT 全覆盖
  3. 灵活配置: 支持自定义请求路径、认证、字段映射
  4. 动态管理: 运行时模型配置更新和测试
  5. 错误处理: 完善的错误处理和性能监控
  6. 提供商适配: 支持主流 AI 服务提供商

这套架构为 FastGPT 提供了强大的 AI 能力集成基础,支持快速接入新的模型和提供商。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95839.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95839.shtml

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

相关文章

AI Compass前沿速览:Kimi K2、InfinityHuman-AI数字人、3D-AI桌面伴侣、叠叠社–AI虚拟陪伴

AI Compass前沿速览&#xff1a;Kimi K2、InfinityHuman-AI数字人、3D-AI桌面伴侣、叠叠社–AI虚拟陪伴 AI-Compass 致力于构建最全面、最实用、最前沿的AI技术学习和实践生态&#xff0c;通过六大核心模块的系统化组织&#xff0c;为不同层次的学习者和开发者提供从完整学习路…

如何下载B站视频,去水印,翻译字幕

首先先来看下如何下载B站视频及音频工具&#xff1a;手机下载视频打开文件管理器&#xff0c;找到video.m4s和audio.m4s两个文件更改文件后缀名第一步到此为止然后我们再来看一下如何去水印&#xff0c;去字幕工具&#xff1a;剪映导入视频选择蒙版 > 镜面点击反转点击基础&…

用 Cursor AI 快速开发你的第一个编程小程序

Cursor AI 作为新一代 AI 编程助手&#xff0c;集成了代码补全、智能调试、自动生成等强大功能&#xff0c;非常适合用来开发小型应用或小程序。本文我将手把手带你用 Cursor AI 开发一个简单的天气查询小程序&#xff0c;并在文中推荐一门实用的商业变现课程&#xff0c;助你走…

MacOS 使用 luarocks+wrk+luajit

MacOS 使用 luarockswrkluajit luarocks 默认使用的是 lua 5.4 版本&#xff0c;一些工具&#xff0c;例如 wrk 使用的 lua 5.1&#xff0c;那么 luarocks 在安装依赖的时候就需要指定 lua 5.1。 luarocks config 配置 lua 5.1 请确保已经安装了 lua5.1 或者 luajit&#xff0c…

PostgreSQL18-FDW连接的 SCRAM 直通身份验证

PostgreSQL18-FDW连接的 SCRAM 直通身份验证 PostgreSQL 18 为使用 postgres_fdw 或 dblink_fdw 的人带来了很好的改进&#xff1a;SCRAM 直通身份验证。设置外部服务器连接时&#xff0c;您不再需要在“用户映射”选项中存储纯文本密码。 这是实现它的提交&#xff1a; commit…

“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门

在分布式系统中&#xff0c;有效应对节点故障、网络分区延迟和数据一致性等挑战至关重要。本文将剖析保障分布式系统可靠性的核心机制&#xff1a;数据分片实现水平扩展&#xff0c;冗余副本保障数据高可用&#xff0c;租约&#xff08;Lease&#xff09;机制优化节点状态共识与…

【代码随想录算法训练营——Day4】链表——24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II

LeetCode题目链接 https://leetcode.cn/problems/swap-nodes-in-pairs/ https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/ https://leetcode.cn/problems/linked-list-cycle…

C#中一段程序类比博图

using system //博图中要使用自带指令库&#xff0c;指令库名称叫systemnamespace Simple//博图建立程序&#xff0c;分诊断文件夹&#x1f4c2;&#xff0c;vision文件夹&#xff0c;通讯Db文件夹&#x1f4c2;等等&#xff0c;simple类似博图中的文件夹名称{class Program//程…

vue飞自在酒店管理系统(代码+数据库+LW)

摘 要 近年来&#xff0c;随着科技的迅猛进步和经济全球化的深入发展&#xff0c;互联网技术正以前所未有的速度提升社会综合发展的效能。这一技术的影响力已渗透到各行各业&#xff0c;其中&#xff0c;飞自在酒店管理系统在互联网时代背景下扮演着举足轻重的角色。信息管理…

2025年统计与数据分析领域专业认证发展指南

在数据驱动决策日益重要的背景下&#xff0c;专业认证作为提升统计学和数据分析能力的一种方式&#xff0c;受到越来越多从业者的关注。本文基于行业发展趋势&#xff0c;分析6个相关领域的专业资格认证&#xff0c;为专业人士提供参考。一、数据分析能力认证含金量CDA数据分析…

激光频率梳 3D 轮廓测量 - 油路板的凹槽深度和平面度测量

一、引言油路板作为液压系统核心部件&#xff0c;其凹槽深度与平面度精度直接影响油液流动特性与密封性能。传统测量方法在面对复杂油路结构时存在效率低、精度不足等问题。激光频率梳 3D 轮廓测量技术凭借时频基准优势&#xff0c;为油路板关键参数测量提供了新路径&#xff0…

七彩喜微高压氧舱:科技与体验的双重革新,重新定义家用氧疗新标杆

在高压氧舱市场竞争日益激烈的今天&#xff0c;七彩喜微高压氧舱凭借其独特的技术创新、极致的用户体验和贴心的服务生态&#xff0c;在众多品牌中脱颖而出。它不仅是一台设备&#xff0c;更是一个“懂你需求、护你健康”的智能健康伙伴。对比其他品牌&#xff0c;七彩喜的优势…

[光学原理与应用-418]:非线性光学 - 数学中的线性函数与非线性函数

线性函数与非线性函数是数学和工程领域中描述变量关系的基础工具&#xff0c;二者在定义、性质、图像特征及应用场景上存在本质差异。以下从核心概念、数学特性、图像对比、应用场景及实际案例五个维度展开详细分析&#xff1a;一、核心概念&#xff1a;线性 vs 非线性线性函数…

前端登录鉴权详解

1.cookie-session1. cookiecookie简单来说就是浏览器客户端在请求时会携带的一个字段数据&#xff0c;常用与保存当前用户状态并在请求时携带给服务端验证。2. sessionsession简单来说就是服务单对于每一个用户生成一个用户会话标识session /session id&#xff0c;并返回给客户…

从零实现 LLM(上):原理讲透 + 最小可运行 GPT

引言 为什么要学习 LLM&#xff1f; 当你和 ChatGPT 对话时&#xff0c;它不仅能回答你的问题&#xff0c;还能续写故事、记住上下文&#xff0c;甚至调整风格。你可能会想&#xff1a;它是怎么做到的&#xff1f; 答案就是&#xff1a;大语言模型&#xff08;Large Languag…

浪潮科技Java开发面试题及参考答案(120道题-下)

如何给 MySQL 表添加索引?添加索引的语法是什么?添加索引时需要考虑哪些因素(如字段类型、查询频率、索引选择性)? 给 MySQL 表添加索引需根据业务需求选择合适的索引类型,不同类型的索引语法不同,同时需综合评估字段特性、查询模式等因素,避免无效或过度索引。 一、…

大数据毕业设计选题推荐-基于大数据的宫颈癌风险因素分析与可视化系统-Spark-Hadoop-Bigdata

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【PyTorch实战:Tensor变形】5、 PyTorch Tensor指南:从基础操作到Autograd与GPU加速实战

一、Tensor核心概念解析 1.1 什么是Tensor? Tensor是PyTorch中最基本的数据结构,也是深度学习框架的核心计算单元。我们可以将Tensor理解为多维数组的统一表示,它在PyTorch中的地位相当于NumPy中的ndarray,但具有两个关键增强特性:GPU加速支持和自动求导能力。 1.2 为…

2025年我国具身智能产业链全景分析

一、具身智能产业概述与定义 1.1 具身智能的基本概念与内涵 具身智能&#xff08;Embodied Intelligence&#xff09;是指通过物理实体与环境进行交互的智能系统&#xff0c;其核心在于将感知、决策和执行紧密结合&#xff0c;使智能体能够在动态环境中自主感知、学习和执行任务…

VMWare上搭建大数据集群

文章目录1. 采用软件较新版本2. 准备三台虚拟机3. 搭建Hadoop集群3.1 在主节点上配置Hadoop3.1.1 编辑映射文件3.1.2 配置免密登录3.1.3 配置JDK3.1.4 配置Hadoop3.2 从主节点分发到从节点3.3 格式化名称节点3.4 启动Hadoop集群3.5 使用Hadoop WebUI3.6 运行MR应用&#xff1a;…