О проекте
Команда: PixelHack
Кейс HackAlem.ai: Торговля — Электрокомплект · ekt.kz
Стадия: Рабочий MVP
Задача кейса: AI-консультант по каталогу ekt.kz: товары, аналоги, цены, остатки, корзина
Суть
Чат-консультант по каталогу ekt.kz на FastAPI: ищет реальные товары через EKT API, показывает характеристики, цену, остаток и аналоги, добавляет в локальную корзину после подтверждения и разбирает загруженные документы.
Как устроено
Агент на OpenAI Agents SDK (gpt-4.1-mini) вызывает инструменты каталога. EKT API не поддерживает текстовый поиск, поэтому сервер обходит страницы /api/products и строит временный индекс на 10 минут с нормализацией русских окончаний и ё/е; числовой ID ищется напрямую. Перед ответом о цене и остатке запрашивается свежая карточка товара. Добавление в корзину сначала создаёт предложение, пользователь подтверждает его кнопкой; из вложений (PDF/JPEG/DOCX/XLSX) позиции сопоставляются с каталогом.
Ключевые решения
- OpenAI Agents SDK function calling
- временный поисковый индекс по каталогу
- нормализация русских окончаний
- свежая карточка перед ответом о цене
- корзина через предложение и подтверждение
- разбор вложений
- Bearer-сессии
Особенности
Обход ограничения EKT API, игнорирующего текстовый поиск: постраничный обход каталога и кэширование индекса. Перед ответом о цене и остатке всегда берётся свежая карточка, а пустой остаток отличается от неизвестного.
Стек
Python · FastAPI · Uvicorn · HTTPX · Pydantic · pydantic-settings · HTML/CSS/JS · unittest
Модели
gpt-4.1-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-fbbcdce5-pixelhack.
README
README.mdИИ-консультант EKT
Сайт на FastAPI с чатом, поиском реальных товаров EKT и локальной корзиной. Главная страница — /, чат — /chat.html, корзина — /cart.html, документация API — /docs.
Стек технологий
- Backend: Python 3.11+, FastAPI, Uvicorn.
- ИИ: OpenAI API, OpenAI Agents SDK; модель по умолчанию —
gpt-4.1-mini. - Интеграция с каталогом: EKT API, HTTPX и Basic Auth.
- Данные и настройки: Pydantic, pydantic-settings, переменные окружения из
.env. - Frontend: HTML, CSS и JavaScript без фреймворка.
- Хранение: сессии, корзина и временный поисковый индекс находятся в памяти процесса.
- Тестирование:
unittest.
Что умеет
- ИИ отвечает на вопросы о товарах EKT, помогает подобрать оборудование, показывает характеристики, цену и остаток из API EKT. На посторонние вопросы кратко возвращает разговор к товарам магазина.
- Для поиска по обычному описанию («вилка с прямым вводом») сервер читает страницы
/api/products?page=Nи создаёт временный индекс. EKT API игнорирует параметры текстового поиска. Первый поиск по словам может занять десятки секунд; индекс хранится 10 минут. Русские окончания иё/еприводятся к общей форме. - Запросы вроде «недорогой шуруповёрт» сортируются по цене из списка товаров. Перед ответом о цене и остатке ИИ запрашивает свежую карточку
/api/products/detail?id=.... Если достигнут лимитEKT_SEARCH_PAGES, результат относится только к просмотренной части каталога. - Числовой ID ищется сразу через карточку без обхода страниц.
- Корзина хранится только в памяти приложения. Добавление сначала создаёт предложение, затем пользователь подтверждает его кнопкой. Заказ и резерв на ekt.kz не создаются.
Требования
Python 3.11+, доступ к EKT API по выданным Basic Auth данным, ключ OpenAI и сеть. Зависимости перечислены в requirements.txt. Пароли и ключи находятся только на сервере в .env; браузеру они не передаются. Файл .env исключён из Git.
Запуск на Windows
В PowerShell из корня проекта:
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
if (-not (Test-Path .env)) { Copy-Item .env.example .env }
Заполните в .env:
OPENAI_API_KEY=ваш_ключ_OpenAI
EKT_USERNAME=логин_Basic_Auth
EKT_PASSWORD=пароль_Basic_Auth
Если .env уже заполнен, сохраните его. Остальные параметры можно оставить как в шаблоне. Запустите:
.\.venv\Scripts\python.exe -m uvicorn app.main:app --host 127.0.0.1 --port 8000
Откройте http://127.0.0.1:8000/ и перейдите в чат. После изменения .env перезапустите сервер. Используйте один worker: сессии, корзины и индекс поиска хранятся в памяти процесса.
Как пользоваться
- Напишите «Найди вилку с прямым вводом» или «Найди недорогой шуруповёрт». Первый поиск по названию сканирует каталог; следующие используют индекс.
- Уточните параметры: «Нужна вилка 16 А, IP44» или «Покажи характеристики артикула …». Можно спросить по числовому ID, например «Какая цена у товара 515291?».
- При запросе на добавление укажите товар и количество. Проверьте карточку и нажмите «Подтвердить добавление». В корзине отображаются только локально подтверждённые позиции.
- Для документов загрузите PDF, JPEG, DOCX или XLSX размером до 5 МиБ. ИИ сопоставит найденные в файле позиции с каталогом.
Чат помогает только с темами EKT и электротоваров. Условия оплаты и доставки, отсутствующие в выданном API, он предлагает уточнить у менеджера. Цена и наличие могут измениться после ответа; при подтверждении корзины они проверяются снова.
Настройки
| Переменная | Значение по умолчанию | Назначение |
|---|---|---|
OPENAI_API_KEY | пусто | Ключ OpenAI, обязателен |
OPENAI_MODEL | gpt-4.1-mini | Модель для диалога и инструментов |
EKT_USERNAME, EKT_PASSWORD | пусто | Basic Auth EKT, обязательны |
EKT_BASE_URL | https://ekt.kz | Зафиксированный HTTPS-хост |
EKT_SEARCH_PAGES | 400 | Максимум страниц для текстового поиска |
CHAT_TIMEOUT_SECONDS | 120 | Общий лимит времени ответа чата |
REQUEST_TIMEOUT_SECONDS | 15 | Лимит одного запроса к EKT |
SESSION_TTL_SECONDS | 3600 | Срок сессии |
MAX_SESSIONS | 1000 | Лимит одновременных сессий |
CORS_ORIGINS | localhost:5500 и 127.0.0.1:5500 | Разрешённые адреса отдельного frontend |
Если ключи отсутствуют, приложение завершает запуск с ошибкой конфигурации. Список товаров загружается с EKT через Basic Auth на сервере. Переадресации HTTP отключены. Пустой остаток и неизвестный остаток различаются.
API
Все пути начинаются с /api/v1.
| Метод и путь | Назначение |
|---|---|
GET /health | Проверка процесса |
GET /products?page=1 | Страница каталога EKT |
GET /products?q=вилка+с+прямым+вводом | Поиск по описанию |
GET /products?q=шуруповерт&sort=price_asc | Поиск с сортировкой по цене |
GET /products/515291 | Свежая карточка товара |
GET /products/{id}/alternatives | Проверенные аналоги, если хватает свойств |
GET /purchase-terms | Известные условия и пометка источника |
POST /sessions | Создать сессию и получить Bearer-токен |
POST /sessions/{id}/chat | Сообщение: {"message":"Найди недорогой шуруповёрт"} |
POST /sessions/{id}/chat/attachment | Файл как raw body с его Content-Type |
GET /sessions/{id}/cart | Локальная корзина |
POST /sessions/{id}/cart/proposals | Предложение: {"product_id":"515291","quantity":"2"} |
POST /sessions/{id}/cart/proposals/{action_id}/confirm | Подтверждение: {"confirmed":true} |
Маршруты с /sessions/{id} требуют заголовок Authorization: Bearer <access_token>. Токен создаётся через POST /sessions и хранится браузером в sessionStorage. В Swagger на /docs его можно указать через кнопку Authorize. Сессия и корзина исчезают после истечения срока или перезапуска процесса.
Проверка
.\.venv\Scripts\python.exe -m unittest discover -s tests -v
Автоматические тесты используют подменённый EKT-клиент и модель, поэтому не расходуют внешний API. Для ручной проверки откройте /api/v1/health, затем /api/v1/products/515291 и задайте в чате вопрос о том же ID. Для поиска по описанию попробуйте примеры выше и проверьте, что карточки содержат реальные ID и артикулы EKT.
Авторы коммитов
История коммитов
- 2026-09-23 17:44Update README with technology stack informationAiqyn
- 2026-09-23 17:38Update chat interface and styles for improved user experiencenanbxd
- 2026-09-23 17:29Merge pull request #14 from BAITC-Hacks/backendAiqyn
- 2026-09-23 17:26Refactor chat functionality and update product suggestionsnanbxd
- 2026-09-23 17:21Merge pull request #13 from BAITC-Hacks/frontendStreetBizon
- 2026-09-23 17:20Add product name prefill functionality to chat inputStreetBizon
- 2026-09-23 17:06Merge pull request #12 from BAITC-Hacks/AI-systemTailaining
- 2026-09-23 17:05Поменял баги свзанные с перетиканием текста в другую секциюJohn Doe
Все коммиты (40)
- 2026-09-23 16:56Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fbbcdce5-pixelhackStreetBizon
- 2026-09-23 16:56da daStreetBizon
- 2026-09-23 16:51Merge pull request #11 from BAITC-Hacks/backendAiqyn
- 2026-09-23 16:46Refactor application modes to use live EKT catalog and OpenAI by default; update README and chat suggestions for clarity.nanbxd
- 2026-09-23 16:30Merge pull request #10 from BAITC-Hacks/mainStreetBizon
- 2026-09-23 16:27Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fbbcdce5-pixelhackStreetBizon
- 2026-09-23 16:26Merge frontend into mainStreetBizon
- 2026-09-23 16:24Merge pull request #9 from BAITC-Hacks/AI-systemTailaining
- 2026-09-23 16:24связал ии с апиJohn Doe
- 2026-09-23 16:20Enhance chat page: add product image handling, update suggestions, and improve layoutStreetBizon
- 2026-09-23 16:14Update cart and home pages: enhance navigation links and improve hero section contentStreetBizon
- 2026-09-23 16:11Merge pull request #7 from BAITC-Hacks/AI-systemTailaining
- 2026-09-23 16:10Refactor code structure for improved readability and maintainabilityJohn Doe
- 2026-09-23 16:03Add chat navigation functionality and enhance chat page layoutStreetBizon
- 2026-09-23 15:54Merge pull request #6 from BAITC-Hacks/frontendStreetBizon
- 2026-09-23 15:51Update README and main.py for improved interpreter setup and error handling; add pyrightconfig.json for static analysisStreetBizon
- 2026-09-23 15:50Enhance frontend integration: add HTML/CSS files, implement chat functionality, and serve static files via FastAPIStreetBizon
- 2026-09-23 15:45Merge pull request #5 from BAITC-Hacks/backendAiqyn
- 2026-09-23 15:44Add Pyright configuration for type checkingnanbxd
- 2026-09-23 15:28Merge pull request #4 from BAITC-Hacks/AI-systemTailaining
- 2026-09-23 15:23Испарвлены некоторые баги и добавлены новые функции в сервис ассистента.John Doe
- 2026-09-23 14:59Merge pull request #1 from BAITC-Hacks/frontendAiqyn
- 2026-09-23 14:56Merge pull request #3 from BAITC-Hacks/AI-systemTailaining
- 2026-09-23 14:56Enhance frontend integration: add HTML/CSS files, implement chat functionality, and serve static files via FastAPIStreetBizon
- 2026-09-23 14:56Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fbbcdce5-pixelhack into frontendStreetBizon
- 2026-09-23 14:53Улучшить поведение ИИ-ассистента в сценариях каталога - Добавить контекстные ответы, уточнение артикула и количества - Точнее сообщать об остатках, сертификатах, аналогах и условиях покупки - Усилить John Doe
- 2026-09-23 14:29Merge pull request #2 from BAITC-Hacks/backendAiqyn
- 2026-09-23 14:253comStreetBizon
- 2026-09-23 14:25Add evaluation criteria, requirements, and tests for API and attachmentsnanbxd
- 2026-09-23 14:15Add .gitignore, README.md, index.html, and style.css filesStreetBizon
- 2026-09-23 13:43docs: add initial project READMEnanbxd
- 2026-09-23 13:37Add initial CSS and HTML filesStreetBizon
Структура репозитория (35 файлов)
.env.example .gitignore README.md app/__init__.py app/api/__init__.py app/api/routes.py app/core/__init__.py app/core/config.py app/core/errors.py app/integrations/__init__.py app/integrations/ekt.py app/main.py app/schemas.py app/services/__init__.py app/services/assistant.py app/services/attachments.py app/services/cart.py app/services/catalog.py app/services/sessions.py front/app.js front/cart.html front/chat-navigation.js front/chat.css front/chat.html front/home.html front/home.js front/index.html front/style.css hints/HackAlem AI_ ИИ-ассистент для чата на сайте ekt.kz.docx hints/rules.txt hints/ИИ-ассистент для чата на сайте ekt.kz ДАННЫЕ.docx pyrightconfig.json requirements.txt tests/test_api.py tests/test_attachments.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.