О проекте
Команда: 104
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Рабочий MVP
Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером
Суть
Веб-приложение для закупщика «Электрокомплекта»: рассчитывает рекомендуемые заказы по SKU для поставщиков IEK и Systeme Electric, позволяет вручную скорректировать, утвердить план и выгрузить CSV.
Как устроено
Каталог собирается из Excel-выгрузок поставщиков (openpyxl) в data/demo_catalog.json.gz. replenishment.py по месячной истории продаж исключает разовые крупные продажи, ограничивает выбросы, корректирует спрос на stockout, прогнозирует с сезонностью и трендом, добавляет страховой буфер, вычитает остаток и товар в пути и округляет по MOQ; позиции получают срочность и группируются по поставщикам. AI-агент на OpenAI Responses API вызывает функции расчётного модуля (сводка, объяснение SKU, аномалии, сравнение сценариев), без ключа работает локальный demo-agent.
Ключевые решения
- seasonal demand forecast
- trend estimation
- robust outlier capping
- stockout correction
- safety stock
- MOQ rounding
- what-if scenarios
- function calling
Особенности
Бэкенд на чистой стандартной библиотеке Python без фреймворков, есть публичный деплой на Railway. Явный human-in-the-loop: алгоритм рекомендует, менеджер правит и утверждает, автоотправки поставщику нет. Честный список ограничений данных (нет client_id, нет истории stockout).
Стек
Python 3.11 · http.server · openpyxl · vanilla JavaScript · HTML/CSS · Docker · Railway
Модели
OpenAI Responses API (gpt-5.6-luna)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-eab7e034-104.
README
README.mdStockPilot AI — автоматизация пополнения склада
1. О проекте
StockPilot AI — веб-приложение для менеджера отдела закупа ТОО «Электрокомплект».
Проект решает задачу автоматизации расчёта заказов поставщикам для пополнения склада. Вместо ручной консолидации нескольких Excel-выгрузок менеджер получает готовый список позиций к закупке с рекомендуемым количеством, срочностью и объяснением расчёта.
Система предназначена для поддержки решения закупщика, а не для полностью автономной закупки: итоговое количество можно скорректировать вручную, после чего менеджер подтверждает план и экспортирует его в CSV. Автоматической отправки заказа поставщику в проекте нет.
2. Что реализовано
В текущей версии проекта реализованы
- расчёт рекомендаций по пополнению на уровне SKU;
- учёт истории продаж по месяцам;
- календарная сезонность;
- оценка устойчивого изменения спроса;
- робастное ограничение аномальных месячных всплесков;
- исключение отмеченных разовых крупных продаж из регулярного спроса;
- корректировка спроса при переданных периодах stockout;
- учёт текущего остатка;
- учёт товара в пути;
- страховой буфер;
- MOQ / кратность заказа в текущей модели;
- приоритизация рекомендаций по срочности;
- группировка результата по поставщикам;
- фильтры по поставщику, категории и срочности;
- поиск по SKU, артикулу поставщика и наименованию;
- подробное объяснение выбранной позиции;
- сценарий «Что если?» с изменением:
- горизонта расчёта;
- спроса;
- остатка;
- товара в пути;
- числа stockout-дней;
- загрузка stockout-периодов из CSV;
- ручная корректировка количества к заказу прямо в таблице;
- подтверждение плана менеджером;
- экспорт чернового или подтверждённого плана в CSV;
- AI-агент для сводки плана, объяснения SKU, анализа аномалий, проверки качества данных и сравнения сценариев;
- локальный demo-режим AI-агента без API-ключа;
- публичный health-check endpoint;
- Docker-конфигурация и конфигурация Railway для развёртывания.
3. Как работает решение
Основной пользовательский сценарий:
- Приложение загружает подготовленный локальный каталог, построенный из предоставленных выгрузок поставщиков.
- Расчётный модуль анализирует историю спроса по SKU.
- Из регулярного спроса удаляются отмеченные разовые операции и ограничиваются экстремальные месячные пики.
- При наличии stockout-периодов спрос корректируется вверх.
- Для горизонта планирования рассчитывается прогноз с сезонностью и трендом.
- К прогнозу добавляется страховой буфер.
- Из потребности вычитаются доступный остаток и товар в пути.
- Итоговое количество округляется с учётом MOQ текущей модели.
- Рекомендации группируются по поставщикам и получают срочность.
- Менеджер открывает любую строку и видит обоснование расчёта.
- При необходимости менеджер вручную меняет количество в колонке «Заказать».
- Менеджер нажимает «Утвердить план».
- После подтверждения можно выгрузить CSV со статусом согласования.
AI-агент не выполняет арифметику самостоятельно. Он вызывает функции расчётного модуля и объясняет уже проверенные результаты.
4. Технологии
Backend
- Python 3.11 в Docker-образе;
- стандартная библиотека Python:
http.server;json;gzip;urllib;datetime;
- openpyxl — используется при построении подготовленного каталога из исходных Excel-файлов.
Frontend
- HTML5;
- CSS3;
- vanilla JavaScript;
- без фронтенд-фреймворков.
AI
- OpenAI Responses API;
- модель по умолчанию задаётся переменной окружения:
OPENAI_MODEL=gpt-5.6-luna; - при отсутствии
OPENAI_API_KEYработает локальный demo-agent с теми же детерминированными инструментами расчёта.
Развёртывание
- Docker;
- Railway;
- публичный health-check:
/api/health.
5. Архитектура проекта
Браузер
│
▼
frontend/
├── index.html
├── styles.css
└── app.js
│
│ HTTP / JSON
▼
app.py
├── GET /api/health
├── GET /api/products
├── POST /api/recommendations
└── POST /api/agent
│
├──────────────► replenishment.py
│ ├── прогноз спроса
│ ├── сезонность
│ ├── тренд
│ ├── stockout
│ ├── выбросы
│ ├── остатки
│ ├── товар в пути
│ └── расчёт заказа
│
└──────────────► agent.py
├── выбор инструмента
├── OpenAI Responses API
└── локальный demo-agent
data/demo_catalog.json.gz
▲
│
scripts/build_demo_data.py
▲
│
Excel / ZIP выгрузки поставщиков
Расчётное ядро отделено от LLM: количество заказа формируется обычным кодом, а AI используется для выбора инструмента и объяснения результата.
6. Структура репозитория
.
├── app.py
├── agent.py
├── replenishment.py
├── frontend/
│ ├── index.html
│ ├── styles.css
│ └── app.js
├── data/
│ └── demo_catalog.json.gz
├── scripts/
│ └── build_demo_data.py
├── tests/
├── Dockerfile
├── railway.json
├── requirements.txt
├── .env.example
├── START_LOCAL.bat
├── DEPLOY_RAILWAY.bat
└── README.md
7. Установка и запуск
Локальный запуск
Требуется Python.
Из корня проекта:
python app.py
По умолчанию сайт будет доступен по адресу:
http://127.0.0.1:8000
Проверка API:
http://127.0.0.1:8000/api/health
На Windows также присутствует файл:
START_LOCAL.bat
Подключение OpenAI
Создайте локальный файл .env на основе .env.example:
OPENAI_API_KEY=...
OPENAI_MODEL=gpt-5.6-luna
API-ключ не должен попадать в Git.
При отсутствии ключа приложение продолжает работать, а AI-панель использует локальный demo-режим.
Docker
docker build -t stockpilot-ai .
docker run -p 8000:8000 stockpilot-ai
Railway
В проекте есть Dockerfile и railway.json.
При установленном Railway CLI:
railway.cmd login
railway.cmd init
railway.cmd up
railway.cmd domain
8. Как жюри может проверить решение
Публичная версия:
https://stockpilot-ai-production-4f94.up.railway.app
Для использования не требуется GitHub, Python, VS Code или Railway.
Рекомендуемый сценарий проверки:
- Открыть deployed-версию в браузере.
- Дождаться автоматического расчёта плана пополнения.
- Выбрать поставщика IEK или Systeme Electric.
- При необходимости выбрать категорию и срочность.
- Открыть любую строку таблицы.
- Проверить:
- прогноз спроса;
- остаток;
- товар в пути;
- MOQ;
- срочность;
- текстовое обоснование.
- Изменить значение в колонке «Заказать».
- Нажать «Утвердить план».
- Нажать «Экспорт CSV» и проверить статус согласования в файле.
- Открыть блок «Что если?»:
- изменить спрос, например на +15%;
- изменить горизонт;
- пересчитать сценарий.
- В AI-панели попробовать запрос:
Покажи срочные позиции IEK на 30 дней;Какие выбросы алгоритм исключил?;Объясни SKU 010400432;Что изменилось после сценария?.
- Открыть раздел источников данных и посмотреть ограничения входного набора.
Health-check deployed-версии:
https://stockpilot-ai-production-4f94.up.railway.app/api/health
9. Данные и интеграции
Подготовленный каталог проекта построен из предоставленных выгрузок по поставщикам:
- IEK;
- Systeme Electric.
В репозитории используется агрегированный локальный каталог data/demo_catalog.json.gz.
В обработке используются доступные поля и представления:
- помесячная история продаж по SKU;
- остатки;
- товар в пути;
- MOQ / кратность из доступных файлов;
- категории там, где они присутствуют;
- детальная история документов для выявления крупных разовых операций.
Для stockout предусмотрен отдельный CSV:
sku,month,days_out
Пример:
200400085,2026-08,10
Внешняя интеграция текущей версии:
- OpenAI Responses API — опционально;
- Railway — хостинг deployed-версии.
10. Ограничения текущей версии
Ограничения отражены в интерфейсе и не скрываются:
- в предоставленных выгрузках нет обезличенного
client_id, поэтому нельзя достоверно объединять несколько документов как покупки одного клиента; - крупные разовые операции выявляются на уровне доступных документов / SKU и месячных аномалий;
- в исходном наборе нет полноценной истории stockout — её можно передать отдельным CSV или задать в сценарии;
- нет автоматически обновляемого подключения к 1С;
- входные данные используются из подготовленного локального снимка, а не обновляются в реальном времени;
- фактические сроки новых поставок не представлены полноценным справочником, поэтому горизонт расчёта задаётся как параметр сценария;
- для части данных свежесть снимка ограничена исходными отчётами;
- совместимость экспортируемого CSV с конкретной конфигурацией импорта 1С не подтверждена;
- точность прогноза не заявлена как подтверждённая отдельным backtesting-набором;
- подтверждение менеджера в текущем веб-интерфейсе сохраняется локально в браузере, а не в общей корпоративной БД;
- нет пользовательской авторизации и серверного журнала утверждений;
- автоматической отправки заказа поставщику нет;
- публичная deployed-версия не предназначена для размещения новых конфиденциальных данных через интерфейс.
11. Deployed-версия
StockPilot AI:
https://stockpilot-ai-production-4f94.up.railway.app
Health-check:
https://stockpilot-ai-production-4f94.up.railway.app/api/health
Безопасность и принцип принятия решения
StockPilot AI является системой поддержки закупщика.
AI / алгоритм рекомендует
↓
менеджер проверяет
↓
при необходимости корректирует
↓
менеджер утверждает
↓
формируется CSV
Система не отправляет заказ поставщику автоматически.
Быстро открыть проект
Способ 1 — готовая онлайн-версия
Самый простой способ для жюри и пользователей — открыть уже развёрнутый StockPilot AI:
https://stockpilot-ai-production-4f94.up.railway.app
Ничего скачивать или устанавливать не требуется. Ссылка открывается в обычном браузере.
Способ 2 — запуск на Windows через BAT
Если проект скачан из GitHub как ZIP:
- Распакуйте ZIP в отдельную папку.
- Убедитесь, что на компьютере установлен Python и команда
pythonдоступна из терминала. - В корне распакованного проекта дважды нажмите:
START_LOCAL.bat
- После запуска сервера откройте в браузере:
http://127.0.0.1:8000
- Для остановки локального сервера закройте окно терминала или нажмите
Ctrl+C.
Если локальный запуск недоступен, используйте готовую онлайн-версию:
Авторы коммитов
История коммитов
- 2026-09-23 17:40style: add recommendation detail modalMarillion_001
- 2026-09-23 17:39feat: add recommendation detail modalMarillion_001
- 2026-09-23 17:39fix: open recommendation details in modalMarillion_001
- 2026-09-23 17:35docs: add quick launch instructions for judgesMarillion_001
- 2026-09-23 17:31docs: replace README with final Russian hackathon guideMarillion_001
- 2026-09-23 17:13Merge branch 'main' of https://github.com/BAITC-Hacks/hack-eab7e034-104Marillion_001
- 2026-09-23 17:12chore: add one-click Railway deploy helperMarillion_001
- 2026-09-23 17:12chore: add one-click Windows local startMarillion_001
Все коммиты (38)
- 2026-09-23 17:12chore: align demo OpenAI modelMarillion_001
- 2026-09-23 17:11docs: add judge demo and deploy runbookMarillion_001
- 2026-09-23 17:11build: add Railway deploymentMarillion_001
- 2026-09-23 17:11build: add Docker deploymentMarillion_001
- 2026-09-23 17:11style: add manager approval controlsMarillion_001
- 2026-09-23 17:11chore: use cost-efficient OpenAI model for demoMarillion_001
- 2026-09-23 17:10feat: expose manager approval workflowMarillion_001
- 2026-09-23 17:10feat: add plan editing approval and category filterMarillion_001
- 2026-09-23 17:10fix: make web app cloud-readyMarillion_001
- 2026-09-23 17:06Merge branch 'main' of https://github.com/BAITC-Hacks/hack-eab7e034-104Marillion_001
- 2026-09-23 17:04Update README.mdMarillion_001
- 2026-09-23 16:07udpMarillion_001
- 2026-09-23 15:51Update README.mdMarillion_001
- 2026-09-23 17:43Update README.mdbakosyaqbd
- 2026-09-23 15:22Update README.mdbakosyaqbd
- 2026-09-23 15:21Update README.mdbakosyaqbd
- 2026-09-23 15:09updMarillion_001
- 2026-09-23 15:07updMarillion_001
- 2026-09-23 14:50UPDMarillion_001
- 2026-09-23 14:47Merge branch 'main' of https://github.com/BAITC-Hacks/hack-eab7e034-104Marillion_001
- 2026-09-23 14:45updateMarillion_001
- 2026-09-23 14:41Rename project from 'hack-eab7e034-104' to 'hack-eab7e034-twoLosers'Marillion_001
- 2026-09-23 14:36updateMarillion_001
- 2026-09-23 16:35Update README.mdbakosyaqbd
- 2026-09-23 14:29Merge branch 'main' of https://github.com/BAITC-Hacks/hack-eab7e034-104Marillion_001
- 2026-09-23 14:27updateMarillion_001
- 2026-09-23 13:59Update README.mdbakosyaqbd
- 2026-09-23 13:50Update README.mdbakosyaqbd
- 2026-09-23 13:49Update README.mdbakosyaqbd
- 2026-09-23 13:46Update README.mdMarillion_001
Структура репозитория (21 файлов)
.env.example .gitignore DEPLOY_NOW.md DEPLOY_RAILWAY.bat Dockerfile README.md START_LOCAL.bat agent.py app.py data/demo_catalog.json.gz docs/data_sources.md frontend/app.js frontend/index.html frontend/styles.css railway.json replenishment.py requirements.txt scripts/build_demo_data.py tests/test_agent.py tests/test_app.py tests/test_replenishment.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.