文档

文本生成

通过 OpenAI、Anthropic 和 Gemini 线协议调用文本模型,涵盖参数、流式传输,以及协议兼容的边界。

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 一致;此处未列出的兼容参数会原样转发到上游。

参数类型必填说明
modelstring是模型 ID。裸名走智能路由;渠道/名称 锁定单一渠道。见「模型 ID」一节。
messagesarray是对话消息数组。每条含 role(system、user、assistant)与 content。
streamboolean—以 SSE 返回增量结果。默认 false。
temperaturenumber—采样温度,0 到 2。越低越确定。
max_tokensinteger—生成 token 上限,取决于所选模型。
toolsarray—模型可调用的工具定义。需要模型支持工具调用。
response_formatobject—请求结构化输出,例如 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 之间转换是接连做两次转换。我们不推荐这么做,也不为其保真度做出承诺 —— 如果你需要那两种形态之一,请选择原生宣告该形态的模型。

  • 嵌入、重排、音频和实时功能完全没有转换。以错误形态发起的这类请求会被拒绝,而不是被转换。