HackAlem AI — объяснимые рекомендации к заказу поставщикам
Demo-MVP для менеджера по закупкам: считает рекомендованное количество к заказу по SKU для IEK и Systeme Electric, показывает срочность и…
О проекте
Команда: ARA-Solution
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Рабочий MVP
Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером
Суть
Demo-MVP для менеджера по закупкам: считает рекомендованное количество к заказу по SKU для IEK и Systeme Electric, показывает срочность и расшифровку расчёта. Менеджер правит количество и после явного подтверждения выгружает CSV.
Как устроено
FastAPI-эндпоинт POST /api/v1/replenishment/calculate берёт синтетический JSON-фикстур. Для каждого SKU: средний спрос × сезонный коэффициент × тренд, плюс коррекция дефицита и ожидаемый рост. Потребность на max(горизонт, срок поставки) уменьшается на остаток и товар в пути, затем округляется вверх до кратности. React-фронтенд показывает факторы расчёта; экспорт блокируется до повторного подтверждения. LLM не используется, реальные Excel-файлы в runtime пока не загружаются.
Ключевые решения
- seasonality coefficients
- trend adjustment
- stockout correction
- MOQ/multiple rounding
- OpenAPI contract
Особенности
Контракт OpenAPI задан как единственный интерфейс между фронтендом и бэкендом. В репозитории есть конфиги агентов Codex (data-auditor, replenishment-qa, contract-reviewer). Ограничения MVP описаны честно: синтетический фикстур вместо реальных Excel.
Стек
Python · FastAPI · Pydantic · React 19 · TypeScript · Vite · Docker Compose · Nginx · pytest
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-b30ef123-ara-solution.
README
README.mdHackAlem AI — объяснимые рекомендации к заказу поставщикам
HackAlem AI — demo-MVP для менеджера по закупкам. Сервис помогает подготовить пополнение ассортимента у поставщиков IEK и Systeme Electric: показывает рекомендованное количество по SKU, срочность и понятную расшифровку расчёта.
Какую проблему решает
При формировании заказа нужно одновременно учитывать продажи, остатки, товар в пути, сезонность, тренд и ограничения поставщика. Вручную такой расчёт трудно проверить и объяснить. Приложение собирает эти факторы в детерминированную рекомендацию, которую менеджер может проверить, скорректировать и выгрузить для дальнейшего согласования.
Целевая аудитория — закупщик или менеджер по ассортименту, который готовит заказ поставщику и отвечает за его проверку.
Что реализовано
- Расчёт рекомендаций для двух поставщиков: IEK и Systeme Electric.
- Параметры расчёта: дата, горизонт планирования, срок поставки, ожидаемый рост спроса и переключатель коррекции дефицита.
- Рекомендации, сгруппированные по поставщику: SKU, наименование, количество к заказу и уровень срочности.
- Расшифровка каждой рекомендации: базовый спрос, сезонность, тренд, корректировка дефицита, остаток, товар в пути, целевой спрос и кратность заказа.
- Ручная правка целого неотрицательного количества и CSV-экспорт после явного подтверждения пользователя. Любая новая правка требует повторного подтверждения; заказ поставщику автоматически не отправляется.
- Версионированный HTTP API и Swagger UI.
- Автоматические backend-тесты и production-сборка frontend.
Как работает решение
- Менеджер выбирает поставщика и задаёт параметры расчёта.
- Frontend отправляет запрос в
POST /api/v1/replenishment/calculate. - Backend загружает синтетический fixture MVP и для каждого SKU рассчитывает средний спрос, применяет сезонный и трендовый коэффициенты, явно заданную коррекцию дефицита и ожидаемый рост.
- Потребность на большем из горизонта планирования и срока поставки уменьшается на остаток и товар в пути, затем округляется вверх до кратности.
- Пользователь видит результат и его факторы, при необходимости меняет количество, подтверждает подготовку заказа и выгружает CSV.
Дата расчёта в текущем MVP выбирает месяц для сезонного коэффициента и возвращается в ответе. Она пока не выбирает исторический снимок остатков или товара в пути.
Технологии
| Область | Используется |
|---|---|
| Backend | Python 3.14, FastAPI, Uvicorn, Pydantic Settings |
| Frontend | React 19, TypeScript, Vite 7 |
| Контракт API | OpenAPI 3.0.3 (api/openapi.yaml) |
| Работа с Excel | openpyxl подключён для будущего импорта; runtime-MVP Excel пока не импортирует |
| Контейнеризация | Docker Compose, Python slim, Node.js 24, Nginx |
| Тестирование | pytest, FastAPI TestClient |
| AI-модели, внешние API, база данных | В текущем MVP не используются |
Архитектура
Браузер
│ http://localhost:5173
▼
React / Vite frontend ── POST /api/v1/replenishment/calculate ──► FastAPI backend
│
▼
data/demo/replenishment_demo.json
(синтетический fixture MVP)
frontend/— пользовательский интерфейс и CSV-экспорт в браузере.backend/— API и детерминированный расчёт рекомендаций.api/openapi.yaml— единственный публичный контракт между frontend и backend.data/demo/— versioned synthetic данные для демонстрации и тестов.IEK/иSysteme electric/— read-only исходные Excel-книги партнёров.docs/— методика, сценарий демо, приемочные проверки и описание данных.
Установка и запуск
Вариант 1. Docker Compose — рекомендуемый
Требуется Docker Desktop с запущенным Docker Engine.
# Выполняйте из корня клонированного репозитория
Copy-Item .env.example .env
docker compose up --build
Если .env уже создан, повторно копировать его не нужно. После запуска:
- приложение: http://localhost:5173
- Swagger UI: http://localhost:8000/docs
- healthcheck: http://localhost:8000/health
Для запуска в фоне используйте docker compose up --build -d; остановка — docker compose down.
Вариант 2. Запуск без Docker
Требуются Python 3.14+ и Node.js 24+ с npm. Команды backend запускайте из корня репозитория, а не из каталога frontend/.
Терминал 1:
# Выполняйте из корня клонированного репозитория
Copy-Item .env.example .env
py -m venv backend/.venv
backend/.venv/Scripts/python.exe -m pip install -r backend/requirements.txt
backend/.venv/Scripts/python.exe -m uvicorn app.main:app --app-dir backend --reload --port 8000
Терминал 2:
Set-Location frontend
npm.cmd install
npm.cmd run dev
На Windows используйте npm.cmd, если PowerShell блокирует npm.ps1 политикой выполнения.
Как проверить решение
- Откройте http://localhost:5173.
- Выберите IEK, укажите дату
2026-09-22и оставьте остальные параметры по умолчанию. Нажмите «Рассчитать заказ». - Откройте расчёт
IEK-001: в нём видны сезонный коэффициент, коррекция дефицита, текущий остаток, товар в пути и кратность. - Измените дату на январь и пересчитайте: для
IEK-001изменятся сезонный коэффициент и целевой спрос. - Переключитесь на Systeme Electric: отобразится отдельная группа SKU с другой кратностью заказа.
- Измените количество в карточке, отметьте подтверждение и нажмите «Экспортировать CSV». Экспорт допускает только целое неотрицательное количество; без подтверждения или после новой правки он блокируется.
Дополнительно можно проверить API через Swagger UI или командами:
backend/.venv/Scripts/python.exe -m pytest backend/tests -q
Set-Location frontend
npm.cmd run build
Полный сценарий доступен в docs/demo-script.md, а критерии готовности — в docs/acceptance-tests.md.
Данные и интеграции
Работающее приложение читает только data/demo/replenishment_demo.json — синтетический набор с датой и отметкой происхождения. В нём есть продажи, сезонные коэффициенты, остаток, товар в пути, кратность и synthetic коэффициент коррекции дефицита.
Excel-книги в IEK/ и Systeme electric/ сохранены как исходный материал и не изменяются. Они содержат кандидаты на продажи, остатки, движения, MOQ/кратность, товар в пути и сезонность; их структура описана в docs/data-contract.md. В runtime-MVP эти файлы ещё не загружаются.
Внешних API, облачных сервисов, AI/LLM-моделей и базы данных нет.
Ограничения MVP
- Нет импорта и нормализации реальных Excel-данных, хранения снимков и пользовательских правок.
- Нет автоматической отправки или интеграции с поставщиками: CSV — только подготовленная выгрузка для ручного процесса.
- Периоды дефицита, срок поставки и трактовка MOQ в демо имеют явные допущения: коррекция дефицита задана в synthetic fixture, срок поставки вводит пользователь, MOQ используется как кратность округления до бизнес-подтверждения.
- В доступных исходниках отсутствуют customer ID и подтверждённые периоды дефицита. Synthetic customer-транзакция отображается в объяснении как демонстрационное допущение, но не является результатом обработки реальных клиентских данных.
- В репозитории нет deployed-версии и ссылки на публичное окружение.
Полезные материалы
Авторы коммитов
История коммитов
- 2026-09-23 17:36Amir FinalOUTMOON
- 2026-09-23 17:35finalRombik
- 2026-09-23 17:28pre-final frontRombik
- 2026-09-23 17:22final cleaningarthur
- 2026-09-23 17:10Arrt Merge Mainarthur
- 2026-09-23 17:03Roma frontRombik
- 2026-09-23 17:01Arrt pre-final pusharthur
- 2026-09-23 16:45roma commitRombik
Все коммиты (21)
- 2026-09-23 16:32initRombik
- 2026-09-23 16:10Merge pull request #3 from BAITC-Hacks/ArrtBranchamerika12346789-eng
- 2026-09-23 16:02First version of a projarthur
- 2026-09-23 15:57Create design.mdRombik
- 2026-09-23 15:35harness reworkarthur
- 2026-09-23 15:34initOUTMOON
- 2026-09-23 15:33initOUTMOON
- 2026-09-23 15:32Worked on QA branchOUTMOON
- 2026-09-23 15:30Create Задание.txtRombik
- 2026-09-23 15:29Delete docker-compose.ymlRombik
- 2026-09-23 14:38refactored architecture of the projectarthur
- 2026-09-23 14:27changed readmeOUTMOON
- 2026-09-23 14:22init commitcreated arhitecturaRombik
Структура репозитория (58 файлов)
.agents/skills/replenishment-data-contract/SKILL.md .agents/skills/replenishment-verification/SKILL.md .codex/agents/contract-reviewer.toml .codex/agents/data-auditor.toml .codex/agents/replenishment-qa.toml .codex/config.toml .dockerignore .env.example .gitignore AGENTS.md IEK/MOQ ИЭК.xlsx IEK/Динамика продаж_2025-2026.xlsx IEK/Ежемесячные остатки продукции за последние 2 года ИЭК.xlsx IEK/Ежемесячные продажи в количественном выражении за последние 2 года.xlsx IEK/Путь ИЭК 22.09.2026.xlsx IEK/Сезонность ИЭК.xlsx README.md Systeme electric/MOQ SystemElectric.xlsx Systeme electric/Динамика продаж_Syseme Electric_2025-2026.xlsx Systeme electric/Ежемесячные остатки SystemElectric 2024-2026.xlsx Systeme electric/Ежемесячные продажи в кол-м выражении SystemElectric 2024-2026.xlsx Systeme electric/Сезонность SystemElectric 2024-2026.xlsx Systeme electric/Товар в пути_SystemElectric на 22.09.2026.xlsx api/openapi.yaml backend/Dockerfile backend/app/__init__.py backend/app/config.py backend/app/main.py backend/app/models.py backend/app/services/__init__.py backend/app/services/replenishment.py backend/requirements.txt backend/tests/conftest.py backend/tests/test_api.py backend/tests/test_replenishment.py data/demo/replenishment_demo.json design.md docker-compose.yml docs/acceptance-tests.md docs/architecture.md docs/data-contract.md docs/demo-script.md docs/methodology.md docs/reference/hackalem-planning-chat.md docs/reference/hackalem-task.docx frontend/Dockerfile frontend/index.html frontend/package-lock.json frontend/package.json frontend/src/App.tsx frontend/src/api.ts frontend/src/main.tsx frontend/src/orderExport.ts frontend/src/styles.css frontend/src/vite-env.d.ts frontend/tests/orderExport.test.ts frontend/tsconfig.json frontend/vite.config.ts
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.