Этот воркшоп — пошаговое создание мобильного приложения с картами Yandex Maps на Kotlin Multiplatform и Compose Multiplatform. Базовое приложение демонстрирует основные возможности работы с картами: отображение, добавление меток и работу с камерой.
Продолжение воркшопа посвящено встраиванию AI-ассистента, который общается с пользователем в чате и взаимодействует с картой: ищет места, ставит метки и управляет камерой через вызов инструментов (function calling) у LLM.
Скрипт установит инструменты, создаст local.properties c ключами и прогреет Gradle. Выберите скрипт под вашу платформу:
# Android-разработка (macOS / Linux / Windows)
./scripts/setup-android.sh
# iOS-разработка (только macOS) — включает все шаги Android + Xcode/Tuist
# Xcode можно установить только из Mac App Store (вручную)
./scripts/setup-ios.sh- macOS / Linux — обычный терминал.
- Windows — запустите в Git Bash (входит в Git for Windows):
bash scripts/setup-android.sh.
- Сделать настоящий вызов LLM и убрать заглушку
- Добавить системный промпт (Пример)
- Добавить контекст
- Собрать агентский цикл с инструментом поиска
- Добавить инструменты для взаимодействия с картой
- Добавить инструмент для взаимодействия с чатом
Ключевые классы, вокруг которых строится работа на воркшопе:
OpenAIClient— минимальный клиент к OpenAI-совместимому эндпоинту chat-completions. Методcomplete { }собирает запрос через DSL (сообщения, инструменты) и возвращаетCompletionResponse; при не-2xx бросаетOpenAIExceptionс сырым телом ответа.ChatRepository— хранит историю чата какFlow<List<ChatMessage>>, отправляет сообщения и очищает диалог. На старте отвечает заглушкой (MOCK) — по плану воркшопа здесь подключаютсяOpenAIClientиAssistantApi.AssistantApi— высокоуровневые действия агента над картой и чатом:searchPlaces,showOnMap,focusOnPoint/focusOnPoints,closeChat. Именно на этот фасад опираются инструменты агента.AgentTools— интерфейсAgentToolи реестрAgentToolset: отдаёт спецификации инструментов (specs) модели и направляет её вызовы (dispatch) в нужный инструмент. Здесь же хелперы для описания инструментов (toolSpecs) и разбора аргументов. Новые инструменты подключаются в списокAgentToolset(на старте зарегистрирован толькоSearchPlacesTool).SearchPlacesTool— готовый пример: инструментsearch_placesпринимаетquery(опциональноlatitude/longitude/radius_meters), вызываетAssistantApi.searchPlacesи возвращает кандидатов с координатами и адресами в JSON.ShowPlacesOnMapTool—show_places_on_map: показывает места на карте черезAssistantApi.showOnMap. Реализуется на воркшопе (TODO).FocusOnPointTool—focus_on_point: центрирует камеру на точке черезAssistantApi.focusOnPoint. Реализуется на воркшопе (TODO).FocusOnPointsTool—focus_on_points: вписывает несколько точек в видимую область черезAssistantApi.focusOnPoints. Реализуется на воркшопе (TODO).CloseChatTool— закрывает панель чата черезAssistantApi.closeChat. Реализуется на воркшопе (TODO, включая имя и описание инструмента).
Готовые решения каждого шага плана — отдельным коммитом (ветка assistant-sample):
- Сделать настоящий вызов LLM и убрать заглушку —
6806a09 - Добавить системный промпт —
d34e782 - Добавить контекст —
bbd6c34 - Собрать агентский цикл с инструментом поиска —
b236e16 - Добавить инструменты для взаимодействия с картой —
002774a - Добавить инструмент для взаимодействия с чатом —
091362c
💡 Не успеваете на воркшопе? Переключитесь на коммит нужного шага, чтобы продолжить с готового решения, или перенесите конкретный шаг в свою ветку через
cherry-pick.
# Посмотреть готовое решение шага (detached HEAD), напр. шаг 1
git checkout 6806a09
# Вернуться к своей ветке
git checkout assistant-sample
# Или перенести коммит конкретного шага в свою ветку поверх текущей работы
git cherry-pick 6806a09- Kotlin Multiplatform - кроссплатформенная разработка
- Compose Multiplatform - современный UI фреймворк
- Yandex MapKit - картографический SDK
- Ktor Client - HTTP-клиент для запросов к LLM
- OpenAI-совместимый API - LLM для AI-ассистента (по умолчанию DeepSeek)
- Android (API 26+)
- iOS (iOS 15+)
- Версия: 17 или новее (LTS версии)
- Источник:
Установка на macOS:
# Через Homebrew
brew install openjdk@17
# Добавить в PATH
echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc
source ~/.zshrcУстановка на Windows:
- Скачать установщик с официального сайта
- Запустить установщик от имени администратора
- Добавить JAVA_HOME в переменные среды
Установка на Linux:
sudo apt update
sudo apt install openjdk-17-jdk- Версия: Hedgehog (2023.1.1) или новее
- Источник: developer.android.com
Дополнительные компоненты:
- Android SDK Platform 36
- Android SDK Build-Tools
- Android Emulator
- Android SDK Platform-Tools
Настройка переменных среды:
# macOS/Linux
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/platform-tools
# Windows
set ANDROID_HOME=C:\Users\%USERNAME%\AppData\Local\Android\Sdk
set PATH=%PATH%;%ANDROID_HOME%\emulator
set PATH=%PATH%;%ANDROID_HOME%\platform-tools- Версия: 15.0 или новее
- Источник: Mac App Store
- Дополнительно: Command Line Tools
Установка Command Line Tools:
xcode-select --install- Версия: 4.0 или новее
- Источник: tuist.dev
- Назначение: генерация Xcode-проекта и загрузка iOS-зависимостей (Yandex MapKit через Swift Package Manager). Заменяет CocoaPods.
Установка:
# Через Homebrew
brew install tuist
# Альтернатива — через mise
brew install mise
mise install tuist- Версия: 2.30.0 или новее
- Источник: git-scm.com
Установка на macOS:
brew install gitУстановка на Windows:
- Скачать установщик с официального сайта
- Рекомендуется использовать Git Bash
Установка на Linux:
sudo apt install git- Готовые ключи для воркшопа: Скачать с GitHub Gist
- Yandex MapKit API Key - для карт
- OpenAI-совместимый API Key - для AI-ассистента (по умолчанию DeepSeek)
MapsWorkshop/
├── common/ # Общая логика: карта, чат, AI-агент
│ └── additional/ # Базовые утилиты и LLM-клиент (Ktor)
├── composeApp/ # Основное приложение (Android/iOS)
├── mapkit-bindings/ # Kotlin обертки для Yandex MapKit
├── mapkit-interop/ # Нативные интерфейсы
└── iosApp/ # iOS приложение
Общая бизнес-логика приложения:
CommonApp.kt- DI-контейнер приложенияDescriptionGenerator.kt- генератор описаний для метокSearchManager.kt- менеджер поискаchat/- состояние и логика чата (ChatViewModel,ChatRepository,ChatMessage)agent/- AI-агент:AssistantApi, контроллер камеры и инструменты (tools/)
Базовые утилиты и инфраструктура:
llm/OpenAIClient.kt- клиент к OpenAI-совместимому API и DSL запросаudf/- примитивы UDF-архитектуры (ViewModel,Store,Event)
Основное приложение с UI:
App.kt- главный компонент приложенияMapActions.kt- действия с картойinternal/view/- UI чата (ChatScreen,ChatSummaryBar)
git clone <repository-url>
cd MapsWorkshopПолучить ключи: 🔑 GitHub Gist
Создать файл local.properties в корне проекта (он уже в .gitignore, поэтому ключи не попадут в репозиторий):
#Mapkit
mapkitToken=ваш_mapkit_token
#OpenAI Client
openAiApiKey=ваш_api_key
openAiModel=deepseek-v4-flash
openAiBaseUrl=https://api.deepseek.com/chat/completionsopenAiModel и openAiBaseUrl необязательны — по умолчанию используются deepseek-v4-flash и https://api.deepseek.com/chat/completions.
# Синхронизация Gradle
./gradlew
# Генерация Xcode-проекта (Tuist)
./iosApp/generate.shСкрипт iosApp/generate.sh запускает tuist install (загрузка SPM-зависимостей, включая Yandex MapKit) и tuist generate (создание MapsWorkshop.xcworkspace). После выполнения откройте iosApp/MapsWorkshop.xcworkspace в Xcode.
⚠️ Файлы, сгенерированные Tuist (*.xcodeproj,*.xcworkspace,Derived/), не коммитятся — перегенерируйте их черезgenerate.shпосле клонирования или смены ветки.
Что уже готово в проекте:
- Полностью настроенный Kotlin Multiplatform проект с поддержкой Android и iOS
- Интегрированный Yandex MapKit SDK с готовыми Kotlin обертками
- Настроенная Gradle конфигурация для всех платформ
- Готовая архитектура приложения на UDF (Store / Reducer / Event)
- Полнофункциональные интерфейсы для работы с картами и метками
- Подготовленная инфраструктура AI-ассистента: UI чата, LLM-клиент (
OpenAIClient),AssistantApiс инструментами и контроллером камеры
На старте чат отвечает заглушкой — задача воркшопа подключить настоящую LLM и собрать агентский цикл.
- macOS: 12.0 (Monterey) или новее (обязательно для iOS разработки)
- Windows: 10 (версия 1903) или новее
- Linux: Ubuntu 20.04 LTS или новее
- macOS: Обязательно для iOS разработки
- Xcode: Последняя стабильная версия
- Tuist: Установленный для генерации Xcode-проекта
- API ключи для воркшопа —
mapkitToken,openAiApiKeyи др. - Пример системного промпта — для AI-ассистента
- Не публикуйте ключи в публичных репозиториях
- После воркшопа ключи будут автоматически деактивированы