Помощник в формах
Формы открываются заполненными, а частые дела делаются в одно-два действия: ТЗ «Пользоваться системой играючи». «Играючи» — значит легко, а не игра: достижений, очков и уровней нет. Мерило — сколько сотрудник набрал руками и сколько нажал.
План «ИИ повсеместно, но уместно» (05.10.2026): помощник в нужный момент (вставка текста, файл на форму), формы финансов и склада, команды словами из поиска, замер исправленных полей и отчёт руководству — разделы ниже. Миграции
0185(form_fill_stats.edited_labels),0186(индексы ИНН для выписки банка).Этап 2 (01.10.2026): «Из файла» (
POST /ai/extract/form) и формы менеджера — проект, контактное лицо, командировка, заявка на логистику.Реализовано (этап 1, 01.10.2026): модуль
internal/modules/formassist, действие помощникаform_fill(internal/modules/assistant/formfill.go), миграция0179(form_memory,form_fill_stats).
Как устроено
Одна механика на все формы. Во фронте форма описывает свои поля (useFormAssist) и ставит над собой строку AiFormAssist.
| Часть | Что делает |
|---|---|
| «Из файла» | Скрепка рядом с микрофоном: письмо, ТЗ, визитка, фото или скан (PDF, DOCX, XLSX, текст, изображения до 10 МБ) → те же поля. Слова в строке — уточнение к файлу. Фото и сканы читает модель, которая видит изображения |
| «Опишите словами» | Фраза или диктовка (микрофон рядом) → POST /ai/actions/form_fill со схемой полей, справочниками формы и контекстом страницы → значения полей. Строки нет, если помощник выключен или выключена функция «Формы» |
| Подсветка | Подставленное поле подсвечено и подписано «Заполнено помощником: откуда взял» или «Как в прошлый раз» — до первой правки человеком. «Отменить подстановку» возвращает поля, как были |
| Память вводов | Поля с пометкой remember открываются значением с прошлого сохранения: задача в «Добавить часы», кто на связи в отсутствии, проект в новой задаче. Хранится на сервере — видно с любого устройства. Работает и без помощника |
| Замер | При сохранении форма пишет: полей всего, подставлено не руками, из них исправлено, время от открытия до сохранения, был ли помощник и память |
Ничего не сохраняется само: форму сохраняет кнопка человека.
Проверка ответа модели
Сервер не доверяет модели. Из ответа остаются только поля схемы, и каждое приводится к своему типу:
- выбор (
select) — толькоvalueиз присланных вариантов; модель ответила названием — оно сопоставляется с вариантом, иначе поле отбрасывается; - дата —
ГГГГ-ММ-ДД; чтобы «в пятницу» превратилось в дату, модель получает календарь на ближайшие недели с днями недели; - часы — от 0 до 24 с шагом 0,25; деньги — неотрицательные, до копеек; число (
number) может быть со знаком, например в корректировке часов; - текст обрезается до предела поля.
Поле-выбор без вариантов модели не отправляется. Тексты сотрудника и контекст — данные, а не указания модели.
Дата принимается и в виде «ДД.ММ.ГГГГ» — модель иногда пишет её по-русски.
Длинный справочник — без угадывания. Список больше 30 вариантов (сотрудники, проекты, компании) — справочник записей, а не перечень видов. Вариант из него сервер принимает, только если его название встречается в словах или тексте документа: хотя бы одно слово от 4 букв с запасом на окончание («Иванову» — «Иванов Пётр»). Так «рядом с Казань Экспо» не превращается в проект «ТехноЭкспо». Фронт по той же причине отправляет из длинных списков только упомянутые варианты (с файлом — упомянутые первыми, остальные до 300), и запрос остаётся коротким.
Слова и документ — целиком. Данные формы (поля, справочники, календарь) идут модели как «Данные из RMS», где каждая строка режется до 1500 символов, а весь блок — до 12 000 байт. Слова сотрудника и текст документа идут отдельным блоком после данных (actionPlan.material) — целиком, до 4000 символов слов и 30 000 символов документа. До 05.10.2026 они лежали в данных: длинный справочник вытеснял слова, а документ обрезался до 1500 символов. Секреты вырезаются из всего запроса на уровне провайдера (guardedProvider).
Формы этапа 1
| Форма | Ключ | Поля | Память |
|---|---|---|---|
| «Добавить часы» в табеле | time_entry | задача, дата, часы, комментарий | задача |
| «Добавить часы» в задаче | task_time_entry | дата, часы, комментарий | — |
| Отсутствие | absence | вид, с, по, часть дня, кто на связи, комментарий | кто на связи |
| Новая задача | task_create | название, проект, ответственный, срок, план часов, описание | проект |
| Корректировка часов | timesheet_correction | дата, по дату, часы со знаком, причина; кнопка «Сформулировать» (correction_reason) | — |
Формы этапа 2 (менеджер)
| Форма | Ключ | Поля | Из файла | Память |
|---|---|---|---|---|
| Новый проект | project_create | название, клиент, вид, даты, монтаж, менеджер, контакт, площадка, бюджет, описание | письмо, ТЗ | — |
| Новое контактное лицо | contact_create | фамилия, имя, компания, должность, телефон, почта, комментарий | визитка, подпись письма | — |
| Новая командировка | trip_create | кто, проект, откуда, куда, даты, транспорт, проживание, плановые расходы, цель | письмо | откуда |
| Заявка на логистику проекта | logistics_request | название, откуда, куда, отгрузка, доставка, комментарий логисту | ТЗ, письмо площадки | откуда |
Компания по-прежнему заполняется «Реквизитами из файла» (карточка предприятия, договор, счёт) со сверкой с ЕГРЮЛ.
Комментарий к задаче: микрофон и кнопка помощника «черновик или дописать» (reply_draft по задаче).
Формы финансов и склада
| Форма | Ключ | Поля | Из файла |
|---|---|---|---|
| Новый платёж | payment_create | направление, сумма, НДС, дата, способ, контрагент, назначение, проект | счёт, платёжка, акт |
| Обязательство | obligation_create | название, направление, сумма, дата, число месяца (постоянный), контрагент, проект, ответственный, комментарий | договор |
| Договор | contract_create | номер, контрагент, предмет, сумма, даты подписания и действия, автопролонгация, заметки | файл договора |
| Оборудование | equipment_create | название, категория, серийный номер, количество, единица, цена, поставщик, заметки | фото, накладная |
Суммы и даты модель берёт из документа, а не считает; проверяет и сохраняет человек. Выписку банка разбирает код — см. Выписка банка.
Помощник в нужный момент
Строка «Опишите словами» слушает всю форму, в которой стоит:
- Вставка текста. В любое поле вставили от 80 символов (или от трёх строк) — над формой «Вставили текст — разложить по полям?». Сами ничего не запускаем.
- Файл на форму. Перетащили файл на форму, которая принимает файлы, — «Отпустите файл — помощник заполнит форму» и заполнение «Из файла». Своя зона загрузки формы (вложения задачи) обрабатывает файл сама — она отменяет действие по умолчанию раньше.
Карточки-выводы — только когда экономят время:
- «Что я пропустил» в чате — от 10 непрочитанных на момент открытия чата.
- «Кратко о задаче» — от 8 комментариев и сообщений чата задачи (
discussion_countвGET /tasks/:id) или описание от 700 символов. - «Итоги проекта» (
project_report) — вместо сводки, когда проект сдан или закрыт; с кнопкой «Скопировать». - «Письмо о долге» / «Напомнить об оплате» (
invoice_reminder) — в просмотре выставленного неоплаченного счёта в «Продажах» и в документах проекта: тон «обычно / мягче / официальнее», «Скопировать», «Открыть в почте». Отправляет сотрудник сам.
Команды словами
В поиске ⌘K фраза о деле («отметь 3 часа монтаж на ТехноЭкспо», «поставь задачу…», «в отпуск с 16 по 20») даёт первой строкой «Сделать: …». Какую форму открыть, решает код по словам (src/components/ai/formCommands.ts, порядок — от частного к общему); раскладывает фразу по полям уже form_fill. Поиск кладёт фразу в очередь (queueFormCommand) и переходит на страницу формы с ?new=<ключ формы>; страница открывает форму (useOpenFormFromRoute), форма при открытии забирает фразу (takeFormCommand в useFormAssist.start) и заполняется, когда загрузятся обязательные справочники (не дольше 4 секунд). Команда показывается, только если раздел открыт по правам и включена функция «Формы».
Частые дела в одно-два действия
- Кольцо дня в шапке ведёт в «Мои часы».
- «Что сделать сегодня» — блок над главной любой роли:
- неотмеченные часы — кнопка «В табель»;
- заявки на отсутствие, ждущие моего решения, — «Согласовать»; больничные — «Принято»;
- задачи с прошедшим сроком или сроком сегодня — «Начать» или переход к задаче.
- Действия из уведомлений: заявка на отсутствие → «Согласовать»; больничный → «Принято»; сообщение или упоминание в чате → «Ответить» (поле с микрофоном прямо в колокольчике).
- Отмена вместо подтверждения. Смена статуса задачи — в карточке и перетаскиванием на доске — делается сразу. Тост 10 секунд предлагает вернуть прежний статус. Подтверждение остаётся только для необратимого и денег.
Помощник — только про работу
Свободного чата нет. На вопросы не о работе в RMS помощник одной фразой вежливо отказывает и предлагает, чем помочь в системе (AI-помощник).
API
| Метод | Путь | Описание |
|---|---|---|
POST | /api/v1/ai/extract/form | multipart: file, form (JSON схемы), text? → как form_fill |
POST | /api/v1/ai/actions/form_fill | {text, form: {form, title, fields[], context?}} → {values, reasons}; функция forms |
GET | /api/v1/forms/:form/memory | Значения формы с прошлого сохранения |
PUT | /api/v1/forms/:form/memory | {values} — до 30 коротких значений: строки, числа, да/нет |
POST | /api/v1/forms/:form/stats | Замер сохранения, ответ 204 |
GET | /api/v1/forms/stats?days=30 | Сводка по формам и top_edited; право ai.manage |
GET | /api/v1/forms/report?days=30 | Помощник по отделам и формам — руководству |
Метрики
Замер хранит и подписи исправленных полей (edited_labels): сводка показывает до трёх полей, которые чаще всего исправляют. Форма от 5 сохранений с долей исправлений больше 20 % помечена «Нужна доводка» — подсказку в этих полях чинят или убирают.
Отчёт руководству (GET /forms/report, «Отчёты → Помощник в работе»): по основному отделу сотрудника — сотрудников, кто пользовался (обращения к помощнику или форма с ним), обращений, форм сохранено и с помощником, сэкономлено минут, три частые функции; по формам — медиана без помощника и с ним и экономия на заполнение (от 3 замеров с каждой стороны). Людей поимённо нет. Доступ — отчёты «все» по матрице, глобальный администратор или ai.manage; руководитель отдела (охват «свой») не видит.
Цели ТЗ: от 70 % полей заполнено не руками (auto_share), меньше 20 % подстановок исправлено (edit_share), время заполнения вдвое меньше (median_sec против median_ai_sec). Сводка — GET /forms/stats; первый замер — через неделю после выката этапа.