AAYMA
RU
Войти

Jarvis

Консультант для ekt.kz на Next.js: поиск по каталогу EKT, аналоги, распознавание фото и спецификаций, сравнение до 4 товаров, корзина с…

Доведённый продукт
Команда «Jarvis» 23💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Jarvis
Кейс HackAlem.ai: Торговля — Электрокомплект · ekt.kz
Стадия: Доведённый продукт

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

Суть

Консультант для ekt.kz на Next.js: поиск по каталогу EKT, аналоги, распознавание фото и спецификаций, сравнение до 4 товаров, корзина с подтверждением и передача запроса менеджеру. Есть аккаунты с историей диалогов в Neon Postgres, решение развёрнуто на Vercel.

Как устроено

Точные артикулы и таблицы «Артикул;Количество» обрабатываются правилами без AI. Для свободных запросов и вложений OpenAI (gpt-4.1-mini, для фото мультимодальный режим) строит структурированный план поиска. Сервер находит карточки в JSON-индексе и через API EKT и отвечает с источниками, аналоги проверяются отдельными правилами сравнения характеристик. Корзина: /api/cart/propose создаёт HMAC-подписанное одноразовое предложение на 10 минут, /api/cart/confirm повторно проверяет цену, остаток и кратность.

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

  • структурированный план поиска от LLM
  • детерминированные правила для точных артикулов
  • правила аналогов по характеристикам
  • мультимодальное чтение маркировки
  • HMAC-SHA256 подписанные предложения корзины
  • разбор спецификаций до 12 позиций

Особенности

У модели нет инструмента изменения корзины, а предложения одноразовые, подписаны и привязаны к ревизии корзины. Замена не подтверждается, если данных недостаточно или они противоречивы. Результат подбора можно передать менеджеру в TXT. Есть публичное демо и тестовый аккаунт.

Стек

Next.js 16 · React 19 · TypeScript · Zod · OpenAI SDK · Neon Postgres / Neon Auth · pdf-parse · Mammoth · ExcelJS · Sharp · Playwright · Vercel

Модели

gpt-4.1-mini


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

README

README.md

Jarvis — ИИ-консультант по электротехнике EKT

Проект для HackAlem AI, кейс ТОО «Электрокомплект»: ИИ-ассистент для сайта ekt.kz.

Демо на Vercel: jarvis-ekt.vercel.app

Демо-вход: user1 / password123 — общий тестовый аккаунт, только для вымышленных данных. Чат, каталог и корзина доступны также без входа.

Репозиторий · Пошаговый пользовательский тест · Сверка с ТЗ и положением · Результаты проверок

1. Проблема и назначение

Частным покупателям и корпоративным закупщикам электротехники нужно уточнять характеристики, остатки, возможные замены и условия покупки. Обращение к менеджеру по каждому вопросу удлиняет выбор товара.

Jarvis объединяет консультацию, поиск по каталогу и подготовку корзины в одном интерфейсе. Пользователь описывает задачу, указывает артикул или прикрепляет спецификацию/фото, проверяет найденные позиции и подтверждает добавление. Цель — сократить время подбора и количество повторяющихся консультаций; экономический эффект текущего прототипа пилотом не измерен.

2. Что реализовано

  • Каталог EKT: поиск по наименованию, ID, артикулу и параметрам; карточки с ценой, остатком, складами, характеристиками и ссылкой на источник. Сертификаты показываются, если каталог предоставляет допустимые ссылки.
  • Чат на русском и казахском: контекст переписки в рамках сессии, ответы по товарам и условиям покупки, ограничение бюджета за единицу.
  • Подбор аналогов: сравнение критических характеристик для поддерживаемых категорий, объяснение совпадений и отказ от подтверждения замены при недостаточных или противоречивых данных.
  • Фотографии: предварительное чтение типа и маркировки; фильтрация кандидатов по распознанным признакам. Чтение маркировки требует проверки пользователем.
  • Спецификации: извлечение текста из файлов, разбор до 12 позиций за запрос, отображение точных артикулов, кандидатов и ненайденных строк. Пользователь выбирает позиции и редактирует количество.
  • Сравнение: таблица до четырёх выбранных товаров с фильтром отличий, ценами, остатками и временем получения данных.
  • Корзина прототипа: добавление, изменение количества и удаление только после отдельного подтверждения. Перед добавлением/изменением проверяются актуальные цена, остаток и кратность.
  • Результат подбора: прямая ссылка /cart и скачивание TXT со списком товаров для передачи менеджеру.
  • Аккаунт и история: регистрация с email и паролем, подтверждение почты шестизначным кодом, последующий вход по паролю; восстановление пароля через почту. При создании нового или открытии прежнего диалога текущая переписка автоматически сохраняется в аккаунте. Продолжение сохранённого диалога сохраняется автоматически; доступны ручное сохранение и удаление. Сервер проверяет подтверждение почты и владельца записи.
  • Сопутствующие товары: фактические карточки из каталога с объяснением рекомендации; электрическая совместимость автоматически не обещается.
  • Связь с менеджером: выбор отдела EKT по городу, редактируемый запрос, копирование/скачивание, открытие письма или звонка. Письмо отправляет сам пользователь.
  • Обработка ошибок: повторная отправка с сохранением вложений, обновление просроченного предложения, предупреждения об ограничениях документов и отказ от распознавания пустых изображений.
  • Интерфейс: десктопная и мобильная компоновка, переключение RU/KK, матовая панель чата, каталог с фотографиями.

3. Как работает решение

  1. Покупатель открывает ассистента и вводит запрос, например артикул, либо прикрепляет файл или фото.
  2. Сервер проверяет входные данные. Для документов извлекается текст, для изображений используется мультимодальный запрос к OpenAI.
  3. Точные артикулы, однозначные уточнения и таблицы с явными колонками «Артикул;Количество» обрабатываются правилами без обращения к AI. Для свободного подбора и остальных вложений AI формирует структурированный план поиска. Сервер находит карточки в индексе EKT, получает доступные подробные данные и формирует результат с источниками. Аналоги проверяются отдельными правилами сравнения характеристик.
  4. Пользователь изучает карточки, сравнивает товары или проверяет строки спецификации и указывает количество.
  5. Сервер подготавливает предложение. На этом этапе корзина не меняется.
  6. После нажатия «Подтвердить» сервер проверяет предложение, сессию, цену, количество и остаток, затем сохраняет изменение.
  7. Покупатель открывает текущую корзину или скачивает подборку. Оформление заказа в действующем магазине в эту версию не входит.

4. Технологии

Версии основных пакетов ниже взяты из package-lock.json; полное дерево зависимостей воспроизводится через npm ci.

ОбластьИспользуется
ЯзыкиTypeScript, JavaScript, CSS
Приложение и серверные маршрутыNext.js 16.3.6, App Router, Node.js runtime
ИнтерфейсReact 19.3.0, Lucide React
Типизация и валидацияTypeScript 5.9.3, Zod
AIOpenAI SDK 6.49.0; модель по умолчанию gpt-4.1-mini, настраивается через OPENAI_MODEL
Документы и изображенияpdf-parse 2.4.5, Mammoth для DOCX, ExcelJS для XLSX, Sharp для проверки изображений
Аккаунты и историяNeon Auth (@neondatabase/auth 0.5.0-beta), собственные формы регистрации/входа, Neon Postgres и @neondatabase/serverless 1.1.0
АнимацииGSAP, Lenis, OGL, Motion; адаптированные компоненты описаны в UI-SOURCES.md
Защита корзиныnode:crypto, HMAC-SHA256, подписанные cookies и предложения
Проверкиnode:test через tsx, Playwright 1.63.0, HTTP-сценарии на Node.js
ИнтеграцииAPI каталога EKT, официальная страница условий покупки, OpenAI API
ПубликацияVercel; исходный код — GitHub

Диалоги авторизованных пользователей хранятся в Neon Postgres. Поисковый индекс и подробная выборка каталога находятся в JSON-файлах репозитория; кратковременный кэш карточек — в памяти процесса.

5. Архитектура

Браузер: React UI / чат / каталог / сравнение / корзина
  │
  ├─ /api/upload ─────────── проверка вложений → текст или изображение
  │
  ├─ /api/auth/* ─────────── Neon Auth → проверенная сессия
  ├─ /api/history/* ──────── проверка владельца → Neon Postgres
  ├─ /api/chat ───────────── точный запрос / план OpenAI → каталог → ответ
  │                                    │
  ├─ /api/products ─────────────────────┤
  │                                    └─ индекс JSON / снимок / API EKT
  │
  ├─ /api/cart/propose ───── проверка позиций → подписанное предложение
  │                                      (без изменения корзины)
  └─ /api/cart/confirm ───── подтверждение + повторная проверка → cookie
Файлы и каталогиНазначение
src/components/JarvisApp.tsxОсновной интерфейс, диалог и взаимодействие с API
src/components/SpecificationReview.tsx, Comparison.tsxПроверка спецификации и таблица сравнения
src/app/api/Серверные маршруты каталога, чата, вложений и корзины
src/lib/assistant.tsПланирование AI-запроса, получение данных и формирование ответа
src/lib/catalog.ts, evidence.tsПоиск, адаптер EKT, правила аналогов и фильтрация визуальных кандидатов
src/lib/cart.ts, cart-http.tsПодпись, валидация и применение изменений корзины
src/lib/auth-server.ts, history-store.ts, history-types.tsАвторизация, SQL-хранилище и схема истории
src/components/account/, ManagerHandoff.tsxАккаунт, восстановление переписки и обращение к менеджеру
src/lib/related.ts, attachment-parser.tsСопутствующие товары и проверка вложений
src/lib/policies.ts, i18n.tsУсловия покупки и локализация
src/lib/cart-brief.tsФормирование TXT-подборки
data/, scripts/Снимки каталога и скрипты их обновления
tests/, docs/Проверки, отчёты и сценарии демонстрации

Модель не имеет инструмента изменения корзины. Предложение связано с сессией, ревизией корзины и одноразовым идентификатором, действует 10 минут. Сервер отклоняет неподтверждённые, просроченные и повторно использованные предложения. Cookies имеют HttpOnly, SameSite, а в production — Secure; проверяется источник запросов на изменение корзины.

Корзина хранится в подписанном cookie на 7 дней и переживает обновление страницы при сохранении cookie и серверного CART_SECRET. Гостевая история хранится в sessionStorage вкладки, язык — в localStorage. У вошедшего пользователя текущий диалог сохраняется в Neon перед переходом к новому или прежнему; пустые диалоги не архивируются. Если сохранение не удалось, переключение отменяется и переписка остаётся открытой. Вход сам по себе не загружает гостевую переписку в аккаунт. Каждый маршрут истории проверяет серверную сессию и владельца записи; ревизия предотвращает перезапись изменений из другой вкладки. Корзина остаётся отдельной браузерной сессией и не переносится между устройствами через аккаунт.

6. Установка и запуск

Требования

  • Node.js 24.x и npm — проект проверен на Node.js 24.16.0.
  • Git для получения репозитория.
  • Интернет для установки зависимостей и обращений к внешним API.
  • Для полного локального сценария: серверный ключ OpenAI и тестовые реквизиты API EKT, предоставляемые партнёром. Они не включены в репозиторий.

Жюри может проверить настроенную публичную версию без собственного ключа OpenAI и без входа в личные аккаунты участников.

Шаг 1. Получить проект и установить зависимости

git clone https://github.com/BAITC-Hacks/hack-05846c56-jarvis.git
cd hack-05846c56-jarvis
npm ci

Шаг 2. Настроить окружение

На свежем клоне создайте .env.local из шаблона:

node -e "require('node:fs').copyFileSync('.env.example', '.env.local', require('node:fs').constants.COPYFILE_EXCL)"

Команда не перезаписывает существующий .env.local. Если файл уже есть, отредактируйте его.

ПеременнаяЧто указать
EKT_API_URLhttps://ekt.kz/api
EKT_API_USERNAMEЛогин тестового API EKT
EKT_API_PASSWORDПароль тестового API EKT
OPENAI_API_KEYСерверный API-ключ OpenAI
OPENAI_MODELgpt-4.1-mini по умолчанию; для фото необходима модель с поддержкой изображений и структурированного ответа
CART_SECRETСлучайная строка длиной не менее 32 символов
DATABASE_URLПодключение к Neon Postgres для истории; только на сервере
NEON_AUTH_BASE_URLURL сервиса Neon Auth для своего проекта
NEON_AUTH_COOKIE_SECRETОтдельная случайная строка не менее 32 символов для cookies авторизации
NEXT_PUBLIC_DEMO_LOGIN_ENABLEDtrue только после создания отдельного демонстрационного аккаунта; по умолчанию выключено

Создать значение CART_SECRET:

node -e "console.log(require('node:crypto').randomBytes(32).toString('hex'))"

Скопируйте результат в .env.local. Не публикуйте реальные значения переменных: .env.local исключён из Git. Используйте один постоянный CART_SECRET для сохранения действительности корзин в выбранной среде.

Для аккаунтов создайте проект Neon с включённым Neon Auth и укажите его DATABASE_URL и NEON_AUTH_BASE_URL. При подключении через Vercel Marketplace эти значения добавляет интеграция. NEON_AUTH_COOKIE_SECRET сгенерируйте отдельно. Таблица jarvis_conversations и индекс создаются при первом обращении авторизованного пользователя; роль БД должна иметь право CREATE TABLE. Не используйте ключи от чужого проекта.

В Neon → Settings → Auth включите Sign-up with Email, Verify at Sign-up с методом Verification code и Sign-in with Email. Подтверждение должно отправляться при регистрации. Добавьте адрес приложения в Domains; для разработки разрешите localhost. Интерфейс после проверки кода возвращает пользователя ко входу по паролю. Для аккаунта, который раньше использовал только одноразовый код, предусмотрен пункт «Установить / восстановить пароль».

Для отдельного демостенда scripts/seed-demo-account.ts создаёт только общий тестовый аккаунт [email protected] с опубликованным паролем password123 и ролью user. Скрипт рассчитан на текущую схему Neon Auth, требует права записи в неё и не перезаписывает существующие аккаунты. Запуск: node --env-file=.env.local --conditions=react-server --import tsx scripts/seed-demo-account.ts. После проверки входа включите NEXT_PUBLIC_DEMO_LOGIN_ENABLED=true и пересоберите приложение — это покажет псевдоним user1 и кнопку заполнения демоданных.

Шаг 3. Запустить разработку

npm run dev

Откройте http://localhost:3000. Сервер остаётся работающим в этом терминале. Диагностический маршрут: http://localhost:3000/api/health — показывает наличие настроек, но не заменяет проверку доступности внешних API.

Шаг 4. Собрать production-версию локально

Остановите dev-сервер перед запуском production-сервера на том же порту:

npm run build
npm start

Адрес по умолчанию — http://localhost:3000.

Если нет внешних ключей

Без OpenAI остаётся режим ответов по каталогу и правилам; AI-разбор файлов и фото недоступен. Без реквизитов EKT можно изучать сохранённую подробную выборку, но добавление и изменение количества в корзине требуют свежих данных и блокируются. Без CART_SECRET маршруты корзины не работают. Без настроек Neon недоступны вход и общая история, остальные функции работают независимо. Полный сквозной сценарий без этих настроек проверяйте на публичном демо.

7. Как проверить решение жюри

Откройте демо в отдельном приватном окне. Цены и остатки меняются, поэтому сверяйте показанные значения с источником и временем проверки, а не с заранее заданной суммой.

Быстрый вход для жюри: вход, логин user1, пароль [скрыто]. Это отдельный общий аккаунт только для тестовых данных; его история доступна всем, кто знает опубликованные реквизиты. Для личной истории зарегистрируйтесь своей почтой и подтвердите код.

ШагДействиеЧто проверить
1. Данные товараНапишите «Покажи характеристики и сертификаты 515291»Карточка Legrand, цена, остаток и характеристики. В сохранённых данных есть конфликт 160/250 А — ассистент должен его отмечать. Отсутствующая ссылка на сертификат не выдумывается.
2. Аналог«Подбери аналог отсутствующего товара 18412»В проверенной выборке исходный остаток нулевой; доступны кандидаты с объяснением совпадений критических параметров. Их текущее наличие зависит от EKT.
3. Условия«Какие условия оплаты, доставки и минимальной партии?»Содержательный ответ с официальным источником; кратность относится к конкретному товару.
4. ОтменаВыберите доступный товар с минимальной партией 1 → «В корзину» → количество 1 → «Проверим ваш выбор» → «Отмена»Корзина не изменилась.
5. ПодтверждениеПовторите выбор, нажмите «Подтвердить», перейдите в корзину и обновите страницуНужное количество сохранено; ссылка /cart открывает текущее состояние той же сессии.
6. СпецификацияСохраните пример TXT, прикрепите его к чату и попросите разобрать по строкамДва точных артикула и одна ненайденная позиция. Выбор строк и изменение количества доступны до общего подтверждения.
7. СравнениеОтметьте две карточки значком сравнения → «Сравнить товары» → «Только отличия»Таблица исходных характеристик; неизвестные значения обозначены «—».
8. РезультатВ корзине нажмите «Скачать подборку»TXT содержит реальные позиции корзины, количества, суммы, ссылки и замечания.
9. МенеджерНажмите «Связаться с менеджером», выберите город, отредактируйте запросПравильные телефон/почта отдела, скачивание текста. «Открыть письмо» запускает почтовое приложение; автоматической отправки нет.
10. ИсторияВойдите, задайте вопрос A → «Новый диалог» → вопрос B → откройте A из истории → вернитесь к BОба диалога сохранены автоматически, текст и карточки восстановлены. Перезагрузка сохраняет выбранный диалог; удаление требует подтверждения.
11. Язык и устройствоПереключите «Қаз», спросите «Алматыға жеткізу шарттары қандай?», откройте сайт на телефонеКазахский ответ, читаемые символы и доступные основные действия.

Для фото прикрепите хорошо читаемую маркировку товара и попросите найти его. Проверьте, что ответ отделяет предварительное чтение от кандидатов и не объявляет электрическую совместимость по внешнему сходству.

Дополнительные отрицательные сценарии: нулевое/отрицательное количество, превышение остатка, неизвестный артикул, файл больше 3 МБ. Подробный маршрут — USER-TEST.md.

Автоматические проверки

Без запущенного сервера и внешних ключей:

npm test
npm run build
npm run typecheck

Сборка также создаёт служебные типы Next.js, используемые проверкой TypeScript на свежем клоне.

На уже запущенном, настроенном сервере — из второго терминала:

node tests/integration.mjs --chat
npx playwright install chromium
npm run test:browser

Браузерные тесты используют отдельные сессии и тестовые корзины. Скриншоты сохраняются в test-results/, исключённый из Git. Для установленного Chrome можно задать PLAYWRIGHT_CHANNEL=chrome.

Чтобы проверить публичную версию вместо localhost, задайте TEST_BASE_URL. Например, в PowerShell:

$env:TEST_BASE_URL = 'https://jarvis-ekt.vercel.app'
node tests/integration.mjs --chat
npm run test:browser

В Bash переменная задаётся перед командой:

TEST_BASE_URL=https://jarvis-ekt.vercel.app npm run test:browser

Результаты конкретных прогонов записаны в RELEASE-CHECK.md. Браузерные проверки разделяют реальные запросы к каталогу и сценарии с подменой ответов для воспроизведения сбоев. Завершение входа через личную почту проверяется пользователем; автоматические проверки не отправляют письма.

Отдельная проверка реального SQL-хранилища (требует настроенной базы, создаёт и удаляет одну синтетическую запись):

node --env-file=.env.local --conditions=react-server --import tsx scripts/history-check.ts

8. Данные и интеграции

Каталог EKT

Используются партнёрские маршруты с серверной Basic-аутентификацией:

  • GET https://ekt.kz/api/products?page=N — страницы каталога.
  • GET https://ekt.kz/api/products/detail?id=ID — подробная карточка и остатки.

В репозитории сохранены реальные данные EKT от 23.09.2026:

ФайлСодержимое
data/catalog-index.jsonПоисковый индекс 15 035 товаров; не является набором актуальных остатков всех товаров
data/catalog-snapshot.json608 подробных карточек с характеристиками и временем получения

Карточки различают live и snapshot, содержат fetchedAt. Сохранённые данные используются для поиска и просмотра; изменение корзины требует актуальной проверки API. Неизвестная цена не заменяется нулём. Сертификаты не генерируются.

Обновление данных — отдельная необязательная операция при наличии настроенного .env.local; команды перезаписывают соответствующие JSON-файлы:

node scripts/catalog-sync.mjs
node scripts/catalog-index.mjs

Условия покупки и AI

Условия оплаты и доставки записаны в src/lib/policies.ts по официальной странице доставки и оплаты EKT. Это сохранённая информация со ссылкой, а не автоматическое обновление страницы при каждом вопросе.

OpenAI получает текст запросов, выбранный контекст и данные вложений для AI-обработки. Цены и остатки берутся из каталога; модель не имеет прямого доступа к изменению корзины. Названия и исходные характеристики товаров могут сохраняться на языке источника при переключении интерфейса.

Обработка вложений и история

Файлы читаются в памяти сервера и не записываются приложением в постоянное файловое хранилище. Текст/изображения передаются OpenAI при AI-запросе. В браузере сохраняется история текущей вкладки; в аккаунте — диалоги, сохранённые вручную или при переключении, с последующим автосохранением продолжения. В БД записываются текст, имена файлов и ID товаров, но не содержимое файлов и не полные карточки. Старые цены в сообщениях не являются актуальной офертой; карточки при восстановлении загружаются заново. Диалог можно удалить из аккаунта. У гостя «Новый диалог» запрашивает подтверждение очистки; у вошедшего пользователя сначала сохраняет переписку.

Распознаваемые платёжные реквизиты маскируются в тексте до отправки модели и сохранения: номера карт с проверкой Luhn в поддерживаемом формате, явно подписанные CVV/CVC/PIN и казахстанские IBAN. Это ограниченная текстовая защита, не полноценная DLP: изображения, исходные байты файлов и все возможные персональные сведения она не анализирует. Не загружайте платёжные реквизиты и лишние личные данные; в общем демоаккаунте используйте только вымышленные запросы.

9. Ограничения текущей версии

  • Это самостоятельный прототип. Он не встроен в действующий ekt.kz. API корзины и сессии магазина не подключён; совместимость с ними не проверена. Заказ, оплата и резервирование товаров не выполняются.
  • Корзина привязана к браузеру: /cart не переносит подборку другому человеку или на другое устройство. Для передачи состава есть TXT. Максимум — 35 позиций.
  • История: до 100 диалогов на аккаунт, до 100 последних сообщений и 400 КБ на диалог. Восстанавливаются текст, ссылки и карточки (до 40 уникальных ID); старые предложения на изменение корзины и таблицы разбора спецификаций не восстанавливаются как действующие операции.
  • Менеджер: готовится письмо/файл для ручной отправки, доступны телефоны. CRM, назначение сотрудника и ответ менеджера внутри чата не подключены.
  • Перенос в EKT: кнопка открывает настоящую страницу корзины EKT, но не добавляет туда товары. Разрешённый API импорта/доступ к стороне магазина не предоставлен; подробности — EKT-CART-INTEGRATION.md.
  • Файлы: до 3 вложений суммарно 3 МБ. Поддерживаются XLSX, DOCX, PDF, CSV/TXT в UTF-8, JPG/JPEG, PNG и WEBP. Старые XLS/DOC нужно преобразовать. PDF-сканы без текста следует загрузить изображениями страниц.
  • Объём извлечения ограничен: PDF — первые 20 страниц; XLSX — до 8 листов, 400 строк и 24 ячеек строки; извлечённый текст — до 16 000 символов на файл с явным предупреждением при обрезке. Изображения — до 16 мегапикселей; повреждённые и почти одноцветные пустые кадры отклоняются. Структурированный разбор — до 12 товарных строк за запрос.
  • Распознавание фото приблизительное: мелкие обозначения могут читаться неверно. Совпадение маркировки или характеристик не заменяет проверку электрической совместимости специалистом.
  • Аналоги не гарантированы для каждой позиции. Правила проверяют поддерживаемые характеристики; при отсутствии данных или конфликте безопасная замена может не быть найдена.
  • Каталог зависит от источника: возможны противоречия, пропуски сертификатов и недоступность API. Загрузка всех 15 035 подробных карточек и их остатков в реальном времени не реализована.
  • Контекст: в один запрос передаются до 24 последних сообщений; при больших вложениях старые сообщения исключаются, чтобы уложиться в лимит тела запроса. Последний запрос и вложения сохраняются целиком.
  • Задержка и масштабирование: в записанном публичном прогоне отдельные ответы занимали около 3,6–6,1 секунды, но SLA и нагрузочная устойчивость не подтверждены. Лимит чата — 15 запросов в минуту на IP в пределах процесса; распределённого лимитера нет.
  • Полный аудит безопасности и приватности, пилот с покупателями и измерение экономического эффекта не проводились.

10. Публичная версия и развёртывание

Демо: https://jarvis-ekt.vercel.app

Приложение опубликовано на Vercel напрямую через CLI. Для собственного развёртывания нужно авторизоваться в Vercel, связать свой проект и задать серверные переменные из таблицы окружения для нужной среды. Затем из корня репозитория:

npx vercel deploy --prod --yes

GitHub-интеграция для такого способа не обязательна. Секреты задаются в окружении Vercel, а не в исходном коде. next.config.ts включает файлы PDF-worker и native canvas в серверный пакет обработки вложений.

11. Материалы проекта

Основная функциональность создавалась во время хакатона с помощью OpenAI Codex и AI-агентов. Предоставленные участником HTML/CSS/JS-заготовки сохранены в references/ui и адаптированы к React. Товарные данные и изображения — EKT. Для PP Neue Machina сохранено уведомление в public/fonts/COPYRIGHT.txt; для казахского текста используется Noto Sans с лицензией public/fonts/NotoSans-OFL.txt. Лицензии зависимостей находятся в соответствующих npm-пакетах.

Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
18
Авторы
1
Файлы
149
Ветки
1

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

dan7yar 18

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

  • 2026-09-23 17:28docs: record final production verification and handoffdan7yar
  • 2026-09-23 17:24feat: preserve conversations on switch and finalize demo readinessdan7yar
  • 2026-09-23 17:05feat: add verified password signup and shared demo logindan7yar
  • 2026-09-23 16:34feat: harden assistant flows and add account history and EKT handoffdan7yar
  • 2026-09-23 15:53docs: write complete Russian README for hackathon jurydan7yar
  • 2026-09-23 15:37docs: record production checks and user testing guidedan7yar
  • 2026-09-23 15:35fix: label visual markings as preliminary readingsdan7yar
  • 2026-09-23 15:32feat: review specifications, compare products and improve photo groundingdan7yar
Все коммиты (18)
  • 2026-09-23 15:11docs: publish second hourly report and criteria assessmentdan7yar
  • 2026-09-23 15:08feat: add product wall and EKT signature, fix Kazakh typography and PDF deploymentdan7yar
  • 2026-09-23 14:36style: remove selected copy and apply bold Neue Machina sitewidedan7yar
  • 2026-09-23 14:34style: unify centered navigation and extend interactive background sitewidedan7yar
  • 2026-09-23 14:27style: add BorderGlow action cards and clean navigation pill edgesdan7yar
  • 2026-09-23 14:22style: add compact edge-aligned Jarvis logo and frosted navbardan7yar
  • 2026-09-23 14:18style: move selection button beside navigation language switchdan7yar
  • 2026-09-23 14:16style: unify navigation with languages and transparent sticky headerdan7yar
  • 2026-09-23 14:04feat: deliver working EKT assistant and first hourly progress reportdan7yar
  • 2026-09-23 13:39feat: initialize Jarvis and tested confirmation-based cart coredan7yar
Структура репозитория (149 файлов)
.env.example
.gitignore
.vercelignore
AGENTS.md
CLAUDE.md
README.md
data/catalog-index.json
data/catalog-snapshot.json
docs/EKT-CART-INTEGRATION.md
docs/JUDGE-AUDIT.md
docs/JUDGING.md
docs/PRODUCT-UPGRADE.md
docs/PROGRESS.md
docs/QA.md
docs/RELEASE-CHECK.md
docs/REPORT-01.md
docs/REPORT-02.md
docs/UI-SOURCES.md
docs/USER-TEST.md
next-env.d.ts
next.config.ts
package-lock.json
package.json
public/demo/specification.txt
public/fonts/COPYRIGHT.txt
public/fonts/NotoSans-ExtraBold.ttf
public/fonts/NotoSans-OFL.txt
public/fonts/PPNeueMachina-Light.otf
public/fonts/PPNeueMachina-Regular.otf
public/fonts/PPNeueMachina-Ultrabold.otf
public/icon.svg
references/ui/BorderGlow.txt
references/ui/DriftWall.txt
references/ui/Prompt Bar.html
references/ui/Scroll Reveal.html
references/ui/WarpText.txt
references/ui/get started button.html
references/ui/бегущая строка.html
references/ui/логотип.html
references/ui/навигация.html
references/ui/плавный скролл.js
references/ui/фон.html
scripts/catalog-enrich.ts
scripts/catalog-index.mjs
scripts/catalog-sync.mjs
scripts/history-check.ts
scripts/seed-demo-account.ts
src/app/api/auth/[...path]/route.ts
src/app/api/cart/confirm/route.ts
src/app/api/cart/propose/route.ts
src/app/api/cart/route.ts
src/app/api/chat/route.ts
src/app/api/health/route.ts
src/app/api/history/[id]/route.ts
src/app/api/history/route.ts
src/app/api/products/[id]/analogs/route.ts
src/app/api/products/[id]/related/route.ts
src/app/api/products/[id]/route.ts
src/app/api/products/route.ts
src/app/api/upload/route.ts
src/app/auth/[path]/page.tsx
src/app/cart/page.tsx
src/app/globals.css
src/app/layout.tsx
src/app/page.tsx
src/components/BorderGlow.css
src/components/BorderGlow.tsx
src/components/Comparison.tsx
src/components/DotField.tsx
src/components/DriftWall.css
src/components/DriftWall.tsx
src/components/EktFooter.tsx
src/components/GooeyNav.tsx
src/components/JarvisApp.tsx
src/components/ManagerHandoff.tsx
src/components/Modal.tsx
src/components/ProductCard.tsx
src/components/PromptBar.tsx
src/components/RelatedProducts.tsx
src/components/SpecificationReview.tsx
src/components/SpecularButton.tsx
src/components/WarpText.css
src/components/WarpText.jsx
src/components/account/AccountHistory.tsx
src/components/account/AuthPanel.tsx
src/components/account/AuthScreen.tsx
src/components/account/account.css
src/components/ekt-footer.css
src/components/original/DepthLogo.tsx
src/components/original/OriginalDotField.tsx
src/components/original/ScrollReveal.tsx
src/components/original/ScrollVelocity.tsx
src/components/original/SmoothScroll.tsx
src/components/original/original-motion.css
src/components/product-tools.css
src/components/prototype-controls.css
src/components/prototype-specular.d.ts
src/components/prototype-specular.js
src/components/reactbits/CodeSlots.css
src/components/reactbits/CodeSlots.tsx
src/components/reliability.css
src/lib/assistant-context.ts
src/lib/assistant-deterministic.ts
src/lib/assistant-image.ts
src/lib/assistant-specification.ts
src/lib/assistant.ts
src/lib/attachment-parser.ts
src/lib/auth-client.ts
src/lib/auth-errors.ts
src/lib/auth-policy.ts
src/lib/auth-server.ts
src/lib/cart-brief.ts
src/lib/cart-http.ts
src/lib/cart.ts
src/lib/catalog.ts
src/lib/chat-payload.ts
src/lib/evidence.ts
src/lib/history-http.ts
src/lib/history-store.ts
src/lib/history-types.ts
src/lib/i18n.ts
src/lib/payment-privacy.ts
src/lib/policies.ts
src/lib/related.ts
src/lib/types.ts
tests/assistant-context.test.ts
tests/assistant-image.test.ts
tests/assistant-specification.test.ts
tests/auth-errors.test.ts
tests/auth-policy.test.ts
tests/browser-account.cjs
tests/browser-auth-flow.cjs
tests/browser-code-slots.cjs
tests/browser-demo-account.cjs
tests/browser-history.cjs
tests/browser-product.cjs
tests/browser-reliability.cjs
tests/browser-smoke.cjs
tests/cart.test.ts
tests/catalog.test.ts
tests/chat-payload.test.ts
tests/chat-route.test.ts
tests/evidence.test.ts
tests/history.test.ts
tests/integration.mjs
tests/payment-privacy.test.ts
tests/related.test.ts
tests/upload.test.ts
tsconfig.json

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

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

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