
如何快速實現REST API集成以優化業務流程
如果你看到的是個提示訪問區域的頁面,就說明你的中轉代理不給力,不要用香港或臺灣的服務器,換成美國服務器試試。
作為開發人員,一般都有自己的開發環境,很多人都是用 langchain 之類的工具,通過 API 將 Gemini 納入是最方便的測試方法。還有就是一些 APP 的開發人員,也可以通過 Gemini API 讓自己的程序訪問 Gemini。
正常打開 Google AI Studio 后,在左邊的側邊欄可以看到 “Get API Key” 的鏈接,點擊就可以申請 key,目前還沒有收費的提示。
Google 提供了兩種方式使用 Gemini API,一種是通過 python client 的封裝庫,一種是使用 REST 接口直接訪問,這一點和 openai 很像。通過 python client 使用 Gemini API 非常簡單,首先安裝 google 提供 python 工具包:
pip install google-generativeai
然后就可以愉快地寫代碼了:
import google.generativeai as genaiimport os
genai.configure(api_key=os.environ['API_KEY'])
model = genai.GenerativeModel('gemini-1.5-pro-latest')response = model.generate_content("What's your name?")
print(response.text)
Google 的這組 API 接口被稱為 Generative Language API,通過 API 接口,可以對不同類型的信息進行概括和無縫理解、跨類型操作和組合。包括語言、圖像、音頻、視頻和代碼。Google 推薦使用他們提供的 client libraries 操作 REST API 接口,這些庫包括“Cloud 客戶端庫”、“Google API 客戶端庫”、“使用 Firebase 移動平臺” 等等。不過,我們選擇最 hard 的方式,即直接操作 REST/HTTP API。
所有 Cloud API 都公開了一個簡單的傳統 JSON/REST 接口,開發人員可以編寫自己的自定義代碼以使用第三方 HTTP 客戶端庫直接訪問 REST API。這些 API 接口需要提供我們前面申請的 api_key,通過 Google AI Studio 界面申請的 api_key 默認具有使用 Generative Language API 的權限。
2.3.1 service endpoint
service endpoint 是特定 API 服務網址中基礎 URL 那一部分內容,一個服務可能有多個 service endpoint,主要是考慮地域劃分或流量均衡。目前 Google 提供的 API 服務地址中 service endpoint 就是這個:
https://generativelanguage.googleapis.com
2.3.2 service
service 提供具體的功能,它是 API 服務網址中相對于 service endpoint 的那部分內容。按照目前的文檔,它有 v1beta 和 v1 兩個版本。service 的內容與對應的 API 的功能有關,比如簡單的列舉模型,v1 版本的 service 是:
GET /v1/models
非常簡單。不過,如果是通過代理訪問(大部分情況下我們都得用代理),我們需要發送完整的 URL 給代理服務器:
GET https://generativelanguage.googleapis.com/v1/models
復雜一點的 service 通常需要帶參數,比如這個生成內容(generateContent)的 service:
POST /v1/{model=models/*}:generateContent
REST API 具體都提供了哪些 service,可以通過這個地址了解相關的額文檔:
https://ai.google.dev/api/rest
查了一下 C++ 語言的相關開源庫的情況,有個 google-cloud-cpp 提供了對 Google 的云服務的 API 的封裝,但是查了 changelog,沒發現有針對 Gemini API 的信息,先留作觀察,如果這個庫以后提供了封裝,那用起來肯定會比直接操作 REST API 接口要簡單。
考慮到之前使用 OpenAI 的 API 接口經驗,直接手擼 HTTP 請求完全沒有問題。需要用到的庫是 cpp-httplib、nlohmann::json、cppcodec 和 libiconv,cpp-httplib 庫負責 HTTP 請求的封裝,nlohmann::json 負責對在和的封裝和解析,cppcodec 處理 base64 編碼相關的工作,libiconv 負責做 utf-8 編碼和解碼。另外,cpp-httplib 需要使用 libcurl。不過這都不是問題,用 vcpkg 一頓 install 就搞定了。
Gemini API 沿用了 Goole 其他云 API 的風格,使用的基礎協議是 HTTP 協議,request 和 response 都是 json 格式化數據。具體的數據內容在 Google 的開發者網頁上都有,但是它的 API key 的位置和 openAI 的不一樣,它不是放在 HTTP 請求頭中的,而是直接編碼在請求 URL 中。這一點我一開始沒注意,以為和其他的 REST API 一樣,所以就在請求頭的 Bearer tokens 上一頓折騰,無果后才發現問題。其實,請求頭中什么都不要,只要一個 Content-Type,并指定類型為 application/json 就行了。我簡單封裝了一個 GeminiApi 類測試了一下 Gemini 的能力,感覺它的能力和 GPT 3.5 差不多,比如這個例子:
#include "GeminiApi.h"
using namespace gemini;
const std::string_view api_endpoint = "https://generativelanguage.googleapis.com";
int main() {
GeminiApi genai(api_endpoint);
genai.SetApiKey("......");
genai.SetProxy("127.0.0.1", 10809);
auto model = genai.GenerativeModel("gemini-1.5-pro-latest");
if (model) {
std::string prompt = UTF8FromGBK("今天早上,我打翻了一片面包,你猜哪面先著地?");
auto response = model->GenerateContent(prompt);
if (response) {
std::cout << GBKFromUTF8(response.value().content.text) << std::endl;
}
else {
std::cout << model->GetErrorMessage() << std::endl;
}
}
}
Gemini 看來是理解墨菲定律的,它毫不留情地回答:
接下來看看 GenerateContent 函數的內容:
httplib::Client cli(m_base);
// 設置請求頭cli.set_default_headers({ {"Content-Type", "application/json"}});json content = MakeGenerateContent(prompt, filename);std::string requrl = MakeServiceUrl("generateContent", m_modelName, m_apiKey);
// 發送 POST 請求if (auto res = cli.Post(requrl, content.dump(), "application/json")) { if (res->status == 200) { auto json_response = json::parse(res->body); result = ParseResult(json_response); } else { m_errormsg = std::format("Error: {} {}", res->status, res->body); return std::nullopt; }}
到今年 5 月 1 日之前,Gemini 的 API 都是免費的,而且支持對圖像、視頻和其他文檔的分析,100 萬 token 上下文確實很香,想試試的可以盡快著手。
[1] https://ai.google.dev/api/rest/
[2] https://developers.google.com
文章轉自微信公眾號@吃窩邊草的貓