Izrada agentskih radnih procesa u aplikaciji s oblačnim backendom i ADK-om

  • PublicPublic
  • 29 Sep, 2026
Izrada agentskih radnih procesa u aplikaciji s oblačnim backendom i ADK-om

Neki su zadaci previše složeni da bi stali u jednu sesiju na uređaju. Složiti cijelo putovanje "ključ u ruke" znači uskladiti vrijeme letova, odabrati sobe u hotelima, rezervirati karte za muzeje i isplanirati restorane. Ako se takav višekoračni proces pokreće izravno na telefonu, postoji rizik od gubitka napretka kad se aplikacija zatvori, a žongliranje gomilom koraka i API ključevima na prijenosnom uređaju brzo postaje nezgodno. Za takve duge radne procese bolje odgovara vlastiti self-hosted backend: on izvršava agente za rezervaciju u pozadini, dok Android aplikacija ostaje povezana sa sesijom, prikazuje napredak i traži od korisnika unos samo kad je to doista potrebno.

Osnova svega je Agent Development Kit (ADK). U primjeru na Pythonu definira se specijalizirani agent flight_agent putem Agent(name="Flight Booker", model="gemini-3.1-flash-lite",...) s dva funkcijska alata: search_flights(destination, date) i reserve_flight(flight_time). Primjetno je da reserve_flight ima zadan require_confirmation=True, pa ADK pauzira izvršavanje i čeka izričito odobrenje korisnika prije nego što izvrši taj nepovratni korak. Agent se pokreće putem InMemoryRunner, gdje run_async(user_id, session_id) води цикл. ADK самостално води рачуна о извршавању — прати контекст разговора, усмјерава поруке између корисника и модела и позива регистроване алате када их модел затражи — тако да вама остаје да пишете процедуралну логику, док оркестрацијом управља оквир (framework).

Како би у реалном времену слао ажурирања с позадинског дијела (backenda) на уређај, послужитељ користи AG-UI — двосмјерни транспортни протокол који стандардизира типове порука између агената и UI-клијената. Агент може клијента обавјештавати о догађајима животног циклуса, текстуалним порукама, позивима алата и промјенама стања, а клијент заузврат шаље корисничке поруке, резултате алата и прилагођене (custom) догађаје радњи. На послужитељу AG-UI ажурирања испоручује као Server-Sent Events (на примјер event: TEXT_MESSAGE_CONTENT, који носи JSON-делту). На Androidu SDK у Kotlinu слуша тај ток и пресликава садржај (payload) на типски сигурне клијентске догађаје: HttpAgent konfigurira se putem HttpAgentConfig, RunAgentInput nosi thread i UserMessage, a runAgentObservable(input).collect {... } omogućuje grananje prema TextMessageStartEvent, TextMessageContentEvent i TextMessageEndEvent.

Obratite samo te tekstualne događaje dobijete jednostavnog chatbota. Da bi se interaktivne komponente prikazivale nativno, A2UI omogućuje agentima da dinamički opisuju elemente sučelja. Klijent proglašava katalog podržanih komponenti, a poslužitelj šalje JSON s rasporedom i svojstvima — na primjer, površinu Flight Reservation, koja sadrži InteractiveOptionPicker s upitom, opcijama poput "10:00 AM" i "2:00 PM" i gumbom za potvrdu. Na pozadini (backend) integracija A2UI u ADK koristi A2uiSchemaManagerkako bi kompajlirala JSON-sheme komponenata i upute za raspored u sustavni upit kroz generate_system_prompt(...)— tako model uči točnu strukturu koju mora generirati za valjane A2UI payload-ove koje klijent može prikazati.

Na klijentu dodavanje A2UI-ja počinje s Gradle ovisnostima kao što su androidx.a2ui:a2ui-model, androidx.a2ui.compose:compose-runtime, compose-ui i androidx.compose.material3:material3-a2ui — sve verzije 1.0.0-alpha01. Klasa svakog komponenta iz kataloga preslikava JSON svojstva u composable iz Jetpack Composea, a prilagođeni A2uiCatalog, registriran s catalogId, povezuje ga sa definicijom na serveru. Za standardne elemente — tekst, dugmad, checkboxove i birače datuma i vremena — gotove Material 3 implementacije pruža materialA2uiBasicCatalogV1(...), bez pisanja vlastitog koda. BookingAssistantViewModel dostavlja poruke u A2uiMessageProcessor, čiji StateFlow activeSurfaces ekran se iscrtava composableom A2uiSurface, koji preuzima praćenje stanja, indikatore učitavanja, obradu grešaka i animirane prijelaze. Obje strane moraju koristiti isti ID definicije kataloga; ako dodajete ili mijenjate svojstva, trebate podići broj verzije i ažurirati odgovarajuću klasu komponente na Kotlinu, kako ne biste dobili pogreške parsiranja.