Resposta rápida
Como faço streaming de um chat completion a partir de LLMwithCrypto?
Adicione "stream": true ao corpo de POST https://llmwithcrypto.com/api/v1/chat/completions. LLMwithCrypto então responde com server-sent events: cada linha data: contém um chat.completion.chunk com um trecho de texto em delta.content, e o stream termina com data: [DONE]. Adicione "stream_options": {"include_usage": true} para receber as contagens de tokens em um último chunk. Isso funciona em todos os modelos, conforme documentado em 23 de outubro de 2026.
Por que fazer streaming, afinal?
Para pessoas, porque as primeiras palavras aparecem em instantes, em vez de só depois que a resposta inteira é escrita. Uma resposta longa de um modelo grande pode levar muitos segundos para terminar; em streaming, o leitor começa a ler na hora.
Para programas importa menos: um script que precisa do texto completo não ganha nada com streaming e tem mais parsing para fazer. Faça streaming quando um humano estiver acompanhando e envie uma requisição normal caso contrário. O preço é o mesmo dos dois jeitos. Você paga por token a partir do seu saldo: tokens de entrada e de saída são contados pelo tokenizer do próprio modelo e cobrados ao preço daquele modelo por 1M de tokens. Uma chamada que termina em erro não custa nada.
curl -sN "https://llmwithcrypto.com/api/v1/chat/completions" \
-H "Authorization: Bearer $LLMWITHCRYPTO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"messages": [{"role": "user", "content": "Write a haiku about latency."}],
"stream": true,
"stream_options": {"include_usage": true},
"max_tokens": 120
}'
import os
from openai import OpenAI
client = OpenAI(
base_url="https://llmwithcrypto.com/api/v1",
api_key=os.environ["LLMWITHCRYPTO_API_KEY"],
)
stream = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{"role": "user", "content": "Write a haiku about latency."}],
stream=True,
stream_options={"include_usage": True},
max_tokens=120,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
if chunk.usage:
print("\n", chunk.usage.prompt_tokens, "in,", chunk.usage.completion_tokens, "out")
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://llmwithcrypto.com/api/v1',
apiKey: process.env.LLMWITHCRYPTO_API_KEY,
});
const stream = await client.chat.completions.create({
model: 'deepseek-v4.1-flash',
messages: [{ role: 'user', content: 'Write a haiku about latency.' }],
stream: true,
stream_options: { include_usage: true },
max_tokens: 120,
});
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content;
if (text) process.stdout.write(text);
if (chunk.usage) console.log(`\n${chunk.usage.prompt_tokens} in, ${chunk.usage.completion_tokens} out`);
}
Como o stream aparece na rede?
Cada evento é uma linha começando com data: , seguida de uma linha em branco. O primeiro chunk normalmente carrega o role, os seguintes alguns caracteres de content cada, e o chunk com um finish_reason fecha a resposta. Com include_usage, segue mais um chunk com um array choices vazio e o objeto usage. O stream sempre termina com data: [DONE]. Os ids e contagens abaixo são ilustrativos.
data: {"id":"chatcmpl-5a1e","object":"chat.completion.chunk","created":1792742400,"model":"deepseek-v4.1-flash","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-5a1e","object":"chat.completion.chunk","created":1792742400,"model":"deepseek-v4.1-flash","choices":[{"index":0,"delta":{"content":"Packets"},"finish_reason":null}]}
data: {"id":"chatcmpl-5a1e","object":"chat.completion.chunk","created":1792742400,"model":"deepseek-v4.1-flash","choices":[{"index":0,"delta":{"content":" cross the"},"finish_reason":null}]}
data: {"id":"chatcmpl-5a1e","object":"chat.completion.chunk","created":1792742400,"model":"deepseek-v4.1-flash","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: {"id":"chatcmpl-5a1e","object":"chat.completion.chunk","created":1792742400,"model":"deepseek-v4.1-flash","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":19,"total_tokens":33}}
data: [DONE]
E se o stream quebrar?
Um erro encontrado antes do primeiro token, como uma chave errada ou um saldo vazio, volta como um erro HTTP normal com um corpo JSON, não como um stream; a página de erros os lista. Um erro durante a geração encerra o stream antes do fim, sem um finish_reason.
Se você mesmo fechar a conexão, a geração para. Você então paga pela entrada e pelos tokens já gerados, como em qualquer chamada. Seu código deve tratar um stream que termina sem um finish_reason e sem [DONE] como incompleto, e enviar a requisição novamente se precisar da resposta completa.
Streaming: perguntas frequentes
Fazer streaming custa mais?
Não. Os mesmos tokens são cobrados pelo mesmo preço. Você paga por token a partir do seu saldo: tokens de entrada e de saída são contados pelo tokenizer do próprio modelo e cobrados ao preço daquele modelo por 1M de tokens. Uma chamada que termina em erro não custa nada.
Posso fazer streaming com tool calling?
Sim, nos modelos que suportam tools: o nome e os argumentos da função chegam em pedaços em delta.tool_calls e precisam ser juntados antes do uso. A página de tool calling mostra o loop sem streaming, que é mais simples para começar.
Por que não recebo uso em uma chamada com streaming?
Adicione "stream_options": {"include_usage": true}. Sem isso, um stream não traz contagem de tokens; o dashboard ainda as mostra.