AAYMA
RU
Войти

EKT AI

AI-консультант по каталогу ekt.kz: поиск по артикулу, характеристики, кандидаты в аналоги, условия покупки и демо-корзина с явным подтверждением.

Доведённый продукт
Команда «Метрологи» 21💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Метрологи
Кейс 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.md

EKT 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 используйте инструкцию развёртывания.

Сценарий демонстрации

  1. Введите DEMO-001: покажутся нулевой остаток, характеристики и кандидат DEMO-002.
  2. Объясните совпадения характеристик и предупреждение о проверке совместимости специалистом.
  3. Для DEMO-002 выберите количество 2. Откроется предложение; корзина ещё не изменена.
  4. Нажмите «Подтвердить»: появятся 2 единицы и ссылка /cart на актуальную корзину сессии.
  5. Откройте корзину; изменение количества, удаление и очистка также требуют подтверждения.

Суммы 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 — после ревью команды.

Звёзды
⭐ 0
Форки
0
Язык
—
Последний push
в прошлом месяце
Коммиты
14
Авторы
3
Файлы
64
Ветки
9

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

sharakhmedarailym 5ernariod 5Beknazar Nurshaev 4

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

  • 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
Ветки (9)

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

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

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