Intermediário

Integrar IA via API: um guia prático

Uma API, 367 modelos. Compatível com OpenAI — mude a base URL, mantenha seu código. Aqui está tudo o que você precisa para ir do zero a uma integração de IA funcionando em menos de uma hora.
Sarah Chen March 2026 10 min read

Você tem um app. Quer que ele fale com IA. Talvez queira chat completions, talvez geração de imagem, talvez os dois. A boa notícia: se você já usou a API da OpenAI, já sabe usar a nossa. A melhor notícia: você tem acesso a 367 modelos de 61 provedores por um único endpoint.

Sem SDK novo para aprender. Sem protocolo proprietário. Só mude a base URL e sua chave de API.

Passo 1: obtenha sua chave de API

Cadastre-se em zubnet.com e navegue até as configurações do seu workspace. Sua chave de API vive lá. Começa com um prefixo reconhecível:

zub_live_a1b2c3d4e5f6...

Mantenha em segredo. Trate como uma senha. Se vazar, rotacione imediatamente nas configurações do workspace — a chave antiga para de funcionar no momento em que você gera uma nova.

Passo 2: defina sua base URL

Toda requisição vai para:

https://api.zubnet.ai/v1

É isso. O prefixo /v1 combina com a convenção da OpenAI, então qualquer biblioteca, ferramenta ou framework que suporte OpenAI vai funcionar só trocando a URL.

Passo 3: faça sua primeira requisição

Usando curl

O teste mais simples possível — um chat completion com uma mensagem:

curl https://api.zubnet.ai/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer zub_live_YOUR_KEY" \
  -d '{
    "model": "claude-sonnet-4-20250514",
    "messages": [
      {"role": "user", "content": "What is the capital of France?"}
    ]
  }'

Você vai receber uma resposta JSON com a resposta do modelo em choices[0].message.content. Exatamente o mesmo formato da resposta da OpenAI.

Usando Python com o SDK da OpenAI

Instale o SDK se ainda não tiver:

pip install openai

Depois use com nossa base URL:

from openai import OpenAI

client = OpenAI(
    api_key="zub_live_YOUR_KEY",
    base_url="https://api.zubnet.ai/v1"
)

response = client.chat.completions.create(
    model="claude-sonnet-4-20250514",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Explain quantum computing in three sentences."}
    ],
    max_tokens=500,
    temperature=0.7
)

print(response.choices[0].message.content)

Esse é um exemplo completo e funcional. Copie, cole, substitua a chave de API, rode.

O parâmetro modelo

O campo model é onde fica interessante. Em vez de ficar preso a um provedor, você escolhe entre 367 modelos por 61 provedores. Alguns exemplos:

IDs de modelos populares:

claude-sonnet-4-20250514Anthropic Claude Sonnet 4
gpt-4.1OpenAI GPT-4.1
gemini-2.5-pro-preview-05-06 — Google Gemini 2.5 Pro
deepseek-r1 — modelo de raciocínio DeepSeek R1
flux-1.1-proBlack Forest Labs FLUX para imagens
kling-v2.5-master — geração de vídeo Kling

A lista completa está na nossa página de modelos, filtrável por tipo (LLM, imagem, vídeo, áudio, 3D, código) e provedor. O ID de modelo que você vê lá é exatamente o que vai no campo model.

Geração de imagens

Modelos de imagem usam o mesmo padrão de endpoint. Aqui está FLUX via Python:

response = client.images.generate(
    model="flux-1.1-pro",
    prompt="A serene Japanese garden at dawn, soft morning light",
    n=1,
    size="1024x1024"
)

image_url = response.data[0].url
print(image_url)

A resposta inclui uma URL para a imagem gerada hospedada no nosso CDN. Baixe, exiba, embede — a URL é válida por 24 horas.

Respostas em streaming

Para modelos de chat, o streaming envia tokens à medida que são gerados em vez de esperar pela resposta completa. Isso é essencial para qualquer interface de chat de usuário — ninguém quer olhar uma tela em branco por 10 segundos.

stream = client.chat.completions.create(
    model="claude-sonnet-4-20250514",
    messages=[
        {"role": "user", "content": "Write a short poem about code."}
    ],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Por baixo do capô, isso usa Server-Sent Events (SSE). Cada chunk chega como uma linha data: na resposta HTTP. O SDK da OpenAI lida com o parsing pra você, mas se você usar HTTP cru, vai ver linhas como:

data: {"choices":[{"delta":{"content":"Once"},"index":0}]}
data: {"choices":[{"delta":{"content":" upon"},"index":0}]}
data: {"choices":[{"delta":{"content":" a"},"index":0}]}
...
data: [DONE]

O fluxo termina com data: [DONE]. Parseie cada linha, extraia delta.content, adicione ao buffer de saída. Esse é o protocolo inteiro.

Tratamento de erros

A API usa códigos de status HTTP padrão. Aqui estão os que você vai realmente encontrar:

400 Bad Request — seu corpo de requisição está malformado. Verifique a estrutura JSON, certifique-se que messages é um array, certifique-se que model é um ID de modelo válido.

401 Unauthorized — sua chave de API está faltando, inválida ou expirada. Verifique o header Authorization: Bearer.

403 Forbidden — sua conta não tem acesso a esse modelo ou recurso. Verifique o nível de assinatura do seu workspace.

429 Too Many Requests — você bateu no limite de taxa. A resposta inclui um header Retry-After dizendo quantos segundos esperar. Implemente backoff exponencial:

import time
from openai import RateLimitError

max_retries = 3
for attempt in range(max_retries):
    try:
        response = client.chat.completions.create(
            model="claude-sonnet-4-20250514",
            messages=[{"role": "user", "content": "Hello"}]
        )
        break
    except RateLimitError:
        wait = 2 ** attempt
        print(f"Rate limited. Waiting {wait}s...")
        time.sleep(wait)

500 / 502 / 503 — problemas do lado do servidor. São raros mas acontecem. Retente com backoff. Se persistir, verifique nossa página de status Pulse.

Detalhes de autenticação

Toda requisição precisa de um header Authorization:

Authorization: Bearer zub_live_YOUR_KEY

A chave é escopada para seu workspace. Todos os membros do time no mesmo workspace compartilham a mesma chave e pool de uso. Se você precisa de rastreamento separado por membro do time, crie workspaces separados.

Melhores práticas de segurança:

• Nunca deixe chaves hardcoded em código-fonte — use variáveis de ambiente
• Nunca faça commit de chaves no git — use arquivos .env no .gitignore
• Rotacione chaves regularmente a partir das configurações do workspace
• Use chaves separadas para desenvolvimento e produção

Limites de taxa

Limites de taxa dependem do seu nível de plano. Os padrões são generosos para a maioria dos casos de uso:

Requisições por minuto: varia por plano (60-600 RPM)
Tokens por minuto: varia por modelo e plano
Requisições concorrentes: sem limite rígido, mas 429s vão disparar se você fizer burst muito agressivo

Headers de limite de taxa são incluídos em cada resposta:

x-ratelimit-limit-requests: 120
x-ratelimit-remaining-requests: 119
x-ratelimit-reset-requests: 0.5s

Leia esses headers. Construa seu cliente para respeitá-los. Seus usuários vão agradecer quando as requisições deles não falharem aleatoriamente.

Juntando tudo

Aqui está uma função Python pronta para produção que lida com erros, retries e streaming:

import os
from openai import OpenAI, APIError, RateLimitError
import time

client = OpenAI(
    api_key=os.environ["ZUBNET_API_KEY"],
    base_url="https://api.zubnet.ai/v1"
)

def ask(prompt, model="claude-sonnet-4-20250514", stream=False):
    for attempt in range(3):
        try:
            response = client.chat.completions.create(
                model=model,
                messages=[{"role": "user", "content": prompt}],
                stream=stream
            )
            if stream:
                return response  # iterate over chunks
            return response.choices[0].message.content
        except RateLimitError:
            time.sleep(2 ** attempt)
        except APIError as e:
            if attempt == 2:
                raise
            time.sleep(1)

# Usage
print(ask("Summarize the latest in quantum computing"))
print(ask("Same question, different model", model="gpt-4.1"))

Troque modelos trocando uma string. Sem refatoração de código, sem dependências novas, sem formato de resposta diferente. Esse é o ponto inteiro da compatibilidade com OpenAI.

A ideia-chave: A compatibilidade com OpenAI não é só conveniência. Significa que toda ferramenta no ecossistema — LangChain, LlamaIndex, AutoGen, Cursor, Continue, qualquer ferramenta que fala o protocolo OpenAI — funciona com o Zubnet out-of-the-box. Mude a base URL, plugue sua chave, e você tem 367 modelos em qualquer framework.

Todos os exemplos de código neste guia estão testados e funcionando em março de 2026. Copie, rode, construa em cima. É pra isso que eles servem.

Pronto para começar? Pegue sua chave de API em zubnet.com

Sarah Chen
Zubnet · March 2026
ESC