# Streaming

> Ricevi i token mentre vengono generati con i server-sent events, in tutti i formati dell'API.


Imposta `stream: true`. La risposta è `text/event-stream`. Gli eventi arrivano uno alla volta, senza buffer.

```bash test
curl -N https://api.notholy.com/v1/chat/completions \
  -H "Authorization: Bearer $NOTHOLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "notholy-specter", "stream": true, "stream_options": {"include_usage": true}, "messages": [{"role": "user", "content": "Define XSS."}]}'
```

```python test
import os
from openai import OpenAI

client = OpenAI(base_url="https://api.notholy.com/v1", api_key=os.environ["NOTHOLY_API_KEY"])

stream = client.chat.completions.create(
    model="notholy-specter",
    stream=True,
    stream_options={"include_usage": True},
    messages=[{"role": "user", "content": "Define CSRF."}],
)
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.total_tokens, "tokens")
```

```js test
import OpenAI from 'openai';

const client = new OpenAI({ baseURL: 'https://api.notholy.com/v1', apiKey: process.env.NOTHOLY_API_KEY });

const stream = await client.chat.completions.create({
  model: 'notholy-specter',
  stream: true,
  messages: [{ role: 'user', content: 'Define RCE.' }],
});
for await (const chunk of stream) process.stdout.write(chunk.choices[0]?.delta?.content ?? '');
console.log();
```

## Cosa aspettarti

- Chat completions e completamenti di testo finiscono con `data: [DONE]`. Il chunk precedente contiene sempre `usage`, con o senza `include_usage`.
- Responses finisce con `response.completed` (o `response.incomplete` al limite di output). Messages finisce con `message_delta` e `message_stop`. Nessuno dei due invia `[DONE]`.
- Durante le pause lunghe arrivano commenti keep-alive (formati OpenAI) o eventi `ping` (Messages).
- Se lo stream si interrompe, paghi solo i token generati prima dell'interruzione.
- Gli errori trovati prima che lo stream parta (chiave, crediti, limiti) tornano come normale errore JSON con il suo stato HTTP. Un guasto dopo la partenza dello stream arriva come evento di errore nello stesso formato: `data: {"error": ...}`, `response.failed` o un evento `error`.

## Prossimi passi

- [Errori](/it/guides/errors)
