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。只寫名稱會走智慧路由;channel/name 則鎖定單一通道。詳見「模型 ID」。 |
messages | array | 是 | 對話訊息。每一項都有角色(system、user、assistant)與內容。 |
stream | boolean | — | 透過 SSE 逐步回傳結果。預設為 false。 |
temperature | number | — | 取樣溫度,介於 0 到 2 之間。數值越低,輸出越固定。 |
max_tokens | integer | — | 要生成的 token 上限。實際上限取決於所選的模型。 |
tools | array | — | 模型可以呼叫的工具定義。需要一個回報支援工具使用的模型。 |
response_format | object | — | 要求結構化輸出,例如 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) 完全沒有轉換。針對這些功能、形式不對的請求會被拒絕,而不會 被轉換。
