鉴权
每次访问 /v1/* 都需要带 API key。BUZZ 同时接受三种鉴权 header,所以 Anthropic、OpenAI、Google GenAI 三家官方 SDK 都能直接使用 —— 只要把 base URL 指到 https://buzzai.cc,原有鉴权代码不用改。
三种 header 写法
| Header | 说明 | 对应 SDK |
|---|---|---|
Authorization: Bearer <KEY> |
推荐默认形态,与 BUZZ 其他 REST 接口风格统一。 | OpenAI SDK 默认;Anthropic SDK 显式设置时也可用。 |
Authorization: Bearer sk-<KEY> |
sk- 前缀会被服务端自动剥离。 |
方便复用已有 sk- 风格 key 的基础设施。 |
x-api-key: <KEY> |
与 Anthropic SDK 默认 header 一致,即插即用。 | Anthropic SDK 默认。 |
x-goog-api-key: <KEY> |
Google GenAI 兼容路径下接受,Gemini 官方 SDK 不改代码即可指向 BUZZ。 | Google GenAI SDK 默认。 |
哪种顺手就用哪种,鉴权完成之后行为完全一致 —— 四种 header 解析到的都是同一把 key。
anthropic-version 在 BUZZ 上是可选的。 缺失时 BUZZ 会自动补 2023-06-01 再转发上游。如果想保留可移植到 Anthropic 直连的能力,建议显式带上(Anthropic 自己要求必须带)。
什么时候用哪种?
原则:跟着 SDK 的默认行为走,不要改 SDK 的请求层。
Anthropic SDK
官方 anthropic(Python)和 @anthropic-ai/sdk(Node)默认发 x-api-key。把 base URL 指到 BUZZ 即可:
from anthropic import Anthropic
client = Anthropic(
base_url="https://buzzai.cc",
api_key="",
)
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://buzzai.cc",
apiKey: process.env.BUZZ_API_KEY,
});
OpenAI SDK(走 /v1/chat/completions)
OpenAI SDK 默认发 Authorization: Bearer ...。配合 OpenAI 兼容的 /v1/chat/completions 路径使用:
from openai import OpenAI
client = OpenAI(
base_url="https://buzzai.cc/v1",
api_key="",
)
resp = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": "ping"}],
)
Google GenAI SDK
官方 google-genai SDK 默认发 x-goog-api-key。BUZZ 在 Gemini 兼容路径上识别这个 header,SDK 不改代码就能复用 BUZZ key 调网关上的 Gemini 兼容模型。
curl / 自写 HTTP 客户端
原始 HTTP 调用最省心的写法是 Authorization: Bearer —— 跟 BUZZ 其他 REST 接口(billing 等非 relay 端点)写法一致,代码风格统一。
curl -X POST https://buzzai.cc/v1/messages \
-H "Authorization: Bearer $BUZZ_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{ "model": "claude-haiku-4-5-20251001", "max_tokens": 32, "messages": [{"role":"user","content":"ping"}] }'
SDK Header 速查表
| 工具 / SDK | 默认鉴权 header | BUZZ 推荐 |
|---|---|---|
| Anthropic Python / Node SDK | x-api-key | 用 SDK 默认即可 |
| OpenAI Python / Node SDK | Authorization: Bearer | 用 SDK 默认,目标路径 /v1/chat/completions |
| Google GenAI SDK | x-goog-api-key | 用 SDK 默认即可 |
| Claude Code CLI | 环境变量 ANTHROPIC_AUTH_TOKEN + ANTHROPIC_BASE_URL | 详见 Claude Code 指南 |
| curl / 自写客户端 | 无 | Authorization: Bearer <KEY> |
API key 管理
Key 在用户后台 Tokens 页面管理。同样的操作可以通过 /api/token/* 用 session 或 access token 鉴权来做(注意:这里的 access token 与 sk- relay key 不是同一种鉴权)。
每把 key 可配置的字段
| 字段 | 类型 | 含义 |
|---|---|---|
| name | string | 用户自定义名称,最多 50 字符,后台列表和搜索使用。 |
| expired_time | int (Unix 秒) | 过期时间。-1 表示永不过期。 |
| unlimited_quota | bool | true = 不设单 key 额度;false 时必须填 remain_quota。 |
| remain_quota | int | 剩余可用额度。当 unlimited_quota 为 false 时必填且 ≥ 0。 |
| model_limits_enabled | bool | 是否启用单 key 模型白名单。 |
| model_limits | string | 逗号分隔的可调用模型 ID 列表;留空表示该 group 下全部模型可用。 |
| allow_ips | string | null | 换行分隔的 IP 白名单;留空 / null 不限制。 |
| group | string | 默认走的上游 channel 分组。 |
| vendor_routes | JSON string | 可选,按厂商指定 group,如 {"claude":"aws","openai":"gpt-direct"}。空则回退到 group。 |
状态值
| Code | 含义 |
|---|---|
| 1 | Enabled — 接受请求 |
| 2 | Disabled — 手动暂停 |
| 3 | Expired — 已过 expired_time |
| 4 | Exhausted — remain_quota 归零(仅 unlimited_quota 为 false 时触发) |
生命周期:创建 / 取出 / 轮换 / 删除
创建
用后台表单或 POST /api/token/ 创建 key。Key 由后端生成,创建接口本身不会回显完整值。要拿到完整 key,在后台点行内复制按钮,或调 POST /api/token/<id>/key。列表接口出于安全只返回 mask 形态,例如 OnyH**********esAm。
取出
把完整 key 当一次性密钥处理:复制一次,放进秘密管理器或环境变量,不要再贴回后台、聊天工具、文档。
轮换
轮换流程:新建一把 key → 部署到所有用旧 key 的位置 → 删旧 key。BUZZ 不支持原地刷新 key,只能"删一把建一把"。
删除
支持软删:DELETE /api/token/<id>。批量删除走 POST /api/token/batch,body 形如 {"ids":[1,2,3]}。
安全最佳实践
- 用环境变量,不要硬编码字面值。 启动时读
BUZZ_API_KEY(或你项目自己的命名)。绝不要把 key 贴进源码仓库、后台、截图、聊天工具。 - 只放在不入库的文件里。 安全位置:
.env(必须 gitignore)、秘密管理器(AWS Secrets Manager、GCP Secret Manager、HashiCorp Vault)、CI/CD 的 secret store。 - 按服务 / 环境拆 key,不要一把通用。 每个服务、每个环境(dev / staging / prod)各发一把 key。一旦泄漏只影响一处,轮换成本也低。
- 能用 IP 白名单就用。 如果你的请求来自固定出口 IP(生产服务器、CI runner、NAT 网关),把 IP 写进
allow_ips。这相当于把"任何拿到 key 的人都能调"收敛成"白名单 IP 上拿到 key 的人才能调"。 - 高风险 key 加
model_limits。 例如限制只能用claude-haiku-4-5-20251001,即使被滥用,单次调用成本也封顶。 - 给 key 设过期时间。 短期原型、demo、临时合作的 key 应该明确填
expired_time。-1方便但容易忘。 - 定期轮换。 长期生产 key 至少每 90 天轮换一次;一旦怀疑泄漏(CI 日志、误推 commit、人员离职)立即轮换。
- 监控用量异常。 用 key 自身鉴权调
GET /api/usage/token/可读到剩余额度和最近用量。配告警监控突增。 - 泄漏时:先删,再排查。 后台软删立即生效。然后建新 key、重新部署,再去看日志复盘。
.env。 项目第一次提交前就把 .env 和本地秘密文件加进 .gitignore。配套写一个 .env.example 用占位值列出需要的变量名。
鉴权错误
| HTTP | error.type | 原因 | 处理 |
|---|---|---|---|
| 401 | buzz_error | API key 缺失或无效 | 重新 export BUZZ_API_KEY;检查有没有多余引号;确认后台里这把 key 还在。 |
| 403 | permission_error | 当前 IP 不在 key 的白名单内,或 key 已被禁用 | 更新 allow_ips,或把 key 改回 status 1。 |
| 403 | permission_error | 该 key 没有访问目标 group / model 的权限 | 调整 key 的 group / model_limits,或换一个被允许的模型。 |
BUZZ 网关侧错误响应包络:
{
"error": {
"type": "buzz_error",
"message": "Invalid token... (request id: 202605260713594...)"
}
}
Anthropic 透传错误保持官方原样,顶层带 request_id。
相关链接
- 快速接入 — 5 分钟跑通第一个调用。
- POST /v1/messages — 完整请求 / 响应参考。
- GET /api/token/ — 编程方式管理 key。
- 错误处理 — 重试策略与 BUZZ 特有的 503 场景。