Я работаю в продажах ИТ-оборудования и веду проекты системной интеграции. Хороший клиент для меня – компания, которой прямо сейчас нужны серверы или система хранения данных. Такие компании сами о себе сообщают. Они публикуют закупки, где написано, что нужно, сколько и к какому сроку.

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

Эту подготовку я отдал ИИ-агенту. Проект называется AI Tender Radar. Он работает в боевом режиме, а исследовательская часть открыта на GitHub. Код, как и в остальных моих проектах, писали ИИ-агенты под моим руководством. Я ставил задачи, проверял результат и запускал.

Как закупка попадает к агенту

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

Дальше программа скачивает документы и достает из них текст. Агент читает PDF, DOCX, DOC, XLSX, TXT и архивы ZIP и 7z. Сканы без текстового слоя, RAR и старый XLS он пока не читает. Такой файл отмечается как пробел в данных, и агент ищет сведения в других местах.

Что получает менеджер

Менеджер получает в Telegram карточку на один экран. В ней четыре блока.

  • Потребность. Что за оборудование, сколько и к какому сроку. Это берется из технического задания, а не из заголовка закупки, потому что заголовок часто ничего не говорит.

  • Заказчик. Выручка, прибыль и капитал за последний опубликованный год по отчетности ФНС.

  • Контакт. Телефон, а если нашелся конкретный человек – его имя и роль.

  • Начало разговора. С чего начать звонок и какие вопросы задать по документам.

Макет карточки на учебных данных.

Под карточкой две кнопки, «В работу» и «Мимо». Ответом на карточку можно оставить заметку. Новые лиды и лиды в работе выгружаются в Excel. Карточки приходят по будням в 9, 12 и 15 часов по Москве, а закупки с истекшим сроком приема не приходят вовсе.

Агент сам никому не звонит и не пишет. Он готовит карточку, а решение и разговор остаются за менеджером. Цен и возможностей продавца агент не знает, поэтому никаких условий поставки в карточке нет.

Первая версия была цепочкой кода

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

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

Во второй версии я поменял подход. Теперь закупку разбирает агент. Я даю ему инструменты и объясняю задачу в инструкции, а какие файлы и страницы открыть и когда остановиться, он решает сам.

Как агент ищет, кому звонить

У агента набор инструментов только для чтения:

  • прочитать закупку и ее документы,

  • поискать в интернете,

  • открыть страницу сайта или PDF,

  • получить отчетность компании из ФНС.

Порядок поиска задан в инструкции. Сначала сама закупка и ее документы, потом сайт заказчика, потом открытые источники. Найденное агент оформляет в карточку.

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

Когда агент не нашел названного человека с телефоном, закупка уходит второй, резервной модели. В открытой версии по умолчанию основная модель – Qwen 3.7 Flash, резервная – DeepSeek v4.1 Flash, обе через OpenRouter.

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

Почему телефону в карточке можно верить

Главный риск ИИ в продажах – выдуманный телефон. Модель может написать правдоподобный номер, которого нет ни в одном источнике. Менеджер позвонит, попадет не туда и перестанет доверять карточкам.

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

  • Телефон сверяется по цифрам. Программа ищет десятизначное ядро номера во всех цифрах прочитанных текстов, записанных подряд.

  • Имя сверяется по частям, с учетом падежных окончаний.

  • Почта сверяется буквально, без учета регистра.

Чего в прочитанном не нашлось, то из карточки удаляется. После этого программа заново ставит оценку. A – названный человек с телефоном. B – телефон без имени, например номер отдела или приемной, или контакт из стороннего справочника. C – телефона нет. Менеджеру приходят только A и B. Закупки с оценкой C остаются в журнале.

У проверки есть пределы.

  • Совпадение цифр не доказывает, что номер принадлежит этому человеку и что он еще работает. Это выясняется звонком.

  • Цифры изредка могут совпасть случайно, если сложатся из соседних чисел в тексте.

  • Добавочный номер не проверяется.

Зато выдуманный номер до менеджера не доходит.

Мелочи, без которых система раздражает

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

  • Повторы. Одна закупка не должна приходить дважды. Программа хранит отпечаток данных, которые видит агент. Служебные обновления на площадке новую версию не создают. Если заказчик действительно изменил закупку, карточка придет снова с пометкой об обновлении. Если менеджер уже нажал «Мимо», это учитывается.

  • Ожидание документов. Если документы еще не скачались, а до конца приема больше суток, исследование ждет. Иначе агент разбирал бы закупку вслепую.

  • Отправка. Если Telegram ответил неоднозначно, карточка автоматически не отправляется повторно. Лучше одна потерянная карточка, чем пять одинаковых.

  • Сбои. Если что-то сломалось, система сообщает об этом один раз, напоминает через сутки и отдельно пишет, когда все восстановилось.

Что получилось

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

Главное изменилось в работе менеджера. Документы перед звонком он больше не читает. Он открывает карточку и звонит.

Что открыто

На GitHub лежит исследовательское ядро: агент, инструменты, проверка контактов, карточки, журнал, доставка в Telegram, кнопки, заметки и выгрузка в Excel. Там же пример инструкции для агента и 726 автоматических тестов на синтетических данных. Лицензия AGPL-3.0.

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

Репозиторий: github.com/pavel-logachev/ai-tender-radar

Вместо вывода

Агент хорошо справляется с тем, что раньше требовало десятка веток в коде. Он читает разнородные документы и ищет контакты в неочевидных местах. Там, где ошибка стоит дорого, в нашем случае это телефон в карточке, решает простая проверка кодом. Так я и строю ИИ-агентов для бизнеса. Модель ищет и читает, а код проверяет то, где ошибаться нельзя.

Если вы продаете что-то компаниям и ищете их через закупки, такого агента можно настроить под ваш товар и ваши площадки. Нужно только, чтобы данные о закупках можно было получать программно. Пишите в Telegram @pavel_logachev, обсудим.