AAYMA
RU
Войти

ИИ-консультант EKT

Чат-консультант по каталогу ekt.kz на FastAPI: ищет реальные товары через EKT API, показывает характеристики, цену, остаток и аналоги, добавляет в…

Рабочий MVP
Команда «PixelHack» 5💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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: сессии, корзины и индекс поиска хранятся в памяти процесса.

Как пользоваться

  1. Напишите «Найди вилку с прямым вводом» или «Найди недорогой шуруповёрт». Первый поиск по названию сканирует каталог; следующие используют индекс.
  2. Уточните параметры: «Нужна вилка 16 А, IP44» или «Покажи характеристики артикула …». Можно спросить по числовому ID, например «Какая цена у товара 515291?».
  3. При запросе на добавление укажите товар и количество. Проверьте карточку и нажмите «Подтвердить добавление». В корзине отображаются только локально подтверждённые позиции.
  4. Для документов загрузите PDF, JPEG, DOCX или XLSX размером до 5 МиБ. ИИ сопоставит найденные в файле позиции с каталогом.

Чат помогает только с темами EKT и электротоваров. Условия оплаты и доставки, отсутствующие в выданном API, он предлагает уточнить у менеджера. Цена и наличие могут измениться после ответа; при подтверждении корзины они проверяются снова.

Настройки

ПеременнаяЗначение по умолчаниюНазначение
OPENAI_API_KEYпустоКлюч OpenAI, обязателен
OPENAI_MODELgpt-4.1-miniМодель для диалога и инструментов
EKT_USERNAME, EKT_PASSWORDпустоBasic Auth EKT, обязательны
EKT_BASE_URLhttps://ekt.kzЗафиксированный HTTPS-хост
EKT_SEARCH_PAGES400Максимум страниц для текстового поиска
CHAT_TIMEOUT_SECONDS120Общий лимит времени ответа чата
REQUEST_TIMEOUT_SECONDS15Лимит одного запроса к EKT
SESSION_TTL_SECONDS3600Срок сессии
MAX_SESSIONS1000Лимит одновременных сессий
CORS_ORIGINSlocalhost: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.

Звёзды
⭐ 2
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
40
Авторы
5
Файлы
35
Ветки
4

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

StreetBizon 15Aiqyn 12Tailaining 5John Doe 5StreetBizon 3

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

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

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

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

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