AAYMA
RU
Войти

EKT Assistant

AI-консультант по каталогу ekt.kz. Принимает текст, спецификацию (CSV/XLSX/DOCX/PDF) или фото, сопоставляет позиции с каталогом, объясняет аналоги и…

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

О проекте

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

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

Суть

AI-консультант по каталогу ekt.kz. Принимает текст, спецификацию (CSV/XLSX/DOCX/PDF) или фото, сопоставляет позиции с каталогом, объясняет аналоги и сохраняет корзину только после явного подтверждения. Задеплоен на Vercel с Neon PostgreSQL.

Как устроено

GPT-5.5 (Responses API, reasoning low, vision для сканов) извлекает намерение и строки спецификации. Поиск и сравнение по каталогу (fixture или live API ekt.kz), цены, остатки, сумма и запись корзины выполняются серверным кодом, а не моделью. Предложение живёт 10 минут и привязано к версии; перед подтверждением цена, остаток и идентичность товара перепроверяются. Исходные единицы измерения сохраняются, упаковки не пересчитываются в метры автоматически. Сессии и бюджеты вызовов модели хранятся в Neon, параллельные запросы защищены через SELECT FOR UPDATE.

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

  • vision OCR сканов
  • парсинг CSV/XLSX/DOCX/PDF
  • подбор аналогов по критическим параметрам
  • подтверждение, привязанное к версии предложения
  • ledger бюджета вызовов LLM
  • SELECT FOR UPDATE

Особенности

Жёсткое разделение: LLM только извлекает намерение, а деньги, остатки и корзину контролирует сервер. Есть бюджетный ledger на вызовы модели (acceptance 6 вызовов/$0.25, demo 100/$1) и защита от устаревших и повторных подтверждений. Встраиваемый виджет через iframe. 98 unit/integration и 24 E2E теста, а также аудит-доказательства в docs.

Стек

Next.js · React · TypeScript · OpenAI Responses API · PostgreSQL · Neon · SQLite · Vercel · Playwright

Модели

GPT-5.5


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

README

README.md

EKT Assistant

Из спецификации — в проверяемое предложение и сохранённую корзину.

Ассистент для подбора электротехнических товаров: принимает запрос, документ или фотографию, сопоставляет позиции с каталогом, объясняет кандидатов на замену и сохраняет выбранный состав только после явного подтверждения.

Проект команды BibaMansBaha для HackAlem AI. Next.js · React · TypeScript · OpenAI Responses API · Neon PostgreSQL. Для локального запуска поддерживается SQLite.

Опубликованное демо с проверенным предложением

Открыть работающее демо → ekt-assistant.vercel.app · Корзина · Виджет

Vercel + Neon PostgreSQL + GPT-5.5, reasoning low. На публичном HTTPS проверены настоящий текст и vision, загрузка файлов, подтверждение и сохранение корзины. Демо использует явно помеченный синтетический каталог; это не реальные цены/остатки ekt.kz и не оформление заказа. Полный отчёт и ограничения.

Для демонстрации введите Найди DEMO-CABLE, нужно 2 упаковки или загрузите CSV из примера ниже. Проверьте единицы и предложение перед подтверждением. Фото/сканы отправляются OpenAI; используйте только безопасные демоматериалы.

Как проходит подбор

flowchart LR
    A[Запрос / документ / фото] --> B[Строки и исходные единицы]
    B --> C[Поиск и сравнение каталога]
    C --> D[Выбор аналога / исключение]
    D --> E[Предложение: состав и сумма]
    E --> F{Явное подтверждение}
    F -->|Да| G[Повторная проверка цены и остатка]
    G --> H[Сохранённая корзина]
    F -->|Нет| I[Корзина не изменяется]

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

Запустить за несколько минут

Нужны Node.js 24+, npm и Git. Для браузерных E2E дополнительно требуется установленный Google Chrome.

git clone https://github.com/BAITC-Hacks/hack-53afffc3-bibamansbaha.git
cd hack-53afffc3-bibamansbaha
npm ci

Создать локальную конфигурацию, сохранив существующий файл с доступами:

PowerShell

if (-not (Test-Path .env.local)) { Copy-Item .env.example .env.local }

Linux / macOS

if [ ! -f .env.local ]; then cp .env.example .env.local; fi

Для бесплатного знакомства оставить CATALOG_MODE=fixture, OPENAI_API_KEY= и OPENAI_MODEL=. Если используете существующий .env.local, сначала проверьте эти настройки: там могут быть включены платные вызовы.

npm run dev

Открыть ассистента, корзину или пример виджета.

В этом режиме работают обычный поиск, текстовые спецификации, сравнение и подтверждение корзины. Фото и сканы требуют отдельно подключённой модели; отключённый AI не выдаётся за работающий.

Демо на 2–3 минуты

node scripts/create-demo-files.mjs
  1. Загрузить .tmp/demo-files/fixture-specification.csv.
  2. Для отсутствующего DEMO-C16-OUT выбрать предложенный DEMO-C16-IN; просмотреть совпадения и отличия.
  3. Проверить кабель, количество и единицы. Лишнюю строку можно явно исключить.
  4. Подготовить предложение. До подтверждения корзина не меняется.
  5. Нажать подтверждение, открыть /cart, обновить страницу — состав сохранится.

Дополнительная проба: fixture-unit-review.csv содержит упаковки. Ассистент сохраняет исходную единицу и требует проверки; упаковки не превращаются в метры автоматически. Подробный сценарий демонстрации.

Возможности и ограничения

ВозможностьЧто реализовано
Сведения о товареАртикул, характеристики, цена, остаток, источник и время получения; неизвестные значения не подставляются
АналогиКандидаты с сопоставлением критических параметров и объяснением отличий; проверены на fixture
Условия покупкиОтветы со ссылками на официальные источники; противоречия условий явно обозначаются
ДокументыCSV/TXT, XLSX, DOCX, PDF с текстом; формулы не исполняются
Фото и сканыJPEG/PNG/WebP и PDF-сканы через внешний vision; извлечённое предлагается для проверки
Проверка строкРедактирование, ручной выбор, исключение, сохранение исходных единиц и состояния после reload
ПредложениеСостав, сумма корзины до/после, изменение стоимости и переоценка уже добавленных товаров
ПодтверждениеСвязано с конкретной версией предложения; изменение фактов требует нового просмотра
КорзинаСерверное хранение, дробные количества, явное сохранение правок, защита от повторного добавления
ИнтерфейсDesktop/mobile и same-origin iframe; интеграция с CMS магазина не подтверждена

Лимиты файлов: 4 МБ, до 100 позиций, до 20 страниц PDF; не более 3 страниц скана для vision. Старые .xls/.doc нужно пересохранить. Архивные бомбы, макросы и XML entities отклоняются. Асинхронная обработка ограничена 45 секундами; синхронный Office-парсинг не вынесен в отдельный worker.

Серверные правила корзины: предложение действует 10 минут; перед confirm перепроверяются цена, остаток и техническая идентичность. Неизвестные обязательные данные блокируют добавление. Чужая сессия, устаревшая версия или повторный запрос не могут изменить корзину неправомерно. Реальные заказы и оплаты отсутствуют.

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

Все секреты задаются только серверному процессу через .env.local или защищённое окружение. Не используйте NEXT_PUBLIC_ для ключей. После изменения env перезапустите приложение.

ПеременнаяНазначение
CATALOG_MODEfixture для синтетического демо; live для разрешённого API ekt.kz
EKT_API_BASE_URLБазовый адрес каталога; пример — https://ekt.kz
EKT_API_USERNAME, EKT_API_PASSWORDСерверные реквизиты live-каталога
CATALOG_MAX_PAGESПо умолчанию 2 страницы / 40 товаров: поиск по частичному каталогу
CATALOG_OPERATION_TIMEOUT_MSОбщий бюджет отдельной операции каталога; пример 6000 мс
OPENAI_API_KEY, OPENAI_MODELСерверный ключ и модель; без них используется обычный поиск
DATABASE_URLPostgreSQL connection string с TLS; обязателен на Vercel, хранится только в secrets
DATABASE_PATHSQLite с сессиями, предложениями и корзинами; локально .data/ekt.sqlite
APP_ORIGINТочный origin браузера, включая схему и порт
MODEL_BUDGET_MODEdemo для опубликованного приложения; acceptance для одноразовой приёмки
MODEL_BUDGET_PATHАбсолютный путь постоянного ledger одноразовой проверки AI; каталог должен существовать
MODEL_BUDGET_MAX_CALLS, MODEL_BUDGET_MAX_USDТекущая acceptance-защита: максимум 6 вызовов / $0.25; можно уменьшить
DEMO_BUDGET_PATHОтдельный локальный ledger demo; на Vercel вместо файла используется Neon
DEMO_BUDGET_MAX_CALLS, DEMO_BUDGET_MAX_USDНезависимый demo-лимит: максимум 100 вызовов / $1; можно уменьшить

fixture, live и prototype обозначаются раздельно. Автоматической подмены недоступного live-каталога синтетическими данными нет. snapshot отклоняется, пока не подключён проверенный снимок.

Для GPT-5.5 используется Responses API с reasoning.effort=low. Бюджет резервируется до вызова по верхней границе входа и выхода; reasoning уже включён в output tokens. Acceptance (MODEL_BUDGET_MODE=acceptance) ограничен 6 вызовами/$0.25, demo (demo) — отдельными 100 вызовами/$1 без автоматического сброса. На Vercel оба журнала находятся в Neon; без DATABASE_URL файлового fallback нет. Локально используются отдельные абсолютные MODEL_BUDGET_PATH/DEMO_BUDGET_PATH. Не удаляйте журналы для возобновления лимитов.

Vercel хранит OPENAI_API_KEY, DATABASE_URL, EKT_API_USERNAME и EKT_API_PASSWORD в server-side Environment Variables. Ключей нет в README, Git или NEXT_PUBLIC_*. Миграция чистой базы: npm run db:migrate при заданном DATABASE_URL. Она не импортирует локальные пользовательские данные.

Проверки

npm run typecheck
npm run lint
npm test
npm run build
npm run test:e2e

После миграции прошли 98 локальных unit/integration, 24 browser E2E, отдельный regression на настоящей Neon, typecheck, lint и production build. На публичном URL отдельно проверены файлы, контекст, настоящий vision, корзина, две сессии и мобильный интерфейс. Локальный E2E запускает dev-server на порту 3001 с отключённой моделью; результаты опубликованной версии приведены отдельно в отчёте.

Текстовые и vision-ответы в большинстве тестов подменены на уровне провайдера. Платные smoke-проверки выполняются отдельно, в согласованном бюджете; они не входят в обычный запуск тестов. Подробная матрица и блокеры.

Production и хранение

npm ci
npm run build
npm start

npm start запускает next start --hostname 127.0.0.1. Нужны HTTPS reverse proxy в подходящем сетевом пространстве и точный APP_ORIGIN. Production-cookie имеет флаг Secure; обычный локальный HTTP не доказывает рабочую production-сессию.

На Vercel зависимости и сборка создаются заново: Windows node_modules и .next не переносятся. Постоянное состояние находится в PostgreSQL Neon. Сессия сохраняет корзину, позиции, сообщения, предложения и квитанции подтверждения одним aggregate; SELECT FOR UPDATE защищает параллельные invocations. Существующий CartService работает с изолированной SQLite :memory: в пределах одного запроса; эта рабочая копия не является постоянным хранилищем. Файловая SQLite остаётся только локальным адаптером.

Публичный URL, версия, проверка повторного deployment, реальные ответы модели и оставшиеся ограничения фиксируются в отчёте Vercel. Загружаются небольшие файлы до 4 МБ; raw uploads обрабатываются в памяти. Бизнес-состояние и бюджеты не зависят от файловой системы и срока жизни Vercel Function.

Архитектура

ПутьОтветственность
src/server/catalog.tsRead-only API, нормализация, ограниченный поиск, консервативное сравнение кандидатов
src/server/attachments.tsВалидация файлов, извлечение строк и исходных единиц
src/server/model.tsOpenAI Responses и structured outputs; без полномочий изменять корзину
src/server/model-budget.tsПостоянный учёт попыток, резервирование стоимости и usage без содержимого запросов
src/server/cart.tsSQLite, владение сессией, preview, fresh-проверка, транзакция и идемпотентность
src/app/api/[action]/route.ts, src/server/http.tsКонтракты HTTP, CSRF/origin и ограничения запросов
src/componentsЧат, спецификация, карточки, подтверждение, корзина и виджет

Приватность и честные границы

Исходные загрузки обрабатываются в памяти. Диалог, извлечённые строки, предложения и корзина сохраняются в SQLite. Сессия действует 24 часа; очистка истёкших записей выполняется при создании следующей сессии.

Не загружайте платёжные и личные документы. Распознаваемые платёжные реквизиты блокируются до записи и текстового вызова модели; старые сообщения маскируются при чтении. Это не универсальная DLP: изображение может уйти внешнему AI до распознавания его содержимого. Очистка прежних WAL, backup и provider-журналов не заявляется.

Для live-интеграции остаются неподтверждённые единицы, семантика кратности, сертификаты и часть технических характеристик. Неизвестные данные не угадываются. Нативный API корзины ekt.kz не предоставлен; prototype не является заказом или резервированием склада.

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

При разработке используются явное добавление файлов, git diff --cached --check и node scripts/check-secrets.mjs. После push SHA сверяется с git ls-remote origin refs/heads/main. Секреты, приватные документы, SQLite и загрузки не публикуются; история Git не переписывается.

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

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

seoshiro 26MOYISEY 1

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

  • 2026-09-23 17:47docs: publish verified Vercel demo and persistence acceptanceseoshiro
  • 2026-09-23 17:43docs: publish Vercel demo and real GPT-5.5 acceptance evidenceseoshiro
  • 2026-09-23 17:38fix: isolate database capacity and include PDF worker in deploymentseoshiro
  • 2026-09-23 17:34feat: persist serverless sessions and model budgets in Neonseoshiro
  • 2026-09-23 17:30docs: record authorized Vercel and Neon deployment transitionseoshiro
  • 2026-09-23 17:17docs: record post-reboot WSL diagnosisseoshiro
  • 2026-09-23 17:08docs: improve project guide and preserve WSL reboot handoffseoshiro
  • 2026-09-23 17:04docs: start authorized production continuation and GPT-5.5 migrationseoshiro
Все коммиты (27)
  • 2026-09-23 16:47docs: finalize deployment acceptance with verified external blockersseoshiro
  • 2026-09-23 16:39feat: bound deployment AI smoke with persistent shared allowanceseoshiro
  • 2026-09-23 16:35docs: record verified Brev access and missing deployment targetseoshiro
  • 2026-09-23 16:21docs: start bounded deployment acceptance on existing Brev targetseoshiro
  • 2026-09-23 16:08Document complete EKT repair results and remaining external blockersseoshiro
  • 2026-09-23 16:02Complete reviewed EKT repairs and regression acceptanceseoshiro
  • 2026-09-23 15:51Bound catalog operations and reconcile uncertain confirmation responsesseoshiro
  • 2026-09-23 15:38fix: preserve source units and repair file, cart and mobile flowsseoshiro
  • 2026-09-23 15:23fix: guard payment text and confirm complete cart financial effectsseoshiro
  • 2026-09-23 15:11docs: start scoped EKT remediation and regression planseoshiro
  • 2026-09-23 14:53docs: publish final read-only EKT audit and evidenceseoshiro
  • 2026-09-23 14:38docs: record read-only final audit scope and reproduced findingsseoshiro
  • 2026-09-23 14:25fix: preserve reviewed units on refresh and finalize verified handoffseoshiro
  • 2026-09-23 14:21Merge remote-tracking branch 'origin/main'seoshiro
  • 2026-09-23 14:20fix: require source unit review and document verified EKT workflowsseoshiro
  • 2026-09-23 14:13test: cover cart confirmation invariants and document team handoffMOYISEY
  • 2026-09-23 14:06feat: ship verified chat file matching and confirmation flowseoshiro
  • 2026-09-23 13:51feat: verify catalog contract and transactional confirmation cartseoshiro
  • 2026-09-23 13:37chore: establish safe EKT development checkpointseoshiro
Структура репозитория (122 файлов)
.21st/DESIGN.md
.21st/design.json
.env.example
.gitignore
.vercelignore
AGENTS.md
CODEX_EKT_FINAL_AUDIT.md
CODEX_EKT_REMEDIATION_PROMPT.md
CONTEXT.md
HACKATHON_STATE.md
README.md
docs/DEPLOYMENT_ACCEPTANCE.md
docs/FINAL_AUDIT.md
docs/PRODUCTION_DEPLOYMENT_REPORT.md
docs/REPAIR_REPORT.md
docs/VERCEL_DEPLOYMENT_REPORT.md
docs/acceptance.md
docs/api-contract.md
docs/audit-evidence/composer-focus-3-360.png
docs/audit-evidence/embed360.png
docs/audit-evidence/files-probe-results.json
docs/audit-evidence/files-probe.ts.txt
docs/audit-evidence/http-browser-extra.json
docs/audit-evidence/live-catalog.json
docs/audit-evidence/model-files-results.json
docs/audit-evidence/pdf-result.json
docs/audit-evidence/privacy-result.json
docs/audit-evidence/secrets-results.json
docs/audit-evidence/server-diagnostics.mts.txt
docs/audit-evidence/server-results.json
docs/audit-evidence/stale-proposal390.png
docs/audit-evidence/text-unit-result.json
docs/audit-evidence/ui-1280.png
docs/audit-evidence/ui-1440.png
docs/audit-evidence/ui-360.png
docs/audit-evidence/ui-390.png
docs/audit-evidence/ui-additional-results.json
docs/audit-evidence/ui-focus-extra-results.json
docs/audit-evidence/ui-results.json
docs/audit-progress.md
docs/coordination.md
docs/demo.md
docs/design.md
docs/progress.md
docs/purchase-terms.md
docs/repair-evidence/catalog-live.json
docs/repair-evidence/composer-360-resized.png
docs/repair-evidence/model-live.json
docs/repair-evidence/ui-1280.png
docs/repair-evidence/ui-1440.png
docs/repair-evidence/ui-360.png
docs/repair-evidence/ui-390.png
docs/repair-evidence/verification.json
docs/repair-evidence/widget-1440.png
docs/skills-usage.md
docs/vercel-evidence/production-1280.png
docs/vercel-evidence/production-1440.png
docs/vercel-evidence/production-360.png
docs/vercel-evidence/production-390.png
docs/vercel-evidence/real-gpt55-vision.png
docs/vercel-evidence/vision-confirmed-cart.png
eslint.config.mjs
migrations/001_neon.sql
next.config.ts
package-lock.json
package.json
playwright.config.ts
scripts/check-secrets.mjs
scripts/clean-payment-messages.ts
scripts/create-demo-files.mjs
scripts/migrate.ts
scripts/push-reminder.mjs
scripts/smoke-live.ts
src/app/api/[action]/route.ts
src/app/cart/page.tsx
src/app/embed/page.tsx
src/app/globals.css
src/app/layout.tsx
src/app/page.tsx
src/components/assistant.tsx
src/components/cart-page.tsx
src/components/embed-demo.tsx
src/components/embed-events.tsx
src/components/ui.tsx
src/components/use-app-state.ts
src/server/attachments.ts
src/server/cart.ts
src/server/catalog.ts
src/server/errors.ts
src/server/http.ts
src/server/model-budget-pg.ts
src/server/model-budget.ts
src/server/model.ts
src/server/money.ts
src/server/postgres.ts
src/server/privacy-maintenance.ts
src/server/privacy.ts
src/server/purchase-terms.ts
src/server/requested-lines.ts
src/server/runtime.ts
src/shared/types.ts
src/shared/units.ts
tests/attachments-repair.test.ts
tests/attachments.test.ts
tests/cart-invariants.test.ts
tests/cart-repair.test.ts
tests/cart-source-repair.test.ts
tests/cart.test.ts
tests/catalog-repair.test.ts
tests/catalog.test.ts
tests/e2e/golden-path.spec.ts
tests/e2e/remediation.spec.ts
tests/e2e/widget-repair.spec.ts
tests/http-repair.test.ts
tests/model-budget-integration.test.ts
tests/model-budget.test.ts
tests/model-units.test.ts
tests/postgres.test.ts
tests/privacy.test.ts
tests/requested-lines.test.ts
tsconfig.json
vercel.json

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

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

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