為開發者打造的 OpenAI API:使用相容端點
如果你的程式碼已採用 OpenAI 的傳輸格式,只需變更兩個值:Base URL 和金鑰,即可將請求發送至此託管端點。本頁提供具體步驟與可直接貼上的程式碼。
更新

重點摘要
- 將 base URL 設為 https://api.openaigatewayapi.com/v1,並將模型設為 uncensored;你的 OpenAI 客戶端程式碼的其他部分無需變更。
- 聊天完成、串流輸出、函式呼叫與 JSON 模式均可透過標準 SDK 呼叫運作。
- 限制為 8 個並行請求與每分鐘 300 個請求(適用於完整金鑰),因此請實作 429 重試機制。
- 一鍵 $0.50 試用無需信用卡,讓你在付費前即可測試整合。
簡短版本
大多數面向開發者的 openai api指南都假設單一供應商和單一帳單。然而,通訊格式只是透過 HTTPS 傳輸的 JSON,許多客戶端程式碼、框架和工具都能與實作該格式的伺服器通訊。本站託管了其中一個伺服器。你保留自己的 SDK,變更 base URL,換上本站的金鑰,並將模型設為uncensored。
這就是典型應用程式的完整遷移。以下是檢查清單,本頁其餘部分將詳述每個步驟。
- 建立帳戶並在 API 金鑰頁面領取試用額度。
- 將 base URL 設為
https://api.openaigatewayapi.com/v1。 - 將金鑰作為
Authorization: Bearer <key>傳送。當你傳遞api_key時,SDK 會自動為你完成此動作。 - 在所有請求中使用
uncensored作為模型 ID。 - 處理 HTTP 429 錯誤,如結尾所示進行短時間重試。
存在兩個端點:POST /v1/chat/completions 與 GET /v1/models。服務僅限文字。無影像或音訊生成、無嵌入且無微調,因此如果你的應用程式呼叫這些功能,你需要不同的供應商。
使用 curl 檢查連線
在修改應用程式之前,請確認金鑰是否有效。模型端點是最便宜的測試,因為它不會產生 token。
export API_KEY="paste-your-key-here"
curl https://api.openaigatewayapi.com/v1/models \
-H "Authorization: Bearer $API_KEY" | grep -o uncensored
如果列表中包含該模型,grep 會輸出模型 ID uncensored;移除 grep 即可查看完整的 JSON 列表。如果收到 401 錯誤,表示金鑰有誤或缺少 Bearer 前綴。現在傳送一個實際請求:
curl https://api.openaigatewayapi.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [
{"role": "system", "content": "You are a concise technical assistant."},
{"role": "user", "content": "Explain idempotency keys in two sentences."}
],
"temperature": 0.4
}'
回應包含通常的 choices 與 usage 物件。它還包含值得記錄的標頭:X-Request-Id 用於支援問題,X-Balance-USD 顯示剩餘額度,以及顯示請求與並行上限的兩個 X-RateLimit-Limit-* 標頭。
Python 使用官方 openai 套件
在 Python 中,你只需處理客戶端建構子。其後的程式碼即為你現有的程式碼。
from openai import OpenAI
client = OpenAI(
base_url="https://api.openaigatewayapi.com/v1",
api_key="paste-your-key-here",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You write short, accurate release notes."},
{"role": "user", "content": "Summarise: added retry logic, fixed timeout bug."},
],
temperature=0.5,
max_tokens=200,
)
print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)
在實際程式碼中,應從環境變數讀取金鑰。範例程式碼僅為了保持程式碼片段簡短而將其硬編碼。此處的max_tokens是選填的;如果省略它,補全內容可以使用剩餘的 100,000 token 上下文視窗(提示詞加上補全內容總和)。即使如此設定,也是控制失控生成成本的廉價方式。
串流輸出
串流輸出使用伺服器發送事件(SSE)和你熟悉的stream=True旗標。用量資訊會在串流結束時傳回,因此最後一個區塊可能包含空的choices列表。
from openai import OpenAI
client = OpenAI(base_url="https://api.openaigatewayapi.com/v1", api_key="paste-your-key-here")
stream = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "List five edge cases for a date parser."}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
if getattr(chunk, "usage", None):
print("\ntokens:", chunk.usage.total_tokens)
有一個細節對容量規劃很重要。串流請求會佔用並行槽位直到串流結束,而不是等到第一個 token 產生時。如果客戶端放棄串流但未關閉它,該槽位會比預期更久處於忙碌狀態。
Node.js 範例
Node SDK 在不同的名稱下採用相同的兩個設定。
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.openaigatewayapi.com/v1",
apiKey: process.env.GATEWAY_KEY,
});
const completion = await client.chat.completions.create({
model: "uncensored",
messages: [
{ role: "user", content: "Write a regex that matches ISO 8601 dates, and explain it." },
],
temperature: 0.3,
});
console.log(completion.choices[0].message.content);
如果你使用的框架具有自己的 OpenAI 整合,請在設定中尋找名為 base URL、API base 或端點的欄位。將相同的 URL 貼上通常就足夠了。聊天前端、Agent 框架和編輯器外掛大多遵循此模式。採樣參數如temperature、top_p、stop、seed以及頻率懲罰和存在懲罰都會傳遞給模型。
工具呼叫與 JSON 模式
決定模型是否適合實際應用的兩個功能:呼叫你的函式與返回可解析的資料。兩者皆支援。
函式呼叫
你使用 tools 宣告工具,可選地使用 tool_choice 強制選擇,並使用 role: "tool" 以訊息形式傳回結果。串流回應會以片段形式傳遞 tool_calls,與標準格式相同。
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.openaigatewayapi.com/v1", api_key="paste-your-key-here")
tools = [{
"type": "function",
"function": {
"name": "get_order_status",
"description": "Look up the status of an order by its ID.",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
},
},
}]
messages = [{"role": "user", "content": "Where is order A-1042?"}]
first = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
msg = first.choices[0].message
if msg.tool_calls:
call = msg.tool_calls[0]
args = json.loads(call.function.arguments)
result = {"order_id": args["order_id"], "status": "shipped"} # your real lookup here
messages.append(msg)
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})
final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
print(final.choices[0].message.content)
在執行動作前務必驗證參數。模型產生的 JSON 大多符合你的結構,但並非每次都能符合,因此請將call.function.arguments視為任何不受信任的輸入。
JSON 模式
對於提取與分類任務,請要求 JSON 物件並在提示詞中說明。在指示中提及 JSON 會比僅依賴旗標獲得更好的結果。
from openai import OpenAI
import json
client = OpenAI(base_url="https://api.openaigatewayapi.com/v1", api_key="paste-your-key-here")
resp = client.chat.completions.create(
model="uncensored",
response_format={"type": "json_object"},
messages=[
{"role": "system", "content": "Reply with JSON only: {\"sentiment\": string, \"topics\": [string]}."},
{"role": "user", "content": "The docs are clear but the rate limits caught me off guard."},
],
)
data = json.loads(resp.choices[0].message.content)
print(data)
限制、錯誤與重試
完整金鑰允許 8 個並行請求,每分鐘 300 個請求。試用金鑰允許 2 個並行請求,每分鐘 60 個請求。最大請求主體為 8 MB。超過限制時,你會收到 HTTP 429 錯誤,錯誤程式碼會告訴你觸及了哪項限制。
| 錯誤代碼 | 意義 | 該怎麼辦 |
|---|---|---|
rate_limited | 每分鐘請求過多 | 減緩生產者速度或將工作分佈到一分鐘內 |
concurrency | 同時請求過多 | 將工作器數量降至 8 個或以下,或在試用金鑰上設為 2 個 |
429 帶有 Retry-After: 5 | 暫時過載 | 等待指定的秒數後再試 |
SDK 已重試某些失敗。新增你自己的 429 處理機制,以免突發流量導致批次作業崩潰:
import time
from openai import OpenAI, RateLimitError
client = OpenAI(
base_url="https://api.openaigatewayapi.com/v1",
api_key="paste-your-key-here",
max_retries=0,
)
def ask(prompt, attempts=5):
for i in range(attempts):
try:
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": prompt}],
)
return r.choices[0].message.content
except RateLimitError as e:
wait = float(e.response.headers.get("retry-after", 2 ** i))
time.sleep(wait)
raise RuntimeError("still rate limited after retries")
失敗或遭拒的請求不會計費,因此重試迴圈不會使帳單加倍。將訊號量設定為與你的並行限制相同,是在非同步程式碼中保持在上限內的最佳方式。
遷移現有應用程式
如果你有正在運作的應用程式,不要硬編碼新值。將 base URL、金鑰和模型名稱放在環境變數中,以便在不重新部署的情況下切換環境。這也讓你能夠對兩個後端執行相同的測試套件,並排比較輸出結果。
import os
from openai import OpenAI
client = OpenAI(
base_url=os.environ.get("LLM_BASE_URL", "https://api.openaigatewayapi.com/v1"),
api_key=os.environ["LLM_API_KEY"],
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")
def complete(messages, **kw):
return client.chat.completions.create(model=MODEL, messages=messages, **kw)
然後執行簡短的遷移程序:
- 將現有的提示詞集在新端點上執行並自行閱讀輸出。自動化檢查會捕捉格式中斷,而非語氣。
- 檢查任何解析 JSON 的程式碼在設定
response_format時仍通過,並保留一個可去除物件周圍雜訊文字的備用方案。 - 從
usage測量實際 token 數量,因為不同的模型對文字進行 token 化的方式不同,你舊的估計可能不準確。 - 將工作器池設為 8 或以下,以便在負載下並行上限不會成為第一個失敗的因素。
- 先將少量流量導向此端點,觀察 429 率與錯誤日誌,然後再擴大。
團隊常在此過程中遺漏系統提示詞。為誘導易拒絕的模型而撰寫的提示詞通常包含推託語句,這些語句在此處並不必要且會使輸出雜亂。重新閱讀並刪除不再產生作用的內容。
切換前必知事項
相容性涵蓋請求與回應格式。這並不表示這是任何模型製造商的官方 API。該服務運行一個開放權重模型,由獨立供應商託管並調整以在法律允許的成人用途下無內容拒絕地回答。它不是跨供應商的路由器,因此你不會在其後找到其他模型的選單。涉及未成年人的性內容不被允許,且此限制無法更改。
針對與大型多模型平台的三個實際差異進行規劃:
- 單一模型。 ID 為
uncensored。如果你的程式碼按任務切換模型,請將其合併為單一值。 - 僅限文字。 從指向此端點的路徑中移除任何影像、音訊或嵌入呼叫。
- 提示詞行為不同。 不同的模型對指令的解讀方式不同,因此切換後請重新執行提示詞與測試。若輸出偏離,請收緊系統提示詞。
提示詞不會用於訓練。完整參數列表請參見 API 文件。如果你正在估算支出,定價頁面 列出了每百萬 token 費率:每 1M 輸入 token 為 $0.15,每 1M 輸出 token 為 $0.50,從預付額度計費,無訂閱費。儲值金額從 $20 到 $500 不等,額度永不過期。如果你正在考慮在多個服務前方設置代理層,LLM 閘道器 頁面涵蓋了額外組件何時能帶來效益。
更多指南
問答
使用此端點需要新的 SDK 嗎?
不會。一旦你將 base URL 設為 https://api.openaigatewayapi.com/v1 並使用本站的 API 金鑰,Python 和 Node.js 的官方 OpenAI SDK 即可運作。任何允許你設定自訂端點的客戶端,運作方式皆相同。
我應該傳送哪個模型 ID?
在所有聊天完成請求的模型欄位中使用 uncensored。你可以透過 GET 請求 /v1/models 來確認。
我可以免費測試嗎?
是。註冊後,你可以在 API 金鑰頁面一鍵領取 $0.50 的免費試用額度。無需綁定信用卡,有效期 7 天,每人限領一次。
是否支援 embeddings 或圖像生成?
否。API 僅支援文字,提供聊天完成功能與模型列表。如需嵌入或影像功能,請使用其他獨立供應商。
我的提示詞會用於訓練嗎?
不會,提示詞不會用於訓練。
只差一張表單,即可取得金鑰
建立帳號、複製金鑰、更改基礎 URL。這就是整個設定過程。