AAYMA
RU
Войти

Paralax — рекомендации по закупкам

Сервис для менеджера закупок Электрокомплекта.

Рабочий MVP
Команда «Paralax» 10💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Paralax
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Рабочий MVP

Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером

Суть

Сервис для менеджера закупок Электрокомплекта. Он импортирует Excel-книги IEK (продажи, остатки, документы продаж, товар в пути), прогнозирует спрос по SKU и формирует черновик заказа поставщику с факторами расчёта, ручной правкой, утверждением и экспортом в CSV.

Как устроено

Импортёр связывает четыре книги IEK по коду 1С, валидирует их по JSON Schema и ведёт аудит исключённых позиций. Затем очищается история спроса: убираются крупные разовые документы, учитываются пропуски и периоды отсутствия товара. Для каждого SKU статистическая модель выбирается по проверке на прошлых периодах (с трендом и сезонностью), после чего рассчитываются целевой запас, дефицит и количество к заказу. Параметры сценария: срок поставки 14 дней, пересмотр 14, страховой запас 7. FastAPI отдаёт черновики, React-интерфейс показывает их по поставщикам. OpenAI Responses API только объясняет посчитанные факторы (есть проверка ответа и резервный текст) и количество не определяет.

Ключевые решения

  • per-SKU model selection via backtesting
  • trend + seasonality forecasting
  • outlier/one-off order exclusion
  • stockout-aware demand cleaning
  • safety stock / lead time / review period
  • JSON Schema contracts
  • OpenAI Responses API explanations with fallback

Особенности

Жёсткое разделение: количество считает код, LLM только объясняет, а сырые Excel в OpenAI не уходят. Типы фронтенда генерируются из JSON Schema, в docs/updates ведутся поэтапные отчёты проверки.

Стек

Python · FastAPI · Uvicorn · pandas · NumPy · openpyxl · jsonschema · React · TypeScript · Vite · pytest · Ruff · mypy · GitHub Actions

Модели

GPT-4.1 mini


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-4341ec06-paralax.

README

README.md

Paralax — рекомендации по закупкам

Проект команды Paralax для кейса ТОО «Электрокомплект» на HackAlem AI. Сервис помогает менеджеру закупок превратить выгрузки продаж, остатков и товаров в пути в проверяемый черновик заказа поставщикам. Он показывает рекомендуемое количество и факторы расчёта; итоговое решение остаётся за менеджером.

[!IMPORTANT] Это локальный прототип. Остаток IEK взят из среза на 01.09.2026, а сценарная дата расчёта — 22.09.2026. Перед реальной закупкой нужно подтвердить актуальный остаток, охват складов и сроки поставки.

Что реализовано

  • Импорт четырёх книг IEK с привязкой по строковому коду номенклатуры 1С, проверкой данных и аудитом исключённых позиций.
  • Подготовка истории спроса с учётом крупных разовых документов, пропусков и периодов отсутствия товара. Для каждого SKU статистическая модель выбирается по проверке на прошлых периодах; затем Python-код рассчитывает количество на заданный горизонт.
  • FastAPI для запуска расчёта, чтения черновика, ручной правки количества, утверждения, получения объяснения и экспорта CSV.
  • Интерфейс React: обзор, поиск и фильтр рекомендаций, факторы по SKU, черновик по поставщикам и сведения об источниках. Доступны синтетический набор для быстрого демо и расчёт по локальным книгам IEK.
  • Серверный модуль OpenAI для объяснения рассчитанных факторов с проверкой ответа и резервным текстом. Кнопка объяснения в интерфейсе подключена к этому модулю.

Рекомендуемое количество определяет расчётный код, а не языковая модель. Заказ поставщику автоматически не отправляется.

Как работает решение

  1. Менеджер выбирает синтетический набор или IEK и нажимает «Рассчитать».
  2. Backend получает нормализованный JSON либо импортирует Excel. Данные проверяются по контрактам; исходные таблицы не меняются.
  3. Расчётный модуль оценивает спрос, запас, остаток и товар в пути и создаёт рекомендации с факторами, флагами качества и уровнем срочности.
  4. Интерфейс показывает результат и группирует выбранные позиции по поставщикам. Менеджер может изменить количество, утвердить черновик и скачать CSV.

Подробные правила и контрольные примеры описаны в методологии. Полное ТЗ и границы MVP — в спецификации.

Технологии

  • Backend: Python 3.11+, FastAPI, Uvicorn, pandas, NumPy, openpyxl, jsonschema.
  • Frontend: React 19, TypeScript, Vite, lucide-react; типы результата генерируются из JSON Schema.
  • AI: OpenAI Python SDK и Responses API; по умолчанию GPT-4.1 mini. Демо-ключ предоставлен владельцем проекта в корневом .env; backend загружает его при запуске.
  • Качество: pytest, Ruff, mypy, ESLint, Prettier, TypeScript и сборка Vite.

Архитектура

flowchart LR
    A["Excel IEK или синтетический JSON"] --> B["Импорт и валидация"]
    B --> C["Прогноз и расчёт заказа"]
    C --> D["FastAPI: черновики и экспорт"]
    D --> E["React: проверка и утверждение"]
    D --> F["Серверный модуль OpenAI"]
    F --> G["Объяснение или резервный текст"]

Основной код: импортёр IEK, прогноз, расчёт, HTTP API, AI-модуль и интерфейс. Состояние черновиков хранится в памяти backend.

Установка и запуск

Нужны Python 3.11+ и Node.js с npm. Команды ниже приведены для PowerShell из корня клонированного репозитория.

git clone https://github.com/BAITC-Hacks/hack-4341ec06-paralax.git
cd hack-4341ec06-paralax
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e ".[dev]"
npm ci --prefix frontend

В первом терминале запустите API:

.\.venv\Scripts\python.exe -m uvicorn backend.app:app --reload

Во втором терминале запустите интерфейс:

npm run dev --prefix frontend

Откройте http://127.0.0.1:5173. Vite направляет запросы /api на локальный backend по адресу http://127.0.0.1:8000; описание API доступно на http://127.0.0.1:8000/docs. На Linux/macOS используйте .venv/bin/python вместо .venv\Scripts\python.exe. Дополнительные параметры интерфейса — в frontend/README.md.

Проверки проекта:

.\.venv\Scripts\python.exe scripts/check.py

Команда запускает Python-тесты, форматирование, линтер и типизацию, а также frontend-тест, проверки и сборку.

Как проверить решение

Быстрый сценарий без API-ключа и Excel:

  1. Откройте интерфейс, оставьте набор «Синтетический» и нажмите «Рассчитать». Это запускает действующий расчётный API на синтетическом входе, а не показывает готовую картинку.
  2. Откройте «Рекомендации», выберите SKU, посмотрите факторы и предупреждения. Измените выбранное количество и сохраните.
  3. Откройте «Черновик заказа», проверьте позиции по поставщикам, нажмите «Утвердить черновик» и «Скачать CSV». Поставщику ничего не отправится.

Проверка IEK: выберите «IEK · Excel» и запустите расчёт. Backend использует подготовленный локальный JSON, если он есть в outputs/, иначе импортирует четыре книги из data/IEK/. Первый расчёт может занять около минуты. Для воспроизводимого запуска через CLI:

.\.venv\Scripts\python.exe -m backend.cli --data-dir data --output outputs/iek-planning-result.json --limit 50

CLI создаёт результат, нормализованный вход и аудит в outputs/. Описание входных файлов и допущений — в карте данных и инструкции расчёта.

В синтетическом сценарии кнопка «AI-объяснение» вызывает OpenAI через backend с общим демо-ключом из .env. При ошибке API показывается резервное объяснение. Проверить пять платных запросов отдельно можно командой .\.venv\Scripts\python.exe scripts/check.py --live-openai; отчёт сохраняется в outputs/.

Данные и интеграции

В data/ лежат 12 переданных Excel-книг IEK и Systeme Electric. Текущий импортёр использует четыре книги IEK: месячные продажи, месячные остатки, документы продаж и товар в пути. Книги Systeme Electric, MOQ и агрегированная сезонность в этом расчёте не участвуют. Синтетические данные и проверочные сценарии находятся в fixtures/.

Исходные Excel не отправляются в OpenAI API. Для синтетического набора сервис получает только рассчитанные факторы; для партнёрского IEK без разрешения на передачу агрегатов остаётся резервное объяснение. Без ключа расчёт и интерфейс работают. Демонстрационный .env включён в ветку akzhan по явному запросу владельца проекта; data/private/, data/raw/ и производные результаты outputs/ исключены из Git. Любой обладатель этого ключа может расходовать бюджет OpenAI-проекта.

Ограничения текущей версии

  • Демонстрационный импорт выбирает до 50 пригодных SKU IEK; эта выборка не представляет весь ассортимент. Адаптера Systeme Electric нет.
  • Остаток не восстановлен с 01.09.2026 до сценарной даты 22.09.2026. Охват складов не подтверждён. Срок поставки 14 дней, период пересмотра 14 дней и страховой запас 7 дней — параметры сценария, а не сведения поставщика.
  • ID клиентов и цены в используемых таблицах отсутствуют. Поэтому крупный документ нельзя достоверно назвать заказом одного клиента, а финансовую стоимость заказа нельзя рассчитать.
  • Для IEK HTTP-объяснение остаётся резервным до разрешения на передачу агрегированных данных. Черновики хранятся только в памяти сервера и исчезают после его перезапуска.
  • Интеграция с 1С и автоматическая отправка заказа поставщику не реализованы. Выгрузка CSV и утверждение остаются локальным решением менеджера.

Развёрнутая версия и материалы

Ссылка на развёрнутую версию в репозитории не указана; решение запускается локально по инструкции выше.

Звёзды
⭐ 1
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
44
Авторы
3
Файлы
96
Ветки
5

Авторы коммитов

Codex 18Imakind 13Rami30m 13

История коммитов

  • 2026-09-23 17:45Rewrite README for hackathon juryRami30m
  • 2026-09-23 17:40Merge Akzhan forecasting and methodology updatesRami30m
  • 2026-09-23 17:35Merge UI branch and connect procurement workflowRami30m
  • 2026-09-23 17:12Merge Akzhan forecasting into procurement APIRami30m
  • 2026-09-23 17:59Merge pull request #1 from BAITC-Hacks/akzhanImakind
  • 2026-09-23 17:57Enable shared OpenAI demo explanations for judgesImakind
  • 2026-09-23 17:44Record stage 8 dashboard verificationCodex
  • 2026-09-23 17:44Add live purchasing dashboard for stage 8Codex
Все коммиты (44)
  • 2026-09-23 16:42Build procurement HTTP API and review workflowRami30m
  • 2026-09-23 17:32Document forecasting methodology with create-readme skillImakind
  • 2026-09-23 16:30Adapt planning input contract to supplied ExcelRami30m
  • 2026-09-23 17:27Record stage 7 validation and demoCodex
  • 2026-09-23 17:27Close forecasting MVP gaps and require real OpenAI in live checksImakind
  • 2026-09-23 17:26Add auditable per-SKU calculation trace for stage 7Codex
  • 2026-09-23 17:23Define missing MVP stockout and explanation acceptance rulesImakind
  • 2026-09-23 16:08Make generated type checks stable on WindowsRami30m
  • 2026-09-23 17:08Record stage 6 validation and demoCodex
  • 2026-09-23 17:07Add stage 6 purchase recommendations with user stock inputCodex
  • 2026-09-23 17:03Benchmark 20 live GPT requests with independent forecast reviewImakind
  • 2026-09-23 16:51Record backend stage five verificationCodex
  • 2026-09-23 16:51Calculate traceable deficit with source balance qualityCodex
  • 2026-09-23 15:49Add schema-derived planning types and UI demo mockRami30m
  • 2026-09-23 16:49Configure GPT-4.1 mini and verify live Responses APIImakind
  • 2026-09-23 16:43Record forecasting checks, demo artifacts and integration limitsImakind
  • 2026-09-23 16:43Implement auditable IEK forecasting, JSON output and grounded OpenAI explanationsImakind
  • 2026-09-23 16:38Record backend stage four verificationCodex
  • 2026-09-23 16:38Calculate traceable target stock from forecast horizonCodex
  • 2026-09-23 15:35Add supplied procurement workbooksRami30m
  • 2026-09-23 16:31Link forecasting policy from specification before implementationImakind
  • 2026-09-23 16:31Define additive Excel forecasting contract and calculation policyImakind
  • 2026-09-23 16:30Record UI scaffold progressCodex
  • 2026-09-23 16:30Build minimal procurement UI scaffold from typed demo resultCodex
  • 2026-09-23 15:28Add sprint specification and quality harnessRami30m
  • 2026-09-23 16:17Forecast monthly demand with trend and SKU seasonalityCodex
  • 2026-09-23 16:11Calculate explainable weighted base demandCodex
  • 2026-09-23 15:11Document procurement MVP and team workstreamsRami30m
  • 2026-09-23 16:06feat(data): add akzhan workbook preparation skeletonImakind
  • 2026-09-23 16:06Calculate traceable clean demand from source workbooksCodex
  • 2026-09-23 15:49Document source data and audit workbook qualityCodex
  • 2026-09-23 14:43Confirm procurement track selectionRami30m
  • 2026-09-23 14:26Add provisional procurement spec and team contractsRami30m
  • 2026-09-23 15:25docs: record UI demo verification and integration statusCodex
  • 2026-09-23 15:25feat(ui): add procurement planning dashboard and demo flowCodex
  • 2026-09-23 14:18Add HackAlem procurement case to READMEImakind
Структура репозитория (96 файлов)
.agents/skills/create-readme/SKILL.md
.env
.env.example
.gitattributes
.github/workflows/check.yml
.gitignore
AGENTS.md
README.md
backend/__init__.py
backend/ai.py
backend/app.py
backend/cli.py
backend/evaluation.py
backend/explanations.py
backend/forecast.py
backend/importers/__init__.py
backend/importers/iek.py
backend/planning.py
backend/store.py
backend/validation.py
backend/workflow.py
contracts/README.md
contracts/api.md
contracts/explanation.schema.json
contracts/planning-input.schema.json
contracts/planning-result.schema.json
data/IEK/MOQ  ИЭК.xlsx
data/IEK/Динамика продаж_2025-2026.xlsx
data/IEK/Ежемесячные остатки продукции за последние 2 года  ИЭК.xlsx
data/IEK/Ежемесячные продажи в количественном выражении за последние 2 года.xlsx
data/IEK/Путь ИЭК 22.09.2026.xlsx
data/IEK/Сезонность ИЭК.xlsx
data/Systeme electric/MOQ SystemElectric.xlsx
data/Systeme electric/Динамика продаж_Syseme Electric_2025-2026.xlsx
data/Systeme electric/Ежемесячные остатки SystemElectric 2024-2026.xlsx
data/Systeme electric/Ежемесячные продажи в кол-м выражении SystemElectric 2024-2026.xlsx
data/Systeme electric/Сезонность SystemElectric 2024-2026.xlsx
data/Systeme electric/Товар в пути_SystemElectric на 22.09.2026.xlsx
docs/architecture.md
docs/case-brief-original.md
docs/data-map.md
docs/decisions.md
docs/methodology.md
docs/openai-benchmark-20260923.md
docs/prediction-design.md
docs/prediction-run.md
docs/spec.md
docs/tasks.md
docs/updates/README.md
docs/updates/codex/1525.md
docs/updates/codex/1630.md
docs/updates/codex/1642.md
docs/updates/codex/1649.md
docs/updates/codex/1701.md
docs/updates/codex/1726.md
docs/updates/codex/1732.md
docs/updates/codex/1834.md
docs/updates/codex/1855.md
fixtures/planning-input.sample.json
fixtures/planning-result.demo.json
fixtures/planning-result.sample.json
fixtures/scenarios.md
frontend/.env.example
frontend/README.md
frontend/eslint.config.js
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/scripts/generate-types.mjs
frontend/src/App.tsx
frontend/src/components/RecommendationDetail.tsx
frontend/src/lib/planningClient.ts
frontend/src/lib/presentation.ts
frontend/src/main.tsx
frontend/src/mocks/planning-demo.generated.ts
frontend/src/pages/OrdersPage.tsx
frontend/src/pages/OverviewPage.tsx
frontend/src/pages/RecommendationsPage.tsx
frontend/src/pages/SourcesPage.tsx
frontend/src/styles.css
frontend/src/types/planning.generated.ts
frontend/src/vite-env.d.ts
frontend/tests/smoke.test.mjs
frontend/tsconfig.json
frontend/vite.config.ts
pyproject.toml
scripts/benchmark_openai.py
scripts/check.py
scripts/check_prediction.py
skills-lock.json
tests/test_acceptance.py
tests/test_api.py
tests/test_contracts.py
tests/test_mvp_gaps.py
tests/test_openai_benchmark.py
tests/test_prediction.py
Ветки (5)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.