OpenAI SDK
UberLLM implementa la API de Chat Completions de OpenAI. Cualquier código que utilice el SDK oficial openai (o un cliente compatible) funciona configurando dos cosas:
base_url/baseURL→https://api.uberllm.dev/v1api_key/apiKey→ tu claveull_
Todo lo demás — messages, tools, response_format, stream, max_tokens, temperature — permanece sin cambios.
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);
Llamada a herramientas
La llamada a herramientas/funciones se transmite sin cambios. Usa modelos que anuncien soporte para herramientas (consulta Modelos y enrutamiento; el catálogo marca 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 respuesta que llama a una herramienta siempre termina con finish_reason: "tool_calls" (stop_reason: "tool_use" en /v1/messages), con streaming o sin él, independientemente del proveedor que la haya servido. Envía cada llamada a herramienta de vuelta tal como la recibiste: algunas llevan un campo extra_content (firma de pensamiento de Gemini) que el modelo necesita en el siguiente turno.
Formato de la respuesta
Cada respuesta tiene los mismos campos, independientemente del proveedor que la haya servido: los campos de finalización de chat de OpenAI (id, object, created, model, choices, usage) y nuestro usage.cost_usd. Los campos que un proveedor añade por su cuenta (x_groq, service_tier, system_fingerprint, usage.queue_time y similares) se eliminan.
Los modelos de razonamiento envían su razonamiento tanto en reasoning como en reasoning_content, con el mismo texto, en message (o delta cuando se hace streaming), para que un cliente que lea cualquiera de los dos lo reciba. Cuando un proveedor envía reasoning_details al estilo OpenRouter, estos pasan sin cambios. Una respuesta sin razonamiento no tiene ninguno de los dos campos.
Los campos de solicitud que un proveedor rechaza pero que solo ajustan la respuesta (reasoning, thinking, verbosity, top_k y similares) se eliminan para ese proveedor, y reasoning: {"effort": "low"} se envía como reasoning_effort cuando es necesario. El contenido del mensaje enviado como una lista de partes de texto se envía como una sola cadena a un proveedor que solo acepta cadenas. Una imagen, audio o archivo enviado a un modelo que solo lee texto es rechazado con un 400 simple que lo indica: verifica input_modalities en GET /v1/models primero.
Listar modelos
curl https://api.uberllm.dev/v1/models \
-H "Authorization: Bearer $UBERLLM_API_KEY"
Devuelve el formato de lista de OpenAI ({"object":"list","data":[{"id": "...", ...}]})
con los modelos de chat que puedes invocar ahora; ?type=all añade modelos de imagen, video, música y
voz. Cada modelo de chat incluye context_length, max_output_tokens,
input_modalities, supports_tools, supports_reasoning, supports_vision y
supported_parameters (ver Modelos y enrutamiento).
El catálogo público (sin autenticación) también está en GET /api/v1/public/models con
precios por endpoint.
Uso de streaming
Para las solicitudes de streaming, UberLLM solicita automáticamente el uso de token (stream_options.include_usage), por lo que el fragmento final lleva un objeto usage con cost_usd, lo que se factura a la llamada en dólares estadounidenses. Una respuesta que no es de streaming también tiene usage.cost_usd y el encabezado X-UberLLM-Cost-USD (excepto una lenta que ya comenzó con espacios de keepalive: entonces solo el campo del cuerpo). Tu factura es el costo que el marketplace informa para esa llamada. La respuesta no espera ese informe: cuando aún no está disponible, cost_usd es nuestra estimación, y tu saldo y Dashboard → Activity muestran el cargo exacto un momento después. Si alguna vez falta el uso, UberLLM recurre a una estimación del tokenizer — dichas filas se marcan en Dashboard → Activity.
API de Respuestas
client.responses.create y client.responses.stream también funcionan, en cada modelo de chat: texto, llamadas a herramientas (function_call → function_call_output), salida estructurada y streaming. UberLLM no almacena nada, así que envía la conversación completa en input cada llamada en lugar de previous_response_id. Detalles:
API de Respuestas.
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)
Notas
- El
/v1final es obligatorio en la base URL. - Cada solicitud se envía a un proveedor externo disponible para el modelo y se factura lo que el proveedor cobró, sin ninguna tarifa de UberLLM. Consulta Precios.
- Para reintentos automáticos y las opciones de routing que UberLLM acepta, consulta Modelos y routing.