feat(share-ai): cap per-request output with maxOutputTokens (RT-6.1) #60

Closed
opened 2026-06-21 01:56:54 +03:00 by Ghost · 0 comments

Источник: red-team-аудит, RT-6.1 (docs/red-team-report.md).
Модель угроз: анонимный share-ассистент выставлен наружу; цель — не дать сжечь токены владельца.

Что происходит

В apps/server/src/core/ai-chat/public-share-chat.service.ts:200 вызов streamText имеет stopWhen: stepCountIs(5), но не задан maxOutputTokens. Значит один принятый анонимный запрос может выжать максимум платного вывода модели — стоимость одного запроса ничем не ограничена.

Фикс

// public-share-chat.service.ts — bound per-request output so one anonymous
// request cannot run up the provider bill. Worst case = steps × this.
result = streamText({
  model, system, messages: modelMessages, tools,
  stopWhen: stepCountIs(5),
  maxOutputTokens: 512, // env-tunable, e.g. SHARE_AI_MAX_OUTPUT_TOKENS
  abortSignal: signal,
  // ...
});

Опционально вынести в env SHARE_AI_MAX_OUTPUT_TOKENS (дефолт 512–1024) по образцу resolveShareAiWorkspaceMax().

Цена / приоритет

1 строка, нулевой риск. Главный фикс от слива токенов — делает стоимость запроса предсказуемой независимо от обхода throttle.

**Источник:** red-team-аудит, RT-6.1 (`docs/red-team-report.md`). **Модель угроз:** анонимный share-ассистент выставлен наружу; цель — не дать сжечь токены владельца. ### Что происходит В `apps/server/src/core/ai-chat/public-share-chat.service.ts:200` вызов `streamText` имеет `stopWhen: stepCountIs(5)`, но **не задан `maxOutputTokens`**. Значит один принятый анонимный запрос может выжать максимум платного вывода модели — стоимость одного запроса ничем не ограничена. ### Фикс ```ts // public-share-chat.service.ts — bound per-request output so one anonymous // request cannot run up the provider bill. Worst case = steps × this. result = streamText({ model, system, messages: modelMessages, tools, stopWhen: stepCountIs(5), maxOutputTokens: 512, // env-tunable, e.g. SHARE_AI_MAX_OUTPUT_TOKENS abortSignal: signal, // ... }); ``` Опционально вынести в env `SHARE_AI_MAX_OUTPUT_TOKENS` (дефолт 512–1024) по образцу `resolveShareAiWorkspaceMax()`. ### Цена / приоритет 1 строка, нулевой риск. **Главный фикс от слива токенов** — делает стоимость запроса предсказуемой независимо от обхода throttle.
Ghost added the enhancementsecurity labels 2026-06-21 02:27:21 +03:00
Ghost closed this issue 2026-06-21 14:10:28 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#60