# Документация по LLMClient

### Как работает

**LLMClient** реализует ключевой паттерн **Metabot Agent System (MAS)** — фреймворк для построения мультиагентных систем через композицию простых, понятных блоков кода.

MAS следует принципу **"сложное через простое"**:

- **Декларативность**: Сложные AI-операции описываются простыми, читаемыми выражениями
- **Модульность**: Каждый flow — независимая единица работы с собственным контекстом
- **Прозрачность**: Вся логика работы агента видна в коде скрипта/плагина
- **Композиция**: Сложные мультиагентные сценарии собираются из простых блоков

---

## Методы класса LLMClient

### new LLMClient(sessionName, agentName = "", apiFormat = "")

Создаёт новый экземпляр клиента для работы с LLM.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-ses"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>sessionName</td><td>String</td><td>Уникальное имя сессии</td></tr><tr><td>agentName</td><td>String</td><td>Имя агента (опционально)</td></tr><tr><td>apiFormat</td><td>String</td><td>Формат API (опционально)</td></tr></tbody></table>

**Возвращает**  
LLMClient — экземпляр клиента.

---

### setPromptTable(tableName, agentName)

Устанавливает таблицу промптов и имя агента.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-tab"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>tableName</td><td>String</td><td>Имя таблицы промптов</td></tr><tr><td>agentName</td><td>String</td><td>Имя агента</td></tr></tbody></table>

---

### addUserQuery(content)

Сохраняет пользовательский запрос для текущей сессии.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-con"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>content</td><td>String</td><td>Пользовательский запрос</td></tr></tbody></table>

---

### getUserQuery()

Получает последний пользовательский запрос.

**Параметры**  
Нет

**Возвращает**  
String — последний пользовательский запрос.

---

### addPrompt(role, content)

Добавляет промпт с указанной ролью.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-rol"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>role</td><td>String</td><td>Роль: 'system', 'user', 'assistant'</td></tr><tr><td>content</td><td>String/Array</td><td>Текст или массив строк</td></tr></tbody></table>

---

### addRawPrompts(prompts)

Добавляет массив промптов без обработки.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-pro"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>prompts</td><td>Array</td><td>Массив объектов {role, content}</td></tr></tbody></table>

---

### addSystemPrompt(content)

Добавляет системный промпт.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-con-0"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>content</td><td>String</td><td>Системный промпт</td></tr></tbody></table>

---

### addUserPrompt(content)

Добавляет пользовательский промпт.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-con-1"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>content</td><td>String</td><td>Пользовательский промпт</td></tr></tbody></table>

---

### addAssistantPrompt(content)

Добавляет промпт ассистента.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-con-2"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>content</td><td>String</td><td>Промпт ассистента</td></tr></tbody></table>

---

### addHistoryToPrompts(historyOverride = null)

Добавляет историю сообщений к промптам.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-his"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>historyOverride</td><td>Array/Null</td><td>Массив сообщений или null</td></tr></tbody></table>

---

### clearPrompts()

Очищает все промпты текущей сессии.

**Параметры**  
Нет

---

### setHistoryMaxLength(lmax)

Устанавливает максимальную длину истории сообщений.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-lma"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>lmax</td><td>Number</td><td>Максимальная длина истории</td></tr></tbody></table>

---

### setHistory(messages)

Сохраняет историю сообщений.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-mes"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>messages</td><td>Array</td><td>Массив объектов {role, content}</td></tr></tbody></table>

---

### getHistory()

Получает историю сообщений.

**Параметры**  
Нет

**Возвращает**  
Array — история сообщений.

---

### addToHistory(message)

Добавляет сообщение в историю.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-mes-0"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>message</td><td>Object</td><td>Объект {role, content}</td></tr></tbody></table>

---

### disableHistory()

Отключает сохранение истории сообщений.

**Параметры**  
Нет

---

### clearHistory()

Очищает историю сообщений.

**Параметры**  
Нет

---

### getHistoryStr()

Получает историю сообщений в виде строки.

**Параметры**  
Нет

**Возвращает**  
String — история сообщений.

---

### setModel(model)

Устанавливает модель для генерации ответа.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-mod"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>model</td><td>String</td><td>Название модели</td></tr></tbody></table>

---

### setProvider(providerName)

Устанавливает провайдера LLM.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-pro-0"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>providerName</td><td>String</td><td>Название провайдера</td></tr></tbody></table>

---

### getProvider()

Получает текущего провайдера.

**Параметры**  
Нет

**Возвращает**  
String — название провайдера.

---

### setApiFormat(apiFormat)

Устанавливает формат API.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-api"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>apiFormat</td><td>String</td><td>Формат API</td></tr></tbody></table>

---

### setModelParams(params)

Устанавливает параметры модели.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-par"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>params</td><td>Object</td><td>Объект с параметрами модели</td></tr></tbody></table>

---

### setTemperature(temp)

Устанавливает температуру генерации.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-tem"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>temp</td><td>Number</td><td>Температура генерации</td></tr></tbody></table>

---

### getParams()

Получает параметры модели.

**Параметры**  
Нет

**Возвращает**  
Object — параметры модели.

---

### getMessages()

Получает промпты запроса.

**Параметры**  
Нет

**Возвращает**  
Array — промпты запроса.

---

### deleteMessages()

Удаляет промпты запроса.

**Параметры**  
Нет

---

### prepareRequest(callbackScript = null)

Сохраняет промпты и задаёт callback-скрипт.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-cal"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>callbackScript</td><td>String</td><td>Код скрипта для обработки ответа (опц.)</td></tr></tbody></table>

---

### sendRequest()

Отправляет асинхронный запрос к LLM.

**Параметры**  
Нет

**Пример**

```js
const llm = new LLMClient("DetectIntent")
llm.setModel("gpt-3.5-turbo")
llm.setProvider("OpenAI")
llm.setPromptTable("gpt_prompts", "MyAgent")
llm.addSystemPrompt("$start")
llm.addUserPrompt(`Запрос пользователя: ${lead.getAttr("user_input")}`)
llm.prepareRequest("MyAgent:MyScript")
return llm.sendRequest()

```

---

### handleResponse()

Обрабатывает ответ от LLM, сохраняет результат и историю.

**Параметры**  
Нет

---

### setErrorScript(scriptCode)

Назначает fallback-скрипт при ошибке.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-scr"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>scriptCode</td><td>String</td><td>Код скрипта для обработки ошибки</td></tr></tbody></table>

---

### getErrorScript()

Получает fallback-скрипт.

**Параметры**  
Нет

**Возвращает**  
String — код fallback-скрипта.

---

### setFallbackConfig(scriptCode, timeout)

Настраивает резервный сценарий и таймаут.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-scr-0"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>scriptCode</td><td>String</td><td>Код резервного скрипта</td></tr><tr><td>timeout</td><td>Number</td><td>Таймаут в секундах</td></tr></tbody></table>

---

### scheduleFallback()

Запланировать отложенный запуск fallback-скрипта.

**Параметры**  
Нет

---

### unscheduleFallback()

Удалить отложенный запуск fallback-скрипта.

**Параметры**  
Нет

---

### getResponseResult()

Получает результат запроса (объект ответа провайдера).

**Параметры**  
Нет

**Возвращает**  
Object — объект ответа провайдера.

---

### getProviderResult()

Получает "сырые" данные от провайдера.

**Параметры**  
Нет

**Возвращает**  
Object — исходные данные от провайдера.

---

### getResponseText()

Извлекает текст ответа из результата.

**Параметры**  
Нет

**Возвращает**  
String — текст ответа.

---

### extractAnswerForModel(content)

Извлекает ответ по формату модели.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-con-3"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>content</td><td>Object</td><td>Объект ответа провайдера</td></tr></tbody></table>

---

### getModelContextSize(modelName = null)

Получает максимальный размер контекста модели.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-mod-0"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>modelName</td><td>String</td><td>Название модели или null</td></tr></tbody></table>

**Возвращает**  
Number — максимальный размер контекста.

---

### getLastJSON(text = null)

Извлекает JSON из текста ответа.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-tex"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>text</td><td>String</td><td>Текст ответа или null</td></tr></tbody></table>

**Возвращает**  
Object — найденный JSON.

---

### extractTextWithoutJSON(text = null)

Удаляет JSON из текста и возвращает чистый текст.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-tex-0"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>text</td><td>String</td><td>Текст ответа или null</td></tr></tbody></table>

**Возвращает**  
String — текст без JSON.

---

### removeMarkdownHeaders(text = null)

Удаляет заголовки Markdown из текста.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-tex-1"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>text</td><td>String</td><td>Текст ответа или null</td></tr></tbody></table>

**Возвращает**  
String — текст без заголовков.

---

### getAgentAnswer(agentName)

Получает ответ агента по имени.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-age"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>agentName</td><td>String</td><td>Имя агента</td></tr></tbody></table>

**Возвращает**  
String — ответ агента.

---

### getLastTokenUsage()

Получает статистику токенов последнего запроса.

**Параметры**  
Нет

**Возвращает**  
Object — статистика токенов.

---

### setStatus(status)

Устанавливает статус сессии.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-sta"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>status</td><td>String</td><td>Статус: 'IDLE', 'PREPARED', ...</td></tr></tbody></table>

---

### getStatus()

Получает текущий статус.

**Параметры**  
Нет

**Возвращает**  
String — текущий статус.

---

### clearStatus()

Очищает статус.

**Параметры**  
Нет

---

### nextFlow(scriptCode)

Переходит к следующему flow-скрипту.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-scr-1"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>scriptCode</td><td>String</td><td>Код следующего flow-скрипта</td></tr></tbody></table>

---

### sendResponse()

Отправляет ответ в лог админа.

**Параметры**  
Нет

---

### sendFormattedResponse(format = 'Markdown')

Отправляет ответ в заданном формате.

**Параметры**

<table id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-for"><thead><tr><th>Имя</th><th>Тип</th><th>Описание</th></tr></thead><tbody><tr><td>format</td><td>String</td><td>Формат: 'Markdown', 'HTML', ...</td></tr></tbody></table>

---

### finishFlow()

Завершает работу сессии.

**Параметры**  
Нет

---

## Примеры использования

```js
const LLMClient = require("Common.MetabotAI.LLMClient")
const llm = new LLMClient("DetectIntent")
llm.setModel("gpt-3.5-turbo")
llm.setProvider("OpenAI")
llm.setPromptTable("gpt_prompts", "MyAgent")
llm.addSystemPrompt("$start")
llm.addUserPrompt(`Запрос пользователя: ${lead.getAttr("user_input")}`)
llm.prepareRequest("MyAgent:MyScript")
llm.setErrorScript("MyAgent:ErrorFlow")
return llm.sendRequest()

```

---

## Жизненный цикл и статусы

<table id="bkmrk-%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81-%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%B0%D0%B2" style="width: 80.3704%;"><thead><tr><th style="width: 28.4596%;">Статус</th><th style="width: 34.863%;">Когда устанавливается</th><th style="width: 36.8196%;">Описание</th></tr></thead><tbody><tr><td style="width: 28.4596%;">`IDLE`</td><td style="width: 34.863%;">`new LLMClient(...)`</td><td style="width: 36.8196%;">Клиент создан, ничего не сделано.</td></tr><tr><td style="width: 28.4596%;">`PREPARED`</td><td style="width: 34.863%;">`prepareRequest()`</td><td style="width: 36.8196%;">Промпты собраны, запрос готов.</td></tr><tr><td style="width: 28.4596%;">`WAITING`</td><td style="width: 34.863%;">`sendRequest()`</td><td style="width: 36.8196%;">Запрос отправлен, ожидаем ответ.</td></tr><tr><td style="width: 28.4596%;">`SUCCESS`</td><td style="width: 34.863%;">`handleResponse()` (200)</td><td style="width: 36.8196%;">Ответ успешно получен.</td></tr><tr><td style="width: 28.4596%;">`ERROR`</td><td style="width: 34.863%;">`handleResponse()` (≠200)</td><td style="width: 36.8196%;">Ошибка при получении ответа.</td></tr><tr><td style="width: 28.4596%;">`ERROR_HANDLED`</td><td style="width: 34.863%;">`handleResponse()` → fallback</td><td style="width: 36.8196%;">Сработал обработчик ошибки.</td></tr><tr><td style="width: 28.4596%;">`DONE`</td><td style="width: 34.863%;">вручную</td><td style="width: 36.8196%;">Не используется напрямую.</td></tr></tbody></table>

---

## Отладка и переменные

<table id="bkmrk-%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F-%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B7%D0%BD"><thead><tr><th>Переменная</th><th>Пример значения</th><th>Описание</th></tr></thead><tbody><tr><td>`llm_<session>_status`</td><td>`WAITING`</td><td>Текущий статус запроса</td></tr><tr><td>`llm_<session>_provider`</td><td>`OpenAI`</td><td>Название LLM-провайдера</td></tr><tr><td>`llm_<session>_params`</td><td>`{ model: "gpt-3.5-turbo", temperature: 0.7 }`</td><td>Параметры модели</td></tr><tr><td>`llm_<session>_messages`</td><td>`[{"role": "system", ...}, ...]`</td><td>Все промпты запроса</td></tr><tr><td>`llm_<session>_history`</td><td>`[{"role": "user", ...}, ...]`</td><td>История переписки</td></tr><tr><td>`llm_<session>_callback_script`</td><td>`MyAgent:NextStep`</td><td>Скрипт для ответа</td></tr><tr><td>`llm_<session>_error_script`</td><td>`MyAgent:Fallback`</td><td>Скрипт для ошибки</td></tr><tr><td>`llm_<session>_raw_response`</td><td>`Вот ваш ответ...`</td><td>Текст ответа до форматирования</td></tr><tr><td>`llm_<session>_user_query`</td><td>`Сколько лет космосу?`</td><td>Последний пользовательский запрос</td></tr></tbody></table>

---

## FAQ

**Вопрос:** Как добавить свой промпт?  
**Ответ:** Используйте `addSystemPrompt`, `addUserPrompt` или `addAssistantPrompt`. Можно ссылаться на промпты из таблицы через `$name` или `@common_name`.

**Вопрос:** Как обработать ошибку?  
**Ответ:** Назначьте обработчик через `setErrorScript(scriptCode)` или используйте резервный сценарий через `setFallbackConfig(scriptCode, timeout)`.

**Вопрос:** Как получить статистику токенов?  
**Ответ:** Вызовите `getLastTokenUsage()` после получения ответа.

**Вопрос:** Как интегрировать с другими компонентами?  
**Ответ:** Используйте методы перехода (`nextFlow`), отправки (`sendResponse`, `sendFormattedResponse`) и работы с историей.