> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hubtalk.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 17. Цели разговора

> Машинно-проверяемые цели: агент не переспрашивает то, что уже получил.

# Цели разговора

<Info>
  **Цель модуля:** задать машинно-проверяемые цели, чтобы агент не переспрашивал то, что уже получил.
</Info>

<Frame caption="Цели разговора. Две цели учебного агента: «визит подтверждён или перенесён» (обязательная) и «согласие на SMS-напоминание» (отзываемая, с предусловием).">
  <img src="https://mintcdn.com/hubtalk/GMvtjWdqWk0BhtuQ/images/tutorial/tut-34-settings-goals.webp?fit=max&auto=format&n=GMvtjWdqWk0BhtuQ&q=85&s=82d854be4fb91efd60e890ee1402c201" alt="Секция «Цели разговора» с двумя целями" style={{ width: "100%", maxWidth: "470px", height: "560px", objectFit: "cover", objectPosition: "top", borderRadius: "6px" }} width="780" height="2667" data-path="images/tutorial/tut-34-settings-goals.webp" />
</Frame>

<Accordion title="Показать панель целиком">
  <img src="https://mintcdn.com/hubtalk/GMvtjWdqWk0BhtuQ/images/tutorial/tut-34-settings-goals.webp?fit=max&auto=format&n=GMvtjWdqWk0BhtuQ&q=85&s=82d854be4fb91efd60e890ee1402c201" alt="Секция «Цели разговора» с двумя целями" width="780" height="2667" data-path="images/tutorial/tut-34-settings-goals.webp" />
</Accordion>

Проблема, которую это решает, звучит так: агент помнит разговор не целиком, а последними репликами. На длинном звонке ранняя реплика, где человек уже назвал имя, из этой памяти выпадает — и агент спрашивает второй раз. Просьба «не переспрашивай» в промпте тут не помогает: он не забывает **правило**, он забывает **факт**.

Цель — это факт разговора, выраженный **условием по переменным**: `{{confirm_text}} != ""`. Отметку ставит код, а не модель: модель состояние целей только читает и никогда в него не пишет. Отсюда свойства, которых не даёт промпт:

* закрытую цель агент **не переспрашивает** — сводка выполненного уходит в хвост промпта и обновляется на каждом ходу, поэтому из памяти не выпадает;
* цель можно сделать **отзываемой** — клиент передумал, условие отмены сработало, цель снова открыта;
* **предусловия** задают порядок: согласие на SMS не имеет смысла до подтверждения визита;
* в формулах переходов доступен предикат `goals_completed()` — «всё главное получено, можно прощаться».

Первое действие в секции — галочка **«Отслеживать цели разговора»**. Пока она снята или список пуст, механизм выключен целиком и на поведение агента не влияет никак.

<Info>
  **Две вещи, которые часто спрашивают.** Первая: сводка **не попадает в расшифровку разговора** — в записи звонка вы увидите только реальные реплики. Вторая: дополнительных обращений к языковой модели механизм не делает, на задержку и стоимость звонка он не влияет. И ещё: дописывать сводку руками в промпты узлов не нужно — она подмешивается сама, а рукописная копия быстро разъедется с настройками.
</Info>

## Как задаются условия

**Условие выполнения** и **Условие отмены** собираются тем же **конструктором условий**, что работает на переходах: выбираете переменную, операцию и значение, а карточки складываются в выражение. Правка текстом осталась — но теперь это выбор автора, а не единственный способ.

Отдельной карточкой добавляется проверка **«Узел пройден»**: узел выбирается из списка. Это единственное значение в условии цели, которое автору негде подсмотреть, — поэтому его и вынесли в отдельный элемент.

Формулировка цели — это **утверждение о факте** («личность подтверждена»), а не поручение («подтвердить личность»): текст уходит агенту, и текст-задание он начинает зачитывать вслух — «так, мне ещё нужно уточнить причину неплатежа». Формулировки стоит вычитывать на тестовых звонках с тем же вниманием, с каким вы вычитываете реплики агента.

### Шпаргалка по условиям

| Нужно проверить                      | Как пишется                                        |
| ------------------------------------ | -------------------------------------------------- |
| поле заполнено                       | `{{full_name}} exists`                             |
| поле не заполнено                    | `{{birth_date}} not exists`                        |
| поле равно значению                  | `{{consent}} == "да"`                              |
| поле не равно значению               | `{{status}} != "отказ"`                            |
| число больше / меньше                | `{{amount}} > 1000`                                |
| текст содержит слово                 | `{{intent}} CONTAINS оплат`                        |
| запрос в вашу систему прошёл успешно | `{{crm_check_success}} == true`                    |
| несколько условий сразу              | `{{full_name}} exists AND {{birth_date}} exists`   |
| одно из двух                         | `{{consent}} == "да" OR {{consent}} == "yes"`      |
| группировка                          | `{{a}} exists AND ({{b}} exists OR {{c}} == "да")` |
| агент дошёл до шага сценария         | карточка «Узел пройден»                            |

Регистр в сравнениях не учитывается: `"Да"` и `"да"` — одно и то же. Выражения со скобками и со смесью `AND` и `OR` правятся только текстом — карточки такую форму не показывают.

### Откуда берутся значения полей

Это главный практический вопрос настройки. Источников три:

1. **Извлечение из разговора** — то, что агент выясняет у человека: имя, дата, причина, ответ на вопрос. В свободном режиме извлечение идёт на каждом ходу, в жёстком сценарии — только на шагах, где оно настроено.
2. **Результаты обращений к вашим системам** — у каждого запроса автоматически есть `{{имя}}_success`, `{{имя}}_status`, `{{имя}}_error` плюс поля, которые вы назначили из ответа. Полезный побочный эффект: если тот же запрос повторить и он вернёт неуспех, цель **сама** перестанет быть закрытой — отдельное условие отмены для этого не нужно.
3. **Данные, известные до звонка** — переменные звонка и кампании: имя из файла контактов, сумма долга, номер договора.

<Note>
  **Задержка ровно в одну реплику.** Состояние целей пересчитывается один раз в конце каждого хода, поэтому цель, закрытая ответом на текущей реплике, попадает в сводку и в признак `goals_completed()` начиная со **следующего** хода. Это нормально, а не сбой.
</Note>

<Warning>
  **Грабли: цель по переменной, которую никто не заполняет**

  Если переменная условия не заполняется ни одним узлом, цель не закроется никогда — валидация об этом предупреждает, но не запрещает: переменная может законно приходить из кампании или из API. Проверьте, что она действительно приходит.
</Warning>

<Note>
  **Цель с неразбираемым условием черновик сохранит** — но заблокирует публикацию агента и тестовый звонок. То есть недописанное условие не мешает отложить работу до завтра, но и незамеченным на прод не уедет.
</Note>

## Что видно в истории звонка

В хронологии появляются три события: **Цель закрыта** (видно, на какой реплике), **Отметка цели снята** (с причиной — сработало условие отмены, условие выполнения перестало быть истинным или отозвано предусловие) и **Ошибка условия цели**. Если условие сломалось уже во время звонка — например, переменную переименовали, — звонок **не прерывается**: цель считается незакрытой, предупреждение пишется один раз, разговор идёт нормально.

## Признак «всё выяснено» ≠ успешность звонка

Признак `goals_completed()` поднимается, когда закрыты все цели, отмеченные **обязательными** — необязательные его не удерживают. **Звонок при этом не завершается сам**: разговор редко заканчивается на последней галочке, человек ещё прощается и переспрашивает срок. Куда вести признак, решаете вы — в блок прощания, к переводу на оператора, к финальному подтверждению.

Оценка успешности звонка из пост-аналитики считается независимо и означает другое: «всё запланированное выяснено» против «звонок успешен по вашему критерию». В записи видны оба.

## Чего цели не делают

* **Не работают у агентов на моделях «речь-в-речь» (realtime)** — такие агенты не заполняют переменные по ходу разговора, а без них проверять нечего. Галочку включить можно, эффекта не будет.
* **Не заменяют обязательные раскрытия.** Уведомление о записи, идентификация до обсуждения долга — это не цели: цель подсказывает агенту, а подсказку можно проигнорировать. Там, где произнести что-то обязательно, нужен жёсткий маршрут в сценарии.
* **Не навязывают порядок** — только предусловия, и недоступная цель агенту не показывается вообще, чтобы он не поднял заблокированную тему раньше времени. При этом ответ, данный заранее, не теряется: значение сохранится, и цель закроется в момент выполнения предусловия.
* **В жёстком сценарии** цель на переменную, которую сценарий нигде не заполняет, не закроется — у свободного режима такого ограничения нет.
* **Цели живут на агенте** и версионируются вместе с ним.

Полная справка по полям цели и по блокирующим проверкам — на странице [Цели разговора](/ru/v4/platform/agent-settings/goals).
