OpenAI SDK
UberLLM implementiert die OpenAI Chat Completions API. Jeder Code, der das
offizielle openai SDK (oder einen kompatiblen Client) verwendet, funktioniert, indem zwei Dinge eingestellt werden:
base_url/baseURL→https://api.uberllm.dev/v1api_key/apiKey→ Ihrull_key
Alles andere — messages, tools, response_format, stream,
max_tokens, temperature — bleibt unverändert.
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 wird unverändert weitergeleitet. Verwenden Sie Modelle, die Tool-Unterstützung anbieten (siehe Models & routing; der Katalog kennzeichnet 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)
Eine Antwort, die ein Tool aufruft, endet immer mit finish_reason: "tool_calls" (stop_reason: "tool_use" auf /v1/messages), ob gestreamt oder nicht, unabhängig davon, welcher Anbieter sie bereitgestellt hat. Senden Sie jeden Tool-Aufruf so zurück, wie Sie ihn erhalten haben: einige enthalten ein extra_content Feld (Gemini's thought signature), das das Modell für den nächsten Zug benötigt.
Antwortformat
Jede Antwort hat die gleichen Felder, unabhängig davon, welcher Anbieter sie bereitgestellt hat: die OpenAI Chat Completion Felder (id, object, created, model, choices, usage) und unser usage.cost_usd. Felder, die ein Anbieter selbst hinzufügt (x_groq, service_tier, system_fingerprint, usage.queue_time und dergleichen), werden entfernt.
Reasoning-Modelle senden ihre Begründung sowohl in reasoning als auch in reasoning_content, mit dem gleichen Text, in message (oder delta beim streaming), damit ein Client, der eines von beiden liest, es erhält. Wenn ein Anbieter OpenRouter-style reasoning_details sendet, werden sie unverändert weitergeleitet. Eine Antwort ohne Begründung hat keines der beiden Felder.
Anfragefelder, die ein Anbieter ablehnt, aber die nur die Antwort anpassen (reasoning, thinking, verbosity, top_k und Ähnliches), werden für diesen Anbieter verworfen, und reasoning: {"effort": "low"} wird als reasoning_effort gesendet, wenn dies erforderlich ist. Nachrichteninhalt, der als Liste von Textteilen gesendet wird, geht als ein einziger string an einen Anbieter, der nur strings akzeptiert. Ein Bild, Audio oder eine Datei, die an ein Modell gesendet wird, das nur Text liest, wird mit einer einfachen 400 abgelehnt, die dies besagt: prüfen Sie zuerst input_modalities in GET /v1/models.
Modelle auflisten
curl https://api.uberllm.dev/v1/models \
-H "Authorization: Bearer $UBERLLM_API_KEY"
Gibt die OpenAI-Listenform ({"object":"list","data":[{"id": "...", ...}]})
mit den Chat-Modellen zurück, die Sie jetzt aufrufen können; ?type=all fügt Bild-, Video-, Musik- und
Sprachmodelle hinzu. Jedes Chat-Modell enthält context_length, max_output_tokens,
input_modalities, supports_tools, supports_reasoning, supports_vision und
supported_parameters (siehe Modelle & Routing).
Der öffentliche Katalog (ohne Authentifizierung) ist auch unter GET /api/v1/public/models mit
Preisgestaltung pro Endpoint.
Streaming-Nutzung
Für Streaming-Anfragen fragt UberLLM automatisch die token usage ab
(stream_options.include_usage), sodass der letzte chunk ein usage object enthält
mit cost_usd, womit der Aufruf in US-Dollar abgerechnet wird. Eine Antwort, die nicht
gestreamt wird, hat ebenfalls usage.cost_usd und den X-UberLLM-Cost-USD header (außer
bei einer langsamen, die bereits mit keepalive spaces begonnen hat: dann nur das body field).
Ihre Rechnung ist der Betrag, den der marketplace für diesen Aufruf meldet. Die Antwort wartet nicht
auf diesen Bericht: Wenn er noch nicht vorliegt, ist cost_usd unsere Schätzung, und
Ihr Guthaben sowie Dashboard → Activity zeigen den genauen Betrag einen Moment später an. Sollte die usage einmal
fehlen, greift UberLLM auf eine tokenizer estimate zurück — solche Zeilen sind in
Dashboard → Activity gekennzeichnet.
Responses API
client.responses.create und client.responses.stream funktionieren auch bei jedem Chat-Modell: Text, Tool Calls (function_call → function_call_output), Structured Output und Streaming. UberLLM speichert nichts, senden Sie daher die gesamte Konversation in input bei jedem Aufruf anstelle von previous_response_id. Details:
Responses API](```python
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)
## Hinweise
- Das nachgestellte `/v1` ist in der base URL erforderlich.
- Jede Anfrage wird an einen verfügbaren Drittanbieter für das Modell gesendet und es wird das in Rechnung gestellt, was der Anbieter berechnet hat, ohne UberLLM-Gebühr. Siehe [Preise](./pricing).
- Für automatische Wiederholungsversuche und die Routing-Optionen, die UberLLM akzeptiert, siehe [Modelle & Routing](./models-and-routing).