yukovsky.
Открыт к предложениям

Shopping Assistant

AI-ассистент по питанию для похода в магазин: наведите камеру на товар, штрихкод или состав и получите КБЖУ, предупреждения по вашим аллергенам и диете, советы по хранению и идеи рецептов. Проект в БГУИР.

Зачем

В магазине хочется быстро понять, подходит ли продукт под вашу диету и нет ли в нём ваших аллергенов, а по этикетке это быстро не поймёшь. Shopping Assistant распознаёт продукт и сверяет его с вашим профилем питания.

Как это работает

Сфотографируйте товар, отсканируйте штрихкод, снимите состав или введите название, и вы получите карточку с КБЖУ, советами по хранению и идеями рецептов. Аллергены, диеты и норма калорий уходят в каждый запрос, а красный баннер предупреждает о совпадении с аллергеном.

Что сделал я

Соавтор вместе с Владиславом Василевским и Вячеславом Микшей, командный проект в БГУИР. У Flutter-приложения нет своего бэкенда: штрихкоды ищутся в Open Food Facts, а фото уходят в AI-модели через каскад провайдеров с квотами, общим бюджетом времени и circuit breaker.

Статус

Идёт стабилизация: аудит дефектов, исправления и тесты готовы, дальше проверка на реальных устройствах и сборки под iOS. Код закрыт, потому что принадлежит учебному проекту.

Роль
Соавтор (командный проект в БГУИР)
Команда
  • Роман Рында, Соавтор
  • Владислав Василевский, Соавтор
  • Вячеслав Андреевич Микша, Соавтор
Период
2026
Статус
В работе
Стек
Flutter, Dart, flutter_bloc, get_it, go_router, dio, camera, mobile_scanner, flutter_secure_storage, Open Food Facts API, Gemini, OpenRouter, Groq, Cloudflare AI

Главное

  • Распознаёт продукт четырьмя способами: по фото, штрихкоду, фото состава или названию
  • Профиль питания с аллергенами, диетами и нормой калорий, который учитывает AI
  • Красное предупреждение, если продукт или его состав совпадает с вашим аллергеном
  • Идеи рецептов к каждому продукту, с таймером и отправкой недостающего в список покупок
  • Сравнение двух продуктов, история с поиском, избранное и список покупок
  • Каждая карточка говорит, откуда данные, и не выдумывает неизвестные числа
  1. Gemini: лимит исчерпан
  2. OpenRouter: готово

Овсяное печенье

Пример данных

Оценка ИИ по фото, Сладости и снеки

Глютен: есть в вашем списке аллергенов

Может содержать орехи (не в вашем списке)

  • Вегетарианская: да
  • Веганская: нет
  • Без глютена: нет
  • Кето: нет
  • Халяль: зависит

Овёс даёт клетчатку.

Много сахара и жира: 450 ккал — около пятой части вашей нормы 2000 ккал.

Заметки ИИ о диетах — не сертификация. Проверяйте этикетку.

Овсяное печенье

Пример данных

Open Food Facts, на 100 г

ккал
450
Белки
6.5 г
Жиры
18 г
Углев.
64 г
Сахара
—

Аллергены: глютен, совпадает с профилем. Может содержать орехи.

Неизвестное значение показано прочерком, а не нулём.

Иллюстрация процесса, не запись. Профиль в примере: аллергия на глютен, вегетарианство, 2000 ккал в день.
  • Карточка Nutella из Open Food Facts: красное предупреждение об аллергенах из профиля (молоко, орехи), состав и кольцо калорий. Симулятор iOS.Карточка Nutella из Open Food Facts: красное предупреждение об аллергенах из профиля (молоко, орехи), состав и кольцо калорий. Симулятор iOS.

    Карточка продукта: источник данных сверху, красное предупреждение при совпадении с вашими аллергенами и калории одним взглядом.

  • Профиль питания с нормой 2000 ккал и отмеченными аллергенами «Орехи» и «Молоко / Лактоза» (демо-данные)Профиль питания с нормой 2000 ккал и отмеченными аллергенами «Орехи» и «Молоко / Лактоза» (демо-данные)

    Профиль питания: аллергены, диеты и норма калорий попадают в каждый запрос к AI и включают красный баннер безопасности.

  • Экран сканера с режимами «Товар», «Штрихкод» и «Состав» и запросом доступа к камере в симулятореЭкран сканера с режимами «Товар», «Штрихкод» и «Состав» и запросом доступа к камере в симуляторе

    Сканер переключается между фото товара, штрихкодом и составом, а название можно просто ввести.

  • Страница онбординга о персональной безопасности: настройте аллергены и диеты и получайте предупреждения до покупкиСтраница онбординга о персональной безопасности: настройте аллергены и диеты и получайте предупреждения до покупки

    Онбординг объясняет идею: один раз указали аллергены и диеты и получаете предупреждение ещё до покупки.

1 / 4 Карточка продукта: источник данных сверху, красное предупреждение при совпадении с вашими аллергенами и калории одним взглядом.

Что это

Вы в магазине, держите в руках продукт и хотите понять, стоит ли его брать. Сфотографируйте его, отсканируйте штрихкод, снимите состав на упаковке или просто введите название. Приложение соберёт карточку продукта под вас.

Карточка показывает калории и БЖУ, витамины и минералы, как хранить продукт и как его выбирать. Она предлагает от двух до четырёх рецептов, и у каждого есть таймер готовки, оценка калорий на порцию и кнопка, которая отправляет недостающие ингредиенты в список покупок. Основа всего это профиль питания: вы отмечаете свои аллергены, диеты (веганство, без глютена, кето, халяль и другие) и суточную норму калорий. Профиль уходит с каждым запросом к AI, так что модель проверяет продукт с его учётом, а красный баннер в карточке предупреждает, если продукт или его состав совпадает с вашим аллергеном.

Фото состава на упаковке превращается в список ингредиентов и E-добавок, которые сразу сверяются с вашими аллергенами. Всё отсканированное попадает в историю с поиском и фильтром по категориям. Два продукта из неё можно сравнить рядом, а ещё есть избранное и список покупок, разложенный по категориям.

Что я сделал

Мобильное приложение с четырьмя способами распознавания и без собственного бэкенда, вместе с Владиславом Василевским и Вячеславом Микшей. Штрихкоды ищутся в открытой базе Open Food Facts, поэтому в карточке настоящие данные с упаковки. Фото, состав и названия уходят в мультимодальные AI-модели прямо с устройства через каскад провайдеров.

  • Карточка Nutella из Open Food Facts: красное предупреждение об аллергенах из профиля (молоко, орехи), состав и кольцо калорий. Симулятор iOS.Карточка Nutella из Open Food Facts: красное предупреждение об аллергенах из профиля (молоко, орехи), состав и кольцо калорий. Симулятор iOS.

    Карточка продукта: источник данных сверху, красное предупреждение при совпадении с вашими аллергенами и калории одним взглядом.

  • Профиль питания с нормой 2000 ккал и отмеченными аллергенами «Орехи» и «Молоко / Лактоза» (демо-данные)Профиль питания с нормой 2000 ккал и отмеченными аллергенами «Орехи» и «Молоко / Лактоза» (демо-данные)

    Профиль питания: аллергены, диеты и норма калорий попадают в каждый запрос к AI и включают красный баннер безопасности.

  • Экран сканера с режимами «Товар», «Штрихкод» и «Состав» и запросом доступа к камере в симулятореЭкран сканера с режимами «Товар», «Штрихкод» и «Состав» и запросом доступа к камере в симуляторе

    Сканер переключается между фото товара, штрихкодом и составом, а название можно просто ввести.

  • Страница онбординга о персональной безопасности: настройте аллергены и диеты и получайте предупреждения до покупкиСтраница онбординга о персональной безопасности: настройте аллергены и диеты и получайте предупреждения до покупки

    Онбординг объясняет идею: один раз указали аллергены и диеты и получаете предупреждение ещё до покупки.

1 / 4 Карточка продукта: источник данных сверху, красное предупреждение при совпадении с вашими аллергенами и калории одним взглядом.

Технические решения

  • Промпты с учётом профиля. Версионированные промпты просят у модели строгую JSON-карточку: пищевая ценность, польза и предостережения, совместимость с каждой диетой, аллергены с пометкой о совпадении с профилем, хранение, советы по выбору и рецепты. Профиль подставляется в промпт, и конфликты с ним должны идти первыми в предостережениях. Профиль входит и в ключ кэша, так что после его изменения устаревшая карточка не вернётся.
  • Аллергены проверяются локально, а не на слово. Что бы ни ответила модель, локальный сопоставитель с русскими и английскими синонимами для 12 групп аллергенов ещё раз проверяет состав, аллергены и следы из Open Food Facts, и его результат главнее. Отсутствие совпадения никогда не выдаётся за гарантию: карточка просит сверяться с упаковкой.
  • Каскад провайдеров. Запросы по очереди идут через разрешённые модели Gemini, OpenRouter, Groq и Cloudflare с общим бюджетом в 90 секунд, политикой на каждый тип ошибки (повторить, следующая модель или остановиться), учётом квот по минутам и дням, circuit breaker, который переживает перезапуск, и журналом попыток. Ответы проверяются по схеме, а сломанный ответ запускает короткий запрос на исправление.
  • Подготовка на устройстве. Фото поворачивается по EXIF, уменьшается максимум до 1024 px и сжимается в JPEG с качеством 80 перед отправкой. Штрихкоды сканируются на устройстве через mobile_scanner.
  • Честные данные. Каждая карточка говорит, откуда данные: Open Food Facts, оценка AI или состав, прочитанный AI. Неизвестные нутриенты показываются прочерком, а не нулём, а сравнение отказывается сопоставлять значения на разную базу. Неизвестный штрихкод даёт ошибку, а не придуманную моделью карточку.
  • Офлайн-очередь. Текстовый запрос без сети сохраняется и повторяется, когда сеть возвращается или приложение снова становится активным.
  • Секреты. API-ключи лежат во flutter_secure_storage, старые ключи удаляются из обычных настроек только после успешной миграции.
  • Структура. Папки по фичам с BLoC и Cubit, get_it для зависимостей и go_router для пяти вкладок: сканер, история, список, профиль и настройки. Экран диагностики показывает цепочку моделей, очередь и состояние предохранителей. Юнит- и виджет-тесты работают с замоканными AI и HTTP.

Результат

Приложение на стадии стабилизации: письменный аудит дефектов, исправления и тесты сделаны. Сборки для Android пока только тестовые, проверки на реальных устройствах и сборки под iOS впереди. Код закрыт, потому что это учебный проект БГУИР. Скриншоты сняты в симуляторе iOS и показывают сценарии, которые работают без AI-ключей.

Моя роль

Соавтор приложения вместе с Владиславом Василевским и Вячеславом Андреевичем Микшей в рамках командного проекта в БГУИР.

CV.pdf