Пульт мультиагентной системы
в эксплуатации
Пул автономных ИИ-агентов, которым управляют с телефона. Каждый агент —
изолированная сессия и отдельный тред в чате; агенты работают параллельно
и переживают перезапуск управляющего сервиса.
Задача
Один человек не может держать в голове десяток параллельных задач и
не может сидеть у терминала круглосуточно. Нужен пульт: запускать
агентов, раздавать им работу и следить за состоянием откуда угодно.
Решение
- Управляющий сервис — клиент к сессиям на хосте, а не их владелец: агенты живут своей жизнью и не умирают вместе с ним.
- Маршрутизация по тредам чата: тред — это агент, «активного агента» нет вовсе, поэтому параллельные диалоги не путаются.
- Простаивающие агенты усыпляются через десять часов: сессия освобождает ресурсы, идентификатор диалога сохраняется, следующее сообщение прозрачно продолжает разговор с полным контекстом.
- Управление кнопками: команды и переключение режимов — без набора текста с телефона.
Нетривиальное
Разбор аварии, в которой сервис встал целиком и агентов нельзя было
поднять из чата. Наложились три независимых сбоя: юнит автозапуска
упал, но система считала его успешным; авто-сон убрал последнего
агента; после этого сервис поднимал сессии не там, где нужно, и
каждый раз получал код успеха. Причина найдена, устранена и
зафиксирована письменно — вместе с выводом, что «команда вернула
ноль» не равно «команда сработала».
6 600строк
218автотестов
59коммитов
6ADR
Python · Telegram Bot API · tmux · Docker · systemd · pytest
Семантический разбор документов
в эксплуатации · две среды
Флагман. Извлекает сущности из длинных документов так, чтобы каждый факт
прослеживался до точного места в исходном тексте, а качество извлечения
было не мнением, а числом.
Задача
Разобрать документ на сотни страниц на объекты, признаки и действия,
свести упоминания одного и того же к одной сущности и построить
производственные документы поверх результата. Языковая модель при
этом не должна быть источником истины о позициях в тексте — иначе
результат нельзя проверить.
Решение
- Конвейер вместо одного запроса к модели: морфологический разбор, классификация по ветвям, дедупликация по леммам, отдельная корзина отброшенного с причинами. Замер: 93,2 % recall против 90,9 % у одношагового решения.
- Сменные провайдеры моделей за одним швом — облачные, локальные, гибрид, ансамбль и уточняющий проход; переключение не затрагивает остальной код.
- Эмбеддинги и поиск близких сущностей; схема хранения спроектирована так, чтобы перенос на промышленную векторную базу не менял API.
- Единый бюджет параллельных запросов на весь конвейер: раньше три независимые настройки перемножались, и «пять» на деле означало двадцать пять одновременных запросов к модели.
- Потоковая выдача: части документа считаются параллельно, а записываются строго по порядку текста — от этого зависит корректность результата.
Нетривиальное
Eval-харнесс с эталонными наборами и оценкой моделью-судьёй. Любое
изменение промпта или конвейера проверяется замером: улучшает
метрику — остаётся, не улучшает — откатывается. Именно этот
инструмент превращает работу с языковыми моделями из угадывания в
инженерию, и именно его чаще всего не хватает командам,
внедряющим ИИ.
42 600строк
112тестовых модулей
71коммит
6ADR
Python 3.12 · FastAPI · Pydantic v2 · SQLite · spaCy · pymorphy3 · эмбеддинги · uv · pytest · Docker
Агент-аналитик рынков
рабочий инструмент
Заказчик задаёт тему — агент проводит исследование и возвращает основание
для решения: вкладываться или нет и какую гипотезу проверять первой.
Задача
Решения о новых направлениях чаще всего принимаются по ощущениям.
Нужен инструмент, который за день даёт по теме проверяемую картину:
кто уже занял рынок, где барьер входа, что придётся проверить
деньгами.
Решение
- Шесть обязательных вопросов к каждой теме — исследование нельзя закрыть, пока они не закрыты.
- Факт отделён от вывода: в отчёте видно, где данные, а где интерпретация. Читающий может не согласиться с выводом, не переспрашивая про источник.
- Результат — опубликованная страница со ссылкой, а не файл в переписке.
Результат
Две темы закрыты вердиктом. По одной — рекомендация не заходить
широким фронтом: ниша плотно занята сверху и снизу, продуктового
барьера нет, работает только связка отраслевой специализации,
доверия и собственной аудитории; предложен дешёвый способ проверить
гипотезу до вложений. Отказ от плохой идеи экономит больше, чем
удачный пилот.
2темы закрыты
5отчётов опубликовано
6обязательных вопросов
ИИ-агент · веб-исследование · публикация отчётов · регламент качества
Многопользовательский ИИ-чат
в эксплуатации
Веб-чат с ИИ-агентом для команды: у каждого сотрудника своё пространство,
свои проекты и своя база знаний.
Задача
Дать команде доступ к сильному ИИ-агенту, не раздавая каждому доступ
к серверу и не смешивая рабочие пространства сотрудников.
Решение
- Вход по логину и паролю без саморегистрации; изоляция проверяется на каждом запросе, а не только в интерфейсе.
- Проекты с базой знаний: общие инструкции и файлы, которые агент читает при работе.
- Загруженные Word и PDF автоматически превращаются в текст — иначе агент видит бинарный файл и отвечает наугад.
- Потоковый ответ: текст появляется по мере генерации, а не через минуту ожидания.
Нетривиальное
Изоляция сотрудников — это не флажок в интерфейсе. Каждый агент
работает в своём каталоге и с системной инструкцией не выходить за
его пределы, а проверка принадлежности данных стоит на каждом
эндпоинте.
Node.js · Express · SQLite · SSE-стриминг · конвертация документов · Docker · Caddy
Корпоративная почта на своём сервере
в эксплуатации
Почта домена на десять сотрудников целиком на своей инфраструктуре:
приём и отправка, веб-почта, подписи писем, бэкапы.
Решение
- Свой почтовый сервер и веб-почта в контейнерах; наружу открыты только нужные почтовые порты, весь веб — через общий прокси.
- Подписи и политики домена настроены полностью: письма проходят проверки на стороне получателя.
- Расписание: ежедневный перенос обновлённого TLS-сертификата и ежедневный бэкап.
Нетривиальное
Две диагностические ловушки, каждая из которых выглядит как сетевая
проблема. Встроенная защита сервера от сканирования приняла за
злоумышленника собственный обратный прокси и заблокировала его —
админка отдавала ошибку, хотя напрямую всё работало. А входящие
письма молча уходили в спам, потому что свежий домен получал
штрафные баллы за возраст. Обе причины найдены замером, а не
перебором, и записаны, чтобы не искать их заново.
10ящиков
2задачи по расписанию
SMTP · IMAP · DKIM / SPF / DMARC · MTA-STS · автонастройка клиентов · Docker · Caddy · cron
Чат со сменными моделями
в эксплуатации
Веб-чат, где модель выбирается на лету: один интерфейс, десятки моделей
разных поставщиков через единый шлюз.
Зачем это бизнесу
Привязка к одному поставщику моделей — риск и по цене, и по
доступности. Единый шлюз позволяет сравнивать модели на своих
задачах и менять их без переписывания приложения.
Решение
- Вход по паролю с хешированием, без саморегистрации; учётки задаются администратором.
- Вложения — текст и изображения; потоковый ответ.
- Ключи и секреты только в переменных окружения, в репозиторий не попадают.
Python · FastAPI · OpenRouter · SSE-стриминг · SQLite · Docker · Caddy
Служба уведомлений съёмочной группе
в эксплуатации
Доставка сообщений десяткам участников производства в мессенджер.
Отдельный сервис — по осознанному архитектурному решению, а не по
привычке дробить.
Нетривиальное
Соблазн был добавить рассылку в существующий бот: код почти тот же.
Но у того бота единственный разрешённый пользователь — владелец
сервера, а здесь десятки посторонних людей. Это разные модели
доступа, и держать их в одном процессе опасно. Решение и его цена
записаны отдельным документом.
Граница ответственности
Служба ничего не решает сама: кому и что писать, определяет основной
сервис — закрытый список событий, тихие часы, адресация по вызывному
листу. Здесь только доставка и статус.
650строк
1ADR-обоснование
Python · Telegram Bot API · Docker · собственный контур доступа
Цифровая личность в мессенджерах
исследование и реализация
Агент, который ведёт переписку от лица владельца по заданным инструкциям,
а вся история собирается в одном месте.
Решение
- Характер и правила поведения агента вынесены в отдельные редактируемые документы, а не зашиты в код.
- Вся входящая и исходящая переписка складывается в единое хранилище для чтения в одном месте.
Нетривиальное — границы
Из технического задания сознательно исключены сбор участников групп и
построение графа связей: технически это просто, но создаёт слежку и
выглядит как бот-ферма. При общении с другими людьми раскрытие того,
что отвечает ИИ-агент, — обязательное требование, а не опция. Умение
вовремя сузить скоуп по этическим соображениям я считаю частью
инженерной работы.
Python · MTProto · хранилище переписки · Docker
ИИ-агент контекстной рекламы
ТЗ и архитектура готовы
Агент, управляющий рекламными кампаниями: анализирует статистику,
предлагает и вносит изменения ставок и бюджетов в заданных границах.
Решение
- Политики безопасных изменений вынесены в отдельный конфигурационный файл: агент физически не может выйти за рамки допустимого изменения бюджета.
- Техническое задание и архитектура проработаны до начала кода, включая разведку ограничений рекламной площадки.
Честный статус
Реализация не начата: работу держат два внешних блокера, не
зависящие от разработки. Показываю проект именно в таком виде — по
нему видно, как я готовлю задачу до написания кода, и что я не
называю готовым то, что не работает.
2ADR
0строк кода — и это заявлено прямо
Яндекс Директ API · политики изменений · проектная документация