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/v1api_key/apiKey→ jeull_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
/v1is 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.