# Функции

Функции - это очень полезный и важный инструмент при настройке Савви, которая позволяет выполнять Савви конкретные действия (вызвать файл базы знаний, таблицу, веб-хук и т.д.).&#x20;

## Как работают функции?

В основе каждого механизма Савви, где требуется какое-то действие (помимо ответа), будь то база знаний, таблицы, веб-хуки или что-то лежит "функция", которая отвечает за его работу. Внутри функции есть два параметра:

* название функции
* описание функции

Название описывает общий смысл, а описание более подробный.

> Например, для таблицы, которая является прайсом, и который Савви должен прочитывать для ответов клиенту название функции и описание могут звучать так:
>
> * Название: `price_table`
> * Описание: Используется для предоставлении стоимости товаров

<figure><img src="https://1280958077-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCfQs1g1wTlkieX5CuhTI%2Fuploads%2FAo5Ittf9bHPwp2z7hJBa%2Fimage.png?alt=media&#x26;token=5567de61-8dfc-44bc-8e8d-3cf8eabd371b" alt=""><figcaption></figcaption></figure>

Эта информация дает Савви представление о том, где хранится информация о стоимости, и  когда клиент спросит: "Сколько стоит?" Савви поймет, что эта информация хранится в данной таблице.

{% hint style="warning" %}
**Обратите внимание**

Бывают более сложные ситуации, когда расчет происходит **в несколько шагов** или при использовании **информации из разных источников.**

Например, когда сначала нужно получить данные из первой таблицы, а потом передать эту информацию во вторую таблицу и получить оттуда информацию в соответствии с этой комбинацией.
{% endhint %}

В этом случае, для каждой таблицы формируется **свое название** и **описание**.

> Например, в первой таблице мы получаем категорию товара и ее идентификатор (ID), а далее по ID категории рассчитываем стоимость в другой таблице, где уже указан объем товара и стоимость. В этом случае для первой таблицы будут такие параметры:
>
> * Название: `categories_table`
> * Описание: Используется для получения ID категорий товаров
>
> Для второй таблицы:
>
> * Название: `price_table`
> * Описание: Используется для получения стоимости товаров по ID.

Тут может возникнуть вопрос, почему сразу не указать все в одной таблице? Тут это разделено просто в качестве примера.

В этом случае, при такой схеме в инструкции мы можем указать такой промпт:

{% tabs %}
{% tab title="Пример промта с двумя таблицами" %}
\#РАСЧЕТ СТОИМОСТИ

В случае, если клиент запросил стоимость товаров выполни по порядку следующие действия:

1. Получи ID товара вызвав функцию `categories_table` передав в нее нужный товар
2. Получи стоимость товара вызвав функцию `price_table` передав туда ID товара полученный на предыдущем шаге.
   {% endtab %}
   {% endtabs %}

В английском варианте вызов функции звучит как call function <название функции>.

**Почему мы тут вызываем две функции? Разве бот не понимает это по описанию?**

Понимает, но тут вопрос точности. Если мы хотим ее повысить, то лучше в инструкции прямо прописать последовательность шагов.

## Вызов функций в инструкции

Для вызова функций в системной инструкции Савви используется конструкция:

<mark style="color:blue;">**call function <Название функции>**</mark>, где <Название функции> - это конкретная функция.

Ниже виды функций и примеры их использования.

## Предустановленные функции

К предустановленным функциям относятся функция работы с базой знаний. В случае, когда нужно принудительно вызвать какой-то файл в базе знаний используется функция:

<mark style="color:blue;">**get\_file\_text("<Название файла для поиска>")**</mark>, где <Название файла для поиска> - это название файла для поиска из раздела База знаний.

<figure><img src="https://1280958077-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCfQs1g1wTlkieX5CuhTI%2Fuploads%2FEN0YOQoc7NkPISVMKwEt%2Fimage.png?alt=media&#x26;token=2a34a0be-f465-4248-9748-79f12d54596a" alt=""><figcaption></figcaption></figure>

Например, если клиент прямо не пишет, что хочет соединить с оператором, но мы хотим в ряде случаев уменьшить вероятность, что Савви не вызовет нужный  файл, мы можем использовать следующий способ:

{% tabs %}
{% tab title="Пример get\_file\_text (русский)" %}
{% code overflow="wrap" %}

```
Если клиент злится, у него есть претензия или повышенный тон, по которому мы можем понять его негативный настрой вызови функцию get_file_text("Переключить на менеджера").
```

{% endcode %}
{% endtab %}

{% tab title="Пример get\_file\_text (английский)" %}
{% code overflow="wrap" %}

```
If the client is angry, he has a complaint or a raised tone, by which we can understand his negative attitude, call function get_file_text("Switch to manager").
```

{% endcode %}
{% endtab %}
{% endtabs %}

В этом случае, Савви вызовет данный файл, хотя клиент и не просил переключить на менеджера.

## Пользовательские функции

К пользовательским функциям на текущий момент относятся функции разделов [Таблицы ](https://docs.suvvy.ai/ru/rabota-s-tablicami/tablicy-csv-xls-google)и [Действия](https://docs.suvvy.ai/ru/deistviya).

У каждой таблицы или действия имеется свое название и описание функции. Оно задается персонально для каждой отдельной таблицы или действия.

{% hint style="info" %}
Сами по себе функции имеют описание и Савви **сам понимает**, когда их нужно вызвать.

Указывать функции в инструкции само по себе не обязательно, но мы рассматриваем случаи, когда вызов функции может быть **не очевиден** для бота, или последовательность действий имеет свои ответвления, которые необходимо описать.
{% endhint %}

По аналогии с предыдущим пунктом, мы можем вызывать необходимые функции используя конструкцию:

<mark style="color:blue;">**call function <Название функции>**</mark>, где <Название функции> - это конкретная функция.

При этом у таблиц одним из обязательных моментов будет наличие в названии слова table (добавляется автоматически).

При вызове таблицы или действия мы должны указать, что мы туда передаем, дабы Савви не передавал туда не нужную информацию.\
\
Например, если мы хотим вызывать веб-хук, который обратится в CRM и получит информацию о товаре, с учетом доставки в конкретный город, мы можем сформировать инструкцию таким образом:

{% tabs %}
{% tab title="Пример вызова веб-хука (русский)" %}
{% code overflow="wrap" %}

```
Если клиент запрашивает информацию о товаре вызови функцию item_information и передай туда название товара и город доставки.
```

{% endcode %}
{% endtab %}

{% tab title="Пример вызова веб-хука (английский)" %}
{% code overflow="wrap" fullWidth="false" %}

```
If the customer requests information about the product, call the item_information function and pass the product name and the delivery city there.
```

{% endcode %}
{% endtab %}
{% endtabs %}
