Chat
Conclusões de chat
A API Chat Completions da OpenAI, para todos os modelos de texto: a mesma requisição e resposta, o mesmo streaming, os mesmos SDKs.
/v1/chat/completionsRequisição
modelstringobrigatório- Um ID de modelo da página de modelos, como
claude-opus-5-5ougpt-6-sol. messagesarrayobrigatório- A conversa: mensagens
system(oudeveloper),user,assistantetool.contenté uma string ou um array de partes para adicionar imagens, PDFs, áudio ou vídeo. streamboolean- Envia a resposta como eventos enviados pelo servidor enquanto ela é gerada. Veja Streaming abaixo.
stream_optionsobject{ "include_usage": true }adiciona um bloco final com o uso de tokens.max_completion_tokensinteger- O máximo de tokens a gerar, incluindo o raciocínio.
max_tokenstambém funciona. temperaturenumber- 0 a 2. Valores menores geram respostas mais focadas; maiores, mais variadas. Alguns modelos de raciocínio ignoram esse parâmetro. Claude a partir de Opus 4.7 (Opus 5 e 5.5, Fable 5 e 5.1, Sonnet 5.5, Haiku 5.5) não aceita esse parâmetro, então o omitimos nesses modelos.
top_pnumber- Amostragem por núcleo, de 0 a 1. Altere este parâmetro ou temperature, não os dois. Omitido nos mesmos modelos Claude, assim como top_k nesses modelos e no Muse Wonder.
stopstring | array- Até 4 sequências que interrompem a geração.
toolsarray- Funções que o modelo pode chamar. Veja Chamada de ferramentas abaixo.
tool_choicestring | objectauto,none,requiredou uma função específica. Quando o laboratório de um modelo rejeita ou ignora uma dessas opções (uma ferramenta forçada no Claude Opus 5.5, Sonnet 5.5 e Fable 5.1; qualquer opção excetoautono Muse Wonder;noneem alguns modelos Gemini, DeepSeek Flash, MiMo, HY4 e MiniMax), enviamos a opção em um formato que o modelo respeita e informamos ao modelo o que você pediu; uma função forçada pelo nome é enviada como a única disponível.response_formatobject- Saída em JSON:
{ "type": "json_object" }oujson_schemacom um esquema. Veja Saída estruturada abaixo. reasoning_effortstring- O esforço de raciocínio do modelo:
none,minimal,low,medium,high,xhighoumax. Cada modelo aceita alguns desses níveis (veja Raciocínio abaixo); se você escolher outro nível, será usado o nível aceito mais próximo. Níveis mais altos raciocinam por mais tempo e consomem mais tokens de saída. seedinteger- Reprodutibilidade na medida do possível, para os modelos que oferecem suporte.
modelsarray- Roteamento inteligente para esta requisição: alternativas a tentar, em ordem, se o modelo estiver indisponível. Veja Roteamento inteligente.
user e metadata, que ficam conosco. Quais deles o modelo respeita (ferramentas, esquemas JSON, raciocínio) depende do modelo, assim como acontece no próprio laboratório. Com o SDK Python da OpenAI, envie models como extra_body={"models": [...]}.Resposta
{ "id": "chatcmpl-AbC123...", "object": "chat.completion", "created": 1790870400, "model": "claude-opus-5-5", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "Here's the summary..." }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 1204, "completion_tokens": 312, "total_tokens": 1516, "prompt_tokens_details": { "cached_tokens": 1024 }, "completion_tokens_details": { "reasoning_tokens": 128 } }}modelé o modelo que respondeu. É o que você pediu, a menos que o roteamento inteligente tenha usado uma alternativa.- Modelos de raciocínio podem adicionar
reasoning_contentà mensagem: o raciocínio do modelo, quando ele o compartilha. usageé o que você paga.cached_tokenssão tokens de entrada lidos do cache de prompts do modelo, cobrados pelo preço de cache quando o modelo tem um.
Toda resposta também tem estes cabeçalhos:
Streaming
Com stream: true, a resposta chega como eventos enviados pelo servidor (SSE) no formato de chunks da OpenAI, terminando com data: [DONE]. Todo SDK lê esses eventos para você.
import osfrom openai import OpenAIclient = OpenAI( base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"],)stream = client.chat.completions.create( model="claude-sonnet-5-5", messages=[ { "role": "user", "content": "Write a limerick about databases." } ], stream=True, stream_options={ "include_usage": True },)for chunk in stream: if chunk.choices and chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="", flush=True)- Nenhuma resposta é enviada até o modelo produzir o primeiro token, então uma nova tentativa ou a troca para outra rota fica invisível para você.
- Períodos sem dados (enquanto o modelo pensa entre etapas) são preenchidos com linhas de comentário SSE (
: keep-alive) a cada 15 segundos. Os clientes as ignoram; elas impedem que proxies fechem a conexão. Se o primeiro token demorar mais de 20 segundos (um prompt longo ou uma rota que travou e está sendo substituída), o stream é aberto nesse momento: os cabeçalhos e comentários de keep-alive chegam enquanto você espera. Cada rota tem até 3 minutos para começar (5 com esforço de raciocínio alto) antes de tentar a próxima, então configure o timeout do seu cliente para 10 minutos. - Um stream aberto antes do primeiro token só inclui
x-zurelay-modelquando nenhum outro modelo pode responder (roteamento inteligente desativado), e um erro após a abertura chega como um evento de erro no stream (com a mesma estrutura do corpo de erro), em vez de um status de erro. - Com
include_usage, o último chunk antes de[DONE]tem uma listachoicesvazia e ousage.
Chamada de ferramentas
Descreva funções em tools; quando o modelo quiser usar uma, ele responde com tool_calls em vez de texto. Execute a função, envie o resultado de volta como uma mensagem tool com o ID da chamada, e o modelo continua.
import osfrom openai import OpenAIclient = OpenAI( base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"],)response = client.chat.completions.create( model="gpt-6-sol", messages=[ { "role": "user", "content": "What's the weather in Lisbon right now?" } ], tools=[ { "type": "function", "function": { "name": "get_weather", "description": "Current weather for a city", "parameters": { "type": "object", "properties": { "city": { "type": "string" } }, "required": [ "city" ] } } } ],)print(response.choices[0].message.content)Saída estruturada
Peça JSON com response_format. Um json_schema faz com que os modelos compatíveis sigam seu esquema; json_object pede qualquer JSON válido (diga isso no seu prompt também).
import osfrom openai import OpenAIclient = OpenAI( base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"],)response = client.chat.completions.create( model="gpt-6.1-sol", messages=[ { "role": "user", "content": "Extract the people: 'Ana met Ben and Chloe in Porto.'" } ], response_format={ "type": "json_schema", "json_schema": { "name": "people", "schema": { "type": "object", "properties": { "names": { "type": "array", "items": { "type": "string" } } }, "required": [ "names" ] } } },)print(response.choices[0].message.content)Raciocínio
Modelos de raciocínio pensam antes de responder. Defina reasoning_effort para equilibrar velocidade e custo com profundidade: um nível mais alto pensa por mais tempo, demora mais e usa mais tokens de saída. Cada modelo aceita os níveis documentados pelo seu laboratório, de none (sem raciocínio), passando por minimal, low, medium, high e xhigh (extra alto), até max; a tabela abaixo lista esses níveis. Se você omitir esse parâmetro, o modelo usa o padrão. Funciona da mesma forma com qualquer SDK da OpenAI, e você pode testar cada nível no Playground do painel.
from openai import OpenAIclient = OpenAI(base_url="https://api.zurelay.com/v1", api_key="YOUR_ZURELAY_KEY")response = client.chat.completions.create( model="zurelay-auto", reasoning_effort="high", messages=[{"role": "user", "content": "How many primes are there below 1,000?"}],)message = response.choices[0].messageprint(getattr(message, "reasoning_content", None)) # the thinking, when the model shares itprint(message.content)O raciocínio vem junto com a resposta em message.reasoning_content (em streaming, em delta.reasoning_content) nos modelos que o compartilham; alguns chamam o campo de reasoning. Ele é cobrado como tokens de saída e sempre faz parte de completion_tokens; completion_tokens_details.reasoning_tokens o contabiliza separadamente quando o modelo informa esse dado. Com esforço alto, uma resposta pode levar minutos para começar, então configure um timeout generoso no seu cliente (veja Confiabilidade e timeouts).
Níveis de cada modelo
Com base na documentação de cada laboratório. Um nível que o modelo não aceita é executado no nível aceito mais próximo (entre dois igualmente próximos, o menor; e o raciocínio só é desativado quando você envia none), então a mesma requisição funciona em qualquer modelo, inclusive com roteamento inteligente. O cabeçalho de resposta x-zurelay-reasoning-effort informa qual nível foi usado. Uma palavra que não corresponde a um nível é rejeitada com um 400 que lista os níveis do modelo.
Raciocínio do Claude
Por este endpoint, Claude aceita reasoning_effort como qualquer outro modelo: low, medium, high, xhigh ou max (Opus 4.6 não tem xhigh). No formato da própria Anthropic, Claude raciocina de forma adaptativa em um nível: envie thinking: { type: "adaptive", display: "summarized" } com output_config: { effort: "xhigh" } e leia os blocos de raciocínio. Veja Anthropic Messages.
Tem dúvidas ou falta algo? Fale com nossa equipe de suporte e responderemos por e-mail, geralmente em até um minuto.