О проекте
Команда: Y.E.R.A. AI
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Рабочий MVP
Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером
Суть
Streamlit-MVP для менеджера закупа: детерминированный движок считает рекомендованные заказы по ИЭК и Systeme Electric с учётом выбросов, stockout, сезонности и MOQ, показывает кассовый разрыв и даёт Text-to-SQL чат по базе.
Как устроено
Демо-данные лежат в SQLite storage.db. Пайплайн core: detect_outliers (IQR плюс доля одного client_hash в месяце) → calculate_recommendations (компенсация stockout, индекс сезонности, тренд 3/3 мес., округление под MOQ и кратность) → recommended_orders со статусом draft. Менеджер задаёт бюджет, утверждает позиции и выгружает CSV. LLM не считает количества и работает только в чате: вопрос на естественном языке → безопасный SELECT → ответ.
Ключевые решения
- IQR-детекция выбросов
- компенсация stockout
- сезонный индекс
- округление под MOQ
- Text-to-SQL с валидацией SELECT
- анализ кассового разрыва
Особенности
Text-to-SQL ассистент, которому разрешено выполнять только проверенные SELECT, и блок финансового контроля кассового разрыва. Данные сгенерированы сидером, реальные выгрузки не читаются.
Стек
Python · Streamlit · pandas · SQLite · OpenAI API
Модели
OpenAI gpt-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-1c78f02e-y-e-r-a-ai.
README
README.mdY.E.R.A. AI
Yield Logistics & Evaluation Routing Agent
| Трек | Логистика · кейс ТОО «Электрокомплект» |
| Хакатон | HackAlem AI |
| Роль | Разработчик-одиночка (Fullstack AI Engineer) |
| Стек | Python · Streamlit · SQLite · OpenAI API |
1. Название проекта
Y.E.R.A. AI
Yield Logistics & Evaluation Routing Agent — аналитический агент закупа для автоматического расчёта рекомендованных (не автоматических) заказов поставщикам на основе истории продаж, остатков, товара в пути, сезонности и периодов дефицита.
2. Краткое описание
Менеджер закупа «Электрокомплекта» часто считает пополнение склада вручную в Excel: расчёт делается редко, разовые крупные отгрузки искажают регулярный спрос, а периоды stockout занижают потребность. Итог — перезакуп одних позиций и дефицит других.
Y.E.R.A. AI решает эту задачу детерминированным Python-движком:
- считает регулярную потребность по артикулам с учётом всех источников данных из SQLite;
- исключает аномальные разовые всплески из базы regular demand (без удаления из истории);
- компенсирует упущенный спрос в периоды отсутствия товара;
- округляет заказ под MOQ / кратность поставщика (ИЭК, Systeme Electric);
- показывает финансовый контроль кассового разрыва;
- даёт менеджеру Text-to-SQL чат для вопросов к
storage.db; - никогда не отправляет заказ поставщику без явного утверждения человеком (
draft→approved).
3. Что реализовано
- Детерминированная очистка выбросов —
detect_outliers()вcore/outliers.py: IQR + доля одногоclient_hashв месяце; флагis_outlierпишется вsales_transactions, история не удаляется. - Компенсация stockout — периоды из
stockout_periodsувеличивают потребность (stockout_adj), чтобы дефицит не занижал регулярный заказ. - Сезонность и тренд — индекс из
seasonality_referenceи отношение средних продаж 3/3 мес. (core/demand.py). - MOQ / кратность —
apply_moq_rounding()вdatabase.pyдляmin_ship_qtyиmultiplicity(демо-данные ИЭК и Systeme Electric). - Финансовый анализ — сумма закупа по
unit_cost, ввод бюджета менеджера, метрика кассового разрыва, выделение срочных позиций (критическая/высокая). - Text-to-SQL ИИ-ассистент — вкладка чата: NL → безопасный
SELECT→ выполнениеexecute_readonly_query()/is_safe_select()→ ответ Y.E.R.A. AI (модель по умолчаниюgpt-4o-mini). - Экспорт CSV —
st.download_button, файлyera_recommended_orders.csv, кодировкаutf-8-sig, разделитель;для корректного открытия в Microsoft Excel. - UI — премиум тёмная тема, горизонтальные
st.tabs(Дашборд / Рекомендации / ИИ-Ассистент), KPI-карточки и hover-анимации на CSS, настройки API в expander шапки.
4. Как работает решение
Пользовательский сценарий для менеджера закупа:
- Данные — при первом запуске создаётся / наполняется локальная БД
storage.db(database.py: схема + демо ИЭК / Systeme Electric). - Дашборд — KPI (товары, критический дефицит, объём в пути, черновики), превью последнего расчёта, остатки и помесячные продажи.
- Рекомендации — кнопка «Запустить интеллектуальный расчет пополнения Y.E.R.A. AI» → пайплайн
core/pipeline.py(detect_outliers→calculate_recommendations→ запись вrecommended_ordersсо статусомdraft). - Финансовый контроль — менеджер задаёт бюджет (₸), видит сумму закупа, срочную часть и кассовый разрыв.
- Утверждение — выбор позиций и
approved_by; автоотправки поставщику нет. - Выгрузка — «Скачать отчет закупа в CSV».
- ИИ-чат — вопросы на естественном языке к
storage.db(например: «Покажи товары ИЭК»).
Excel/демо-данные → SQLite (storage.db)
↓
core/ (outliers + demand) ← qty только Python, не LLM
↓
recommended_orders (draft)
↓
Streamlit UI: утверждение / CSV / Text-to-SQL чат
5. Технологии
| Компонент | Использование в проекте |
|---|---|
| Python 3.11+ | Бизнес-логика, ETL-сид, API-обвязка |
| Streamlit | UI: st.tabs, KPI st.metric, чат st.chat_message / st.chat_input, кастомный CSS (тёмная тема, hover) |
| pandas | Таблицы расчёта и отображения |
SQLite (sqlite3) | Локальная БД storage.db |
| OpenAI API | Только объяснения и Text-to-SQL (gpt-4o-mini по умолчанию); не считает qty |
| Конфиг ключа | OPENAI_API_KEY через os.getenv / .env / st.secrets / ручной ввод в шапке |
Зависимости из requirements.txt:
streamlit>=1.32.0
pandas>=2.0.0
openai>=1.40.0
Расчёт количеств заказов выполняется только детерминированным кодом в
core/. LLM не участвует в формуле потребности (требование воспроизводимости).
6. Архитектура проекта
HackAlem.ai_project/
├── app.py # Streamlit UI + чат Text-to-SQL + экспорт CSV
├── database.py # Схема SQLite, сид демо-данных, MOQ, safe SELECT
├── storage.db # Локальная база (создаётся при запуске)
├── .env # OPENAI_API_KEY (не коммитить в публичный репозиторий)
├── agent_prompt.txt # Системный промпт ассистента Y.E.R.A. AI
├── requirements.txt
├── core/
│ ├── outliers.py # detect_outliers()
│ ├── demand.py # calculate_recommendations() — чистые функции
│ └── pipeline.py # Оркестрация одного прогона расчёта
└── repository/
└── data.py # Чтение/запись БД (без бизнес-формул)
Взаимодействие:
app.pyвызываетrun_replenishment_calculation()и функцииrepository/database.core/получает DataFrame и возвращает результат без прямых SQL внутри формул спроса.database.pyвладеет схемой таблиц (suppliers,products,sales_transactions,monthly_stock,monthly_sales,stockout_periods,transit_orders,seasonality_reference,recommended_orders) и read-only SQL для чата.- OpenAI вызывается только из чата (и опционально для текста обоснований по уже посчитанным цифрам).
7. Установка и запуск
Требования
- Python 3.11+
- Ключ OpenAI в переменной окружения или в файле
.env:
OPENAI_API_KEY=sk-...
На Windows (PowerShell), чтобы ключ был доступен процессу Streamlit:
$env:OPENAI_API_KEY = "sk-..."
или задайте User-переменную окружения и перезапустите терминал.
Шаги
cd HackAlem.ai_project
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
# (опционально) пересоздать демо-БД
python database.py
# запуск интерфейса
streamlit run app.py
Приложение откроется по адресу http://localhost:8501.
Если storage.db ещё нет, app.py сам вызовет init_db + seed_test_data при старте.
8. Как проверить решение
Сценарий для жюри HackAlem AI (~5 минут):
- Открыть http://localhost:8501.
- Убедиться, что в шапке «⚙️ Настройки API» ключ подхвачен из окружения (или ввести fallback).
- Вкладка «📦 Рекомендации» → нажать
«Запустить интеллектуальный расчет пополнения Y.E.R.A. AI». - Дождаться появления таблицы рекомендованных заказов и блоков MOQ / финансового анализа.
- Изменить «Доступный бюджет закупа, ₸» и проверить пересчёт кассового разрыва.
- При необходимости утвердить позиции (указать ФИО / логин утверждающего).
- Скачать «📥 Скачать отчет закупа в CSV» и открыть в Excel (колонки должны разделиться по
;, кириллица читаема). - Вкладка «💬 ИИ-Ассистент» → вопрос:
«Покажи товары ИЭК»
→ в ответе числа из БД; в expander можно посмотреть безопасный SQLSELECT.
Дополнительно на «📊 Дашборд закупа»: KPI и остатки / помесячные продажи по фильтрам поставщик / категория.
9. Данные и интеграции
| Источник | Содержание |
|---|---|
storage.db | Единая локальная SQLite-база |
| Поставщики (демо) | ИЭК, Systeme Electric |
| Продажи | sales_transactions (отгрузки с отрицательным quantity, обезличенный client_hash) |
| Агрегаты | monthly_sales, monthly_stock |
| В пути / дефицит | transit_orders, stockout_periods |
| Сезонность | seasonality_reference |
| MOQ | products.min_ship_qty, products.multiplicity, unit_cost |
| Результат | recommended_orders + человекочитаемое justification |
Клиентские идентификаторы в БД только как sha256 (hash_client_id в database.py). Неанонимизированные ID клиентов в расчёт не попадают.
Интеграция с реальной 1С «Электрокомплекта» в текущей версии не подключена — данные симулируются сидером / локальным файлом БД.
10. Ограничения
Честно о статусе MVP:
- Локальная SQLite, без облачной репликации и многопользовательской блокировки «как в проде».
- Нет прямого API-шлюза к 1С / EDI поставщиков — для промышленного контура потребуется ETL из выгрузок 1С и отдельный backend.
- Заказ не уходит поставщику по email/API автоматически (осознанное ограничение по ТЗ).
- Качество Text-to-SQL зависит от доступности OpenAI API и корректности
OPENAI_API_KEY. - Демо-набор SKU ограничен сидером; на полной номенклатуре нужны тюнинг порогов выбросов и объёмы истории.
- Файл
.envс секретами не должен попадать в публичный git.
11. Ссылка на deployed-версию
Локальный запуск для демонстрации жюри:
http://localhost:8501
Команда:
streamlit run app.py
Контакты / роль
Fullstack AI Engineer (solo) · трек «Логистика» · кейс ТОО «Электрокомплект» · HackAlem AI
Y.E.R.A. AI — рекомендованный заказ с объяснимостью, а не «чёрный ящик».
Авторы коммитов
История коммитов
- 2026-09-23 17:49docs: finalize official README.md documentation for judgesYera
- 2026-09-23 17:16fix(export): change CSV delimiter to semicolon for automatic Excel columns separationYera
- 2026-09-23 16:50feat(agent-chat): add interactive Text-to-SQL AI assistant with safety validationYera
- 2026-09-23 15:38feat(cashflow): прогноз кассового разрыва при исполнении заказаYera
- 2026-09-23 15:21feat(moq): валидация рекомендованного кол-ва под MOQ и кратность поставщикаYera
- 2026-09-23 14:12Add Y.E.R.A. AI core engine and Streamlit MVP dashboardYera
Структура репозитория (14 файлов)
.cursorrules .env README.md agent_prompt.txt app.py core/__init__.py core/demand.py core/outliers.py core/pipeline.py database.py repository/__init__.py repository/data.py requirements.txt storage.db
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.