Files
Shahin Saadati b1b2eaa102 Upgrade Kotlin examples to adk-kotlin 0.7.0 (#2088)
* Upgrade Kotlin examples to adk-kotlin 0.7.0

The Kotlin examples were pinned to adk-kotlin 0.5.0, which predates the
context caching, Vertex AI memory, and RAG retrieval APIs. Bump the pin to
0.7.0 so snippets for those features can be added.

Three consequences of the bump are handled here:

- `ExperimentalResumabilityFeature` was removed in 0.7.0, so RunConfigExample
  no longer opts into it. The annotation class is gone, not merely deprecated,
  so this is a hard compile break rather than a warning that could be deferred.
- The Vertex AI session and memory services expose Ktor's `HttpClient` as a
  defaulted constructor parameter, so any snippet naming them needs Ktor on the
  compile classpath, not just at runtime.
- The `resolutionStrategy` block forcing kotlin-stdlib 2.1.20 is now dead. It
  worked around 0.5.0 publishing a stdlib newer than this project's compiler;
  0.6.0 fixed that upstream. Verified that the highest stdlib on the compile
  classpath is still 2.1.20 without it.

Also fixes two unrelated snags found while validating the above:

- `check_kotlin_snippets.sh` walked `examples/kotlin` without pruning build
  output, so after any local build it reported every generated KSP file as an
  unregistered snippet. CI only ever ran it against a clean checkout, so the
  bug was invisible there.
- A transclusion path in logging.md was split across two lines, so the include
  never resolved and the code block rendered empty.

* Fix broken links to adk-python plugin samples

The three plugin sample links 404. adk-python renamed
`contributing/samples/plugin/` to `contributing/samples/plugins/`; the
directory contents are otherwise unchanged, so only the path segment moves.

This is what the repo-wide `link-check` job has been failing on. It is
unrelated to the 0.7.0 upgrade in this PR, but the check gates the merge and
the fix is confined to the three URLs.

Verified all three targets return 200.
2026-08-07 13:24:29 -07:00

106 lines
3.1 KiB
Kotlin

/*
* Copyright 2026 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.adk.kt.examples.runtime
import com.google.adk.kt.agents.LlmAgent
import com.google.adk.kt.agents.ResumabilityConfig
import com.google.adk.kt.agents.RunConfig
import com.google.adk.kt.agents.StreamingMode
import com.google.adk.kt.apps.App
import com.google.adk.kt.models.Gemini
import com.google.adk.kt.runners.InMemoryRunner
import com.google.adk.kt.sessions.InMemorySessionService
import com.google.adk.kt.types.Content
import com.google.adk.kt.types.Role
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.runBlocking
// --8<-- [start:basic_usage]
val config =
RunConfig(
streamingMode = StreamingMode.SSE,
)
// Pass it to runner.runAsync
// runner.runAsync(..., runConfig = config)
// --8<-- [end:basic_usage]
// --8<-- [start:full_example]
fun runWithConfig(runner: InMemoryRunner) =
runBlocking {
val config =
RunConfig(
streamingMode = StreamingMode.SSE,
customMetadata = mapOf("priority" to "high"),
)
runner
.runAsync(
userId = "user123",
sessionId = "session456",
newMessage = Content.fromText(Role.USER, "Hello!"),
runConfig = config,
).collect { event ->
// handle events
}
}
// --8<-- [end:full_example]
// --8<-- [start:custom_metadata]
val metadataConfig =
RunConfig(
customMetadata = mapOf("user_tier" to "premium"),
)
// --8<-- [end:custom_metadata]
// --8<-- [start:streaming_config]
val streamingConfig =
RunConfig(
streamingMode = StreamingMode.SSE,
)
// --8<-- [end:streaming_config]
private val rootAgent =
LlmAgent(name = "my_agent", model = Gemini(name = "gemini-flash-latest"))
// --8<-- [start:resumability_config]
val runner =
InMemoryRunner(
app =
App(
appName = "my_resumable_agent",
rootAgent = rootAgent,
resumabilityConfig = ResumabilityConfig(isResumable = true),
),
sessionService = InMemorySessionService(),
)
// --8<-- [end:resumability_config]
// --8<-- [start:resume_usage]
fun resumeAgent(runner: InMemoryRunner) =
runBlocking {
runner
.runAsync(
userId = "user123",
sessionId = "session456",
invocationId = "previous-invocation-id",
).collect { event ->
// resume execution from previous state
}
}
// --8<-- [end:resume_usage]