Filler (филлер) - сущность DSL, которая используется в механизме slot-filling и заполняет слот (field) конкретным значением. Filler входит в состав сущности Field.
Примеры Filler
Ниже представлено описание основных параметров Filler, которые передаются в поле type.
| Type | Описание | 
|---|---|
intersection | Используется для заполнения поля одним из перечисленных в key значений. Если в нормализованном виде все слова запроса включают в себя хотя бы один пример из value, то поле примет значение key. Используемые параметры: 
 {
"type": "intersection",
"cases": {
"salty": [
"соленый",
"несладкий"
],
"sweet": [
"сладкий сет",
"карамельный"
]
}
} | 
intersection_original_text | Используется для заполнения поля одним из перечисленных в key значений. В отличие от intersection слова запроса не нормализуются, т.е. если все слова запроса включают в себя все слова хотя бы одного примера из value, то поле примет значение key. Используемые параметры: 
 {
"type": "intersection_original_text",
"cases": {
"salty": [
"соленый",
"несладкий"
],
"sweet": [
"сладкий сет",
"карамельный"
]
}
} | 
number_first | Извлекает первый из токенов, который имеет token_type = NUM_TOKEN (число) {
"type": "number_first"
} | 
currency_first | Извлекает первый из токенов, который имеет token_type = CCY_TOKEN (валюта) {
"type": "currency_first"
} | 
geo | Извлекает первый из токенов, который имеет token_type = GEO_TOKEN (геолокация) {
"type": "geo"
}Например, на "Нахожусь в Петербурге", филлер вернет следующее: {
'value': 'Санкт-Петербург',
'locality_type': 'CITY',
'latitude': 59.93863,
'longitude': 30.31413,
'capital': None,
'locative_value': {
'CITY': 'в Санкт-Петербурге'
},
'timezone': [
[
None,
3.0
]
],
'currency': [
'RUB',
'российский рубль'
],
'country': 'Россия',
'country_hidden': False
} | 
organisation | Извлекает первый из токенов, который имеет token_type = ORG_TOKEN (организация) {
"type": "organisation"
} | 
user_id | Заполняет поле текущим id пользователя: user_id. {
"type": "user_id"
} | 
external | Можно создать филлеры для их дальнейшего переиспользования и вызова по ключу. Для этого необходимо: 
 Используемые параметры: 
 {
"type": "external",
"filler": "yes_no_hard_filler"
} | 
regexp | Заполняет поле регулярным выражением. Применяется к оригинальному запросу клиента. Все вхождения склеиваются в строку через delimiter. Используемые параметры: 
 {
"type": "regexp",
"exp": "\d",
"delimiter": ""
} | 
all_regexps | Заполняет поле всеми вхождениями регулярного выражения. Применяется к оригинальному запросу клиента. Все вхождения склеиваются в строку через delimiter. Используемые параметры: 
 {
"type": "all_regexps",
"exps": [
"номер[а-я]*.?\s?(\d+)",
"N.?\s?(\d+)"
],
"delimiter": "/"
} | 
regexp_string_operations | Заполняет поле всеми вхождениями регулярного выражения. Применяется к тексту после преобразований, указанных в operations. Используемые параметры: 
 {
"type": "regexp_string_operations",
"exp": "1-[A-Z0-9]{7}",
"operations": [
{
"type": "upper"
},
{
"type": "rstrip",
"amount": "!) "
}
]
} | 
composite | Филлер, объединяющий другие филлеры. Филлеры из списка вызываются по порядку. Поле заполняется первым успешно извлеченным значением, последующие филлеры не вызываются. Используемые параметры: 
 {
"type": "composite",
"fillers": [
{
"type": "external",
"filler": "some_filler_name"
},
{
"type": "all_regexps",
"exps": ["номер[а-я]*.?\s?(\d+)",
"N.?\s?(\d+)"],
"delimiter": "/"
}
]
} | 
previous_messages_filler | Филлер-обертка над другими филлерами. Поле заполняется при помощи filler, который применя ется сначала к последнему, затем к предыдущим сообщениям до тех пор, пока поле не заполнится. Всего перебирается count последних сообщений. Используемые параметры: 
 {
"type": "previous_messages_filler",
"count": 3,
"filler": {
"type": "date"
}
} | 
requirement | Филлер, который вызывается только после выполнения условия requirement. {
"type": "requirement",
"filler": {
"type": "phone_number_first"
},
"requirement": {
"type": "random",
"percent": 10
}
} | 
else | Филлер, который срабатывает при выполнении requirement. В противном случае - срабатывает фильтр else_item. Использование else_filler не обязательно, ключ может быть пропущен. {
"type": "else",
"requirement": {
"type": "random",
"percent": 10
},
"filler": {
"type": "number_first"
},
"else_filler": {
"type": "currency_first"
}
} | 
choice | Срабатывание филлеров при их доступности. При запуске по порядку проверяется requirement: 
 Если не выполнен ни один из  {
"type": "choice",
"requirement_fillers": [
{
"type": "requirement",
"filler": {
"type": "phone_number_first"
},
"requirement": {
"type": "random",
"percent": 10
}
},
{
"type": "requirement",
"filler": {
"type": "currency_first"
},
"requirement": {
"type": "external",
"requirement": "some_requirement"
}
}],
"else_item": {
"type": "number_first"
}
} | 
available_info_filler | Филлер для заполнения поля значениями, которые хранятся в полях, описанных в Parametrizer. Используемые параметры: 
 {
"type": "available_info_filler",
"value": "{{nlpp.payload.personInfo.inn}}"
} | 
get_first_person | Фи ллер, который возвращает ФИО из текста в нормализованном виде. "filler": {
"type": "get_first_person"
}Например, на "Расскажи про Иванову Ольгу Михайловну", филлер вернет следующее: {
    "surname": "иванова",
    "name": "ольга",
    "patronymic": "михайловна"
} | 
approve | Заполнение полей подтверждения, не строгое. True, если в нормализованном виде запрос совпадает с одним из нормализованных значений  Можно использовать подготовленный переиспользуемый  "filler": {
"type": "approve",
"yes_words": [
"yes",
"yep",
"sure",
"да",
"ага",
"угу",
"👌",
"👍"
],
"no_words": [
"нет",
"no",
]
} | 
approve_strictly | Заполнение полей подтверждения, строгое. 
 True, если original_text совпадает с одним из значений  
  | 
classifier | Заполняет поле одним из перечисленных в  Запрос клиента проходит классификацию на основе внешнего классификатора (название классификатора указывается в  
  | 
Как добавить свой Filler
Для добавления своего филлера необходимо:
- 
Реализовать новый Filler, производный от класса
scenarios.scenario_models.field.field_filler_description.FieldFillerDescription. При этом необходимо реализовать метод extract, который вызывается для извлечения объекта, заполняющего слот (Field):extract(self, text_preprocessing_result: TextPreprocessingResult, user: User,
params: Dict[str, Any] = None) -> Optional[str] - 
Создать класс SmartAppResources (подробнее в Расширении фреймворка).
 - 
Добавить в метод
SmartAppResources.init_field_filler_descriptionследующую строку:field_filler_description["my_filler_name"] = MyFillerгде
my_filler_name- это тип (type), с помощью которого можно вызывать объект в DSL.