← Проекты

Разработка D2Tech · в продакшене

AI-ассистент и CRM для продавцов Avito

Бот отвечает покупателю от имени магазина, с настоящей ценой и настоящим наличием, и не даёт увести сделку мимо площадки. Рядом CRM: несколько магазинов ведутся из одного окна.

1 инженер2 сервиса — бот и CRM

Задача

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

У продавца с несколькими магазинами к этому добавляется вторая беда: каталог, публикация объявлений и продажи живут в разных местах, и общей картины нет нигде.

Что сделали

Отвечает про ваш товар, а не вообще

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

Не говорит лишнего

Модель может сгенерировать что угодно, и мы на это не рассчитываем. Поверх стоит слой правил: попросили телефон или предложили перевести деньги «на карту, так дешевле» — ответ перехватывается.

Несколько магазинов из одного окна

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

Видно, что происходит

Воронка от просмотра до заказа, статистика по каждому товару, список позиций, которые остывают.

Почему этому можно верить

Наличие
Проверяется живым запросом к площадке на каждое сообщение. Кэш мы сознательно не ставили: лишний запрос дешевле, чем пообещать товар, которого уже нет.
Политика
Правила детерминированные, и на них написан отдельный набор состязательных тестов. Не «модель обычно ведёт себя хорошо», а проверено, что её нельзя уговорить.
Фид
Выгрузка объявлений покрыта golden-тестами. Если формат сдвинулся на байт, тест это покажет раньше площадки.
Деплой
В прод уезжает только зелёный пайплайн: ruff, mypy в строгом режиме, pytest. Не прошло — не поехало.
Прод
Контейнеры read-only и non-root, права урезаны. Метрики и алерты в Prometheus и Grafana, логи структурированные.

Как устроено

Бэкенд
Python 3.12, FastAPI, SQLAlchemy 2 (async) и Alembic, asyncpg, Pydantic v2, structlog, tenacity, httpx.
Модель
GigaChat через langchain-gigachat. LangGraph подключён как альтернативный движок оркестрации диалога — в проде выключен, но проверен parity-тестами.
Данные
PostgreSQL 16, две логические базы — бот и CRM. Redis: кэш сессий, дедупликация вебхуков, очередь исходящих.
Доступ
Argon2 для паролей, JWT в httpOnly-cookie, CSRF-токены на мутациях.
Фронтенд
Next.js 15, React 19, TypeScript, Tailwind CSS 4, TanStack Query, Chart.js.
Инфраструктура
Docker Compose с раздельными dev- и prod-оверлеями, Caddy 2 с авто-TLS, GitHub Actions с автодеплоем, Prometheus + Grafana + Alertmanager.
Тесты
pytest и pytest-asyncio, юнит- и интеграционные наборы в обоих сервисах, состязательный набор на контент-политику, golden-тесты фида.

Метод

Один инженер в паре с Claude Code. Рутину — типовые эндпоинты, тесты, миграции — писали агенты. Архитектура, границы сервисов и ревью каждой строки остались за человеком.

Похожая задача?

Опишите её — пришлём скоуп и смету за 24 часа: