AAYMA
RU
Войти

Аким на 5 часов

Симулятор: калькулятор CitySimulator на FastAPI проверяет план и считает Score.

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

О проекте

Команда: HackMonsters
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Доведённый продукт

Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам

Суть

Симулятор: калькулятор CitySimulator на FastAPI проверяет план и считает Score. AI-аналитик (OpenAI или NVIDIA) объясняет результат, AI-агент с ограниченным tool-calling подбирает и сравнивает альтернативные планы, есть экспорт JSON и 4 слайда.

Как устроено

city_simulator.py применяет эффекты с лагом f(L)=(H−L)/H при H=8 и синергии, затем считает Score = 0,7·D_avg + 0,3·min(D) − N_crit по data/city.json и rules.json. llm_integration.py (LLMRouter на AsyncOpenAI Chat Completions, OpenAI gpt-4o или NVIDIA) выдаёт пояснение строгого формата со ссылками на числовые факты и резервным провайдером. city_agent.py гоняет ограниченный цикл вызовов инструментов симулятора по одной из трёх целей, предложенный план применяется только после подтверждения пользователя. Frontend на React 19 и Vite с Recharts, стриминг анализа.

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

  • детерминированный scoring
  • bounded tool-calling agent
  • LLM routing OpenAI/NVIDIA с fallback
  • ссылки на числовые факты

Особенности

У агента журнал вызовов инструментов, счётчики и лимит одновременных запусков (HTTP 429), а план агента не применяется без явного подтверждения. Результат можно выгрузить готовыми слайдами для питча.

Стек

Python · FastAPI · Pydantic · React 19 · TypeScript · Vite 8 · Recharts · pnpm · PostgreSQL seed SQL · pytest

Модели

gpt-4o · NVIDIA API (модель через NVIDIA_MODEL)


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

README

README.md

Аким на 5 часов

Городской AI-симулятор Астаны — хакатонный проект команды Hackmonsters.

Пользователь собирает план из пяти городских мероприятий при бюджете 100 условных единиц и сравнивает его последствия для пяти районов. Математическое ядро проверяет ограничения и рассчитывает показатели качества жизни, AI-аналитик объясняет результат, а AI-агент предлагает и сравнивает альтернативные планы.

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

Главный принцип: числа считает Python, а не языковая модель. Калькулятор, экспорт JSON и четыре шаблонных слайда работают без API-ключей. AI-функции требуют настроенного внешнего провайдера.

Для жюри: запуск → контрольный сценарий → ограничения → развёрнутая версия.

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

КомпонентВозможности текущей версии
Каталог и план решений14 мероприятий, 5 направлений, выбор районов, контроль расходов и остатка бюджета
Строгая валидацияРовно 5 уникальных мер, бюджет не выше 100 у.е., максимум 2 меры одного направления, проверка назначений и несовместимостей
Математическое ядроЛаги, синергии, изменения 10 показателей каждого района, критические показатели ниже 40 и итоговый Astana Quality of Life Score
ВизуализацияИсходный и итоговый Score, районные баллы, диаграмма показателей и таблица точных дельт
AI-аналитикаОбщая оценка, сильные стороны, риски и штрафы, рекомендации; выбор OpenAI, NVIDIA или автоматического резервирования
AI-агентПодбор и сравнение допустимых планов по одной из трёх целей; журнал инструментов и применение только после подтверждения пользователя
Представление результатаСкачивание полного JSON расчёта, четыре слайда по шаблону, копирование текста и печать слайдов через браузер
API и проверкиFastAPI, интерактивная OpenAPI-документация, автоматические тесты математики, API, LLM-прослойки и агента

Правила выбора

  • Мера типа District требует назначения одного существующего района. Мера типа City действует во всех районах и оплачивается один раз; назначать ей район нельзя.
  • M1 + M3 несовместимы независимо от районов.
  • M4 + M7 и M5 + M13 несовместимы только в одном районе.
  • Синергии M1 + M2, M10 + M12, M5 + M6 действуют в районе соответствующей районной меры. В текущем датасете их бонусы не масштабируются лагом.
  • Сервер берёт стоимость, эффекты и ограничения из своего каталога. Клиент передаёт ID мер и назначения, а не готовые баллы.

Как работает решение

  1. Интерфейс получает с сервера каталог мероприятий, районы, правила и исходные показатели.
  2. Пользователь выбирает пять мер и районы либо загружает контрольный пример.
  3. FastAPI проверяет запрос. Некорректный план получает ошибки валидации; такой запрос не отправляется в LLM.
  4. CitySimulator применяет эффекты мер, лаги и синергии, рассчитывает районные показатели, штрафы, бюджет и городской Score.
  5. Интерфейс показывает результат; полный расчёт можно скачать в JSON или представить четырьмя слайдами.
  6. По отдельной команде AI-аналитик получает проверенный серверный контекст и формирует объяснение на русском языке.
  7. При необходимости AI-агент сравнивает альтернативы. Предложение не меняет текущий выбор до нажатия «Применить предложенный план»; после применения калькулятор снова проверяет план.

Математика

Параметры находятся в data/rules.json, реализация и подробные docstrings — в city_simulator.py.

H = 8 кварталов
f(L) = max(0, (H - L) / H)

x'[d,k] = clip(x[d,k] + сумма эффектов мер с лагом + сумма бонусов синергий, 0, 100)
D[d] = сумма(weight[k] * x'[d,k])
D_avg = сумма(population_share[d] * D[d])
N_crit = количество пар «район × показатель», где x'[d,k] < 40

Score = 0.7 * D_avg + 0.3 * min(D[d]) - N_crit
ПоказательT1T2E1E2S1S2B1B2C1C2
Вес0.100.100.090.110.110.110.090.090.100.10

T — транспорт, E — экология, S — соцсфера, B — безопасность, C — сервисы. Все показатели направлены одинаково: больше означает лучше.

Лаг усредняет эффект за горизонт: при L = H эффект меры равен нулю. Штраф — один балл за каждую критическую пару — вычитается из городского Score, без взвешивания по населению и без уменьшения районного D. Ровно 40 не считается критическим значением. Диапазоном 0–100 ограничиваются показатели, но не итоговый Score. Базовое и итоговое состояния рассчитываются одинаково; округление выполняется на границе JSON-ответа.

Название «5 часов» не задаёт горизонт математической модели: в текущих правилах он равен восьми кварталам.

Технологии

СлойИспользуется в репозитории
ИнтерфейсTypeScript, React 19, Vite 8, CSS
Визуализация и текстRecharts, Lucide React, react-markdown, remark-gfm, rehype-sanitize
BackendPython 3.11+, FastAPI, Pydantic 2, Uvicorn, asyncio
LLMOpenAI Python SDK (AsyncOpenAI), Chat Completions; OpenAI API и совместимый NVIDIA API
МоделиOpenAI: gpt-4o по умолчанию; NVIDIA: ID задаётся в NVIDIA_MODEL, конкретная модель в репозитории не выбрана
Конфигурация и данныеpython-dotenv, JSON; PostgreSQL-совместимый SQL seed для отдельного использования
Проверки и сборкаpytest, HTTPX и HTTP-моки, TypeScript compiler, pnpm

Зависимости перечислены в package.json, requirements.txt и requirements-dev.txt. Frontend-зависимости зафиксированы в pnpm-lock.yaml; Python-зависимости заданы диапазонами версий.

Архитектура проекта

Браузер: React + TypeScript
        │ HTTP JSON: ID мер, районы, выбранный провайдер/цель
        ▼
FastAPI — api.py
        ├── CitySimulator ── data/city.json + data/rules.json
        │       └── проверка плана и детерминированный JSON расчёта
        ├── LLMRouter ── OpenAI / NVIDIA ── проверенное пояснение
        └── CityPlanningAgent
                ├── модель выбирает следующий разрешённый инструмент
                └── инструменты вызывают CitySimulator и сравнивают планы

В собранном режиме FastAPI также раздаёт dist/, поэтому интерфейс и API работают с одного адреса. В режиме разработки Vite проксирует /api на backend.

ПутьНазначение
src/Каталог, корзина решений, визуализация, AI-панель, агент и слайды
api.pyМаршруты, жизненный цикл LLM-клиентов, раздача frontend
city_simulator.pyМодели данных, проверки, формулы и сериализация результата
llm_integration.pyАдаптеры провайдеров, строгий формат пояснения, ссылки на числовые факты и резервирование
city_agent.pyОграниченный цикл вызовов инструментов, сравнение кандидатов и предложение плана
data/Канонические JSON-данные и параметры расчёта
dataset.sql, examples/export_sql.pySQL seed и его генератор из JSON
examples/Запросы, полный пример результата и CLI для его объяснения
tests/Проверки математики, API и поведения AI-интеграции

HTTP API

После запуска доступны Swagger UI и OpenAPI JSON.

МетодПутьРезультат
GET/api/healthСтатус приложения и настроенные провайдеры; не проверяет действительность ключей
GET/api/catalogКаталог, ограничения, методика и исходное состояние
POST/api/simulateПолный JSON расчёта, schema_version="2.0"
POST/simulateСовместимый адрес того же калькулятора
POST/api/analyzesimulation, assessment и фактический provider_used
POST/api/agent/planproposed_plan, simulation, сравнение с базой/текущим планом, журнал, счётчики и requires_confirmation: true

Коды ошибок: 422 — неверный план или структура запроса; 503 — AI не настроен; 502 — AI не завершил корректный ответ; 429 — исчерпан лимит одновременных запусков агента. Ошибка AI не делает отдельный калькулятор недоступным.

Установка и запуск

1. Подготовить окружение

Нужны Git, Python 3.11+ (для команд ниже — 3.12), Node.js 22.12+ и pnpm. В package.json указан [email protected].

Если pnpm ещё не установлен:

npm install --global [email protected]

Клонируйте репозиторий и откройте его папку в VS Code:

git clone https://github.com/BAITC-Hacks/hack-92a11647-hackmonsters.git
cd hack-92a11647-hackmonsters

2. Установить зависимости

Windows / PowerShell, из корня проекта:

py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
pnpm install --frozen-lockfile

Linux / macOS:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
pnpm install --frozen-lockfile

Существующую .venv пересоздавать не нужно. В pnpm-workspace.yaml настроены nodeLinker: hoisted и локальное хранилище, чтобы установка на Windows не зависела от прав на создание символьных ссылок.

3. Собрать интерфейс и запустить один сервер

Windows / PowerShell:

pnpm run build
.\.venv\Scripts\python.exe -m uvicorn api:create_app --factory --host 127.0.0.1 --port 8000

Linux / macOS, с активной .venv:

pnpm run build
python -m uvicorn api:create_app --factory --host 127.0.0.1 --port 8000

Откройте http://127.0.0.1:8000/. На этом этапе уже работают расчёт, JSON и шаблонные слайды. PostgreSQL и API-ключи не нужны. Если порт занят, замените 8000 на 8010 в команде и адресе браузера. Сборка должна существовать до запуска FastAPI; после обновления кода или конфигурации перезапустите сервер.

4. Подключить AI — необязательно для проверки калькулятора

Создайте .env из .env.example, не перезаписывая существующий файл.

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

Для Linux / macOS:

test -f .env || cp .env.example .env

Заполните настройки одного или обоих провайдеров из раздела интеграций и перезапустите backend. Сервер и examples.explain автоматически загружают .env; переменные окружения процесса имеют приоритет. Сам LLMRouter.from_env() читает уже заданное окружение.

Ключи остаются на сервере. .env исключён из Git; не добавляйте ключам префикс VITE_ и не вставляйте их в frontend. Без конфигурации интерфейс показывает недоступность AI, а не подставляет вымышленный ответ.

5. Режим разработки

В первом терминале PowerShell:

.\.venv\Scripts\python.exe -m uvicorn api:create_app --factory --reload --host 127.0.0.1 --port 8000

Во втором терминале:

pnpm dev

Откройте Vite на порту 4173. Прокси в vite.config.ts направлен на 127.0.0.1:8000; если backend использует другой порт, обновите прокси. pnpm preview не заменяет backend. На Linux / macOS используйте python из активной .venv вместо Windows-пути.

Как проверить решение

Сценарий для жюри без ключей

  1. Запустите приложение и нажмите «Загрузить контрольный пример».
  2. Убедитесь, что выбраны M7, M8, M10 в Нуре, M12 для всего города и M5 в Сарыарке.
  3. Сравните результат с контрольными значениями:
ПоказательОжидаемое значение
Количество мер5
Расходы / остаток95 / 5 у.е.
Базовый Score52.55768
Итоговый Score56.54307
Изменение Score+3.98539
Критических показателей2 → 0
Штраф города2 → 0
  1. Нажмите «Скачать JSON расчёта»: файл содержит показатели и дельты всех пяти районов, бюджет, штрафы, вклады мер и синергий, методику, допущения и предупреждения.
  2. Нажмите «Собрать слайды расчёта»: откроются четыре слайда по шаблону, без обращения к LLM.
  3. Смените район одной районной меры: расчёт должен обновиться, а старое AI-пояснение, если оно было, будет отмечено как устаревшее.

Контрольный запрос хранится в examples/official_request.json:

{
  "measure_ids": ["M7", "M8", "M10", "M12", "M5"],
  "district_assignments": {
    "M7": "nura",
    "M8": "nura",
    "M10": "nura",
    "M5": "saryarka"
  }
}

Его можно выполнить через Swagger или из второго терминала PowerShell:

$body = Get-Content examples/official_request.json -Raw
$result = Invoke-RestMethod -Method Post -Uri http://127.0.0.1:8000/api/simulate -ContentType 'application/json' -Body $body
$result.score
$result.budget

Для Linux / macOS:

curl -sS http://127.0.0.1:8000/api/simulate \
  -H 'Content-Type: application/json' \
  --data-binary @examples/official_request.json

Фрагмент ответа для контрольного запроса, не полный JSON-контракт:

{
  "schema_version": "2.0",
  "is_valid": true,
  "budget": {"limit": 100, "spent": 95, "remaining": 5, "unit": "у.е."},
  "score": {"base": 52.55768, "final": 56.54307, "delta": 3.98539}
}

Для отрицательной проверки в Swagger замените один ID повтором другого: API должен вернуть 422, без нового Score и вызова LLM. Полный сохранённый examples/response.json относится к другому запросу — examples/request.json, с мерами M1, M2, M4, M10, M12.

Сценарий с AI

  1. Настройте провайдера и выполните контрольный расчёт. Нажмите «Запустить AI-анализ»: ожидаются оценка, сильные стороны, риски/штрафы и рекомендации. Интерфейс показывает фактически ответившего провайдера.
  2. В панели «AI-агент: планировщик» выберите цель: городской Score, слабейший район или число критических показателей.
  3. Нажмите «Предложить план с AI-агентом». Рассмотрите предложенные меры, районы, расходы, сравнение и журнал инструментов.
  4. До подтверждения корзина не должна меняться. Нажмите «Применить предложенный план» для замены и повторного расчёта.

Агент может стартовать с пустого выбора или улучшать полный допустимый план. Частичный план нужно сначала завершить либо сбросить. Пример запроса — examples/agent_request.json. Результат AI не фиксирован: он зависит от модели и доступности API; при сбое приложение возвращает ошибку, не фиктивный успех.

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

Windows / PowerShell:

.\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt
.\.venv\Scripts\python.exe -m pytest -q
pnpm run typecheck
pnpm run build

На Linux / macOS в активной .venv замените путь к Python на python.

Тесты проверяют формулы и порог 40, ограничения планов, совпадение SQL seed с JSON, контракт API и примеры, точность передаваемого LLM-контекста, резервирование, обработку ошибок, таймауты, отмену и изоляцию запусков агента. AI-тесты используют HTTP-моки и подменённые провайдеры, включая реальный OpenAI SDK, без платных запросов. Их успешное выполнение не подтверждает доступность реальных ключей или конкретной NVIDIA-модели.

Данные и интеграции

Данные симулятора

  • data/city.json — пять районов: Есиль, Алматы, Сарыарка, Байконур и Нура; доли населения, десять исходных показателей каждого района, 14 мер, три синергии и три конфликта.
  • data/rules.json — горизонт, веса показателей и формула Score; версия hackalem-district-dataset-v1, статус confirmed.
  • dataset.sql — PostgreSQL seed для пустой базы. Он генерируется из JSON командой python -m examples.export_sql, которая печатает SQL в stdout. Сам сервер читает JSON; соединение с PostgreSQL не реализовано и для запуска не требуется.
  • Dataset.from_records(...) принимает уже загруженные строки БД, но не устанавливает соединения и не выполняет SQL. Другие пути к JSON можно задать серверными переменными CITY_DATA_PATH и CITY_RULES_PATH.

Код ссылается на командный документ «Датасет районов.docx», однако самого документа и ссылки на первичный статистический источник в отслеживаемых файлах нет. Поэтому воспроизводимой основой этой версии являются данные и правила внутри репозитория. Статус confirmed — поле конфигурации, не свидетельство официального подтверждения городом. Подключения к актуальной муниципальной статистике, картографическим API или данным в реальном времени нет.

AI-провайдеры

ПеременнаяНазначение
OPENAI_API_KEYСерверный ключ OpenAI
OPENAI_MODELМодель OpenAI, по умолчанию gpt-4o
NVIDIA_API_KEYСерверный ключ NVIDIA
NVIDIA_MODELТочный ID модели; обязателен при настройке NVIDIA
NVIDIA_BASE_URLПо умолчанию https://integrate.api.nvidia.com/v1
NVIDIA_OUTPUT_MODEjson_object по умолчанию; также поддержаны адаптером json_schema и nvext, если их принимает endpoint

Достаточно одного настроенного провайдера. Режим auto в HTTP API выбирает OpenAI, затем NVIDIA при ошибке, если она настроена; при наличии только NVIDIA используется она. Явный выбор провайдера не включает резервирование. Некорректная конфигурация LLM может отключить AI целиком, но не калькулятор.

AI-аналитика: сервер отправляет полный результат расчёта и каталог числовых фактов. Модель возвращает четыре поля: general_assessment, strengths, risks_and_penalties, recommendations. Числовые значения цитируются через ссылки вида {{number:0}}; сервер проверяет ссылки и подставляет исходные числа. Лишние поля, неверная схема и числовые символы вне ссылок отклоняются. На провайдера отведено 20 секунд, общий лимит — 45 секунд; внутренние повторы SDK отключены.

AI-агент: модель вызывает только get_catalog, simulate_plan, improve_plan, finish_plan. Поиск сравнивает ограниченное соседство — замену одной меры или перенос районной меры. Завершить можно только одним из лучших уже проверенных кандидатов после сравнения. Цели ранжируются по приоритету:

  • city_score: Score → меньше критических показателей → минимальный районный D → остаток бюджета;
  • weakest_district: минимальный D → Score → меньше критических → остаток;
  • critical_metrics: меньше критических → Score → минимальный D → остаток.

Один запуск ограничен шестью запросами модели, шестью вызовами инструментов и 600 попытками расчёта кандидатов; проверка исходного плана в этот счётчик не входит. Лимиты времени — 25 секунд на провайдера и 60 секунд всего. Резервный провайдер использует тот же общий бюджет. Одновременно разрешены два запуска агента на процесс. Модель NVIDIA должна поддерживать вызовы инструментов: одного JSON-режима для агента недостаточно.

Ограничения

  • Это сценарная модель с фиксированными эффектами, а не прогноз фактического развития города. Данные не обновляются автоматически, статистическая достоверность эффекта мер в репозитории не обоснована.
  • Формат датасета рассчитан ровно на пять районов и 14 мер. Произвольный город и произвольный размер каталога потребуют изменения схемы.
  • Агент не гарантирует глобально оптимальный план. Улучшение выбранной цели может ухудшить другие показатели; дельты показаны отдельно.
  • Проверка числовых ссылок защищает происхождение чисел, но не доказывает смысловую правильность объяснения: LLM может неверно интерпретировать факт. Текст требует критической оценки.
  • AI зависит от сети, доступности модели, ключей, квот и тарификации провайдера. При AI-запросах контекст симуляции передаётся выбранному внешнему сервису.
  • Нет аккаунтов, авторизации, постоянного хранения пользовательских планов, общего rate limiting или контроля расходов по пользователям. Лимит параллелизма агента не заменяет эти механизмы; перед публичным размещением они необходимы.
  • Агент не имеет инструментов для shell, файлов, произвольного доступа к сети или изменения БД. Его кандидаты и история существуют в рамках одного запроса.
  • Ответы передаются обычным HTTP JSON, не SSE-потоком. Отмена в интерфейсе прекращает ожидание; уже отправленный провайдеру запрос может продолжить выполняться и тарифицироваться.
  • Слайды собираются в браузере по шаблону. Генерация дизайна презентации моделью и экспорт в PPTX не реализованы.

Развёрнутая версия

Подтверждённая ссылка на публичную deployed-версию в репозитории не указана. Конфигурации публичного развёртывания и CI/CD среди отслеживаемых файлов нет.

После локального запуска приложение доступно по http://127.0.0.1:8000/, документация API — по http://127.0.0.1:8000/docs. Эти адреса работают только на компьютере, где запущен сервер, и не являются публичной демо-ссылкой.

Исходный код: BAITC-Hacks / hack-92a11647-hackmonsters.

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

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

olzhas250206 13Ruslan 6Асхат 5Ruslan 4Асхат 1

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

  • 2026-09-23 17:58Add files via uploadАсхат
  • 2026-09-23 17:47Resolve integration branch with latest mainRuslan
  • 2026-09-23 17:02Connect dashboard to calculator and validated OpenAI analysisRuslan
  • 2026-09-23 16:18Merge pull request #4 from BAITC-Hacks/integrationRuslan
  • 2026-09-23 16:15Merge branch 'main' into integrationАсхат
  • 2026-09-23 16:13Merge pull request #3 from BAITC-Hacks/codex/fix-city-scoreRuslan
  • 2026-09-23 16:13Build Akim city simulator dashboardАсхат
  • 2026-09-23 16:12Fix city score formula to match the district datasetRuslan
Все коммиты (29)
  • 2026-09-23 16:08Update README.mdАсхат
  • 2026-09-23 17:48Update README.mdolzhas250206
  • 2026-09-23 15:45Merge branch 'main' into frontendRuslan
  • 2026-09-23 17:40Add bounded tool-calling city planning agentolzhas250206
  • 2026-09-23 15:30Update README.mdАсхат
  • 2026-09-23 17:03Connect dashboard to simulator and validated LLM APIolzhas250206
  • 2026-09-23 14:56Merge pull request #1 from BAITC-Hacks/aiRuslan
  • 2026-09-23 14:53Merge branch 'main' into aiRuslan
  • 2026-09-23 14:50Add async LLM integration with OpenAI and NVIDIA supportRuslan
  • 2026-09-23 14:50Update README with team repository informationАсхат
  • 2026-09-23 16:12Add calculator JSON response example for LLM integrationolzhas250206
  • 2026-09-23 15:57Add calculator JSON response example for LLM integrationolzhas250206
  • 2026-09-23 15:45Merge pull request #2 from BAITC-Hacks/frontendolzhas250206
  • 2026-09-23 15:43Add CitySimulator and FastAPI APIolzhas250206
  • 2026-09-23 15:37Merge branch 'main' of https://github.com/BAITC-Hacks/hack-92a11647-hackmonstersolzhas250206
  • 2026-09-23 15:36Add CitySimulator and FastAPI APIolzhas250206
  • 2026-09-23 15:05Add dataset SQLolzhas250206
  • 2026-09-23 15:05dataset.sqlolzhas250206
  • 2026-09-23 15:02Update README.mdolzhas250206
  • 2026-09-23 15:01Update README.mdolzhas250206
  • 2026-09-16 20:37Rename project from HackMonsters to HackWolvesRuslan
Структура репозитория (52 файлов)
.env.example
.gitignore
README.md
akim-na-5-chasov-final-v1.pptx
api.py
city_agent.py
city_simulator.py
data/city.json
data/rules.json
dataset.sql
examples/agent_request.json
examples/explain.py
examples/export_sql.py
examples/official_request.json
examples/request.json
examples/response.json
index.html
llm_integration.py
package.json
pnpm-lock.yaml
pnpm-workspace.yaml
requirements-dev.txt
requirements.txt
rur
src/App.tsx
src/components/AgentPlanner.tsx
src/components/AiAnalysisPanel.tsx
src/components/DecisionCatalog.tsx
src/components/ImpactDashboard.tsx
src/components/PitchCarousel.tsx
src/components/PlanDock.tsx
src/components/TopBar.tsx
src/data.ts
src/hooks/useAnalysisStream.ts
src/hooks/useSimulation.ts
src/lib/pitch.ts
src/lib/simulation.ts
src/main.tsx
src/services/analysisStream.ts
src/services/api.ts
src/services/pitchService.ts
src/styles.css
src/types.ts
src/vite-env.d.ts
tests/test_api_integration.py
tests/test_city_agent.py
tests/test_city_score.py
tests/test_llm_integration.py
tsconfig.app.json
tsconfig.json
tsconfig.node.json
vite.config.ts
Ветки (6)

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

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

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