Створення агентних робочих процесів у застосунку з хмарним бекендом і ADK
Public- 29 Sep, 2026

Деякі задачі надто складні, щоб вкластися в одну сесію на пристрої. Зібрати повну подорож «під ключ» — це узгодити час перельотів, обрати номери в готелях, забронювати квитки до музеїв і спланувати ресторани. Якщо запускати такий багатокроковий процес прямо на телефоні, є ризик втратити прогрес, коли застосунок закриють, а жонглювати купою кроків і ключами API на портативному пристрої швидко стає незручно. Для таких довгих робочих процесів краще підходить власний self-hosted бекенд: він виконує агентів бронювання у фоновому режимі, поки Android-застосунок залишається підключеним до сесії, відображає прогрес і запитує у користувача введення лише тоді, коли це справді потрібно.
В основі всього лежить Agent Development Kit (ADK). У прикладі на Python визначається спеціалізований агент flight_agent через Agent(name="Flight Booker", model="gemini-3.1-flash-lite",...) з двома функціональними інструментами: search_flights(destination, date) і reserve_flight(flight_time). Примечательно, що в reserve_flight задано require_confirmation=True, тому ADK призупиняє роботу й чекає на явне схвалення користувача, перш ніж виконати цей незворотний крок. Агент запускається через InMemoryRunner, де run_async(user_id, session_id) ведёт цикл. ADK сам занимается исполнением — отслеживает контекст діалогу, маршрутизує повідомлення між користувачем і моделлю та викликає зареєстровані інструменти, коли модель їх запитує, — тож вам лишається писати процедурну логіку, а оркестрацією керує фреймворк.
Щоб передавати оновлення з бекенду на пристрій у реальному часі, сервер використовує AG-UI — двоспрямований транспортний протокол, який стандартизує типи повідомлень між агентами та UI-клієнтами. Агент може повідомляти клієнту про події життєвого циклу, текстові повідомлення, виклики інструментів і зміни стану, а клієнт у відповідь надсилає повідомлення користувача, результати інструментів і кастомні події дій. На сервері AG-UI видає оновлення як Server-Sent Events (наприклад, event: TEXT_MESSAGE_CONTENT, який несе JSON-дельту). На Android SDK на Kotlin слухає цей потік і відображає корисне навантаження на типобезпечні клієнтські події: HttpAgent налаштовується через HttpAgentConfig, RunAgentInput нести тред і UserMessage, а runAgentObservable(input).collect {... } дозволяє розгалужувати за TextMessageStartEvent, TextMessageContentEvent і TextMessageEndEvent.
Отрисовка лише цих текстових подій дає простого чат-бота. Щоб показувати інтерактивні компоненти нативно, A2UI дозволяє агентам описувати елементи інтерфейсу динамічно. Клієнт оголошує каталог підтримуваних компонентів, а сервер надсилає JSON із розкладкою та властивостями — наприклад, поверхню Flight Reservation, що містить InteractiveOptionPicker з підказкою, варіантами на кшталт "10:00 AM" і "2:00 PM" та кнопкою підтвердження. На бекенді інтеграція A2UI в ADK використовує A2uiSchemaManager, щоб скомпілювати JSON-схеми компонентів та інструкції розкладки в системний промпт через generate_system_prompt(...)так модель узнаёт точную структуру, которую должна генерировать для валідних payload-ів A2UI, які клієнт зможе відрендерити.
На клієнті додавання A2UI починається з залежностей Gradle, таких як androidx.a2ui:a2ui-model, androidx.a2ui.compose:compose-runtime, compose-ui і androidx.compose.material3:material3-a2ui — усі версії 1.0.0-alpha01Клас кожного компонента з каталогу відображає JSON-властивості в composable з Jetpack Compose, а кастомний A2uiCatalog, зареєстрований із catalogId, зв'язує його з серверним визначенням. Для стандартних елементів — тексту, кнопок, чекбоксів і перемикачів дати й часу — готові реалізації Material 3 надає materialA2uiBasicCatalogV1(...), без написання власного коду. BookingAssistantViewModel подає повідомлення в A2uiMessageProcessor, чий StateFlow activeSurfaces екран відмальовує composable-ом A2uiSurface, який бере на себе відстеження стану, індикатори завантаження, обробку помилок та анімовані переходи. Обидві сторони мають використовувати один і той самий ID визначення каталогу; якщо ви додаєте або змінюєте властивості, потрібно підняти номер версії та оновити відповідний клас компонента на Kotlin, щоб не отримати помилки парсингу.
