AAYMA
RU
Войти

AI Sana Challenge Hub

Платформа, превращающая короткую бизнес-задачу в карточку для студенческих команд: AI задаёт вопросы и предлагает поля с цитатами, человек…

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

О проекте

Команда: AI-Just
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Доведённый продукт

Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд

Суть

Платформа, превращающая короткую бизнес-задачу в карточку для студенческих команд: AI задаёт вопросы и предлагает поля с цитатами, человек подтверждает, правила считают рейтинг 0–100; каталог, рекомендации командам, отклики, этапы и лидерборд.

Как устроено

Бизнес вводит черновик; AIService с версионными промптами и JSON-схемами (Pydantic) генерирует вопросы и предложения полей, grounding-проверка требует точного совпадения цитат с исходным текстом, PII (email, телефоны) маскируются. Цепочка провайдеров OpenAI → vLLM на Brev → офлайн-заглушка, с одной попыткой исправления ответа. Рейтинг — детерминированная функция (7 критериев, 18 проверок); рекомендации задач командам — эмбеддинги OpenAI или локальный TF-IDF плюс совпадение навыков. AI Inspector показывает промпты, схемы и отклонённые предложения.

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

  • grounding по точным цитатам
  • маскирование PII
  • fallback-цепочка провайдеров
  • TF-IDF рекомендации
  • эмбеддинги OpenAI
  • RapidFuzz
  • rule-based рейтинг 7 критериев/18 проверок
  • eval-датасет jsonl

Особенности

Строгий grounding: предложения AI принимаются только при точном совпадении цитаты с источником с сохранением отрицаний и условий; AI Inspector делает работу модели прозрачной для жюри; есть eval-набор и сравнение режимов reasoning.

Стек

Python · FastAPI · Pydantic v2 · SQLModel · SQLite · uv · scikit-learn · NumPy · React 19 · TypeScript · Vite · Tailwind CSS v4 · Radix UI · TanStack Query · Recharts · Docker Compose · pytest · Playwright · Vitest

Модели

OpenAI (gpt-6-luna) · vLLM на NVIDIA Brev · OpenAI embeddings


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

README

README.md
Знак AI Sana

AI Sana Challenge Hub

От короткой бизнес-задачи до совместного проекта со студентами. Бизнес описывает проблему, AI задаёт уточняющие вопросы и предлагает карточку с цитатами из ответов. Человек проверяет и подтверждает поля, а прозрачные правила считают рейтинг готовности от 0 до 100. Студенческие команды находят задачи в каталоге и отправляют отклики; бизнес сам выбирает исполнителей и подтверждает результаты этапов.

Проект создан на хакатоне HackAlem AI, трек AI Sana, кейс «Единый кейс по геймификации практических заданий».

Что можно проверить в MVP: весь путь от черновика до баллов команды, настоящий backend, AI Inspector, рекомендации, адаптивный интерфейс и светлую, тёмную или системную тему. Для запуска и проверки ключи AI-сервисов не нужны.

Проблема и пользователи

Короткого описания «Хотим чат-бота для клиентов» недостаточно, чтобы команда оценила задачу и начала работу. Challenge Hub помогает бизнесу уточнить данные, ожидаемый результат, критерии успеха и ограничения. Рейтинг показывает пробелы и мотивирует дополнить карточку; студентам проще сравнивать задачи и выбирать подходящие по навыкам.

  • Бизнес: конструктор задачи, подтверждение полей, подсказки по рейтингу, публикация, управление откликами и этапами.
  • Студенческие команды: открытый каталог, рекомендации с объяснением, отклики и баллы за подтверждённую работу.

Быстрый запуск без ключей

Команды ниже приведены для PowerShell. Нужен Git; затем выберите Docker или локальный запуск.

git clone https://github.com/BAITC-Hacks/hack-4b695b60-ai-just.git
cd hack-4b695b60-ai-just
Copy-Item .env.example .env

В созданном .env замените две настройки, остальные оставьте по примеру:

AI_PROVIDER=stub
EMBED_PROVIDER_CHAIN=tfidf

Это включает офлайн-анализ и локальные рекомендации. Установка зависимостей или сборка Docker требует интернета; после неё основной сценарий работает без внешних AI-сервисов. Ключи в .env.example пустые, .env исключён из Git. Если .env у вас уже есть, измените нужные строки в нём, сохранив остальные настройки.

Вариант A — Docker

Нужен Docker с Compose 2.24 или новее. Из корня репозитория:

docker compose up --build

При первом старте SQLite заполняется синтетическими демо-данными. В текущем Compose база находится внутри backend-контейнера: пересоздание контейнера может удалить изменения демо. Остановка — Ctrl+C, затем docker compose down.

Вариант B — два локальных терминала

Нужны Python 3.11+, uv, Node.js 24 и npm. Откройте оба терминала в корне клонированного репозитория.

Терминал 1 — backend:

cd backend
uv sync --frozen
uv run uvicorn app.main:app --host 127.0.0.1 --port 8000

Терминал 2 — frontend:

cd frontend
npm ci
$env:VITE_USE_MOCKS = "false"
$env:API_PROXY_TARGET = "http://127.0.0.1:8000"
npm run dev -- --host 127.0.0.1 --port 5173 --strictPort

Откройте http://127.0.0.1:5173. Frontend отправляет /api на настоящий backend через Vite. База локального запуска сохраняется в backend/app.db. Оба процесса останавливаются Ctrl+C в своих терминалах.

Проверка решения за 5 минут

Выберите роль «Бизнес», компанию «Дала Логистик» и провайдер «Офлайн» в шапке. При свежем запуске доступны 6 опубликованных задач разных уровней готовности и 6 команд. Кнопка «Сбросить демо» возвращает начальный набор, удаляя изменения в текущей базе; для первого просмотра она не нужна.

ШагДействиеЧто проверить
1«Новая задача» → «Попробовать пример» → тема «Логистика» → «Проанализировать»Не меньше 3 вопросов. Предложения AI имеют цитаты; рейтинг до подтверждения — 0
2«Подтвердить всё», затем ответить на вопросы и нажать «Собрать карточку»Подтверждённые поля сохраняются. Новые предложения можно изменить, подтвердить или отклонить
3Подтвердить карточку и дополнить поля по подсказкамРейтинг пересчитывается; видны причины, возможный прирост, история и прогноз позиции
4«Опубликовать задачу» → проверить карточку → подтвердить публикациюЗадача появляется в каталоге. Публикация доступна и при низком рейтинге, если подтверждено название
5Роль «Команда» → «Nomad AI» → каталог или рекомендации → открыть задачуВ каталоге видны все опубликованные задачи. В рекомендациях — задачи от 40 баллов с причинами совпадения
6Заполнить идею, план и срок, затем «Отправить отклик»Отклик появляется в разделе команды и у бизнеса
7Роль «Бизнес» → «Мои задачи» → отклики → «Выбрать»Решение меняется только по явному действию бизнеса. Другой отклик можно отклонить
8Добавить этап выбранной команде и подтвердить выполнениеНачисляются баллы за этап, обновляется лидерборд
9В конструкторе открыть «Как это работает»AI Inspector показывает провайдера, промпты, схемы, ошибки и отклонённые предложения

Для ответов на вопросы можно использовать синтетические данные:

  • Данные: «Есть выгрузка обращений из CRM за 6 месяцев — около 12 000 записей в Excel, плюс FAQ на 40 вопросов. Данные обезличим и дадим доступ после NDA.»
  • Текущая ситуация: «Колл-центр получает 300–400 звонков в день, 60% — вопросы о статусе доставки и сроках.»
  • Критерии успеха: «Бот самостоятельно закрывает не менее 40% обращений о статусе доставки, среднее время ответа — до 10 секунд.»

Точный рейтинг зависит от заполненных и подтверждённых полей. Полный пример с остальными полями и откликом — в сценарии демо, а воспроизводимый путь до 100 баллов — в сквозном тесте настоящего API.

Принципы продукта

flowchart LR
    A["Черновик"] --> B["AI: вопросы и предложения"]
    B --> C["Человек подтверждает карточку"]
    C --> D["Рейтинг 0–100"]
    D --> E["Открытый каталог"]
    E --> F["Команда откликается"]
    F --> G["Бизнес принимает решение"]
    G --> H["Подтверждённый этап → баллы"]
  • AI только предлагает. Предложения не дают баллов до подтверждения. AI не перезаписывает уже подтверждённые поля.
  • Рейтинг считают правила. Детерминированная функция, 7 критериев и 18 проверок. Расшифровка доступна в интерфейсе.
  • Каталог открыт для всех задач. Сортировка по умолчанию: рейтинг по убыванию, дата публикации по возрастанию, затем ID. Низкий рейтинг не запрещает публикацию и отклики.
  • Рекомендации объяснимы. Учитываются интересы, навыки и технологии команды; они не ограничивают каталог.
  • Бизнес выбирает вручную. Автоназначения и AI-ранжирования команд нет. Можно выбрать несколько команд или отклонить отклики.

Формула рейтинга

КритерийПоляМаксимум
Контекст и потребностьcontext, need20
Данные и материалыdata20
Ожидаемый результатexpected_result15
Критерии успехаsuccess_criteria15
Ограниченияconstraints10
Пользователиusers10
Связь с бизнесомcontact, interaction_format10

Уровни: 0–39 — Черновик, 40–69 — Рабочая, 70–89 — Готовая, 90–100 — Приоритетная. «Черновик» здесь — уровень готовности: задача с таким уровнем тоже может быть опубликована. Все условия начисления, подсказки и баллы этапов описаны в формуле рейтинга и геймификации.

Архитектура и технологии

flowchart LR
    FE["React + TypeScript"] -->|"REST /api"| BE["FastAPI"]
    BE --> DOM["Правила рейтинга и каталога"]
    BE --> DB[("SQLite")]
    BE --> AI["AIService: валидация, fallback, grounding"]
    AI --> OAI["OpenAI API"]
    AI --> BR["vLLM на GPU в Brev"]
    AI --> ST["Офлайн-заглушка"]
СлойТехнологии
BackendPython, FastAPI, Pydantic v2, SQLModel, SQLite, uv
AI и MLOpenAI SDK, vLLM на Brev, NumPy, scikit-learn, RapidFuzz
FrontendReact 19, TypeScript, Vite, Tailwind CSS v4, Radix UI, TanStack Query, Recharts, Motion
Проверкиpytest, Ruff, Vitest, Oxlint, TypeScript, Playwright
ЗапускDocker Compose; локально — uvicorn и Vite

Подробнее: архитектура и контракт API.

AI, проверка источников и fallback

Для анализа и сборки карточки используются промпты с версиями, JSON-схемы и проверка Pydantic. При ошибке структуры выполняется одна попытка исправления ответа, затем переход к следующему провайдеру. Автоматическая цепочка по умолчанию: OpenAI → Brev → офлайн-заглушка.

В промптах v2 AI извлекает полные фрагменты исходного текста с цитатами. Проверка grounding требует точного совпадения цитат с источником и значения с этими цитатами, сохраняя отрицания и условия. Свободные перефразирования и непроверяемые значения отбрасываются с причиной в трассировке; их можно заполнить вручную. Проверка не устанавливает правдивость исходника и смысловую правильность выбора поля — перед публикацией человек проверяет карточку.

Email, телефоны и @-ники маскируются во всём входе внешнего LLM, включая ранее заданные вопросы. Для рекомендаций используются эмбеддинги OpenAI или локальный TF-IDF вместе с совпадением навыков. Brev — облачная GPU-инфраструктура для самостоятельного запуска модели; используйте синтетические данные и не считайте такой запуск гарантией, что данные остаются на вашем компьютере.

Подключение необязательных AI-сервисов

Настройки хранятся только в корневом .env, после изменения перезапустите backend:

РежимНастройки
Только офлайнAI_PROVIDER=stub, EMBED_PROVIDER_CHAIN=tfidf
OpenAIOPENAI_API_KEY, OPENAI_MODEL=gpt-6-luna, OPENAI_REASONING_EFFORT=low, AI_PROVIDER=openai
Модель на BrevBREV_LLM_BASE_URL, BREV_LLM_MODEL, BREV_LLM_API_KEY, AI_PROVIDER=brev
Автоматический fallbackAI_PROVIDER=auto, AI_PROVIDER_CHAIN=openai,brev,stub

Эмбеддинги настраиваются отдельно через EMBED_PROVIDER_CHAIN; оставьте tfidf, если нужны только локальные рекомендации. При недоступности выбранного LLM приложение переходит к заглушке. Реально ответивший провайдер виден в AI Inspector; /api/health сообщает конфигурацию, но сам по себе не подтверждает успешный запрос к модели.

Инструкция запуска Nemotron через vLLM — Brev. При Docker-запуске backend и туннеле на хосте используйте BREV_LLM_BASE_URL=http://host.docker.internal:8001/v1. NVIDIA Build API в проекте не используется.

Измеренное качество AI

В сохранённом отчёте сравниваются 12 размеченных синтетических черновиков, включая короткие описания, контакты и попытки подменить инструкции. Это исторический прогон промптов и grounding v1, до перехода к строгому извлечению v2. В нём каждый провайдер ответил на 12 из 12 примеров без fallback; текущие внешние модели с v2 заново не проверялись. Числа ниже не описывают качество новой версии.

ПровайдерPrecisionRecallField F1Отклонено grounding≥ 3 вопросаP95
OpenAI gpt-6-luna0.74360.85290.79450%100%7.89 с
Nemotron 3 Nano на Brev0.44440.70590.545439%100%9.55 с
Офлайн-заглушка0.96550.82350.88890%100%0.032 с

Как читать результаты: Field F1 измеряет обнаружение размеченных типов полей без title, а не смысловую точность всего текста. Новый показатель final_guard_failure_rate означает долю нарушений при повторной проверке тем же кодом, а не независимую оценку достоверности. Поэтому semantic_hallucination_rate оставлен null до отдельной смысловой оценки. Малый синтетический набор не позволяет переносить числа на любые реальные задачи. Стоимость запросов стенд пока не рассчитывает.

Для OpenAI выбран reasoning_effort=low: в отдельном сравнении он дал Field F1 0.7222 и P95 8.08 с; none — 0.6207 и 4.47 с. Это по одному прогону каждого режима, результаты могут меняться.

Повторить офлайн-eval из корня репозитория, сохранив новый отчёт отдельно:

cd backend
uv run python -m eval.run_eval --providers stub --out "$env:TEMP/sana-eval"

Для сравнения подключённых сервисов замените stub на stub,openai,brev. В отчёте всегда проверяйте provider_used, чтобы отличать ответ модели от fallback.

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

Команды каждого блока выполняются из корня репозитория в отдельном терминале, после установки зависимостей.

Backend:

cd backend
uv run pytest
uv run ruff check .

Frontend:

cd frontend
npm run typecheck
npm run lint
npm test
npm run build

Backend-тесты проверяют рейтинг, API, каталог, ручные решения, grounding и fallback. Vitest проверяет логику на моках; Playwright ниже проходит настоящий backend.

Сквозной тест на отдельной базе

Тест real-api.spec.ts сбрасывает данные перед каждым сценарием. Следующая конфигурация направляет его в отдельную тестовую базу, сохраняя обычную backend/app.db.

Терминал 1, из корня:

cd backend
$env:AI_PROVIDER = "stub"
$env:EMBED_PROVIDER_CHAIN = "tfidf"
$env:DATABASE_URL = "sqlite:///./e2e-review.db"
uv run uvicorn app.main:app --host 127.0.0.1 --port 18000

Терминал 2, из корня: тест поднимет отдельный frontend на порту 15173; обычный сайт на 5173 можно оставить открытым. Используется Google Chrome; если он ещё не установлен, выполните npx playwright install chrome из frontend/. Тест со сбросом базы требует явно указать адрес отдельного backend; без него сброс не выполняется.

cd frontend
$env:E2E_PORT = "15173"
$env:VITE_USE_MOCKS = "true"
npx playwright test tests/e2e/demo.spec.ts

$env:VITE_USE_MOCKS = "false"
$env:API_PROXY_TARGET = "http://127.0.0.1:18000"
$env:E2E_API_URL = "http://127.0.0.1:18000/api"
npx playwright test tests/e2e/real-api.spec.ts tests/e2e/interface-controls.spec.ts

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

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

  • Демо-данные синтетические: вымышленные компании и команды, email на example.com. Eval-датасет содержит 12 размеченных черновиков.
  • Регистрации и полноценной авторизации нет: роли и участники переключаются в шапке. API управления демо предназначен для локальной демонстрации.
  • SQLite, один процесс backend; конфигурация не рассчитана на публичную эксплуатацию с реальными персональными данными.
  • Есть адаптивная вёрстка и три режима темы. Интерфейс на русском; чат, уведомления, загрузка файлов и переводы не реализованы.
  • Используются готовые модели без собственного обучения. Векторной БД нет, эмбеддинги хранятся в памяти.
  • Маскирование покрывает email, телефоны и @-ники; имена людей и произвольные конфиденциальные сведения автоматически не обезличиваются.
  • Качество предложений зависит от провайдера. Проверка цитат и ручное подтверждение остаются частью сценария для всех моделей.
  • Публичного развёртывания в этом репозитории нет; инструкции выше предназначены для локального запуска.

Навигация по репозиторию

ПутьСодержимое
backend/app/API, модели, правила рейтинга, AI-конвейер и рекомендации
backend/tests/Тесты backend
backend/eval/Датасет, запуск eval и отчёты
frontend/Интерфейс и браузерные тесты
infra/Запуск vLLM на Brev, Dockerfile frontend и nginx
docs/README.mdКарта документации
docs/demo-script.mdТексты и последовательность демонстрации

Распределение работы: backend и ML, frontend и UX. Правила проекта — AGENTS.md.

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

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

pyanexya 13Adr 7

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

  • 2026-09-23 17:06fix(frontend): align form limits and verify demo flowAdr
  • 2026-09-23 17:06fix: validate inputs and preserve AI source contextAdr
  • 2026-09-23 16:27feat(frontend): polish interface, custom controls and judge guidepyanexya
  • 2026-09-23 16:00feat(frontend): integrate completed MVP and final verificationpyanexya
  • 2026-09-23 15:51test(frontend): scope inspector assertion to active tabAdr
  • 2026-09-23 15:26fix(frontend): harden interactive actionsAdr
  • 2026-09-23 15:13Merge remote-tracking branch 'origin/main' into frontend-interfaceAdr
  • 2026-09-23 15:10docs: ТЗ для B на полировку интерфейса (темы, RU/KZ/EN, анимации, качество)pyanexya
Все коммиты (20)
  • 2026-09-23 15:09feat(frontend): polish responsive UX and live API integrationAdr
  • 2026-09-23 15:01chore: упаковка MVP для сдачи — Docker с интерфейсом, e2e на настоящем API, READMEpyanexya
  • 2026-09-23 14:53fix(frontend): убрать NVIDIA Build из выбора AI-провайдераpyanexya
  • 2026-09-23 14:50feat(ai): tune Luna reasoning and finalize Brev evalpyanexya
  • 2026-09-23 14:19merge: frontend (Adr) — конструктор, каталог, рейтинг, AI Inspector и API-клиентpyanexya
  • 2026-09-23 14:18feat(ai): роутер провайдеров, grounding, PII, трассировка, рекомендации, eval и Brevpyanexya
  • 2026-09-23 14:02feat(frontend): implement challenge hub demo and API integration layerAdr
  • 2026-09-23 13:56chore: Docker Compose для backend и актуальный READMEpyanexya
  • 2026-09-23 13:54feat(backend): каталог, отклики, решения бизнеса, этапы и лидербордыpyanexya
  • 2026-09-23 13:44feat(backend): эндпоинты конструктора задачи и публикацияpyanexya
  • 2026-09-23 13:38feat(backend): каркас API, рейтинг, офлайн-заглушка AI и seed-данныеpyanexya
  • 2026-09-23 13:23docs: план, архитектура, API-контракт и роли командыpyanexya
Структура репозитория (139 файлов)
.dockerignore
.env.example
.gitignore
AGENTS.md
README.md
backend/Dockerfile
backend/app/__init__.py
backend/app/ai/__init__.py
backend/app/ai/contracts.py
backend/app/ai/grounding.py
backend/app/ai/pii.py
backend/app/ai/prompts/analyze_draft.v1.md
backend/app/ai/prompts/analyze_draft.v2.md
backend/app/ai/prompts/build_card.v1.md
backend/app/ai/prompts/build_card.v2.md
backend/app/ai/providers.py
backend/app/ai/question_bank.py
backend/app/ai/service.py
backend/app/ai/stub.py
backend/app/ai/trace.py
backend/app/api/__init__.py
backend/app/api/admin.py
backend/app/api/ai.py
backend/app/api/catalog.py
backend/app/api/leaderboard.py
backend/app/api/meta.py
backend/app/api/participants.py
backend/app/api/proposals.py
backend/app/api/recommendations.py
backend/app/api/tasks.py
backend/app/config.py
backend/app/db.py
backend/app/domain/__init__.py
backend/app/domain/card.py
backend/app/domain/catalog.py
backend/app/domain/fields.py
backend/app/domain/rating.py
backend/app/errors.py
backend/app/main.py
backend/app/ml/__init__.py
backend/app/ml/recommend.py
backend/app/models.py
backend/app/schemas.py
backend/app/seed.py
backend/app/services/__init__.py
backend/app/services/catalog_views.py
backend/app/services/proposal_service.py
backend/app/services/task_service.py
backend/app/services/task_views.py
backend/eval/__init__.py
backend/eval/dataset.jsonl
backend/eval/reports/latest.md
backend/eval/reports/reasoning-comparison.md
backend/eval/run_eval.py
backend/pyproject.toml
backend/tests/__init__.py
backend/tests/conftest.py
backend/tests/test_ai_eval.py
backend/tests/test_ai_grounding.py
backend/tests/test_ai_recommendations.py
backend/tests/test_ai_service.py
backend/tests/test_api_flow.py
backend/tests/test_catalog.py
backend/tests/test_catalog_api.py
backend/tests/test_input_validation.py
backend/tests/test_proposals_flow.py
backend/tests/test_rating.py
backend/tests/test_seed.py
backend/tests/test_smoke.py
backend/uv.lock
data/seed/businesses.json
data/seed/cards.json
data/seed/drafts.json
data/seed/milestones.json
data/seed/proposals.json
data/seed/teams.json
docker-compose.yml
docs/README.md
docs/ai-ml.md
docs/api-contract.md
docs/architecture.md
docs/demo-script.md
docs/hackathon-brief.md
docs/nvidia-brev.md
docs/plan-5h.md
docs/rating-and-gamification.md
docs/team/A-backend-ml.md
docs/team/B-frontend-product.md
docs/team/B-ui-polish.md
frontend/.env.example
frontend/.gitignore
frontend/.oxlintrc.json
frontend/README.md
frontend/components.json
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/playwright.config.ts
frontend/public/favicon.svg
frontend/public/icons.svg
frontend/src/App.css
frontend/src/App.tsx
frontend/src/api/client.ts
frontend/src/api/mock/fixtures.ts
frontend/src/api/mock/server.ts
frontend/src/api/types.ts
frontend/src/assets/hero.png
frontend/src/assets/react.svg
frontend/src/assets/vite.svg
frontend/src/brand-polish.css
frontend/src/components/BrandMark.tsx
frontend/src/components/RatingHistoryChart.tsx
frontend/src/components/RatingPanel.tsx
frontend/src/components/shared.tsx
frontend/src/components/ui/button.tsx
frontend/src/components/ui/dialog.tsx
frontend/src/components/ui/select.tsx
frontend/src/features/Builder.tsx
frontend/src/features/Catalog.tsx
frontend/src/features/Inspector.tsx
frontend/src/features/Workspace.tsx
frontend/src/index.css
frontend/src/lib/session.tsx
frontend/src/lib/text.ts
frontend/src/lib/theme.tsx
frontend/src/lib/utils.ts
frontend/src/main.tsx
frontend/tests/e2e/demo.spec.ts
frontend/tests/e2e/interface-controls.spec.ts
frontend/tests/e2e/real-api.spec.ts
frontend/tests/mock-flow.test.ts
frontend/tsconfig.app.json
frontend/tsconfig.json
frontend/tsconfig.node.json
frontend/vite.config.ts
frontend/vitest.config.ts
infra/brev/serve_vllm.sh
infra/frontend.Dockerfile
infra/nginx.conf

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

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

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