所有文章 > API开发 > 用 C++ 访问 Google Gemini 1.5 Pro API
用 C++ 访问 Google Gemini 1.5 Pro API

用 C++ 访问 Google Gemini 1.5 Pro API

Google的 Gemini 1.0 Pro 可谓是出道即落后,于是马不停蹄的推出了 Gemini 1.5 Pro,并且提供了高达 100 万 token 的上下文,直接把噱头拉满。Gemini 1.5 Pro 在 2024 年 5 月 1 日前都是免费开放状态,大家都可以免费试用。不过由于开放的区域不包括中国,所以你需要第三方中转代理,这个跟当前弄 openai 是一样的。
谷歌还向所有用户开放了 Gemini 1.5 Pro 模型的 API 访问权限,开发人员不需要 waiting list,申请即可得。大家都可以试试 100 万 token 的上下文的威力,让 Gemini 帮你分析一部小说都不在话下。目前有两种方法试用 Gemini 1.5 Pro,一种是通过 Google AI Studio,另一种是通过 API 接口,目前这两种方法都是免费的。

1 Google AI Studio

Google AI Studio 是一个 web 页面工具,提供类似 chatGPT 那样的界面,你可以通过提示词与 Gemini 交流,Google AI Studio 的页面还提供了上传文件的界面,可以上传视频、音频、图片等类型的文件,可以很方便地让 Gemini 帮你分析一幅画或一篇文章。 通过 Google AI Studio 试用 Gemini 目前是最简单的方式,链接入口戳这里:

https://ai.google.dev/tutorials/ai-studio_quickstart

通过这个链接可以直接打开 Google AI Studio 的界面,大概长这个样子:

如果你看到的是个提示访问区域的页面,就说明你的中转代理不给力,不要用香港或台湾的服务器,换成美国服务器试试。

2 Gemini API

2.1 申请 API key


作为开发人员,一般都有自己的开发环境,很多人都是用 langchain 之类的工具,通过 API 将 Gemini 纳入是最方便的测试方法。还有就是一些 APP 的开发人员,也可以通过 Gemini API 让自己的程序访问 Gemini。
正常打开 Google AI Studio 后,在左边的侧边栏可以看到 “Get API Key” 的链接,点击就可以申请 key,目前还没有收费的提示。

2.2 使用 python client


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)

2.3 使用 REST API


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

3 用 C++ 访问 Gemini API

查了一下 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

文章转自微信公众号@吃窝边草的猫

#你可能也喜欢这些API文章!