平台接入 SDK
Upthos Relay 兼容 Anthropic / OpenAI / Gemini 三套官方协议,任何支持自定义 base URL 的官方 SDK 都可直接接入,业务代码不用改。本文给出四类常用接入方式的最小可运行配置和必看注意事项。
通用准备
- 在 API 密钥 创建 Key,必须分配到对应平台的分组:
- Claude 流量 → Anthropic 协议分组(如 Claude Max、Claude 入门/标准/进阶)
- OpenAI / Codex 流量 → OpenAI 协议分组(如 Codex 基础/标准、OpenAI 企业级)
- Gemini 流量 → Google 协议分组
- 分组绑错或未分组会返回
403 permission_error。 - API Key 在三种鉴权头任选其一即可,按优先级:
Authorization: Bearer→x-api-key→x-goog-api-key。
1. Anthropic / Claude Agent SDK
注入两个环境变量后,官方 Anthropic SDK、Claude Agent SDK、Claude Code 都可直接使用,无需改业务代码。
export ANTHROPIC_BASE_URL=https://relay.upthos.com
export ANTHROPIC_AUTH_TOKEN=sk-...
ANTHROPIC_BASE_URL不带/v1后缀,SDK 会自行拼接。ANTHROPIC_AUTH_TOKEN走 Bearer 认证(Agent SDK / Claude Code 默认);旧版 SDK 用ANTHROPIC_API_KEY(走x-api-key)也支持。
Claude Agent SDK(推荐用于嵌入业务)
// npm install @anthropic-ai/claude-agent-sdk
import { query } from '@anthropic-ai/claude-agent-sdk'
for await (const msg of query({
prompt: '帮我看下这个仓库的目录结构',
options: { model: 'claude-sonnet-4-6' },
})) {
console.log(msg)
}
# pip install claude-agent-sdk
from claude_agent_sdk import query, ClaudeAgentOptions
async for msg in query(
prompt="帮我看下这个仓库的目录结构",
options=ClaudeAgentOptions(model="claude-sonnet-4-6"),
):
print(msg)
Anthropic SDK(直接 Messages API)
// npm install @anthropic-ai/sdk
import Anthropic from '@anthropic-ai/sdk'
const client = new Anthropic({
baseURL: 'https://relay.upthos.com',
apiKey: process.env.UPTHOS_API_KEY,
})
const msg = await client.messages.create({
model: 'claude-sonnet-4-6',
max_tokens: 1024,
messages: [{ role: 'user', content: '你好' }],
})
# pip install anthropic
from anthropic import Anthropic
client = Anthropic(
base_url="https://relay.upthos.com",
api_key=os.environ["UPTHOS_API_KEY"],
)
msg = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}],
)
完整端点(/v1/messages、/v1/messages/count_tokens、/v1/models、/v1/usage)见 Anthropic API 接口。
2. OpenAI SDK
export OPENAI_BASE_URL=https://relay.upthos.com/v1 # 注意:这个要带 /v1
export OPENAI_API_KEY=sk-...
// npm install openai
import OpenAI from 'openai'
const client = new OpenAI({
baseURL: 'https://relay.upthos.com/v1',
apiKey: process.env.UPTHOS_API_KEY,
})
// Chat Completions
const resp = await client.chat.completions.create({
model: 'gpt-5.5',
messages: [{ role: 'user', content: '你好' }],
})
// Responses API(Agent / 工具调用)
const r = await client.responses.create({
model: 'gpt-5.5',
input: '你好',
})
# pip install openai
from openai import OpenAI
client = OpenAI(
base_url="https://relay.upthos.com/v1",
api_key=os.environ["UPTHOS_API_KEY"],
)
resp = client.chat.completions.create(
model="gpt-5.5",
messages=[{"role": "user", "content": "你好"}],
)
支持的端点:
POST /v1/chat/completions—— 标准 chatPOST /v1/responses—— Responses API(Agent / 工具调用 / WebSocket 双向流)POST /v1/images/generations、POST /v1/images/edits—— OpenAI 兼容同步图像 API,返回标准{data: [{url|b64_json}]}结构。OpenAI SDK 可直接使用。POST /v1/images/tasks、GET /v1/images/tasks/:id、POST /v1/images/tasks/:id/cancel、POST /v1/images/tasks/batch、POST /v1/images/uploads—— RayRelay 异步任务,立即返task_id,客户端轮询拿稳定 R2 URL;支持中途取消、img2img 参考图上传。
两条路径计费完全一致(矩阵价 × fx_rate × flat 1.0),自由按场景选用。SDK 兼容选同步;需要长任务、可取消、可分享 URL 选异步。旧的
/v1/tasks/:id、/v1/tasks/batch、/v1/tasks/:id/cancel仍可用,但响应附带Deprecation: true头,请逐步迁到/v1/images/tasks/*新路径。
3. Codex CLI(@openai/codex)
如果客户希望以 CLI Agent 子进程形式嵌入到内部平台(而不是用 OpenAI SDK 直接发请求),用 Codex:
# ~/.codex/config.toml
model_provider = "upthos"
model = "gpt-5.6-sol"
review_model = "gpt-5.6-sol"
model_reasoning_effort = "high"
model_context_window = 272000
[model_providers.upthos]
name = "upthos"
base_url = "https://relay.upthos.com"
wire_api = "responses"
requires_openai_auth = true
// ~/.codex/auth.json
{ "OPENAI_API_KEY": "sk-..." }
详细说明见 Codex 快速开始。
如果只是程序化调 OpenAI 协议、不通过 CLI,用上一节的 OpenAI SDK 即可。
4. Gemini SDK
@google/genai(新版统一 SDK)支持自定义 endpoint:
// npm install @google/genai
import { GoogleGenAI } from '@google/genai'
const ai = new GoogleGenAI({
apiKey: process.env.UPTHOS_API_KEY,
httpOptions: { baseUrl: 'https://relay.upthos.com' },
})
const resp = await ai.models.generateContent({
model: 'gemini-2.5-pro',
contents: '你好',
})
# pip install google-genai
from google import genai
client = genai.Client(
api_key=os.environ["UPTHOS_API_KEY"],
http_options={"base_url": "https://relay.upthos.com"},
)
resp = client.models.generate_content(
model="gemini-2.5-pro",
contents="你好",
)
裸 REST 调用(不依赖 SDK):
curl https://relay.upthos.com/v1beta/models/gemini-2.5-pro:generateContent \
-H "x-goog-api-key: $UPTHOS_API_KEY" \
-H "content-type: application/json" \
-d '{
"contents": [{ "parts": [{ "text": "你好" }] }]
}'
支持的端点:
GET /v1beta/modelsPOST /v1beta/models/{model}:generateContentPOST /v1beta/models/{model}:streamGenerateContent
通用注意事项
- 模型 ID 用官方裸 ID:
claude-sonnet-4-6、claude-opus-4-7、claude-haiku-4-5、gpt-5.5、gemini-2.5-pro。完整列表和路由说明见 支持的模型。 - Streaming / SSE 自动透传:客户端开
stream: true或调:streamGenerateContent即可,网关不改格式、不缓存。 - Tool use / Prompt caching 透传:业务代码原样写就行,无需为中转层做适配。
- 请求体大小:网关层硬限制为 10 MB(超过返回 413)。此外部分上游供应商有更紧的字节墙(典型 5 MB),比模型 token 上限先到,多张 base64 大图请求容易触发 4xx。建议用
/v1/images/uploads上传后引用 URL,或在客户端先压缩。 - API Key 安全:API Key 等同账号凭证。强烈建议在你方服务端代理后再暴露给业务,不要塞到前端 Bundle、移动端二进制或公开仓库。
- 错误格式按调用协议返回:Anthropic 路径返回 Anthropic 错误格式,OpenAI 路径返回 OpenAI 错误格式,Gemini 路径返回 Google 错误格式。SDK 自带的错误处理可直接复用。
- 可调用模型受 group 限制:业务代码里调到了 group 不支持的 model 会返回
404 not_found_error。建议先调GET /v1/models或GET /v1beta/models确认当前 Key 能用哪些模型。
上线前自检清单
- API Key 已分配到正确平台的 group
- base URL 配置正确(Anthropic 不带
/v1,OpenAI 带/v1,Gemini 用/v1beta) - API Key 仅存在于服务端环境变量 / Secret Manager,不在前端代码或 git 仓库中
- 通过
GET /v1/models(或/v1beta/models)验证当前 Key 可用模型 - 至少跑通一次非流式调用 + 一次流式调用
- 长上下文 / 多图请求 body 不超过 10 MB(且尽量控制在 5 MB 以内,避开上游字节墙)
- 业务侧已捕获
401 / 403 / 429 / 503并加上重试或降级逻辑
如需排查问题,请记录响应头里的 x-request-id,并在控制台联系客服。