Guide
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.
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."}]}'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")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 sempreusage, con o senzainclude_usage. - Responses finisce con
response.completed(oresponse.incompleteal limite di output). Messages finisce conmessage_deltaemessage_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.failedo un eventoerror.