# Контекст

Kонтекст - ключевой объект который содержит в себе уникальную для каждого пользователя информацию о проекте, пользователе и взаимодействии пользователя с виртуальным ассистентом за последние 20 сообщений. Контекст доступен 48 часов после закрытия сессии и может быть переиспользован если диалог продолжится.

{% hint style="warning" %}
Если вам нужно хранилище переменных на уровне проекта, то лучше использовать [**projectStorage**](https://docs.lia.chat/docs/rabota-so-snippetami#khranilishe-proekta-projectstorage).
{% endhint %}

#### Полезно использовать, когда:

* для сценария нужна информация о пользователе, полученная по API;
* в сценарии нужно выводить текст в зависимости от данных конкретного пользователя;
* нужна переменная, доступная нескольким сниппетам.

#### Устройство контекста <a href="#ustroistvo-konteksta" id="ustroistvo-konteksta"></a>

Объект содержит следующие ключи:

* `context.fact_name` – факты, установленные вручную, полученные по API и т.п.
* `context.project_id` – id проекта
* `context.user_id` – id пользователя
* `channel_id` – id канала, с которого пришло сообщение (например виджет или API)
* `context.events` – массив событий (текстовых сообщений и прочих триггеров/реакций)
* `context.current` – быстрый доступ к последнему событию от пользователя

#### context.events <a href="#context.events" id="context.events"></a>

Сообщения из переписки хранятся в `context.events`, который имеет следующую структуру:

```json
[
    {
        'incoming': true, // От пользователя
        'type': 'text',
        'timestamp': 1591186466.1,
        'params': {
            'text': 'Привет, бот a@b.com'
        },
        'meta': {
            'intents': {
                'приветствие': {'proba': 0.98}
            },
            'entities': {
                'email': {...}
            }
        }
    },
    {
        'incoming': false, // От робота
        'type': 'text',
        'timestamp': 1591186466.2,
        'params': {
            'text': 'Привет, пользователь'
        },
        'meta': {
            {'reaction': 'reaction1'}
        }
    },
    ...
]
```

В объекте `'params'` лежат параметры сообщения в зависимости от типа.

В `'meta'` во входящих сообщениях лежат намерения и сущности, в исходящих - название реакции из сценария.

В `context.current` содержится последнее входящее событие из `context.events`.

#### Установка фактов <a href="#ustanovka-faktov" id="ustanovka-faktov"></a>

Существует несколько способов добавления фактов в context:

* в сниппете через `context.set('key', 'value')` : такие факты будут доступны во всех сниппетах через `context.key`
* передача по [Lia API](https://docs.lia.chat/docs/for-developers/lia-api) в JSON-объект `facts`
* [сущности](https://docs.lia.chat/docs/user-manual/sushnosti) автоматически добавляются в контекст и доступны по`context.entity_name`. Поэтому сущностям следует давать название на латинице в соответствии с традиционными правилами названия переменных в коде.
* Вручную через надстройку в debug-чате

{% hint style="info" %}
Если ключи в контексте имеют одинаковые названия, то будет храниться факт с наивысшим приоритетом.
{% endhint %}

Порядок приоритетности фактов контекста (от большего к меньшему):

1. системные факты: `'project_id'` , `'user_id'`, `'channel_id'`, `'events'`, `'current'`
2. `context.set('key', 'value')` или заданные вручную
3. распознанные Lia `entities`
4. `facts` из API

{% hint style="danger" %}
Контекст автоматически удаляется для пользователя в случае отсутствия от него обращений в течение **48 часов**.
{% endhint %}

### Примеры использования <a href="#primery-ispolzovaniya" id="primery-ispolzovaniya"></a>

| Переменная                    | Значение                                           |
| ----------------------------- | -------------------------------------------------- |
| `context.current.params.text` | Последнее текстовое сообщение от пользователя      |
| `context.entity_name.raw`     | Распознанная сущность, как ее написал пользователь |
| `context.entity_name.str`     | Распознанная сущность в отформатированном виде     |
| `context.fact_name`           | Доступ к любому заранее установленному факту       |
