AAYMA
RU
Войти

EKT AI Assistant

AI-консультант по каталогу ekt.kz с чатом на русском и казахском: поиск товаров, карточка с ценой и остатком, подбор аналогов, база знаний и…

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

О проекте

Команда: KnewIT Number 1
Кейс HackAlem.ai: Торговля — Электрокомплект · ekt.kz
Стадия: Рабочий MVP

Задача кейса: AI-консультант по каталогу ekt.kz: товары, аналоги, цены, остатки, корзина

Суть

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

Как устроено

React/Vite-клиент обращается к Django BFF. BFF берёт каталог из fixture или из защищённого адаптера EKT API (Basic Auth), строит локальный индекс и ищет по нему точно, с опечатками и семантически по характеристикам. Аналоги подбираются по матрице совместимости, например для светотехники. Оркестратор диалога использует OpenAI Responses API как планировщик над ограниченным набором backend-инструментов (RAG по базе знаний, уточняющие вопросы) и отдаёт ответ потоком через SSE. Корзина работает через неизменяемое предложение с action_id и TTL: сервер заново проверяет цену и остаток и только после этого подтверждает.

Ключевые решения

  • OpenAI Responses API tool orchestration
  • local catalog index
  • typo-tolerant search
  • semantic search by attributes
  • analog compatibility matrix
  • confirmable idempotent cart actions with TTL
  • SSE streaming
  • prompt-injection sanitization
  • payment data rejection

Особенности

Акцент на безопасности корзины: неизменяемое предложение с повторной серверной проверкой цены и остатка, защита от повторных добавлений, отказ принимать номера карт и IBAN до обращения к LLM, секреты EKT и OpenAI не покидают backend. Задачи в коммитах пронумерованы (BE #1…#19).

Стек

React 18 · Vite 6 · Three.js · @react-three/fiber · Django 5.2 · SQLite · Vitest · Python

Модели

OpenAI Responses API


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-2e627b26-knewit-number-1.

README

README.md

EKT AI Assistant

Интерактивный прототип AI-консультанта для интернет-магазина электротехники EKT.kz. Он помогает найти товар, показать проверяемые характеристики, цену и наличие, подобрать допустимый аналог и сформировать защищённое предложение для корзины. Изменение корзины выполняется только после явного подтверждения пользователя.

Проект сделан как hackathon MVP, но в нём уже выделены границы, необходимые для дальнейшей продуктовой интеграции: frontend не имеет доступа к учётным данным EKT или OpenAI, а все внешние вызовы и бизнес-правила находятся на backend.

Что умеет проект

  • Главная страница EKT.kz с интерактивным 3D hero-блоком: планету можно вращать, анимацию — поставить на паузу. Для окружений без WebGL есть CSS-fallback.
  • Каталог и карточки товаров, построенные поверх backend API.
  • Чат-консультант на русском и казахском языках.
  • Поиск по локальному индексу, семантический поиск и подбор аналогов по утверждённым правилам совместимости.
  • Карточка товара в чате: цена, остаток, характеристики, статус свежести данных и ссылка на официальный источник.
  • Безопасный flow корзины: сначала создаётся неизменяемое предложение, затем пользователь подтверждает именно его. Для устаревшей цены или остатка формируется новое предложение.
  • Защита от повторных добавлений, ограничений количества и конкурентных изменений корзины в fixture-режиме.
  • Локальная база знаний для условий доставки, оплаты и других справочных вопросов.
  • Опциональная серверная интеграция с OpenAI Responses API: модель работает только как планировщик над ограниченными backend-инструментами.
  • Прокси к EKT API с таймаутами, ограничением размера ответа, контролем редиректов и безопасной обработкой ошибок.
  • Health/readiness/metrics, request ID и структурированное журналирование без секретов и содержимого сообщений.

В текущей ветке UI выбора вложений готов к использованию, но серверный endpoint /api/dialog/uploads ещё не реализован. Не используйте загрузку файлов как завершённую функцию до добавления backend-обработчика и антивирусной/контентной проверки.

Архитектура

Браузер (React / Vite)
  │  относительные /api/* и /demo/* запросы
  ▼
Django BFF
  ├─ каталог: fixture или защищённый адаптер EKT API
  ├─ локальный индекс, поиск и правила аналогов
  ├─ dialog / knowledge base / локализация
  ├─ корзина и подтверждаемые cart actions
  └─ опциональный OpenAI Responses API через ограниченные инструменты
        │
        ├─ EKT API (только backend, Basic Auth)
        └─ OpenAI API (только backend, ключ в секрет-хранилище)

Стек

СлойТехнологииНазначение
КлиентReact 18, Vite 6, JavaScriptГлавная, каталог, чат, локализация и UX корзины
3D heroThree.js, @react-three/fiberИнтерактивная визуальная сцена на главной
Тесты frontendVitest, Testing Library, JSDOMПроверка пользовательских сценариев чата и корзины
СерверDjango 5.2, SQLite для MVPBFF, сессии, API, каталог, корзина, knowledge base
Внешние системыEKT API, OpenAI Responses APIКаталог и опциональная LLM-оркестрация

Структура репозитория

.
├── frontend/                     # React/Vite клиент
│   ├── src/App.jsx               # страницы, каталог, чат, корзина
│   ├── src/OrbitDeliveryHero.jsx # интерактивный Three.js hero
│   ├── src/cartApi.js            # клиент к backend API
│   ├── src/i18n.js               # RU/KK тексты интерфейса
│   └── src/*.test.*              # frontend-тесты
├── backend/                      # Django BFF
│   ├── catalog/                  # провайдеры, индекс, поиск, аналоги
│   ├── cart/                     # предложения и подтверждение корзины
│   ├── dialog/                   # состояние диалога, SSE, safety checks
│   ├── assistant/                # LLM-оркестрация и локализация
│   ├── knowledge_base/           # утверждённые справочные знания
│   ├── gateway/                  # лимиты, сессия и middleware
│   ├── config/                   # настройки, URL, наблюдаемость
│   └── docs/                     # контракты и acceptance-материалы
├── HackAlem_AI_ekt_kz.md         # исходное ТЗ/контекст кейса
└── ekt-case-notes.md             # проверенные заметки по EKT API

Быстрый запуск

1. Backend в fixture-режиме

Fixture-режим не требует доступа к EKT API и подходит для демо и разработки.

cd backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
Copy-Item .env.example .env

В backend/.env установите:

CATALOG_PROVIDER=fixture
DJANGO_ENV=development
DJANGO_DEBUG=true

Затем примените миграции и запустите сервер:

python manage.py migrate
python manage.py runserver 127.0.0.1:8000

Для macOS/Linux активируйте окружение командой source .venv/bin/activate.

2. Frontend

В новом терминале:

cd frontend
Copy-Item .env.example .env
npm install
npm run dev

Откройте адрес, который напечатает Vite (обычно http://localhost:5173). По умолчанию frontend проксирует /api/* и /demo/* на http://localhost:8000, поэтому cookies и CSRF работают в same-origin сценарии.

Требования: Node.js 20+ и Python с поддержкой Django 5.2.

Режимы каталога

РежимНастройкаКогда использовать
FixtureCATALOG_PROVIDER=fixtureРазработка, тесты и стабильная демонстрация без внешних зависимостей
EKT APICATALOG_PROVIDER=ekt + EKT_API_USERNAME / EKT_API_PASSWORDИнтеграция с реальным каталогом; credentials остаются только на сервере

Live-адаптер предоставляет read-only данные каталога. Реальное изменение корзины EKT не включается, пока не согласован официальный conditional cart API. В fixture-режиме доступна демонстрационная сессионная корзина.

Основные пользовательские сценарии

  1. Пользователь открывает чат и пишет запрос на русском или казахском.
  2. Backend определяет язык, подбирает данные каталога/базы знаний и возвращает ответ со статусом источника.
  3. При найденном товаре отображаются цена, наличие, характеристики и количество.
  4. Нажатие «Добавить» не меняет корзину: создаётся предложение с action_id, ценой и сроком действия.
  5. Пользователь подтверждает конкретное предложение кнопкой или строгой фразой подтверждения.
  6. Сервер повторно проверяет данные. Если цена, наличие или версия корзины изменились, старое предложение истекает и возвращается replacement action.
  7. Только успешное подтверждение изменяет сессионную fixture-корзину.

API: ключевые маршруты

МаршрутНазначение
GET /api/productsСписок товаров из настроенного провайдера
GET /api/products/detail?id=…Карточка товара с нормализованными полями
GET /api/search?q=…Поиск по локальному индексу
GET /api/search/semantic?q=…Поиск по свойствам и описанию индексированных товаров
GET /api/analogs?id=…Объяснимый подбор аналогов для поддерживаемых категорий
GET /api/knowledge-base?q=…&lang=ruПоиск утверждённых справочных знаний
GET /api/dialogТекущее состояние диалога и приветствие
POST /api/dialog/messagesОбычное сообщение диалога
POST /api/dialog/messages/streamПотоковый ответ по SSE
POST /api/dialog/cancelОтмена текущей операции
DELETE /api/dialog/historyОчистка истории текущей сессии
GET /api/cartТекущее состояние demo-корзины
POST /api/cart/actionsСоздание предложения корзины
POST /api/cart/actions/{action_id}/confirmПодтверждение конкретного предложения
POST /api/cart/actions/confirm-textСтрогое текстовое подтверждение единственного активного предложения
POST /api/chat/languageЯвная смена RU/KK в сессии
GET /health, GET /ready, GET /metricsLiveness, readiness и метрики

Полный контракт, граничные случаи и формат данных описаны в backend/README.md, а контракты провайдера — в backend/docs.

Конфигурация

Не коммитьте backend/.env и не передавайте секреты в браузер.

ПеременнаяНазначение
CATALOG_PROVIDERfixture или ekt
EKT_API_BASE_URL, EKT_API_USERNAME, EKT_API_PASSWORDПараметры серверного адаптера EKT API
SELLABLE_STORE_IDSСогласованный allowlist складов, доступных для продажи в live-режиме
DJANGO_SECRET_KEY, DJANGO_ENV, DJANGO_ALLOWED_HOSTSНастройки Django и production-окружения
API_RATE_LIMIT_PER_MINUTE, API_MAX_BODY_BYTESЗащита публичного API BFF
OPENAI_ENABLED, OPENAI_API_KEY, OPENAI_MODELОпциональный OpenAI Responses API; ключ только на backend
CATALOG_INDEX_*Путь, лимиты и правила синхронизации локального индекса
VITE_API_BASE_URLАдрес backend для Vite proxy во frontend

Локальный индекс каталога

Для быстрого поиска и подбора аналогов синхронизируйте каталог в локальный индекс:

cd backend
python manage.py sync_catalog --include-details

Данные записываются в backend/var/ и игнорируются Git. В production запускайте синхронизацию по расписанию; рекомендуемый интервал — один раз в 24 часа. Readiness-проверка вернёт 503, если выбранный провайдер или локальный индекс недоступен.

Безопасность и границы ответственности

  • EKT credentials и OpenAI API key не попадают во frontend, ответы API или логи.
  • Backend принимает внешние каталоговые, файловые и web-данные как недоверенные: опасная разметка и неразрешённые URL отбрасываются.
  • Данные банковских карт, CVV/CVC, IBAN и реквизиты отклоняются до сохранения сессии и до обращения к LLM.
  • Цена и остаток для предложения корзины проверяются на сервере; клиент не является источником истины.
  • Cart actions привязаны к сессии, имеют TTL и работают идемпотентно.
  • Ограничитель запросов в MVP процессный. Для нескольких экземпляров backend вынесите rate limiting в Redis или другой общий storage.

Проверки

# frontend
cd frontend
npm run test:run
npm run build

# backend
cd backend
python manage.py test

Документация

Что нужно для production

Перед реальным запуском необходимо: подключить production-БД с блокировками строк для корзины, вынести rate limit и сессии в общую инфраструктуру, настроить секрет-хранилище, добавить мониторинг/алерты, согласовать продаваемые склады, завершить endpoint безопасной загрузки файлов и получить официальный контракт на mutation API корзины EKT.

Local installation and .env configuration

Requirements

  • Python 3.12+;
  • Node.js 20+ and npm;
  • access to https://ekt.kz/api for the live catalog.

Backend (Windows PowerShell)

cd backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
Copy-Item .env.example .env
python manage.py migrate
python manage.py check
python manage.py runserver 127.0.0.1:8000

If PowerShell blocks Activate.ps1, use .\.venv\Scripts\python.exe directly. If port 8000 is busy, use 8001 and set the same port in frontend/.env.

backend/.env

Create it by copying backend/.env.example. Use one NAME=VALUE pair per line, with no spaces around =.

Demo mode:

CATALOG_PROVIDER=fixture
DJANGO_ENV=development
DJANGO_DEBUG=true
DJANGO_SECRET_KEY=local-development-secret
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1
OPENAI_ENABLED=false

Live EKT mode:

CATALOG_PROVIDER=ekt
EKT_API_BASE_URL=https://ekt.kz/api
EKT_API_USERNAME=<EKT API username>
EKT_API_PASSWORD=<EKT API password>
SELLABLE_STORE_IDS=
EKT_CONNECT_TIMEOUT_SECONDS=1
EKT_READ_TIMEOUT_SECONDS=3
EKT_DEADLINE_SECONDS=5
EKT_MAX_RETRIES=2
EKT_ASSET_ALLOWED_HOSTS=ekt.kz

SELLABLE_STORE_IDS may stay empty until EKT confirms sellable warehouses. It does not disable catalog loading; it only prevents stock from being treated as confirmed sellable.

Optional OpenAI:

OPENAI_ENABLED=true
OPENAI_API_KEY=<new OpenAI key>
OPENAI_API_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=<available model>

Keep credentials only in backend .env; never commit them or put them in frontend. Revoke any key exposed in chat or git. .env files are ignored by .gitignore.

Frontend

cd frontend
Copy-Item .env.example .env
npm.cmd install
npm.cmd run dev

Set frontend/.env to the backend URL:

VITE_API_BASE_URL=http://127.0.0.1:8000

Use http://127.0.0.1:8001 when backend runs on port 8001. Restart Vite after changing .env; the UI is usually at http://localhost:5173.

Verification

Invoke-WebRequest http://127.0.0.1:8000/ready
Invoke-WebRequest "http://127.0.0.1:8000/api/products?page=1&per_page=2"
cd frontend
npm.cmd run test:run
npm.cmd run build
Звёзды
⭐ 0
Форки
3
Язык
Python
Последний push
в прошлом месяце
Коммиты
62
Авторы
3
Файлы
119
Ветки
1

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

ArekeZh 33medetik-rgb 17semeikhan-t 12

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

  • 2026-09-23 17:58finalArekeZh
  • 2026-09-23 17:57finalArekeZh
  • 2026-09-23 17:55Enhance catalog detail retrieval and document handling in dialogsemeikhan-t
  • 2026-09-23 17:54Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1medetik-rgb
  • 2026-09-23 17:54Enhance site layout with a new utility header and a comprehensive footer. Updated README with local installation instructions and environment configuration details for development and production modesmedetik-rgb
  • 2026-09-23 17:48Add catalog lookup rules and identifier detection in LLMsemeikhan-t
  • 2026-09-23 17:44#3 Диалог: подбирать аналоги для недоступного товараArekeZh
  • 2026-09-23 17:36Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1ArekeZh
Все коммиты (62)
  • 2026-09-23 17:36korzina addedArekeZh
  • 2026-09-23 17:36Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1medetik-rgb
  • 2026-09-23 17:32Update catalog provider to 'ekt' in environment settings and settings.py; enhance product comparison functionality in LLM and dialog tools; add attachment handling in frontend; improve product detail medetik-rgb
  • 2026-09-23 17:32Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1medetik-rgb
  • 2026-09-23 17:31Implement attachment handling in dialog: added configuration for attachment limits, updated dialog state to manage attachments, and enhanced message processing to include attachment context. Added newsemeikhan-t
  • 2026-09-23 17:28site remakeArekeZh
  • 2026-09-23 17:26Implement payment data safety measures: added functionality to redact sensitive information from chat messages, updated README with security details, and enhanced error handling for payment data detecmedetik-rgb
  • 2026-09-23 17:23site remake(50%) CONFLICT resolved 3ArekeZh
  • 2026-09-23 17:20site remake(50%) CONFLICT resolved 2ArekeZh
  • 2026-09-23 17:19Implement file attachment functionality in chat: added support for uploading and validating attachments, updated message composition to include attachment IDs, and enhanced UI to display attachment stsemeikhan-t
  • 2026-09-23 17:17site remake(50%) CONFLICT resolvedArekeZh
  • 2026-09-23 17:15site remake(50%)ArekeZh
  • 2026-09-23 17:09Implement analog comparison feature in message composition: added support for analog comparisons in the `compose_message` function, updated `DialogToolRegistry` to include source product details, and semeikhan-t
  • 2026-09-23 17:02Enhance chat widget to handle cart proposals: added support for cart actions and phases in response handling. Updated tests to validate server-issued proposals and user confirmations for cart additionsemeikhan-t
  • 2026-09-23 16:53Merge dialog orchestrator with localized chat UImedetik-rgb
  • 2026-09-23 16:48Enhance chat functionality and localization support: updated README with provider contract details, added cart policy to fixture provider, and improved language management in frontend components. Addemedetik-rgb
  • 2026-09-23 16:41Update chat widget to integrate with Django API: messages are now sent to the server, which orchestrates responses from OpenAI. Enhanced README with API usage details and updated demo states. Removed semeikhan-t
  • 2026-09-23 16:14BE #13: Оркестратор диалога — LLM-инструменты, RAG, уточнения CONFLICT reslovedArekeZh
  • 2026-09-23 16:11BE #13: Оркестратор диалога — LLM-инструменты, RAG, уточненияArekeZh
  • 2026-09-23 15:59Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1medetik-rgb
  • 2026-09-23 15:55Add chat functionality and product comparison feature: updated .env.example for chat settings, enhanced README with chat API details, implemented dialog language management in cart service, and added medetik-rgb
  • 2026-09-23 15:54Update dependencies and enhance README for EKT chat widget: upgraded Node.js version requirements, added testing libraries, and improved documentation on API integration and demo functionality.semeikhan-t
  • 2026-09-23 15:48BE #11: База знаний — движок и стартовый контентArekeZh
  • 2026-09-23 15:42BE #19: Безопасность — валидация, prompt injection, санитизацияArekeZh
  • 2026-09-23 15:39BE #17: BFF / API Gateway — сессия, аутентификация, лимитыArekeZh
  • 2026-09-23 15:35BE #12: Оркестратор диалога — контекст сессии и ссылкиArekeZh
  • 2026-09-23 15:29Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1ArekeZh
  • 2026-09-23 15:29BE #9: Аналоги — матрица совместимости светотехники и фильтрыArekeZh
  • 2026-09-23 15:26Enhance cart service with sales rules validation and stock management: added functions for validating sales rules, checking quantity limits, and handling stock shortages. Updated README with new API rsemeikhan-t
  • 2026-09-23 15:26BE #10: Аналоги — ранжирование и сравнительная карточкаArekeZh
  • 2026-09-23 15:21BEArekeZh
  • 2026-09-23 15:15BE #8: Поиск — семантический по характеристикамArekeZh
  • 2026-09-23 15:11BE #7: Поиск — точный + по названию с опечаткамиArekeZh
  • 2026-09-23 15:08Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1ArekeZh
  • 2026-09-23 15:08BE #6: Загрузка и индекс каталогаArekeZh
  • 2026-09-23 15:03Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1medetik-rgb
  • 2026-09-23 15:03Add product card component and demo product data in App.jsx; enhance styles for product displaymedetik-rgb
  • 2026-09-23 15:02Enhance cart functionality and configuration: added cart actions to .env.example, updated README with cart API details, modified settings for session management and SQLite database, and included cart semeikhan-t
  • 2026-09-23 14:55Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1ArekeZh
  • 2026-09-23 14:55BE #5: Правило доступного остатка sellable_quantityArekeZh
  • 2026-09-23 14:50Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1medetik-rgb
  • 2026-09-23 14:50Import React in App.jsx to ensure proper component functionalitymedetik-rgb
  • 2026-09-23 14:48BE #3: Адаптер каталога ekt.kzArekeZh
  • 2026-09-23 14:43Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1ArekeZh
  • 2026-09-23 14:43BE #1: Уточнение контрактов API ekt.kzArekeZh
  • 2026-09-23 14:41Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1medetik-rgb
  • 2026-09-23 14:41Updated .env.example files in frontend and backend for improved configuration managementmedetik-rgb
  • 2026-09-23 14:35Update .gitignore to exclude .venv and enhance .env.example with additional configuration options for developmentsemeikhan-t
  • 2026-09-23 14:15.env.example was added to frontend and backend foldersArekeZh
  • 2026-09-23 14:00Added TZsemeikhan-t
  • 2026-09-23 13:33deleted unnecessary TZArekeZh
  • 2026-09-23 13:31Merge branch 'main' of https://github.com/BAITC-Hacks/hack-2e627b26-knewit-number-1ArekeZh
  • 2026-09-23 13:30ekt addedArekeZh
  • 2026-09-23 13:30Initial setup of project files and directory structure.medetik-rgb
Структура репозитория (119 файлов)
.gitignore
.playwright-cli/console-2026-09-23T09-24-50-581Z.log
.playwright-cli/page-2026-09-23T09-24-50-777Z.yml
.playwright-cli/page-2026-09-23T09-25-44-791Z.yml
HackAlem_AI_ekt_kz.md
README.md
backend/.env.example
backend/README.md
backend/acceptance/__init__.py
backend/acceptance/matrix.py
backend/acceptance/sample.py
backend/acceptance/tests/__init__.py
backend/acceptance/tests/test_at.py
backend/assistant/__init__.py
backend/assistant/errors.py
backend/assistant/kb.py
backend/assistant/localization.py
backend/assistant/openai_client.py
backend/assistant/service.py
backend/assistant/tests/__init__.py
backend/assistant/tests/test_localization.py
backend/assistant/urls.py
backend/assistant/views.py
backend/cart/__init__.py
backend/cart/apps.py
backend/cart/errors.py
backend/cart/migrations/0001_initial.py
backend/cart/migrations/__init__.py
backend/cart/models.py
backend/cart/service.py
backend/cart/tests/__init__.py
backend/cart/tests/test_api.py
backend/cart/urls.py
backend/cart/views.py
backend/catalog/__init__.py
backend/catalog/analogs.py
backend/catalog/apps.py
backend/catalog/availability.py
backend/catalog/errors.py
backend/catalog/index_sync.py
backend/catalog/management/__init__.py
backend/catalog/management/commands/__init__.py
backend/catalog/management/commands/sync_catalog.py
backend/catalog/normalization.py
backend/catalog/providers/__init__.py
backend/catalog/providers/base.py
backend/catalog/providers/ekt.py
backend/catalog/providers/fixture.py
backend/catalog/safety.py
backend/catalog/search.py
backend/catalog/static/catalog/product-placeholder.svg
backend/catalog/tests/__init__.py
backend/catalog/tests/test_api.py
backend/catalog/tests/test_normalization.py
backend/catalog/tests/test_provider_contract.py
backend/catalog/tests/test_security.py
backend/catalog/urls.py
backend/catalog/views.py
backend/config/__init__.py
backend/config/asgi.py
backend/config/env.py
backend/config/observability.py
backend/config/settings.py
backend/config/urls.py
backend/config/wsgi.py
backend/dialog/__init__.py
backend/dialog/apps.py
backend/dialog/attachments.py
backend/dialog/llm.py
backend/dialog/payment_safety.py
backend/dialog/tests/__init__.py
backend/dialog/tests/test_api.py
backend/dialog/tests/test_attachments.py
backend/dialog/tests/test_llm.py
backend/dialog/tests/test_payment_safety.py
backend/dialog/tools.py
backend/dialog/urls.py
backend/dialog/views.py
backend/docs/acceptance-matrix.md
backend/docs/catalog-provider-contract.md
backend/docs/ekt-api-contract.md
backend/docs/llm-orchestrator.md
backend/gateway/__init__.py
backend/gateway/apps.py
backend/gateway/middleware.py
backend/gateway/tests/__init__.py
backend/gateway/tests/test_api.py
backend/gateway/urls.py
backend/gateway/views.py
backend/knowledge_base/__init__.py
backend/knowledge_base/apps.py
backend/knowledge_base/engine.py
backend/knowledge_base/migrations/0001_initial.py
backend/knowledge_base/migrations/__init__.py
backend/knowledge_base/models.py
backend/knowledge_base/tests/__init__.py
backend/knowledge_base/tests/test_engine.py
backend/knowledge_base/urls.py
backend/knowledge_base/views.py
backend/manage.py
backend/requirements.txt
ekt-case-notes.md
frontend/.env.example
frontend/README.md
frontend/favicon.svg
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/src/App.jsx
frontend/src/App.test.jsx
frontend/src/OrbitDeliveryHero.jsx
frontend/src/cartApi.js
frontend/src/cartApi.test.js
frontend/src/i18n.js
frontend/src/i18n.test.js
frontend/src/main.jsx
frontend/src/styles.css
frontend/src/test/setup.js
frontend/vite.config.js

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

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

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