О проекте
Команда: Nepridumali.ai
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Рабочий MVP
Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам
Суть
Симулятор, в котором пользователь в роли акима выбирает пять инициатив из 14 в пяти направлениях в пределах бюджета 100. Приложение считает влияние на пять синтетических районов и индекс качества жизни Астаны.
Как устроено
Каталог инициатив, районы, синергии и конфликты хранятся в локальных JSON. Backend на Express валидирует сценарий: ровно пять мер, бюджет, отсутствие повторов и конфликтов, лимиты по категориям. Затем детерминированно применяет эффекты с лагами и синергиями к десяти метрикам районов и считает районные оценки, взвешенный городской показатель, число критических метрик и итоговый AQoLS. Эндпоинт /analysis передаёт готовый результат в gpt-4o-mini только для текстового объяснения, без ключа используется fallback. Во frontend есть графики Recharts и сравнение сценариев A/B.
Ключевые решения
- детерминированная симуляция с лагами и синергиями
- валидация ограничений
- взвешенный индекс качества жизни
- A/B сравнение сценариев
- альтернативы с одной заменой
Особенности
Системная инструкция LLM запрещает модели пересчитывать метрики и Score, все числа считает движок. Система предлагает альтернативные сценарии с заменой одной меры.
Стек
TypeScript · React · Vite · Tailwind CSS · Recharts · Node.js · Express · Zod · Vitest
Модели
gpt-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-87aa82da-nepridumali-ai.
README
README.mdAkim for 5 Hours
AI-симулятор городского управления для HackAlem. Пользователь выступает в роли акима: выбирает пять городских инициатив в рамках фиксированного бюджета и получает прогноз их влияния на синтетические показатели районов и индекс качества жизни Астаны.
Зачем проект
Городские решения затрагивают разные районы и сферы одновременно: транспорт, экологию, социальную инфраструктуру, безопасность и городские сервисы. На интуиции трудно сравнить варианты и заметить конфликт мер или перекос в распределении бюджета.
Akim for 5 Hours помогает участнику симулировать такой выбор в прозрачной модели. Решение рассчитано на демонстрацию для жюри HackAlem, а по сценарию использования — на специалистов, которым нужно быстро сравнить ограниченное число городских инициатив.
Все районы, показатели и бюджет в модели синтетические. Это не реальная статистика Астаны и не инструмент для принятия фактических управленческих решений.
Что реализовано
- Интерактивный каталог из 14 инициатив в пяти направлениях: транспорт, экология, социальная сфера, безопасность и сервисы.
- Выбор района для районных инициатив, поиск, фильтрация и сортировка каталога.
- Проверка сценария: ровно пять решений, бюджет 100, отсутствие повторов и конфликтов, ограничения по категориям и корректность области действия инициатив.
- Детерминированная симуляция по пяти синтетическим районам и десяти метрикам с учётом лагов, синергий, ограничений значений и весов населения.
- Расчёт Astana Quality of Life Score, изменений по районам, критических показателей и детерминированных рекомендаций.
- Графики и карточки результатов, детализация района, а также сохранение и сравнение сценариев A и B в состоянии браузера.
- Опциональный AI-анализ: OpenAI получает рассчитанный результат и объясняет его, не пересчитывая показатели.
Как работает решение
- Пользователь выбирает до пяти инициатив и, если необходимо, район их применения.
- Интерфейс сразу показывает ограничения выбора, а сервер повторно валидирует отправленный сценарий.
- Для валидного сценария backend применяет эффекты инициатив к синтетическим метрикам районов с учётом их лагов и синергий.
- Backend рассчитывает районные оценки, взвешенный городской показатель, число критических метрик и итоговый AQoLS.
- Frontend показывает результат, изменения по районам и рекомендации. Отдельно вызывается AI-анализ; при отсутствии ключа OpenAI или ошибке доступен fallback-анализ.
Технологии
| Область | Используется |
|---|---|
| Frontend | React, Vite, TypeScript, Tailwind CSS |
| Визуализация | Recharts |
| Backend | Node.js, Express, TypeScript |
| Валидация | Zod |
| Тесты | Vitest |
| AI | OpenAI API, по умолчанию модель gpt-4o-mini |
| Хранение данных | Локальные JSON-файлы |
База данных, аутентификация, пользовательские аккаунты и Docker в проекте не используются.
Архитектура
frontend/ (React + Vite)
|
| POST /simulate, POST /analysis
v
backend/ (Express)
|- routes/ HTTP-маршруты
|- engines/ валидация, симуляция, оценка, рекомендации, AI-анализ
|- data/loadData.ts загрузка каталога
`- types/ общие TypeScript-типы
|
v
data/ синтетические районы, инициативы, синергии, конфликты
Числа для симуляции рассчитываются в детерминированных движках backend. Маршрут /analysis передаёт результат сценария в OpenAI для текстового объяснения; системная инструкция модели запрещает изменять или вычислять метрики и Score.
Основные HTTP-маршруты:
GET /health— проверка доступности backend.POST /simulate— валидация и расчёт сценария.POST /analysis— AI-объяснение валидного сценария.
Установка и запуск
Требования
- Node.js: для frontend заявлена версия
^20.19.0или>=22.12.0. - npm.
- Ключ OpenAI нужен только для AI-анализа; сама симуляция работает без него.
Шаги
git clone https://github.com/BAITC-Hacks/hack-87aa82da-nepridumali-ai.git
cd hack-87aa82da-nepridumali-ai
npm install
Создайте локальные файлы окружения на основе примеров:
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env
В backend/.env при необходимости укажите:
OPENAI_API_KEY=
OPENAI_MODEL=gpt-4o-mini
PORT=4000
FRONTEND_ORIGIN=http://localhost:5173
Для локального запуска укажите в frontend/.env адрес backend из примера:
VITE_API_URL=http://localhost:4000
Запустите оба приложения:
npm run dev
После запуска frontend доступен по адресу http://localhost:5173, backend — по адресу http://localhost:4000.
Как проверить решение
-
Откройте
http://localhost:5173. -
Выберите следующий сценарий:
M7в районеnura;M8в районеnura;M10в районеnura;M12без района;M5в районеsaryarka.
-
Запустите симуляцию. Это валидный сценарий с бюджетом
95из100. -
Проверьте, что в результатах видны Score до и после сценария, изменения показателей районов и рекомендации. Базовый Score модели равен
52.56. -
Для проверки ограничений попробуйте выбрать меньше пяти мер, повторить инициативу или превысить бюджет: сервер вернёт ошибки валидации и не рассчитает итоговый Score.
Проверка качества кода:
npm run test
npm run typecheck
npm run lint
npm run build
Данные и интеграции
В каталоге data/ находятся локальные исходные данные модели:
districts.json— пять синтетических районов, доли населения и десять метрик;initiatives.json— 14 инициатив, их стоимость, область действия, лаг и эффекты;synergies.json— три правила синергии;conflicts.json— правила несовместимости инициатив.
Единственная внешняя интеграция — OpenAI API. Она необязательна: без OPENAI_API_KEY endpoint анализа возвращает fallback-текст на основе уже рассчитанных сервером данных. Для хранения или получения городских данных внешние API не используются.
Ограничения
- Все входные данные синтетические и локальные; обновления реальной городской статистики нет.
- Нет базы данных, входа пользователей и постоянного хранения сценариев: сравнение A/B живёт только в состоянии frontend.
- AI-анализ зависит от доступности OpenAI API и ключа
OPENAI_API_KEY; при сбое используется fallback. - В репозитории нет подтверждённой публичной deployed-версии. Для frontend и backend предусмотрены переменные окружения для раздельного развёртывания, но действующий URL не указан.
Демо
Публичная ссылка на развёрнутую версию в текущем репозитории отсутствует.
Авторы коммитов
История коммитов
- 2026-09-23 17:20docs: add Russian project READMEAidos Baltabay
- 2026-09-23 17:17docs: add Russian project READMEAidos Baltabay
- 2026-09-23 17:10Expose validated scenario alternatives in dashboardMedetbek Kozhakhmetov
- 2026-09-23 17:07Merge simulation alternative scenariosMedetbek Kozhakhmetov
- 2026-09-23 17:03Merge frontend scenario improvementsMedetbek Kozhakhmetov
- 2026-09-23 17:03Merge AI analysis contractMedetbek Kozhakhmetov
- 2026-09-23 16:54Improve scenario editing, API feedback and frontend accessibilityТвойНикНаГитхабе
- 2026-09-23 16:40feat: enforce ai analysis contractMedetbek Kozhakhmetov
Все коммиты (24)
- 2026-09-23 16:28feat: add single replacement alternativesAidos Baltabay
- 2026-09-23 16:20Integrate validated simulator frontend and harden AI analysisMedetbek Kozhakhmetov
- 2026-09-23 16:03feat(frontend): migrate dashboard to v2 Vite specificationТвойНикНаГитхабе
- 2026-09-23 15:50test: expand simulation engine coverageAidos Baltabay
- 2026-09-23 15:41Merge branch 'feat/simulation-core'Aidos Baltabay
- 2026-09-23 15:39Merge remote-tracking branch 'origin/main' into feat/ai-analysisMedetbek Kozhakhmetov
- 2026-09-23 15:33Replace project specificationAidos Baltabay
- 2026-09-23 15:33chore: add initial shared hackathon workspaceMedetbek Kozhakhmetov
- 2026-09-23 15:30chore: add initial shared hackathon workspaceMedetbek Kozhakhmetov
- 2026-09-23 15:28Build MVP for new project specAidos Baltabay
- 2026-09-23 15:21Replace project specificationAidos Baltabay
- 2026-09-23 15:20feat(frontend): add Russian budget dashboard with typed integration adapterТвойНикНаГитхабе
- 2026-09-23 15:10Refine simulation core public contractAidos Baltabay
- 2026-09-23 15:01Implement deterministic simulation coreAidos Baltabay
- 2026-09-23 14:51docs: update project specificationMedetbek Kozhakhmetov
- 2026-09-23 14:48docs: add shared project specificationMedetbek Kozhakhmetov
Структура репозитория (41 файлов)
.gitignore PROJECT_SPEC.md README.md backend/.env.example backend/package.json backend/src/data/loadData.ts backend/src/engines/aiAnalysisEngine.ts backend/src/engines/recommendationEngine.ts backend/src/engines/scoringEngine.ts backend/src/engines/simulationEngine.test.ts backend/src/engines/simulationEngine.ts backend/src/engines/validationEngine.ts backend/src/routes/analysis.ts backend/src/routes/simulate.ts backend/src/server.ts backend/src/types/index.ts backend/tsconfig.json data/conflicts.json data/districts.json data/initiatives.json data/synergies.json frontend/.env.example frontend/index.html frontend/package.json frontend/postcss.config.js frontend/src/App.tsx frontend/src/components/Charts.tsx frontend/src/components/DistrictCard.tsx frontend/src/components/InitiativeCard.tsx frontend/src/components/KpiCard.tsx frontend/src/lib/api.ts frontend/src/lib/format.ts frontend/src/main.tsx frontend/src/styles.css frontend/src/types/index.ts frontend/src/vite-env.d.ts frontend/tailwind.config.js frontend/tsconfig.json frontend/vite.config.ts package-lock.json package.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.