Руководства
Стриминг
Получайте токены по мере генерации через server-sent events во всех форматах API.
Укажите stream: true. Ответ приходит как text/event-stream. События отправляются по одному, без буферизации.
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();Чего ожидать
- Chat completions и text completions заканчиваются на
data: [DONE]. Чанк перед ним всегда содержитusage, сinclude_usageили без. - Responses заканчивается на
response.completed(илиresponse.incompleteпри достижении лимита выхода). Messages заканчивается наmessage_deltaиmessage_stop. Ни тот ни другой не отправляют[DONE]. - Во время долгих пауз приходят keep-alive-комментарии (форматы OpenAI) или события
ping(Messages). - Если поток оборвался, вы платите только за токены, сгенерированные до обрыва.
- Ошибки, найденные до начала потока (ключ, кредиты, лимиты), возвращаются обычной JSON-ошибкой со своим HTTP-статусом. Сбой после начала потока приходит как событие ошибки в том же формате:
data: {"error": ...},response.failedили событиеerror.