AAYMA
RU
Войти

Firebird · VibeOps

AI-помощник подбора event-подрядчиков. Собирает требования в диалоге, строго фильтрует каталог vendors.csv, выдаёт до трёх карточек с проверенными…

Рабочий MVP
Команда «VibeOps» 4💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: VibeOps
Кейс HackAlem.ai: Креативные индустрии — Firebird
Стадия: Рабочий MVP

Задача кейса: «#79-lite»: подобрать до 3 подрядчиков для мероприятия и объяснить выбор

Суть

AI-помощник подбора event-подрядчиков. Собирает требования в диалоге, строго фильтрует каталог vendors.csv, выдаёт до трёх карточек с проверенными цитатами и предлагает альтернативную дату или бюджет.

Как устроено

OpenAI через Responses API извлекает условия из диалога. Сервер нормализует дату по Asia/Almaty и валюту (USD/EUR/RUB→KZT по курсу НБК), пользователь подтверждает условия. Express-backend применяет строгие фильтры (бюджет, дата, язык, категория) и ранжирует лексической эвристикой: совпадения маркеров формата, затем цена, затем ID. LLM выбирает цитаты из описаний, сервер проверяет их и собирает текст объяснений. Отдельный вызов сопоставляет качественные пожелания с тремя выбранными профилями. Альтернативы меняют одно условие: ±7 дней или минимальный бюджет, который добавляет кандидатов.

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

  • structured output (Responses API)
  • проверка цитат (evidence grounding)
  • лексическое ранжирование
  • конвертация валют по RSS НБК
  • поиск альтернатив по дате/бюджету
  • fallback без AI

Особенности

Поддержка естественного ввода с относительными датами («послезавтра») и иностранной валютой с пересчётом по официальному курсу НБК и датированным снимком на случай сбоя. Сервер показывает пользователю распарсенные условия, и поиск идёт только после их подтверждения. Приёмочные сценарии D1–D6 работают через настоящий HTTP.

Стек

Node.js · Express · TypeScript · React · Vite · Vitest

Модели

OpenAI gpt-6-sol · OpenAI gpt-4.1-mini


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

README

README.md

Firebird · VibeOps

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

  • AI-диалог для сбора требований
  • поиск подрядчиков по каталогу
  • проверка бюджета / даты / языка / категории
  • до 3 рекомендаций
  • объяснения с цитатами
  • alternative date / budget
  • валюты USD/EUR/RUB → KZT
  • ручной подбор и объяснения из каталога без AI (fallback)

Как это работает

  1. Пользователь описывает мероприятие
  2. AI извлекает параметры
  3. Пользователь подтверждает
  4. Backend фильтрует каталог
  5. AI выбирает цитаты из описаний; сервер проверяет их и собирает объяснения
  6. Пользователь получает до 3 карточек; AI отдельно сопоставляет пожелания с описаниями этих кандидатов

AI-помощник для выбора event-подрядчиков. Пользователь описывает мероприятие, уточняет условия и получает до трёх подходящих профилей с конкретными основаниями выбора. Прототип для кейса HackAlem AI #79-lite «Умный подбор подрядчиков».

Основной сценарий: пожелание → уточнение → подтверждение условий → проверка каталога → карточки → сопоставление пожеланий с цитатами. Если подходящих мало, можно явно применить предложенную дату или бюджет и повторить поиск.

Самостоятельный запуск

Требуются Node.js 24 LTS и npm. Node 22.12+ также соответствует основным требованиям проекта; итоговые проверки выполнялись на Node 24. Версии библиотек закреплены в package-lock.json. Команды выполнять из корня репозитория:

git clone https://github.com/BAITC-Hacks/hack-4a3a9b1c-vibeops.git
cd hack-4a3a9b1c-vibeops
npm ci
cp .env.example .env
# Для AI заполните OPENAI_API_KEY и OPENAI_MODEL в .env до запуска сервера.
npm run build
npm start

Откройте http://localhost:3000. Для закрытого репозитория требуется предоставленный организатором доступ. Если каталог уже скачан архивом, начните с npm ci.

Для полного AI-сценария заполните локальный .env:

PORT=3000
DATASET_PATH=data/vendors.csv
OPENAI_API_KEY=
OPENAI_MODEL=gpt-6-sol

OPENAI_API_KEY — реальный серверный ключ с доступом к выбранной модели и Responses API. Он не входит в репозиторий, архивы релиза или клиентскую сборку. При запуске production сервер загружает .env сам. После изменения ключа или модели остановите сервер и снова выполните npm start. Переменные среды имеют приоритет. Никогда не используйте клиентский VITE_* для ключей.

Модель задаётся через OPENAI_MODEL: автоматического выбора модели в коде нет. Пример выше соответствует последним живым проверкам на gpt-6-sol. Ранние проверки gpt-4.1-mini сохранены в исторических отчётах. Доступ к модели зависит от используемого API-проекта; при выборе другой модели нужно повторить живые проверки. Модель агента Codex, которым разрабатывали проект, выбирается отдельно от модели приложения.

gpt-6-astra доступна как явно выбираемый кандидат: три AI-адаптера задают reasoning.effort=low, но доступ и задержку нужно проверить на своём сервере. Mock-тесты не доказывают качество или скорость настоящей модели. План доступа жюри.

Без ключа работают каталог, ручная форма, фильтры, альтернативы и объяснения из данных (fallback). AI-помощник честно сообщает об отсутствии доступа. Для проверки именно AI экспертам нужен заранее настроенный сервер либо ключ, переданный через согласованный с организаторами закрытый канал. Публичная демо-ссылка и доступ жюри не считаются предоставленными самим наличием репозитория; это организационный пункт чек-листа сдачи.

Если порт занят: задайте другой PORT для production-запуска, например PORT=3010 npm start. Данные ищутся относительно корня запуска. Ошибка загрузки CSV видна через GET /api/health как 503, а не как пустой рабочий каталог.

Перед npm run dev остановите ранее запущенный backend или npm start на порту 3000. Обновление файлов и npm run build не перезапускают старый процесс.

Разработка: npm run dev запускает React на http://localhost:5173 и Express на http://localhost:3000. Vite проксирует /api на 3000; для стандартного dev-режима оставьте этот порт. Production раздаёт UI и API одним Express-процессом.

Повторить основной сценарий

  1. Напишите: «Нужен ведущий на корпоратив в Алматы». Помощник спросит дату и бюджет.
  2. Уточните: «10 октября 2026 года, до 1 миллиона тенге за ведущего, на русском, на 5 часов. Хочу юмор, танцы и программу без долгих речей».
  3. Проверьте показанные условия и нажмите «Подобрать по этим условиям». До подтверждения поиск не выполняется.
  4. Посмотрите карточки: почему профиль прошёл фильтры, цитата из его описания, какие пожелания подтверждаются описанием и что нужно уточнить.
  5. Исправьте в диалоге дату или бюджет и подтвердите новые условия. Ручная форма также доступна.
  6. Если показано предложение другой даты/бюджета, примените его отдельной кнопкой. Остальные условия сохраняются; старое сравнение пожеланий заменяется новым.

Естественный ввод: «Нужен ведущий на свадьбу в Алматы послезавтра, бюджет 500 долларов». Сервер вычисляет дату по Asia/Almaty и сумму в тенге по справочному курсу НБК. Перед поиском видны точная дата, приблизительная сумма, исходная валюта, курс и его дата. На 23.09.2026 пример означает 25.09.2026 и примерно 223 925 ₸. При запуске в другой день дата/курс могут отличаться. Известный календарь каталога ограничен 23.09–31.12.2026; за его пределами приложение требует другую дату, не обещая неизвестную доступность.

«100 гостей» не является бюджетом. Неоднозначные суммы, неподдерживаемая валюта или недоступный актуальный курс требуют уточнения. Поддержаны USD, EUR и RUB; курс — ориентир, а не банковское предложение обмена. Официальный источник НБК: один ограниченный по времени запрос, кэш, датированный снимок от 23.09.2026 на случай отказа сервиса. Снимок/курс старше семи дней не используется; источник и дата всегда показываются.

Проверка по готовым примерам

Кнопки D1–D6 отправляют настоящие запросы к каталогу; это не заранее записанные ответы. В таблице часы и язык не заданы.

ПримерУсловияОжидаемый результат
D1Алматы, ведущий, корпоратив, 10.10.2026, 1 млн ₸4 подходят, показаны первые 3
D2D1, дата 11.10.2026Другой состав: HK-88430 занят; HK-44733 доступен по каталогу
D3Алматы, флорист, свадьба, 10.10.2026, 500 тыс. ₸1 профиль HK-39372; возможна альтернатива даты
D4Астана, декоратор, свадьба, 10.10.2026, 500 тыс. ₸Категории нет в городе (no_category_in_city)
D5D1, бюджет 1 ₸Никто не подходит (no_matches); возможна альтернатива бюджета
D6Алматы, банкетный зал, свадьба, 14.11.2026, 5 млн ₸2 профиля HK-64395, HK-90011

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

Архитектура и роль AI

flowchart LR
  U[Диалог пользователя] --> B[OpenAI: извлечение условий]
  B --> V[Сервер: дата, валюта, валидация]
  V --> C[Пользователь подтверждает]
  C --> M[Строгие фильтры и устойчивый порядок]
  M --> E[OpenAI: выбор цитат]
  E --> Q[Сервер: проверка цитат и сборка объяснений]
  Q --> R[До трёх карточек]
  M --> A[Варианты даты или бюджета]
  R --> P[OpenAI: сопоставление пожеланий]
  • Клиент: React + TypeScript + Vite. Диалог, ручная форма, подтверждение, карточки, альтернативы, независимые состояния ошибок поиска и AI-сравнения.
  • Сервер: Node.js + Express + TypeScript. Валидация, загрузка CSV, календарь, фильтры, ранжирование, проверка ответов AI, серверная арифметика валют/дат.
  • Данные: один неизменённый CSV организатора. Базы данных и обучения модели нет.
  • Продуктовый AI: готовая модель OpenAI через Responses API; последняя проверенная конфигурация — OPENAI_MODEL=gpt-6-sol. Структурированный ответ, store:false, без автоматических повторов. Модель извлекает условия, выбирает свидетельства и сопоставляет пожелания с описаниями. Проверку цитат и сборку текста карточек выполняет сервер; цены, календарь, ID и порядок также контролирует код.
  • Устойчивость: объяснения — таймаут 6 секунд и ограниченный кэш; brief/compare — отдельные таймауты. При отказе объяснений включается помеченный fallback. При отказе compare уже найденные карточки сохраняются. Ошибки brief/compare не выдаются за успешную работу модели.

Ранжирование v1 — число совпавших групп маркеров формата в описании, затем меньшая стартовая цена, затем ASCII ID. Это лексическая эвристика, не обученная семантическая оценка качества подрядчика. LLM не переставляет карточки.

Качественные пожелания («юмор», «танцы», «без долгих речей») сопоставляются только с уже выбранными максимум тремя профилями. Они не меняют состав и порядок выдачи: четвёртый подходящий по строгим фильтрам профиль не поднимается автоматически из-за совпадения пожелания. При отсутствии свидетельства пожелание остаётся в «Нужно уточнить».

Объяснения v5 выбирают свидетельства совместно для всей выдачи и предпочитают факты, отличающие соседние профили. Если описание не содержит отдельного отличия, это прямо сказано. Сравнение пожеланий использует проверяемые полные фрагменты своего профиля; отсутствие основания остаётся в «Нужно уточнить». Проверка источника цитаты не является независимой проверкой её истинности или безошибочности смысловой интерпретации.

Альтернативы меняют ровно одно условие: ближайшую полезную дату в пределах ±7 дней либо минимальный увеличенный бюджет, добавляющий подходящих кандидатов. Фильтры языка/часов/формата сохраняются. Это расчёт по каталогу; без явного клика условия не ослабляются.

API

Метод и путьНазначение
GET /api/healthДоступность каталога, число профилей, наличие AI-конфигурации; наличие конфигурации не доказывает успешный API-вызов
GET /api/optionsГорода, категории, форматы, языки, границы дат
POST /api/assistant/brief{messages: string[]} → черновик, вопросы, предупреждения и готовый query либо null
POST /api/recommendQuery → три исхода, 0–3 карточки, причины исключения, AI-источники и decision_support
POST /api/assistant/compare{query, preferences} → цитаты по пожеланиям либо вопросы к подрядчику

Точные типы: contracts.ts, assistant.ts, decision-support.ts. Диалог ограничен 8 сообщениями, 2000 символами на реплику и 8000 суммарно; до пяти пожеланий. Поиск поддерживает один город, дату, категорию, формат и один язык за раз. Несколько обязательных языков требуют уточнения, а не молчаливого удаления требования.

Данные и ограничения

66 профилей, 17 категорий. SHA-256 data/vendors.csv: 6a724b6b7dfb5973343e68ba18dadb60fc807d87e3d78f03ee86fb26cb089f7d — исходные байты организатора. Происхождение данных.

  • Цена «от» за мероприятие — не окончательная смета. Итоговую цену нужно согласовать.
  • Дата без отметки занятости — не подтверждённая бронь. Площадки проверяются по календарю так же, как остальные подрядчики.
  • max_hours=null означает неприменимость ограничения часов. Synthetic/city_imputed/price_imputed видимы в карточках.
  • Два скудных описания могут не дать содержательной цитаты; факты не выдумываются. Длинный фрагмент, который нельзя безопасно сократить, может остаться неподтверждённым пожеланием.
  • Описания и запросы являются недоверенными данными, не инструкциями для программы. Для AI во внешний сервис передаются запрос и нужные анонимизированные описания; секреты остаются на сервере.
  • Модель не обучается на 66 профилях. NVIDIA API не подключён. Резервирование, платежи, обновление календарей поставщиками и мультикатегорийная смета не реализованы.

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

npm run typecheck
npm test
npm run test:ui
npm run build
npm audit --omit=dev
node --import tsx tests/explanations/catalog-evidence-audit.ts --run

Эти тесты не требуют ключа. Фикстуры и подставные провайдеры используются только в тестах; они не заменяют настоящую AI-проверку.

Для работающего сервера:

node tests/ui/acceptance.mjs http://127.0.0.1:3000
node --import tsx tests/explanations/decision-live.ts --run http://127.0.0.1:3000

С настроенным серверным ключом (расходует API-кредиты):

node --import tsx tests/explanations/assistant-live.ts --live
node --import tsx tests/explanations/natural-language-live.mjs --live http://127.0.0.1:3000
node --import tsx tests/explanations/decision-live.ts --run --require-ai http://127.0.0.1:3000

Результаты полной приёмки v0.1.0, проверенная версия, задержки и ограничения собраны в отчёте релиза. Старые ai-notes, ui-notes и отчёты сохранены как история; их прежние числа тестов не являются статусом новой версии. Ни один одиночный замер не является SLA; нулевые повторы текста не доказывают смысловое качество всех возможных запросов.

Соответствие кейсу и положению

По переданному ТЗ этого кейса применяется шкала 25 / 25 / 25 / 15 / 10. Подробности и исходные требования: пакет кейса. Это карта доказательств, не самооценка баллов.

КритерийЧто можно проверить
Соответствие задаче и работоспособность — 25Все входы, календарь, до трёх карточек, три исхода, D1–D6, объяснения
Техническая реализация — 25Настоящие AI-вызовы, строгие контракты, источники цитат, устойчивый порядок, ошибки/таймауты
README и воспроизводимость — 25Команды чистого запуска, env, данные, архитектура, тесты и явные ограничения
Ценность и применимость — 15Сокращение каталога, уточнение потребности, сопоставление пожеланий, понятные альтернативы
Потенциал и оригинальность — 10Сочетание проверяемых свидетельств, диалога и контролируемого изменения одного условия

README покрывает назначение, архитектуру, технологии, зависимости, установку, запуск, окружение и проверку сценария из п. 5.4.15 предоставленного положения. Самостоятельный запуск и разрешённый доступ экспертов проверяются отдельно. Итоговая версия фиксируется до 18:00 23.09.2026; изменения после окончания не выдаются за сданную версию. GitHub Release/push не заменяет действие «Сдать решение» на платформе.

Источники, инструменты и развитие

Основная функциональность разработана во время хакатона; история в официальном репозитории сохранена. До старта подготовлены правила работы и контекст. Старый тренировочный продукт не используется. Для разработки применялся Codex; это отдельно от продуктовых вызовов OpenAI API.

Сторонние компоненты: Node.js, TypeScript, Express, React, Vite/Vitest, csv-parse, dotenv и OpenAI SDK; лицензии поставляются с пакетами в node_modules, точные версии — в lockfile. Каталог предоставлен организатором для кейса; открытая лицензия на него не заявляется. Курсы — публичный справочник Национального Банка Казахстана с указанием даты и источника.

После хакатона возможны интеграции актуальных календарей/цен, оценка качества рекомендаций на размеченной выборке, поддержка нескольких подрядчиков и языков в одном запросе. Это направления развития, не готовые функции.

Ответственность команды и следующие задачи · Чек-лист сдачи

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

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

userarlan 45Нурбол 21CookiePookie 15Nurbo1 2

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

  • 2026-09-23 17:53Merge pull request #21 from BAITC-Hacks/codex/budget-wordsNurbo1
  • 2026-09-23 17:52docs: record final integrated budget and compatibility checksНурбол
  • 2026-09-23 17:50Merge remote-tracking branch 'origin/main' into codex/budget-wordsНурбол
  • 2026-09-23 17:50Merge pull request #20 from BAITC-Hacks/codex/release-compatibilityNurbo1
  • 2026-09-23 17:48merge: retain latest AI documentation from PR 22Нурбол
  • 2026-09-23 17:48Merge pull request #22 from BAITC-Hacks/codex/docs-ai-accuracyuserarlan
  • 2026-09-23 17:47docs: align AI responsibilities and configuration with verified behavioruserarlan
  • 2026-09-23 17:47merge: preserve team's Sol configuration and align documentationНурбол
Все коммиты (83)
  • 2026-09-23 17:46Update OPENAI_MODEL to gpt-6-soluserarlan
  • 2026-09-23 17:46Update README.mdCookiePookie
  • 2026-09-23 17:45fix: parse Russian word budgets and retain currency contextНурбол
  • 2026-09-23 17:44docs: normalize audit document whitespaceНурбол
  • 2026-09-23 17:43docs: preserve team audit specifications as historical recordsНурбол
  • 2026-09-23 17:40docs: record final compatibility checks after PR 19Нурбол
  • 2026-09-23 17:39fix: reconcile remaining UI branch with release safelyНурбол
  • 2026-09-23 17:39Merge remote-tracking branch 'origin/main' into codex/release-compatibilityНурбол
  • 2026-09-23 17:35Merge pull request #19 from BAITC-Hacks/codex/fix-brief-followupsuserarlan
  • 2026-09-23 17:34docs: stop stale backend before starting developmentuserarlan
  • 2026-09-23 17:33Merge remote-tracking branch 'origin/main' into codex/fix-brief-followupsuserarlan
  • 2026-09-23 17:33test: preserve conditions across brief follow-up correctionsuserarlan
  • 2026-09-23 17:28Update README.mdCookiePookie
  • 2026-09-23 17:20Merge pull request #18 from BAITC-Hacks/codex/release-readinessuserarlan
  • 2026-09-23 17:19merge: retain README update history and verified production portuserarlan
  • 2026-09-23 17:17docs: record final live API and browser acceptance for v0.1.0userarlan
  • 2026-09-23 17:12Update README.mdCookiePookie
  • 2026-09-23 17:12merge: preserve PR 17 history with tested UI integrationuserarlan
  • 2026-09-23 17:12docs: clarify environment setup before starting AI serveruserarlan
  • 2026-09-23 17:11Merge pull request #17 from BAITC-Hacks/codex/ui-draft-preservationuserarlan
  • 2026-09-23 17:11fix(ui): integrate confirmed draft preservation with stale response protectionuserarlan
  • 2026-09-23 17:11feat: prepare Astra upgrade and document jury access checksНурбол
  • 2026-09-23 17:10fix: preserve explicit year when AI truncates date evidenceuserarlan
  • 2026-09-23 17:06test: record release verification and gift comparison regressionuserarlan
  • 2026-09-23 17:04fix(ui): preserve confirmed results while editing assistant draftНурбол
  • 2026-09-23 17:03fix(ui): preserve confirmed results while editing assistant draftНурбол
  • 2026-09-23 16:57merge: retain Nikita alternatives history with verified integrationuserarlan
  • 2026-09-23 16:54fix: constrain AI evidence sources to verbatim user messagesuserarlan
  • 2026-09-23 16:48fix: ground assistant date corrections in complete user datesНурбол
  • 2026-09-23 16:46Merge remote-tracking branch 'origin/main' into codex/release-readinessuserarlan
  • 2026-09-23 16:46feat: resolve natural dates and currencies, complete decision supportuserarlan
  • 2026-09-23 16:37Merge pull request #7 from BAITC-Hacks/feat/uiuserarlan
  • 2026-09-23 16:22merge: sync feat/ui with main AI assistantНурбол
  • 2026-09-23 16:20Merge pull request #16 from BAITC-Hacks/codex/ai-conciergeuserarlan
  • 2026-09-23 16:18merge: sync feat/ui with latest main explanation fixesНурбол
  • 2026-09-23 16:16Add AI event brief conversation and preference comparisonuserarlan
  • 2026-09-23 16:02Merge pull request #15 from BAITC-Hacks/codex/distinct-evidence-fixuserarlan
  • 2026-09-23 16:01fix: distinguish contractor explanations using catalog evidenceuserarlan
  • 2026-09-23 15:57Add alternatives and update recommendationsGayass Cookie
  • 2026-09-23 15:51merge: update local UI branch with latest mainНурбол
  • 2026-09-23 15:43Merge pull request #14 from BAITC-Hacks/codex/decision-support-acceptanceuserarlan
  • 2026-09-23 15:42test: verify decision alternatives through real HTTP and catalog evidenceuserarlan
  • 2026-09-23 15:21Merge pull request #13 from BAITC-Hacks/codex/decision-support-contractuserarlan
  • 2026-09-23 15:21feat: define decision support contract and teammate implementation guidesuserarlan
  • 2026-09-23 15:01Merge pull request #12 from BAITC-Hacks/codex/scaffoldCookiePookie
  • 2026-09-23 14:59Fix recommendation endpointGayass Cookie
  • 2026-09-23 14:58Merge pull request #11 from BAITC-Hacks/codex/clear-explanationsuserarlan
  • 2026-09-23 14:57fix: remove merge residue breaking recommendation requestsuserarlan
  • 2026-09-23 14:57feat(ai): lead explanations with specific verified profile evidenceuserarlan
  • 2026-09-23 14:53Merge pull request #10 from BAITC-Hacks/codex/scaffoldCookiePookie
  • 2026-09-23 14:52Merge branch 'main' into codex/scaffoldCookiePookie
  • 2026-09-23 14:48sooved some conflictsGayass Cookie
  • 2026-09-23 14:42Merge pull request #9 from BAITC-Hacks/codex/scaffolduserarlan
  • 2026-09-23 14:36sooved some conflictsGayass Cookie
  • 2026-09-23 14:33Merge pull request #8 from BAITC-Hacks/codex/acceptanceuserarlan
  • 2026-09-23 14:32test: verify clean startup and real API acceptance in both AI modesuserarlan
  • 2026-09-23 14:29merge: verify corrected backend with real UI and D1-D6 acceptanceНурбол
  • 2026-09-23 14:27Added recomendation class and returning it from recomendGayass Cookie
  • 2026-09-23 14:26Merge pull request #6 from BAITC-Hacks/codex/scaffolduserarlan
  • 2026-09-23 14:25merge: resolve UI dependencies and integrate contractor recommendationsuserarlan
  • 2026-09-23 14:21test(ui): add real API acceptance runner and handoff checklistНурбол
  • 2026-09-23 14:13Your messageGayass Cookie
  • 2026-09-23 14:12Your messageGayass Cookie
  • 2026-09-23 14:11Merge pull request #5 from BAITC-Hacks/codex/integrate-uiuserarlan
  • 2026-09-23 14:10test(ui): integrate reproducible UI tests with shared scaffolduserarlan
  • 2026-09-23 14:09Merge remote-tracking branch 'origin/feat/ui' into codex/integrate-uiuserarlan
  • 2026-09-23 14:07Update projectGayass Cookie
  • 2026-09-23 14:06Merge pull request #4 from BAITC-Hacks/feat/explanationsuserarlan
  • 2026-09-23 14:03fix(ai): cover venue evidence and unpunctuated descriptionsuserarlan
  • 2026-09-23 13:57Update projectGayass Cookie
  • 2026-09-23 13:52merge: integrate published team scaffold with Firebird UIНурбол
  • 2026-09-23 13:49feat(ui): add contractor search interface and UI contract testsНурбол
  • 2026-09-23 13:45Merge pull request #2 from BAITC-Hacks/codex/scaffolduserarlan
  • 2026-09-23 13:44feat: publish shared Firebird scaffold for team developmentuserarlan
  • 2026-09-23 13:33feat(ai): add verified batch explanations and safe fallbackuserarlan
Структура репозитория (93 файлов)
.env.example
.gitattributes
.gitignore
AGENTS.md
README.md
client/index.html
client/src/App.tsx
client/src/Assistant.tsx
client/src/DecisionSupport.tsx
client/src/api.ts
client/src/demo.ts
client/src/main.tsx
client/src/style.css
client/src/styles.css
data/README.md
data/vendors.csv
docs/FINAL-TASKS-TEAM.md
docs/FIREBIRD-CODEX-PACK.md
docs/RELEASE-CHECKLIST.md
docs/TEAM-NEXT-STEPS.md
docs/acceptance-2026-09-23.md
docs/ai-assistant-acceptance.md
docs/ai-assistant.md
docs/ai-notes.md
docs/audit-fixes-spec.md
docs/branch-compatibility.md
docs/decision-support/EXAMPLES.json
docs/decision-support/NIKITA-PROMPT.md
docs/decision-support/NURBOL-PROMPT.md
docs/decision-support/SPEC.md
docs/decision-support/START-HERE.md
docs/jury-access.md
docs/local-demo.md
docs/release-acceptance.md
docs/release-browser/01-confirm-date-usd.png
docs/release-browser/02-gifts-live-comparison.png
docs/release-browser/report.json
docs/release-evidence.json
docs/ui-notes.md
package-lock.json
package.json
server/Makefile
server/alternatives.ts
server/app.ts
server/catalog.ts
server/explanations/assistant-brief.ts
server/explanations/assistant-compare.ts
server/explanations/brief-grounding.ts
server/explanations/decision-support.ts
server/explanations/evidence.ts
server/explanations/exchange-rates.ts
server/explanations/index.ts
server/explanations/provider.ts
server/index.ts
server/matching.ts
server/recommend.ts
server/validation.ts
shared/assistant.ts
shared/contracts.ts
shared/decision-support.ts
tests/explanations/assistant-brief.test.ts
tests/explanations/assistant-compare.test.ts
tests/explanations/assistant-http.test.ts
tests/explanations/assistant-live.ts
tests/explanations/budget-words.test.ts
tests/explanations/catalog-evidence-audit.ts
tests/explanations/dataset.test.ts
tests/explanations/decision-acceptance.test.ts
tests/explanations/decision-acceptance.ts
tests/explanations/decision-live.ts
tests/explanations/decision-support.test.ts
tests/explanations/demo-cases.ts
tests/explanations/distinct-evidence.test.ts
tests/explanations/exchange-rates.test.ts
tests/explanations/explanations.test.ts
tests/explanations/live-demo.ts
tests/explanations/model-upgrade.test.ts
tests/explanations/natural-language-live.mjs
tests/matching/alternatives.test.ts
tests/matching/core.test.ts
tests/matching/scaffold.test.ts
tests/ui/App.test.tsx
tests/ui/Assistant.test.tsx
tests/ui/DecisionSupport.test.tsx
tests/ui/acceptance-checks.mjs
tests/ui/acceptance-checks.test.tsx
tests/ui/acceptance.mjs
tests/ui/fixtures.tsx
tests/ui/vitest.config.mts
tsconfig.client.json
tsconfig.json
tsconfig.server.json
vite.config.ts
Ветки (17)

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

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

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