從源碼深入理解One-API框架:適配器模式實現LLM接口對接

1. 概述

one-api 是一個開源的 API 框架,基于go語言開發,旨在提供統一的接口調用封裝,支持多種 AI 服務平臺的集成。通過 Gin 和 GORM 等框架,框架簡化了多種 API 服務的調用流程。通過適配器模式實現了與多種 大模型API 服務的集成,而無需每次都重新編寫調用邏輯。使得開發者能夠專注于業務邏輯,而不是各個平臺間的差異化處理。
在本文中,將深入解讀 one-api 框架的工作原理,詳細講解框架的結構與實現,并通過集成阿里靈積DashScope大模型服務 API 為例,展示其適配器實現。
在這里插入圖片描述

2. 路由與控制器

在 one-api 中,所有的 API 請求都會通過 Gin 框架來處理。以下是一個典型的請求路由:
?? relayV1Router.POST("/chat/completions", controller.Relay) ?
在這里插入圖片描述

和大模型交互相關的核心邏輯都集中在 controller.Relay函數中。
????在這里插入圖片描述
如上圖是Relay函數的實現,主要完成三個事情:
(1)獲取relayMode
(2)根據repayMode請求LLM接口
(3)異常處理及重試

3. GetByPath函數

GetByPath 函數會根據請求路徑返回不同的 relayMode,比如文本生成、圖像生成或音頻處理等。
在這里插入圖片描述

4. relayHelper函數

根據獲取到的 relayMode,框架會調用不同的處理方法。具體代碼如下:
在這里插入圖片描述
如果 relayMode 為文本請求,則調用 controller.RelayTextHelper(c);如果是圖像生成請求,則調用 RelayImageHelper 等。

5. RelayTextHelper函數

RelayTextHelper 是 one-api 框架中負責處理文本請求的核心函數,它包含了一系列的操作步驟來完成整個請求的處理流程。

  • 從請求中獲取并驗證 textRequest
  • 獲取待調用的模型名稱
  • 設置system prompt
  • 獲取請求的配額和使用限制
  • 預消耗配額
  • 根據APIType獲取適配器adaptor
  • 構建對應adaptor的請求體
  • 使用對應的adaptor的向大模型發起請求
  • 處理封裝請求結果
  • 最終消耗扣減配額
    整個過程絕大多數的過程都是在?做參數轉換及參數設置,比較關鍵的一步是“構建實際的請求體”。使用適配器模式對各種大模型接口進行適配,根據不同的apiType得到不同的適配器對象,如openai.Adaptor、ali.Adaptor、baidu.Adaptor、zhipu.Adaptor等。

注:apiType的獲取方式為:
meta.APIType = channeltype.ToAPIType(meta.ChannelType),即與在one-api管理頁面上配置的渠道類型一致,如果配置的是“阿里通義千問”,那么apiType就為apitype.Ali。具體可參見源碼中的relay/channeltype/helper.go中的ToAPIType(channelType int) int函數,在此不做贅述。
在這里插入圖片描述
Adaptor是一個接口,定義了如下方法:
在這里插入圖片描述
接入第三方LLM接口的時候只需要實現對應的適配器即可完成對接,截止發文當日one-api已經集成了近40家AI廠商的大模型接口,包括國內的baidu、ali、doubao、zhipu等。
在這里插入圖片描述

6. 阿里靈積DashScope適配

以下是阿里靈積DashScope大模型服務的適配器實現:

package alitype Adaptor struct {meta *meta.Meta
}func (a *Adaptor) Init(meta *meta.Meta) {a.meta = meta
}func (a *Adaptor) GetRequestURL(meta *meta.Meta) (string, error) {fullRequestURL := ""switch meta.Mode {case relaymode.Embeddings:fullRequestURL = fmt.Sprintf("%s/api/v1/services/embeddings/text-embedding/text-embedding", meta.BaseURL)case relaymode.ImagesGenerations:fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/text2image/image-synthesis", meta.BaseURL)default:fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/text-generation/generation", meta.BaseURL)}return fullRequestURL, nil
}func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *meta.Meta) error {adaptor.SetupCommonRequestHeader(c, req, meta)if meta.IsStream {req.Header.Set("Accept", "text/event-stream")req.Header.Set("X-DashScope-SSE", "enable")}req.Header.Set("Authorization", "Bearer "+meta.APIKey)if meta.Mode == relaymode.ImagesGenerations {req.Header.Set("X-DashScope-Async", "enable")}if a.meta.Config.Plugin != "" {req.Header.Set("X-DashScope-Plugin", a.meta.Config.Plugin)}return nil
}func (a *Adaptor) ConvertRequest(c *gin.Context, relayMode int, request *model.GeneralOpenAIRequest) (any, error) {if request == nil {return nil, errors.New("request is nil")}switch relayMode {case relaymode.Embeddings:aliEmbeddingRequest := ConvertEmbeddingRequest(*request)return aliEmbeddingRequest, nildefault:aliRequest := ConvertRequest(*request)return aliRequest, nil}
}func (a *Adaptor) ConvertImageRequest(request *model.ImageRequest) (any, error) {if request == nil {return nil, errors.New("request is nil")}aliRequest := ConvertImageRequest(*request)return aliRequest, nil
}func (a *Adaptor) DoRequest(c *gin.Context, meta *meta.Meta, requestBody io.Reader) (*http.Response, error) {return adaptor.DoRequestHelper(a, c, meta, requestBody)
}func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *meta.Meta) (usage *model.Usage, err *model.ErrorWithStatusCode) {if meta.IsStream {err, usage = StreamHandler(c, resp)} else {switch meta.Mode {case relaymode.Embeddings:err, usage = EmbeddingHandler(c, resp)case relaymode.ImagesGenerations:err, usage = ImageHandler(c, resp)default:err, usage = Handler(c, resp)}}return
}func (a *Adaptor) GetModelList() []string {return ModelList
}func (a *Adaptor) GetChannelName() string {return "ali"
}

這段代碼實現了 Adaptor 接口,適配了阿里云 AI 服務的請求和響應處理。通過一系列方法,Adaptor 能夠完成以下任務:

  • 根據請求模式生成 API 請求 URL。
  • 設置 HTTP 請求頭,包括授權信息、流式請求標識等。
  • 將通用請求數據轉換為阿里云特定的請求格式。
  • 向阿里云服務發起請求,并處理響應。
  • 獲取支持的模型列表和通道名稱。
  • 它為 one-api 框架提供了對阿里云 AI 服務的無縫集成,簡化了與阿里云接口交互的代碼。

總結

綜合上述內容,通過一張時序圖來說明整個調用流程:
在這里插入圖片描述

參考說明

one-api:https://github.com/songquanpeng/one-api
gorm: https://gorm.io/zh_CN/docs/index.html
gin: https://gin-gonic.com/zh-cn/docs/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67383.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67383.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67383.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025神奇的數字—新年快樂

2025年,一個神奇的數字,承載著數學的奧秘與無限可能。它是45的平方(45),上一個這樣的年份是1936年(44),下一個則是2116年(46),一生僅此一次。2025…

Python的列表基礎知識點(超詳細流程)

目錄 一、環境搭建 二、列表 2.1 詳情 2.2 列表定義 2.3 列表長度 2.4 列表索引 2.5 切片索引 2.6 添加 2.7 插入 2.8 剔除 2.8.1 pop方法 2.8.2 del方法 2.9 任何數據類型 2.10 拼接 2.10.1 “” 2.10.2 “*” 2.11 逆序 ?編輯 2.12 計算出現次數 2.13 排序…

人工智能如何驅動SEO關鍵詞優化策略的轉型與效果提升

內容概要 隨著數字化時代的到來,人工智能(AI)技術對各行各業的影響日益顯著,在搜索引擎優化(SEO)領域尤為如此。AI的應用不僅改變了關鍵詞研究的方法,而且提升了內容生成和搜索優化的效率&…

Qt Ribbon使用實例

采用SARibbon創建簡單的ribbon界面 實例代碼如下所示&#xff1a; 1、頭文件&#xff1a; #pragma once #include <SARibbonBar.h> #include "SARibbonMainWindow.h" class QTextEdit; class SAProjectDemo1 : public SARibbonMainWindow { Q_OBJECT pub…

CISCO路由基礎全集

第一章&#xff1a;交換機的工作原理和基本技能_交換機有操作系統嗎-CSDN博客文章瀏覽閱讀1.1k次&#xff0c;點贊24次&#xff0c;收藏24次。交換機可看成是一臺特殊的計算機&#xff0c;同樣有CPU、存儲介質和操作系統&#xff0c;只是與計算機的稍有不同。作為數據交換設備&…

計算機畢業設計Django+Tensorflow音樂推薦系統 機器學習 深度學習 音樂可視化 音樂爬蟲 知識圖譜 混合神經網絡推薦算法 大數據畢設

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

單機偽分布Hadoop詳細配置

目錄 1. 引言2. 配置單機Hadoop2.1 下載并解壓JDK1.8、Hadoop3.3.62.2 配置環境變量2.3 驗證JDK、Hadoop配置 3. 偽分布Hadoop3.1 配置ssh免密碼登錄3.2 配置偽分布Hadoop3.2.1 修改hadoop-env.sh3.2.2 修改core-site.xml3.2.3 修改hdfs-site.xml3.2.4 修改yarn-site.xml3.2.5 …

在ubuntu下一鍵安裝 Open WebUI

該腳本用于自動化安裝 Open WebUI&#xff0c;并支持以下功能&#xff1a; 可選跳過 Ollama 安裝&#xff1a;通過 --no-ollama 參數跳過 Ollama 的安裝。自動清理舊目錄&#xff1a;如果安裝目錄 (~/open-webui) 已存在&#xff0c;腳本會自動刪除舊目錄并重新安裝。完整的依…

AJAX筆記入門篇

黑馬程序員視頻地址&#xff1a; 黑馬程序員前端AJAX入門到實戰全套教程https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p2https://www.bilibili.com/video/BV1MN411y7pw?vd_source…

工作總結:git篇

文章目錄 前言基礎Gerrit1.克隆2.新建本地分支和checkout3.添加到暫存區新增文件到暫存區修改已經添加到暫存區的文件取消添加到暫存區的文件 4.提交到本地倉庫在不重復提交的情況下&#xff0c;修改本次提交 5.提交到遠程倉庫6.評審其他輔助命令 前言 目前也算是工作一段時間…

< OS 有關> BaiduPCS-Go 程序的 菜單腳本 Script: BaiduPCS-Go.Menu.sh (bdgo.sh)

目標&#xff1a; 使用 日本阿里云的 VPM 傳輸文件。 暫時方案&#xff1a; 使用 主機JPN 下載 https://huggingface.co/ 上模型從 JPN 放到 度狗上在家里從狗度下載 為了減少編程&#xff0c;盡量使用現在軟件 &#xff0c;就找到 GitHub - qjfoidnh/BaiduPCS-Go: iikira…

項目測試之MockMvc

文章目錄 基礎基礎概念Mockxxx一般實現文件位置 實戰MockMvc與Test注解不兼容RequestParams參數RequestBody參數 基礎 基礎概念 定義&#xff1a;是Spring框架提供的一種用于測試Spring MVC控制器的工具&#xff0c;它允許開發者在不啟動完整的web服務器的情況下&#xff0c;…

(詳細)Springboot 整合動態多數據源 這里有mysql(分為master 和 slave) 和oracle,根據不同路徑適配不同數據源

文章目錄 Springboot 整合多動態數據源 這里有mysql&#xff08;分為master 和 slave&#xff09; 和oracle1. 引入相關的依賴2. 創建相關配置文件3. 在相關目錄下進行編碼&#xff0c;不同路徑會使用不同數據源 Springboot 整合多動態數據源 這里有mysql&#xff08;分為maste…

計算機網絡之計算機網絡的分類

計算機網絡可以根據不同的角度進行分類&#xff0c;以下是幾種常見的分類方式&#xff1a; 1. 按照規模和范圍&#xff1a; 局域網&#xff08;LAN&#xff0c;Local Area Network&#xff09;&#xff1a;覆蓋較小范圍&#xff08;例如一個建筑物或校園&#xff09;&#xf…

騰訊云開發提供免費GPU服務

https://ide.cloud.tencent.com/dashboard/web 適用于推理場景&#xff0c;每個月10000分鐘免費時長 166 小時 40 分鐘 自帶學術加速&#xff0c;速度還是不錯的 白嫖 Tesla T4 16G 算力 顯存&#xff1a;16GB 算力&#xff1a;8 TFlops SP CPU&#xff1a;8 核 內存&#…

國內外大語言模型領域發展現狀與預期

在數字化浪潮中&#xff0c;大語言模型已成為人工智能領域的關鍵力量&#xff0c;深刻影響著各個行業的發展軌跡。下面我們將深入探討國內外大語言模型領域的發展現狀以及未來預期。 一、發展現狀 &#xff08;一&#xff09;國外進展 美國的引領地位&#xff1a;OpenAI 的 …

存儲過程優化實踐:統一返回結構、參數 JSON 化與事務原子化

存儲過程作為數據庫中執行復雜業務邏輯的重要工具&#xff0c;在提升性能、保障數據一致性和簡化維護方面發揮著重要作用。然而&#xff0c;隨著應用程序和數據的復雜度不斷增加&#xff0c;存儲過程也面臨著性能瓶頸、維護難度和擴展性問題。為了應對這些挑戰&#xff0c;優化…

Lustre Core 語法 - 布爾表達式

Lustre v6 中的 Lustre Core 部分支持的表達式種類中&#xff0c;支持布爾表達式。相關的表達式包括and, or, xor, not, #, nor。 相應的文法定義為 Expression :: not Expression| Expression and Expression| Expression or Expression | Expression xor Expression | # (…

DeepSeek--通向通用人工智能的深度探索者

一、詞源與全稱 “DeepSeek"由"Deep”&#xff08;深度&#xff09;與"Seek"&#xff08;探索&#xff09;組合而成&#xff0c;中文譯名為"深度求索"。其全稱為"深度求索人工智能基礎技術研究有限公司"&#xff0c;英文對應"De…

模板生成引擎技術介紹

模板生成引擎技術介紹 什么是模板生成引擎&#xff1f; 模板生成引擎是一種用于將數據與預定義的格式相結合&#xff0c;以生成最終文檔或網頁的技術。它允許開發者通過定義模板和填充數據來自動化內容創建過程。這種技術廣泛應用于網站開發、報告生成、電子郵件定制等多個領…