Коротко
Priyanshu Jha создал для подруги мобильный веб-помощник, который превращает сообщения и голосовые заметки WhatsApp в черновики заказов и показывает, что доставить, пополнить и у какого поставщика закупиться. Ключевой принцип: Gemma обрабатывает язык, а расчёты и запись данных выполняет проверяемый код, поэтому модель не решает, сколько товара есть на складе.
Контекст
Автор Priyanshu Jha сделал Nivara для подруги, которая одна управляет магазином пищевых добавок через телефон и получает заказы в WhatsApp на хинди и хинглише. У неё не было учёта продаж и запасов в программе; автор начал с трёх практических вопросов: что доставить сегодня, что заказать заранее и где цена поставщика выгоднее.
Главное
- Целевая проблема — одиночный магазин добавок, где заказы приходят голосом и текстом в WhatsApp на хинди и хинглише, а запасы раньше учитывались вручную.
- В интерфейсе есть Today для приоритизации дел, Orders для черновиков, Ask для вопросов, а также Stock, Forecast и Suppliers; цвета задач: красный — срочно, жёлтый — на этой неделе, зелёный — позже.
- Gemma —
gemma-4-26b-a4b-itчерез Google AI Studio в рабочем приложении; разработка велась также сgemma3:4bв Ollama. Для Gemma выделены языковые задачи, не расчёты запасов. - Преобразование заказа проходит через ElevenLabs Scribe, JSON-извлечение Gemma и валидацию Zod; предусмотрена одна повторная попытка при некорректном JSON.
- Сохранение заказа требует явного подтверждения пользователя. Код проверяет клиентов и товары, а формулировки «kal», «कल» и «parson» преобразуются в даты вне модели.
- Forecast использует TabPFN: прогноз на 7 дней для каждого из 212 товаров строился по 60 дням данных; расчёт на CPU занял 317 секунд.
- Вместо реальной истории продаж использованы данные Google Trends как помеченный прокси спроса; цены для большинства товаров оценочные, поскольку Open Prices содержал наблюдения лишь для четырёх позиций.
- MongoDB Atlas служит источником данных по заказам и запасам; Tiger Data хранит
sales_dailyи агрегаты за 7 и 28 дней. Для поиска применяются Postgres full-text и pgvector сgemini-embedding-001размерностью 768. - Сравнение поставщиков учитывает онлайн-цену только при совпадении слова бренда и цене в диапазоне от половины до двойной цены магазина; рекомендация о переходе требует экономии не менее ₹10 и 5% за единицу.
- Автор сообщает о 137 тестах и 15 API-кейсах Keploy; среди найденных проблем были разные объёмы закупки в Today и Ask, ошибочное сравнение цены с товаром другого размера и смещение времени из-за UTC.
Как сделано
Nivara предлагает разделы Today, Orders, Ask, Stock, Forecast и Suppliers. Заказ можно создать из текста или голосовой записи: ElevenLabs Scribe переводит аудио в текст, Gemma формирует JSON-черновик, а Zod проверяет его. Код сопоставляет имена клиентов и товаров с каталогом, вычисляет даты вроде «kal» и показывает результат для проверки; заказ сохраняется только после нажатия «Confirm and save» и повторной проверки.
Gemma (gemma-4-26b-a4b-it через Google AI Studio в работающей версии, либо gemma3:4b в Ollama при разработке) используется для языковых задач, но не для фактов. Остатки, риск дефицита, объёмы закупки, даты и экономия поставщика вычисляются TypeScript-кодом по данным базы. Прогноз спроса на 7 дней по каждому товару рассчитывается TabPFN по 60 дням истории; из-за отсутствия Python на Render автор вычислил прогнозы локально и сохранил их в Atlas.
MongoDB Atlas хранит заказы, запасы и клиентов. Tiger Data/Timescale хранит ежедневные продажи в sales_daily и поддерживает агрегаты sales_demand_7d и sales_demand_28d; синхронизация доставленных заказов устроена так, чтобы повторная обработка не удваивала продажи. Поиск товаров объединяет полнотекстовый поиск Postgres и pgvector с 768-мерными эмбеддингами gemini-embedding-001. SerpApi поставляет цены Google Shopping и данные Google Trends. Приложение размещено на бесплатном Render; ежедневная сводка готовится к 8:00, а при отсутствии фонового воркера запускается внутри приложения.
Результаты
Автор сообщает о готовом веб-приложении и проверке его страниц и кнопок на телефонах шириной 360 и 390 пикселей и на ноутбуке. В демонстрационном заказе распознан текст «राहुल भाई को 2 MB Biozyme भेज देना कल तक»: приложение подготовило заказ на 2 упаковки Biozyme whey по ₹2,599, всего ₹5,198, с доставкой 6 октября; дата и заказ не сохраняются без подтверждения. Прогноз строился для 212 товаров за 317 секунд на CPU. В проекте указаны 137 тестов и 15 записанных API-кейсов Keploy. Исправлены найденные несогласованность рекомендаций по закупке, подбор несопоставимой цены, отображение времени не по Индии и ряд других ошибок.
Ограничения
У автора пока нет реальной истории продаж подруги; прогноз спроса основан на Google Trends, масштабированном под небольшой магазин, и помечен как прокси. Каталог включает 212 товаров Open Food Facts India, но реальные цены Open Prices были только для четырёх позиций, остальные оценены автором. Прогноз TabPFN рассчитан по тестовым данным, а не проверен на реальных продажах магазина. Работающая версия использует Google AI Studio, а не локальную модель; локальный режим заявлен как вариант. Бесплатный Render может просыпаться до минуты после простоя, а автоматическая обработка заказов напрямую из WhatsApp Business и отправка заказа поставщику пока не реализованы. Автор описывает собственную проверку и тесты, но не приводит независимой оценки качества прогноза или распознавания.
Что взять себе
- Для бизнес-процессов с числами не поручайте языковой модели расчёты остатков и закупок: используйте её для понимания текста, а факты вычисляйте детерминированным кодом.
- Показывайте распознанный заказ как черновик и требуйте подтверждение до записи в базу; проверяйте данные и при извлечении, и непосредственно перед сохранением.
- Если реальных данных пока нет, явно помечайте прокси и оценки: демонстрационный прогноз не равен проверенной рекомендации для конкретного магазина.
- Проверяйте одинаковые рекомендации на разных экранах и фиксируйте часовой пояс и идемпотентность синхронизации, чтобы повторная обработка не меняла продажи.
Читать оригинал, если…
Откройте оригинал, если нужны репозиторий, демонстрация интерфейса и точные детали реализации интеграций, таблиц и настроек.