О проекте
Команда: tAIgers
Кейс HackAlem.ai: Торговля — Электрокомплект · ekt.kz
Стадия: Рабочий MVP
Задача кейса: AI-консультант по каталогу ekt.kz: товары, аналоги, цены, остатки, корзина
Суть
MVP ИИ-консультанта ekt.kz с функцией Spec to Cart: из спецификации (PDF/DOCX/XLSX/фото) извлекает позиции, сопоставляет с каталогом, проверяет остатки по складам, предлагает аналоги и готовит корзину к подтверждению.
Как устроено
FastAPI-бэкенд; OpenAI Responses API с function calling выбирает инструмент (поиск, detail, аналоги, условия покупки, prepare_cart), данные берутся из read-only EKT API. Spec to Cart: извлечение строк → confidence gate блокирует рискованные совпадения → проверка остатков и план комплектации с нескольких складов → аналоги для дефицитных позиций. Двухфазная корзина prepare (операция на 10 минут) → отдельный POST /api/cart/confirm с повторной проверкой остатка и идемпотентным commit.
Ключевые решения
- function calling
- spec extraction
- confidence gating
- multi-warehouse fulfillment plan
- two-phase idempotent cart
Особенности
Двухфазная идемпотентная корзина с серверной защитой (не полагается только на промпт) и план сборки заказа с нескольких складов по спецификации.
Стек
Python · FastAPI · JavaScript · HTML/CSS · pytest
Модели
OpenAI Responses API
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-0a2973f6-taigers.
README
README.mdEKT AI Assistant
Рабочий MVP ИИ-консультанта для ekt.kz. Он использует реальный API каталога, показывает актуальные цены и остатки, ищет аналоги, разбирает вложения и изменяет демонстрационную корзину только после явного подтверждения.
Главная демонстрационная функция — Procurement Control Tower / Spec to Cart. Пользователь загружает PDF, DOCX, XLSX или фотографию спецификации, после чего система:
- извлекает наименования, артикулы и количество;
- сопоставляет каждую строку с реальным каталогом;
- рассчитывает уверенность и блокирует рискованные автосовпадения;
- проверяет общий остаток и возможность собрать заказ на одном складе;
- строит план комплектации с нескольких складов;
- предлагает объяснимые аналоги для дефицитных позиций;
- массово готовит только безопасно сопоставленные строки к подтверждению корзины.
Архитектура
Browser chat
│
▼
FastAPI ── OpenAI Responses API
├──── EKT catalog API (Basic Auth, read only)
├──── file extraction (PDF, DOCX, XLSX, images)
├──── purchase terms JSON
└──── two-phase cart adapter
prepare → explicit confirmation → commit
Specification → extraction → confidence gate → live stock → warehouse plan → reviewed cart
ИИ отвечает за понимание естественного языка и формулировку ответа. Цена, остаток, свойства и рекомендации всегда приходят из backend-инструментов. Корзина защищена серверной проверкой; prompt не является единственной линией защиты.
Быстрый запуск
Требуется Python 3.11 или новее.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
В .env задайте OPENAI_API_KEY. Доступ к каталогу уже настроен локально, а файл .env исключён из Git.
uvicorn app.main:app --reload --port 8000
Откройте http://localhost:8000. API-документация: http://localhost:8000/docs.
Без OPENAI_API_KEY приложение работает в ограниченном режиме: поиск товара по тексту/ID, карточка товара и условия покупки. Для естественного диалога, изображений и вызова инструментов нужен ключ.
Как устроен запрос
- Браузер отправляет сообщение и идентификатор сессии в
POST /api/chat. - Модель выбирает строго описанный инструмент: поиск, detail, аналоги, условия или подготовку корзины.
- Backend вызывает ekt.kz и возвращает модели JSON.
- Модель формирует ответ только из полученных данных.
prepare_cartпроверяет остаток и создаёт временную операцию на 10 минут, но не меняет корзину.- Кнопка вызывает отдельный
POST /api/cart/confirm; backend повторно проверяет остаток и идемпотентно фиксирует изменение.
Spec to Cart API
POST /api/spec/analyze— multipart-загрузка спецификации и полный procurement-анализ.POST /api/spec/prepare-cart— подготовка выбранных безопасных строк к подтверждению.
Анализ хранит снимок источника, время проверки и причину каждого решения. Строки с низкой уверенностью не выбираются автоматически.
Подключение реальной корзины ekt.kz
Сейчас используется DemoCartService с хранением в памяти процесса, поскольку предоставлены только read-only endpoints каталога. После получения API корзины:
- Создайте
EktCartServiceс методамиprepare,commitиget_cart. - В
commitиспользуйте серверную авторизацию пользователя или безопасный cart token — не Basic Auth каталога в браузере. - Перед фактическим запросом ещё раз получите detail товара и проверьте остаток.
- Передавайте idempotency key, равный
pending_id. - Верните настоящий URL корзины в
cart_url. - Замените создание
DemoCartServiceвapp/main.py.
Для production временные операции и корзины следует хранить в Redis/PostgreSQL.
Данные и безопасность
- Учётные данные ekt.kz находятся только в
.env, исключённом из Git. - Frontend никогда не получает Basic Auth.
- OpenAI вызывается с
store=False. - Платёжные данные не запрашиваются и не хранятся.
- Файлы ограничены по размеру и не сохраняются на диск.
- Условия в
data/purchase_terms.jsonпока демонстрационные и требуют подтверждения партнёра.
Для production добавьте авторизацию, rate limiting, антивирусную проверку файлов, Redis, аудит действий и очистку логов.
Тесты
pytest -q
Тесты проверяют явное подтверждение, идемпотентность commit и запрет количества выше остатка.
Структура
app/main.py HTTP endpoints
app/services/assistant.py OpenAI tools and safety prompt
app/services/ekt_client.py catalog adapter and analog search
app/services/cart.py two-phase safe cart
app/services/files.py PDF, DOCX, XLSX and image handling
app/static/ responsive chat and cart UI
data/purchase_terms.json editable purchase conditions
tests/ safety tests
Что ещё запросить у партнёра
- API создания/чтения корзины и способ связать её с web-сессией.
- Официальные условия оплаты, доставки и минимальной партии.
- Серверный поиск каталога, если он поддерживается.
- Источник сертификатов или отдельное поле/endpoint.
- Правила, какие склады считать доступными для онлайн-заказа.
Авторы коммитов
История коммитов
- 2026-09-23 17:44Build EKT AI procurement assistant with Spec to CartAmirkhan
- 2026-09-23 15:08test3Arusha
- 2026-09-23 15:06Merge remote-tracking branch 'origin/main' and resolve workspace.xmlArusha
- 2026-09-23 15:04created fileamirkhan_tulkibayev
- 2026-09-23 15:03test.pyArusha
- 2026-09-23 15:01delete folderamirkhan_tulkibayev
- 2026-09-23 15:00test2amirkhan_tulkibayev
- 2026-09-23 14:58test1amirkhan_tulkibayev
Все коммиты (11)
- 2026-09-23 14:56test1amirkhan_tulkibayev
- 2026-09-23 14:48Add a brief description to READMEAruzhan Amerkhanova
- 2026-09-23 14:481st commitamirkhan_tulkibayev
Структура репозитория (26 файлов)
.ai/mcp/mcp.json .env.example .gitignore README.md app/__init__.py app/config.py app/main.py app/models.py app/services/__init__.py app/services/assistant.py app/services/cart.py app/services/ekt_client.py app/services/files.py app/services/spec.py app/services/terms.py app/static/app.js app/static/cart.html app/static/index.html app/static/styles.css data/purchase_terms.json pyproject.toml requirements.txt test.py tests/test_assistant.py tests/test_cart.py tests/test_spec.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.