Skip to content

Референсный агент ​

Как устроен `policy-sync-agent`, единственный существующий внешний агент: что он делает, что объявляет платформе и какие случаи отправляет человеку.

Зачем эта страница ​

Протокол описывает, как платформа разговаривает с агентом. Эта страница показывает, что получается, когда протокол реализован полностью. Она полезна двумя способами: как пример для тех, кто пишет своего агента, и как справка по тому агенту, который работает сейчас.

Что делает агент ​

Забирает из почтового ящика письма страховых компаний со списками застрахованных, читает приложенные списки, определяет, какой программе соответствует каждая строка, находит человека во внешней медицинской системе и отправляет по каждой строке типизированный запрос на прикрепление или открепление. Строки, которые решить не удалось, откладывает человеку.

Конвейер обработки ​

ШагЧто происходит
Опрос почтыОпрос ящиков по расписанию агента. При первом опросе запоминается текущая позиция, поэтому старая почта не обрабатывается. Письма и вложения складываются в хранилище, повторы отсеиваются по идентификатору письма и контрольным суммам
Учёт по письмуНа каждое письмо ведётся сводка: сколько вложений, сколько заданий, сколько успешных, сколько в разборе, сколько с ошибками
Создание заданийПо одному заданию на вложение
Извлечение содержимогоСпособ выбирается по расширению: таблицы читаются напрямую, документы и изображения через разбор разметки с распознаванием текста
Определение типа документаЯзыковая модель по отправителю, теме и содержимому определяет вид письма: прикрепление, открепление, изменение, гарантийное письмо, не по адресу или нужен человек
Извлечение полейДля таблицы с заголовком модель определяет только смысл столбцов, а сами данные читаются детерминированно. Для неструктурированного текста работает отдельный разбор
НормализацияПриведение имён, определение пола по отчеству, обработка франшизы, проверка того, что один список относится к одному страховщику, договору и программе
Сопоставление программыПрограмма определяется по утверждённому соответствию. Ни одного совпадения или несколько означают отправку человеку
Поиск человекаТолько точное совпадение. Ноль или несколько результатов означают отправку человеку
Сборка запросаОдна строка может превратиться в несколько операций
ОтправкаРезультат либо успех, либо отказ внешней системы, либо неизвестный исход
Реестр и артефактыСнимок результата, перестройка реестра по людям и трассировка конвейера

Списки на изменение человек обрабатывает всегда

Письмо, все строки которого означают изменение, во внешнюю систему не отправляется никогда: оно сразу уходит в ручной разбор. Это заложено осознанно.

Что агент объявляет платформе ​

Описание себя ​

ПолеЗначение
Версия протокола1.0
Типpolicy-sync
Версия расширения интерфейса1.1

Возможности ​

Агент реализует протокол практически целиком: настройки и их схема, история событий и поток событий, задания, спорные случаи, исправление полей, выбор кандидата, безопасное возобновление, учёт писем, замена документа, почтовые ящики, реестр операций, получение модели от платформы, свои разделы интерфейса.

Встроенные страницы через iframe агент не объявляет.

Команды ​

Восемь команд.

КомандаЧто делает
enableВключить работу агента
disableВыключить работу агента
validate-settingsПроверить текущие настройки
poll-nowОпросить указанный ящик прямо сейчас и обработать всё, что нашлось
retry-jobПовторить конкретное задание
check-omis-connectionПроверить связь с внешней системой
refresh-omis-catalogПеречитать справочник программ
check-llm-connectionПроверить доступность языковой модели

Команда принимается кодом 202 и возвращает идентификатор операции. Состояния операции: принята, выполняется, успешно, ошибка, отменена. По завершении агент отправляет событие.

Разделы интерфейса ​

Агент объявляет пять разделов, и платформа рисует их сама.

ПорядокРазделЧто показывает
20Почтовые ящикиИсточники писем, с полным управлением
30НастройкиФорма по схеме агента
40Реестр операцийПо строке на человека, с выгрузкой
50Ручной разборОчередь спорных случаев с действиями
60ПисьмаУчёт обработки каждого письма

Дополнительно агент расширяет платформенный раздел «Задания»: добавляет свои столбцы, свои подписи состояний, раздел карточки с обменом и действие повтора задания.

Разбор всех разделов с экранами на странице Разделы карточки агента.

Ревизия описания разделов

Ревизия это отпечаток содержимого, а не счётчик. Она стабильна при перезапуске агента и меняется, только когда состав разделов действительно изменился. Описание сверяется с эталонным файлом в тестах, поэтому незамеченное изменение состава разделов невозможно.

Спорные случаи ​

Как случай попадает в очередь ​

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

Повторы не создают второй случай: при совпадении задания, строки, причины и ревизии контекста случай дополняется, а его версия увеличивается.

Каталог причин ​

Двадцать одна причина. Название причины это то, что оператор видит в столбце «Случай».

ПричинаНазвание для оператораПриоритет
classification_ambiguousНужно определить тип документаВысокий
field_extraction_rejectedНужно исправить распознанные поляВысокий
normalization_validation_failedНужно исправить данные документаВысокий
change_list_manualСписок на изменение, обрабатывается вручнуюОбычный
program_mapping_not_foundНе найдена программаВысокий
program_mapping_ambiguousНужно выбрать программуВысокий
patient_not_foundПациент не найденВысокий
patient_ambiguousНужно выбрать пациентаВысокий
attachment_not_foundПрикрепление пациента не найденоВысокий
attachment_ambiguousНужно выбрать прикрепление пациентаВысокий
equivalent_attachment_existsПохожее прикрепление уже существуетВысокий
omis_write_disabledОтправка отключенаВысокий
omis_operation_rejectedВнешняя система отклонила операциюВысокий
omis_submission_recovery_requiredНужно безопасно продолжить отправкуКритический
omis_outcome_unknownНеизвестен результат операцииКритический
processing_retry_exhaustedАвтоматические попытки исчерпаныКритический
processing_final_failureЗадание завершилось технической ошибкойКритический
no_attachmentВ письме нет вложений для обработкиОбычный
unsupported_packageАрхивы не обрабатываютсяВысокий
legacy_manual_reviewЗадание требует вниманияВысокий
tracking_violationДокумент зарегистрирован, но задание отсутствуетКритический

Причина определяет набор действий

У каждой причины свой список разрешённых действий и своя точка возобновления. Например при неоднозначной программе оператор выбирает программу, а при исчерпанных попытках доступен безопасный повтор. Платформа показывает только те действия, которые причина разрешает.

Действия оператора ​

ДействиеЧто делает у этого агента
Исправление полейПравит распознанные значения. Разрешены 17 полей: действие, части имени, дата рождения, пол, номер полиса, даты действия, страховщик, договор, программа, работодатель, франшиза. Исходное извлечение при этом не меняется, правки ложатся отдельным слоем
Выбор программыВыбор из предложенных вариантов. Дополнительно проверяется, что справочник и соответствие ещё действуют
Выбор пациентаВыбор из предложенных вариантов
Выбор прикрепленияВыбор из предложенных вариантов
ВозобновлениеВозврат случая агенту. Точку возобновления выбирает сам агент по причине случая. Если задание завершилось ошибкой, создаётся связанное восстановительное задание
Закрытие случаяЗакрытие решением оператора. Допустимые виды решения зависят от причины
Загрузка замены документаПриём исправленного файла вместо исходного. Принимаются только таблицы, размер до 20 МиБ, проверяются и расширение, и первые байты файла

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

Подтверждение исхода

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

Долгие действия выполняются в фоне: агент отвечает кодом 202, а состояние операции можно опрашивать отдельно. Незавершённые операции восстанавливаются при перезапуске агента.

Данные, которые уходят в платформу ​

Перед тем как отдать данные раздела платформе, агент вычищает всё, что похоже на пароли, ключи, токены и учётные данные: названия полей остаются, значения заменяются пометкой. Затем данные помечаются как прошедшие маскирование, потому что без этой пометки платформа их не примет.

Поля с персональными данными агент помечает отдельно, чтобы платформа могла проверить право на их просмотр.

Незаявленные параметры запроса отбрасываются, а размер страницы ограничивается и объявленным пределом раздела, и общим пределом платформы.

Состояние агента ​

Агент сообщает платформе признак включения, состояние, время запуска, время последней активности, число активных и очередных заданий и список деградированных составляющих.

СостояниеКогда
runningОбычная работа
stoppedРабота выключена настройкой
degradedНет доступной языковой модели, либо внешняя система включена, но не настроена

Работа на собственной модели вместо модели платформы деградацией не считается.

Документация платформы EVA