mirror of
https://github.com/google/adk-docs.git
synced 2026-09-14 16:16:59 +08:00
b1b2eaa102
* 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.
106 lines
3.1 KiB
Kotlin
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]
|