О проекте
Команда: RedRed
Кейс HackAlem.ai: Торговля — Электрокомплект · ekt.kz
Стадия: Доведённый продукт
Задача кейса: AI-консультант по каталогу ekt.kz: товары, аналоги, цены, остатки, корзина
Суть
Витрина каталога ЕКТ со встроенным AI-консультантом (RU, KK, EN). Консультант ищет товары, характеристики и аналоги, разбирает вложения и готовит предложение в корзину с подтверждением. Есть React-админка для синхронизации каталога и выбора модели.
Как устроено
FastAPI передаёт запрос и ограниченный контекст в OpenAI Responses API (gpt-6-sol) с вызовом серверных инструментов: поиск, карточки, аналоги, условия покупки, история. Ответ идёт потоком по WebSocket. Бэкенд проверяет структуру ответа и ссылки на товары. После явного подтверждения цена и остаток перезапрашиваются в API ЕКТ, и позиции записываются в корзину одной транзакцией в PostgreSQL. Фоновая синхронизация обходит каталог ЕКТ. При сбое основного ключа используется резервный.
Ключевые решения
- function/tool calling
- streaming ответов (WebSocket)
- структурированный вывод
- резервный API-ключ (failover)
- синхронизация каталога по расписанию
- замер TTFT и оценка диалогов
Особенности
Полноценная витрина с фильтрами и учётом кратности продажи. В админке можно проверить и переключить модель, смотреть диалоги и управлять синхронизацией каталога. В каталоге ai/ лежат скрипты замера TTFT и оценки мультиязычных диалогов с сохранёнными отчётами. Гостевая корзина при входе объединяется с корзиной аккаунта.
Стек
Python · FastAPI · PostgreSQL 17 · SQLAlchemy 2 · asyncpg · React 19 · TypeScript · Vite 8 · Tailwind CSS 4 · shadcn/ui · Docker Compose · nginx
Модели
gpt-6-sol (OpenAI)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-63e62cb7-redred.
README
README.mdRedRed — AI-консультант для каталога ЕКТ
1. Название проекта
RedRed — веб-приложение с AI-консультантом для покупателей электротехнической продукции ЕКТ.
Репозиторий: BAITC-Hacks/hack-63e62cb7-redred.
2. Какую проблему решает проект
Покупателю нужно найти товар среди множества артикулов, разобраться в характеристиках, проверить наличие и документы, а затем выбрать количество. RedRed объединяет каталог и диалог с консультантом: пользователь описывает задачу обычным текстом или прикладывает спецификацию, а приложение обращается к данным товаров и формирует предложение.
Решение предназначено для покупателей и специалистов, подбирающих электротехнические товары. Результат покупки в прототипе — сохранённая корзина приложения; оформление заказа на ekt.kz не выполняется.
3. Что реализовано
| Компонент | Возможности |
|---|---|
| Каталог | Поиск по названию и артикулу, категории, фильтры характеристик, наличия и документов, сортировка по цене, страницы по 20 товаров. |
| Карточка товара | Цена, общий остаток, характеристики, изображения и ссылки на документы, если они доступны в источнике. |
| AI-консультант | Диалог на русском, казахском и английском; поиск товаров, запрос характеристик и условий покупки, подбор кандидатов в аналоги, подготовка предложения для корзины. |
| Чат | История сообщений, HTTP- и WebSocket-транспорт, статусы обработки, передача частей ответа, подтверждение или отмена предложения. |
| Вложения | PDF, JPEG, DOCX и XLSX: до трёх файлов в сообщении, до 10 МБ каждый. |
| Корзина | Добавление после подтверждения, изменение количества и удаление позиций; проверка актуальной цены и наличия перед подтверждением. |
| Аккаунты | Гостевой режим, регистрация, вход и выход клиента; сохранение данных и обработка конфликта гостевой корзины с корзиной аккаунта. Избранное реализовано на уровне API. |
| React-админка | Обзор показателей, просмотр диалогов, управление синхронизацией каталога и её настройками, проверка и выбор AI-модели. |
| Синхронизация | Полный обход каталога ЕКТ или обновление загруженных карточек, запуск вручную и по расписанию, остановка, счётчики и история ошибок. |
Администратор входит по отдельному серверному паролю. Регистрация клиента не предоставляет административный доступ.
4. Как работает решение
- Пользователь открывает каталог и чат. Для начала диалога регистрация не требуется: приложение создаёт гостевую сессию.
- Пользователь вводит название, артикул, вопрос о товаре или прикладывает файл со спецификацией.
- FastAPI передаёт запрос и ограниченный контекст диалога AI-сервису. Модель вызывает серверные инструменты поиска, получения карточек, аналогов, условий покупки и истории.
- Бэкенд проверяет структуру результата и ссылки на товары. Фронт показывает ответ, карточки и, при запросе покупки, предложение с количеством и стоимостью.
- Пользователь явно подтверждает предложение. Бэкенд повторно получает цену и остаток из ЕКТ.
- При успешной проверке товары записываются в корзину одной транзакцией. Пользователь видит результат на странице
/cart. Если цена изменилась или товара недостаточно, приложение сообщает об этом.
Сам ответ модели не означает, что товар добавлен: изменение корзины требует отдельного подтверждения.
5. Технологии
| Область | Используемые технологии |
|---|---|
| Фронтенд | TypeScript, React 19, Vite 8, Tailwind CSS 4, компоненты shadcn/ui и Radix UI, иконки Lucide, шрифт Geist. |
| Бэкенд | Python, FastAPI, Uvicorn, Pydantic, HTTPX, WebSocket. |
| Хранение | PostgreSQL 17, SQLAlchemy 2, asyncpg; вложения хранятся в серверной файловой системе. |
| AI | OpenAI Responses API, вызовы инструментов, структурированный результат и потоковая передача текста. |
| Модель | По умолчанию в конфигурации указана gpt-6-sol. Модель задаётся через OPENAI_MODEL; администратор может выбрать доступную модель после успешной проверки. |
| Внешние данные | API каталога ЕКТ с серверной Basic Auth, ссылки на документы и сведения об оплате и доставке ЕКТ. |
| Проверки | Python unittest, HTTPX ASGI-транспорт и подмены внешних API; TypeScript и сборка Vite. |
| Локальная инфраструктура | Docker Compose для PostgreSQL. Фронтенд и бэкенд запускаются отдельными процессами. |
Модель не обучается в этом проекте. Ключи AI и учётные данные ЕКТ используются на сервере.
6. Архитектура проекта
flowchart LR
U[Покупатель / администратор] --> F[React: каталог, чат, корзина, админка]
F -->|HTTP / WebSocket| B[FastAPI]
B --> D[(PostgreSQL)]
B --> S[AI-сервис и серверные инструменты]
S --> O[OpenAI Responses API]
S --> C[Сервис каталога]
B --> C
C --> E[API ЕКТ]
C --> D
B --> A[Файлы вложений]
Основные директории и модули:
frontend/src/components/store— каталог, карточки и корзина;chat— виджет консультанта;admin— панель администратора.backend/main.py— приложение FastAPI и подключение маршрутов.backend/chat.pyиbackend/assistant/— обработка диалога, интеграция с моделью и разбор вложений.backend/catalog.py,ekt_client.py,catalog_sync.py— поиск по сохранённым карточкам, запросы ЕКТ и фоновое обновление.backend/cart.py,auth.py,sessions.py— корзины, аккаунты и сессии.backend/admin.py,admin_ai.py,ai_control.py— административный API и управление моделью.backend/models.py,migrate.py— модели данных и начальное создание схемы.backend/data/— сохранённые карточки и справочные данные;backend/tests/иtests/— тесты;ai/— диагностические скрипты AI.
PostgreSQL хранит каталог, сессии, аккаунты, сообщения, предложения, корзины и настройки. Приложение использует cookie и CSRF-токены для изменяющих запросов. В режиме разработки Vite перенаправляет /api на FastAPI.
7. Установка и запуск
Инструкция рассчитана на Windows PowerShell. Нужны Python 3.12, Node.js 22.12 или новее, npm, Git и работающий Docker с Compose. Для полного сценария требуются ключ OpenAI и учётные данные API ЕКТ.
В командах используется абсолютный путь C:\HackAlem\redred. Если репозиторий уже клонирован в другое место, замените этот префикс во всех командах. Порты 5432, 8000 и 5173 должны быть свободны.
Шаг 1. Получить проект и подготовить зависимости
git clone https://github.com/BAITC-Hacks/hack-63e62cb7-redred.git 'C:\HackAlem\redred'
py -3.12 -m venv 'C:\HackAlem\redred\backend\.venv'
& 'C:\HackAlem\redred\backend\.venv\Scripts\python.exe' -m pip install -r 'C:\HackAlem\redred\backend\requirements.txt'
npm --prefix 'C:\HackAlem\redred\frontend' ci
Шаг 2. Настроить окружение
В новом клоне создайте локальный файл конфигурации:
Copy-Item -LiteralPath 'C:\HackAlem\redred\.env.example' -Destination 'C:\HackAlem\redred\.env'
Заполните в .env следующие параметры:
| Переменная | Значение / назначение |
|---|---|
DATABASE_URL | postgresql+asyncpg://hackalem:[email protected]:5432/hackalem для PostgreSQL из Compose. |
POSTGRES_PASSWORD, REDRED_DB_PORT | Для этого локального примера: hackalem и 5432; для сервера задайте собственный пароль. |
SECURE_COOKIE | false для локального HTTP; для опубликованного HTTPS — true. |
APP_ORIGIN | http://localhost:5173. |
ADMIN_ORIGIN | Установите http://localhost:5173 для входа в админку через фронтенд. |
ADMIN_PASSWORD | Задайте собственный пароль администратора; логин не требуется. |
OPENAI_API_KEY | Ключ OpenAI с доступом к выбранной модели. |
OPENAI_MODEL | Идентификатор модели; значение в примере — gpt-6-sol. |
OPENAI_FALLBACK_API_KEY | Необязательный резервный ключ. |
EKT_API_USERNAME, EKT_API_PASSWORD | Учётные данные API ЕКТ. |
CATALOG_SYNC_ENABLED | Для первого запуска с сохранённой выборкой установите false. Ручная синхронизация доступна в админке. |
UPLOAD_DIR | Каталог вложений; по умолчанию backend/uploads относительно корня проекта. |
Бэкенд не загружает .env автоматически. В терминале, где будут запускаться миграция и FastAPI, выполните следующую команду. Она читает строки KEY=VALUE без вывода значений:
Get-Content -Encoding UTF8 -LiteralPath 'C:\HackAlem\redred\.env' | ForEach-Object { if ($_ -match '^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$') { [Environment]::SetEnvironmentVariable($matches[1], $matches[2].Trim().Trim([char]34).Trim([char]39), 'Process') } }
После изменения .env повторите загрузку переменных и перезапустите бэкенд. Реальные ключи и пароли не входят в репозиторий.
Шаг 3. Поднять PostgreSQL и загрузить начальные данные
docker compose -f 'C:\HackAlem\redred\compose.yaml' up -d db
docker compose -f 'C:\HackAlem\redred\compose.yaml' ps
Дождитесь состояния healthy у базы, затем в том же терминале выполните:
Set-Location 'C:\HackAlem\redred'; & 'C:\HackAlem\redred\backend\.venv\Scripts\python.exe' -m backend.migrate
Set-Location 'C:\HackAlem\redred'; & 'C:\HackAlem\redred\backend\.venv\Scripts\python.exe' -m backend.import_catalog --demo
Импорт добавляет 21 сохранённую карточку и не обращается к ЕКТ. Чтобы расширить каталог, после запуска откройте админку и выберите полный обход. Число товаров зависит от загруженных данных.
Шаг 4. Запустить бэкенд
В том же терминале с загруженными переменными окружения:
Set-Location 'C:\HackAlem\redred'; & 'C:\HackAlem\redred\backend\.venv\Scripts\python.exe' -m uvicorn backend.main:app --host 127.0.0.1 --port 8000
Шаг 5. Запустить фронтенд
В отдельном терминале:
npm --prefix 'C:\HackAlem\redred\frontend' run dev -- --host localhost --port 5173 --strictPort
| Адрес | Назначение |
|---|---|
| http://localhost:5173 | Каталог и чат. |
| http://localhost:5173/cart | Корзина. |
| http://localhost:5173/admin | Админка; пароль из ADMIN_PASSWORD. |
| http://127.0.0.1:8000/docs | Интерактивная документация API. |
| http://127.0.0.1:8000/health/ | Проверка доступности процесса. |
| http://127.0.0.1:8000/ready | Проверка подключения к PostgreSQL. |
Сборка фронтенда:
npm --prefix 'C:\HackAlem\redred\frontend' run build
Результат — frontend/dist. FastAPI может отдавать собранную админку по /admin и её ресурсы; для входа напрямую через порт 8000 нужно соответствующее значение ADMIN_ORIGIN. Без сборки этот маршрут возвращает FRONTEND_NOT_BUILT.
8. Как проверить решение
Сценарий для жюри
Предварительно запустите приложение, импортируйте начальную выборку и настройте действующие ключ OpenAI и доступ к ЕКТ.
- Откройте http://localhost:5173 и найдите артикул 200300285_ из начальной выборки. Откройте карточку и посмотрите характеристики.
- Откройте чат и отправьте: «Расскажи о товаре 200300285_: характеристики, наличие и документы». Ожидаемый результат — ответ консультанта с данными товара и доступными ссылками.
- Отправьте: «Добавь 2 штуки товара 200300285_ в корзину». Если актуальные цена и остаток позволяют покупку, приложение должно показать предложение.
- Проверьте, что до подтверждения корзина не изменилась. Подтвердите предложение кнопкой в чате.
- Перейдите в корзину: должны отображаться товар, количество и стоимость. При недостатке остатка, изменении цены или ошибке внешнего API приложение должно показать отказ, а не успешную покупку.
- Откройте http://localhost:5173/admin, войдите по заданному паролю. В разделе «Каталог» запустите обновление и проверьте прогресс и историю; в «Чатах» найдите диалог.
- Для проверки расширенного каталога запустите полный обход и перейдите на следующую страницу витрины. API возвращает до 20 товаров за запрос, а
totalсодержит общее число совпадений.
Цена, наличие, документы и время ответа зависят от внешних сервисов. Для проверки только интерфейса предусмотрен явный режим VITE_DEMO_MODE=true в frontend/.env.local; он не подтверждает работоспособность AI или интеграции ЕКТ и по умолчанию выключен.
Точечные проверки
Проверка контракта ассистента без реальных запросов к OpenAI и без БД:
Set-Location 'C:\HackAlem\redred'; & 'C:\HackAlem\redred\backend\.venv\Scripts\python.exe' -m unittest tests.test_assistant_service -v
Проверка входа администратора, CSRF, запуска и отмены синхронизации на тестовой БД с созданной схемой и собранным фронтендом; синхронизатор подменяется, обращения к ЕКТ не выполняются:
Set-Location 'C:\HackAlem\redred'; & 'C:\HackAlem\redred\backend\.venv\Scripts\python.exe' -m unittest backend.tests.test_admin_sync.AdminSyncTest.test_login_access_csrf_trigger_cancel_logout -v
9. Данные и интеграции
- Каталог ЕКТ:
https://ekt.kz/api/productsиhttps://ekt.kz/api/products/detail. Сервер получает карточки через Basic Auth, сохраняет их в PostgreSQL и обновляет по запросу или расписанию. - OpenAI:
https://api.openai.com/v1/responsesдля диалога и обработки поддерживаемых вложений;/v1/modelsдля списка моделей в админке. Используетсяstore=false. - Начальные данные:
backend/data/demo_products.jsonсодержит 21 сохранённую карточку ЕКТ с датой снимка 23 сентября 2026 года. Это снимки внешнего источника, а не собственный каталог команды и не гарантия актуальных остатков. - Документы:
backend/data/demo_documents.jsonсодержит дополнительные ссылки на документы; карточки также используют сведения, полученные от ЕКТ. - Условия покупки:
backend/data/purchase_terms.json— сохранённые сведения со страницы https://ekt.kz/checkout-delivery/. В источнике отмечено расхождение порогов бесплатной доставки; приложение сохраняет это предупреждение. - Внешние материалы: UI использует React, Tailwind, shadcn/ui, Radix UI, Lucide и Geist. Изображения, характеристики и документы товаров происходят из источников ЕКТ. Предобученная AI-модель предоставляется OpenAI.
PDF и JPEG передаются модели; из DOCX и XLSX извлекается ограниченный текст. Метаданные вложений хранятся в БД, сами файлы — на сервере.
10. Ограничения текущей версии
- Корзина принадлежит RedRed: приложение не создаёт заказ на ekt.kz, не резервирует товар и не принимает оплату.
- Поиск охватывает загруженные карточки. До завершения синхронизации локальная база может содержать только часть каталога.
- Для автоматов и коробок единица — штука, шаг продажи берётся из положительной целой кратности
KRATNOST_MINкарточки EKT. Четыре ранее проверенных товара сохраняют запасное правило при отсутствии кратности. Неизвестные категории и некорректная кратность блокируются. Проверены артикул200300276_, 20 исходных карточек, кратность упаковки и отказ при неверном шаге; внешняя корзина после этого исправления ещё не проверена. - Аналоги подбираются по заданным характеристикам для поддерживаемых категорий автоматических выключателей. Это кандидаты для проверки, а не гарантия инженерной взаимозаменяемости.
- Отображается общий остаток; выбор склада и бронирование не реализованы. Свежесть сохранённой карточки ограничена временем последнего обновления.
- Ответы AI и запросы ЕКТ зависят от доступности, прав доступа и задержек внешних API. Лимит обычного сообщения — 28 секунд, сообщения с вложениями — 40 секунд; внутренний лимит ассистента — 27,4 секунды, ожидание фронта — 50 секунд. Это предельные ожидания, а не обещанное время ответа.
- В контекст модели передаётся ограниченная история; поиск более ранних сообщений выполняется по словам внутри текущей сессии. Полная история не помещается в каждый запрос.
- Гостевая сессия по умолчанию действует 24 часа; вложения доступны в течение часа. Очистка истёкших данных запускается отдельной командой
backend.cleanup. - Подтверждение email и восстановление пароля не реализованы. Аккаунты RedRed не являются аккаунтами ekt.kz.
- XLSX-формулы не пересчитываются. Разбор офисных файлов ограничен объёмом текста; распознавание изображения не гарантирует точную идентификацию товара.
- Команда создания схемы не заменяет полноценное управление миграциями для произвольных будущих изменений БД. Нагрузочные гарантии и отказоустойчивый кластер в репозитории не заявлены.
11. Развёрнутая версия
Публичная версия: staffvision.ttvs.kz/red-red/.
Главная страница доступна без логина и пароля. Для проверки клиентского сценария можно начать с гостевого режима или использовать демонстрационный аккаунт.
Доступ для жюри
Данные входа в опубликованную версию предоставлены командой:
| Роль | Адрес | Логин | Пароль |
|---|---|---|---|
| Клиент | Открыть сайт → кнопка входа в аккаунт | client | client |
| Администратор | Открыть админку | Не требуется | admin |
В клиентском аккаунте можно проверить чат и корзину, в админке — каталог, диалоги, настройки синхронизации и AI-модели. Эти данные относятся к демонстрационному развёртыванию; для локального запуска пароль администратора задаётся через ADMIN_PASSWORD. Серверные ключи OpenAI и учётные данные API ЕКТ посетителю не нужны и в README не публикуются.
Локальный запуск описан в разделе 7. Публичное приложение размещено по префиксу /red-red/; фрагмент обратного прокси находится в deploy/red-red.nginx.conf.
Для публикации compose.yaml собирает и запускает PostgreSQL, backend и frontend с Nginx. Nginx раздаёт React, проксирует /api с поддержкой WebSocket и возвращает index.html для /cart, /admin и /admin/*. Инструкция запуска из архива приведена ниже.
Быстрый запуск из архива на сервере
Создание тестового клиента и настройка администратора скриптом
После заполнения .env выполните из корня проекта:
CLIENT_LOGIN='<логин>' CLIENT_PASSWORD='<пароль>' ADMIN_PASSWORD='<пароль администратора>' sh scripts/create-demo-accounts.sh
Скрипт обновляет только ADMIN_PASSWORD в .env, пересобирает контейнеры и создаёт клиента с отдельной сессией и корзиной. Повторный запуск не меняет пароль существующего клиента. Для admin-пароля скрипт принимает латинские буквы, цифры, _ и -. Клиент входит через «Логин или электронная почта»; публичная регистрация по-прежнему требует email и пароль минимум 8 символов. Админка использует только пароль, отдельного admin-логина нет. Проверены сборка frontend и четыре проверки валидации/хеширования; создание аккаунта на целевой БД ещё не проверено.
Публикация через Staffvision в /red-red/
Целевой адрес: https://staffvision.ttvs.kz/red-red/, админка: https://staffvision.ttvs.kz/red-red/admin/catalog.
В .env: VITE_BASE_PATH=/red-red/, APP_ORIGIN=https://staffvision.ttvs.kz, ADMIN_ORIGIN=https://staffvision.ttvs.kz, SECURE_COOKIE=true, REDRED_BIND_ADDRESS=127.0.0.1, REDRED_FRONTEND_PORT=8083. Origin не содержит путь. Заполните пароли и ключи, затем выполните docker compose up -d --build --wait --wait-timeout 180.
На том же сервере скопируйте location-фрагмент:
sudo mkdir -p /etc/nginx/snippets
sudo install -m 644 deploy/red-red.nginx.conf /etc/nginx/snippets/red-red.conf
sudo grep -Rl 'server_name.*staffvision.ttvs.kz' /etc/nginx/sites-enabled /etc/nginx/conf.d
В найденном конфигурационном файле добавьте внутрь существующего HTTPS-блока server для Staffvision строку include /etc/nginx/snippets/red-red.conf;. Существующие location и конфигурацию Staffvision сохраняйте. Фрагмент рассчитан на Nginx, установленный непосредственно на сервере; для Nginx в контейнере нужен доступный ему upstream вместо 127.0.0.1.
sudo nginx -t && sudo systemctl reload nginx
curl -fsS https://staffvision.ttvs.kz/red-red/ready
curl -fsS 'https://staffvision.ttvs.kz/red-red/api/products?limit=1'
Прокси снимает /red-red/ перед передачей контейнеру, сохраняет WebSocket Upgrade и ограничивает cookie путём /red-red/. Frontend собирается с этим префиксом, админка определяет префикс из своего URL. После изменения VITE_BASE_PATH нужна пересборка frontend. Публикация на внешнем сервере пока не проверена.
Прямой запуск по IP (альтернатива)
Для этого варианта дополнительно задайте VITE_BASE_PATH=/ и REDRED_BIND_ADDRESS=0.0.0.0; origin и cookie настройте как указано ниже.
Нужен Linux-сервер с Docker Engine и Docker Compose v2, доступом к интернету для сборки и открытым TCP-портом 8083. Python, Node.js и PostgreSQL на сервер вручную устанавливать не нужно.
unzip redred-server.zip
cd redred
cp .env.example .env
nano .env
docker compose up -d --build --wait --wait-timeout 180
В .env задайте POSTGRES_PASSWORD (длинный случайный пароль из букв и цифр), APP_ORIGIN=http://SERVER_IP:8083, ADMIN_ORIGIN=http://SERVER_IP:8083, ADMIN_PASSWORD, OPENAI_API_KEY, EKT_API_USERNAME и EKT_API_PASSWORD. Origin должен точно совпадать с адресом в браузере, без пути и завершающего /. Для HTTP оставьте SECURE_COOKIE=false; для HTTPS за внешним прокси задайте оба HTTPS-origin и SECURE_COOKIE=true. При изменении порта измените REDRED_FRONTEND_PORT и оба origin. Внешний прокси должен пропускать WebSocket Upgrade для /api/chat/ws. TLS-сертификат в этот Compose не входит.
Откройте http://SERVER_IP:8083/, корзину /cart, админку /admin/catalog. Nginx раздаёт frontend и проксирует API, WebSocket и админку; backend ждёт готовности PostgreSQL, создаёт схему и загружает 21 исходную карточку только в пустой каталог. База и вложения сохраняются в Docker volumes при перезапуске. Не выполняйте docker compose down -v, если нужно сохранить данные. DATABASE_URL из .env заменяется в контейнере адресом внутренней БД. Пароль уже созданной БД нельзя сменить простым изменением .env.
Проверка после запуска:
docker compose ps
curl -fsS http://localhost:8083/ready
curl -fsS 'http://localhost:8083/api/products?limit=1'
docker compose logs --tail=50 backend
В браузере проверьте каталог, отправку сообщения в чат и подтверждение добавления в корзину. Живые ответы AI требуют действующего ключа и квоты, свежие карточки и подтверждение корзины — доступного EKT API. Без этих доступов начальный каталог не означает работоспособность внешних интеграций.
Повторная упаковка актуальных исходников из репозитория: python scripts/package_release.py. Результат — release/redred-server.zip. Архив содержит исходники и .env.example, исключает рабочие .env, зависимости, локальные загрузки и отчёты. Передавайте рабочий .env отдельно либо заполните его на сервере. Контейнерные образы собираются на сервере; архив не является офлайн-поставкой Docker images.
Авторы коммитов
История коммитов
- 2026-09-23 17:56feat: deploy RedRed with Docker Compose under Staffvision subpathDossymzhan Yessenov
- 2026-09-23 17:56fix: use EKT sale multiplicity for breakers and boxesDossymzhan Yessenov
- 2026-09-23 17:56feat: provision client accounts and configure demo administratorDossymzhan Yessenov
- 2026-09-23 17:51Обновил README для жюри и добавил доступ к демонстрацииMuratov Daniyar
- 2026-09-23 17:41Увеличил таймауты ответа ИИ на двадцать секундMuratov Daniyar
- 2026-09-23 17:31Merge remote-tracking branch 'origin/main'Damir Zhunusov
- 2026-09-23 17:30feat: refine EKT catalog, documents, and cart UIDamir Zhunusov
- 2026-09-23 17:29Перенёс админку на ReactMuratov Daniyar
Все коммиты (31)
- 2026-09-23 17:10fix: отличать отсутствие результата поиска от нулевого остаткаDossymzhan Yessenov
- 2026-09-23 17:06feat: включить потоковый чат и ускорить поиск точного артикулаDossymzhan Yessenov
- 2026-09-23 16:55fix: учитывать базовый путь приложения в API и корзинеDossymzhan Yessenov
- 2026-09-23 16:53Merge remote-tracking branch 'origin/main'Dossymzhan Yessenov
- 2026-09-23 16:53fix: отключить автоматическую подмену API демонстрационной корзинойDossymzhan Yessenov
- 2026-09-23 16:52Добавлены фильтры каталога и управление корзинойMuratov Daniyar
- 2026-09-23 16:44feat: build EKT storefront and assistant UIDamir Zhunusov
- 2026-09-23 16:39Добавлено управление моделью ассистента через админкуMuratov Daniyar
- 2026-09-23 16:21feat: переключать AI на резервный ключ при сбоеDossymzhan Yessenov
- 2026-09-23 16:18chore: объединить обновления main с доработками ИИDossymzhan Yessenov
- 2026-09-23 16:17feat: добавить мультиязычный чат, память и обработку отказов корзиныDossymzhan Yessenov
- 2026-09-23 16:07docs: зафиксировать проверку AI из чистого клонаDossymzhan Yessenov
- 2026-09-23 16:05docs: зафиксировать проверку AI из чистого клонаDossymzhan Yessenov
- 2026-09-23 16:04Добавлены аккаунты, избранное, админка и синхронизация каталогаMuratov Daniyar
- 2026-09-23 16:00docs: обновить статус опубликованного AI-модуляDossymzhan Yessenov
- 2026-09-23 15:59feat: подключить потоковый AI-консультант и проверкиDossymzhan Yessenov
- 2026-09-23 15:12Реализован бэкенд каталога, чата и подтверждаемой корзиныMuratov Daniyar
- 2026-09-23 14:49checkpointDamir Zhunusov
- 2026-09-23 14:32Согласованы контракты бэкенда и ассистентаMuratov Daniyar
- 2026-09-23 14:26docs: focus AI plan on verifiable MVPDossymzhan Yessenov
- 2026-09-23 14:12docs: add AI assistant architecture planDossymzhan Yessenov
- 2026-09-23 13:57Подготовил бэкенд на FastAPIMuratov Daniyar
- 2026-09-23 13:40feat: scaffold React frontend with shadcn uiDamir Zhunusov
Структура репозитория (136 файлов)
.dockerignore .env.example .gitattributes .gitignore README.md ai/catalog_probe.py ai/evaluate_dialogue.py ai/evaluate_hypotheses.py ai/measure_ttft.py ai/reports/backend-ai-live.json ai/reports/backend-multilingual-live.json ai/reports/ekt-catalog-probe.json ai/reports/openai-gpt-6-sol-dialogue.json ai/reports/openai-gpt-6-sol-ttft.json ai/reports/openai-gpt-6-sol.json ai/smoke_attachments.py ai/smoke_key_fallback.py ai/smoke_service.py ai/smoke_ws.py ai/verify_backend.py ai/verify_multilingual.py backend/Dockerfile backend/__init__.py backend/admin.py backend/admin_ai.py backend/ai_control.py backend/ai_provider.py backend/assistant/__init__.py backend/assistant/files.py backend/assistant/service.py backend/assistant_contract.py backend/assistant_tools.py backend/attachments.py backend/auth.py backend/bootstrap.py backend/cart.py backend/catalog.py backend/catalog_sync.py backend/chat.py backend/chat_language.py backend/chat_memory.py backend/cleanup.py backend/config.py backend/create_client.py backend/data/demo_documents.json backend/data/demo_products.json backend/data/purchase_terms.json backend/db.py backend/dependencies.py backend/ekt_client.py backend/errors.py backend/favorites.py backend/import_catalog.py backend/main.py backend/migrate.py backend/models.py backend/requirements.txt backend/runtime_settings.py backend/sessions.py backend/tests/test_account_flow.py backend/tests/test_admin_ai.py backend/tests/test_admin_sync.py backend/tests/test_admin_workspace.py backend/tests/test_ai_control.py backend/tests/test_ai_integration.py backend/tests/test_assistant_models.py backend/tests/test_auth.py backend/tests/test_cart.py backend/tests/test_cart_mutations.py backend/tests/test_catalog_filters.py backend/tests/test_catalog_search.py backend/tests/test_catalog_sync.py backend/tests/test_favorites.py backend/tests/test_runtime_settings.py compose.yaml deploy/red-red.nginx.conf docs/AI_ARCHITECTURE_PLAN.md docs/AI_WORK_REPORT.md docs/BACKEND_SPEC.md frontend/.env.example frontend/.gitignore frontend/.prettierignore frontend/.prettierrc frontend/Dockerfile frontend/components.json frontend/eslint.config.js frontend/index.html frontend/nginx.conf frontend/package-lock.json frontend/package.json frontend/public/vite.svg frontend/src/App.tsx frontend/src/assets/react.svg frontend/src/components/admin/admin-page.tsx frontend/src/components/admin/admin-shared.tsx frontend/src/components/admin/ai-panel.tsx frontend/src/components/admin/catalog-panel.tsx frontend/src/components/admin/chats-panel.tsx frontend/src/components/auth/auth-dialog.tsx frontend/src/components/chat/chat-widget.tsx frontend/src/components/store/storefront.tsx frontend/src/components/theme-provider.tsx frontend/src/components/ui/alert.tsx frontend/src/components/ui/avatar.tsx frontend/src/components/ui/badge.tsx frontend/src/components/ui/button.tsx frontend/src/components/ui/card.tsx frontend/src/components/ui/checkbox.tsx frontend/src/components/ui/dialog.tsx frontend/src/components/ui/input.tsx frontend/src/components/ui/scroll-area.tsx frontend/src/components/ui/select.tsx frontend/src/components/ui/sheet.tsx frontend/src/components/ui/skeleton.tsx frontend/src/components/ui/tabs.tsx frontend/src/components/ui/textarea.tsx frontend/src/components/ui/tooltip.tsx frontend/src/index.css frontend/src/lib/admin-api.ts frontend/src/lib/chat-api.ts frontend/src/lib/demo-data.ts frontend/src/lib/utils.ts frontend/src/main.tsx frontend/tsconfig.app.json frontend/tsconfig.json frontend/tsconfig.node.json frontend/vite.config.ts scripts/create-demo-accounts.sh scripts/package_release.py tests/__init__.py tests/test_assistant_fast.py tests/test_assistant_service.py tests/test_chat_languages.py tests/test_chat_transport.py tests/test_provisioned_login.py tests/test_sale_multiplicity.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.