О проекте
Команда: Moriarty
Кейс HackAlem.ai: Торговля — Электрокомплект · ekt.kz
Стадия: Прототип
Задача кейса: AI-консультант по каталогу ekt.kz: товары, аналоги, цены, остатки, корзина
Суть
ИИ-ассистент для магазина ekt.kz: поиск электротехнических товаров, характеристики, остатки, аналоги с объяснением и добавление в корзину (по одному или пачкой) после явного подтверждения. Работает на снимке каталога из 40 товаров.
Как устроено
Модуль packages/ai на TypeScript (intent, planner, reasoning, session, snapshot) определяет намерение и контекст, подбирает аналоги с объяснением, считает смету по файлу спецификации, защищает от prompt injection и отслеживает свежесть данных. Каталог импортируется из JSON-снимка страниц API ekt.kz. Отдельный Node-бэкенд нормализует каталог. UI на Next.js: чат, карточки товаров, модалка подтверждения корзины. Настоящий EKT API и LLM-провайдер подключаются через интерфейсы.
Ключевые решения
- intent detection
- планировщик действий
- подбор аналогов по параметрам
- подтверждение корзины
- защита от prompt injection
- freshness-индикатор данных
Особенности
README в основном на казахском, есть примеры запросов на KZ и RU. Ассистент явно показывает противоречие 160 А / 250 А и не выдумывает остатки, которых нет в снимке. История коммитов хаотичная: удаления, revert и восстановление веток, в README описан Frontend/, которого уже нет в дереве.
Стек
TypeScript · Node.js · Next.js · React · Playwright
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-bd6be362-moriarty.
README
README.mdAI/Agent модулі
AI/Agent тапсырмасы TypeScript түрінде packages/ai ішіне қосылды. Іске қосу: npm ci --ignore-scripts, npm run typecheck, npm test, npm run demo:ai (Node.js 24+).
11.txt қосылды: 2 беттегі 40 тауар және бір толық detail. npm run demo:ai осы файлдан импортталған каталогты қолданады. Бұл онлайн API емес; файлда жоқ қалдықтар белгісіз болып қалады, 160А/250 А қайшылығы көрсетіледі. Каталог деректері. Синтетикалық демо: npm run demo:synthetic.
Толық нұсқаулық, backend/frontend contract-тері және KZ/RU мысалдар: packages/ai/README.md. Модульде intent/context, аналог түсіндіру, бөлек растаумен single/bulk cart, файл спецификациясының есебі, injection қорғанысы, freshness және feedback бар. Нақты EKT API, LLM провайдері және binary файл extractor-ы интеграция интерфейстері арқылы қосылады.
Төмендегі бұрынғы архитектура мәтіні өзгертілмеді; онда аталған Frontend/ файлдары осы жұмыс ағашында жоқ. Қазіргі орындалатын AI модулінің нұсқаулығы жоғарыдағы сілтемеде.
Жоба архитектурасы
Жоба ekt.kz интернет-дүкеніне арналған ЖИ-ассистент ретінде құрылған. Жүйенің негізгі мақсаты — пайдаланушыға қажетті электротехникалық тауарды табуға, оның техникалық сипаттамаларын көруге, қоймадағы бар-жоғын тексеруге, аналогтарын таңдауға және тауарды себетке қосуға көмектесу.
Жүйе бірнеше негізгі компоненттен тұрады: ┌──────────────────────────────┐ │ Пайдаланушы │ │ ekt.kz сайтының клиенті │ └──────────────┬───────────────┘ │ │ Сұраныс ▼ ┌──────────────────────────────┐ │ Frontend │ │ │ │ Website + AI Chat UI │ │ • Чат интерфейсі │ │ • Тауарларды көрсету │ │ • Аналогтарды көрсету │ │ • Себет │ └──────────────┬───────────────┘ │ │ HTTP / API ▼ ┌──────────────────────────────┐ │ Backend API │ │ │ │ Сұраныстарды қабылдау │ │ және сервистерге бағыттау │ └──────────────┬───────────────┘ │ ┌───────┼─────────┐ │ │ │ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ AI │ │ Product │ │ Cart │ │Assistant │ │ Service │ │ Service │ │ │ │ │ │ │ │ Сұрақты │ │ Каталог │ │ Растау │ │ түсіну │ │ Іздеу │ │ Себет │ │ │ │ Қалдық │ │ Саны │ │ Жауап │ │ Аналог │ │ │ │ құру │ │ │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ └────────────┼────────────┘ │ ▼ ┌───────────────────┐ │ Database │ │ │ │ • Products │ │ • Categories │ │ • Stock │ │ • Certificates │ │ • Cart │ └───────────────────┘
Frontend
Frontend — пайдаланушы көретін және қолданатын интерфейс.
Пайдаланушы сайттағы чат арқылы ЖИ-ассистентке сұрақ қоя алады.
Мысалы:
"ABB C16 автоматы бар ма?"
немесе:
"Осы тауарға аналог тауып бер."
Frontend пайдаланушының сұранысын Backend API-ге жібереді және алынған жауапты экранда көрсетеді.
Frontend негізгі мүмкіндіктері:
- ЖИ-ассистентпен чат;
- тауар туралы ақпаратты көрсету;
- техникалық сипаттамаларды көрсету;
- баға мен қоймадағы қалдықты көрсету;
- аналогтарды көрсету;
- тауарды себетке қосу;
- себетке немесе тапсырысты рәсімдеу бетіне өту.
Backend API
Backend API — Frontend пен жүйенің ішкі сервистері арасындағы негізгі байланыс қабаты.
Backend келесі міндеттерді орындайды:
- пайдаланушы сұранысын қабылдау;
- сұранысты AI Assistant-ке жіберу;
- каталогтан қажетті ақпаратты алу;
- қоймадағы қалдықты тексеру;
- аналогтарды іздеу;
- себет операцияларын орындау;
- нәтижені Frontend-ке қайтару.
Жалпы сұраныс ағыны:
Frontend │ ▼ Backend API │ ├── AI Assistant ├── Product Service └── Cart Service
AI Assistant
AI Assistant — жүйенің интеллектуалды бөлігі.
Ол пайдаланушының еркін түрде жазылған сұрағын түсініп, қандай әрекет қажет екенін анықтайды.
Мысалы:
Пайдаланушы: "Маған 16 амперлік автомат керек."
AI Assistant сұранысты талдап, Product Service арқылы сәйкес тауарларды іздейді.
AI Assistant келесі сұраныстарды өңдей алады:
- тауар іздеу;
- тауар сипаттамасын сұрау;
- сертификатты сұрау;
- қоймадағы қалдықты тексеру;
- аналог іздеу;
- сатып алу шарттарын сұрау;
- тауарды себетке қосуға дайындық.
AI Assistant каталогтағы нақты деректерге сүйеніп жауап беруі тиіс. Product Service
Product Service — каталогтағы тауарлармен жұмыс істейтін компонент.
Ол келесі ақпаратты өңдейді:
Product ├── ID / Артикул ├── Атауы ├── Санаты ├── Бағасы ├── Техникалық сипаттамалары ├── Сертификат ├── Қоймадағы саны └── Қолжетімділік мәртебесі
Product Service келесі операцияларды орындайды:
- артикул бойынша іздеу;
- атауы бойынша іздеу;
- санаты бойынша іздеу;
- техникалық параметрлер бойынша іздеу;
- қоймадағы қалдықты тексеру;
- тауардың аналогтарын іздеу.
Егер пайдаланушы сұраған тауар қоймада болмаса, жүйе техникалық сипаттамалары ұқсас тауарларды тауып, аналог ретінде ұсынады.
Мысалы: Сұралған тауар: ABB S201 C16
Қалдық: 0 дана
Ұсынылған аналог: Schneider Electric C16
Себебі: Номиналды ток және негізгі техникалық параметрлері ұқсас.
Cart Service
Cart Service — пайдаланушы себетін басқаруға арналған компонент.
Жүйенің маңызды ережесі:
Тауар пайдаланушының нақты растауынсыз себетке қосылмайды.
Мысалы:
User: "Осы тауардан 2 дана керек."
AI Assistant: "2 данасын себетке қосайын ба?"
User: "Иә, қос."
AI Assistant: "Тауар себетке қосылды."
Растау алынғаннан кейін жүйе:
User Confirmation │ ▼ Stock Check │ ▼ Quantity Check │ ▼ Cart Service │ ▼ Add to Cart │ ▼ Checkout Link
Егер пайдаланушы 10 дана сұрап, қоймада тек 5 дана болса, жүйе 10 дананы себетке қоспайды және қолжетімді сан туралы хабарлайды.
Database
Database — жүйенің каталогы мен қажетті деректерін сақтау үшін қолданылады.
Негізгі деректер:
Database │ ├── Products │ ├── id │ ├── article │ ├── name │ ├── category │ ├── price │ └── specifications │ ├── Stock │ ├── product_id │ ├── warehouse │ └── quantity │ ├── Certificates │ ├── product_id │ └── certificate_url │ └── Cart ├── product_id └── quantity
Хакатон прототипінде тестілік немесе синтетикалық каталог деректерін пайдалануға болады.
Кейін жүйені нақты ekt.kz каталог API-іне қосуға болады.
Жүйенің жұмыс істеу логикасы
Қарапайым сұраныс:
User │ │ "ABB C16 бар ма?" ▼ Frontend │ ▼ Backend API │ ▼ AI Assistant │ ▼ Product Service │ ▼ Database │ ▼ Product Service │ ▼ AI Assistant │ ▼ Backend │ ▼ Frontend │ ▼ User
Тауар болмаған жағдайда
text User Request │ ▼ Product Search │ ▼ Stock = 0 │ ▼ Alternative Search │ ▼ Similar Products │ ▼ AI Explanation │ ▼ User
Себетке қосу кезінде
text User │ │ "2 дана себетке қос" ▼ AI Assistant │ │ "2 дана қосайын ба?" ▼ User Confirmation │ │ "Иә" ▼ Stock Check │ ▼ Cart Service │ ▼ Add to Cart │ ▼ Checkout Link
Ұсынылатын жоба құрылымы text project/ │ ├── frontend/ │ ├── index.html │ ├── css/ │ └── js/ │ ├── backend/ │ ├── app.py │ │ │ ├── routes/ │ │ ├── chat.py │ │ ├── products.py │ │ └── cart.py │ │ │ └── services/ │ ├── ai_service.py │ ├── product_service.py │ └── cart_service.py │ ├── data/ │ ├── products.json │ └── certificates/ │ ├── README.md ├── requirements.txt └── .gitignore
Қауіпсіздік принциптері
Жүйеде келесі шектеулер сақталады:
пайдаланушы растауынсыз себетті өзгертуге болмайды;
қоймада жоқ тауарды бар деп көрсетуге болмайды;
жалған баға беруге болмайды;
себетке қосылатын тауар саны қоймадағы қалдықтан аспауы керек;
айдаланушының төлем деректерін чат арқылы сұрауға немесе сақтауға болмайды;
ұсынылған аналогтың не себепті таңдалғаны түсіндірілуі керек.
Осы архитектура жүйені жеке компоненттерге бөліп, әр компонентті бөлек дамытуға және тестілеуге мүмкіндік береді.
## Прототиптің қазіргі мүмкіндіктері
`Frontend/` ішіндегі прототип кейс талаптарының негізгі демонстрациялық сценарийін іске асырады:
* синтетикалық каталогтан артикул, атау, санат және техникалық сипаттама бойынша іздеу;
* қоймадағы нақты санды, қойманы және тауардың қолжетімділік мәртебесін көрсету;
* каталогта бар сертификаттың сілтемесін қайтару;
* қалдығы нөл позицияға санаты, ортақ техникалық параметрлері және бағасы бойынша аналог ұсыну, себебін түсіндіру;
* төлем, жеткізу және ең аз партия туралы жауап беру;
* Excel, Word, PDF және JPEG/PNG тіркемесін чатқа қабылдау интерфейсі;
* тауар саны қойма қалдығынан аспаса ғана және пайдаланушы растағаннан кейін ғана себетке қосу;
* қосқаннан кейін `#cart` тікелей сілтемесін беру;
* төлем деректерін чатта сұрамау және сақтамау;
* белгісіз немесе күрделі сұрақты менеджерге жіберу туралы хабарлау.
## Іске қосу
`Frontend/start.bat` файлын екі рет басыңыз. Ол Python тәуелділіктерін дайындап, FastAPI серверін іске қосады. Немесе терминалда:
```powershell
Set-Location Frontend
.\start.bat
Браузерде http://127.0.0.1:8000 мекенжайын ашыңыз. Толық нұсқаулық: Frontend/README.md.
SQLite дерекқоры: Frontend/data/app.sqlite3. Бөлек MySQL/PostgreSQL орнату қажет емес. Базаны дайындау/тексеру: Frontend/init-db.bat. SQL схемасы: Frontend/data/schema.sql. База тауарларды, сессияларды, себеттерді, растау ұсыныстарын және чат тарихын сақтайды.
Демонстрациялық тесттер
Чатта мына сұраныстарды тексеруге болады:
ABB-S201-C16 сертификаты бар ма?— баға, сипаттама, қалдық және сертификат сілтемесі;IEK C25 жоқ болса, аналог бер— қалдығы нөл позиция және ұқсас аналогтың негіздемесі;Төлем, жеткізу және ең аз партия қандай?— сатып алу шарттары;ABB C16 автоматтан 2 дана керек— қойма тексеруі, растау модалы және растаудан кейін#cartсілтемесі.
Деректер және production келесі қадамдары
SQLite базасында 24 демо тауар (Frontend/data/products.json) және пайдаланушының JSON файлдарынан импортталған 20 EKT тауары (Frontend/data/ekt-products.json) бар. Негізгі каталог әдепкіде EKT деректерін көрсетеді. Қайта импорт: Frontend/import-ekt.bat. 3414970344526 штрихкодымен Legrand тауарын тексеруге болады: файлдағы бағасы 64 920 ₸, қалдығы 23 дана. Қалған 19 тауардың қалдығы берілмеген және белгісіз деп көрсетіледі. Деректер онлайн жаңартылмайды; себет пен жеткізу жергілікті прототип ретінде жұмыс істейді. API кілті серверде ғана сақталады.
Авторы коммитов
История коммитов
- 2026-09-23 17:57Merge pull request #4 from BAITC-Hacks/frontend/restore-ektCerik222
- 2026-09-23 17:56Restore ekt-ai-assistant frontendCerik222
- 2026-09-23 17:53Add README for HACKALEM AI projectNokeyev06
- 2026-09-23 17:49Merge pull request #3 from BAITC-Hacks/revert-1-frontend/hackalem-uiCerik222
- 2026-09-23 17:48addCerik222
- 2026-09-23 17:42Merge remote-tracking branch 'origin/main' into integration/all-work-20260923Bekarys Noke
- 2026-09-23 17:40Merge AI agent, frontend and backend workBekarys Noke
- 2026-09-23 17:39Merge pull request #2 from BAITC-Hacks/ai/restore-agent-20260923Nokeyev06
Все коммиты (32)
- 2026-09-23 17:35Restore AI agent and imported EKT catalogBekarys Noke
- 2026-09-23 17:32Merge remote changesBekarys Noke
- 2026-09-23 17:28Update README filesBekarys Noke
- 2026-09-23 17:26редактирование нового Backendtiderk2-source
- 2026-09-23 17:26Revert "Frontend/hackalem UI"Cerik222
- 2026-09-23 17:25Delete README.mdNokeyev06
- 2026-09-23 17:25Delete packages directoryNokeyev06
- 2026-09-23 17:24Merge pull request #1 from BAITC-Hacks/frontend/hackalem-uiCerik222
- 2026-09-23 17:20Delete Frontend directoryNokeyev06
- 2026-09-23 17:18Add HACKALEM AI frontendCerik222
- 2026-09-23 17:11Remove hackalem-ai fileCerik222
- 2026-09-23 17:10Create hackalem-aiCerik222
- 2026-09-23 17:02Merge remote-tracking branch 'origin/main' into codex/sync-ai-catalogBekarys Noke
- 2026-09-23 16:59Add AI agent and imported EKT catalogBekarys Noke
- 2026-09-23 16:18Delete иви.pyNokeyev06
- 2026-09-23 15:58Frontend өзгерістеріCerik222
- 2026-09-23 15:52редактирование текущего кодаtiderk2-source
- 2026-09-23 15:15Add project architecture to FrontendBekarys Noke
- 2026-09-23 14:52Add project architecture to FrontendBekarys Noke
- 2026-09-23 14:33Add project architecture to FrontendBekarys Noke
- 2026-09-23 14:20Add project architecture to FrontendBekarys Noke
- 2026-09-23 13:35Add project architecture to READMEBekarys Noke
- 2026-09-23 10:09Delete dc.pyCerik222
- 2026-09-22 20:59Initial commitBekarys Noke
Структура репозитория (93 файлов)
.gitignore Backend/.env.example Backend/.gitignore Backend/README.md Backend/data/detail-515291.json Backend/data/page-1.json Backend/data/page-2.json Backend/package.json Backend/src/catalog.js Backend/src/client.js Backend/src/normalize.js Backend/src/server.js Backend/test/backend.test.js Frontend README.md ekt-ai-assistant/README.md ekt-ai-assistant/apps/web/.env.example ekt-ai-assistant/apps/web/.gitignore ekt-ai-assistant/apps/web/AGENTS.md ekt-ai-assistant/apps/web/CLAUDE.md ekt-ai-assistant/apps/web/app/globals.css ekt-ai-assistant/apps/web/app/layout.tsx ekt-ai-assistant/apps/web/app/page.tsx ekt-ai-assistant/apps/web/next-env.d.ts ekt-ai-assistant/apps/web/next.config.ts ekt-ai-assistant/apps/web/package.json ekt-ai-assistant/apps/web/playwright.config.ts ekt-ai-assistant/apps/web/pnpm-lock.yaml ekt-ai-assistant/apps/web/postcss.config.mjs ekt-ai-assistant/apps/web/src/components/cart/CartSuccess.tsx ekt-ai-assistant/apps/web/src/components/cart/ConfirmationModal.tsx ekt-ai-assistant/apps/web/src/components/chat/ChatHeader.tsx ekt-ai-assistant/apps/web/src/components/chat/ChatLauncher.tsx ekt-ai-assistant/apps/web/src/components/chat/ChatPanel.tsx ekt-ai-assistant/apps/web/src/components/chat/MessageBubble.tsx ekt-ai-assistant/apps/web/src/components/chat/MessageComposer.tsx ekt-ai-assistant/apps/web/src/components/chat/MessageList.tsx ekt-ai-assistant/apps/web/src/components/chat/QuickSuggestions.tsx ekt-ai-assistant/apps/web/src/components/compare/ProductCompareView.tsx ekt-ai-assistant/apps/web/src/components/estimate/SpecEstimateView.tsx ekt-ai-assistant/apps/web/src/components/feedback/MessageFeedback.tsx ekt-ai-assistant/apps/web/src/components/files/FileAttachmentPreview.tsx ekt-ai-assistant/apps/web/src/components/files/FileUploader.tsx ekt-ai-assistant/apps/web/src/components/product/AnalogCard.tsx ekt-ai-assistant/apps/web/src/components/product/CertificateList.tsx ekt-ai-assistant/apps/web/src/components/product/DataFreshnessBadge.tsx ekt-ai-assistant/apps/web/src/components/product/DataWarning.tsx ekt-ai-assistant/apps/web/src/components/product/ProductCard.tsx ekt-ai-assistant/apps/web/src/components/product/ProductDetails.tsx ekt-ai-assistant/apps/web/src/components/product/StockList.tsx ekt-ai-assistant/apps/web/src/demo/demoResponses.ts ekt-ai-assistant/apps/web/src/hooks/useChat.ts ekt-ai-assistant/apps/web/src/hooks/useFileUpload.ts ekt-ai-assistant/apps/web/src/lib/api.ts ekt-ai-assistant/apps/web/src/lib/format.ts ekt-ai-assistant/apps/web/src/lib/session.ts ekt-ai-assistant/apps/web/src/lib/validation.ts ekt-ai-assistant/apps/web/src/types/contract.ts ekt-ai-assistant/apps/web/src/types/ui.ts ekt-ai-assistant/apps/web/tests/integration.spec.ts ekt-ai-assistant/apps/web/tsconfig.json ekt-ai-assistant/docs/demo-script.md ekt-ai-assistant/docs/files-created.md ekt-ai-assistant/docs/frontend-integration.md ekt-ai-assistant/docs/verification.md ekt-ai-assistant/screenshots/desktop-chat.png ekt-ai-assistant/screenshots/desktop-home.png ekt-ai-assistant/screenshots/mobile-chat.png ekt-ai-assistant/screenshots/mobile-confirmation.png package-lock.json package.json packages/ai/README.md packages/ai/data/README.md packages/ai/data/ekt-snapshot.json packages/ai/examples/demo-backend.ts packages/ai/examples/demo.ts packages/ai/examples/snapshot-demo.mjs packages/ai/scripts/import-snapshot.mjs packages/ai/src/contracts.ts packages/ai/src/controller.ts packages/ai/src/files.ts packages/ai/src/index.ts packages/ai/src/intent.ts packages/ai/src/planner.ts packages/ai/src/prompt.ts packages/ai/src/reasoning.ts packages/ai/src/schemas.ts packages/ai/src/session.ts packages/ai/src/snapshot.ts packages/ai/test/agent.test.mjs packages/ai/test/snapshot.test.mjs packages/shared/types.ts tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.