О проекте
Команда: 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.mdEKT 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 hero | Three.js, @react-three/fiber | Интерактивная визуальная сцена на главной |
| Тесты frontend | Vitest, Testing Library, JSDOM | Проверка пользовательских сценариев чата и корзины |
| Сервер | Django 5.2, SQLite для MVP | BFF, сессии, 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.
Режимы каталога
| Режим | Настройка | Когда использовать |
|---|---|---|
| Fixture | CATALOG_PROVIDER=fixture | Разработка, тесты и стабильная демонстрация без внешних зависимостей |
| EKT API | CATALOG_PROVIDER=ekt + EKT_API_USERNAME / EKT_API_PASSWORD | Интеграция с реальным каталогом; credentials остаются только на сервере |
Live-адаптер предоставляет read-only данные каталога. Реальное изменение корзины EKT не включается, пока не согласован официальный conditional cart API. В fixture-режиме доступна демонстрационная сессионная корзина.
Основные пользовательские сценарии
- Пользователь открывает чат и пишет запрос на русском или казахском.
- Backend определяет язык, подбирает данные каталога/базы знаний и возвращает ответ со статусом источника.
- При найденном товаре отображаются цена, наличие, характеристики и количество.
- Нажатие «Добавить» не меняет корзину: создаётся предложение с
action_id, ценой и сроком действия. - Пользователь подтверждает конкретное предложение кнопкой или строгой фразой подтверждения.
- Сервер повторно проверяет данные. Если цена, наличие или версия корзины изменились, старое предложение истекает и возвращается replacement action.
- Только успешное подтверждение изменяет сессионную 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 /metrics | Liveness, readiness и метрики |
Полный контракт, граничные случаи и формат данных описаны в backend/README.md, а контракты провайдера — в backend/docs.
Конфигурация
Не коммитьте backend/.env и не передавайте секреты в браузер.
| Переменная | Назначение |
|---|---|
CATALOG_PROVIDER | fixture или 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
Документация
- Backend API и эксплуатация
- Контракт провайдеров каталога
- Оркестрация LLM
- Матрица приёмки
- Исходный контекст кейса
Что нужно для 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/apifor 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
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.