О проекте
Команда: 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 мер и назначения, а не готовые баллы.
Как работает решение
- Интерфейс получает с сервера каталог мероприятий, районы, правила и исходные показатели.
- Пользователь выбирает пять мер и районы либо загружает контрольный пример.
- FastAPI проверяет запрос. Некорректный план получает ошибки валидации; такой запрос не отправляется в LLM.
CitySimulatorприменяет эффекты мер, лаги и синергии, рассчитывает районные показатели, штрафы, бюджет и городской Score.- Интерфейс показывает результат; полный расчёт можно скачать в JSON или представить четырьмя слайдами.
- По отдельной команде AI-аналитик получает проверенный серверный контекст и формирует объяснение на русском языке.
- При необходимости 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
| Показатель | T1 | T2 | E1 | E2 | S1 | S2 | B1 | B2 | C1 | C2 |
|---|---|---|---|---|---|---|---|---|---|---|
| Вес | 0.10 | 0.10 | 0.09 | 0.11 | 0.11 | 0.11 | 0.09 | 0.09 | 0.10 | 0.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 |
| Backend | Python 3.11+, FastAPI, Pydantic 2, Uvicorn, asyncio |
| LLM | OpenAI 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.py | SQL 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/analyze | simulation, assessment и фактический provider_used |
| POST | /api/agent/plan | proposed_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-пути.
Как проверить решение
Сценарий для жюри без ключей
- Запустите приложение и нажмите «Загрузить контрольный пример».
- Убедитесь, что выбраны
M7,M8,M10в Нуре,M12для всего города иM5в Сарыарке. - Сравните результат с контрольными значениями:
| Показатель | Ожидаемое значение |
|---|---|
| Количество мер | 5 |
| Расходы / остаток | 95 / 5 у.е. |
| Базовый Score | 52.55768 |
| Итоговый Score | 56.54307 |
| Изменение Score | +3.98539 |
| Критических показателей | 2 → 0 |
| Штраф города | 2 → 0 |
- Нажмите «Скачать JSON расчёта»: файл содержит показатели и дельты всех пяти районов, бюджет, штрафы, вклады мер и синергий, методику, допущения и предупреждения.
- Нажмите «Собрать слайды расчёта»: откроются четыре слайда по шаблону, без обращения к LLM.
- Смените район одной районной меры: расчёт должен обновиться, а старое 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
- Настройте провайдера и выполните контрольный расчёт. Нажмите «Запустить AI-анализ»: ожидаются оценка, сильные стороны, риски/штрафы и рекомендации. Интерфейс показывает фактически ответившего провайдера.
- В панели «AI-агент: планировщик» выберите цель: городской Score, слабейший район или число критических показателей.
- Нажмите «Предложить план с AI-агентом». Рассмотрите предложенные меры, районы, расходы, сравнение и журнал инструментов.
- До подтверждения корзина не должна меняться. Нажмите «Применить предложенный план» для замены и повторного расчёта.
Агент может стартовать с пустого выбора или улучшать полный допустимый план. Частичный план нужно сначала завершить либо сбросить. Пример запроса — 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_MODE | json_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.
Авторы коммитов
История коммитов
- 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
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.