Spring Boot 接 OpenAI 兼容网关 - 我先把直连方案写崩了,才换成正确姿势
先说说我搞砸的那个版本
上个月接手一个 Spring Boot 小项目,要加个 AI 摘要功能。我当时的思路很“工程师”:Spring AI 还没仔细看文档,但 OpenAI 的 HTTP 接口不就是几个 JSON 吗?自己用 RestTemplate 手写请求不就行了?
于是我打开官方 SDK 的依赖,把 OpenAI 的 Java SDK 直接塞进了 pom.xml,然后在配置文件里写上从某处申请的 key,兴冲冲地跑了一下。
结果是连环翻车:
第一个坑:Java 官方 SDK 默认只认官方端点。 我想指向一个兼容网关,翻了半天构造函数才发现要手动改 baseUrl。改完之后版本又对不上,SDK 升级后 API 变了,编译直接报错。
第二个坑:key 写死在配置里还被我提交到了 Git。 同事提醒我的时候,仓库已经推了两版。只好删 key、改历史、重新签发,一上午没了。
第三个坑:没有超时和重试。 模型响应偶尔慢,RestTemplate 默认无限等,一个请求挂住整个线程池,接口跟着雪崩。
第四个坑(最疼):单一供应商,模型说下线就下线。 依赖的某个模型版本调整,我的代码里写死了模型名,半夜报警,起来改配置重新发版。
如果你也准备在 Spring Boot 项目里接 AI 能力,上面这四条大概率会至少中一条。下面是我最后走通的路径。
正确路径:OpenAI 兼容网关 + Spring AI
核心思路是:不要把项目绑死在任何一个供应商的 SDK 和端点上,而是统一走 OpenAI 兼容协议的聚合网关。这样换了模型、换了供应商,代码里只改一个模型名字符串。
我这里用的是 ThisToken.AI 的网关。它对外暴露的是标准 OpenAI 兼容接口,意味着 Spring AI 的 OpenAI starter 可以无缝对接——只需要把 base-url 换成网关地址。
第一步:注册并获取 API Key
- 打开 ThisToken.AI 的注册页,用邮箱注册一个账号;
- 进入控制台,找到 API Key 管理,创建一个新的 Key;
- 立即保存到本地密码管理器或环境变量,页面上通常只完整显示一次;
- 具体可用模型和计费方式,以官网价格页为准,不要轻信网上流传的数字。
第二步:用环境变量注入 Key
不要把 Key 写进 application.yml 再提交。正确做法:
export THISTOKEN_API_KEY=sk-你的key第三步:Spring Boot 侧配置
pom.xml 引入 Spring AI 的 OpenAI starter(版本以 Spring AI 官方文档为准),然后在 application.yml 里:
spring:
ai:
openai:
base-url: https://api.thistoken.ai/v1
api-key: ${THISTOKEN_API_KEY}
chat:
options:
model: gpt-4o-mini注意 base-url 指向网关,后续所有请求都走它。换模型只改 model 这一行。
第四步:跑通第一段代码
给一个最小可用的调用示例。虽然主项目是 Java,我建议你先用一段脚本验证 Key 和网关是通的——排除掉 Spring Boot 本身的问题,排障会快很多:
from openai import OpenAI
client = OpenAI(
api_key="sk-你的key", # 生产环境请用环境变量
base_url="https://api.thistoken.ai/v1"
)
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "你是一个简洁的中文摘要助手。"},
{"role": "user", "content": "用一句话总结:Spring Boot 通过 OpenAI 兼容网关接入多个模型,可以避免绑定单一供应商。"}
]
)
print(resp.choices[0].message.content)能打印出摘要,说明 Key、网关、模型三者全通。接下来回到 Spring Boot 写一个 ChatClient 调用即可,不会再有“不知道是哪一层坏了”的困惑。
补上我当初欠的三个工程动作
跑通只是及格线,生产环境还要补:
超时与重试。 给 HTTP 客户端设置合理的连接和读超时,对可重试错误做有限次退避重试,别让一个慢请求拖垮线程池。
Key 的隔离。 如果有前端或小程序直连需求,不要把服务端 Key 下发,加一层服务端代理,Key 只存在服务端环境变量里。
模型名集中管理。 把模型名收敛到配置或常量里,配合网关在多个模型间切换,某家调整也不至于半夜发版。
写在最后
回头看,我最初的失败其实不是技术问题,而是没想清楚“接入 AI”这件事的架构边界。手写 HTTP、绑死单一 SDK,短期省事,长期全是债。走 OpenAI 兼容网关这条路,Spring Boot 项目只依赖一套标准协议,后面无论怎么换模型,代价都很小。
如果你也想试试,可以先去注册一个账号,用上面那段 Python 代码十分钟内跑通第一次调用,再决定要不要在项目里深入:https://api.thistoken.ai/register
---
不想折腾多家供应商的接入差异?在 https://api.thistoken.ai/register 注册,用一个 base_url 调用所有模型。