OpenAI 兼容 API 接入:发出第一个请求
一个 base URL、一把 key、三种请求格式。走哪个端点由模型决定,不是你在配置里选的。
同一个域名,三种请求格式
域名只有一个:https://token-share.app。真正会变的是路径和鉴权头——Anthropic 形态走 /v1/messages 配 x-api-key,OpenAI 形态走 /v1/responses 配 Authorization: Bearer,Grok 和 Gemini 走 /v1/chat/completions,也是 Authorization: Bearer。这两样跟着模型走,不是你在配置里挑的。
每个 id 的 route 都写在目录里:claude-sonnet-5 在 /v1/messages,gpt-5.6-terra 在 /v1/responses,grok-4.6、gemini-3-flash 在 /v1/chat/completions。发错路径不会「凑合能跑」,网关这一层就把它挡了。
三条路共用一把 key,不用分供应商配凭证,不用带 organization 头,也不必在各家分别开户。
export TOKEN_SHARE_KEY="sk-..."
# Anthropic-shaped
curl https://token-share.app/v1/messages \
-H "x-api-key: $TOKEN_SHARE_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5",
"max_tokens": 256,
"messages": [{"role": "user", "content": "Say hello in one line."}]
}'
# OpenAI-shaped
curl https://token-share.app/v1/responses \
-H "Authorization: Bearer $TOKEN_SHARE_KEY" \
-H "content-type: application/json" \
-d '{
"model": "gpt-5.6-terra",
"input": "Say hello in one line."
}'
# Chat completions
curl https://token-share.app/v1/chat/completions \
-H "Authorization: Bearer $TOKEN_SHARE_KEY" \
-H "content-type: application/json" \
-d '{
"model": "grok-4.6",
"messages": [{"role": "user", "content": "Say hello in one line."}]
}'先搞清楚有哪些 id 能调
GET /v1/models 返回模型目录。这个接口由网关本地作答,不转发给上游,所以你看到的列表就是校验请求时用的那份 allowlist——列表里有的能调,没有的一定被拒。
返回格式跟着请求头走:带 anthropic-version 就给 Anthropic 风格的列表,不带就给 OpenAI 风格。GET /v1/models/{id} 同理,返回单条。
这里的 model id 是我们自己的命名,不是上游厂商的市场名。allowlist 比对的就是这串字符,所以请从目录里复制,别照着某家的更新日志手敲。
确认这次请求到底成没成
响应头里有 x-token-share-request-id,逐请求生成并通过 CORS 暴露。把它和你自己的 request id 记在同一行日志里,日后要查就有据可依,不必靠回忆。
想带自己的关联值,就发 x-client-request-id。它只作为调试信息挂在 trace 上,不会被当成主键,所以同一个值重复传也不会跟你之前的请求撞车。
鉴权、模型 allowlist、余额这三关都在转发上游之前跑完,所以写错一个 model id,代价不过是一次往返。