API Key 明文写在代码里的第三天,我收到了一封计费警告邮件
一个常见的失败开局
独立开发者接大模型接口的时候,十个里有八个会写出这样的代码:
from openai import OpenAI
client = OpenAI(api_key="sk-xxxxxxxxxxxxxxxx")
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "你好"}],
)本地跑通了,很爽。然后发生什么呢?
第一种翻车:Key 进了 Git。 代码提交到 GitHub,哪怕是私有仓库,只要某天开放了协作、或者误操作转了 public,这个 Key 就等于公开。爬虫扫公开仓库里泄漏的 sk- 前缀密钥的效率,比你想象中高得多。
第二种翻车:Key 进了客户端。 想做个小工具分给朋友用,直接把 Python 脚本发过去——朋友拿到的不是工具,是你的 API Key。他可以拿去跑任何东西,账单记在你头上。
第三种翻车:多模型多份 Key,散落各处。 今天用 A 家的模型,明天换 B 家,每家的 SDK、计费、鉴权方式都不一样。代码里 if-else 套 if-else,.env 文件里堆了七八个变量,谁也不敢删,因为不知道哪个还在被引用。
我遇到的最狼狈的一次,是某个测试脚本里 hardcode 了一个 Key,忘了它在哪台机器上、哪个目录里。后来收到异常调用量的计费警告,排查了一下午才定位到那个脚本。那一刻我下决心:Key 不进代码,只进环境变量;模型调用不直连各家,走统一网关。
正确路径:环境变量 + 统一网关
思路很简单,两步:
- API Key 存在
.env文件里,通过环境变量注入,代码里一个明文密钥都没有; - 所有模型请求走 ThisToken.AI 这类多模型网关,它兼容 OpenAI SDK 协议,你只需要换一个
base_url,就能在多家模型之间切换,不用装一堆不同的 SDK。
下面是完整操作流程。
第一步:注册并获取 API Key
打开 ThisToken.AI 的注册页,用一个邮箱注册账号,然后在控制台的 API Key 管理页面创建一个 Key。创建后立刻复制保存——很多平台只在创建时展示一次。
这个 Key 就是你在网关上的统一凭证。之后不管是调用对话模型还是别的模型,都只用这一个 Key,不用再去各家注册。
第二步:装依赖并配置环境变量
pip install openai python-dotenv在项目根目录创建 .env 文件:
THISTOKEN_API_KEY=sk-你刚复制的key关键动作:把 .env 写进 .gitignore:
echo ".env" >> .gitignore这一行能挡掉绝大部分 accidental 泄漏。同时建议提交一份 .env.example 到仓库,里面只写变量名不写值,方便协作者知道需要配置什么。
第三步:跑通第一段代码
import os
from dotenv import load_dotenv
from openai import OpenAI
# 从 .env 加载环境变量
load_dotenv()
# Key 从环境变量注入,代码里没有任何明文密钥
client = OpenAI(
api_key=os.getenv("THISTOKEN_API_KEY"),
base_url="https://api.thistoken.ai/v1",
)
resp = client.chat.completions.create(
model="gpt-4o-mini", # 模型名称以网关文档为准
messages=[{"role": "user", "content": "用一句话解释什么是API网关"}],
)
print(resp.choices[0].message.content)注意两个点:
base_url="https://api.thistoken.ai/v1"—— 这是整个接入的核心。OpenAI SDK 允许你替换请求地址,网关在协议层兼容 OpenAI 接口,所以你的其他代码一行都不用改;api_key来自os.getenv,本地开发从.env读,部署到服务器时从部署平台的环境变量配置里读,代码保持同一份。
跑一下,能打印出回答,就说明链路通了。
第四步:切换模型只改一个参数
想试试别的模型?不用换 SDK、不用重新注册账号、不用再申请一个 Key,只改 model 参数:
resp = client.chat.completions.create(
model="claude-sonnet-4-20250514", # 换个模型试试,名称以网关文档为准
messages=[{"role": "user", "content": "用一句话解释什么是API网关"}],
)这就是统一网关的最大价值:模型选择变成了一个字符串参数,而不是一次重新集成。 对于独立开发者,这意味着你可以快速做 A/B 对比,挑效果和成本最合适的组合;对于小团队,这意味着换模型的决策成本从“改三天代码”降到“改一个字符串”。
几个收尾建议
- Key 轮换:如果怀疑泄漏,第一时间去控制台作废旧 Key、签发新 Key,而不是去代码里找哪里泄漏的——顺序反了会多慌半小时;
- 计费了解:网关上调用不同模型的费用差异可能很大,具体价格以官网价格页为准,接入前看一眼,心里有数;
- 日志别打 Key:有些同学习惯把请求参数整个 print 出来调试,注意 client 对象里的 Key 别被顺手打出来。
写在最后
从「明文 Key 写死在代码里」到「环境变量注入 + 统一网关」,改动其实不到十行代码,但换来的是:密钥不泄漏、模型随便换、账单一处管。如果你被多份 API Key 折腾过,或者想把现有 OpenAI SDK 代码无痛迁移到多模型架构,可以先去注册一个账号,五分钟就能跑通上面那段代码:https://api.thistoken.ai/register
---
不想折腾多家供应商的接入差异?在 https://api.thistoken.ai/register 注册,用一个 base_url 调用所有模型。