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

OpenAI SDK

UberLLM implementeert de OpenAI Chat Completions API. Elke code die de officiële openai SDK (of een compatibele client) gebruikt, werkt door twee dingen in te stellen:

  • base_url / baseURL → https://api.uberllm.dev/v1
  • api_key / apiKey → je ull_ key

Al het andere — messages, tools, response_format, stream, max_tokens, temperature — blijft ongewijzigd.

Python

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);

Tool calling

Tool/function calling wordt ongewijzigd doorgegeven. Gebruik modellen die toolondersteuning aanbieden (zie Modellen & routering; de catalogus markeert 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)

Een antwoord dat een tool aanroept, eindigt altijd met finish_reason: "tool_calls" (stop_reason: "tool_use" op /v1/messages), gestreamd of niet, ongeacht welke provider het heeft geleverd. Stuur elke toolaanroep terug zoals je die hebt ontvangen: sommige bevatten een extra_content veld (Gemini's thought signature) dat het model nodig heeft in de volgende beurt.

Opbouw van het antwoord

Elk antwoord heeft dezelfde velden, ongeacht welke provider het heeft geleverd: de OpenAI chat completion velden (id, object, created, model, choices, usage) en onze usage.cost_usd. Velden die een provider zelf toevoegt (x_groq, service_tier, system_fingerprint, usage.queue_time en dergelijke) worden verwijderd.

Redenerende modellen sturen hun redenering in zowel reasoning als reasoning_content, met dezelfde tekst, in message (of delta bij streaming), zodat een client die één van beide leest, de informatie krijgt. Wanneer een provider OpenRouter-stijl reasoning_details verstuurt, gaan deze ongewijzigd door. Een antwoord zonder redenering heeft geen van beide velden.

Verzoekvelden die een provider weigert, maar die alleen het antwoord afstemmen (reasoning, thinking, verbosity, top_k en dergelijke), worden voor die provider weggelaten, en reasoning: {"effort": "low"} wordt als reasoning_effort verstuurd wanneer dat nodig is. Berichtinhoud die als een lijst van tekstgedeelten wordt verstuurd, gaat als één string naar een provider die alleen strings accepteert. Een afbeelding, audio of bestand dat naar een model wordt gestuurd dat alleen tekst leest, wordt geweigerd met een duidelijke 400 die dat aangeeft: controleer eerst input_modalities in GET /v1/models.

Modellen weergeven

curl https://api.uberllm.dev/v1/models \
  -H "Authorization: Bearer $UBERLLM_API_KEY"

Geeft de OpenAI lijststructuur ({"object":"list","data":[{"id": "...", ...}]}) terug met de chatmodellen die je nu kunt aanroepen; ?type=all voegt afbeeldings-, video-, muziek- en spraakmodellen toe. Elk chatmodel bevat context_length, max_output_tokens, input_modalities, supports_tools, supports_reasoning, supports_vision en supported_parameters (zie Modellen & routing). De openbare catalogus (geen authenticatie) staat ook op GET /api/v1/public/models met prijzen per endpoint.

Streaminggebruik

Voor streaming requests vraagt UberLLM automatisch om token usage (stream_options.include_usage), dus de laatste chunk bevat een usage object met cost_usd, wat de oproep in US dollars kost. Een antwoord dat niet gestreamd is, heeft usage.cost_usd ook, en de X-UberLLM-Cost-USD header (behalve een trage die al begon met keepalive spaces: dan alleen het body field). Uw factuur is de kosten die de marketplace rapporteert voor die oproep. Het antwoord wacht niet op dat rapport: wanneer het er nog niet is, is cost_usd onze schatting, en uw saldo en Dashboard → Activiteit tonen de exacte kosten een moment later. Als usage ooit ontbreekt, valt UberLLM terug op een tokenizer estimate — zulke rijen worden gemarkeerd in Dashboard → Activiteit.

Responses API

client.responses.create en client.responses.stream werken ook, op elk chatmodel: text, tool calls (function_call → function_call_output), structured output en streaming. UberLLM slaat niets op, dus stuur de hele conversatie in input bij elke aanroep in plaats van previous_response_id. Details: 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)

Notities

  • De afsluitende /v1 is vereist in de base URL.
  • Elk verzoek wordt naar een beschikbare externe provider voor het model gestuurd en wordt gefactureerd wat de provider in rekening bracht, zonder UberLLM-kosten. Zie Prijzen.
  • Voor automatische nieuwe pogingen en de routing-opties die UberLLM accepteert, zie Modellen & routing.