Сделал открытого AI-агента для своих тренировок. Подал заявку в Sber500

В заявке на акселератор Sber500 x DISRUPT у меня записан самодельный AI-агент для Garmin Connect. Открытый код, ставится на своей машине, отвечает в Telegram по данным, которые Гармин и так собирает каждый день.

Формулировка появилась не сразу. Начиналось всё с обычного раздражения: Гармин пишет сон, HRV, стресс, пульс на тренировке, а ChatGPT ничего этого не видит. Спрашивать у него про свою неделю приходилось через скрины: открыть Garmin Connect, сфотографировать экран, вставить в чат, повторить для каждой метрики отдельно.

Один вечер и один скрипт закрыли только маленький кусок: забрать сон и HRV за сегодня и сложить в файл. Дальше задача пересобиралась несколько раз подряд. Сейчас это пайплайн с локальным кэшем, агентным Telegram-ботом, поддержкой локальных моделей через Ollama, веб-формой настройки и готовыми сборками под Windows и macOS.

Что реально поменялось

Раньше на любой вопрос про свои данные уходила цепочка действий: открыть приложение, найти нужный экран, сделать скрин, отправить в чат, и так на каждую метрику отдельно. Сейчас это заменяет одна фраза в Telegram.

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

Сделал открытого AI-агента для своих тренировок. Подал заявку в Sber500

Цифры без интерпретации не работают как продукт

У часов с датчиками сна и пульса аудитория большая. Понимают, что значит их собственный HRV или почему Body Battery упала с 83 до 10 за день, немногие. Часы показывают цифру, не объясняют её в контексте конкретного человека.

Просто прикрутить ChatGPT поверх экспорта данных проблему не решает. Модель видит цифру без истории и выдаёт общий текст про HRV вообще, а не про то, что изменилось у конкретного пользователя за неделю. Разбираться, что нормально именно для него, читатель всё равно будет делать сам, отдельно, в другом окне.

Разница у агента в том, что он видит накопленную историю по конкретному человеку: прошлые недели, обычный RHR, средний сон. Вопрос «почему сегодня HRV ниже» получает ответ по собственным прошлым данным, не по общей статье про HRV из интернета. Узкое место здесь не только у Гармина, а у любого носимого устройства: данных собирается много, разбор в контексте конкретного человека почти всегда происходит отдельно, если происходит вообще.

Не медицинская консультация. Разбор того, что уже посчитало устройство, с учётом истории конкретного человека.

Закрытый продукт или открытый код

Рынок AI-фитнес-коучей в России уже не пустой. Закрытые сервисы, подписка, сервер, на котором лежат данные о сне и пульсе пользователя, а что там происходит, пользователь не видит.

Выбрал открытый код и self-hosted вместо подписки. Бизнес на закрытой версии, возможно, был бы жизнеспособнее, но тема слишком личная. Для «моего сна и моего пульса» закрытая коробка с чужим сервером внутри доверия не добавляет. Код, который можно прочитать и запустить у себя, добавляет.

Узкое место оказалось не там, где ждал

Отчёт за произвольный период сначала работал в лоб: указываешь даты, и на каждый запрос идёт полный обход Garmin API по каждому дню периода. Запросил отчёт за две недели, через час запросил повторно за тот же период, снова 14 обращений к API, хотя за это время ни один день не изменился.

Локальная база стала хранить сырые ответы API, а не только посчитанные цифры. Это дало возможность добавлять новые поля в отчёт из уже сохранённых данных, без повторного похода в Garmin. Отчёт за период сначала смотрит, какие дни уже в кэше, и в API летит только недостающий кусок. На первом запросе это 14 обращений к API. На повторном запросе за тот же период: 0. Фоновая синхронизация держит кэш тёплым сама, без ручного запуска.

Не только читать, но и писать

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

Основным интерфейсом сделал именно бота в Telegram, а не дашборд с графиками. Решение осознанное: сухая аналитика без возможности что-то сделать по её итогам быстро становится неинтересной. Ценность появляется, когда агент не просто показывает цифры, а может выполнить действие по запросу, с подтверждением перед любым изменяющим шагом.

Сделал открытого AI-агента для своих тренировок. Подал заявку в Sber500

Локальная модель не для галочки

Часть пользователей вообще не хочет, чтобы данные о здоровье уходили к внешнему провайдеру. Поэтому в веб-форму настройки добавлена установка Ollama прямо оттуда: статус, кнопка установки, кнопка скачивания модели с прогресс-баром. Для агентных задач с вызовом функций на обычном пользовательском железе лучше всего показала себя модель qwen3:4b. Не самая крупная, зато она реально вызывает нужные инструменты вместо того, чтобы просто рассуждать вслух.

Дистрибуция без Python

Код на GitHub закрывает задачу для разработчика. Человеку, который консоль не открывал ни разу, от этого не легче. Поэтому собраны готовые дистрибутивы под Windows и macOS: скачал, распаковал, запустил, открылась страница настройки в браузере. Логин и пароль от Garmin, ключ от LLM-провайдера или выбор локальной модели, токен Telegram-бота, и дальше пайплайн работает сам в фоне.

Сделал открытого AI-агента для своих тренировок. Подал заявку в Sber500

Под тем же кодом есть входы попроще для тех, кто и так живёт в терминале: CLI-команды, Skill-файлы для Cursor и Claude Code, AGENTS.md для Codex, MCP-сервер для внешних LLM-клиентов вроде Claude Desktop.

Ограничения, которые не буду замалчивать

Локальные модели тянут агентные задачи не так уверенно, как облачные, разница в надёжности вызова функций заметна на глаз. Официального доступа к «мышечной карте» Гармин не даёт, группы мышц считаются через собственную таблицу соответствия категорий упражнений. Пайплайн заточен под один бренд устройств, потому что с него началась личная задача. Проект пока держится на одном разработчике, без команды.

Дальше

Заявка в Sber500 подавалась не ради строчки в резюме. Хотелось понять, можно ли на этом построить что-то за пределами личного инструмента: партнёров, аудиторию, ресурс на развитие без превращения проекта в закрытую подписку.

Сделал открытого AI-агента для своих тренировок. Подал заявку в Sber500

Репозиторий открыт: github.com/TolmachevKirill/garmin_ai. Готовые сборки под Windows и macOS лежат в релизах.

Если у тебя не Гармин, а другое устройство с похожим разрывом между данными и ИИ, пиши. Каталог всех брендов заранее не обещаю. Разбор конкретного случая обещаю.

22