Привет! Меня зовут Абакар, я работаю главным техническим лидером разработки в Альфа-Банке.
Когда-то давно мне приходилось работать над стартапом, цель которого была — форкнуть основной клиент приложения Telegram и доработать его, а именно добавить в него ИИ-чат-ботов, с которыми можно было общаться. Но это было в далёкие времена, когда ИИ ещё не был на таком «хайпе», как сейчас.
Боль каждого лида — это ответы на сообщения в чатах, и вот недавно я задумался: а что, если спасти себя и заодно опробовать ИИ? Попробовать добавить в Telegram функциональность генерации ответа на сообщение и сделать это без глубокого погружения в исходный код, просто как продакт, который просит своего разработчика что-то для него сделать. Для этих целей я выбрал инструмент — Cursor, с которым общался в визуальном редакторе. Давайте посмотрим, получилось у меня или нет!
Также я делал ролик по данной теме на своём YouTube канале, подписывайтесь, если интересны ролики на похожие топики!
Для начала поймём, что делать

Итак, у нас действительно есть возможность форкнуть репозиторий Telegram, причём по разным платформам.
Android — https://github.com/DrKLO/Telegram
Нам нужно проделать несколько шагов:
1. Форк
В нашем случае мы будем форкать репозиторий для Android, но если захочется всегда есть возможность внедрить свои изменения и на другие платформы. Представим, что мы форкнули и собрали проект, всё хорошо.
2. API-ключи
Но перед тем как начинать внедрять свои замыслы нужно сделать ещё один небольшой шаг, а именно получить свои API‑ключи — api_id и api_hash. Инструкцию как их получить можно найти тут. Изначально в проекте будут тестовые ключи, и через некоторое количество запросов бэкенд Telegram вас заблокирует, и у вашего форка пропадет возможность работать.
Чтобы этого не произошло нужно сразу создать и добавить свои ключи. Также не стоит забывать, что у Telegram есть правила, которым должен соответствовать любой форк, который будет публиковаться. И самое крутое — вы сможете опубликоваться даже в официальных сторах!
3. Выбрать API для генерации ответов от ИИ
Нам нужно будет решить, какое API мы будем использовать, чтобы получить доступ к возможностям ИИ. Я хотел изначально подключиться к DeepSeek API и сделал это, но после обнаружил, что она была платной, а мне хотелось чего-то бесплатного для такого эксперимента. В итоге я нашёл такую замечательную штуку, как OpenRouter. Её возможностей для моих потребностей вполне хватало.
Внедрение изменений

Мы вооружились тулзой под названием Cursor, долгое обдумывание и выбор не понадобились, просто я хотел подойти к задаче с точки зрения человека без технической подготовки и посмотреть насколько у меня получится внедрить изменения, у Cursor есть визуальный редактор, что должно быть проще для не технического человека.
Мысль у нас такая — мы хотим в групповом чате при ответе на сообщение другого человека иметь возможность сгенерировать ответ с помощью ИИ на основе текста сообщения от собеседника.
Дадим Cursor первый запрос, который будет выглядеть так (орфография и пунктуация сохранены от автора):
I need to add button turn on neuro to chat activity, by press the button user can paste suggestion from deepseek to text input. You should call to open deepseek api.
I want use text from message to which i create reply as prompt.
If I hit «Generate» button without reply message — prompt should be created from my message which i entered in input field
Окей, мы запустили наш промпт и пойдём пить кофе, пока ИИ отбирает делает за нас всю работу. Давайте посмотрим, что мы обнаружим, когда вернёмся к компьютеру. Важный момент никаких технических ограничений мы в запросе не давали, а также не давали предпочтений по библиотекам, которые нужно использовать, поэтому Cursor использовал всё на своё усмотрение. Как думаете, сработало?
Сейчас мы посмотрим на гифку и поймём, что сработало, но пару небольших изменений после этого пришлось добавить (лоадинги, ошибки, отступы и так далее) и всё это так же делалось через промпты в Cursor без редактирования кода.

Работает и звучит это очень круто, учитывая, что я потратил минимум времени и усилий. А теперь посмотрим, что же Cursor нам нагенерил. Первое, что мы видим, так это то, что поменялся файл под названием ChatActivityEnterView. Файл, к слову сказать, — 14 тысяч строк, но это нужно просто принять, Telegram ведь круто и стабильно работает, поэтому может себе позволить иметь такую архитектуру, конечно вопрос насколько такая архитектура будет расширяемой остаётся открытым, но они дропают новые фичи довольно регулярно, поэтому никаких претензий тут быть не может.
Итак, мы видим, что в конструктор класса ChatActivityEnterView добавлен вызов нового метода под названием createNeuroButton. Сам класс наследуется от FrameLayout, то есть по сути это кастомная вьюха. Да чат в Telegram отображается через кастомную вьюху, такие дела.

Окей, Cursor уже помог нам с тем, чтобы найти место куда встроиться, а это дорогого стоит, я вспоминаю как сам копался в исходниках Telegram. На то, чтобы найти нужное место в коде могло уходить по 3-4 часа. Идём дальше, что же такого находится внутри метода createNeuroButton:

Тут просто программно создается кнопка (да да, забыл сказать тут всё на Java). И на эту кнопку вешается клик лисенер, который вызывает метод requestNeuroSuggestion(), посмотрим, что лежит в этом методе:

Видим, что у нас есть, некоторый набор проверок, например, что имеется DEEPSEEK_API_KEY (который потом на самом деле стал ключом для OpenRouterAI). А также вызывается ��етод resolveNeuroPromptText(). Заглянем теперь в него:

Видим как из replyingMessageObject достается текст, на который мы хотим сделать реплай, ну и плюс набор бойлерплейтных проверок, которые тянет сама java, а также есть доп функциональность если мы не делаем reply, а просто ввели текст в текстовое поле — то взять его в качестве промпта для ИИ. Итак в этом методе мы получаем заготовку под промпт для текста, вернёмся назад в requestNeuroSuggestion

К нашему промпту, полученному в resolveNeuroPromptText() добавляется темплейт, который выглядит так:
«Ты сноб который любит остро пошутить, и ты общаешься в групповом чате, как человек, отвечай на вопросы колкостями и фактами.:
%s»
И после этого посылается запрос через вызов метода perfromDeepSeekRequest(prompt), который на самом деле в итоговом варианте начал делать запрос в OpenRouterAI, для этого понадобилось просто одним запросом попросить Curosr поменять DeepSeekApi на OpenRouterApi — и тут спрашивается для чего нам абстракции и разделение ответственностей в коде, за которые так ратовал дядя Боб, если ИИ и сам может поменять всё, что нужно :)
Вопрос конечно шутливый.

Давайте заглянем внутрь perfromDeepSeekRequest.

Тут даже не нужно читать этот код, Cursor не захотел пользоваться прелестями цивилизации в виде Retrofit и OkHttp. Он решил пойти по хардкору через HttpUrlConnection. А мне в рамках моего эксперимента в целом без разницы, главное, чтобы работало. Результатом работы метода будет строка, в которой находится ответ от ИИ. А затем она уже летит в текстовое поле ввода:

Вот и всё, я добавил новую функциональность в приложение Telegram и при этом не написал ни одной строки кода своими руками. Ну ладно может парочку строк было :)

Но также стоит учитывать очень важный факт, мне сильно пригодилось умение читать и понимать код, который мне нагенерил Cursor. Без этого умения было бы намного сложнее разбираться с проблемами, которые возникали на пути.
Выводы

Экономия времени. ИИ очень помог сэкономить время на этапе погружения в проект и изучения исходников.
Ограничения. Сгенерированный код иногда содержит баги (гонки потоков, некорректные UI‑элементы).
Точность. При правильных запросах Cursor способен понять контекст проекта и предложить работающий вариант, но обязательно нужно задавать ему ограничения, как он должен выполнить задачу и какие библиотеки использовать
Проделать те этапы, которые я прошел, сможет и не погруженный в технику человек. Возможно, уйдет больше времени чем у меня, но все равно у него получится. Если хочется увидеть больше подробностей, то залетай на ролик по данной теме на моём YouTube канале. А также подписывайся на мой канал в Telegram где я время от времени публикую посты, связанные с IT и не только.
P.S.
Пока мой друг@Ales_Ivanovревьювил эту статью, ИИ обновил за него unit тесты :)

Подписывайтесь на Телеграм-канал Alfa Digital — там мы постим новости, опросы, видео с митапов, краткие выжимки из статей, иногда шутим.
Читайте также:
