logo

如何将 Gemini CLI 包装成 API,免费使用 Gemini 2.5 Pro

2025年6月29日 · 1625

最近,Google 发布了 Gemini CLI。这本来没什么特殊的,但是 Google 宣布 Gemini CLI 免费使用,每天都有 1000 次的免费额度。对于我们这些开发者来说,简直就是天上掉馅饼。

但是坦白来说,我不喜欢用 Gemini CLI 这样的命令行工具来编程。我还是更喜欢用 Cursor 这样的 IDE。如果是在命令行里,我基本上只能做纯粹的 “Vibe Coding”,手工改起来就不方便了,这样我并不太喜欢。

那么,Gemini CLI 里这免费的 Gemini 2.5 Pro 模型,我们该如何利用呢?坦白来说,在命令行里使用并不方便。我们无论是在 Cherry Studio 这样的客户端里使用,还是自己搭建 Agent 系统来使用。都离不开 HTTP 协议的 API。一个命令行工具,显然并不具备这样的 API。

那么,我们能不能自己动手,在这两者之间架起一座桥梁呢?答案是肯定的。这篇文章,就将为你揭秘我是如何创建一个代理服务,将 gemini 的命令行调用封装成一个标准的、OpenAI 兼容的 API 接口,从而释放 Gemini CLI 中的模型能力。

核心思路

这个项目的核心思路,其实就是设计模式中的适配器(Adapter)。这个适配器会把 Gemini CLI 的命令行接口,翻译成 LLM 客户端能识别的 OpenAI 接口。

整个流程如下图所示:

项目流程

这个适配器(我叫它 gemini-cli-proxy)在中间承担了所有的转换工作,让 AI 应用感觉自己像是在与一个标准的 OpenAI 服务对话,而 Gemini CLI 则感觉自己只是在终端里接收并执行了一条普通的命令。

一次 API 请求的旅程

那么,这个适配器究竟是如何在中间进行翻译的呢?让我们跟随一次 API 请求,走完它的完整旅程。

第一步:接收与解析请求

首先,我需要一个能提供 OpenAI 标准 API 的 Web 服务器。这里我选择了 FastAPI,因为它轻量、快速,而且支持异步,非常适合做这样的代理服务器。

服务器中使用 Pydantic 模型定义了与 OpenAI /v1/chat/completions 完全一致的请求体结构。这样一来,任何遵循 OpenAI 规范的客户端,无需修改任何代码,就能直接向我的代理服务发请求。

第二步:从 API 请求到命令行参数

gemini-cli-proxy 收到了一个 OpenAI 格式的请求后,它需要将其转换成 Gemini CLI 能理解的命令行参数。

最核心的转换,是将 OpenAI 的 messages 数组,变成一个 gemini 命令能接收的、长长的字符串 prompt

举个例子,一个这样的 API 请求体:

OpenAI 格式的请求体是这样的:

{
  "model": "gemini-2.5-pro",
  "messages": [
    { "role": "user", "content": "你好,请介绍一下你自己。" }
  ]
}

代理服务会把 meesages 数组转换成这样一段纯文本:

User: 你好,请介绍一下你自己。

这是因为 gemini 命令只能接收纯文本形式的 prompt。

然后,这段文本会被用作 -p 参数,传递给 gemini 命令。

gemini-cli-proxy 还会处理图片格式的内容,将 Base64 格式的数据,将为文件,并在 gemini 命令中引用,不过这属于锦上添花的功能,这里就不展开了。

第三步:执行子进程并获取结果

整个项目的核心其实就在于这样一个简单的命令:

gemini -m gemini-2.5-pro -p "User: 你好,请介绍一下你自己。"

gemini 命令支持非交互模式运行,结果会输出到 stdout 中。我们只需要启动子进程,并捕获它的所有 stdout 输出,就可以得到 Gemini CLI 的返回结果。

第四步:翻译回 OpenAI 格式的响应

拿到原始的纯文本结果后,gemini-cli-proxy 需要将这段文本,重新包装成一个符合 OpenAI 规范的 JSON 对象。

例如,如果 Gemini CLI 返回了这样一段话:

你好!我是 Google 训练的大型语言模型。

代理服务就会把它精心包装成下面这个样子,作为最终的 API 响应返回给客户端:

{
  "id": "chatcmpl-...",
  "object": "chat.completion",
  "created": 1720000000,
  "model": "gemini-2.5-pro",
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "你好!我是 Google 训练的大型语言模型。"
    },
    "finish_reason": "stop"
  }],
  "usage": { ... }
}

至此,一次 API 请求的旅程就圆满结束了。

最终成果展示

gemini-cli-proxy 启动之后,你就可以像普通的模型服务一样使用 Gemini 2.5 Pro 了。

你可以像往常一样使用标准的 openai Python 库,只需要在初始化客户端时,将 base_url 指向我们本地运行的代理服务地址即可。

from openai import OpenAI

# 将 base_url 指向本地代理服务
client = OpenAI(
    base_url='http://localhost:8765/v1',
    api_key='dummy-key'  # 密钥可以随便填,因为我们用的是本地 CLI
)

response = client.chat.completions.create(
    model='gemini-2.5-pro',
    messages=[
        {'role': 'user', 'content': '写一个 Python 函数,计算斐波那契数列。'}
    ],
)

print(response.choices[0].message.content)

你也可以使用 LLM 客户端(如 Cherry Studio)来使用 Gemini CLI 中的模型:

在 Cherry Studio 中使用

就是这么简单!通过这个代理服务,我们成功地把 Gemini CLI 这样一个命令行工具转接成了 Open AI 的服务,从而接入我们的各个系统!

总结

通过创建一个轻量级的代理服务,我们成功地将一个强大的 CLI 工具,无缝融入了主流的 API 生态系统,解决了在 Agent 开发中使用免费 Gemini 2.5 Pro 的核心痛点。

有趣的是,在开发这个项目的过程中,我也顺便体验了一把现代的 AI 辅助开发。这个项目的核心功能,包括接口定义、子进程管理、Prompt 拼接等,都是在 AI 的辅助下高效完成的。这让我更加确信,在新的时代下,我们开发者的角色正在悄然改变:我们更应该专注于提出清晰的目标和优雅的架构,而将繁琐重复的实现细节,放心地交给得力的 AI 去完成。

如果你也对这个项目感兴趣,欢迎访问它的 GitHub 仓库 gemini-cli-proxy,亲自上手体验,如果它对你有帮助,请给我一个 Star!