AAYMA
RU
Войти

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

Городской симулятор: бюджет 100 единиц, 5 синтетических районов, 10 показателей и 14 мероприятий.

Рабочий MVP
Команда «EagleZ» 3💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: EagleZ
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Рабочий MVP

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

Суть

Городской симулятор: бюджет 100 единиц, 5 синтетических районов, 10 показателей и 14 мероприятий. Участник принимает ровно 5 решений и получает Astana Quality of Life Score с объяснением, рисками и предложениями улучшений.

Как устроено

Node.js-сервер без зависимостей (engine.js) проверяет набор мер и пересчитывает показатели на 8 кварталов с лагами, синергиями и ограничением 0–100, затем считает баллы районов и города и находит слабые места (показатели ниже 40). analysis.js раскладывает вклад пяти мер по Шепли на 32 поднабора и ищет три лучших варианта заменой одного решения. ИИ (OpenAI Responses API или NVIDIA API Catalog) только выбирает ID объясняющих фактов из подготовленного сервером списка. По умолчанию работает offline-объяснение.

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

  • значения Шепли
  • локальный поиск одиночной заменой
  • моделирование лагов и синергий
  • выбор фактов LLM по ID

Метрики

Score примера около 56,54 против базовых 52,56; 24 автотеста

Особенности

Атрибуция вклада мер по Шепли и выбор фактов LLM только из серверного списка, поэтому числа не галлюцинируются. Сервер не принимает от браузера готовый Score. Есть однофайловая standalone-демо. Код загружен архивами через «Add files via upload».

Стек

Node.js · HTML · CSS · JavaScript · node:test

Модели

OpenAI Responses API · NVIDIA API Catalog


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

README

README.md

hack-861ce405-eaglez

Hackathon team repository for EagleZ Astana Innovations

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

AI-симулятор городского управления для спец-трека Astana Innovations. Участник распределяет виртуальный бюджет между мерами для пяти синтетических районов, принимает ровно пять решений и получает рассчитанный Astana Quality of Life Score с объяснением сильных сторон, рисков и возможных улучшений.

Проект — учебный симулятор. Данные районов синтетические; баллы не являются оценкой или прогнозом для реальной Астаны.

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

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

Основные пользователи — участники хакатона, городской аналитик или человек, изучающий сценарии распределения бюджета.

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

  • Бюджет 100 условных единиц, пять районов, десять показателей и каталог из 14 мероприятий.
  • Выбор ровно пяти разных мероприятий с проверкой бюджета, обязательного выбора района и ограничений задания.
  • Расчёт последствий мероприятий с учётом восьмиквартального горизонта, лагов, синергий и ограничений показателей от 0 до 100.
  • Расчёт баллов районов и города, самого слабого района и критических показателей ниже 40.
  • Каталог мероприятий с фильтрами и графики показателей районов.
  • Сохранение сценариев в браузере, сравнение и экспорт выбранного сценария в JSON.
  • Поиск трёх лучших найденных вариантов, полученных заменой одного решения за раз. Это локальный поиск, он не гарантирует глобально лучший набор.
  • Распределение вклада пяти выбранных мер методом Шепли по 32 поднаборам. Эти поднаборы используются только для анализа и не являются допустимыми игровыми сценариями.
  • Локальное объяснение без внешней модели; опциональный AI-анализ через OpenAI API или NVIDIA API Catalog.

Пользовательский сценарий

  1. Откройте приложение и выберите готовый пример либо соберите свой набор мер.
  2. Укажите район для районных мероприятий. Городские мероприятия применяются ко всем районам.
  3. Примите ровно пять уникальных решений. Интерфейс показывает стоимость и валидирует ограничения.
  4. Приложение отправляет выбранные ID мероприятий серверу. Сервер заново проверяет набор и сам рассчитывает показатели и Score.
  5. Нажмите «Разобрать сценарий». Локальный анализ доступен всегда; при настроенном и доступном API модель выбирает объясняющие факты из рассчитанного сервером набора.
  6. Изучите риски и найденные улучшения, задайте вопрос о сценарии или сравните сохранённые варианты.

Технологии и интеграции

ЧастьТехнология
Сервер и расчётыNode.js 22+, встроенные модули http, fs, path; внешние npm-зависимости приложению не нужны
ИнтерфейсHTML, CSS и браузерный JavaScript без внешних UI-библиотек
Автоматические тестыВстроенный Node.js test runner (node:test)
OpenAI (опционально)Responses API: https://api.openai.com/v1/responses
NVIDIA (опционально)NVIDIA API Catalog Chat Completions: https://integrate.api.nvidia.com/v1/chat/completions

По умолчанию приложение работает в режиме offline и не вызывает внешние AI-сервисы. Для AI требуется отдельный API-ключ и доступная аккаунту текстовая модель. Подписка ChatGPT/Codex сама по себе не является API-ключом. Поддерживаемый model ID указывается участником в локальном .env; модель не зашита в проект.

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

Архитектура

Браузер (public/)
        │ HTTP, только выбранные решения и вопрос
        ▼
Локальный Node.js сервер (server.js)
        ├── src/engine.js     — данные, правила и точный расчёт Score
        ├── src/analysis.js   — объясняющие факты, вклад мер и улучшения
        ├── src/presets.js    — готовые примеры
        └── src/ai.js         — offline / OpenAI / NVIDIA

Сервер не принимает от браузера готовые Score, стоимость или эффекты: он пересчитывает результат по ID выбранных мер. AI-модель получает результат и проверенные факты, после чего выбирает их ID для объяснения. На экран выводится текст из сервера, а не свободно сгенерированные моделью значения. При отсутствии настройки, ошибке API или некорректном ответе приложение показывает локальное объяснение с причиной перехода в offline.

Основные маршруты локального сервера: GET /api/config, POST /api/validate, POST /api/analyze, POST /api/explain и POST /api/ask.

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

  1. Установите Node.js версии 22 или новее: nodejs.org. При установке оставьте стандартные настройки.

  2. Скачайте и распакуйте проект. В Проводнике откройте папку akim-simulator, внутри которой лежит package.json.

  3. Нажмите на строку пути вверху окна Проводника, введите cmd и нажмите Enter. Откроется командная строка в папке проекта.

  4. Выполните:

    npm start
    
  5. Не закрывая командную строку, откройте в браузере http://localhost:3000.

Успешный запуск выводит адрес Аким на 5 часов: http://localhost:3000 и режим объяснений. Сообщение offline означает, что веб-приложение запущено без подключённого AI API; интерфейс и расчёт Score при этом работают. Чтобы остановить сервер, вернитесь в командную строку и нажмите Ctrl+C.

Команду npm start необходимо выполнять именно в папке, где находится package.json. Если появляется ошибка ENOENT с путём вроде C:\Users\...\package.json, откройте командную строку в папке проекта, а не в домашней папке Windows.

Устанавливать пакеты командой npm install для запуска не требуется. Чтобы выполнить автоматические тесты, откройте вторую командную строку в папке проекта и запустите:

npm test

Подключение AI API (необязательно)

  1. В командной строке, открытой в папке проекта, создайте личный файл настроек:

    copy .env.example .env
    
  2. Откройте файл .env в редакторе и настройте одного поставщика.

    Для NVIDIA:

    AI_PROVIDER=nvidia
    NVIDIA_API_KEY=ваш_личный_ключ
    NVIDIA_MODEL=точный_model_id_из_примера_API_модели
    

    Или для OpenAI:

    AI_PROVIDER=openai
    OPENAI_API_KEY=ваш_личный_ключ
    OPENAI_MODEL=точный_model_id_доступной_модели
    
  3. Сохраните .env, остановите сервер сочетанием Ctrl+C и снова запустите npm start.

  4. Выберите пример в приложении и нажмите «Разобрать сценарий». Метка успешного ответа ИИ: nvidia или ИИ: openai подтверждает, что сервер получил ответ от внешней модели. Наличие ключа в настройках само по себе соединение не подтверждает.

Ключ NVIDIA создаётся в NVIDIA API Keys; подходящую модель и её точный model ID нужно проверить в NVIDIA API Catalog. Для OpenAI API нужен отдельный ключ с доступом и квотой: API keys. Доступность модели, квоты и возможная стоимость зависят от соответствующего аккаунта и сервиса.

Файл .env содержит секрет. Не отправляйте его в чат, не добавляйте в GitHub и не вставляйте ключ в браузерный код. .gitignore исключает .env из Git. Не публикуйте скриншоты, на которых виден ключ.

Проверка для жюри

  1. Запустите приложение по инструкции выше и откройте http://localhost:3000.
  2. Нажмите «Пример задания». Должны появиться пять решений общей стоимостью 95.
  3. Ожидаемый Score примера — около 56,54; исходный Score без действий — около 52,56. Разница связана с вкладом выбранных мер и синергией M10 + M12.
  4. Нажмите «Разобрать сценарий». Без API-ключа появится объяснение с явной меткой offline. С рабочей API-настройкой успешный AI-ответ будет помечен названием провайдера.
  5. Удалите или замените одну меру и проверьте, что интерфейс пересчитывает стоимость, показатели и Score. Для завершённого набора всегда требуется ровно пять решений.

Автоматические проверки запускаются командой npm test. На дату последней проверки в репозитории указано 24 теста; они покрывают правила и серверные маршруты, а AI-провайдеров тестируют имитациями. Автоматические тесты не подтверждают доступ к реальным аккаунтам NVIDIA или OpenAI.

Ограничения текущей версии

  • Данные синтетические, горизонт — восемь кварталов; симулятор не подключён к городским системам и реальным показателям Астаны.
  • Расчёт показывает последствия правил модели, а не доказывает причинный эффект мер в реальном городе.
  • AI не выполняет числовой расчёт и не является свободным чат-ботом: он выбирает объясняющие факты из подготовленного сервером списка.
  • Поиск улучшений проверяет допустимые одиночные замены и не гарантирует глобальный максимум.
  • События, рейтинг команд, общая онлайн-база сценариев и вход пользователей не реализованы.
  • Приложение привязано к 127.0.0.1 и доступно на компьютере, где запущен сервер. Публичная версия не развёрнута.

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

Публичной deployed-версии сейчас нет. Для совместной онлайн-работы проекту потребуется размещённый Node.js сервер и отдельная настройка защиты API-ключей, лимитов и хранения данных.

Структура проекта

ПутьНазначение
public/index.html, public/styles.css, public/app.jsПользовательский интерфейс и его поведение
server.jsЛокальный HTTP-сервер и API приложения
src/engine.jsСинтетические данные, проверка правил и формула Score
src/analysis.jsПроверенные факты, анализ вкладов и поиск улучшений
src/ai.jsOffline-объяснение и адаптеры OpenAI/NVIDIA
src/presets.jsПример задания и экономный пример
dist/akim-standalone.htmlОднофайловая демонстрация без внешнего AI API
scripts/build-standalone.pyСборка однофайловой демонстрации из исходников
.env.exampleШаблон локальной AI-конфигурации без секретов
tests/Автоматические тесты
docs/Инструкции команде, демонстрационный сценарий и отчёт о проверках

Если меняются HTML, стили, логика интерфейса или расчёта, однофайловую демонстрацию можно пересобрать командой python3 scripts/build-standalone.py. Она намеренно работает offline и не должна содержать API-ключи.

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

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

t0xxxapts 9Lia Lee 5

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

  • 2026-09-23 17:55Add files via uploadt0xxxapts
  • 2026-09-23 17:45Delete akim-simulator3_FINAL.zipLia Lee
  • 2026-09-23 17:45Add files via uploadt0xxxapts
  • 2026-09-23 17:42Update README.mdt0xxxapts
  • 2026-09-23 17:40Delete akim-simulator.zipLia Lee
  • 2026-09-23 17:40Delete akim-simulator directoryLia Lee
  • 2026-09-23 17:25Rename akim-simulator3.zip to akim-simulator3_FINAL.zipLia Lee
  • 2026-09-23 17:22Add files via uploadt0xxxapts
Все коммиты (14)
  • 2026-09-23 17:20Revise README with comprehensive project detailst0xxxapts
  • 2026-09-23 16:22Add files via uploadLia Lee
  • 2026-09-23 15:33Add files via uploadt0xxxapts
  • 2026-09-23 15:27Update README to remove unnecessary sectionst0xxxapts
  • 2026-09-23 14:40Enhance README with project information and instructionst0xxxapts
  • 2026-09-23 14:09Add Astana Innovations to READMEt0xxxapts
Структура репозитория (25 файлов)
README.md
akim-simulator/AGENTS.md
akim-simulator/README.md
akim-simulator/docs/DEMO_SCRIPT.md
akim-simulator/docs/START_HERE_RU.md
akim-simulator/docs/TEAM_HANDOFF.md
akim-simulator/docs/VERIFICATION.md
akim-simulator/docs/preview-desktop.png
akim-simulator/docs/preview-mobile.png
akim-simulator/package.json
akim-simulator/public/app.js
akim-simulator/public/index.html
akim-simulator/public/styles.css
akim-simulator/scripts/browser-smoke.cjs
akim-simulator/scripts/build-standalone.py
akim-simulator/server.js
akim-simulator/src/ai.js
akim-simulator/src/analysis.js
akim-simulator/src/engine.js
akim-simulator/src/presets.js
akim-simulator/tests/ai.test.js
akim-simulator/tests/engine.test.js
akim-simulator/tests/server.test.js
akim-standalone.html
akim-standalone.zip

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

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

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