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.