開發者文檔

文字生成

透過 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。只寫名稱會走智慧路由;channel/name 則鎖定單一通道。詳見「模型 ID」。
messagesarray是對話訊息。每一項都有角色(system、user、assistant)與內容。
streamboolean—透過 SSE 逐步回傳結果。預設為 false。
temperaturenumber—取樣溫度,介於 0 到 2 之間。數值越低,輸出越固定。
max_tokensinteger—要生成的 token 上限。實際上限取決於所選的模型。
toolsarray—模型可以呼叫的工具定義。需要一個回報支援工具使用的模型。
response_formatobject—要求結構化輸出,例如 json_object 型別。

Streaming

設定 stream: true 以接收伺服器傳送事件 (server-sent events),並以 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 之間互轉,則是接連進行兩次轉換。 我們不建議這麼做,也不對其保真度做任何承諾 —— 若你需要 那兩種形式其中之一,請選擇一個原生宣告該形式的模型。

  • 嵌入(embeddings)、重排(reranking)、音訊與即時(realtime) 完全沒有轉換。針對這些功能、形式不對的請求會被拒絕,而不會 被轉換。