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とconversationbackground: trueitem_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が含まれます。
response.created、response.in_progress- 各出力項目について:
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
- テキスト:
- 応答全体と、
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で終了することはありません。そのため、クライアントは半端な回答を保持するのではなく、再試行します。