AAYMA
RU
Войти

AKIM AI

Симулятор «Аким на 5 часов»: в main лежит frontend на Next.js (планирование, результаты, сравнение сценариев, mock-режим).

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

О проекте

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

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

Суть

Симулятор «Аким на 5 часов»: в main лежит frontend на Next.js (планирование, результаты, сравнение сценариев, mock-режим). Backend на FastAPI с расчётом Score и поиском одной замены и AI-модуль разнесены по отдельным веткам и PR.

Как устроено

Frontend на Next.js 16, Radix, Recharts и Zod показывает каталог из 14 мер, 5 слотов, бюджет, карту районов и сравнение до 12 сохранённых в localStorage сценариев с экспортом в JSON. По README backend (ветка feature/simulation) проверяет ограничения и считает Score с лагами и синергиями, AI (ветка feature/ai) через OpenAI Responses API и Pydantic-схемы формирует сильные стороны, риски и отчёт. В mock-режиме используется сохранённый контрольный пример с пометкой «Шаблон · не AI».

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

  • детерминированный scoring
  • поиск одной замены
  • OpenAI Responses API structured output
  • Zod-валидация контрактов
  • Hypothesis property-тесты

Метрики

Контрольный сценарий: Score 56.54307 при расходе 95

Особенности

Модули велись в отдельных ветках и на момент сдачи не были слиты в main (по README). Поздние коммиты AI-модуля переключились на схемы «meeting analysis», что похоже на переиспользование кода из другого кейса.

Стек

Next.js 16 · React 19 · TypeScript · Tailwind CSS 4 · Radix UI · Recharts · Zod · FastAPI · Pydantic · Vitest

Модели

gpt-6-astra


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

README

README.md

AKIM AI — «Аким на 5 часов»

Пять решений. Бюджет 100. Будущее пяти районов Астаны.

Учебный AI-симулятор городского управления для HackAlem. Команда LODZ POLSKA.

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

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

Возможности · Как работает · Технологии · Запуск · Проверка жюри · Данные · Архитектура · Публикация

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

На 23 сентября 2026 года модули опубликованы в отдельных ветках и ожидают объединения. В main пока находится общая документация. Команды ниже явно выбирают ветку с нужным кодом.

ЧастьЧто есть в кодеВетка / pull request
FrontendГлавная, планирование, результаты, сравнение, адаптивный интерфейс и демонстрационный режимfeature/frontend · PR #2
Backend / simulationFastAPI, проверка ограничений, детерминированный расчёт, вклады мероприятий и поиск одной заменыfeature/simulation · PR #3
AI / reportАнализ рассчитанного сценария через LLM, структурированный ответ и краткий отчётfeature/ai · PR #1
Сквозная интеграцияФорматы frontend/backend сверены; требуются объединение модулей и проверка с провайдеромСм. подключение компонентов

Режимы различаются: демоверсия интерфейса показывает сохранённый контрольный пример; backend рассчитывает произвольные допустимые наборы; настоящий AI требует серверной настройки и завершённой интеграции. В репозитории есть отчёт о проверке интеграции, включая один успешный вызов AI с увеличенным таймаутом. Полный пользовательский сценарий на объединённой версии при штатных лимитах ещё требует проверки.

Для кого и зачем

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

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

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

  • Планирование: пять районов, каталог из 14 мероприятий, поиск и фильтры, бюджет, пять слотов решений, районный и общегородской охват.
  • Последствия: показатели до/после, оценка города и районов, критические значения, синергии, задержки и рассчитанные сервером вклады мероприятий.
  • Объяснение: AI-модуль формирует сильные стороны, риски, компромиссы и рекомендации на основе рассчитанных фактов. Ошибка AI не должна блокировать числовой результат.
  • Сравнение: интерфейс хранит до 12 сценариев в браузере, сравнивает два выбранных плана и выгружает результат в JSON.
  • Поиск улучшения: backend проверяет допустимые варианты с заменой одного решения. Это поиск лучшей одной замены, а не доказательство глобально оптимального плана.
  • Интерфейс: адаптивная компоновка, диаграммы, схема районов, анимации с поддержкой prefers-reduced-motion, управление диалогами и схемой с клавиатуры.

Подробные границы реализации: frontend README, общий API-контракт, AI README.

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

  1. Входные данные: сервер загружает из shared/ исходные показатели пяти районов, каталог 14 мероприятий, бюджет 100 и правила модели. Пользователь видит их на экране планирования.
  2. Выбор: пользователь составляет план из пяти мероприятий и указывает районы для локальных мер. Во время выбора получает предварительный расчёт и сообщения о нарушенных ограничениях.
  3. Проверка: backend проверяет бюджет, количество и уникальность мер, охват, лимит направлений и несовместимости. Недопустимый набор возвращает причины отказа без официального Score.
  4. Расчёт: при финализации сервер повторно проверяет план, учитывает задержки, эффекты и синергии, затем вычисляет показатели районов и итоговый Score. Числа возвращаются в интерфейс для сравнения «до / после».
  5. AI-объяснение: отдельный запрос передаёт выбранный сценарий серверу. Сервер заново рассчитывает решения и передаёт проверенные факты AI-модулю; интерфейс получает сильные стороны, риски, компромиссы и рекомендации с обоснованиями.
  6. Результат: пользователь изучает показатели и объяснение, сохраняет план в браузере, экспортирует JSON или сравнивает его с другим сохранённым сценарием.

Это сценарий режима live. В mock используются локальные данные и сохранённый ответ контрольного примера; сетевой AI-вызов и расчёт произвольных планов не выполняются.

Технологии

КомпонентПодтверждённые технологии
ЯзыкиTypeScript и JavaScript на frontend; Python на backend; CSS; JSON для данных и контрактов
ИнтерфейсNext.js 16.3.6 (App Router), React 19.3.0, TypeScript 6.0.3, Tailwind CSS 4.3.3
Компоненты и графикиRadix UI, Recharts, Lucide; Zod для проверки ответов API
СерверFastAPI 0.141.1, Pydantic 2.13.5, Uvicorn 0.53.0, python-dotenv
AIOpenAI Python SDK 3.19.0, Responses API, структурированные ответы по Pydantic-схеме
ПроверкиVitest, TypeScript, ESLint; pytest, Hypothesis, Ruff; workflow backend-проверок в GitHub Actions
Локальная инфраструктураnpm, Python venv; Dockerfile и Compose для расчётного API; localStorage для сохранённых планов

В AI-провайдере значение модели по умолчанию — gpt-6-astra. Его можно изменить через OPENAI_MODEL; для запуска требуется доступ к выбранной модели в API-проекте. Это значение из кода, а не обещание доступности модели любому аккаунту. Модель объясняет результат; математический движок не использует LLM для расчёта Score.

Версии взяты из frontend/package.json, backend/requirements.txt и backend/requirements-ai.txt. Frontend устанавливается по package-lock.json; Python-зависимости закреплены в requirements-файлах.

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

Репозиторий приватный: для клонирования нужен доступ к нему в GitHub. Зависимости устанавливаются из интернета. Для локальной демонстрации интерфейса и расчётов API-ключ не нужен.

1. Интерфейс — быстрый просмотр

Требуются Git, Node.js 22.20+ и npm. В новом терминале:

git clone --branch feature/frontend https://github.com/BAITC-Hacks/hack-921839cc-lodz-polska.git akim-ai-ui
cd akim-ai-ui/frontend
npm ci
npm run dev

Откройте http://127.0.0.1:3000. По умолчанию включён mock: нажмите «Попробовать пример», чтобы пройти полный интерфейсный сценарий.

В этом режиме только контрольный набор имеет сохранённый результат. Произвольные наборы не получают выдуманный Score; для них нужен backend. Текст объяснения отмечен «Шаблон · не AI».

Production-сборка, из той же папки frontend:

npm run build
npm start

Перед npm start остановите dev-сервер на порту 3000.

2. Backend — реальные расчёты модели

Требуются Git и Python 3.11+; для воспроизводимой проверки используется Python 3.12. Во втором терминале клонируйте расчётную ветку в отдельную папку:

git clone --branch feature/simulation https://github.com/BAITC-Hacks/hack-921839cc-lodz-polska.git akim-ai-api
cd akim-ai-api

Windows PowerShell:

py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r backend/requirements-dev.txt
.\.venv\Scripts\python.exe -m uvicorn app.main:app --app-dir backend --host 127.0.0.1 --port 8000

Linux / macOS:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r backend/requirements-dev.txt
python -m uvicorn app.main:app --app-dir backend --host 127.0.0.1 --port 8000

Для запуска без инструментов тестирования достаточно backend/requirements.txt. Не отделяйте backend/ от shared/: сервер читает общий датасет из репозитория.

Проверьте health и откройте Swagger UI. В POST /api/scenario/finalize нажмите Try it out, вставьте контрольный запрос и выполните его. Ожидаемый итог — 56.54307 при расходе 95.

Подключение компонентов

Для проверки числового сценария UI и API могут работать из двух отдельных копий выше. В akim-ai-ui/frontend/.env.local создайте:

NEXT_PUBLIC_API_MODE=live
NEXT_PUBLIC_API_BASE_URL=http://127.0.0.1:8000
NEXT_PUBLIC_ENABLE_RECOMMENDATIONS=false

Перезапустите npm run dev; для production нужна новая сборка. В URL указывается адрес сервера без /api. Backend по умолчанию разрешает оба origin: http://127.0.0.1:3000 и http://localhost:3000.

Полный локальный запуск с AI

Пока pull request не объединены, собрать существующие модули для проверки можно в новой отдельной папке. Команды ниже берут расчётную ветку за основу и добавляют из других веток только каталоги frontend, AI и отчёта:

git clone --branch feature/simulation https://github.com/BAITC-Hacks/hack-921839cc-lodz-polska.git akim-ai-full
cd akim-ai-full
git restore --source=origin/feature/frontend --worktree -- frontend
git restore --source=origin/feature/ai --worktree -- backend/app/ai backend/app/report

В этой новой копии выполните следующие шаги:

  1. Создайте .venv и установите backend/requirements-dev.txt командами из раздела запуска backend, пока не запускайте Uvicorn.
  2. Установите AI-зависимости. В PowerShell из akim-ai-full: .\.venv\Scripts\python.exe -m pip install -r backend/requirements-ai.txt. В Linux/macOS после активации окружения: python -m pip install -r backend/requirements-ai.txt.
  3. Создайте локальный файл backend/.env с собственным ключом и доступной моделью:
OPENAI_API_KEY=YOUR_API_KEY
OPENAI_MODEL=gpt-6-astra
  1. Создайте frontend/.env.local с тремя NEXT_PUBLIC_* значениями из раздела «Подключение компонентов» выше.
  2. Из akim-ai-full запустите Uvicorn той же командой, что в разделе backend. В другом терминале перейдите в akim-ai-full/frontend, выполните npm ci, затем npm run dev. Остановите предыдущие локальные серверы, если они уже занимают порты 8000 и 3000.
  3. Откройте интерфейс, повторите контрольный сценарий и проверьте AI-панель. Для поиска одной замены после проверки /api/recommend включите NEXT_PUBLIC_ENABLE_RECOMMENDATIONS=true и перезапустите frontend.

Изменения git restore остаются локальными; это способ собрать проверяемые модули, а не публикация объединённого релиза. Для чисто расчётной демонстрации AI-зависимости и ключ не нужны.

Backend начиная с 280a2a2 принимает текущий frontend-запрос {scenario: ...} и возвращает выводы {text, evidence}. Старый вариант {simulation: ...} имеет другой формат ответа и сохранён для обратной совместимости. Используйте имеющийся адаптер интегратора: дополнительное подключение прямых AI-роутеров создаёт дублирующиеся маршруты и обходит серверный пересчёт. Подробности — в API-контракте.

Без AI-модуля, SDK или ключа анализ возвращает HTTP 503; расчётные маршруты продолжают работать. Поле aiConfigured в health отражает настройку адаптера, но не подтверждает успешный ответ внешнего провайдера. Переменные процесса имеют приоритет над backend/.env.

Переменные окружения

ПеременнаяГде задаётсяНазначение
NEXT_PUBLIC_API_MODEfrontend/.env.localmock для примера, live для HTTP API
NEXT_PUBLIC_API_BASE_URLfrontend/.env.localOrigin backend; пустое значение — запросы на текущий origin при настроенном reverse proxy
NEXT_PUBLIC_ENABLE_RECOMMENDATIONSfrontend/.env.localtrue после проверки endpoint поиска замены
CORS_ORIGINSОкружение backendРазрешённые origin через запятую; по умолчанию localhost и 127.0.0.1 на порту 3000
OPENAI_API_KEYbackend/.env или окружение backendСобственный ключ провайдера для AI
OPENAI_MODELbackend/.env или окружение backendДоступная аккаунту модель, поддерживаемая AI-адаптером

Значения NEXT_PUBLIC_* доступны браузеру. Не помещайте туда секреты и не коммитьте настоящие ключи или локальные .env.

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

Демонстрация для жюри

  1. Открыть главную и нажать «Начать управление».
  2. Выбрать Нуру на схеме: изучить показатели, открыть детали мероприятия и его задержку эффекта.
  3. Нажать «Попробовать пример»: пять решений, расход 95, остаток 5.
  4. Нажать «Рассчитать результат»: показать Score 52.56 → 56.54, изменения по районам и исчезновение критических показателей.
  5. Показать объяснение: в mock это явно обозначенный шаблон; настоящий AI демонстрируется после интеграции.
  6. Сохранить сценарий, открыть сравнение и экспортировать JSON. Для сравнения разных рассчитанных планов использовать backend; одинаковые планы должны давать одинаковые результаты.

Контрольный запрос

МераГде применяетсяСтоимость
M7 — школы и детсадыНура24
M8 — поликлиникаНура20
M10 — освещение и камерыНура12
M12 — платформа обращенийВесь город14
M5 — чистое топливоСарыарка25
Итого5 решений95 / 100

Тело запроса к POST /api/scenario/finalize:

{
  "decisions": [
    { "measureId": "M7", "districtId": "nura" },
    { "measureId": "M8", "districtId": "nura" },
    { "measureId": "M10", "districtId": "nura" },
    { "measureId": "M12" },
    { "measureId": "M5", "districtId": "saryarka" }
  ]
}
Проверяемая величинаДоПосле
Astana Quality of Life Score52.5576856.54307
Среднее по населению56.862458.0776
Оценка слабейшего района — Нуры49.1852.9625
Количество индикаторов ниже 4020

Изменение Score — +3.98539, бюджетный остаток — 5. UI округляет числа только для отображения. Запрос и ответы для автоматической проверки доступны в example-scenario.json и shared/fixtures.

Дополнительная проверка через Swagger: отправьте в POST /api/simulate набор M1/Есиль + M3/Нура. Эти меры несовместимы даже в разных районах; ожидается validation.status=invalid и after=null. Для проверки влияния выбора измените район M5 в полном контрольном плане и повторите финализацию: получите новый серверный расчёт вместо сохранённого mock-ответа.

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

Источник / интеграцияЧто используетсяГде подтверждено
Синтетический датасет организаторов5 районов, доли населения и 10 исходных индикаторовshared/districts.json
Каталог мероприятий14 мер: стоимость, охват, задержки и эффектыshared/measures.json
Правила симуляцииБюджет, веса, пороги, синергии, несовместимости и версия моделиshared/model.json
Контрольные примерыВходной план и воспроизводимые ответы расчётного движкаexample-scenario.json, fixtures
Собственный HTTP APIОбмен frontend с FastAPI: JSON, схемы OpenAPI и описанный контрактshared/api-contract.md
OpenAI Responses APIТолько серверный AI-анализ: рассчитанный сценарий и необязательный вопрос; ответ в заданной схемеopenai_provider.py
Браузерное хранилищеЧерновик и сохранённые сценарии на устройстве пользователяfrontend/lib/storage.ts

В проекте нет подключения к реестрам акимата, живой городской статистике, GIS-сервисам или картографическому API. Схема районов локальная. Данные модели хранятся в репозитории; для расчёта не требуется внешний сервис. AI-анализ отправляет рассчитанные данные сценария внешнему провайдеру и требует отдельного API-доступа.

Источник и трактовка исходного задания описаны в разборе требований. Fixtures — контрольные данные для проверки, а примеры ответов AI в его модуле не следует выдавать за новые живые ответы модели.

Расчётная модель

Данные и правила

Пять районов: Есиль, Алматы, Сарыарка, Байконур и Нура. Доли населения — 27%, 24%, 20%, 13% и 16% соответственно. В каждом районе десять индикаторов от 0 до 100; чем выше, тем лучше, включая транспорт и безопасность.

НаправлениеИндикаторыВеса в оценке района
ТранспортT1 — разгрузка дорог; T2 — общественный транспорт0.10; 0.10
ЭкологияE1 — озеленение; E2 — качество воздуха0.09; 0.11
Социальная инфраструктураS1 — школы и детсады; S2 — первичная медицина0.11; 0.11
БезопасностьB1 — улицы; B2 — дорожное движение0.09; 0.09
Городские сервисыC1 — надёжность ЖКХ; C2 — обращения жителей0.10; 0.10

Официальный результат выдаётся только при соблюдении ограничений:

  • бюджет не более 100, ровно 5 разных мероприятий;
  • каждое мероприятие выбирается не более одного раза, даже для разных районов;
  • не более 2 мероприятий одного направления;
  • для районной меры указан район; общегородская применяется ко всем районам;
  • нет несовместимых сочетаний: M1 + M3 в любых районах, M4 + M7 в одном районе, M5 + M13 в одном районе.

По подробному датасету не требуется выбирать ровно по одной мере из каждого направления: действует предел «не более двух». Краткое ТЗ формулирует пять направлений менее подробно; эта трактовка зафиксирована для согласования с организаторами. Остаток бюджета не добавляет баллов.

Формулы

Горизонт — 8 кварталов, L — задержка мероприятия в кварталах:

Учтённый эффект = полный эффект × (8 − L) / 8
Показатель после = clip(исходный + сумма эффектов + синергии, 0, 100)
Оценка района D = сумма(вес индикатора × его значение)
Среднее Davg = сумма(доля населения района × D)
Score = 0.7 × Davg + 0.3 × min(D) − Ncrit

Ncrit — количество пар «район / индикатор» со значением строго ниже 40. Значение 40 не штрафуется. Эффекты сначала суммируются, затем ограничиваются диапазоном; промежуточного округления нет. Порядок решений не меняет результат.

Фиксированные синергии добавляются без коэффициента задержки: M1 + M2 → T1 +2 в районе M1; M10 + M12 → B1 +2 в районе M10; M5 + M6 → E2 +2 в районе M5.

Движок использует точные рациональные числа Fraction, а в JSON отдаёт обычные числа. Вклады мероприятий рассчитываются методом Шепли: усреднением вклада по порядкам добавления. Их сумма соответствует изменению Score, включая синергии и нелинейный штраф.

Единые данные: districts.json, measures.json, model.json. Версия модели и контрольная сумма данных позволяют отличать результаты разных редакций. При невалидном плане официальный Score отсутствует (null), а ответ содержит причины отказа.

Архитектура

flowchart LR
    UI["Next.js / React: интерфейс"] --> API["FastAPI: валидация запросов"]
    API --> Engine["Simulation engine: расчёт"]
    Data["shared: данные и правила"] --> Engine
    Engine --> Result["Проверенный результат"]
    Result --> UI
    Result --> Bridge["Серверный AI-адаптер"]
    Bridge --> LLM["LLM: объяснение"]
    LLM --> Analysis["Анализ и краткий отчёт"]
    Analysis --> UI
    UI --> Storage["localStorage: сохранённые планы"]

Схема показывает устройство объединённого приложения; состояние интеграции указано выше. Числа рассчитывает backend. AI объясняет уже проверенные факты. Браузер не является источником стоимости, эффектов или официального Score.

Структура модулей после объединения веток:

frontend/                   страницы, компоненты, HTTP-адаптер, типы, тесты
backend/app/main.py          сборка приложения FastAPI и CORS
backend/app/api/simulation/  HTTP-маршруты и проверяющий AI-адаптер
backend/app/models/          схемы запросов и ответов
backend/app/simulation/      данные, ограничения, расчёт, поиск улучшения
backend/app/ai/              AI-схемы, prompts, service и провайдер
backend/app/report/          краткий структурированный отчёт
backend/tests/              проверки модели и API
backend/docs/               разбор требований и принятые решения
shared/                     датасет, модель, контракт, OpenAPI, fixtures

API

Расчётные запросы и ответы используют camelCase; текущий AI-запрос содержит scenario с полями snake_case. Полная схема — API-контракт; при работающем сервере доступны /docs и /openapi.json.

МетодМаршрутНазначение
GET/api/healthСостояние приложения, версия и контрольная сумма модели
GET/api/districts, /api/measures, /api/bootstrapДанные районов, каталог и стартовые параметры
POST/api/simulateПредварительный расчёт для 0–5 решений
POST/api/scenario/finalizeПовторная проверка и официальный результат пяти решений
POST/api/recommendПроверенная замена одного решения
POST/api/ai/analyzeАнализ после серверного пересчёта решений из scenario; выводы с evidence
POST/api/explainАнализ по компактному запросу {decisions, question?}
POST/api/report/executive-briefСтруктурированный отчёт по проверенному сценарию

Preview не является официальной финализацией. Бизнес-ошибка simulate/finalize возвращается как HTTP 200 с validation.status=invalid и after=null; неверный формат запроса — HTTP 422; недоступный AI — HTTP 503. Клиент должен проверять содержимое ответа, а не только HTTP-статус.

Проверки

Команды ниже выполняются в соответствующих копиях репозитория. Они проверяют код; сквозной запуск с реальным AI проверяется отдельно после интеграции.

Frontend, из akim-ai-ui/frontend или akim-ai-full/frontend:

npm run test
npm run typecheck
npm run lint
npm run build

Backend, из корня akim-ai-api или akim-ai-full, в отдельном терминале. Активация окружения:

# Windows PowerShell
.\.venv\Scripts\Activate.ps1
# Linux / macOS
source .venv/bin/activate

Затем:

cd backend
python -m pytest --cov=app --cov-report=term-missing
python -m ruff check app/api/simulation app/models app/simulation app/main.py tests scripts
python -m ruff format --check app/api/simulation app/models app/simulation app/main.py tests scripts
cd ..
python backend/scripts/export_fixtures.py

Если PowerShell запрещает активацию, используйте путь к .venv\Scripts\python.exe вместо python, учитывая текущий каталог. Последняя команда заново формирует контрольные ответы в shared/fixtures/.

После локальной сборки модулей или объединения веток и установки зависимостей, из корня проекта:

node backend/scripts/check_frontend_contract.mjs
python backend/scripts/check_ai_contract.py

До объединения Node-скрипт принимает путь к внешней папке frontend первым аргументом; Python-скрипт — --ai-root с путём к внешней папке backend/app. Эти проверки используют контрольные ответы и не обращаются к внешнему LLM.

Проверка форматов frontend 2412b1e и backend 280a2a2 подтвердила совместимость шести серверных fixtures, AI-запроса и примера структурированного AI-ответа. Она не обращалась к внешнему провайдеру.

В отчёте интегратора отдельно зафиксированы 77 прошедших тестов, проверка настоящего HTTP-клиента frontend и успешный вызов gpt-6-astra через FastAPI с настоящим AI-провайдером. Успешный диагностический вызов использовал таймаут 60 секунд; первый запрос при штатных 15 секундах завершился таймаутом. Эти результаты взяты из отчёта в репозитории и не являются заявлением о повторном прогоне всех проверок при редактировании README.

Расчётный backend также содержит Docker-конфигурацию: docker compose up --build из корня его копии. Она поднимает только API на 127.0.0.1:8000; frontend и AI SDK в этот образ не включены. Сборка Docker в рамках этой проверки README не запускалась.

Backend-тесты покрывают контрольные числа, бюджет, количество и повторы мер, несовместимости, отрицательные эффекты, задержки, синергии, границы 0/40/100, независимость от порядка и поиск одной замены. Frontend-тесты проверяют формат и ошибки API, таймауты, отсутствие поддельного результата для произвольного mock-набора и восстановление локальных сохранений.

Сквозная проверка перед сдачей

  • На чистом checkout зависимости устанавливаются по указанным командам.
  • Сервер отдаёт 5 районов и 14 мероприятий; базовый Score равен 52.55768.
  • Контрольный запрос даёт 56.54307, расход 95, остаток 5, ноль критических показателей.
  • Изменённый допустимый набор пересчитывается сервером; проверяются превышение бюджета, повторы, несовместимости и финализация неполного плана.
  • AI-запрос соответствует контракту, вывод объясняет рассчитанные факты; при HTTP 503 числовой результат остаётся доступным.
  • Два разных плана сохраняются и сравниваются; JSON-экспорт содержит результат выбранного плана.
  • Интерфейс проверен на мобильном экране и с клавиатуры, ошибки сети видимы пользователю.

Если что-то не запускается

СимптомЧто проверить
Нет папки frontend или backendВ main пока только документация; выберите нужную ветку из инструкции
UI работает, но свой план не рассчитываетсяВключён mock; подключите расчётный API и перезапустите frontend
Ошибка сети / CORSBackend запущен на 8000; base URL без /api; origin фронтенда разрешён
AI возвращает 422Согласованы ли запрос и ответ AI-адаптера с текущим общим контрактом
AI возвращает 503Подключён ли AI-модуль, установлен ли SDK, задан ли ключ в процессе backend и доступна ли выбранная модель
Порт 3000 занятОстановите предыдущий dev/production-сервер либо согласуйте новый порт и CORS

Критерии хакатона

Таблица связывает критерии из ТЗ с материалами и проверками проекта. Баллы — максимумы организаторов, а не заявленная оценка команды.

КритерийМаксимумЧто демонстрировать и проверять
Соответствие задаче и работоспособность25Единый бюджет и датасет, пять решений, ограничения, пересчёт Score и AI-объяснение; контрольный сценарий и сквозной прогон
Техническая реализация25Разделение UI / engine / AI, серверная валидация, типизированный контракт, точная математика и обработка ошибок
README и воспроизводимость25Требования к окружению, команды запуска, режимы, конфигурация, контрольный JSON с ожидаемыми числами, тесты и устранение ошибок
Ценность и применимость решения15Сравнение бюджетных компромиссов, улучшение слабейшего района, работа с критическими показателями и понятные объяснения
Потенциал развития и оригинальность подхода10Объяснимые вклады мер, проверенная замена одного решения, учёт синергий и задержек, план развития
Всего100Финальная оценка зависит от работающей объединённой версии

Ограничения и развитие

Текущая модель не учитывает все процессы реального города. Схема районов в интерфейсе не является точной географической картой. localStorage относится к конкретному браузеру: это не общая база и не рейтинг команд.

В текущий MVP не входят авторизация, серверное хранение, межкомандный рейтинг, неожиданные городские события и готовый экспорт PDF/PPT. Модуль Executive Brief формирует структурированные данные и Markdown; это ещё не генератор презентаций.

Штатный таймаут backend для AI — 15 секунд, frontend — 20 секунд. В репозитории подтверждён один успешный запрос с увеличенным диагностическим лимитом; стабильное прохождение AI-анализа при штатных настройках ещё не подтверждено. При недоступности провайдера интерфейс должен сохранить расчётный результат и показать ошибку анализа.

Ближайший приоритет — закончить объединение веток и повторить полный пользовательский сценарий с AI при штатных настройках. Дальнейшее развитие: общие сессии команд и рейтинг, наборы городских событий, экспорт презентации, анализ чувствительности сценариев и подключение проверенных открытых данных с отдельной калибровкой модели.

Опубликованная версия

Подтверждённая ссылка на развёрнутое приложение в репозитории не указана. На момент проверки поле Website пустое, GitHub Pages не включён, имеющийся workflow запускает проверки backend и не публикует сайт. Поэтому внешняя demo-ссылка здесь не приводится.

Для проверки жюри доступен локальный запуск. Адреса 127.0.0.1:3000 и 127.0.0.1:8000 работают на компьютере, где запущены компоненты, и не являются deployed-версией.

Работа команды и источники

Зона ответственностиФайлы
Nurali №1 — FRONTENDfrontend/**
Alibek №2 — BACKEND / SIMULATION / INTEGRATORРасчётный backend, shared/**, сборка приложения и общий контракт
Abylay №3 — AI / REPORTbackend/app/ai/**, backend/app/report/**

Общий API-контракт согласуется до изменения форматов. Frontend не дублирует расчётный движок; AI не меняет формулу и исходные данные. Изменения общего контракта сопровождаются обновлением адаптеров и контрольных ответов, после чего повторяется сквозная проверка.

Проект опирается на четыре предоставленных документа:

  1. «HackAlem AI: “Аким на 5 часов”» — задача, обязательные возможности и критерии оценки.
  2. «Датасет районов» — синтетические исходные значения, мероприятия, ограничения и формулы.
  3. «План проекта» — пользовательский сценарий и план реализации.
  4. «Чёткое разделение участников» — границы ответственности и правила интеграции.

Разбор требований сохранён в документации frontend и документации backend. Ссылки на код ниже ведут в рабочие ветки, поскольку они ещё не объединены с main.

Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
74
Авторы
3
Файлы
51
Ветки
4

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

BLaiT12 49Lord 13Justice021 12

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

  • 2026-09-23 17:46docs(ai): mark standalone routes for isolated useBLaiT12
  • 2026-09-23 17:45docs(ai): document trusted production adaptersBLaiT12
  • 2026-09-23 17:43docs(ai): mark standalone router as non-productionBLaiT12
  • 2026-09-23 17:42docs(ai): align module docs with simulation adapterBLaiT12
  • 2026-09-23 17:23Include advice in AI timeout budget while preserving comparison integrationJustice021
  • 2026-09-23 17:19Integrate trusted AI advice and reports; document repository security scanJustice021
  • 2026-09-23 16:43feat(ai): add grounded City Council adviceBLaiT12
  • 2026-09-23 16:39merge: preserve main README updates and participant namesJustice021
Все коммиты (74)
  • 2026-09-23 16:37fix: give AI requests 60 seconds and preserve accurate timeout errorsJustice021
  • 2026-09-23 16:37fix: allow realistic AI generation time with verified timeout handlingJustice021
  • 2026-09-23 16:32Update README.mdBLaiT12
  • 2026-09-23 16:19docs: record live OpenAI analysis verification and timeout limitsJustice021
  • 2026-09-23 16:07chore(ai): remove credentials from env templateBLaiT12
  • 2026-09-23 16:04test(integration): verify frontend and AI contracts and document reproducible setupJustice021
  • 2026-09-23 16:04Update .env.exampleBLaiT12
  • 2026-09-23 15:57Update .env.exampleBLaiT12
  • 2026-09-23 15:49docs(ai): explain local API key setupBLaiT12
  • 2026-09-23 15:48feat(ai): load local backend environment for OpenAIBLaiT12
  • 2026-09-23 15:48feat(backend): implement exact simulation engine and frontend API contractJustice021
  • 2026-09-23 15:41fix(ai): enforce strict structured response fieldsBLaiT12
  • 2026-09-23 15:41docs(ai): document Akim request and response examplesBLaiT12
  • 2026-09-23 15:40docs(ai): add grounded Akim analysis exampleBLaiT12
  • 2026-09-23 15:40docs(ai): add Akim analysis request exampleBLaiT12
  • 2026-09-23 15:39feat(report): polish brief with district comparisonBLaiT12
  • 2026-09-23 15:39feat(report): include district changes and synergiesBLaiT12
  • 2026-09-23 15:34chore(ai): ignore local backend secretsBLaiT12
  • 2026-09-23 15:34docs(ai): add non-secret OpenAI environment templateBLaiT12
  • 2026-09-23 15:29fix(ai): restore Akim structured output providerBLaiT12
  • 2026-09-23 15:29fix(ai): restore Akim integration documentationBLaiT12
  • 2026-09-23 15:29fix(ai): restore Akim package exportsBLaiT12
  • 2026-09-23 15:29fix(ai): restore Akim analysis endpointBLaiT12
  • 2026-09-23 15:29fix(ai): restore Akim scenario analysis serviceBLaiT12
  • 2026-09-23 15:29fix(ai): restore Akim analyst promptBLaiT12
  • 2026-09-23 15:29fix(ai): restore Akim simulation analysis schemaBLaiT12
  • 2026-09-23 15:29Update AGENTS.mdJustice021
  • 2026-09-23 15:27docs(ai): align analyst with on-premise meeting projectBLaiT12
  • 2026-09-23 15:27chore(ai): export meeting analysis interfacesBLaiT12
  • 2026-09-23 15:27feat(ai): expose local meeting analysis endpointBLaiT12
  • 2026-09-23 15:27feat(ai): orchestrate on-premise meeting analysisBLaiT12
  • 2026-09-23 15:26feat(ai): prompt grounded multilingual meeting analysisBLaiT12
  • 2026-09-23 15:26feat(ai): define meeting analysis schemasBLaiT12
  • 2026-09-23 15:26chore(ai): remove cloud provider for on-premise projectBLaiT12
  • 2026-09-23 15:22docs(ai): add provider setup and mount instructionsBLaiT12
  • 2026-09-23 15:21feat(ai): export structured provider factoryBLaiT12
  • 2026-09-23 15:21feat(ai): enable configured OpenAI provider by defaultBLaiT12
  • 2026-09-23 15:21feat(ai): add OpenAI structured output providerBLaiT12
  • 2026-09-23 15:15docs(ai): clarify route factories and integration boundaryBLaiT12
  • 2026-09-23 15:14chore(report): organize route importsBLaiT12
  • 2026-09-23 15:14chore(ai): remove unused route importsBLaiT12
  • 2026-09-23 15:12feat(report): expose executive brief endpointBLaiT12
  • 2026-09-23 15:12feat(ai): expose injectable analysis endpointBLaiT12
  • 2026-09-23 15:06docs(ai): document analyst interface and API proposalBLaiT12
  • 2026-09-23 15:06feat(report): generate structured city management briefBLaiT12
  • 2026-09-23 15:06feat(report): scaffold executive report packageBLaiT12
  • 2026-09-23 15:06feat(ai): implement grounded scenario analysis serviceBLaiT12
  • 2026-09-23 15:05feat(ai): add grounded analyst promptBLaiT12
  • 2026-09-23 15:05feat(ai): define structured analysis schemasBLaiT12
  • 2026-09-23 15:05feat(ai): scaffold analyst packageBLaiT12
  • 2026-09-23 15:02Update AGENTS.md for Astana Innovations special trackJustice021
  • 2026-09-23 17:58Merge latest main into integrated project branchLord
  • 2026-09-23 17:56docs: add complete Russian launch and deployment guideLord
  • 2026-09-23 17:50Merge pull request #2 from BAITC-Hacks/feature/frontendLord
  • 2026-09-23 17:42Fix workflow-level temporary contract path contextLord
  • 2026-09-23 17:40Integrate frontend with simulation, AI and reports; verify shared contractsLord
  • 2026-09-23 17:17feat(frontend): compare verified one-replacement plans and prepare AI comparison integrationLord
  • 2026-09-23 16:32docs: sync jury README with main without changing implementationLord
  • 2026-09-23 16:31docs: align Russian README with all 11 jury requirementsLord
  • 2026-09-23 16:16docs: sync shared project README with main for integrationLord
  • 2026-09-23 16:14docs: document AKIM AI setup, model, demo and hackathon criteriaLord
  • 2026-09-23 12:59Configure AGENTS.md for Education trackJustice021
  • 2026-09-23 15:43chore(frontend): sync current main and preserve integrator-owned root filesLord
  • 2026-09-23 15:41feat(frontend): build Akim AI city simulator with results and scenario comparisonLord
  • 2026-09-23 15:26docs(frontend): publish API proposal and typed UI fixtures for integrationLord
  • 2026-09-23 11:53Add AGENTS.md instructionsJustice021
Структура репозитория (51 файлов)
AGENTS.md
README.md
frontend/.env.example
frontend/.gitignore
frontend/.prettierignore
frontend/.prettierrc.json
frontend/INTEGRATION.md
frontend/README.md
frontend/REQUIREMENTS.md
frontend/app/compare/page.tsx
frontend/app/error.tsx
frontend/app/globals.css
frontend/app/layout.tsx
frontend/app/not-found.tsx
frontend/app/page.tsx
frontend/app/results/page.tsx
frontend/app/simulator/page.tsx
frontend/components.json
frontend/components/catalog.tsx
frontend/components/city-map.tsx
frontend/components/decision-list.tsx
frontend/components/district-panel.tsx
frontend/components/metrics.tsx
frontend/components/provider.tsx
frontend/components/recommendation-panel.tsx
frontend/components/results.tsx
frontend/components/shell.tsx
frontend/components/ui/button.tsx
frontend/components/ui/dialog.tsx
frontend/eslint.config.mjs
frontend/lib/ai-contract.test.ts
frontend/lib/ai-contract.ts
frontend/lib/api.test.ts
frontend/lib/api.ts
frontend/lib/comparison.test.ts
frontend/lib/fixtures.ts
frontend/lib/labels.ts
frontend/lib/recommendation.test.ts
frontend/lib/recommendation.ts
frontend/lib/storage.test.ts
frontend/lib/storage.ts
frontend/lib/test-fixtures/official-result.json
frontend/lib/test-fixtures/recommendation.json
frontend/lib/types.ts
frontend/lib/utils.ts
frontend/next-env.d.ts
frontend/next.config.ts
frontend/package-lock.json
frontend/package.json
frontend/postcss.config.mjs
frontend/tsconfig.json
Ветки (4)

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

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

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