Формат ответа (SSE)

Ответ - поток text/event-stream. Каждая строка выглядит как data: {json}\n\n. Типы событий:

typeПоляКогда
sourcessources: string[]Приходит первым: идентификаторы найденных фрагментов базы, по которым бот отвечает.
tokentext: stringКусок ответа. Приходит много раз - склеивайте text.
donebalance, model, charged, conversation, tokens_in, tokens_out, tokensОтвет завершён. charged - сколько рублей списано, conversation - идентификатор сессии.
errorerror: stringОшибка, см. Ошибки.
Цена ответа приходит в событии done полем charged. Считать её самостоятельно по числу токенов не нужно и не стоит: она сохраняется вместе с ответом, и посчитанная задним числом покажет не то, что было списано.