> ## 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.

# 07. Function и инструменты

> Два способа сходить во внешнюю систему и как обрабатывать неуспех.

# Внешние системы: Function и инструменты

<Info>
  **Цель модуля:** вызвать CRM двумя разными способами и понимать, когда какой уместен.
</Info>

Есть два способа сходить во внешнюю систему, и разница между ними — **кто решает, что пора идти**.

|                     | Узел Function                                     | Инструмент у Conversation                                        |
| ------------------- | ------------------------------------------------- | ---------------------------------------------------------------- |
| **Кто вызывает**    | движок, всегда на входе в узел                    | модель, когда сочтёт нужным                                      |
| **Предсказуемость** | полная                                            | зависит от инструкции узла                                       |
| **Аргументы**       | подстановка `{{var}}`; опционально — сбор моделью | собирает модель по JSON-схеме                                    |
| **Когда брать**     | обязательный шаг: проверить слоты, создать заявку | шаг «по ситуации»: клиент может выбрать окно, а может отказаться |

<Frame caption="Function. Переключатель Заглушка / HTTP, параметры с {{var}}, разбор ответа по JSONPath в переменные и реплика-филлер на время вызова.">
  <img src="https://mintcdn.com/hubtalk/GMvtjWdqWk0BhtuQ/images/tutorial/tut-11-node-function.webp?fit=max&auto=format&n=GMvtjWdqWk0BhtuQ&q=85&s=b97b4d2e40040f548fbb1c6a8e21c350" alt="Инспектор узла Function: заглушка или HTTP, параметры, переменные из ответа" style={{ width: "100%", maxWidth: "470px", height: "560px", objectFit: "cover", objectPosition: "top", borderRadius: "6px" }} width="780" height="3302" data-path="images/tutorial/tut-11-node-function.webp" />
</Frame>

<Accordion title="Показать панель целиком">
  <img src="https://mintcdn.com/hubtalk/GMvtjWdqWk0BhtuQ/images/tutorial/tut-11-node-function.webp?fit=max&auto=format&n=GMvtjWdqWk0BhtuQ&q=85&s=b97b4d2e40040f548fbb1c6a8e21c350" alt="Инспектор узла Function: заглушка или HTTP, параметры, переменные из ответа" width="780" height="3302" data-path="images/tutorial/tut-11-node-function.webp" />
</Accordion>

<Frame caption="Conversation + инструмент. Тот же вызов, но решение принимает модель: инструмент book_appointment плюс своя модель генерации для этого узла.">
  <img src="https://mintcdn.com/hubtalk/GMvtjWdqWk0BhtuQ/images/tutorial/tut-12-conversation-tool.webp?fit=max&auto=format&n=GMvtjWdqWk0BhtuQ&q=85&s=6c8e353b7feac9ad0991ecaa907c1bc6" alt="Инспектор Conversation с инструментом book_appointment и переопределением модели" style={{ width: "100%", maxWidth: "470px", height: "560px", objectFit: "cover", objectPosition: "top", borderRadius: "6px" }} width="780" height="3358" data-path="images/tutorial/tut-12-conversation-tool.webp" />
</Frame>

<Accordion title="Показать панель целиком">
  <img src="https://mintcdn.com/hubtalk/GMvtjWdqWk0BhtuQ/images/tutorial/tut-12-conversation-tool.webp?fit=max&auto=format&n=GMvtjWdqWk0BhtuQ&q=85&s=6c8e353b7feac9ad0991ecaa907c1bc6" alt="Инспектор Conversation с инструментом book_appointment и переопределением модели" width="780" height="3358" data-path="images/tutorial/tut-12-conversation-tool.webp" />
</Accordion>

## Что настраивается у Function

* **Метод, URL, query, заголовки, тело** — с подстановкой `{{var}}` и секретов `{{env.ИМЯ}}`. Секрет в поле не пишут: пишут имя переменной окружения.
* **Таймаут, ретраи, проверка TLS, критерий успеха** (`2xx` и подобное).
* **Переменные из ответа** — `slots_count ← $.count`. После вызова доступны служебные `<имя>_status`, `_success`, `_error`, `_result`: по ним строят ветвление «успех / ошибка» формулой.
* **Реплика во время вызова** — «Секунду, смотрю свободное время…». В голосе это не украшение: без неё клиент слышит тишину на всё время запроса.
* **Заглушка** — фиксированный ответ. На ней собирают и тестируют флоу, пока API клиента не готов, и ею же пользуется чат-тест в режиме «заглушки HTTP».

<Warning>
  **Грабли: неуспех — это тоже маршрут**

  Сеть падает, CRM отвечает 500. Если из Function выходит один переход Always, ошибка поедет дальше как «всё хорошо» — с пустыми переменными. Правильно: после Function поставить ветвление по `{{имя}}_success` и вести неуспех на человека или на вежливое «мы перезвоним».
</Warning>
