О проекте
Команда: Flawless
Кейс HackAlem.ai: Торговля — Электрокомплект · ekt.kz
Стадия: Доведённый продукт
Задача кейса: AI-консультант по каталогу ekt.kz: товары, аналоги, цены, остатки, корзина
Суть
Чат-консультант для покупателей ekt.kz на русском и казахском: ищет товары через API ekt.kz, показывает цены, остатки и характеристики, подбирает аналоги и управляет корзиной только после явного подтверждения пользователя.
Как устроено
FastAPI валидирует запрос и хранит серверную историю сессии. gpt-4.1-mini через function calling выбирает инструмент: поиск, карточку товара, аналоги, условия покупки или корзину. Backend берёт факты из REST API ekt.kz (Basic Auth, read-only) и передаёт модели нормализованные данные. Guardrails перед ответом проверяют, что цена, остаток, артикул и характеристики подтверждены результатами инструментов. Корзина меняется после повторной серверной проверки остатка, UI-действия валидируются сервером. Вложения (фото, PDF, DOCX, XLSX) разбираются с жёсткими лимитами.
Ключевые решения
- function calling
- guardrails проверки фактов
- серверная валидация UI-действий
- защита от prompt injection
- vision для поиска по фото
- идемпотентное добавление в корзину
Особенности
Работает с живым API ekt.kz без векторной копии каталога. Guardrails не дают модели выдумать цену или остаток, запрещено добавлять товар сверх остатка, платёжные данные блокируются. Есть adversarial-тесты корзины и детерминированный офлайн-режим на фикстуре из 40 товаров.
Стек
Python 3.12 · FastAPI · Pydantic · Uvicorn · requests · pypdf · python-docx · openpyxl · JavaScript · Tailwind CSS · Vercel · Render · unittest
Модели
gpt-4.1-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-21ad5124-flawless.
README
README.mdEKT AI — ИИ-ассистент интернет-магазина электротоваров
Чат-консультант для покупателей ekt.kz: находит товары в реальном каталоге, проверяет цену и остаток, предлагает аналоги и помогает собрать корзину.
Ранее опубликованная демо-версия: ekt-ai-assistant-demo.vercel.app
Версию запущенного кода и активный источник каталога можно проверить через /health.
Краткое описание
Покупателю электротоваров часто приходится вручную просматривать большой каталог, сопоставлять характеристики и уточнять наличие у менеджера. EKT AI переносит этот путь в один диалог.
Пользователь формулирует задачу обычным языком на русском или казахском, а ассистент загружает каталог напрямую из API ekt.kz, возвращает подтверждённые данные и помогает выбрать товар. Решение рассчитано на покупателей ekt.kz.
Что реализовано
- поиск по названию, артикулу, категории и характеристикам товара;
- получение цены, остатка, характеристик, сертификатов и наличия по складам, если эти данные присутствуют в ответе EKT API;
- подбор доступных аналогов из той же категории;
- ответы по условиям оплаты, доставки и покупки;
- ответы на русском и казахском языках;
- безопасные интерактивные действия под ответом: характеристики, аналоги, наличие, сравнение и добавление в корзину;
- добавление товара только после явного подтверждения пользователя;
- изменение количества, удаление позиции и очистка корзины по явной команде;
- проверка количества и запрет добавления сверх текущего остатка;
- защита от повторного добавления при повторном или конкурентном запросе;
- блокировка платёжных данных, попыток раскрыть системный промпт и неподтверждённых товарных фактов;
- адаптивный интерфейс в стиле EKT для компьютеров и мобильных устройств;
- вложения с жёсткими лимитами: фото из интерфейса, а также PDF, DOCX и XLSX через API;
- отдельная панель корзины и ссылка на
https://ekt.kz/cart; - health-check и автоматизированные unit/integration/adversarial-тесты.
Как работает решение
- Пользователь описывает нужный товар или задаёт вопрос в чате.
- FastAPI валидирует запрос, ограничивает размер контекста и восстанавливает серверную историю анонимной сессии.
- OpenAI-модель выбирает подходящий инструмент: поиск, карточку товара, аналоги, условия покупки или корзину.
- Backend получает факты из API ekt.kz и передаёт модели только нормализованные данные каталога.
- Перед отправкой ответ проходит дополнительные проверки: цена, остаток, артикул и характеристики должны подтверждаться результатами инструментов.
- Backend проверяет и возвращает описания следующих действий, а frontend отображает их кнопками при наличии подтверждённого контекста. Подписи, артикулы и максимальное количество не принимаются на доверии от модели.
- Вложения проверяются по содержимому, обрабатываются без постоянного хранения и передаются модели как недоверенные данные.
- Корзина изменяется только после явной команды пользователя и повторной серверной проверки товара, количества и остатка.
flowchart LR
U[Покупатель] --> UI[Адаптивный веб-чат]
UI -->|POST /api/chat| API[FastAPI]
API --> VALID[Валидация и guardrails]
VALID --> AI[OpenAI gpt-4.1-mini]
AI --> TOOLS[Серверные инструменты]
TOOLS --> CATALOG[Каталог]
CATALOG -->|Basic Auth, read-only| EKT[API ekt.kz]
TOOLS --> CART[Корзина по session_id]
API --> ACTIONS[Проверенные UI-действия]
ACTIONS --> UI
Технологии
| Область | Используется |
|---|---|
| Backend | Python 3.12, FastAPI, Pydantic, Uvicorn |
| AI | OpenAI Python SDK, Chat Completions, function calling, gpt-4.1-mini по умолчанию |
| Каталог | REST API ekt.kz, Basic Auth, requests |
| Вложения | pypdf, python-docx, openpyxl; vision через OpenAI для JPEG, PNG и WebP |
| Frontend | HTML5, Vanilla JavaScript, Tailwind CSS CDN |
| Развёртывание | render.yaml для Python web service |
| Тестирование | unittest, FastAPI TestClient; в offline-тестах обращения к OpenAI и EKT API подменяются |
Pinecone и другие векторные базы не используются: товарные данные загружаются напрямую из реального API ekt.kz без отдельной векторной копии каталога.
Архитектура проекта
.
├── main.py # FastAPI, API-контракт, сессии и обработка ошибок
├── agent.py # AI-цикл, инструменты каталога и операции корзины
├── catalog.py # загрузка, нормализация, поиск и детали товаров EKT
├── guardrails.py # проверка фактов и защита ответов модели
├── ui_actions.py # валидация и локализация интерактивных действий
├── attachments.py # проверка, извлечение и безопасная обработка вложений
├── logic/
│ ├── system_prompt.txt # правила поведения ассистента
│ ├── purchase_conditions.txt
│ └── demo_questions.json # контрольный пользовательский сценарий
├── static/ # интерфейс чата и корзины
├── tests/ # unit, integration и adversarial-тесты
├── requirements.txt
└── render.yaml
Основные HTTP-маршруты:
| Метод и путь | Назначение |
|---|---|
GET / | веб-интерфейс |
GET /health | состояние и источник каталога |
GET /api/demo-questions | примеры вопросов по загруженному каталогу |
POST /api/chat | диалог с ассистентом и необязательные вложения |
Базовый запрос к чату:
{
"session_id": "jury-session-1",
"messages": [
{"role": "user", "content": "Покажи кабель ВВГ 3х2.5"}
]
}
Ответ сохраняет базовые поля reply, cart, cart_link и дополнительно возвращает необязательный для клиента массив проверенных действий actions:
{
"reply": "...",
"cart": [],
"cart_link": "https://ekt.kz/cart",
"actions": []
}
Установка и запуск
1. Требования
- Python 3.12;
- ключ OpenAI API;
- выданные организаторами логин и пароль read-only API ekt.kz.
2. Клонирование и зависимости
git clone https://github.com/BAITC-Hacks/hack-21ad5124-flawless.git
cd hack-21ad5124-flawless
python -m venv .venv
Linux/macOS:
source .venv/bin/activate
pip install -r requirements.txt
Windows PowerShell:
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
3. Переменные окружения
Обязательные для полного режима:
DEMO_MODE=0
OPENAI_API_KEY=<ключ OpenAI>
EKT_API_USER=<логин API EKT>
EKT_API_PASSWORD=<пароль API EKT>
Дополнительно поддерживаются:
CATALOG_PER_PAGE=1000
CATALOG_PAGES=0
CORS_ORIGINS=*
MODEL_NAME=gpt-4.1-mini
Проект не читает .env автоматически. Значения нужно задать в окружении процесса или в настройках платформы развёртывания.
Автономная проверка без внешних аккаунтов
Чтобы проверить интерфейс, корзину и защитные сценарии без ключей OpenAI/EKT, можно запустить детерминированный fallback с локальной фикстурой из 40 товаров:
$env:DEMO_MODE="1"
Remove-Item Env:OPENAI_API_KEY -ErrorAction SilentlyContinue
uvicorn main:app --host 0.0.0.0 --port 8000
Linux/macOS:
DEMO_MODE=1 OPENAI_API_KEY="" uvicorn main:app --host 0.0.0.0 --port 8000
Этот режим нужен только для автономного smoke-check. Рабочая конфигурация в render.yaml использует DEMO_MODE=0 и прямой API ekt.kz.
4. Запуск
uvicorn main:app --host 0.0.0.0 --port 8000
Откройте http://127.0.0.1:8000.
5. Тесты
python -m unittest discover -s tests -v
Автотесты не выполняют реальные запросы к OpenAI и ekt.kz.
Как проверить решение
Основной сценарий
- Откройте
/health. Для полного режима ожидаютсяok: true,catalog_source: "live"и ненулевое число товаров. - Откройте главную страницу и нажмите «Пример диалога» — сервер сформирует вопросы по реально загруженному каталогу.
- Запросите характеристики и наличие предложенного артикула.
- Попросите подобрать аналог.
- Спросите об условиях оплаты и доставки.
- Выберите доступный товар и напишите:
Да, добавь 1 шт <артикул> в корзинулибо воспользуйтесь кнопкой «Добавить». - Убедитесь, что позиция появилась в панели корзины, а количество не превышает остаток.
- Измените количество или удалите товар через предложенное действие.
Дополнительные вопросы для свободной проверки:
Покажи кабель ВВГ 3х2.5
Есть автомат ABB на 40 А?
Найди светильник мощностью 36 Вт
Какие способы оплаты и доставки доступны?
Результаты товарных запросов зависят от текущего содержимого API ekt.kz.
Проверки ограничений
- вопрос о цене не должен менять корзину;
- запрос количества выше остатка должен быть отклонён;
- неизвестный артикул не должен получать выдуманные цену или характеристики;
- для пустого, слишком длинного или некорректного сообщения API возвращает контролируемый HTTP
422, а не500; - номера карт, CVV, SMS-коды и пароли не должны передаваться модели;
- просьба раскрыть системный промпт или выдать несуществующую скидку должна быть отклонена.
Данные и интеграции
API ekt.kz
Основной и единственный товарный источник в рабочем режиме:
GET https://ekt.kz/api/products— список и пагинация товаров;GET https://ekt.kz/api/products/detail?id=...— подробная карточка товара.
Каталог загружается при запуске. Первая страница определяет объём пагинации, остальные страницы запрашиваются с ограниченным параллелизмом. Подробности подходящих товаров загружаются лениво и кэшируются в памяти.
OpenAI API
Модель не получает прямого доступа к HTTP, корзине или пользовательской сессии. Она выбирает строго описанные серверные инструменты, а backend валидирует каждый вызов и его результат.
Локальные данные
logic/system_prompt.txt— правила агента и ограничения безопасности;logic/purchase_conditions.txt— текст условий покупки;catalog_demo.jsonсохранён как автономная тестовая фикстура и не загружается приDEMO_MODE=0.
Все ключи и пароли задаются через переменные окружения и не хранятся в репозитории.
Ограничения текущей версии
- Корзина ассистента не синхронизируется с реальной корзиной ekt.kz: предоставленный API содержит только методы чтения каталога.
- Корзины и история диалога хранятся в памяти процесса и сбрасываются после перезапуска сервера; база данных отсутствует.
- Список каталога загружается при запуске процесса; изменения в EKT API гарантированно подхватываются после перезапуска сервиса.
- Пользовательская авторизация и оформление оплаты в чате не реализованы.
- Условия в
logic/purchase_conditions.txtпомечены как демонстрационные и требуют замены на официальные условия перед промышленным запуском. - Для полного режима обязательны доступность EKT API и корректные ключи OpenAI/EKT.
- Tailwind CSS загружается через CDN.
- Интерфейс отправляет только одно фото за запрос; PDF, DOCX и XLSX сейчас доступны через API. Не больше трёх файлов и 3 МБ суммарно.
- Распознавание фото требует
OPENAI_API_KEY; файлы не сохраняются после обработки. - Прототип работает как отдельная веб-страница в стиле EKT и не встроен в production-сайт ekt.kz.
Публичная версия
Ранее опубликованная демо-версия: https://ekt-ai-assistant-demo.vercel.app
Стенд может не соответствовать последнему commit ветки main. Его доступность и активный источник каталога проверяются по адресу:
Авторы коммитов
История коммитов
- 2026-09-23 17:57Merge remote-tracking branch 'origin/main' into YernurworkYERNXKZ
- 2026-09-23 17:57Merge latest frontend, logic, and attachment updatesMukhtar
- 2026-09-23 17:56Merge bounded attachment processingMukhtar
- 2026-09-23 17:53Integrate contextual actions without demo regressionsMukhtar
- 2026-09-23 17:52Report legacy attachment formats consistentlyAtaly001
- 2026-09-23 17:51Merge latest logic guidanceMukhtar
- 2026-09-23 17:51Merge latest frontend contextual actionsMukhtar
- 2026-09-23 17:51Add bounded chat attachment parsing and document cart flowAtaly001
Все коммиты (39)
- 2026-09-23 17:43Merge complete EKT AI prototypeMukhtar
- 2026-09-23 17:43Merge latest agent selection policyMukhtar
- 2026-09-23 17:42Merge latest guided selection updatesMukhtar
- 2026-09-23 17:42Make UI actions contextual and document photo search backendYERNXKZ
- 2026-09-23 17:42Hide irrelevant chat actions and add photo attachment previewYERNXKZ
- 2026-09-23 17:35Merge validated UI actions into prototypeMukhtar
- 2026-09-23 17:26Guide customers to three choices without requesting SKUYERNXKZ
- 2026-09-23 17:26Improve guided product selection and cart actionsYERNXKZ
- 2026-09-23 17:02Merge remote-tracking branch 'origin/integration/prototype' into YernurworkYERNXKZ
- 2026-09-23 16:57Merge latest frontend into hardened prototypeMukhtar
- 2026-09-23 16:57Add validated dynamic chat actionsAtaly001
- 2026-09-23 16:54Document EKT AI project for hackathon juryYERNXKZ
- 2026-09-23 16:42Harden agent and live catalog against adversarial inputsMukhtar
- 2026-09-23 16:36Add adaptive cart drawer and chat actionsYERNXKZ
- 2026-09-23 16:26Connect OpenAI demo and clarify assistant cartAtaly001
- 2026-09-23 15:55Deploy stateless EKT demo on VercelAtaly001
- 2026-09-23 15:05Harden integrated demo flowMukhtar
- 2026-09-23 14:54Merge Yernurwork frontend into integration prototypeMukhtar
- 2026-09-23 14:53Merge feature/logic into integration prototypeMukhtar
- 2026-09-23 14:53Merge backend into integration prototypeMukhtar
- 2026-09-23 14:42Match chat frontend to EKT visual styleYERNXKZ
- 2026-09-23 14:42Prompt: short search queries with retry, stricter Kazakh language ruleMukhtar
- 2026-09-23 14:28Restore initial chat frontendYERNXKZ
- 2026-09-23 14:22Merge remote-tracking branch 'origin/backend' into YernurworkYERNXKZ
- 2026-09-23 14:21Build responsive EKT chat frontendYERNXKZ
- 2026-09-23 14:20Harden catalog, cart flow, and demo integrationAtaly001
- 2026-09-23 14:15Rework system prompt with sales patterns from SushiMix assistantMukhtar
- 2026-09-23 14:10Align logic with backend: drop own demo catalog, use backend articles in demo scriptMukhtar
- 2026-09-23 13:57Build EKT assistant backend and offline demoAtaly001
- 2026-09-23 13:53Add team workflow planMukhtar
- 2026-09-23 13:49Add assistant logic: system prompt, tools, purchase conditions, demo catalogMukhtar
Структура репозитория (32 файлов)
.gitignore .python-version README.md agent.py attachments.py catalog.py catalog_demo.json guardrails.py logic/README.md logic/TEAM_PLAN.md logic/demo_questions.json logic/image_search_prompt.txt logic/purchase_conditions.txt logic/system_prompt.txt logic/tools.json main.py render.yaml requirements.txt static/app.js static/assets/logo.jpg static/index.html tests/test_adversarial_cart.py tests/test_attachments.py tests/test_backend.py tests/test_demo_catalog.py tests/test_guardrails.py tests/test_guided_selection.py tests/test_http_hardening.py tests/test_live_catalog.py tests/test_openai_guardrails.py tests/test_ui_actions.py ui_actions.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.