OpenAI SDK
UberLLM implementa l'API OpenAI Chat Completions. Qualsiasi codice che utilizzi l'SDK ufficiale openai (o un client compatibile) funziona impostando due cose:
base_url/baseURL→https://api.uberllm.dev/v1api_key/apiKey→ la tuaull_key
Tutto il resto — messages, tools, response_format, stream, max_tokens, temperature — rimane invariato.
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);
Chiamata di strumenti
La chiamata di strumenti/funzioni passa attraverso inalterata. Usa modelli che pubblicizzano il supporto per gli strumenti (vedi Modelli e routing; il catalogo contrassegna 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)
Una risposta che chiama uno strumento termina sempre con finish_reason: "tool_calls" (stop_reason: "tool_use" su /v1/messages), in streaming o meno, qualunque sia il provider che l'ha fornita. Rimanda indietro ogni chiamata di strumento così come l'hai ricevuta: alcune portano un campo extra_content (la firma di pensiero di Gemini) di cui il modello ha bisogno al turno successivo.
Struttura della risposta
Ogni risposta ha gli stessi campi, indipendentemente dal provider che l'ha fornita: i campi di completamento della chat di OpenAI (id, object, created, model, choices, usage) e il nostro usage.cost_usd. I campi che un provider aggiunge di sua iniziativa (x_groq, service_tier, system_fingerprint, usage.queue_time e simili) vengono rimossi.
I modelli di ragionamento inviano il loro ragionamento sia in reasoning che in reasoning_content, con lo stesso testo, in message (o delta quando in streaming), in modo che un client che legge l'uno o l'altro lo riceva. Quando un provider invia reasoning_details in stile OpenRouter, questi passano inalterati. Una risposta senza ragionamento non ha nessuno dei due campi.
I campi di richiesta che un provider rifiuta ma che servono solo a ottimizzare la risposta (reasoning, thinking, verbosity, top_k e simili) vengono eliminati per quel provider, e reasoning: {"effort": "low"} viene inviato come reasoning_effort quando è necessario. Il contenuto del messaggio inviato come elenco di parti di testo viene inviato come un'unica stringa a un provider che accetta solo stringhe. Un'immagine, un audio o un file inviato a un modello che legge solo testo viene rifiutato con un semplice 400 che lo indica: controlla prima input_modalities in GET /v1/models.
Elenco dei modelli
curl https://api.uberllm.dev/v1/models \
-H "Authorization: Bearer $UBERLLM_API_KEY"
Restituisce la forma dell'elenco OpenAI ({"object":"list","data":[{"id": "...", ...}]})
con i modelli di chat che puoi chiamare ora; ?type=all aggiunge modelli di immagine, video, musica e
voce. Ogni modello di chat include context_length, max_output_tokens,
input_modalities, supports_tools, supports_reasoning, supports_vision e
supported_parameters (vedi Modelli e instradamento).
Il catalogo pubblico (senza autenticazione) è disponibile anche su GET /api/v1/public/models con
prezzi per endpoint.
Utilizzo dello streaming
Per le richieste in streaming, UberLLM richiede automaticamente l'utilizzo dei token (stream_options.include_usage), così il chunk finale contiene un oggetto usage con cost_usd, il costo della chiamata in dollari USA. Una risposta non in streaming ha anche usage.cost_usd e l'header X-UberLLM-Cost-USD (eccetto quelle lente che sono già iniziate con spazi keepalive: in quel caso solo il campo body). Il tuo addebito è il costo che il marketplace riporta per quella chiamata. La risposta non attende quel report: quando non è ancora disponibile, cost_usd è la nostra stima, e il tuo saldo e Dashboard → Attività mostrano l'addebito esatto un momento dopo. Se l'utilizzo dovesse mancare, UberLLM ricorre a una stima del tokenizer — tali righe sono contrassegnate in Dashboard → Attività.
API delle Risposte
client.responses.create e client.responses.stream funzionano anche, su ogni modello di chat: testo, chiamate a strumenti (function_call → function_call_output), output strutturato e streaming. UberLLM non memorizza nulla, quindi invia l'intera conversazione in input a ogni chiamata invece di previous_response_id. Dettagli:
API delle Risposte.
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)
Note
- Lo
/v1finale è richiesto nel base URL. - Ogni richiesta viene inviata a un provider terzo disponibile per il modello e viene fatturata in base a quanto addebitato dal provider, senza alcuna commissione UberLLM. Vedi Prezzi.
- Per i tentativi automatici e le opzioni di routing che UberLLM accetta, vedi Modelli e routing.