Your first request
文本模型同步应答:一次请求,一次响应。把一个官方 SDK 指向 https://www.realrelay.ai/v1,并发送一个来自目录的模型 ID。
1from openai import OpenAI23client = OpenAI(4 base_url="https://www.realrelay.ai/v1",5 api_key="sk-***",6)78response = client.chat.completions.create(9 model="jd/glm-5.2",10 messages=[{"role": "user", "content": "Hello"}],11)1213print(response.choices[0].message.content)1import OpenAI from "openai";23const client = new OpenAI({4 baseURL: "https://www.realrelay.ai/v1",5 apiKey: process.env.REALRELAY_API_KEY,6});78const response = await client.chat.completions.create({9 model: "jd/glm-5.2",10 messages: [{ role: "user", content: "Hello" }],11});1213console.log(response.choices[0].message.content);1curl https://www.realrelay.ai/v1/chat/completions \2 -H "Authorization: Bearer $REALRELAY_API_KEY" \3 -H "Content-Type: application/json" \4 -d '{5 "model": "jd/glm-5.2",6 "messages": [{ "role": "user", "content": "Hello" }]7 }'Three wire protocols
同一个文本模型可以用三种请求形态来访问。选你现有代码已经在用的那一种 —— 它们之间没有性能或价格差异,只是 JSON 的形态不同。
OpenAI — /v1/chat/completions 与
/v1/responses
chat completions 是默认方式,目录里几乎每个文本模型都接受它 —— 没有特别理由就用这一种。
少数模型只在较新的 Responses 形态上提供,所以模型详情页可能显示这个示例而不是 chat 的那个。它用
input 代替 messages,并用
max_output_tokens 而不是
max_tokens 限制回复长度。
1from openai import OpenAI23client = OpenAI(4 base_url="https://www.realrelay.ai/v1",5 api_key="sk-***",6)78response = client.responses.create(9 model="openai/gpt-5.5-pro",10 input="Hello",11 max_output_tokens=1024,12)1314print(response.output_text)1import OpenAI from "openai";23const client = new OpenAI({4 baseURL: "https://www.realrelay.ai/v1",5 apiKey: process.env.REALRELAY_API_KEY,6});78const response = await client.responses.create({9 model: "openai/gpt-5.5-pro",10 input: "Hello",11 max_output_tokens: 1024,12});1314console.log(response.output_text);1curl https://www.realrelay.ai/v1/responses \2 -H "Authorization: Bearer $REALRELAY_API_KEY" \3 -H "Content-Type: application/json" \4 -d '{5 "model": "openai/gpt-5.5-pro",6 "input": "Hello",7 "max_output_tokens": 10248 }'Anthropic — /v1/messages
无需改动即可接受 Anthropic SDK。这种形态要求 max_tokens;请显式发送它,而不要依赖默认值,默认值可能比你预期的小得多。另外,避免同时发送
temperature 和 top_p
—— 有些模型只接受两者之一,此时第二个会被丢弃而不是被拒绝。
1import anthropic23client = anthropic.Anthropic(4 base_url="https://www.realrelay.ai",5 api_key="sk-***",6)78message = client.messages.create(9 model="anthropic/claude-sonnet-4-6",10 max_tokens=1024,11 messages=[{"role": "user", "content": "Hello"}],12)1314print(message.content[0].text)1import Anthropic from "@anthropic-ai/sdk";23const client = new Anthropic({4 baseURL: "https://www.realrelay.ai",5 apiKey: process.env.REALRELAY_API_KEY,6});78const message = await client.messages.create({9 model: "anthropic/claude-sonnet-4-6",10 max_tokens: 1024,11 messages: [{ role: "user", content: "Hello" }],12});1314console.log(message.content[0].text);1curl https://www.realrelay.ai/v1/messages \2 -H "x-api-key: $REALRELAY_API_KEY" \3 -H "anthropic-version: 2023-06-01" \4 -H "Content-Type: application/json" \5 -d '{6 "model": "anthropic/claude-sonnet-4-6",7 "max_tokens": 1024,8 "messages": [{ "role": "user", "content": "Hello" }]9 }'Gemini — /v1beta
接受 Gemini SDK 及其 x-goog-api-key
头。流式传输由 URL 选择 ——
:streamGenerateContent 动作,或
?alt=sse —— 而不是由主体中的某个字段决定。
1from google import genai23client = genai.Client(4 api_key="sk-***",5 http_options={"base_url": "https://www.realrelay.ai"},6)78response = client.models.generate_content(9 model="jd/gemini-3.1-flash-image-preview",10 contents="Hello",11)1213print(response.text)1import { GoogleGenAI } from "@google/genai";23const client = new GoogleGenAI({4 apiKey: process.env.REALRELAY_API_KEY,5 httpOptions: { baseUrl: "https://www.realrelay.ai" },6});78const response = await client.models.generateContent({9 model: "jd/gemini-3.1-flash-image-preview",10 contents: "Hello",11});1213console.log(response.text);1curl "https://www.realrelay.ai/v1beta/models/jd/gemini-3.1-flash-image-preview:generateContent" \2 -H "x-goog-api-key: $REALRELAY_API_KEY" \3 -H "Content-Type: application/json" \4 -d '{5 "contents": [{ "parts": [{ "text": "Hello" }] }]6 }'Parameters
以下针对 /v1/chat/completions 展示。语义与 OpenAI 一致;此处未列出的兼容参数会原样转发到上游。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型 ID。裸名走智能路由;渠道/名称 锁定单一渠道。见「模型 ID」一节。 |
messages | array | 是 | 对话消息数组。每条含 role(system、user、assistant)与 content。 |
stream | boolean | — | 以 SSE 返回增量结果。默认 false。 |
temperature | number | — | 采样温度,0 到 2。越低越确定。 |
max_tokens | integer | — | 生成 token 上限,取决于所选模型。 |
tools | array | — | 模型可调用的工具定义。需要模型支持工具调用。 |
response_format | object | — | 请求结构化输出,例如 json_object 类型。 |
Streaming
设置 stream: true 以接收服务器发送事件(SSE),以 data: [DONE] 结束。在
/v1beta 上则改由 URL 选择流式传输,如上所述。
1from openai import OpenAI23client = OpenAI(4 base_url="https://www.realrelay.ai/v1",5 api_key="sk-***",6)78stream = client.chat.completions.create(9 model="jd/glm-5.2",10 messages=[{"role": "user", "content": "Explain gradient descent"}],11 stream=True,12)1314for chunk in stream:15 delta = chunk.choices[0].delta.content16 if delta:17 print(delta, end="", flush=True)1import OpenAI from "openai";23const client = new OpenAI({4 baseURL: "https://www.realrelay.ai/v1",5 apiKey: process.env.REALRELAY_API_KEY,6});78const stream = await client.chat.completions.create({9 model: "jd/glm-5.2",10 messages: [{ role: "user", content: "Explain gradient descent" }],11 stream: true,12});1314for await (const chunk of stream) {15 const delta = chunk.choices[0]?.delta?.content;16 if (delta) process.stdout.write(delta);17}1curl -N https://www.realrelay.ai/v1/chat/completions \2 -H "Authorization: Bearer $REALRELAY_API_KEY" \3 -H "Content-Type: application/json" \4 -d '{5 "model": "jd/glm-5.2",6 "messages": [{ "role": "user", "content": "Explain gradient descent" }],7 "stream": true8 }'910# data: {"choices":[{"delta":{"content":"Gradient"}}]}11# data: {"choices":[{"delta":{"content":" descent"}}]}12# data: [DONE]如果你通过自己的基础设施代理这些请求,请在该路由上关闭响应缓冲 —— 否则增量数据会成批到达,流也就不再是流了。
Protocol compatibility
目录会记录每个模型原生宣告的形态。以另一种形态发起的请求会被转换,这是尽力而为而非保证:每一次转换都要经过 OpenAI 形态,因此在那里不存在的东西无法在转换途中保留下来。
在 OpenAI 与 Anthropic 或 Gemini 之间转换是成熟可靠的。
在 Anthropic 与 Gemini 之间转换是接连做两次转换。我们不推荐这么做,也不为其保真度做出承诺 —— 如果你需要那两种形态之一,请选择原生宣告该形态的模型。
嵌入、重排、音频和实时功能完全没有转换。以错误形态发起的这类请求会被拒绝,而不是被转换。
