О проекте
Команда: Алем жив
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Доведённый продукт
Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам
Суть
Веб-симулятор с интерактивной картой Астаны: пользователь выбирает 5 мероприятий из 16 в пределах бюджета 100 единиц и видит изменения по районам и итоговый Astana Quality of Life Score. Результат объясняет AI, есть чат-ассистент на карте.
Как устроено
Java/Spring Boot backend считает модель v2-saraishyk: 6 районов по 10 показателей, эффект мер на горизонте 8 кварталов с учётом задержки, совместимости и синергий. Score = 70% средневзвешенного по населению + 30% слабейшего района − 1 балл за каждый показатель ниже 40. Optimizer перебирает допустимые наборы и сравнивает выбор пользователя с лучшим. GPT-4.1 mini пишет объяснение по дайджесту фактов; числа и меры в тексте проверяются, при ошибке одна самокоррекция, затем шаблон. Next.js + MapLibre показывает геослои Overture (парки, дороги, ЛРТ); сценарии и аккаунты хранятся в PostgreSQL.
Ключевые решения
- детерминированная формула Score
- полный перебор допустимых комбинаций мер
- fact-check ответа LLM с одной самокоррекцией
- JWT-авторизация
- Flyway-миграции
- Overture Maps GeoJSON
Особенности
Сравнение сценария пользователя с оптимальным набором, найденным полным перебором. Реальные геоданные Overture Maps по Астане (parquet → GeoJSON) как пространственный контекст. Защитный слой SimulationLlmTextGuard проверяет числа в тексте LLM. Весь стек поднимается одной командой docker compose, есть healthcheck.
Стек
Java · Spring Boot · Next.js · TypeScript · MapLibre GL · PostgreSQL · Docker Compose · Flyway · Swagger/OpenAPI
Модели
GPT-4.1 mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-61391193-team.
README
README.mdАким на 5 часов
AI-симулятор городских решений · Команда «Алем жив» · HackAlem AI
Распределите бюджет между городскими инициативами и посмотрите, как пять решений меняют качество жизни в районах Астаны. Интерактивная карта, расчёт последствий и объяснение результата помогают увидеть компромиссы до реализации сценария.
6 районов · 16 мероприятий · 5 решений · 100 единиц бюджета
About Project · Model · AI Assistant · Getting Started · Stack · Screenshots · Documentation · Contributors · License
About Project
«Аким на 5 часов» — интерактивный тренажёр управления городом для жителей, аналитиков и участников обсуждения городских инициатив. Пользователь выбирает мероприятия в рамках общего бюджета, а симулятор показывает изменения по районам и итоговый Astana Quality of Life Score.
Что можно сделать
- Исследовать Астану: выбрать район на карте, посмотреть исходные показатели и включить слои инфраструктуры, парков, дорог и ЛРТ.
- Собрать сценарий: выбрать ровно пять мероприятий в направлениях «Транспорт», «Экология», «Соцсфера», «Безопасность» и «Сервисы». У каждого мероприятия есть стоимость, срок проявления эффекта и целевые показатели.
- Оценить результат: сравнить Score до и после, изменения по районам, состояние самого слабого района и число критических показателей.
- Получить объяснение: прочитать разбор рассчитанного сценария. API также сравнивает выбор пользователя с лучшим допустимым набором в текущей модели.
- Спросить ИИ: обсудить выбранный район, мероприятия и результат сценария с помощником прямо на карте.
- Работать с аккаунтом: зарегистрироваться и войти через интерфейс; API поддерживает сохранение сценариев и историю пользователя в PostgreSQL.
Model
Расчётная модель v2-saraishyk описывает шесть районов Астаны: Есиль, Алматы, Сарыарку, Байконур, Нуру и Сарайшык. У каждого района есть десять показателей от 0 до 100 — от доступности транспорта и школ до качества воздуха и надёжности ЖКХ.
Вы выбираете 5 мероприятий из 16 при бюджете 100 единиц. Модель оценивает их эффект на горизонте 8 кварталов: учитывает время реализации, совместимость и взаимное усиление мер. Например, если эффект проявляется через два квартала, в расчёт входит 6/8 его полной величины.
Итоговый Astana Quality of Life Score складывается из трёх частей:
- 70% — средний балл районов с учётом доли населения.
- 30% — балл самого слабого района.
- Минус 1 балл за каждый показатель района ниже 40.
Такой подход поощряет улучшение города в целом и помощь отстающим районам. Backend также перебирает допустимые сочетания мероприятий и находит лучший сценарий по этим правилам, чтобы сравнить его с вашим выбором. Одинаковый набор решений всегда даёт одинаковый Score.
Формула и ограничения подробно описаны в документации модели.
Показатели, стоимость и эффекты мероприятий основаны на синтетическом конкурсном датасете. Симулятор предназначен для обучения и сравнения сценариев, а геоданные служат пространственным контекстом. Результаты не являются прогнозом реальных последствий или официальной городской статистикой.
AI Assistant
ИИ-ассистент помогает разобраться в данных города и своих решениях. Откройте панель «Спросить ИИ» и задайте вопрос, например: «Что известно о выбранном районе?» или «Как мои решения повлияли на результат?». Чат доступен после входа в аккаунт.
Помощник получает контекст текущего экрана: выбранный район и его статистику, список мероприятий, бюджет и результат расчёта. Это позволяет обсуждать свой сценарий без повторного ввода всех данных. Ответы приходят на русском языке; точные показатели можно сверить с карточками района и экраном результатов.
По умолчанию чат и объяснение результата используют GPT-4.1 mini (gpt-4.1-mini-2025-04-14) через OpenAI API. Языковая модель формулирует ответы, а числовой Score рассчитывается по правилам симулятора. Модель можно изменить через SIMULATION_LLM_MODEL.
На экране результатов раздел AI Analysis объясняет итог, основные риски и сравнение с лучшим сценарием. Backend проверяет числа и упомянутые мероприятия в этом объяснении; если проверка не проходит, запрашивает одно исправление и при необходимости возвращает шаблонный текст. Сильные стороны, риски и рекомендации в отдельных списках формируются по правилам расчёта.
Для подключения добавьте OPENAI_API_KEY в .env и перезапустите проект командой docker compose up -d --build. Ключ используется на серверах Next.js и backend и не передаётся браузеру. Без ключа или при недоступности API чат не сможет ответить, но симуляция продолжит работать с шаблонным объяснением результата.
Getting Started
Требования
- Git — чтобы клонировать репозиторий.
- Запущенный Docker Desktop с Linux-контейнерами либо Docker Engine с Compose v2.
- Свободные порты
3000,8081и5432.
Node.js, Java и PostgreSQL устанавливать на компьютер для Docker-запуска не нужно: окружение собирается внутри контейнеров. При первой сборке требуется интернет для загрузки образов и зависимостей; подложка карты также загружается из сети.
1. Получите проект
git clone https://github.com/BAITC-Hacks/hack-61391193-team.git
cd hack-61391193-team
Если репозиторий уже скачан, откройте терминал в его корне — рядом с compose.yaml.
2. Запустите весь проект
Команда подходит для PowerShell, macOS и Linux. Она использует готовые локальные настройки из .env.example; API-ключ для первого запуска не требуется.
docker compose --env-file .env.example up -d --build --wait --wait-timeout 180
Compose собирает и запускает три сервиса:
| Сервис | Что внутри | Адрес на компьютере |
|---|---|---|
frontend | Интерфейс Next.js: карта, каталог мероприятий, результат сценария, вход и регистрация | http://localhost:3000 |
backend-akim | Java API: расчёт, справочники, геоданные, авторизация и история | http://localhost:8081/api/v1 |
postgres | PostgreSQL: аккаунты, каталог районов и сохранённые сценарии | localhost:5432 |
PostgreSQL стартует первым. Backend ожидает готовности БД и применяет миграции Flyway; frontend запускается после готовности backend. Внутри Docker интерфейс обращается к http://backend-akim:8080 — этот адрес уже настроен в Compose.
Если у вас уже настроен собственный .env, используйте его вместо примера:
docker compose up -d --build --wait --wait-timeout 180
3. Откройте приложение
Откройте localhost:3000 в браузере. Выберите район на карте, добавьте пять мероприятий в пределах бюджета и нажмите «Подвести итог». Вы увидите оценку города и объяснение результата. Регистрация для этого не нужна.
Для разработчиков: документация API и проверка запросов в Swagger.
Проверка и управление
# Статус контейнеров
docker compose --env-file .env.example ps
# Логи приложения
docker compose --env-file .env.example logs -f frontend backend-akim
# Остановка с сохранением данных PostgreSQL
docker compose --env-file .env.example down
Для своего .env уберите --env-file .env.example из этих команд. Данные PostgreSQL хранятся в именованном томе postgres-data и сохраняются после обычного down.
| Проверка | Ожидаемый результат |
|---|---|
docker compose ... ps | Три работающих контейнера; backend-akim и postgres имеют статус healthy |
| Соединение с БД | {"status":"UP"} |
| API через frontend | JSON с правилами симуляции и modelVersion: "v2-saraishyk" |
Свои настройки и AI-объяснение
Для изменения портов, реквизитов или подключения AI создайте .env на основе .env.example. Если .env уже существует, отредактируйте его, сохранив текущие значения.
| Переменная | Назначение | Значение в примере / по умолчанию |
|---|---|---|
FRONTEND_PORT | Внешний порт интерфейса | 3000 |
BACKEND_PORT | Внешний порт API | 8081 |
POSTGRES_PORT | Внешний порт PostgreSQL | 5432 |
POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD | Подключение backend и контейнера БД | Локальные значения в .env.example |
JWT_SECRET, JWT_TTL_SECONDS | Подпись и время жизни токенов | Ключ для разработки; 3600 секунд |
ADMIN_EMAIL, ADMIN_PASSWORD, ADMIN_USERNAME | Администратор, создаваемый при первом запуске | [email protected] / Admin / admin |
OPENAI_API_KEY | Ключ для чата и AI-объяснения результата | Пусто; для расчёта не требуется |
SIMULATION_LLM_MODEL | Языковая модель чата и объяснения | gpt-4.1-mini-2025-04-14 |
SIMULATION_LLM_URL | Адрес API для объяснения на backend; чат использует OpenAI API | По умолчанию OpenAI Chat Completions |
После изменения .env примените настройки:
docker compose up -d --build --wait --wait-timeout 180
Ключ используется серверной частью чата и backend. Поведение чата и объяснения без подключения описано в AI Assistant. Секреты храните в .env, который исключён из Git. Реквизиты из примера предназначены для локальной разработки.
Что лежит в репозитории
.
├── frontend/ # Next.js: страницы, карта, сценарии и формы входа
│ ├── src/ # Компоненты, API-клиент и серверные маршруты сессии
│ └── public/ # Статические ресурсы и данные карты
├── backend-akim/ # Java / Spring Boot API
│ └── src/
│ ├── main/ # Расчёт, REST API, авторизация, каталог и миграции БД
│ └── test/ # Тесты backend
├── data1/overture/astana/ # Подготовленные GeoJSON и статистика районов
├── docs1/ # Датасет, OpenAPI, примеры запросов и описание модели
│ └── screenshots/ # Скриншоты интерфейса для README
├── scripts/ # Обработка геоданных, запуск и smoke-проверки
├── deploy/ # Отдельная конфигурация развёртывания с туннелем
├── compose.yaml # Локальный стек: frontend + backend + PostgreSQL
├── .env.example # Образец настроек локального запуска
├── Readme-backend.md # Подробный контракт API и правила расчёта
└── README.md # Обзор и быстрый старт
Если не запускается
| Симптом | Что проверить |
|---|---|
| Docker не может подключиться к daemon | Запущен ли Docker Desktop и выбран ли режим Linux-контейнеров |
| Порт уже занят | Измените соответствующий *_PORT в .env и запускайте Compose без --env-file .env.example |
Backend не стал healthy | Посмотрите docker compose --env-file .env.example logs --tail=100 backend-akim postgres; проверьте настройки БД и JWT_SECRET |
| На карте нет подложки | Проверьте доступ к интернету и OpenFreeMap |
Stack
| Слой | Технологии | Роль |
|---|---|---|
| Frontend | Next.js 16.3.6, React 19.2.8, TypeScript, Tailwind CSS 4 | Интерфейс и серверный прокси к API |
| Карта и визуализация | MapLibre GL JS, OpenFreeMap, Three.js | Интерактивная карта и 3D-превью мероприятий |
| Backend | Java 21, Spring Boot 4.1.1, Maven | REST API, валидация, детерминированный расчёт и оптимизация |
| Данные | PostgreSQL 16, Spring Data JPA / JDBC, Flyway | Хранение аккаунтов, районов, сценариев и миграции |
| Авторизация | Spring Security, JWT, BCrypt, HttpOnly cookie | Вход, роли и серверная сессия frontend |
| AI | GPT-4.1 mini, OpenAI Chat Completions API | Чат о городе и сценарии; объяснение результата с проверкой чисел на backend |
| Геоданные | Overture Maps, OpenStreetMap, GeoJSON; Python / DuckDB для подготовки | Слои города и пространственная статистика |
| Инфраструктура и проверки | Docker Compose, Actuator, OpenAPI / Swagger UI, JUnit, Testcontainers, ESLint | Сборка, диагностика, документация и тестирование |
Поток данных при локальном Docker-запуске:
Браузер → Next.js :3000 → Spring Boot :8080 → PostgreSQL :5432
│
└→ API модели (необязательно)
В этой схеме указаны внутренние порты сервисов; на компьютере API опубликован на 8081. Версии frontend зафиксированы в package-lock.json, Java-зависимости — в pom.xml.
Screenshots
Карта и каталог мероприятий
Выбор района, фильтры направлений, стоимость и ожидаемые эффекты городских инициатив.

Результат сценария
Итоговый Score, изменение относительно исходного состояния, использованный бюджет и выбранные решения.

Карта с AI-помощником
Панель «Спросите про город»: вопросы о выбранном районе, мероприятиях и своём сценарии рядом с картой.

Documentation
| Материал | Что найти |
|---|---|
| Backend и API | Эндпоинты, авторизация, история, ошибки, формула Score и настройка PostgreSQL |
| Frontend | Запуск интерфейса для разработки и работа с сессией |
| OpenAPI | Сохранённая схема для импорта в Postman или Swagger Editor; актуальная схема доступна у запущенного API по /v3/api-docs |
| Пример сценария | Пять решений стоимостью 95 единиц для проверки расчёта |
| Сценарий с Сарайшыком | Пример для модели шести районов |
| Геоданные | Состав слоёв, происхождение, ограничения и атрибуция |
| Сарайшык и модель данных | Источники, синтетические показатели и расчёт весов районов |
| Городские сервисы | Мероприятия M15 и M16, параметры и обоснование |
Проверки при разработке
Для локальных проверок backend нужен JDK 21; интеграционные тесты с Testcontainers используют Docker. Команды выполняются из backend-akim/:
# Windows / PowerShell
.\mvnw.cmd test
# macOS / Linux
bash ./mvnw test
Для frontend используйте Node.js 22 и npm, команды выполняются из frontend/:
npm ci
npm run lint
npm run build
Contributors
Проект команды «Алем жив» для HackAlem AI.
| Участник | Направление | Вклад |
|---|---|---|
| Arsen · @math-lover47 | AI / ML | Первоначальный AI/ML-прототип и пайплайн Laya |
| Zhunis Ayanat · @barcek2281 | Backend | Java API, расчёт сценариев, работа с данными и документация |
| @Rask1lll | Frontend | Интерфейс, интерактивная карта и пользовательские сценарии |
License
Лицензия исходного кода пока не указана: в репозитории отсутствует файл LICENSE.
Для геоданных в проекте указана отдельная атрибуция:
© OpenStreetMap contributors, Overture Maps Foundation
Согласно описанию данных, слои building, segment и land_use распространяются по ODbL, place — по CDLA-Permissive-2.0. Атрибуция источников отображается на карте.
Авторы коммитов
История коммитов
- 2026-09-23 17:54Merge pull request #8 from BAITC-Hacks/front-endRask1lll
- 2026-09-23 17:54refactor: replace Home page content with DistrictMap componentRask1lll
- 2026-09-23 17:51Merge pull request #7 from BAITC-Hacks/backendZhunis Ayanat
- 2026-09-23 17:50feat: add animated previews for municipal service measuresRask1lll
- 2026-09-23 17:50backend: ридмиbarcek2281
- 2026-09-23 17:45Merge pull request #6 from BAITC-Hacks/front-endRask1lll
- 2026-09-23 17:44Merge remote-tracking branch 'origin/front-end' into front-endRask1lll
- 2026-09-23 17:43feat: redesign Home page layout with introductory content and navigationRask1lll
Все коммиты (40)
- 2026-09-23 17:42feat: enhance frontend and backend integration with new environment variables and UI improvementsRask1lll
- 2026-09-23 17:30Results: comparison with the model's best plan, AI/template badge, Saraishyk on the map; add missing three dependencyArsen
- 2026-09-23 17:27Merge pull request #5 from BAITC-Hacks/front-endRask1lll
- 2026-09-23 17:27Merge branch 'main' into front-endRask1lll
- 2026-09-23 17:25AI explanation: fact digest, fact check with one self-correction, best-plan comparison; remove unused Laya/ML stackArsen
- 2026-09-23 17:24feat: add frontend service to Docker Compose and update environment configurationRask1lll
- 2026-09-23 17:20chore: update dependencies and improve error handling in proxyRask1lll
- 2026-09-23 17:09Merge pull request #4 from BAITC-Hacks/backendZhunis Ayanat
- 2026-09-23 17:08backend: новые мероприятияbarcek2281
- 2026-09-23 17:07refactor: enhance API response handling and update UI componentsRask1lll
- 2026-09-23 17:04Merge origin/main into front-endRask1lll
- 2026-09-23 16:43Merge pull request #3 from BAITC-Hacks/backendZhunis Ayanat
- 2026-09-23 16:41Merge branch 'main' into backendbarcek2281
- 2026-09-23 16:40backend: сарайшык и лрт добавленыbarcek2281
- 2026-09-23 16:35refactor: enhance DistrictMap component and update README.mdRask1lll
- 2026-09-23 16:18refactor: update authentication flow and improve README.mdRask1lll
- 2026-09-23 16:13Merge remote-tracking branch 'origin/main' into front-endRask1lll
- 2026-09-23 16:10feat: backend integrationRask1lll
- 2026-09-23 16:02Update README.md to include details on login and registration functionality. Enhance globals.css with new styles for authentication screens, including layout, form elements, and responsive design adjuRask1lll
- 2026-09-23 15:54Merge pull request #2 from BAITC-Hacks/backendZhunis Ayanat
- 2026-09-23 15:53Merge branch 'main' into backendbarcek2281
- 2026-09-23 15:52backend: 3rd commit, auth + analyzebarcek2281
- 2026-09-23 15:51Update pom.xml to change resource directory path and enhance next.config.ts with API rewrites. Remove unused district-map.tsx component to streamline frontend codebase.Rask1lll
- 2026-09-23 15:13Merge remote-tracking branch 'origin/main' into front-endRask1lll
- 2026-09-23 15:12Enhance DistrictMap component with selection reset functionality and responsive layout. Update CSS for improved styling and structure, including new brand and selection panel designs. Simplify page stRask1lll
- 2026-09-23 15:11Merge pull request #1 from BAITC-Hacks/backendZhunis Ayanat
- 2026-09-23 14:59Merge branch 'main' into backendbarcek2281
- 2026-09-23 14:58backend: second commit, added backend readmebarcek2281
- 2026-09-23 14:49Update project structure and dependencies for interactive district map in Astana. Added MapLibre GL for mapping functionality, updated ESLint configuration, and modified README for project clarity. EnRask1lll
- 2026-09-23 14:36Scaffold hackathon stack: Laya, Docker Compose, and fine-tune pipeline.Arsen
- 2026-09-23 14:19init frontRask1lll
- 2026-09-23 13:43backend: first commitbarcek2281
Структура репозитория (181 файлов)
.env.example .gitignore README.md Readme-backend.md backend-akim/.gitattributes backend-akim/.gitignore backend-akim/.mvn/wrapper/maven-wrapper.properties backend-akim/Dockerfile backend-akim/Dockerfile.dockerignore backend-akim/mvnw backend-akim/mvnw.cmd backend-akim/pom.xml backend-akim/src/main/java/astana/innovation/backendakim/BackendAkimApplication.java backend-akim/src/main/java/astana/innovation/backendakim/auth/AccountRepository.java backend-akim/src/main/java/astana/innovation/backendakim/auth/AdminAccountInitializer.java backend-akim/src/main/java/astana/innovation/backendakim/auth/AdminController.java backend-akim/src/main/java/astana/innovation/backendakim/auth/AuthController.java backend-akim/src/main/java/astana/innovation/backendakim/auth/AuthExceptionHandler.java backend-akim/src/main/java/astana/innovation/backendakim/auth/AuthResponse.java backend-akim/src/main/java/astana/innovation/backendakim/auth/AuthService.java backend-akim/src/main/java/astana/innovation/backendakim/auth/AuthUserResponse.java backend-akim/src/main/java/astana/innovation/backendakim/auth/JwtConfiguration.java backend-akim/src/main/java/astana/innovation/backendakim/auth/JwtTokenService.java backend-akim/src/main/java/astana/innovation/backendakim/auth/LoginRequest.java backend-akim/src/main/java/astana/innovation/backendakim/auth/RegisterRequest.java backend-akim/src/main/java/astana/innovation/backendakim/auth/SecurityConfiguration.java backend-akim/src/main/java/astana/innovation/backendakim/auth/SecurityProblemWriter.java backend-akim/src/main/java/astana/innovation/backendakim/auth/TokenAuthenticationManager.java backend-akim/src/main/java/astana/innovation/backendakim/catalog/CatalogController.java backend-akim/src/main/java/astana/innovation/backendakim/catalog/CatalogService.java backend-akim/src/main/java/astana/innovation/backendakim/catalog/DistrictDataset.java backend-akim/src/main/java/astana/innovation/backendakim/catalog/DistrictMeasureResponse.java backend-akim/src/main/java/astana/innovation/backendakim/catalog/DistrictProvenance.java backend-akim/src/main/java/astana/innovation/backendakim/catalog/DistrictRepository.java backend-akim/src/main/java/astana/innovation/backendakim/catalog/DistrictResponse.java backend-akim/src/main/java/astana/innovation/backendakim/catalog/LrtContextController.java backend-akim/src/main/java/astana/innovation/backendakim/catalog/MeasureResponse.java backend-akim/src/main/java/astana/innovation/backendakim/config/OpenApiConfig.java backend-akim/src/main/java/astana/innovation/backendakim/config/WebConfig.java backend-akim/src/main/java/astana/innovation/backendakim/history/AnonymousTokens.java backend-akim/src/main/java/astana/innovation/backendakim/history/AnonymousUserRepository.java backend-akim/src/main/java/astana/innovation/backendakim/history/AnonymousUserResponse.java backend-akim/src/main/java/astana/innovation/backendakim/history/HistoryExceptionHandler.java backend-akim/src/main/java/astana/innovation/backendakim/history/HistoryPersistenceConfig.java backend-akim/src/main/java/astana/innovation/backendakim/history/SavedSimulationResponse.java backend-akim/src/main/java/astana/innovation/backendakim/history/SimulationHistoryController.java backend-akim/src/main/java/astana/innovation/backendakim/history/SimulationHistoryPage.java backend-akim/src/main/java/astana/innovation/backendakim/history/SimulationHistoryRepository.java backend-akim/src/main/java/astana/innovation/backendakim/history/SimulationHistoryService.java backend-akim/src/main/java/astana/innovation/backendakim/mapdata/MapDataController.java backend-akim/src/main/java/astana/innovation/backendakim/mapdata/MapDataService.java backend-akim/src/main/java/astana/innovation/backendakim/mapdata/MapLayer.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/ScoreCalculator.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationBootstrapController.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationController.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationExceptionHandler.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationExplanationService.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationLlmClient.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationLlmFacts.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationLlmTextGuard.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationOptimizer.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationRequest.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationResult.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationRules.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationService.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationValidationException.java backend-akim/src/main/java/astana/innovation/backendakim/simulation/SimulationValidator.java backend-akim/src/main/resources/application-postgres.yaml backend-akim/src/main/resources/application.yaml backend-akim/src/main/resources/catalog/districts-v2.json backend-akim/src/main/resources/db/migration/V1__simulation_history.sql backend-akim/src/main/resources/db/migration/V2__registered_users.sql backend-akim/src/main/resources/db/migration/V3__district_catalog.sql backend-akim/src/main/resources/measure-data/M3/lrt-context.json backend-akim/src/test/java/astana/innovation/backendakim/ApiContractIntegrationTests.java backend-akim/src/test/java/astana/innovation/backendakim/BackendAkimApplicationTests.java backend-akim/src/test/java/astana/innovation/backendakim/LrtDataIntegrationTests.java backend-akim/src/test/java/astana/innovation/backendakim/auth/AuthenticationIntegrationTests.java backend-akim/src/test/java/astana/innovation/backendakim/catalog/DistrictDatasetTests.java backend-akim/src/test/java/astana/innovation/backendakim/history/HistoryWithoutDatabaseTests.java backend-akim/src/test/java/astana/innovation/backendakim/history/SimulationHistoryIntegrationTests.java backend-akim/src/test/java/astana/innovation/backendakim/simulation/ScoreCalculatorTests.java backend-akim/src/test/java/astana/innovation/backendakim/simulation/SimulationApiIntegrationTests.java backend-akim/src/test/java/astana/innovation/backendakim/simulation/SimulationFixtures.java backend-akim/src/test/java/astana/innovation/backendakim/simulation/SimulationLlmClientTests.java backend-akim/src/test/java/astana/innovation/backendakim/simulation/SimulationLlmScenarioTests.java backend-akim/src/test/java/astana/innovation/backendakim/simulation/SimulationLlmTextGuardTests.java backend-akim/src/test/java/astana/innovation/backendakim/simulation/SimulationOptimizerTests.java backend-akim/src/test/java/astana/innovation/backendakim/simulation/SimulationServiceTests.java backend-akim/src/test/java/astana/innovation/backendakim/simulation/SimulationValidatorExhaustiveTests.java backend-akim/src/test/resources/history/simulation-result-v1.json compose.yaml data1/overture/astana/README.md data1/overture/astana/city_boundary.geojson data1/overture/astana/district_stats.csv data1/overture/astana/district_stats.json data1/overture/astana/districts.geojson data1/overture/astana/lrt.geojson data1/overture/astana/parks.geojson data1/overture/astana/pois.geojson data1/overture/astana/raw/building.parquet data1/overture/astana/raw/connector.parquet data1/overture/astana/raw/division.parquet data1/overture/astana/raw/division_area.parquet data1/overture/astana/raw/division_boundary.parquet data1/overture/astana/raw/infrastructure.parquet data1/overture/astana/raw/land_cover.parquet data1/overture/astana/raw/land_use.parquet data1/overture/astana/raw/place.parquet data1/overture/astana/raw/segment.parquet data1/overture/astana/raw/water.parquet data1/overture/astana/roads_main.geojson deploy/Frontend.Dockerfile deploy/Frontend.Dockerfile.dockerignore deploy/compose.yaml deploy/ship.sh docs1/HackAlem AI_ «Аким на 5 часов» - AI-симулятор управления городом.docx docs1/municipal-measures.md docs1/openapi.yaml docs1/saraishyk-research.md docs1/screenshots/city-assistant.png docs1/screenshots/measure-catalog.png docs1/screenshots/scenario-results.png docs1/simulation-example.json docs1/simulation-municipal-example.json docs1/simulation-optimal-example.json docs1/simulation-saraishyk-example.json docs1/Датасет районов.docx frontend/.dockerignore frontend/.gitignore frontend/AGENTS.md frontend/CLAUDE.md frontend/Dockerfile frontend/README.md frontend/eslint.config.mjs frontend/next.config.ts frontend/package-lock.json frontend/package.json frontend/postcss.config.mjs frontend/public/data/astana-districts.geojson frontend/public/file.svg frontend/public/globe.svg frontend/public/next.svg frontend/public/vercel.svg frontend/public/window.svg frontend/scripts/convert-districts.mjs frontend/src/app/api.ts frontend/src/app/api/chat/route.ts frontend/src/app/api/session/login/route.ts frontend/src/app/api/session/logout/route.ts frontend/src/app/api/session/me/route.ts frontend/src/app/api/session/register/route.ts frontend/src/app/api/session/session-server.ts frontend/src/app/auth-client.ts frontend/src/app/auth-form.tsx frontend/src/app/auth-nav.tsx frontend/src/app/chat-panel.module.css frontend/src/app/chat-panel.tsx frontend/src/app/district-map.module.css frontend/src/app/district-map.tsx frontend/src/app/favicon.ico frontend/src/app/globals.css frontend/src/app/initiative-modal.module.css frontend/src/app/initiative-modal.tsx frontend/src/app/layout.tsx frontend/src/app/login/page.tsx frontend/src/app/page.tsx frontend/src/app/register/page.tsx frontend/src/app/scenario-comparison.tsx frontend/src/app/scenario-ui.tsx frontend/src/components/measure-3d/MeasurePreview.tsx frontend/src/components/measure-3d/catalog.ts frontend/src/components/measure-3d/factory.ts frontend/src/components/measure-3d/measure-preview.module.css frontend/src/proxy.ts frontend/tsconfig.json plan.md scripts/overture_astana.py scripts/prepare_lrt.py scripts/run-backend.sh scripts/smoke-simulation.sh
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.