Files
ermnvldmr.com/services/docs/content/ru/quetza/guides/conversational-ai.md
T
deytenit b3638f4d63 fix: cyrillic fonts, dev certs, page head, and ru-text typography (#67)
🤖 PR generated for branch `fix/cyrillic-fonts-dev-certs-and-page-head`.

### Changes Summary
- **Fonts**: Add Cyrillic glyph subsets for Lato, EB Garamond, and Fira
Code.
- **Dev**: Support remote Root CA and encrypted dev CA key in
`.env.dev`.
- **UI & Kits**: Add size variant to `Breadcrumbs` component and enlarge
`PageHead` breadcrumbs with tuned collapse scroll threshold.
- **ESLint**: Add `no-hanging-particles` i18n & markdown typography rule
with auto-fixer.
- **Content & i18n**: Apply `ru-text` editorial and typography polish
(em dashes, number ranges, «ё» restoration, non-breaking spaces) across
`services/www` and `services/docs`.
2026-10-25 15:21:09 +03:00

2.6 KiB

title, weight
title weight
Интеграция разговорного ИИ 4

Цель: подключить большие языковые модели (LLM), настроить управление контекстом и уложиться в тайм-ауты Discord.

1. Стратегия управления контекстом

Чтобы диалог оставался связным, модели нужна история сообщений:

  • Область видимости (Scoping): Map<GuildID, Map<UserID, Message[]>>
    • Ключ сервера (Guild Key): изолирует контекст и защищает от утечек данных между серверами.
    • Ключ пользователя (User Key): разделяет реплики разных участников в публичных каналах.
  • Жизненный цикл: настройте «скользящее окно» (например, последние 50 сообщений), чтобы контекст не разрастался.

2. Потоковая передача ответов

LLM генерируют ответ постепенно, а Discord ждёт реакции не дольше 3 секунд.

{{% steps %}}

Шаг 1: Отложенный ответ (Defer Interaction)

Сразу вызовите interaction.deferReply(). Это продлит время ожидания ответа до 15 минут.

Шаг 2: Запрос к LLM

Асинхронно отправьте запрос к ИИ-сервису.

Шаг 3: Отправка ответа

Когда ответ готов, вызовите interaction.editReply(content). {{% /steps %}}

3. Пример реализации

// commands/chat.ts
export async function execute(interaction, controller) {
  // 1. Отложить ответ
  await interaction.deferReply();

  // 2. Обработка
  const history = controller.getHistory(interaction.guildId, interaction.user.id);
  const response = await aiService.generate(interaction.options.getString('prompt'), history);

  // 3. Ответ
  await interaction.editReply(response);
  controller.updateHistory(interaction.guildId, interaction.user.id, response);
}

Warning

Расходы на API: Провайдеры ИИ обычно тарифицируют запросы по токенам. Настройте в контроллере строгие лимиты запросов (rate limits) для пользователей, чтобы избежать лишних расходов.