О проекте
Команда: Метрологи
Кейс HackAlem.ai: Торговля — Электрокомплект · ekt.kz
Стадия: Доведённый продукт
Задача кейса: AI-консультант по каталогу ekt.kz: товары, аналоги, цены, остатки, корзина
Суть
AI-консультант по каталогу ekt.kz: поиск по артикулу, характеристики, кандидаты в аналоги, условия покупки и демо-корзина с явным подтверждением. Один FastAPI-сервис отдаёт фронтенд и API.
Как устроено
Браузерный HTML/JS обращается к одному origin на FastAPI. ChatService через OpenAI Responses API определяет намерение (без ключа работает rules-разбор), факты берутся из SQLite-каталога, наполняемого импортом из EKT API (только GET). Условия покупки хранятся проверенным JSON-снимком со сроком действия. DemoCart работает по схеме «предложение → явное подтверждение»: backend заново проверяет цену и остаток, повтор запроса идемпотентен. Модель не назначает цену и не меняет корзину.
Ключевые решения
- OpenAI Responses API
- intent routing
- SQLite catalog import
- идемпотентные cart proposals
- rate limiting
- HttpOnly cookie sessions
Особенности
Зрелый инженерный процесс: 9 веток по ролям, CI с Docker smoke-проверкой, QA-отчёты, реестр блокеров и pitch. Синтетический demo-режим работает без ключей. Условия покупки версионированы со сроком действия, а просроченные данные не выдаются за актуальные. Публичный стенд так и не опубликован.
Стек
Python · FastAPI · SQLite · JavaScript · HTML/CSS · Docker · GitHub Actions · Railway · pytest · ruff
Модели
OpenAI
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-3c5e22be-team.
README
README.mdEKT AI — умный консультант электротоваров
Прототип команды «Метрологи»: помогает покупателю или закупщику найти товар, сравнить характеристики и кандидатов в аналоги, узнать условия покупки и собрать корзину после явного подтверждения. Менеджер подключается там, где каталога недостаточно.
Статус: подготовлена интеграционная сборка на базе codex/ekt-site-v03 и Backend 0.3.
Внешний стенд ещё не опубликован: ожидается доступ к Python/Docker-хостингу.
http://127.0.0.1:5173 — локальный адрес, недоступный жюри с другого компьютера.
Итоговая приёмка и блокеры · Развёртывание ·
Интерфейс · API · Корзина
Локальный запуск
Нужен Python 3.11+. Из корня репозитория в PowerShell:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r backend/requirements.lock
.\.venv\Scripts\python.exe -m pip install --no-deps -e ./backend
.\.venv\Scripts\python.exe run_demo.py
Откройте http://127.0.0.1:5173. Один процесс FastAPI обслуживает /, /api/* и /cart.
Ctrl+C останавливает сервис. В Linux/macOS замените .venv\Scripts\python.exe на .venv/bin/python.
Запуск создаёт отдельную backend/data/demo.sqlite3 с тремя синтетическими товарами,
включает корзину и выключает EKT/OpenAI-вызовы. Ключи не нужны. Снимок актуален один час;
для повторной демонстрации перезапустите процесс. Основная catalog.sqlite3 не меняется.
Альтернатива с Docker: docker compose up --build, тот же локальный адрес.
Compose включает только синтетический режим и хранит SQLite в именованном volume.
Не публикуйте эту локальную конфигурацию напрямую; для HTTPS используйте инструкцию развёртывания.
Сценарий демонстрации
- Введите
DEMO-001: покажутся нулевой остаток, характеристики и кандидатDEMO-002. - Объясните совпадения характеристик и предупреждение о проверке совместимости специалистом.
- Для
DEMO-002выберите количество 2. Откроется предложение; корзина ещё не изменена. - Нажмите «Подтвердить»: появятся 2 единицы и ссылка
/cartна актуальную корзину сессии. - Откройте корзину; изменение количества, удаление и очистка также требуют подтверждения.
Суммы KZT/шт в тестовой корзине — условные правила демонстрации. Это не предложения EKT. Корзина принадлежит прототипу: нет оплаты, резерва и оформления заказа на ekt.kz.
Архитектура и данные
Браузер: HTML/CSS/JS → один origin FastAPI
├─ ChatService → OpenAI: намерение и краткий контекст (опционально)
├─ Catalog → SQLite: факты, характеристики и время получения
├─ EktClient → только GET: явное обновление реальной карточки
├─ условия покупки → проверенный JSON со сроком действия
└─ DemoCart → предложение → явное подтверждение → корзина сессии
Модель не назначает цену/остаток и не изменяет корзину. Backend повторно проверяет
предложение, цену и остаток; изменение данных требует нового подтверждения. Повтор запроса
с тем же идентификатором не дублирует действие. request_id и message_id сохранены.
Сессии, корзины и история находятся в памяти одного процесса и исчезают при перезапуске.
Токен чата хранится только в памяти страницы; /cart использует HttpOnly cookie без токена в URL.
При повторном открытии вкладки продолжается действующая сессия браузера без продления TTL.
Явный «Новый диалог» завершает её для всех вкладок; независимые профили изолированы.
Источники: backend/examples/demo_catalog.json — синтетические данные;
EKT API — опциональная репрезентативная выборка, требующая серверного доступа.
В реальном API валюта и единица измерения не подтверждены; их нельзя подставлять по догадке.
Общий остаток не гарантирует отгрузку: правила складов и минимальные партии ещё требуют согласования.
Условия — backend/examples/purchase_terms.ekt.json: снимок официального сайта,
проверенный 23.09.2026, действует до 23.10.2026. Источники и расхождения указаны в JSON.
Истёкшие/непроверенные условия не выдаются за актуальные. Отсутствие данных о сертификате
не означает отсутствие сертификата. Вложения, эскалация менеджеру и встраивание в ekt.kz пока не реализованы.
OpenAI и реальный каталог
Из backend/ скопируйте .env.example в .env и настройте серверные значения.
Ключи не отправляйте в браузер и Git. Без OPENAI_API_KEY работает базовый разбор (rules);
точный артикул обрабатывается каталогом (catalog). При настроенном ключе используется
OpenAI Responses API; модель задаёт OPENAI_MODEL (доступность зависит от аккаунта).
cd backend
Copy-Item .env.example .env
# После настройки EKT_USERNAME / EKT_PASSWORD:
..\.venv\Scripts\python.exe -m app.import_catalog --pages 6 --max-details 100 --concurrency 2 --timeout 10 --report data/import-report.json
# Подключить проверенный снимок условий:
Copy-Item examples/purchase_terms.ekt.json data/purchase_terms.json
..\.venv\Scripts\python.exe ../run_server.py
Откройте локальный http://127.0.0.1:8000. Frontend обслуживается тем же сервером.
Для корзины реальных товаров нужны DEMO_CART_ENABLED=true и EKT_LIVE_ENABLED=true:
сервер перепроверяет карточку перед предложением и подтверждением. Ошибка API блокирует действие.
Частичный импорт завершается кодом 2; проверьте отчёт. Нет фоновой полной выгрузки каталога.
Проверки и выпуск
cd backend
..\.venv\Scripts\python.exe -m pytest -q
..\.venv\Scripts\python.exe -m ruff check . ../run_server.py ../run_demo.py
..\.venv\Scripts\python.exe -m pip check
GitHub Actions запускает backend-проверки и сборку Docker с проверкой основных маршрутов.
Фактические результаты текущего прогона и ограничения находятся в docs/final-qa.md;
исторические отчёты docs/backend-qa.md и docs/site-qa.md относятся к прежним ревизиям.
Публичный стенд требует HTTPS, PUBLIC_DEMO=true, серверных секретов входа,
CART_COOKIE_SECURE=true и точного TRUSTED_PROXY_IPS. Защита включает общий лимит запросов,
в том числе новых сессий, и максимальный размер тела. Лимиты сбрасываются при перезапуске
и не заменяют денежный лимит провайдера. Один worker и одна реплика обязательны.
Слияние интеграционного PR в main — после ревью команды.
Авторы коммитов
История коммитов
- 2026-09-23 17:55Document final QA, deployment, known blockers and demo pitchsharakhmedarailym
- 2026-09-23 17:52Integrate one-origin FastAPI site, protected demo deployment and shared browser cart sessionsharakhmedarailym
- 2026-09-23 17:35deploy: serve frontend and API together with Docker and Railway configurationernariod
- 2026-09-23 17:26feat: build reference-based EKT site with backend 0.3 cart confirmation flowernariod
- 2026-09-23 16:48feat: integrate prototype cart with live catalog checks and confirmation flowsBeknazar Nurshaev
- 2026-09-23 16:20feat: integrate main, backend 0.2 and chat frontend with safe request retriesernariod
- 2026-09-23 16:12test: record acceptance run, negative cases and open blocker ledgersharakhmedarailym
- 2026-09-23 16:07Merge remote-tracking branch 'origin/main' into codex/backend-aiBeknazar Nurshaev
Все коммиты (14)
- 2026-09-23 16:07fix: harden catalog search and chat flows with backend auditBeknazar Nurshaev
- 2026-09-23 16:02feat: add responsive catalog chat frontend with backend integrationernariod
- 2026-09-23 15:57feat: add session-bound demo cart with explicit confirmation and replay safetysharakhmedarailym
- 2026-09-23 15:36docs: add draft frontend-backend API contracternariod
- 2026-09-23 15:34feat: add catalog consultation backend and OpenAI intent routingBeknazar Nurshaev
- 2026-09-23 15:20chore: bootstrap Node service, Docker smoke deployment, CI and project docssharakhmedarailym
Структура репозитория (64 файлов)
.dockerignore .github/workflows/backend-tests.yml .gitignore Dockerfile README.md backend/.env.example backend/app/__init__.py backend/app/ai.py backend/app/cart.py backend/app/cart_chat.py backend/app/cart_routes.py backend/app/catalog.py backend/app/chat.py backend/app/config.py backend/app/ekt.py backend/app/errors.py backend/app/import_catalog.py backend/app/main.py backend/app/models.py backend/app/normalize.py backend/app/public_access.py backend/app/search.py backend/app/site.py backend/app/static/cart.html backend/app/static/cart.js backend/app/terms.py backend/examples/demo_catalog.json backend/examples/purchase_terms.ekt.json backend/examples/purchase_terms.example.json backend/pyproject.toml backend/requirements.lock backend/scripts/check_cart_live.py backend/scripts/check_live.py backend/tests/conftest.py backend/tests/test_audit.py backend/tests/test_cart.py backend/tests/test_cart_prototype.py backend/tests/test_catalog.py backend/tests/test_chat.py backend/tests/test_integrations.py backend/tests/test_public_access.py backend/tests/test_site.py compose.yaml docs/backend-api.md docs/backend-qa.md docs/blockers.md docs/cart-api.md docs/cart-qa.md docs/deployment.md docs/final-qa.md docs/frontend-api-contract.md docs/frontend-integration-qa.md docs/pitch.md docs/site-qa.md frontend/README.md frontend/api.js frontend/app.js frontend/icons.js frontend/index.html frontend/styles.css frontend/tests/browser_smoke.py frontend/tests/layout_states.py run_demo.py run_server.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.