docs

Chat e streaming

Como chamar POST /chat/completions e POST /completions na Veloz AI, receber a resposta em streaming e lidar com respostas demoradas.

POST /chat/completions recebe uma lista de mensagens e devolve a resposta do modelo, no mesmo formato da OpenAI. Os exemplos usam o cliente configurado em Inferência de IA.

resposta = client.chat.completions.create(
    model="meta-llama-llama-3.1-8b-instruct",
    messages=[
        {"role": "system", "content": "Você responde em português, em no máximo duas frases."},
        {"role": "user", "content": "O que é um CNPJ?"},
    ],
    temperature=0.3,
    max_tokens=200,
)
 
print(resposta.choices[0].message.content)

A Veloz lê só model, models, stream e stream_options. Os outros campos (como temperature, max_tokens, top_p e stop) vão para o modelo do jeito que vieram, e cada modelo decide o que aceita.

O campo usage da resposta traz prompt_tokens (entrada) e completion_tokens (saída): é por eles que a requisição é cobrada. Em modelos de raciocínio, como o Qwen 3.8 27B e o Qwen 3.6 27B, os tokens de raciocínio contam como saída.

Streaming

Passe stream: true para receber a resposta aos poucos. O uso é contado automaticamente: a Veloz pede ao modelo a contagem de tokens de toda resposta em streaming, então você não precisa enviar stream_options. O último evento do stream chega com choices vazio e o campo usage preenchido; trate esse caso no seu loop.

const stream = await client.chat.completions.create({
  model: "meta-llama-llama-3.1-8b-instruct",
  messages: [{ role: "user", content: "Escreva um haicai sobre São Paulo." }],
  stream: true,
});
 
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
 
  if (chunk.usage) console.log("\n", chunk.usage);
}
stream = client.chat.completions.create(
    model="meta-llama-llama-3.1-8b-instruct",
    messages=[{"role": "user", "content": "Escreva um haicai sobre São Paulo."}],
    stream=True,
)
 
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")
 
    if chunk.usage:
        print("\n", chunk.usage)

Pelo curl, o stream chega como eventos data: (server-sent events) e termina com data: [DONE]:

curl -N https://platform.onveloz.com/api/ai/v1/chat/completions \
  -H "Authorization: Bearer $VELOZ_AI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "meta-llama-llama-3.1-8b-instruct",
    "messages": [{ "role": "user", "content": "Conte até cinco." }],
    "stream": true
  }'

Respostas demoradas

Uma resposta sem streaming que leva mais de 60 segundos chega com status 200 e começa com espaços em branco, enviados a cada 15 segundos para manter a conexão aberta até o modelo terminar. Os SDKs da OpenAI e os leitores de JSON ignoram esses espaços. Se o modelo falhar depois disso, o corpo traz o campo error no formato da OpenAI, ainda com status 200. Para respostas longas, prefira stream: true: o texto chega conforme é gerado.

Prompt cru

POST /completions usa os mesmos modelos de chat, mas recebe um texto em prompt em vez de mensagens. Use quando você monta o prompt inteiro por conta própria:

curl https://platform.onveloz.com/api/ai/v1/completions \
  -H "Authorization: Bearer $VELOZ_AI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "meta-llama-llama-3.1-8b-instruct",
    "prompt": "A capital do Brasil é",
    "max_tokens": 20
  }'

A resposta traz o texto em choices[0].text. Os modelos dos provedores próprios não atendem esta rota; para eles, use /chat/completions.

Modelos dos seus provedores

Com um provedor cadastrado, o mesmo código chama, por exemplo, openai/gpt-4.1-mini ou anthropic/claude-haiku-4-5. Veja Provedores próprios. Para ter um modelo de reserva quando o primeiro falhar, veja Roteamento com reserva.