AIClient-2-API:五分钟搭建OpenAI兼容网关,免费接入Gemini/Grok等多模型
1. 项目概述:从“客户端专属”到“开放API”的桥梁
最近在折腾各种AI应用和工具时,一个绕不开的痛点就是:很多强大的AI模型,比如Google的Gemini、xAI的Grok,它们最稳定、最“原生”的访问方式往往是通过其官方客户端。这些客户端通常提供了OAuth授权、流式响应、多模态支持等完整功能,体验很好。但对于我们开发者来说,想把它们集成到自己的项目里,比如用NextChat做个聊天界面,或者用Cherry-Studio搞个自动化工作流,就非常麻烦了。官方要么不提供公开API,要么API有严格的速率限制和配额,用起来束手束脚。
“AIClient-2-API”(简称A2)这个项目,就是来解决这个核心矛盾的。它本质上是一个高度智能的API代理和协议转换网关。它的目标很明确:把那些原本只能在特定客户端里用的、基于OAuth或其他私有协议的AI模型服务,“翻译”成标准的、开放的OpenAI兼容API。这样一来,任何支持OpenAI API的应用和框架,都能无缝接入这些原本封闭的模型,而且还能享受客户端级别的稳定性和功能。
我花了几天时间深度部署和测试了这个工具,它给我的感觉不像是一个简单的“爬虫”或“逆向工程”脚本,而更像一个企业级的中间件。它内置了账号池管理、智能路由、故障转移、TLS指纹绕过等一整套保障高可用的机制。对于个人开发者、小团队,甚至是需要低成本接入多模型的中型项目来说,这玩意儿能省下大量的时间和金钱成本。接下来,我就结合我的实操经验,带你彻底搞懂它,并手把手实现5分钟快速接入。
2. 核心设计思路与架构拆解
在开始动手之前,理解A2的设计哲学至关重要,这能帮你避开很多使用上的坑。它的核心思路可以概括为:协议转换、统一入口、智能调度。
2.1 协议转换:打破生态壁垒
目前主流AI模型的接口协议可谓“诸侯割据”:
- OpenAI协议:
/v1/chat/completions, 事实上的行业标准,生态最丰富。 - Claude协议:Anthropic自家的
/v1/messages, 消息结构略有不同。 - Gemini协议:Google的REST API, 参数和响应格式自成一体。
- 私有/客户端协议:如Gemini CLI、Grok CLI、Codex OAuth等,通过命令行工具或桌面应用交互,没有公开的HTTP端点。
A2的基石就是针对这些私有协议,实现了“客户端模拟”。它并不是去破解加密,而是完整地模拟了官方客户端的认证(OAuth)、网络请求(包括TLS握手特征)和通信流程。对于每一类客户端(如gemini-cli-oauth),A2内部都有一个对应的“适配器”(Adapter)。这个适配器知道如何获取OAuth令牌、如何构造符合该客户端预期的HTTP请求、如何解析其返回的数据。
更厉害的是,它不止于“模拟”,还做到了“翻译”。当外部应用通过标准的OpenAI API格式(比如发送一个/v1/chat/completions请求)调用A2时,A2会根据你配置的“路由”,将请求智能地分发给对应的适配器。适配器收到后,会将OpenAI格式的请求体(包括messages、model等参数)实时转换成目标客户端协议能理解的格式,发送出去;拿到客户端的响应后,再反向转换成OpenAI格式的流式或非流式数据,返回给调用方。
这个过程对调用者是完全透明的。你的NextChat只需要配置一个OpenAI兼容的Base URL(即A2的服务地址),它就会以为自己一直在和OpenAI对话,但实际上背后可能是Gemini Pro或Claude Opus在干活。
2.2 统一入口与智能调度:从单点到高可用
如果只是简单的协议转换,那一个脚本也能搞定。A2的工业级价值体现在它的调度层。它抽象出了一个“提供商类型”(Provider Type)的概念,例如gemini-cli-oauth、claude-kiro-oauth、grok-web。每个类型下,你可以配置多个账号(即多个OAuth凭据文件),形成一个“账号池”。
A2的服务内部有一个智能调度器,它负责:
- 健康检查:定期用一个小请求(如获取模型列表)测试池子里的每个账号是否存活、令牌是否有效。
- 负载均衡与轮询:当有请求进来时,从健康的账号池中按策略(如轮询)选取一个来使用。这直接解决了免费账号普遍存在的“每分钟请求数”(RPM)或“每日配额”限制。一个账号触发限流(返回429错误)后,调度器会将其标记为“不健康”,并自动切换到池子里的下一个账号。
- 故障转移与降级:这是高级功能。你可以在配置中定义一条“降级链”。例如,当所有
gemini-cli-oauth的账号都不可用时,可以自动降级到gemini-antigravity(另一个Gemini来源)。这极大地提升了服务的整体可用性(SLA)。 - 模型过滤:某些免费账号可能无法访问所有模型(如无法调用
gemini-2.0-flash-exp)。你可以在账号配置中声明它不支持的模型列表,调度器在选择账号时会自动避开,防止请求失败。
这种架构使得A2从一个脆弱的单点工具,变成了一个弹性、可扩展的AI网关。对于需要稳定服务的生产级辅助应用,这个特性是至关重要的。
3. 五分钟快速部署与初体验
理论讲完,我们直接上手。最快的方式是使用Docker,这能避免各种环境依赖问题。假设你已经在电脑上安装好了Docker和Docker Compose。
3.1 一键启动服务
首先,创建一个工作目录并进入:
mkdir aiclient2api && cd aiclient2api然后,创建一个docker-compose.yml文件,内容如下:
version: '3.8' services: aiclient2api: image: justlikemaki/aiclient-2-api:latest container_name: aiclient2api restart: unless-stopped ports: - "3000:3000" # Web管理界面 - "8085:8085" # Gemini OAuth回调 - "8086:8086" # Antigravity OAuth回调 - "1455:1455" # Codex OAuth回调 - "56121:56121" # Grok CLI OAuth回调 - "19876-19880:19876-19880" # Kiro OAuth回调范围 volumes: - ./configs:/app/configs # 配置目录 - ./plugins:/app/src/plugins-user # 自定义插件目录(可选) environment: - NODE_ENV=production这里映射了多个端口。3000是我们要用的Web界面和API端口,其他端口是给不同服务的OAuth授权回调用的,必须映射,否则授权无法完成。
启动服务:
docker-compose up -d用docker logs aiclient2api -f查看日志,看到服务器启动成功的提示即可。
3.2 配置第一个AI模型(以Gemini为例)
现在打开浏览器,访问http://localhost:3000。你会看到一个登录界面,默认密码是admin123。强烈建议登录后第一件事就是在“系统设置”里修改这个密码。
登录后的主界面就是仪表盘,这里我们直奔主题,配置一个可用的模型。
- 进入配置管理:在左侧菜单找到“配置管理”。
- 配置Gemini:在配置页面,找到“Gemini CLI OAuth”部分。你会看到一个“生成授权”的按钮。点击它。
- 完成OAuth授权:系统会弹出一个对话框,并显示一个本地URL(如
http://localhost:8085/auth)。点击“在浏览器中打开”,这会跳转到Google的账号授权页面。请使用你希望用来访问Gemini的Google账号登录并授权。授权成功后,页面会提示“授权成功,请关闭此窗口”。 - 验证与启用:回到A2的Web界面,刷新一下“配置文件”页面。你应该能看到多了一个
oauth_creds.json之类的文件,这说明授权凭据已经自动保存到容器内的/app/configs目录,并映射到了你本地的./configs文件夹下。同时,在“提供商池”页面,gemini-cli-oauth这个提供商的状态应该会变成“健康”(绿色)。
实操心得:第一次授权可能会失败,通常是端口冲突或浏览器缓存问题。如果失败,检查Docker日志,确认OAuth回调端口(8085)是否被其他程序占用。最简单的方法是重启Docker容器,并用浏览器的无痕模式重试授权流程。
3.3 测试你的AI网关
现在,你的本地已经运行起了一个OpenAI兼容的API服务,背后连接的是Google Gemini。我们来用最简单的curl命令测试一下。
打开终端,执行:
curl http://localhost:3000/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer any-string-here" \ # A2默认不验证Key,这里可以任意填写 -d '{ "model": "gemini-2.0-flash-exp", # 指定Gemini模型 "messages": [ {"role": "user", "content": "你好,请用中文简单介绍一下你自己。"} ], "stream": false # 非流式,先看简单回复 }'如果一切正常,你会收到一个JSON格式的回复,其结构完全符合OpenAI API规范,但内容是由Gemini生成的。
恭喜!至此,你已经在5分钟内完成了一个免费AI模型(Gemini)的API接入。任何支持OpenAI API的客户端(如NextChat、Open WebUI、LangChain等),现在都可以将Base URL设置为http://你的服务器IP:3000,然后像调用ChatGPT一样调用Gemini了。
4. 核心功能深度配置与优化
基础跑通只是开始,要让这个服务稳定、强大地运行起来,还需要进行一些深度配置。A2的Web UI管理控制台非常强大,绝大部分配置都可以在那里完成。
4.1 多模型与账号池配置
单一账号和模型是不够的。我们需要建立账号池来提升可用性。
- 添加多个Gemini账号:重复3.2的授权步骤,使用不同的Google账号登录。A2会自动为每个账号生成独立的凭据文件。在“提供商池”页面,你会看到
gemini-cli-oauth类型下出现了多个“节点”,每个节点对应一个账号。 - 理解轮询机制:默认情况下,A2会对同一类型下的健康账号进行轮询。每次请求可能会由不同的账号处理。这能有效分摊单个账号的速率限制压力。
- 配置账号池文件(高级):对于更复杂的调度策略,你可以直接编辑账号池配置文件。在本地
./configs目录下,创建或编辑provider_pools.json:
{ "gemini-cli-oauth": [ { "uuid": "my-gemini-account-1", "credentialsPath": "/app/configs/gemini/account1_oauth_creds.json", "checkHealth": true, "weight": 10 // 权重,越高被选中的概率越大 }, { "uuid": "my-gemini-account-2", "credentialsPath": "/app/configs/gemini/account2_oauth_creds.json", "checkHealth": true, "weight": 5 } ], "claude-kiro-oauth": [ { "uuid": "my-kiro-account", "credentialsPath": "/app/configs/kiro/auth_token.json", "checkHealth": true } ] }然后在Web UI的“配置管理”页面,找到“PROVIDER_POOLS_FILE_PATH”设置,填入/app/configs/provider_pools.json(容器内路径)并保存。重启服务后,A2将使用你这个自定义的池子。
4.2 协议路由与模型映射
A2支持多种路由方式,让调用更灵活。
Path路由(最常用):通过URL路径选择模型提供商。
http://localhost:3000/v1/chat/completions-> 使用config.json中DEFAULT_PROVIDER指定的默认提供商。http://localhost:3000/gemini-cli-oauth/v1/chat/completions-> 强制使用gemini-cli-oauth提供商。http://localhost:3000/claude-kiro-oauth/v1/messages-> 强制使用claude-kiro-oauth提供商,并调用Claude原生接口。- 你可以在Web UI的“仪表盘”页面看到所有可用的路由示例。
模型名路由:在请求体中指定特定的模型名,A2会根据内置的映射关系自动选择提供商。例如,请求
model: "grok-2-latest"会自动路由到Grok的提供商。这个映射关系在A2的代码中是预定义的。启动参数/环境变量:可以在启动服务时通过
--provider参数,或设置DEFAULT_PROVIDER环境变量来指定全局默认提供商。
注意事项:有些AI客户端(如某些版本的NextChat)会在你配置的Base URL后自动追加
/v1路径。如果你在A2的Base URL里也写了/v1,可能会导致路径重复(如/v1/v1/chat/completions)从而报404错误。如果遇到404,第一件事就是去A2的“实时日志”里查看客户端发来的完整URL是什么,并相应调整客户端的Base URL配置(通常去掉末尾的/v1)。
4.3 高级特性配置
TLS Sidecar(解决403 Forbidden):像Grok这类服务,会对TLS握手指纹进行严格校验,直接请求会返回403。A2内置了一个Go编写的TLS Sidecar来模拟浏览器指纹。
- 对于Docker用户:非常简单。只需在Web UI“配置管理”中,找到“TLS_SIDECAR_ENABLED”和“TLS_SIDECAR_PORT”选项,开启并设置一个端口(如9090)。Docker镜像已经包含了编译好的组件。
- 对于本地Node.js运行的用户:你需要先安装Go环境(>=1.20),然后在项目根目录执行
cd tls-sidecar && go build -o tls-sidecar来编译这个组件。之后才能在配置中开启。
自动令牌刷新:OAuth令牌通常有过期时间(如1小时)。在Web UI“配置管理”中,务必开启“启用OAuth令牌自动刷新”和“预加载模型提供商”选项。这样A2会在后台自动维护令牌的有效性,实现7x24小时不间断服务。如果没开“预加载”,即使开了自动刷新,对应提供商的令牌也不会被刷新,久了就会失效。
代理配置:如果你的网络环境无法直接访问某些服务,可以配置代理。
- 统一代理:在“配置管理”的“代理设置”区域,填入你的代理服务器地址(如
http://127.0.0.1:7890),然后勾选需要走代理的提供商(如Gemini、Claude)。 - 提供商自带代理:有些中转服务提供了已代理的端点。你可以在对应提供商的配置区域,直接修改“Base URL”,填入中转服务提供的地址。
- 统一代理:在“配置管理”的“代理设置”区域,填入你的代理服务器地址(如
5. 实战:将A2集成到现有应用
理论配置都完成了,我们来实战一下,把A2集成到两个最流行的开源AI应用里。
5.1 集成到NextChat(原ChatGPT-Next-Web)
NextChat的配置非常直观。
- 部署或打开你的NextChat。
- 进入“设置” -> “模型提供商”。
- 在“OpenAI”配置项中:
- API Key:可以任意填写(如
sk-aiclient2api),因为A2默认不验证此字段。如果你在A2中配置了API_KEYS,则需要填写有效的Key。 - API 地址:填写你的A2服务地址,例如
http://localhost:3000注意不要加/v1。 - 模型列表:点击“获取模型列表”,NextChat会自动从
http://localhost:3000/v1/models拉取A2支持的所有模型。你会看到Gemini、Claude、Grok等模型都出现了。
- API Key:可以任意填写(如
- 保存后,在聊天界面选择你想用的模型(如
gemini-2.0-flash-exp),就可以开始对话了。NextChat发出的所有请求都会被A2接收、转换并转发给对应的AI服务。
5.2 集成到LangChain或自定义脚本
对于开发者,在代码中集成更是轻而易举。以下是一个Python示例,使用openai库(需安装openai包):
from openai import OpenAI # 将client的base_url指向你的A2服务 client = OpenAI( base_url="http://localhost:3000/v1", # 这里需要包含/v1 api_key="any-string-or-your-configured-key", # API Key ) # 发起一个聊天请求,指定使用Gemini模型 response = client.chat.completions.create( model="gemini-2.0-flash-exp", # 通过模型名路由 messages=[ {"role": "user", "content": "请用Python写一个快速排序函数。"} ], stream=True, # 使用流式输出 temperature=0.7, ) # 处理流式响应 for chunk in response: if chunk.choices[0].delta.content is not None: print(chunk.choices[0].delta.content, end="")这段代码和调用官方OpenAI API的代码一模一样,只需改一个base_url。LangChain的ChatOpenAI类也同样只需修改openai_api_base参数即可。
6. 常见问题排查与优化实录
在实际使用中,你肯定会遇到一些问题。下面是我踩过坑后总结的排查清单。
6.1 错误码速查与解决
| 错误现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 401 Unauthorized | 1. API Key配置错误(如果启用了Key验证)。 2. OAuth令牌已过期。 | 1. 检查A2配置中的API_KEYS和请求头中的Authorization是否匹配。2. 去Web UI“提供商池”查看对应节点是否“健康”。不健康则重新进行OAuth授权。 |
| 403 Forbidden | 1. (常见于Grok)TLS指纹被识别。 2. 账号权限不足或地区限制。 | 1.开启并配置TLS Sidecar,这是解决Grok 403的最有效方法。 2. 检查使用的账号是否有权访问目标模型。尝试更换账号或使用代理。 |
| 404 Not Found | 1. 请求路径错误。 2. 客户端Base URL配置了多余的路径。 | 1. 访问http://localhost:3000查看Web UI,在仪表盘确认正确的API路径。2.检查客户端配置,确保Base URL是 http://localhost:3000而不是http://localhost:3000/v1。 |
| 429 Too Many Requests | 单个账号的速率限制(RPM)或配额耗尽。 | 1.配置账号池,添加更多账号。 2. 在 config.json中启用RATE_LIMIT_COOLDOWN_ENABLED,让被限流的账号暂时冷却。3. 配置 providerFallbackChain,在当前类型账号全挂时自动切换备用类型。 |
| 503 No healthy providers | 某个Provider Type下的所有账号均不健康或不可用。 | 1. 去Web UI“提供商池”检查该类型下所有节点的状态。 2. 检查凭据文件是否存在、格式是否正确。 3. 检查网络连接,或是否为该服务配置了正确的代理。 |
| 流式响应中途断开 | 1. 网络不稳定。 2. 代理服务器不支持长连接。 3. 服务端处理超时。 | 1. 检查本地网络。 2. 如果使用了代理,尝试更换或暂时禁用代理测试。 3. 在客户端增加超时时间设置。 |
6.2 性能与稳定性优化建议
- 监控与日志:充分利用A2 Web UI中的“实时日志”功能。任何API请求和错误都会在这里显示,是排查问题的第一现场。可以在这里看到请求被路由到了哪个提供商、转换前后的参数、以及最终的响应状态码。
- 合理设置超时:在调用A2的客户端(如NextChat、你的代码)中,适当增加超时时间。因为A2需要进行协议转换和可能的账号切换,响应时间可能比直连官方API稍长。将超时设置为30-60秒是比较安全的。
- 备用方案:虽然A2的故障转移机制很强大,但对于关键业务,建议在你的应用代码层也实现一个简单的降级逻辑。例如,当A2主端点连续失败数次后,自动切换到一个备用的官方API或另一个A2实例。
- 定期维护:定期检查Web UI中的“提供商池”健康状态。对于标记为不健康的节点,及时点击“刷新”或重新授权。可以写一个简单的cronjob,定期访问A2的健康检查端点(如
/health)来监控服务状态。
6.3 关于“免费”的理性认识
A2本身是开源免费的,它帮你接入的许多模型服务(如Gemini CLI、Kiro的Claude)在官方层面也有免费额度。但“免费”通常意味着限制:
- 速率限制(RPM):每分钟能请求的次数有限。
- 每日配额:每天的总调用次数或Token数有限。
- 模型能力:免费额度可能无法调用最顶级的模型(如Claude Opus可能需要Kiro的特定模式)。
因此,千万不要把A2用于任何生产级、高并发的商业场景。它的最佳定位是:个人学习、开发测试、搭建内部工具、以及低频率的个人使用。它的价值在于提供了一个统一、便捷的接口来管理和切换多个免费的AI资源,极大地降低了体验和集成多种AI模型的成本。如果业务量增长,为对应的官方API付费仍然是支持服务可持续性和稳定性的最终方案。