NovoConecte qualquer agente ao UberLLM: uma chave, todos os modelos, pelo preço de tabela ou menos.
UberLLM

SDK da OpenAI

A UberLLM implementa a API de Chat Completions da OpenAI. Qualquer código que usa o SDK oficial openai (ou um cliente compatível) funciona configurando duas coisas:

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

Todo o resto — messages, tools, response_format, stream, max_tokens, temperature — permanece inalterado.

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

Chamada de ferramenta

A chamada de ferramenta/função é repassada sem alterações. Use modelos que anunciam suporte a ferramentas (veja Modelos e roteamento; o 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)

Uma resposta que chama uma ferramenta sempre termina com finish_reason: "tool_calls" (stop_reason: "tool_use" em /v1/messages), com ou sem streaming, independentemente do provedor que a forneceu. Envie cada chamada de ferramenta de volta como a recebeu: algumas contêm um campo extra_content (assinatura de pensamento do Gemini) que o modelo precisa na próxima rodada.

Formato da resposta

Toda resposta tem os mesmos campos, independentemente do provedor que a serviu: os campos de conclusão de chat da OpenAI (id, object, created, model, choices, usage) e o nosso usage.cost_usd. Campos que um provedor adiciona por conta própria (x_groq, service_tier, system_fingerprint, usage.queue_time e similares) são removidos.

Modelos de raciocínio enviam seu raciocínio tanto em reasoning quanto em reasoning_content, com o mesmo texto, em message (ou delta durante o streaming), para que um cliente que leia qualquer um deles o obtenha. Quando um provedor envia reasoning_details no estilo OpenRouter, eles passam inalterados. Uma resposta sem raciocínio não tem nenhum dos dois campos.

Campos de requisição que um provedor recusa, mas que apenas ajustam a resposta (reasoning, thinking, verbosity, top_k e similares), são descartados para aquele provedor, e reasoning: {"effort": "low"} é enviado como reasoning_effort quando isso é o que é preciso. Conteúdo de mensagem enviado como uma lista de partes de texto vai como uma única string para um provedor que aceita apenas strings. Uma imagem, áudio ou arquivo enviado para um modelo que lê apenas texto é recusado com um 400 simples que diz isso: verifique input_modalities em GET /v1/models primeiro.

Listando modelos

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

Retorna o formato de lista da OpenAI ({"object":"list","data":[{"id": "...", ...}]}) com os modelos de chat que você pode chamar agora; ?type=all adiciona modelos de imagem, vídeo, música e fala. Cada modelo de chat inclui context_length, max_output_tokens, input_modalities, supports_tools, supports_reasoning, supports_vision e supported_parameters (veja Modelos e roteamento). O catálogo público (sem autenticação) também está em GET /api/v1/public/models com precificação por endpoint.

Uso de streaming

Para requisições de streaming, o UberLLM solicita automaticamente o uso de tokens (stream_options.include_usage), assim, o chunk final contém um objeto usage com cost_usd, o valor pelo qual a chamada é faturada em dólares americanos. Uma resposta que não é de streaming também tem usage.cost_usd e o cabeçalho X-UberLLM-Cost-USD (exceto uma lenta que já começou com espaços de keepalive: então apenas o campo body). Sua fatura é o custo que o marketplace reporta para aquela chamada. A resposta não espera por esse relatório: quando ele ainda não chegou, cost_usd é nossa estimativa, e seu saldo e Dashboard → Activity mostram o valor exato um momento depois. Se o uso estiver faltando, o UberLLM recorre a uma estimativa do tokenizador — tais linhas são sinalizadas em Dashboard → Activity.

API de Respostas

client.responses.create e client.responses.stream também funcionam, em todos os modelos de chat: texto, chamadas de ferramentas (function_call → function_call_output), saída estruturada e streaming. UberLLM não armazena nada, então envie a conversa inteira em input a cada chamada em vez de previous_response_id. Detalhes: API de Respostas.

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

  • O /v1 final é obrigatório na base URL.
  • Cada requisição é enviada a um provedor terceirizado disponível para o modelo e é cobrada pelo que o provedor cobrou, sem taxa da UberLLM. Veja Preços.
  • Para retentativas automáticas e as opções de routing que a UberLLM aceita, veja Modelos e routing.