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 头,也不必在各家分别开户。

同一把 key 打三种形态,变的只有路径、鉴权头和 model id。
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,代价不过是一次往返。

常见问题

能直接把官方 OpenAI / Anthropic SDK 指过来吗?
可以。把 SDK 的 base URL 指到 https://token-share.app,key 换成 token-share 的 key,model 用本目录里的 id 就行。端点路径和请求头名字跟 SDK 本来发的一致,所以这是改配置,不是改代码。
把 model id 发到了不对的端点会怎样?
网关在转发前会拿 model 去比对目录 allowlist,不认识就返回 HTTP 400,并把这个 model 名字写在报错里。到 GET /v1/models 里查一下该 id 的 route——目录为每个模型记了唯一一条。
anthropic-version 这个头是必须的吗?
走 /v1/messages 时带上,跟 Anthropic SDK 的行为一致,本文示例用的是 2023-06-01。在 /v1/models 上它还兼作格式开关:带了就返回 Anthropic 风格的列表,不带则是 OpenAI 风格。