Pular para o conteúdo principal

Guia de integração

Fique com o seu cliente. Troque a URL base e o valor model.

Os modelos de texto aqui falam os protocolos que o seu SDK já fala: Chat Completions, o subconjunto sem estado de Responses, Anthropic Messages e Google generateContent. O interessante é o que acontece com um parâmetro que o modelo de destino nunca declarou.

O desafio

Camadas de compatibilidade costumam mentir por omissão

A falha clássica não é um 500. É um parâmetro que o seu gateway aceitou, descartou e nunca mencionou: o modelo rodou sem a sua temperature, sem as definições de ferramentas ou sem o formato de resposta, e a saída pareceu só decepcionante em vez de quebrada.

01

Parâmetro não declarado é recusado, não descartado

messages, tools, tool_choice, response_format, max_tokens, temperature e top_p mapeiam para os campos declarados do modelo. O resto é repassado ao esquema do modelo e devolve 400 quando ele não declara. Silêncio nunca é resposta.

02

O formato do erro segue o protocolo chamado

Em /v1 o corpo é um objeto de erro do OpenAI ou da Anthropic, não o envelope {code, msg, data, request_id} de /api/v1. Se o seu produto mistura as duas superfícies, trate as duas formas.

03

Transmissão e liquidação são assuntos distintos

stream: true devolve eventos chat.completion.chunk encerrados por data: [DONE]. A cobrança continua seguindo o uso medido, então um fluxo interrompido não é uma requisição grátis.

A abordagem

Troque o endpoint e rode suas avaliações de novo

Mude base_url e api_key, troque a string de modelo por um valor de GET /v1/models e rode a bateria de testes que você já tem. Se um parâmetro devolver 400, o modelo escolhido nunca o suportou — informação que a versão silenciosa nunca dava.

Qualquer cliente compatível com OpenAI serve. Mudam só a URL base e o valor model.

POST /v1/chat/completions

from openai import OpenAI

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

stream = client.chat.completions.create(
    model="<publisher>/<model>/chat",          # exact value from GET /v1/models
    messages=[{"role": "user", "content": "Summarise these notes in three bullets."}],
    temperature=0.7,
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

text/event-stream

data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"- "}}]}
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"Ships"}}]}
data: [DONE]

Contrato

O que vale fixar logo de início

API LLM compatível com OpenAI: troque a URL base — O que vale fixar logo de início
Campo ou cabeçalhoValor ou limite
POST /v1/chat/completionschat.completion · SSE with stream: true
GET /v1/modelsevery callable model value
Authorization: Bearer · x-api-key · x-goog-api-keyaccepted on /v1
undeclared parameter400 · never silently dropped

Deslize horizontalmente para ver todas as colunas.

Integração

Da primeira chamada até produção

  1. 01Crie uma chave e peça GET /v1/models para os identificadores chamáveis neste momento.
  2. 02Aponte o cliente para a URL base e mande uma requisição sem transmissão: volta um objeto chat.completion padrão.
  3. 03Ligue a transmissão e confirme que o seu leitor trata chat.completion.chunk e o marcador [DONE].
  4. 04Acompanhe o uso por chave no console e defina um teto diário antes de mandar tráfego de produção.

Adequação

Quando este caminho é o certo

Escolha se

  • Você já tem código cliente OpenAI, Anthropic ou Google funcionando e só quer trocar o modelo atrás dele.
  • Você quer imagem, vídeo e texto com uma chave, um saldo e um mesmo conjunto de tetos de gasto.

Procure outro caminho se

  • Você depende de threads ou assistentes com estado no servidor. Aqui há o subconjunto sem estado de Responses.
  • Você precisa de saída em mídia. Isso vai por createTask, ou pela projeção de Videos para clientes que já falam essa forma.

Evidências

O que você mesmo pode verificar

Quatro superfícies de protocolo, uma chave

/v1/chat/completions, /v1/responses, /v1/messages e /v1beta/models/{model}:generateContent autenticam com a mesma chave. Authorization: Bearer, x-api-key e x-goog-api-key são aceitos onde o SDK os espera.

A lista de modelos é o contrato

GET /v1/models devolve exatamente os identificadores que toda operação /v1 e /api/v1 aceita, com o criador em owned_by. Os preços vêm de /api/v1/models, específico da conta e portanto privado.

Validação, limites e reservas são compartilhados

A camada de compatibilidade usa a mesma autenticação, os mesmos limites de taxa, a mesma validação, o mesmo cálculo de preço e a mesma reserva da superfície nativa. Só o envelope muda.

Antes de lançar

Comportamentos da plataforma a confirmar

  • Mantenha a chave no servidor; credencial na query string nunca é aceita.
  • Registre em cada chamada o id de resposta do próprio protocolo, para que dúvidas tenham uma alça.
  • Decida antes do lançamento como um 400 por parâmetro não suportado chega aos seus usuários.
  • Defina tetos diário, mensal e acumulado por chave em vez de confiar só no saldo.

Perguntas frequentes

O que mais perguntam nesta página

Qualquer cliente que permita definir URL base e string de modelo. Clientes no formato OpenAI usam /v1/chat/completions e /v1/responses, clientes Anthropic usam /v1/messages e clientes Google GenAI usam os caminhos generateContent.

A seguir

Apontar um cliente para um modelo de texto

Aponte um cliente OpenAI, Anthropic ou Google para a SpicyAPI. O que passa direto, o que é recusado de propósito e como o texto é cobrado.

Guias relacionados