新着どんなエージェントもUberLLMにつなぐだけ。1つのキーで全モデル、定価以下で。
UberLLM

Responses API

POST https://api.uberllm.dev/v1/responses は、カタログ内のすべてのチャットモデルで OpenAI の Responses API を提供しています。OpenAI SDK (client.responses.create)、Codex CLI、または「Responses」モードを持つ任意のアプリから利用できます。リクエストは /v1/chat/completions と同じルーティング、リトライ、キー制限、課金システムを経由し、各呼び出しは費用とともに ダッシュボード → アクティビティ に表示されます。

curl https://api.uberllm.dev/v1/responses \
  -H "Authorization: Bearer $UBERLLM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek/deepseek-v4.1-flash",
    "instructions": "Answer in one short sentence.",
    "input": "What is the capital of France?"
  }'
from openai import OpenAI

client = OpenAI(base_url="https://api.uberllm.dev/v1", api_key="ull_...")
r = client.responses.create(model="deepseek/deepseek-v4.1-flash", input="Say hi")
print(r.output_text)

状態は保存されません

UberLLMは、後で続きから利用できるように応答を保存しません。すべての応答には"store": falseがあり、各呼び出しで、以前のユーザーメッセージ、モデルの出力項目、およびツールの結果を含む会話全体をinputで送信します。Codex CLIはすでにこの方法で動作します。

これらは、フィールド名を指定する400 (code: unsupported_parameter) で拒否されます。

  • previous_response_idとconversation
  • background: true
  • item_referenceタイプの入力項目
  • 保存されたプロンプトテンプレート (prompt)

GET /v1/responses/{id}およびその他の保存済み応答ルートは存在しません。

リクエスト

フィールド 内容
model 任意のチャットモデルID、エイリアス、または:floor / :nitroサフィックス。チャット補完と同様。
input 文字列、またはアイテムのリスト(下記参照)。
instructions システムメッセージとしてモデルに送信されます。
stream サーバー送信イベント用のtrue。
max_output_tokens 出力上限。
temperature, top_p, seed, stop モデルに渡されます。
tools, tool_choice, parallel_tool_calls 下記のツールを参照してください。
reasoning.effort モデルの推論努力(思考するモデル)として渡されます。
text.format text、json_object、またはjson_schema(構造化出力)。
metadata 独自のタグ。アクティビティ行に表示されます。チャット補完と同様。
provider, models UberLLMルーティングオプション。チャット補完と同様。(モデルとルーティング](リンクは元のまま))
store, include, prompt_cache_key, service_tier, truncation 受け入れられますが、使用されません。暗号化された推論は常に返されます。

入力アイテム

アイテム となるもの
ロールuser、assistant、systemまたはdeveloperを持つmessage チャットメッセージ。developerはsystemとして送信されます。コンテンツパーツinput_text、output_text、input_image(image_url:httpsまたはdata: URL)、およびinput_file(file_dataまたはfile_url)。
function_call アシスタントのツール呼び出し。順序を保ちます。
function_call_output ツールの結果。出力内の画像は、次のユーザーのターンで送信されます。
custom_tool_call, custom_tool_call_output カスタム(自由形式)ツールへの呼び出し、およびその結果。
reasoning モデルの以前の推論。次のターンでモデルに返されます。
web_search_callおよびその他のホスト型ツールレコード スキップされます。

アイテムidは受け入れられますが、無視されます。file_id(アップロードされたファイル)は input_image / input_fileではサポートされていません。ファイルをインラインまたはURLで送信してください。

ツール

  • function: {"type": "function", "name", "description", "parameters", "strict"}。 モデルの呼び出しは、call_id、name、およびarguments(JSON文字列)を伴うfunction_callアイテムとして返されます。同じcall_idを保持するfunction_call_outputアイテムで応答してください。
  • custom(Codexのapply_patchのような自由形式の入力):モデルには、1つの文字列入力と、その説明としてformat.definitionの文法を持つツールが与えられます。呼び出しは、生のinputを伴うcustom_tool_callアイテムとして返されます。
  • namespace(CodexのMCPツール):内部の各ツールは、そのnamespaceと名前が結合された形(mcp__github__get_issue)でモデルに提供されます。呼び出しは、nameとnamespaceが再度分割された状態で返されます。
  • Hosted tools(web_search、file_search、code_interpreter、 image_generation、computer_use、mcp)はOpenAI自身のサーバーで実行されます。それらはリクエストから除外され、モデルはそれらなしで応答します。

tool_choiceは"auto"、"none"、"required"、または{"type": "function", "name": "…"}を受け入れます。

レスポンス

{
  "id": "resp_…",
  "object": "response",
  "created_at": 1793333237,
  "status": "completed",
  "model": "deepseek/deepseek-v4.1-flash",
  "output": [
    {"type": "reasoning", "id": "rs_…", "summary": [],
     "content": [{"type": "reasoning_text", "text": "…"}], "encrypted_content": "ull1:…"},
    {"type": "message", "id": "msg_…", "status": "completed", "role": "assistant",
     "content": [{"type": "output_text", "text": "Paris.", "annotations": []}]},
    {"type": "function_call", "id": "fc_…", "status": "completed",
     "call_id": "call_…", "name": "get_weather", "arguments": "{\"city\":\"Paris\"}"}
  ],
  "usage": {
    "input_tokens": 43, "input_tokens_details": {"cached_tokens": 0},
    "output_tokens": 23, "output_tokens_details": {"reasoning_tokens": 0},
    "total_tokens": 66, "cost_usd": 0.0000184
  },
  "store": false
}
  • モデルがその推論を返すと、reasoning項目が表示されます。次のinputでそのまま返送してください。encrypted_contentには推論が含まれているため、次のターンでそれを必要とするモデルがそれを受け取ることができます。
  • 回答がmax_output_tokens(incomplete_details.reason: "max_output_tokens")に達した場合、またはコンテンツフィルター("content_filter")に引っかかった場合、statusはincompleteです。
  • usage.cost_usdは、その呼び出しに対して請求されたものです。ストリーミングではない応答にもX-UberLLM-Cost-USDヘッダーに含まれており、すべての応答にはX-Request-Idが含まれており、これはそのActivity行のIDです。
  • 送信した設定(instructions、tools、temperature、max_output_tokens…)は、OpenAIと同様にエコーバックされます。

ストリーミング

"stream": trueでは、応答はサーバー送信イベントになり、それぞれにtypeと、0から始まるsequence_numberが含まれます。

  1. response.created、response.in_progress
  2. 各出力項目について:response.output_item.added、次にその差分、そして完成した項目を含むresponse.output_item.doneが続きます:
    • テキスト:response.content_part.added、response.output_text.delta…、 response.output_text.done、response.content_part.done
    • 推論:response.reasoning_text.delta…、response.reasoning_text.done
    • function call:response.function_call_arguments.delta…、 response.function_call_arguments.done
    • custom tool call:response.custom_tool_call_input.done
  3. 応答全体と、cost_usdを含むそのusageを伴うresponse.completed(またはresponse.incomplete)です。

低速なモデルが起動している間、: ping個のコメント行が接続を維持します。すべてのSSEクライアントはこれらをスキップします。

エラー

ストリーム開始前に拒否されたリクエストは、HTTPステータスとOpenAIのエラーエンベロープを受け取ります。これはチャット補完と同じです(401、402 クレジット不足、404 不明なモデル、429;Errors]を参照)。ストリーム開始後に何らかの障害が発生した場合、それはresponse.failedで終了し、そのresponse.errorにはcodeとmessageが含まれます。モデルが完了する前に停止したストリームもresponse.failedで終了し、response.completedで終了することはありません。そのため、クライアントは半端な回答を保持するのではなく、再試行します。