О проекте
Команда: 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.mdEKT 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
- Загрузить
.tmp/demo-files/fixture-specification.csv. - Для отсутствующего
DEMO-C16-OUTвыбрать предложенныйDEMO-C16-IN; просмотреть совпадения и отличия. - Проверить кабель, количество и единицы. Лишнюю строку можно явно исключить.
- Подготовить предложение. До подтверждения корзина не меняется.
- Нажать подтверждение, открыть
/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_MODE | fixture для синтетического демо; 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_URL | PostgreSQL connection string с TLS; обязателен на Vercel, хранится только в secrets |
DATABASE_PATH | SQLite с сессиями, предложениями и корзинами; локально .data/ekt.sqlite |
APP_ORIGIN | Точный origin браузера, включая схему и порт |
MODEL_BUDGET_MODE | demo для опубликованного приложения; 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.ts | Read-only API, нормализация, ограниченный поиск, консервативное сравнение кандидатов |
src/server/attachments.ts | Валидация файлов, извлечение строк и исходных единиц |
src/server/model.ts | OpenAI Responses и structured outputs; без полномочий изменять корзину |
src/server/model-budget.ts | Постоянный учёт попыток, резервирование стоимости и usage без содержимого запросов |
src/server/cart.ts | SQLite, владение сессией, 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 не является заказом или резервированием склада.
Документация
- Production-развёртывание и текущая точка продолжения
- Приёмка: результаты, среда и непроведённые проверки
- Отчёт исправлений · исходный аудит
- Демо-сценарий · API и вопросы к партнёру
- Источники условий покупки · реестр skills/MCP
При разработке используются явное добавление файлов, git diff --cached --check и node scripts/check-secrets.mjs. После push SHA сверяется с git ls-remote origin refs/heads/main. Секреты, приватные документы, SQLite и загрузки не публикуются; история Git не переписывается.
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.