Повод
Сайт «Повод»: подбирает до трёх подрядчиков и площадок для мероприятий в Казахстане и объясняет каждый выбор фактами из профиля.
О проекте
Команда: CodexFlow
Кейс HackAlem.ai: Креативные индустрии — Firebird
Стадия: Доведённый продукт
Задача кейса: «#79-lite»: подобрать до 3 подрядчиков для мероприятия и объяснить выбор
Суть
Сайт «Повод»: подбирает до трёх подрядчиков и площадок для мероприятий в Казахстане и объясняет каждый выбор фактами из профиля. Есть текстовый помощник, который разбирает описание события на поля формы.
Как устроено
Параметры события приходят из формы или от помощника contractor_assistant, который по правилам разбирает русский текст и просит подтвердить распознанные поля. Дальше идёт валидация, фильтр по городу и категории, затем проверка занятости по CSV и остальных условий. Прошедшие сортируются по стартовой цене, затем по ID, и выдаются до трёх карточек. Объяснение строится из выделенного факта профиля и его соответствия заказу. Если включён опциональный модуль OpenAI Responses API, он только выбирает исходную фразу для уже отобранной карточки. Три исхода: matches, category_absent, no_match.
Ключевые решения
- rule-based filtering
- price+ID deterministic sort
- rule-based NL parsing of event requests
- grounded quote selection
- stress/QA checks
Особенности
Помощник разбирает свободное описание события на поля формы без LLM, по правилам, и просит пользователя их подтвердить. Порядок выдачи прямо назван сортировкой по цене, а не рейтингом качества. Есть демо-режим без backend на сохранённых ответах, а в README требования сопоставлены с критериями жюри.
Стек
Python · FastAPI · Pydantic · Uvicorn · HTTPX · HTML/CSS/JS ES modules · unittest · Node.js test runner
Модели
OpenAI Responses API
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-22efa0ed-codexflow.
README
README.mdПовод
Умный подбор подрядчиков для событий
До трёх подходящих специалистов — и понятное объяснение каждого выбора.
HackAlem AI · Команда CodexFlow · Креативные индустрии
Быстрый старт · Демо для жюри · Архитектура · Критерии · Документация
О проекте
«Повод» помогает организаторам свадеб, корпоративов и других мероприятий в Казахстане выбрать специалистов и площадки из каталога. Сервис учитывает условия события, исключает неподходящие варианты и объясняет рекомендации фактами из профилей.
Главное — не просто показать карточки, а объяснить, почему они подходят. Если вариантов мало или нет, пользователь узнает причину.
Проект решает кейс «Умный подбор подрядчиков (#79-lite)». Основной сценарий работает локально: без API-ключей, платных вызовов и базы данных.
Что реализовано
- Подбор до трёх вариантов. Город, дата, категория, формат и бюджет; язык и длительность — по желанию.
- Индивидуальные объяснения. Особенность из профиля, соответствие запросу, стартовая цена и доступность на дату.
- Честная выдача. Занятые и неподходящие профили исключаются; редкие категории и пустые результаты объясняются словами.
- Описание события своими словами. «Опишу своё событие» разбирает русский текст по правилам, уточняет поля и предлагает подтвердить их перед подбором.
- Каталог и справочник. Поиск по имени или ID, фильтры, подробности профилей и локальная помощь по работе сайта.
Форма проверяет ввод, показывает прогресс заполнения и загрузку результата, поддерживает ползунок бюджета и повтор запроса после ошибки. При изменении условий интерфейс отмечает, что старую подборку нужно обновить.
Интерфейс поддерживает светлую и тёмную темы, RU / KK / EN и сохранение черновика формы. Описания профилей, объяснения и ответы помощника остаются на русском.
Соответствие критериям хакатона
Баллы ниже — веса критериев из задания, а не самооценка проекта.
| Критерий | Вес | Что реализовано и чем подтвердить на защите |
|---|---|---|
| Соответствие задаче и работоспособность | 25 | Полный путь от параметров события до 0–3 карточек. Показать популярную и редкую категории, пустую выдачу и изменение результата при смене даты; повторить демо-сценарии. |
| Техническая реализация | 25 | Отдельные HTTP-слой, движок подбора, разбор описания и UI; строгий контракт и стабильный порядок. Объяснить пайплайн и опциональный AI, который выбирает исходную фразу, сохраняя ограничения движка. |
| README и воспроизводимость | 25 | Инструкции для macOS/Linux и Windows, локальный запуск сайта и API одним процессом, примеры с ожидаемыми ID, команды проверки и фактические результаты повторного запуска. |
| Ценность и применимость | 15 | Организатор сравнивает небольшой список по понятным причинам, видит влияние бюджета и занятости. Пустой результат объясняет препятствие и помогает выбрать, какой параметр изменить. |
| Потенциал развития и оригинальность подхода | 10 | Объяснения ограничены проверяемыми фактами каталога; AI может выбирать только допустимую цитату. Есть контракт API и отдельные компоненты для дальнейшего развития; необходимые следующие проверки и ограничения описаны ниже. |
Что показать жюри в первую очередь
- Различия объяснений. На одном запросе сравнить факты в трёх карточках: почему конкретно этот профиль подходит, а не универсальную рекламную фразу.
- Честную работу с занятостью и редкими категориями. Изменить только дату; затем показать двух флористов и объяснение отсутствия третьего варианта.
- Понятный пустой результат. Уменьшить бюджет и показать причину отказа. Отдельно продемонстрировать отсутствие категории в городе.
- Повторяемость и проверяемость. Повторить запрос, сопоставить ID и порядок с примером в репозитории; показать запуск
qa/demo_check.py.
Эта последовательность соответствует приоритетам задачи: качество объяснений → корректная обработка редких, занятых и пустых категорий → скорость → интерфейс. Метрики скорости доступны в выводе локальной проверки; они не являются гарантией для другого компьютера или публичного хостинга.
Направления развития и границы готовности
Следующие шаги основаны на уже описанных в проекте ограничениях и не представлены как готовые функции:
- Проверить выбор фраз на реальном OpenAI API и вручную оценить пользу объяснений — процедура описана в AI.md.
- Перед публичным размещением добавить инфраструктурные ограничения, контроль доступа к платному AI и общие квоты между процессами — перечень находится в SECURITY.md.
- Для работы за пределами демо-календаря обновить источник данных и согласовать копию каталога на frontend. Текущая доступность подтверждается только предоставленным CSV в фиксированном диапазоне дат.
Как работает решение
- Опишите событие: заполните форму или воспользуйтесь текстовым помощником и подтвердите распознанные поля.
- Получите подбор: сервис проверит каталог и вернёт до трёх подходящих карточек.
- Сравните объяснения: прочитайте особенности профилей, условия и цену «от». При пустом результате измените условия по подсказке.
Параметры события
↓
Проверка ввода → город и категория → занятость и остальные условия
↓
Сортировка по стартовой цене, затем по ID
↓
До трёх карточек с объяснениями — или понятная причина отсутствия вариантов
Одинаковые параметры дают одинаковый порядок. Это сортировка по цене, а не рейтинг качества.
В объяснении сначала выделяется конкретный факт из профиля, затем показывается его соответствие заказу. Цитаты берутся из описаний, цены и занятость — из структурированных данных. Если отличительных сведений мало, сервис не выдумывает преимущества.
Подробные правила и обработка пограничных случаев — в описании пайплайна.
Технологии
| Часть | Стек |
|---|---|
| Backend | Python · FastAPI · Pydantic · Uvicorn · HTTPX |
| Frontend | HTML · CSS · JavaScript ES modules — без React и сборщика |
| Данные | Локальный CSV и проверяемый снимок каталога для интерфейса |
| Проверки | Python unittest · Node.js test runner · демо- и нагрузочные сценарии |
| Шрифты | Lora · Golos Text · Manrope — локальные файлы с лицензиями OFL |
Роль ИИ. Основной подбор и текстовый помощник работают по правилам. Опциональный модуль OpenAI Responses API может выбрать исходную фразу для объяснения уже отобранной карточки, но не меняет кандидатов, порядок, цены или календарь. Произвольный текст модели не выводится; при ошибках используется обычное объяснение.
Интеграция выключена в обычном сценарии. Настройки, модель и условия включения — в разделе «Данные и интеграции».
Архитектура
Один процесс FastAPI обслуживает сайт и API. Браузер передаёт параметры движку подбора, который работает с локальным каталогом. Текстовый помощник заполняет параметры для того же движка.
frontend/ Форма, карточки, каталог, темы и справочник
contractor_assistant/ Разбор описаний событий и уточнение параметров
recommendation-logic/ API, движок подбора, данные, тесты и QA
docs/ Демо-сценарии, пайплайн и отчёт приёмки
Основные маршруты: /recommendations — подбор, /assistant/chat — помощник, /filters — значения формы, /health — состояние сервера. Интерактивный контракт доступен по /docs после запуска.
Ответ подбора содержит карточки, объяснение результата и статистику. Три штатных исхода — matches, category_absent, no_match — возвращаются с HTTP 200; некорректные параметры отклоняются валидацией.
Полный контракт, примеры JSON и коды ошибок: Backend README · Интеграция frontend/backend.
Быстрый старт
Нужны Git и Python 3.10+. Проверено на Windows с Python 3.13.12. Node.js 22+ понадобится только для JavaScript-тестов; npm и сборка frontend не нужны.
1. Скачайте репозиторий
Для приватного репозитория нужен доступ команды. Если он уже скачан, откройте его корневую папку и переходите к шагу 2.
git clone https://github.com/BAITC-Hacks/hack-22efa0ed-codexflow.git
cd hack-22efa0ed-codexflow
2. Запустите сервер
Windows · PowerShell
cd recommendation-logic
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe -m uvicorn src.api:app --host 127.0.0.1 --port 8000
Команды для macOS и Linux
Из корня репозитория:
cd recommendation-logic
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python -m uvicorn src.api:app --host 127.0.0.1 --port 8000
3. Откройте сайт
Swagger API · Состояние сервера — ожидается profiles_loaded: 66.
Не открывайте frontend/index.html двойным щелчком: сайту нужен работающий сервер. Остановка — Ctrl+C. Если порт занят, замените 8000, например, на 8013 в команде запуска и адресе браузера.
Демо без backend
Из корня репозитория можно запустить только статический сайт:
python3 -m http.server 5173 --bind 127.0.0.1 --directory frontend
В Windows используйте python вместо python3. Откройте http://127.0.0.1:5173/?demo=1.
В этом режиме интерфейс показывает заранее сохранённые ответы, а не подбор по произвольным условиям; разбор текста помощником отключён. Сетевые ошибки реального режима не подменяются моками. При открытии ?demo=0 на порту 5173 потребуется API на порту 8000 того же hostname; выбор режима описан в config.js.
Как проверить
Короткий маршрут для жюри
Откройте сайт без ?demo=1. В форме доступны быстрые примеры «Ведущий», «Флорист» и «Низкий бюджет». Выберите условия и нажмите «Подобрать подрядчиков».
Для трёх запросов ниже: Алматы · свадьба · длительность не задана.
| Сценарий | Параметры | Что показать |
|---|---|---|
| Плотная категория | 07.10.2026 · Ведущий · 1 000 000 ₸ · казахский | Кики HK-35215, Эмилия HK-42352, Сон Гоку HK-27222: три карточки из четырёх подходящих |
| Редкая категория | 04.10.2026 · Флорист · 250 000 ₸ · русский | Тони Тони Чоппер HK-39372 и Тихиро Огино HK-90001: две карточки с разными объяснениями |
| Пустой результат | 04.10.2026 · Флорист · 100 000 ₸ · русский | Нет карточек: стартовые цены свободных кандидатов выше бюджета |
Две контрольные проверки: повторите первый запрос — порядок должен сохраниться. Затем измените только его дату на 03.10.2026 — выдача станет пустой, а объяснение укажет занятость четырёх иначе подходящих профилей.
У флористов сравните факты в объяснениях: объём выполненных заказов у одного и работу с цветовой палитрой у другого. Метки синтетических профилей и ориентировочных данных должны быть видны.
Дополнительные сценарии и особенности деморежима
- Нет категории в городе: Зарубежье · 04.10.2026 · свадьба · Флорист · 250 000 ₸ →
category_absentс пояснением. - Площадка с несколькими категориями: Алматы · 08.10.2026 · свадьба · Банкетный зал · 3 500 000 ₸, без языка и длительности → Хината Хьюга, Иноскэ Хашибира, Шинобу Кочо. Категории и метки дополненного города/цены сохраняются.
- Некорректный бюджет: нулевое значение в API → HTTP 422.
Для проверки помощника нажмите «Опишу своё событие» и введите:
Алматы, 7 октября 2026, свадьба, ведущий, бюджет 1000000 тенге, казахский язык
Нажмите «Разобрать описание», проверьте распознанные условия, затем «Применить и подобрать». Результат должен совпасть с первым сценарием формы.
Режим /ui/?demo=1 показывает сохранённые примеры интерфейса, а не работу живого API. В обычном режиме ошибка сети не подменяется демонстрационным ответом.
Все демо-кейсы · Ручной чек-лист · JSON с запросами и ожиданиями
Автоматические проверки
Проверено при подготовке этого README, 23.09.2026: срез 8fc152f, macOS, Python 3.12.2, Node.js 24.19.0. Прошли все 105 backend-тестов, 6 тестов помощника, 12 JavaScript-проверок, 7 живых HTTP-сценариев и повторный запрос с тем же порядком карточек. Проверены также раздача /ui/, документация API и разбор примера помощником. Реальные обращения к OpenAI не выполнялись.
Проверенный состав: 123 теста — 105 backend, 12 frontend и 6 помощника. Дополнительно: 7 живых API-кейсов с проверкой повторяемости; календарный тест перебирает 11 200 запросов и проверяет ограничения, порядок и объяснения.
Команды запуска тестов
Выполняйте из recommendation-logic/. Для macOS/Linux замените .\.venv\Scripts\python.exe на .venv/bin/python.
# Backend, API, безопасность и календарь
.\.venv\Scripts\python.exe -m unittest discover -s tests -v
# Клиентские контракты и компоненты интерфейса (Node.js 22+)
node --test qa/frontend-integration.test.mjs
# Текстовый помощник
.\.venv\Scripts\python.exe -m unittest discover -s ../contractor_assistant -t .. -p test_chat.py -v
# Живой сервер: оставьте его запущенным, команду выполните в другом терминале
.\.venv\Scripts\python.exe qa/demo_check.py --base-url http://127.0.0.1:8000
# Нагрузка: скрипт сам запускает отдельный локальный сервер
.\.venv\Scripts\python.exe qa/stress_check.py --output qa-results.json
Эквивалент основных команд для macOS/Linux из recommendation-logic/:
.venv/bin/python -m unittest discover -s tests -v
.venv/bin/python -m unittest discover -s ../contractor_assistant -t .. -p test_chat.py -v
node --test qa/frontend-integration.test.mjs
.venv/bin/python qa/demo_check.py --base-url http://127.0.0.1:8000
Результаты нагрузочного прогона от 23.09.2026
- 10 000 запросов к движку — без расхождений с эталоном.
- 2 000 HTTP-запросов — без ошибок.
- Максимальное время — 6,349 секунды при параллелизме 64.
Это результаты локального окружения, а не гарантия скорости будущего хостинга или отсутствия любых ошибок. Методика и границы проверки: отчёт приёмки · нагрузочные сценарии.
Данные и интеграции
Источник — providers.csv: 66 анонимизированных профилей, из них 13 синтетических. География — Алматы, Астана и «Зарубежье». Календарь — 23.09.2026–31.12.2026, 100 дней.
В каталоге 15 ведущих, 12 фотографов и 8 банкетных залов; в ряде редких категорий — по 3 профиля. Категории могут пересекаться: один подрядчик не превращается в несколько карточек.
Цена «от» — стартовая стоимость мероприятия, не окончательная смета. Синтетические профили, дополненный город и дополненная цена отмечаются независимо. Свободная дата в датасете не подтверждает бронирование.
Каталог интерфейса хранится в frontend/catalog-data.js; тест сверяет его поля с серверным CSV. При изменении данных нужно обновлять оба представления и перезапускать backend. Просмотр карточки в общем каталоге не подтверждает доступность на дату. max_hours = null означает, что услуга не привязана к часам присутствия, а не неограниченную работу. Причины в stats.rejected могут пересекаться, поэтому их сумму нельзя считать числом исключённых профилей.
Опциональная интеграция OpenAI
Используется OpenAI Responses API; модель по умолчанию — gpt-4o-mini, настройка — OPENAI_MODEL. Для включения нужны серверные настройки, ключ и явный параметр API ai_explanations=true. Само наличие ключа не включает ИИ в обычной форме.
Реальные платные вызовы в итоговом QA не проверялись: модельный транспорт тестировался с заглушкой. NVIDIA API в текущий код не интегрирован.
Из recommendation-logic/ скопируйте .env.example в .env (cp .env.example .env на macOS/Linux или Copy-Item .env.example .env в PowerShell), затем отредактируйте локальный файл:
| Переменная | Назначение |
|---|---|
AI_EXPLANATIONS_ENABLED=true | Разрешает использование опционального модуля |
OPENAI_API_KEY | Серверный API-ключ OpenAI |
OPENAI_MODEL | Модель; по умолчанию gpt-4o-mini |
Перезапустите сервер командой из раздела запуска, добавив --env-file .env, затем выполните в Swagger POST /recommendations с ai_explanations=true. Сам файл .env не загружается обычным запуском, а включение модуля не включает его использование основной формой.
Источник объяснений можно проверить по заголовку X-Explanation-Source у /recommendations: rules, ai, ai_cache или fallback. При сбое сохраняется обычная выдача. Таймаут AI — 6 секунд, лимит попыток — 30 на процесс; этот счётчик не заменяет ограничение расходов в аккаунте провайдера. Живой вызов и качество реальной модели в ходе проверки README не оценивались.
Ключи хранятся только на сервере. .env исключён из Git. Настройка и ограничения ИИ →
Для основного сценария внешние API и отдельная БД не нужны; каталог и шрифты загружаются локально.
Ограничения
-
Параметры подбора. Бюджет — только верхний предел. Минимальный бюджет, число гостей, теги и свободные заметки в контракт не входят.
-
Контекст помощника. Клиент передаёт его с каждым запросом; серверного хранилища истории нет. Для даты без года помощник использует 2026 год.
-
Учебный каталог. Анонимизированные данные и заявления профилей не являются проверенной информацией о реальных услугах. Даты вне указанного календаря не принимаются.
-
Рекомендация, не заказ. Нет бронирования, оплаты, отправки заявок или уведомлений. «Связаться» показывает пояснение.
-
Помощник по правилам. Он не гарантирует понимание произвольной речи; распознанные поля нужно подтвердить. Ручная форма всегда доступна.
-
Демо, не готовый публичный сервис. Есть валидация и ограничения запросов, но перед размещением нужны HTTPS, ограничение частоты запросов, защита платного ИИ и проверка зависимостей. См. SECURITY.md.
-
Границы проверки. Живой LLM и публичный хостинг не проверены. Локальные прогоны указаны выше; работа на всех поддерживаемых ОС не подтверждена. Зависимости заданы диапазонами, полного lock-файла нет.
Развёрнутая версия
Подтверждённой публичной версии пока нет. Для проверки используйте локальный сайт после запуска сервера.
127.0.0.1 доступен только на компьютере с запущенным сервером. Push в GitHub сохраняет исходный код, но не размещает сайт в интернете.
Документация
Для демонстрации: Демо-кейсы · Пайплайн · Чек-лист · Отчёт приёмки
Для разработки: Backend · Контракт интеграции · Опциональный ИИ · Безопасность · Нагрузка · Лицензии шрифтов
Авторы коммитов
История коммитов
- 2026-09-23 17:34docs: map project evidence to hackathon criteria and verify README stepsabvglnz
- 2026-09-23 17:31docs: simplify README layout and demo guideБека
- 2026-09-23 17:21docs: align project README with HackAlem submission templateБека
- 2026-09-23 17:07docs: add product README draftTokzhan
- 2026-09-23 17:06docs: add acceptance checklist and test casesTokzhan
- 2026-09-23 17:00docs: mark new venue QA case as pending verificationTokzhan
- 2026-09-23 16:59docs: add venue provenance demo to handoffTokzhan
- 2026-09-23 16:59test: validate venue card categories and provenanceTokzhan
Все коммиты (38)
- 2026-09-23 16:59test: assert venue categories and provenance flagsTokzhan
- 2026-09-23 16:58test: cover multi-category venues and provenance flagsTokzhan
- 2026-09-23 16:57docs: clarify catalog fields in acceptance reportTokzhan
- 2026-09-23 16:56docs: align pipeline with matching implementationTokzhan
- 2026-09-23 16:56docs: align demo cases with catalog previewTokzhan
- 2026-09-23 16:52Complete site integration and handbook; fix acceptance gaps and add full QAБека
- 2026-09-23 16:03Add browsable catalog, dark theme and Russian Kazakh English interfaceabvglnz
- 2026-09-23 15:52Handle all parsed non-positive budgets consistentlyTokzhan
- 2026-09-23 15:51Cover negative budget parser regressionTokzhan
- 2026-09-23 15:51Reject signed non-positive assistant budgetsTokzhan
- 2026-09-23 15:50Fix widget asset markup whitespaceTokzhan
- 2026-09-23 15:50Mount contractor assistant widget on frontendTokzhan
- 2026-09-23 15:50Add isolated contractor assistant API routesTokzhan
- 2026-09-23 15:47Fix invalid budget handling in contractor assistantTokzhan
- 2026-09-23 15:45Add assistant conversation regression testsTokzhan
- 2026-09-23 15:44Clarify event summary with labeled fields and remove duplicated criteriaabvglnz
- 2026-09-23 15:26Add floating assistant widgetTokzhan
- 2026-09-23 15:26Add floating assistant widget stylesTokzhan
- 2026-09-23 15:24feat: parse conversational contractor requestsTokzhan
- 2026-09-23 15:24feat: add separate contractor assistant packageTokzhan
- 2026-09-23 15:19Add pausable scrolling text and orbiting numbers without illustrationsabvglnz
- 2026-09-23 15:10Rebuild search experience with compact criteria and side-by-side recommendationsabvglnz
- 2026-09-23 15:00Redesign Povod with grouped form, editorial layout and explanation-first cardsabvglnz
- 2026-09-23 14:51feat: improve grounded matching explanations and add optional AI evidence selectionБека
- 2026-09-23 14:44Improve frontend form drafts, budget control and accessible result transitionsabvglnz
- 2026-09-23 14:20Connect frontend to live recommendation API and filter metadataabvglnz
- 2026-09-23 14:09Add frontend with recommendation form, API client and mock demoabvglnz
- 2026-09-23 13:59feat: add recommendation logic and API with shared validationБека
- 2026-09-23 13:58docs: describe contractor matching pipelineTokzhan
- 2026-09-23 13:53docs: add three contractor matching demo casesTokzhan
Структура репозитория (69 файлов)
.gitignore README.md contractor_assistant/__init__.py contractor_assistant/chat.py contractor_assistant/test_chat.py contractor_assistant/widget.css contractor_assistant/widget.js docs/README.md docs/acceptance-report.md docs/demo-cases.md docs/pipeline.md docs/test-cases.md frontend/api.js frontend/app.js frontend/assets/fonts/GolosText-OFL.txt frontend/assets/fonts/GolosText-Variable.ttf frontend/assets/fonts/Lora-Italic.ttf frontend/assets/fonts/Lora-OFL.txt frontend/assets/fonts/Lora-Variable.ttf frontend/assets/fonts/Manrope-OFL.txt frontend/assets/fonts/Manrope-Variable.ttf frontend/assets/fonts/README.md frontend/assistant-preview.js frontend/assistant-ui.js frontend/cards.js frontend/catalog-data.js frontend/catalog.css frontend/catalog.js frontend/config.js frontend/fonts.css frontend/form-state.js frontend/guide.js frontend/i18n.js frontend/index.html frontend/mocks.js frontend/motion.js frontend/styles.css frontend/theme.css frontend/theme.js frontend/validation.js recommendation-logic/.env.example recommendation-logic/AI.md recommendation-logic/HANDOFF.md recommendation-logic/README.md recommendation-logic/SECURITY.md recommendation-logic/data/providers.csv recommendation-logic/examples/demo-cases.json recommendation-logic/qa/README.md recommendation-logic/qa/demo_check.py recommendation-logic/qa/frontend-integration.test.mjs recommendation-logic/qa/stress_check.py recommendation-logic/qa/test_known_weaknesses.py recommendation-logic/requirements.txt recommendation-logic/src/__init__.py recommendation-logic/src/ai_explanations.py recommendation-logic/src/api.py recommendation-logic/src/http_safety.py recommendation-logic/src/recommendation.py recommendation-logic/tests/test_ai_explanations.py recommendation-logic/tests/test_api.py recommendation-logic/tests/test_catalog_qa.py recommendation-logic/tests/test_contract_regressions.py recommendation-logic/tests/test_explanation_quality.py recommendation-logic/tests/test_frontend_contract.py recommendation-logic/tests/test_handoff.py recommendation-logic/tests/test_recommendation.py recommendation-logic/tests/test_security.py recommendation-logic/tests/test_spec_acceptance.py recommendation-logic/tests/test_team_update.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.