NieuwKoppel elke agent aan UberLLM: één sleutel, elk model, voor de catalogusprijs of minder.
UberLLM

Responses API

POST https://api.uberllm.dev/v1/responses biedt OpenAI's Responses API aan voor elk chatmodel in de catalogus. Gebruik het via de OpenAI SDK (client.responses.create), Codex CLI, of elke app met een "Responses"-modus. Verzoeken doorlopen dezelfde routing, retries, key limits en billing als /v1/chat/completions, en elke aanroep wordt vermeld in Dashboard → Activiteit met de bijbehorende kosten.

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)

Geen opgeslagen status

UberLLM bewaart geen antwoorden zodat u later verder kunt gaan. Elk antwoord heeft "store": false, en u stuurt de hele conversatie in input bij elke aanroep: eerdere gebruikersberichten, de uitvoeritems van het model en uw toolresultaten. Codex CLI werkt al op deze manier.

Deze worden geweigerd met een 400 (code: unsupported_parameter) die het veld benoemt:

  • previous_response_id en conversation
  • background: true
  • input items van type item_reference
  • opgeslagen prompt templates (prompt)

GET /v1/responses/{id} en de andere routes voor opgeslagen antwoorden bestaan niet.

Verzoek

Veld Wat er gebeurt
model Elke chatmodel-ID, alias of :floor / :nitro achtervoegsel, zoals bij chat completions.
input Een string, of een lijst met items (zie hieronder).
instructions Verzonden naar het model als de system message.
stream true voor server-sent events.
max_output_tokens De output cap.
temperature, top_p, seed, stop Doorgegeven aan het model.
tools, tool_choice, parallel_tool_calls Zie Tools hieronder.
reasoning.effort Doorgegeven als de redeneerinspanning van het model (modellen die nadenken).
text.format text, json_object, of json_schema (structured output).
metadata Je eigen tags, getoond op de Activity-rij, zoals bij chat completions.
provider, models UberLLM routing options, zoals bij chat completions (Modellen & routing).
store, include, prompt_cache_key, service_tier, truncation Geaccepteerd en niet gebruikt. Versleutelde redenering wordt altijd geretourneerd.

Input-items

Item Wordt
message met rol user, assistant, system of developer Een chatbericht. developer wordt verzonden als system. Content parts input_text, output_text, input_image (image_url: een https of data: URL) en input_file (file_data of file_url).
function_call De tool call van de assistent, op volgorde gehouden.
function_call_output Het resultaat van de tool. Afbeeldingen in een output worden in de volgende gebruikersbeurt verzonden.
custom_tool_call, custom_tool_call_output Een aanroep naar een aangepaste (freeform) tool, en het resultaat ervan.
reasoning De eerdere redenering van het model, teruggegeven aan het model in de volgende beurt.
web_search_call en andere hosted-tool records Overgeslagen.

Item ids worden geaccepteerd en genegeerd. file_id (geüploade bestanden) wordt niet ondersteund in input_image / input_file: stuur het bestand inline of via URL.

Tools

  • function: {"type": "function", "name", "description", "parameters", "strict"}. De aanroep van het model komt terug als een function_call item met call_id, name en arguments (een JSON string). Antwoord met een function_call_output item dat dezelfde call_id bevat.
  • custom (vrije-vorm invoer, zoals Codex's apply_patch): het model krijgt de tool met één string invoer, en de grammatica in format.definition als beschrijving. De aanroep komt terug als een custom_tool_call item met de ruwe input.
  • namespace (Codex's MCP tools): elke tool hierin wordt aan het model aangeboden onder de samengevoegde namespace en naam (mcp__github__get_issue); de aanroep komt terug met name en namespace weer gesplitst.
  • Gehoste tools (web_search, file_search, code_interpreter, image_generation, computer_use, mcp) draaien op de eigen servers van OpenAI. Ze worden weggelaten uit de aanvraag en het model antwoordt zonder deze.

tool_choice accepteert "auto", "none", "required", of {"type": "function", "name": "…"}.

Antwoord

{
  "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
}
  • Een reasoning item verschijnt wanneer het model zijn redenering teruggeeft. Stuur het terug in de volgende input zoals het is: encrypted_content bevat de redenering zodat modellen die het in de volgende beurt nodig hebben, het krijgen.
  • status is incomplete wanneer het antwoord max_output_tokens (incomplete_details.reason: "max_output_tokens") raakte of een contentfilter ("content_filter").
  • usage.cost_usd is wat de oproep in rekening werd gebracht. Niet-streaming antwoorden bevatten het ook in de X-UberLLM-Cost-USD header, en elk antwoord heeft X-Request-Id, de id van de Activity-rij.
  • De instellingen die je stuurde (instructions, tools, temperature, max_output_tokens…) worden teruggegeven zoals OpenAI dat doet.

Streaming

Met "stream": true is het antwoord server-sent events, elk met type en een sequence_number beginnend bij 0:

  1. response.created, response.in_progress
  2. Voor elk uitvoeritem: response.output_item.added, dan de deltas ervan, dan response.output_item.done met het voltooide item:
    • tekst: response.content_part.added, response.output_text.delta…, response.output_text.done, response.content_part.done
    • redenering: 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. response.completed (of response.incomplete) met de hele respons en de usage ervan, inclusief cost_usd.

Terwijl een langzaam model opstart, houden : ping commentaarregels de verbinding open. Elke SSE client slaat deze over.

Fouten

Een verzoek dat geweigerd wordt voordat de stream begint, krijgt een HTTP-status en de error envelope van OpenAI, hetzelfde als bij chat completions (401, 402 geen tegoed, 404 onbekend model, 429; zie Fouten). Als er iets misgaat nadat de stream is gestart, eindigt het met response.failed, waarvan de response.error code en message heeft. Een stream die stopt voordat het model klaar is, eindigt ook met response.failed, nooit met response.completed, zodat clients het opnieuw proberen in plaats van een half antwoord te bewaren.