Потоковые ответы
Получайте ответы в реальном времени по мере генерации токенов.
Включение потоковой передачи
Добавьте stream: true в запрос для включения потоковых ответов:
{
"model": "qwen/qwen3-235b-a22b-instruct-2507-fp8",
"messages": [{ "role": "user", "content": "Hello!" }],
"stream": true
}Нужны полные параметры запроса? Смотрите эндпоинт chat completions в справочнике API.
Схема потокового ответа
Потоковые ответы приходят как SSE-чанки, которые нужно обрабатывать по мере получения.
Изучите схему потокового ответа в справочнике API для полного списка полей и сигнала [DONE].
Примеры кода
Примеры потоковой передачи для разных окружений:
from openai import OpenAI
client = OpenAI(
base_url="https://api.gonkagate.com/v1",
api_key="gp-your-api-key"
)
stream = client.chat.completions.create(
model="qwen/qwen3-235b-a22b-instruct-2507-fp8",
messages=[{"role": "user", "content": "Write a poem"}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
# Final chunk contains usage info
if chunk.usage:
print(f"\n\nCost: ${chunk.usage.total_cost_usd:.6f}")Отслеживание стоимости в потоке
Последний чанк включает полную информацию об использовании и стоимости:
Проверяйте последний чанк — Использование с total_cost_usd доступно только в последнем чанке перед [DONE].
Поля usage описаны в схеме потокового ответа в справочнике API.
// Track costs from streaming response
let totalCost = 0;
for await (const chunk of stream) {
// ... handle content ...
if (chunk.usage) {
totalCost = chunk.usage.total_cost_usd;
console.log(`Request cost: $${totalCost.toFixed(6)}`);
console.log(`Breakdown: base $${chunk.usage.base_cost_usd.toFixed(6)} + fee $${chunk.usage.platform_fee_usd.toFixed(6)}`);
}
}Обработка ошибок в потоке
Корректно обрабатывайте проблемы соединения при потоковой передаче:
Для деталей по статусам смотрите примеры обработки ошибок в справочнике API.
async function streamWithErrorHandling(messages: Message[]) {
try {
const stream = await client.chat.completions.create({
model: "qwen/qwen3-235b-a22b-instruct-2507-fp8",
messages,
stream: true,
});
for await (const chunk of stream) {
// Process chunk...
}
} catch (error) {
if (error.code === "ECONNRESET" || error.code === "ETIMEDOUT") {
// Connection was dropped
console.error("Connection lost. Consider retrying.");
} else if (error.status === 402) {
// Insufficient balance
showDepositModal();
} else {
throw error;
}
}
}