OpenAI SDK
UberLLM は OpenAI Chat Completions API を実装しています。公式の openai SDK(または互換性のあるクライアント)を使用するあらゆるコードは、以下の2つの設定を行うだけで動作します。
base_url/baseURL→https://api.uberllm.dev/v1api_key/apiKey→ お使いのull_key
その他のすべて — messages, tools, response_format, stream, max_tokens, temperature — は変更ありません。
パイソン
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.uberllm.dev/v1",
api_key=os.environ["UBERLLM_API_KEY"],
)
# Non-streaming
resp = client.chat.completions.create(
model="deepseek/deepseek-v4-flash",
messages=[{"role": "user", "content": "Explain rope embeddings briefly."}],
)
print(resp.choices[0].message.content)
print(resp.usage) # prompt_tokens / completion_tokens are returned per request
# Streaming
stream = client.chat.completions.create(
model="deepseek/deepseek-v4-flash",
messages=[{"role": "user", "content": "Count to five."}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)
TypeScript / JavaScript
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.uberllm.dev/v1",
apiKey: process.env.UBERLLM_API_KEY,
});
const resp = await client.chat.completions.create({
model: "deepseek/deepseek-v4-flash",
messages: [{ role: "user", content: "Explain rope embeddings briefly." }],
});
console.log(resp.choices[0].message.content);
ツール呼び出し
ツール/関数呼び出しはそのまま通過します。ツールサポートを宣伝しているモデルを使用してください (モデルとルーティング]を参照。カタログにはsupports_toolsとマークされています)。
resp = client.chat.completions.create(
model="deepseek/deepseek-v4-flash",
messages=[{"role": "user", "content": "What is the weather in Paris?"}],
tools=[{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather for a city",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}],
)
print(resp.choices[0].message.tool_calls)
ツールを呼び出す応答は、ストリーミングされているかどうかにかかわらず、どのプロバイダーが提供したものであっても、常にfinish_reason: "tool_calls"で終わります (/v1/messagesではstop_reason: "tool_use")。各ツール呼び出しは、受け取ったとおりに返してください。一部には、モデルが次のターンで必要とするextra_contentフィールド (Geminiの思考シグネチャ) が含まれています。
応答の形式
どのプロバイダーが提供した応答でも、同じフィールドを持っています。OpenAIのチャット補完フィールド(id, object, created, model, choices, usage)と、当社のusage.cost_usdです。プロバイダーが独自に追加するフィールド(x_groq, service_tier, system_fingerprint, usage.queue_timeなど)は削除されます。
推論モデルは、reasoningとreasoning_contentの両方に、同じテキストで推論を送信します。これはmessage(またはストリーミング時はdelta)で行われるため、どちらかを読み取るクライアントはそれを受け取ることができます。プロバイダーがOpenRouterスタイルのreasoning_detailsを送信する場合、それらは変更されずに通過します。推論のない応答には、どちらのフィールドもありません。
プロバイダーが拒否するが、応答を調整するだけの要求フィールド(reasoning, thinking, verbosity, top_kなど)は、そのプロバイダーに対しては削除され、必要に応じてreasoning: {"effort": "low"}はreasoning_effortとして送信されます。テキストパーツのリストとして送信されたメッセージコンテンツは、文字列のみを受け取るプロバイダーには1つの文字列として渡されます。テキストのみを読み取るモデルに画像、音声、またはファイルを送信した場合、その旨を伝える簡潔な400で拒否されます。まず、GET /v1/modelsのinput_modalitiesを確認してください。
モデルのリスト表示
curl https://api.uberllm.dev/v1/models \
-H "Authorization: Bearer $UBERLLM_API_KEY"
現在呼び出し可能なチャットモデルとともに、OpenAIのリスト形式 ({"object":"list","data":[{"id": "...", ...}]}) を返します。?type=all は画像、動画、音楽、音声モデルを追加します。各チャットモデルは context_length, max_output_tokens, input_modalities, supports_tools, supports_reasoning, supports_vision および supported_parameters を含んでいます (モデルとルーティング] を参照)。
公開カタログ (認証なし) は、エンドポイントごとの料金設定で GET /api/v1/public/models でも利用可能です。
ストリーミング利用
ストリーミングリクエストの場合、UberLLMは自動的にトークン使用量(stream_options.include_usage)を要求します。そのため、最後のチャンクには、その呼び出しが米ドルで請求される金額であるcost_usdを含むusageオブジェクトが含まれます。ストリーミングされない応答には、usage.cost_usdとX-UberLLM-Cost-USDヘッダーも含まれます。ただし、キープアライブスペースで既に開始されている遅い応答の場合は、ボディフィールドのみとなります。お客様の請求額は、その呼び出しに対してマーケットプレイスが報告する費用です。応答はその報告を待ちません。まだ報告が届いていない場合、cost_usdは当社の見積もりであり、お客様の残高とDashboard → Activityには、少し後に正確な請求額が表示されます。使用量が不足している場合、UberLLMはトークナイザーの見積もりにフォールバックします。そのような行はDashboard → Activityでフラグが立てられます。
Responses API
client.responses.createとclient.responses.streamも、あらゆるチャットモデルで機能します:テキスト、ツール呼び出し (function_call → function_call_output)、構造化出力、およびストリーミング。UberLLMは何も保存しないため、previous_response_idの代わりに各呼び出しで会話全体をinputとして送信してください。詳細:Responses API。
r = client.responses.create(
model="deepseek/deepseek-v4.1-flash",
instructions="Answer in one short sentence.",
input="What is the capital of France?",
)
print(r.output_text)
注意事項
- base URLには末尾の
/v1が必要です。 - 各リクエストは、モデルの利用可能なサードパーティプロバイダーに送信され、プロバイダーが請求した料金が課金されます。UberLLMの手数料はかかりません。料金]をご覧ください。
- 自動リトライとUberLLMが受け入れるルーティングオプションについては、モデルとルーティング]をご覧ください。