О проекте
Команда: AI4EDU
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Доведённый продукт
Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам
Суть
Симулятор городского бюджета на Go и React: 5 районов, 14 мер, 5 решений в бюджете 100. Детерминированный движок считает Score, полный перебор находит точный оптимум, а AI-автопилот из четырёх ролей строит план по цели, заданной обычным языком.
Как устроено
Go-движок internal/simulation валидирует сценарий, применяет лаг (8 − L)/8, синергии и ограничение [0,100] и считает Score = 0.7 × среднее по населению + 0.3 × худший район − число критических показателей. Оптимизатор параллельно перебирает все 694 395 допустимых сценариев. Автопилот: мастер формализует цель, независимый аудитор проверяет её, не видя выводов мастера, затем идёт полный поиск на Go, планировщик пишет объяснение, рецензент его проверяет, ошибки возвращаются на исправление. Действуют лимиты бюджета в USD и числа итераций. Отдельный Python-скрипт пересчитывает все числа в точных дробях.
Ключевые решения
- exhaustive search (694 395 scenarios)
- multi-agent roles (master/auditor/planner/reviewer)
- independent verification in exact fractions
- template fallback
- LLM cost budgeting
Метрики
База 52.558; сбалансированный план 56.543 (стоимость 95, 0 критических); точный оптимум 57.237 (стоимость 98, 0 критических) по полному перебору 694 395 сценариев
Особенности
Доказанный потолок модели (57.236735) найден полным перебором, а не эвристикой. Вторая, независимая реализация формулы на Python в точных дробях без общего кода с Go перепроверяет все числа. Аудитор цели изолирован от выводов мастера. Расходы автопилота на LLM учитываются и ограничиваются.
Стек
Go 1.22 · React · TypeScript · Vite · Vitest · Docker Compose · Makefile · Python (verify script)
Модели
gpt-4.1-mini · NVIDIA (опционально)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-395e4fb2-ai4edu.
README
README.md«Аким на 5 часов» — AI-симулятор управления городом
HackAlem AI · Astana Innovations Special Track · команда AI4EDU
Бюджет 100, 5 районов Астаны, 14 мер и ровно 5 решений. Пользователь задаёт цель обычным языком или вручную выбирает мероприятия. Четыре AI-роли — мастер, независимый аудитор цели, планировщик и рецензент — готовят и проверяют план. Детерминированный Go-движок рассчитывает Astana Quality of Life Score, расходы и последствия для районов.
Данные синтетические; Score измеряется в баллах модели, не в процентах. Реальных действий в городе приложение не выполняет.

Проблема и решение
Ресурсы города ограничены, а у решений есть неочевидные последствия: мера начинает работать не сразу (лаг), одни меры усиливают друг друга (синергии), другие несовместимы, а вложения в один район не помогают отстающему. Симулятор позволяет безопасно попробовать разные стратегии и увидеть, как они меняют каждый район и город в целом.
- Проверка сценария: бюджет, ровно 5 уникальных решений, не больше 2 мер одного направления, районные и городские меры, несовместимости.
- Расчёт: эффекты с учётом лага
(8 − L) / 8, синергии, ограничение [0, 100], районные Score, итог0.7 × среднее по населению + 0.3 × худший район − критические. - AI-объяснение: сильные стороны, риски и компромиссы на русском языке.
- Лучший план: точный оптимум полным перебором всех 694 395 допустимых сценариев.

AI-автопилот и проверка чисел
Цель пользователя → мастер + независимый аудитор → согласованные ограничения
→ полный поиск Go → планировщик → рецензент → готовый план
↑ │
исправления цели/объяснения
Аудитор получает только исходную цель и сценарий, без выводов мастера. Разногласие возвращается мастеру; ошибка объяснения — планировщику. Явные численные ограничения бюджета дополнительно проверяет код. Пользователю не нужно выбирать пять решений. Результат, ход работы, оценка расходов и история доступны в AI-автопилоте.
Go проверяет числа и допустимость, а полный поиск подтверждает оптимум для
формализованной цели. LLM может ошибаться даже после рецензии: действия и числа
нужно сверять с результатом Go. Без ключа доступны ручной расчёт и шаблонное
объяснение; автопилот отключён. Прежний /api/advise также сохранён.
Подробные протоколы, ограничения и реальные проверки: docs/autopilot.md.
Результаты
| Сценарий | Стоимость | Score | Критических |
|---|---|---|---|
| Ничего не делать (база) | 0 | 52.558 | 2 |
| Всё вложить в богатый Есиль | 93 | 53.577 | 2 |
| Полезная мера в неудачном месте (M11 в Алматы) | 93 | 55.144 | 1 |
| Сбалансированный golden: M7, M8, M10 → Нура; M12 город; M5 → Сарыарка | 95 | 56.543 | 0 |
| Лучший план: M2, M14 город; M3, M8, M9 → Нура | 98 | 57.237 | 0 |
Потолок текущей фиксированной модели — 57.236735 балла при максимизации городского Score и бюджете 100. Он не означает «57% качества»: нельзя честно обещать более высокий Score без изменения данных, мер или формулы.
Все числа таблицы независимо пересчитывает make verify
(scripts/verify_scores.py): вторая реализация
формулы на Python в точных дробях, без общего кода с Go-движком, плюс
полный перебор для проверки оптимума.
Вклад в один район почти не повышает Score: 30% веса у худшего района и штраф за каждый показатель ниже 40 не дают «забыть» Нуру. Сценарий показа с командами: docs/demo.md.
Документация
- docs/task.md — постановка задачи
- docs/scoring.md — данные, меры и формула Score
- docs/api.md — контракт HTTP API
- docs/autopilot.md — четыре роли, ограничения, стоимость и проверки
- docs/ai-integration.md — прежний советник и опциональная NVIDIA
- docs/demo.md — сценарий показа для жюри
- web/README.md — фронтенд
Быстрый запуск
docker compose up --build
Открыть http://localhost:8080 — сайт и API на одном адресе. Время сборки и
фонового поиска зависит от компьютера; до готовности поиска API возвращает 503 not_ready.
Для AI задайте OPENAI_API_KEY в серверном .env. Создавайте .env из
.env.example только если файла ещё нет; существующие ключи не перезаписывайте.
Без ключа работает шаблонное объяснение. NVIDIA для автопилота не нужна.
Для разработки: Go 1.22+, Make, Node.js 22.22.2+ или 24.15+, npm.
Запустите make run; во втором терминале — cd web, npm ci, npm run dev.
make run загружает .env; прямой go run читает только окружение процесса.
Демо для жюри
- Запустить проект с OpenAI-ключом и открыть AI-автопилот. Ввести: «Максимизируй городской Score при бюджете 100, устрани все критические показатели». Показать четыре роли, результат 57.236735 / стоимость 98 / критических 0 и историю. Следующие шаги показывают ручной сценарий и детерминированный резерв.
- Открыть http://localhost:8080: исходные показатели районов, в Нуре два критических значения (S1, S2 < 40). Базовый Score 52.56 виден на экране результата как «До».
- «Составить план» → добавить M7, M8, M10 → Нура, M12 (город), M5 → Сарыарка → «Рассчитать результат»: Score 56.54, стоимость 95, критических 0, сработала синергия M10 + M12, объяснение с меткой AI или шаблона.
- «Лучший план по модели»: точный оптимум 57.24 (M2, M14; M3, M8, M9 → Нура). Пока фоновый поиск не завершён, интерфейс показывает «Считается…».
- Попробовать нарушить правила (M1 + M3, третью меру соцсферы, перерасход бюджета): Score не выдаётся, показывается причина.
Те же шаги через curl и дополнительные сценарии: docs/demo.md.
Проверка
make check # Go: формат, vet, тесты, race
make verify # независимый пересчёт на Python + полный перебор
cd web && npm ci && npm test # тесты фронтенда
Архитектура
internal/simulation— данные, валидация и детерминированный расчёт Score.internal/explanation— AI-объяснение результата и шаблонный fallback.internal/autopilot— четыре роли, аудит цели, цикл исправлений, бюджет и фоновые задачи.internal/advisor— прежний OpenAI-советник с инструментом симуляции.internal/httpapi— HTTP API расчёта, объяснения и рекомендаций.internal/optimizer— полный перебор сценариев черезsimulation.Simulate.internal/httpapi/web.go— раздача собранного сайта рядом с API.web/— React + TypeScript + Vite; числа получает от API.cmd/server— запуск сервера и настройка из переменных окружения.
Настройки
| Переменная | По умолчанию | Назначение |
|---|---|---|
ADDR | :8080 | Адрес Go API |
OPENAI_API_KEY | пусто | Ключ для живого AI |
OPENAI_MODEL | gpt-4.1-mini | Модель объяснения и резервная модель ролей |
OPENAI_MASTER_MODEL, OPENAI_AUDITOR_MODEL, OPENAI_PLANNER_MODEL, OPENAI_REVIEWER_MODEL | через OPENAI_AGENT_MODEL / OPENAI_MODEL | Индивидуальные модели ролей |
AUTOPILOT_RUN_BUDGET_USD | 0.10 | Оценочный лимит одного запуска |
AUTOPILOT_TOTAL_BUDGET_USD | 50 | Общий лимит локального учёта автопилота |
AUTOPILOT_MAX_ITERATIONS | 3 | Общий лимит итераций, допустимо 1–5 |
AUTOPILOT_BUDGET_FILE | .autopilot/usage.json | Постоянный журнал расходов |
CORS_ORIGIN | пусто | Разрешённый origin отдельного фронтенда |
WEB_DIR | пусто; /web в Docker | Каталог собранного сайта |
HOST_PORT | 8080 | Внешний порт Docker |
По умолчанию: до двух одновременных запусков и 180 секунд на задачу. Четыре
вызова в обычном успешном цикле; до 12 при трёх итерациях, до 20 при пяти.
Повторная формализация не сбрасывает время, итерации и бюджет. Журнал расходов
сохраняется между перезапусками, в Docker — в томе autopilot-state.
Это локальный лимит автопилота, не баланс OpenAI; другие API-вызовы он не учитывает.
Неизвестные модели требуют явных тарифов в переменных из .env.example.
API-ключи хранятся только на сервере. Пользовательская аутентификация не реализована; для публичного доступа нужен внешний контроль доступа к платным маршрутам. Результаты задач хранятся в RAM, история интерфейса — в браузере. Текущие правила допускают несколько мер одного направления, поэтому пять решений не гарантируют охвата всех пяти направлений; это ограничение описано в задании и модели.
Разработка
make web-install — установить зависимости фронтенда; make run — запустить Go API на :8080.
make web-dev — сайт на http://127.0.0.1:5173 с прокси /api (в другом терминале).
make help — все цели.
Авторы коммитов
История коммитов
- 2026-09-23 17:45Merge latest main background styling into integrated appYepSultan
- 2026-09-23 17:43Merge main into ai-integration: combine web visualizations and four-agent autopilotYepSultan
- 2026-09-23 17:39Merge pull request #9 from BAITC-Hacks/style/web-refreshAdilet Rabayev
- 2026-09-23 17:39style: soft animated backgroundadal4ik
- 2026-09-23 17:34feat: add independent goal auditor agentYepSultan
- 2026-09-23 17:24feat: verify optimum and repair agent goal constraintsYepSultan
- 2026-09-23 17:23Merge pull request #8 from BAITC-Hacks/docs/readme-trimAdilet Rabayev
- 2026-09-23 17:22docs: trim README for juryadal4ik
Все коммиты (36)
- 2026-09-23 17:17Merge pull request #7 from BAITC-Hacks/feat/webroka
- 2026-09-23 17:16Update web interface and visualizationsRoka-popka
- 2026-09-23 16:56Merge pull request #6 from BAITC-Hacks/docs/readme-finalAdilet Rabayev
- 2026-09-23 16:55feat: add goal-driven multi-agent city autopilotYepSultan
- 2026-09-23 16:51test: add independent Python score verificationadal4ik
- 2026-09-23 16:51docs: add product overview, screenshots and results to READMEadal4ik
- 2026-09-23 16:31Merge pull request #5 from BAITC-Hacks/feat/serve-webAdilet Rabayev
- 2026-09-23 16:31feat: serve built frontend alongside APIadal4ik
- 2026-09-23 16:19Merge remote-tracking branch 'origin/main' into ai-integrationYepSultan
- 2026-09-23 16:18fix: ground advisor comparisons in verified scenario resultsYepSultan
- 2026-09-23 16:11Merge pull request #4 from BAITC-Hacks/feat/webroka
- 2026-09-23 16:08feat: align web with API contract and optimizerRoka-popka
- 2026-09-23 16:06Merge pull request #3 from BAITC-Hacks/docs/demoAdilet Rabayev
- 2026-09-23 16:05docs: add verified jury demo scenariosadal4ik
- 2026-09-23 16:01Merge remote-tracking branch 'origin/main' into feat/webRoka-popka
- 2026-09-23 16:01feat: add React frontendRoka-popka
- 2026-09-23 15:40Merge pull request #2 from BAITC-Hacks/feat/optimizerAdilet Rabayev
- 2026-09-23 15:36perf: parallel optimizer search and non-blocking startupadal4ik
- 2026-09-23 15:26feat: add exhaustive optimizer and recommendation APIadal4ik
- 2026-09-23 15:21merge: sync backend API docs into AI integrationYepSultan
- 2026-09-23 15:13feat: add AI advisor with verified simulations and NVIDIA reviewYepSultan
- 2026-09-23 15:10upd: READMEYepSultan
- 2026-09-23 15:03Merge pull request #1 from BAITC-Hacks/docs/api-contractAdilet Rabayev
- 2026-09-23 14:57docs: document API contract with verified server examplesadal4ik
- 2026-09-23 14:28docs: add quick start, architecture and demo to READMEadal4ik
- 2026-09-23 14:28chore: add Docker, Compose, Makefile and env exampleadal4ik
- 2026-09-23 14:27feat: add scoring engine, HTTP API and AI explanationadal4ik
- 2026-09-23 13:56docs: add task and scoringadal4ik
Структура репозитория (130 файлов)
.dockerignore .env.example .gitignore Dockerfile Makefile README.md cmd/server/main.go compose.yaml docs/ai-integration.md docs/api.md docs/autopilot.md docs/demo.md docs/images/home.png docs/images/result.png docs/scoring.md docs/task.md go.mod internal/advisor/openai.go internal/advisor/openai_test.go internal/advisor/service.go internal/advisor/service_test.go internal/autopilot/auditor_test.go internal/autopilot/budget.go internal/autopilot/budget_test.go internal/autopilot/config.go internal/autopilot/constraints.go internal/autopilot/constraints_test.go internal/autopilot/live_test.go internal/autopilot/openai.go internal/autopilot/openai_test.go internal/autopilot/optimality.go internal/autopilot/optimality_test.go internal/autopilot/service.go internal/autopilot/service_test.go internal/autopilot/types.go internal/explanation/fallback.go internal/explanation/nvidia.go internal/explanation/nvidia_test.go internal/explanation/openai.go internal/explanation/openai_test.go internal/explanation/service.go internal/explanation/service_test.go internal/httpapi/advise_test.go internal/httpapi/autopilot.go internal/httpapi/autopilot_test.go internal/httpapi/cors.go internal/httpapi/cors_test.go internal/httpapi/demo_test.go internal/httpapi/docs_test.go internal/httpapi/explain_test.go internal/httpapi/handler.go internal/httpapi/handler_test.go internal/httpapi/recommend.go internal/httpapi/recommend_test.go internal/httpapi/web.go internal/httpapi/web_test.go internal/optimizer/goal.go internal/optimizer/goal_test.go internal/optimizer/optimizer.go internal/optimizer/optimizer_test.go internal/simulation/dataset.go internal/simulation/decision_json.go internal/simulation/engine.go internal/simulation/engine_test.go internal/simulation/models.go internal/simulation/regression_test.go internal/simulation/validator.go scripts/verify_scores.py web/.env.example web/.gitignore web/DEMO-CHECK.md web/README.md web/index.html web/package-lock.json web/package.json web/src/App.tsx web/src/api.ts web/src/components/AutopilotDetails.tsx web/src/components/CityScene.tsx web/src/components/DistrictVisualization.tsx web/src/components/ImprovePlan.tsx web/src/components/Layout.tsx web/src/components/Recommendation.tsx web/src/components/ResultCharts.tsx web/src/components/Skyline.tsx web/src/components/city-scene.css web/src/components/common.tsx web/src/components/district-visualization.css web/src/components/districtGeometry.ts web/src/components/skyline.css web/src/components/useSceneMotion.ts web/src/contract.ts web/src/env.d.ts web/src/interface.css web/src/main.tsx web/src/mock-scenario.json web/src/pages/Autopilot.tsx web/src/pages/Decisions.tsx web/src/pages/History.tsx web/src/pages/Overview.tsx web/src/pages/Result.tsx web/src/storage.ts web/src/style.css web/src/types.ts web/src/useAutopilot.ts web/src/usePlanAssessment.ts web/src/validation.ts web/tests/api.test.ts web/tests/app.test.tsx web/tests/assessment.test.tsx web/tests/autopilot-details.test.tsx web/tests/autopilot.test.tsx web/tests/city-animation.test.tsx web/tests/district-flow.test.tsx web/tests/district-visualization.test.tsx web/tests/fixtures/golden-explain.json web/tests/fixtures/golden-improve.json web/tests/fixtures/golden-result.json web/tests/improve-plan.test.tsx web/tests/live-api.mjs web/tests/live-flow.tsx web/tests/recommendation.test.tsx web/tests/result-charts.test.tsx web/tests/setup.ts web/tests/storage.test.ts web/tests/validation.test.ts web/tsconfig.json web/vite.config.ts web/vitest.config.ts web/vitest.integration.config.ts
Ветки (3)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.