【AI插件開發】Notepad++ AI插件開發實踐:支持多平臺多模型

引言

上篇文章我們的Notepad++插件介紹到Dock窗口集成,本篇將繼續完善插件功能,主要包括兩個部分:

  • 支持多平臺、多模型
  • 支持多種授權驗證、接口類型

一、多平臺

原先的配置項很簡單:

// PluginConf.h
class PlatformConf {
public:std::string _baseUrl;      // API基礎地址std::string _apiSkey;      // 認證密鑰std::string _modelName;    // 模型標識std::string _generateEndpoint; // 生成接口std::string _chatEndpoint; // 對話接口
};

但是插件本身可能需要接入多個平臺,因此有必要支持多平臺,因此需要重新設計配置文件,如下:

{// 當前選用的運行平臺標識// 必須與下方platforms對象中的某個平臺鍵名完全一致// 系統將根據此字段加載對應的平臺配置"platform": "OurCopDev",// 多平臺環境配置集合// 支持預定義多個平臺的配置參數,便于快速切換環境// 每個鍵名代表平臺標識,建議采用有明確含義的命名(如環境類型/業務線)"platforms": {// Infini平臺配置(示例第三方系統集成)// 可包含API地址、認證信息、超時設置等參數"infini": {// 平臺配置項示例:// "api_endpoint": "https://api.infini.ai",// "auth_token": "xxx-xxx-xxx"},// 生產環境配置// 通常包含正式環境地址、生產用密鑰等敏感信息"OurCopProd": {// 平臺配置項示例:},// 開發環境配置// 一般包含測試服務器地址、調試參數等非生產配置"OurCopDev": {// 典型配置項}}
}

這樣,插件根據當前的配置平臺名稱platform支持使用不同的AI平臺

二、多模型

因為一般平臺會提供多個內置的模型,因此需要在此基礎上,支持用戶選擇不同的模型。

此外,不同的平臺接口也不一樣,有的是https,有的是http,有的是post接口,有的是get接口,因此針對各種情況需要抽象細化需求,最終整理設計的平臺配置內容如下:

{// SSL配置開關// true: 啟用HTTPS協議,所有請求將通過加密通道傳輸// false: 使用HTTP協議(不建議生產環境使用)// 注意:啟用時需確保服務端配置了有效的SSL證書"enable_ssl": true,// 基礎服務地址// API請求的根域名/地址,所有接口路徑將基于此地址拼接// 示例:https://cloud.infini-ai.com/maas/v1/..."base_url": "cloud.infini-ai.com",// 當前激活的模型名稱// 必須與models列表中某個值完全匹配// 用于默認的API請求參數"model_name": "deepseek-r1-distill-qwen-32b",// 可用模型清單// 平臺支持的全部模型列表(可動態更新)// 可通過models_endpoint接口自動獲取或手動維護"models": [ "deepseek-r1-distill-qwen-32b","deepseek-r1","deepseek-v3"],// 文本生成接口配置// 用于單輪文本生成的API端點設置// prompt字段當前未使用(可能為兼容舊版本保留)"generate_endpoint": {"method": "post",    // HTTP請求方法"api": "/maas/v1/completions",  // 接口路徑"prompt": ""        // 保留字段(未來可能用于預設提示詞)},// 對話接口配置// 支持多輪對話的API端點設置// prompt字段當前未使用(可能用于會話初始化模板)"chat_endpoint": {"method": "post","api": "/maas/v1/chat/completions","prompt": ""},// 模型列表接口配置// 用于動態獲取可用模型列表的API配置// 需要至少包含method和api字段才能啟用自動更新// 示例可添加://   "method": "get",//   "api": "/maas/v1/models",//   "auth_required": true  // 是否需要鑒權"models_endpoint": {}  
}

補充說明:

  1. 接口路徑均基于base_url拼接,如最終生成接口地址為:
    https://cloud.infini-ai.com/maas/v1/completions
  2. models_endpoint若配置正確,系統可自動更新models列表(目前尚未實現),否則需手動維護
  3. prompt字段的保留設計可能用于未來支持預設提示詞模板功能
成功
失敗
已配置
未配置
啟用認證
Basic
Bearer
ApiKey
成功
失敗
插件啟動
讀取配置文件
解析platform字段
匹配platforms配置
加載對應平臺參數
使用默認配置
初始化HTTP客戶端
檢查models_endpoint
自動拉取模型列表
使用預設models列表
更新models配置
用戶選擇模型
構建API請求
檢查認證配置
調用GetAuthorizationHeader
認證類型判斷
生成Basic頭
生成Bearer頭
生成API Key頭
合并請求頭
發送HTTP請求
響應處理
返回結果
重試/報錯

三、兼容不同的授權方式

1. API Key(最常見)

  • 原理:客戶端在請求頭或參數中攜帶唯一密鑰,服務端驗證密鑰有效性。
  • 典型場景
    • OpenAI、訊飛星火等大模型 API 調用(如 X-API-Key: your_key)。
    • 云服務商提供的 AI 服務(如圖像識別、自然語言處理)。
  • 優勢:輕量、易集成,適合開放平臺和第三方調用。
  • 安全建議
    • 限制密鑰權限范圍(如綁定 IP、設置調用頻率)。
    • 定期輪換密鑰,防范泄露風險。

2. OAuth 2.0(第三方授權)

  • 原理:通過授權服務器頒發 access_token,客戶端攜帶令牌訪問 AI 服務。
  • 典型場景
    • 需要用戶授權的 AI 服務(如企業級模型調用、個性化推薦)。
    • 微信/QQ 登錄后調用 AI 能力。
  • 流程
    1. 用戶授權 → 2. 獲取 code → 3. 兌換 access_token → 4. 調用 API。
  • 優勢:支持細粒度權限控制,適合生態化平臺。

3. JWT(無狀態令牌)

  • 原理:服務端生成含用戶信息和過期時間的加密 Token,客戶端后續請求攜帶。
  • 典型場景
    • 分布式 AI 服務調用(如多模型協同推理)。
    • 移動端或單頁應用調用 AI 接口(如語音合成、對話機器人)。
  • 結構Header.Payload.Signature(如 xxxxx.yyyyy.zzzzz)。
  • 優勢:無狀態,減輕服務端壓力;支持短時效+刷新機制。

4. HMAC(防篡改簽名)

  • 原理:客戶端與服務端共享密鑰,對請求內容(時間戳、請求體)生成簽名。
  • 典型場景
    • 金融風控模型調用、支付驗證等高安全場景。
    • 防止請求被篡改或重放攻擊。
  • 示例頭
    Authorization: HMAC-SHA256 key_id="123", signature="abc123..."
    
  • 優勢:確保請求完整性和身份真實性。

5. Basic Auth(基礎認證)

  • 原理:HTTP 頭攜帶 username:password 的 Base64 編碼。
  • 典型場景
    • 內部測試環境或低風險 AI 服務調用。
    • 配合 HTTPS 使用以加密傳輸。
  • 示例頭
    Authorization: Basic base64encode("user:pass")
    
  • 局限:明文傳輸風險,需嚴格依賴 HTTPS。

6. 授權實現

基于常見的類型,本插件自持不同的header方式的認證授權方式。

授權流程
Header
Para
DeliveryType
認證配置解析
構造HTTP頭
構造請求參數
Basic認證編碼
Bearer Token拼接
API Key處理
Base64加密
注入認證信息
完成請求準備
抽象定義結構對象
class AuthorizationConf : public IConfig
{
public:// 授權類型枚舉,定義支持的認證授權方式 enum class AuthType{None,    // 無認證授權 Basic,   // 基礎認證(用戶名+密碼的Base64編碼)Bearer,  // Bearer Token認證(如JWT/OAuth 2.0令牌)ApiKey   // API Key認證(支持云服務/AI模型調用場景)};// 參數傳遞方式枚舉,定義認證信息傳輸位置 enum class DeliveryType{Header,  // 通過HTTP請求頭傳遞(如Authorization頭)Para     // 通過請求參數傳遞(如URL參數或POST參數)};AuthType eAuthType = AuthType::None;          // 當前配置的授權類型,默認關閉認證 DeliveryType eDeliveryType = DeliveryType::Header; // 認證信息傳遞方式,默認使用請求頭 // 認證授權數據,內容格式與授權類型強相關:// - Basic: "username:password"的Base64編碼 // - Bearer: "access_token"字符串 // - ApiKey: 明文密鑰(如"X-API-Key: your_key")std::string auth_data; 
};

注解說明:

  1. AuthType 枚舉:覆蓋主流認證方式,其中:

    • Basic 對應HTTP基礎認證,需配合HTTPS使用
    • Bearer 適用于JWT/OAuth 2.0等令牌體系
    • ApiKey 常用于云服務商API調用(如阿里云OSS的C++ SDK)
  2. DeliveryType 枚舉:區分認證信息的傳輸載體:

    • Header 符合RESTful API設計規范(如Authorization: Bearer xxx
    • Para 多用于簡易場景或兼容舊系統
  3. auth_data 格式:需根據認證類型動態調整內容:

    • Basic認證需按user:pass格式Base64編碼
    • API Key通常直接使用明文密鑰(需HTTPS保障安全)
定義配置加載函數
virtual void from_json(const nlohmann::json& j) override
{std::string strVal;if (Util::JsonGet(j, "type", strVal)){eAuthType = AuthType::None;if (!Util::icasecompare(strVal, "Basic")){eAuthType = AuthType::Basic;}if (!Util::icasecompare(strVal, "Bearer")){eAuthType = AuthType::Bearer;}if (!Util::icasecompare(strVal, "ApiKey")){eAuthType = AuthType::ApiKey;}}Util::JsonGet(j, "data", auth_data);
}
實現接口授權信息的設置
bool AiModel::GetAuthorizationHeader(const AuthorizationConf& auth, std::string& hkey, std::string& hval)
{hkey = "";  // 初始化HTTP頭鍵名hval = "";  // 初始化HTTP頭值const std::string& auth_data = auth.auth_data;  // 獲取認證配置數據switch (auth.eAuthType) {// 無認證授權時直接返回成功(空頭信息)case AuthorizationConf::AuthType::None:return true;  // 無認證場景直接通過case AuthorizationConf::AuthType::Basic: {// Basic認證需要"username:password"格式size_t colonPos = auth_data.find(':');if (colonPos == std::string::npos) return false;  // 缺少分隔符格式錯誤std::string encoded = Util::Base64Encode(auth_data);  // 對憑證進行Base64編碼hkey = "Authorization";  // 固定使用標準HTTP頭hval = "Basic " + encoded;  // 符合RFC 7617規范return true;}case AuthorizationConf::AuthType::Bearer:{if (auth_data.empty()) return false;  // 空Token無效hkey = "Authorization";  // 標準Bearer Token頭hval = "Bearer " + auth_data;  // 符合RFC 6750規范return true;}case AuthorizationConf::AuthType::ApiKey: {if (auth.eDeliveryType == AuthorizationConf::DeliveryType::Header) {// 支持自定義頭格式或默認X-API-Key頭size_t colonPos = auth_data.find(':');if (colonPos != std::string::npos) {// 用戶自定義頭格式(如"X-Custom-Key: value")hkey = Util::Trim(auth_data.substr(0, colonPos));  // 提取頭名稱hval = Util::Trim(auth_data.substr(colonPos + 1));  // 提取頭值}else {// 默認使用行業通用的X-API-Key頭hkey = "X-API-Key";hval = auth_data;}return true;}// 參數傳遞需在URL構造階段處理,此處無法支持return false;}default:return false;  // 未知認證類型處理失敗}return true;  // 默認返回(實際不可達)
}

注解說明:

  1. 函數職責:根據認證配置生成HTTP請求頭的鍵值對,支持多種認證方式的動態適配

  2. Basic認證實現

    • 嚴格校驗username:password格式
    • 使用Base64編碼但非加密(需配合HTTPS)
  3. Bearer Token處理

    • 直接拼接Bearer 前綴,符合RFC 6750規范
    • 適用于JWT/OAuth 2.0等令牌體系
  4. API Key機制

    • 支持靈活的頭定義(如云服務商特定要求)
    • 默認使用X-API-Key頭(遵循行業慣例)
    • 參數傳遞方式需在URL構造時實現(如?api_key=xxx
設置授權認證信息
// 初始化HTTP請求頭,設置默認的Content-Type為JSON格式,確保數據以UTF-8編碼傳輸
std::unordered_map<std::string, std::string> headers = {{"Content-Type", "application/json; charset=UTF-8"}
};// 從授權配置中提取認證名稱和值,若獲取成功且認證名稱非空則添加到請求頭
std::string authName, authValue;
if (GetAuthorizationHeader(plat.authorization, authName, authValue) && !authName.empty()) {headers[authName] = authValue;  // 動態添加認證信息到請求頭
}// 將構建完成的請求頭綁定到HTTP客戶端實例,后續請求將自動攜帶這些頭信息
cli.SetHeaders(headers);

注解說明:

  1. headers初始化塊通過顯式設置Content-Type聲明了數據交換格式,這符合RESTful接口的通用規范
  2. GetAuthorizationHeader的返回值校驗結合了空值檢查,確保認證字段有效性(如Bearer Token或API Key)
  3. 使用unordered_mapoperator[]進行鍵值操作,保證認證頭的高效存取(O(1)時間復雜度)
  4. SetHeaders調用將配置固化到客戶端實例,符合C++ RAII(Resource Acquisition Is Initialization)設計原則

四、總結說明

1. 架構設計核心價值

本AI插件通過分層解耦設計實現了三大核心能力:

  • 平臺無關性:通過platforms配置體系(如OurCopDev/infini)實現多環境快速切換
  • 模型動態適配:支持models_endpoint自動發現機制,結合手動配置保障兼容性
  • 認證統一抽象:封裝主流授權方式(Basic/Bearer/ApiKey等),滿足從測試到生產的全場景需求

2. 未來演進方向

模塊當前狀態規劃能力
模型管理手動維護models列表實現models_endpoint自動同步
授權體系支持Header傳遞擴展DeliveryType::Para參數級認證
協議支持HTTP/HTTPS雙模增加WebSocket實時接口支持
性能優化單線程請求引入異步協程提升并發能力

3. 配置模板

{"platform": "OurCopDev","timeout": 90,"platforms": {"infini": {"enable_ssl": true,"base_url": "cloud.infini-ai.com","authorization": {"type": "Bearer","data": "sk-**"},"model_name": "deepseek-r1-distill-qwen-32b","models": [ "deepseek-r1-distill-qwen-32b", "deepseek-r1", "deepseek-v3" ],"generate_endpoint": {"method": "post","api": "/maas/v1/completions","prompt": ""},"chat_endpoint": {"method": "post","api": "/maas/v1/chat/completions","prompt": ""},"models_endpoint": {}},"OurCopProd": {"enable_ssl": true,"base_url": "open.arbboter.com.cn","authorization": {"type": "ApiKey","data": "api-key:k****"},"model_name": "qwq_32b","models": [ "qwq_32b", "deepseek_v3_0324", "deepseek_r1_671b" ],"generate_endpoint": {"method": "post","api": "/maas/v1/completions","prompt": ""},"chat_endpoint": {"method": "post","api": "/prod/llm/personal/v1/chat/completions","prompt": ""},"models_endpoint": {}},"OurCopDev": {"enable_ssl": false,"base_url": "openapi.arbboter.com","authorization": {"type": "ApiKey","data": "api-key:k****"},"model_name": "deepseek_r1_671b","models": [ "qwq_32b", "deepseek_v3_0324", "deepseek_r1_671b" ],"generate_endpoint": {"method": "post","api": "/maas/v1/completions","prompt": ""},"chat_endpoint": {"method": "post","api": "/test/llm/personal/v1/chat/completions","prompt": ""},"models_endpoint": {}}}
}

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

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

相關文章

【C#】Socket通信的使用

在C#中&#xff0c;Socket通信是一種用于實現網絡通信的底層技術。通過Socket&#xff0c;程序可以在網絡上與其他設備進行數據交換。以下是如何使用C#中的System.Net.Sockets命名空間來實現Socket通信的詳細步驟。 1. Socket通信的基本概念 Socket: 一個Socket是網絡通信的端…

2024年第九屆團隊程序設計天梯賽c++題解L1-L3-1(附PTA網址)

L1-1 編程解決一切 5分 L1-097 編程解決一切 - 團體程序設計天梯賽-練習集 (pintia.cn)https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId1781658570803388416 #include<bits/stdc.h> #define int long long using namesp…

ICMAN防水觸摸芯片 - 復雜環境下精準交互,提升觸控體驗

▍核心優勢 ◆ 超強抗干擾能力 ◆ 工業級設計&#xff0c;一致性和穩定性好 ▍提供場景化解決方案 【智能廚電矩陣】抽油煙機檔位調節 | 電磁爐火力觸控 | 洗碗機模式切換 【衛浴設備方案】淋浴房霧化玻璃控制 | 智能馬桶觸控面板 | 浴缸水位感應 【工業控制應用】儀器儀…

Golang|抽獎相關

文章目錄 抽獎核心算法生成抽獎大轉盤抽獎接口實現 抽獎核心算法 我們可以根據 單商品庫存量/總商品庫存量 得到每個商品被抽中的概率&#xff0c;可以想象這樣一條 0-1 的數軸&#xff0c;數軸上的每一段相當于一種商品&#xff0c;概率之和為1。 抽獎時&#xff0c;我們會生…

OpenCV 圖形API(43)顏色空間轉換-----將 BGR 圖像轉換為 LUV 色彩空間函數BGR2LUV()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 將圖像從BGR色彩空間轉換為LUV色彩空間。 該函數將輸入圖像從BGR色彩空間轉換為LUV。B、G和R通道值的傳統范圍是0到255。 輸出圖像必須是8位無符…

【Python】用Python寫一個俄羅斯方塊玩玩

【Python】用Python寫一個俄羅斯方塊玩玩 一、引言1.成品效果展示 二、思考準備1.思考設計2.代碼設計2.1 游戲頁面2.2 控件設計2.2.1 方塊生成2.2.2 方塊碰撞2.2.3 方塊消融2.2.4 游戲主循環2.2.5 游戲窗口 三、游戲完整版 一、引言 今日看到侄子在玩游戲&#xff0c;湊近一看…

維港首秀!沃飛長空AE200亮相香港特別行政區

4月13日-16日&#xff0c;第三屆香港國際創科展在香港會議展覽中心盛大舉辦。 作為國內領先、國際一流的eVTOL主機廠&#xff0c;沃飛長空攜旗下AE200批產構型登陸國際舞臺&#xff0c;以前瞻性的創新技術與商業化應用潛力&#xff0c;吸引了來自全球17個國家及地區的行業領袖…

Openfein實現遠程調用的方法(實操)

文章目錄 環境準備一、URL中接收參數二、接收一個參數三、接收多個參數四、傳遞對象五、傳遞JSON格式數據 環境準備 下面的配置&#xff0c;服務調用方加入即可。 依賴導入&#xff1a; <!-- openfeign依賴--><dependency><groupId>org.springframe…

Bright+Data網頁解鎖器:旅游行業數據革命的“隱形引擎”

在數字經濟浪潮中&#xff0c;旅游行業正經歷前所未有的變革。當消費者指尖滑動間完成跨國酒店預訂&#xff0c;當航空公司每秒調整萬次艙位價格&#xff0c;背后是一場無聲的數據戰爭。而在這場戰爭中&#xff0c;BrightData網頁解鎖器正成為旅游企業破局的關鍵武器——它像一…

OpenCV 圖形API(38)圖像濾波-----Sobel 算子操作函數Sobel()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::gapi::Sobel 函數是 OpenCV 的 G-API 模塊中用于執行 Sobel 算子操作的一個函數&#xff0c;主要用于圖像的邊緣檢測。Sobel 算子通過計算圖…

CS5346 - Interactivity in Visualization 可視化中的交互

文章目錄 Visualization representation interactionInteraction &#xff08;交互&#xff09;Benefits (好處)Typical Interaction Techniques&#xff08;交互技術&#xff09;SelectFilteringAbstract / Elaborate幾何放縮&#xff08;Geometric zoom)語義放縮&#xff0…

第十六屆藍橋杯大賽軟件賽省賽 C++ 大學 B 組 部分題解

賽時參加的是Python組&#xff0c;這是賽后寫的題解&#xff0c;還有兩題暫時還不會&#xff0c;待更新 題目鏈接題目列表 - 洛谷 | 計算機科學教育新生態 A 移動距離 答案&#xff1a;1576 C 可分解的正整數 Python3 import itertools from functools import cmp_to_ke…

Vue 解決 Error: please transfer a valid prop path to form item!

在 Vue.js 中使用表單驗證庫&#xff08;如 VeeValidate 或 Element UI 的表單組件時&#xff09;&#xff0c;遇到錯誤信息 "please transfer a valid prop path to form item!" 通常指的是在表單項的屬性綁定中&#xff0c;路徑&#xff08;prop path&#xff09;不…

在 Visual Studio Code 中安裝通義靈碼 - 智能編碼助手

高效的編碼工具對于提升開發效率和代碼質量至關重要。 通義靈碼作為一款智能編碼助手&#xff0c;為開發者提供了全方位的支持。 本文將詳細介紹如何在 Visual Studio Code&#xff08;簡稱 VSCode&#xff09;中安裝通義靈碼&#xff0c;以及如何進行相關配置以開啟智能編碼…

SQL 解析 with as dual sysdate level

目錄 sql的運行順序 with as EXTRACT ?編輯 dual sysdate level ?編輯 ?編輯 Oracle中的日期存儲 核心部分 拆解字符串并計算最小值 關聯子查詢 NVL 函數 REGEXP_SUBSTR() sql的運行順序 <select id="getTrendList" parameterType="java.uti…

快手OneRec 重構推薦系統:從檢索排序到生成統一的躍遷

文章目錄 1. 背景2. 方法2.1 OneRec框架2.2 Preliminary2.3 生成會話列表2.4 利用獎勵模型進行迭代偏好對齊2.4.1 訓練獎勵模型2.4.2 迭代偏好對齊 3. 總結 昨天面試的時候聊到了OneRec&#xff0c;但是由于上次看這篇文章已經是一個月之前&#xff0c;忘得差不多了&#xff0c…

軟考高級系統架構設計師-第11章 系統架構設計

【本章學習建議】 根據考試大綱&#xff0c;本章不僅考查系統架構設計師單選題&#xff0c;預計考12分左右&#xff0c;而且案例分析和論文寫作也是必考&#xff0c;對應第二版教材第7章&#xff0c;屬于重點學習的章節。 軟考高級系統架構設計師VIP課程https://edu.csdn.net/…

selenium之文件下載

Selenium 自動化測試&#xff1a;輕松搞定文件下載 在 Web 自動化測試中&#xff0c;經常會遇到需要驗證文件下載功能的場景。例如&#xff0c;測試報告的導出、用戶上傳文件的下載、PDF 文檔的生成與下載等等。Selenium 本身并沒有直接處理文件下載的內置方法&#xff0c;但我…

基于遷移學習實現肺炎X光片診斷分類

大家好&#xff0c;我是帶我去滑雪&#xff01; 肺炎是全球范圍內致死率較高的疾病之一&#xff0c;尤其是在老年人、免疫系統較弱的患者群體中&#xff0c;更容易引發嚴重并發癥。傳統上&#xff0c;肺炎的診斷依賴于醫生的臨床經驗以及影像學檢查&#xff0c;尤其是X光片&…

工業數據治理范式革新:時序數據庫 TDengine虛擬表技術解析

小T導讀&#xff1a;在工業數字化過程中&#xff0c;數據如何從設備采集順利“爬坡”到上層應用&#xff0c;一直是個難題。傳統“單列模型”雖貼合設備協議&#xff0c;卻讓上層分析舉步維艱。TDengine 用一種更聰明的方法打通了這條數據通路&#xff1a;不強求建模、不手動轉…