@@ -64,6 +64,7 @@ import com.google.adk.kt.types.GenerationConfigRoutingConfig as KtRoutingConfig
6464import com.google.adk.kt.types.GenerationConfigRoutingConfigManualRoutingMode as KtManualRoutingMode
6565import com.google.adk.kt.types.GoogleMaps as KtGoogleMaps
6666import com.google.adk.kt.types.GoogleSearch as KtGoogleSearch
67+ import com.google.adk.kt.types.GroundingMetadata as KtGroundingMetadata
6768import com.google.adk.kt.types.HarmBlockMethod as KtHarmBlockMethod
6869import com.google.adk.kt.types.HarmBlockThreshold as KtHarmBlockThreshold
6970import com.google.adk.kt.types.HarmCategory as KtHarmCategory
@@ -4552,6 +4553,24 @@ class KtRunnerInteropTest {
45524553 assertEquals(" places/abc" , maps.placeId().getOrNull(), " maps chunk placeId" )
45534554 }
45544555
4556+ @Test
4557+ fun asKtSessionService_groundingMetadata_survivesTheJavaStore () = runBlocking {
4558+ // Kotlin's Gemini leaves imageSearchQueries unset on a Google Search answer.
4559+ val sessions = JavaAdkToKt .asKtSessionService(JavaInMemorySessionService ())
4560+ val key = KtSessionKey (" app" , " u" , " s" )
4561+ val session = sessions.createSession(key)
4562+ val webSearch = KtGroundingMetadata (webSearchQueries = listOf (" tallest building" ))
4563+ val imageSearch = KtGroundingMetadata (imageSearchQueries = listOf (" cat" ))
4564+
4565+ for (grounding in listOf (webSearch, imageSearch)) {
4566+ val unused =
4567+ sessions.appendEvent(session, KtEvent (author = " model" , groundingMetadata = grounding))
4568+ }
4569+
4570+ val stored = assertNotNull(sessions.getSession(key)).events.map { it.groundingMetadata }
4571+ assertEquals(listOf (webSearch, imageSearch), stored)
4572+ }
4573+
45554574 @Test
45564575 fun asKtSessionService_listEvents_carriesNextPageToken () = runBlocking {
45574576 // The listEvents bridge must carry nextPageToken, or a paged Java service's continuation token
0 commit comments