Skip to content

Commit af787dd

Browse files
authored
Merge pull request #147 from joreilly/adk
Initial ADK agent
2 parents 0ab49d0 + 4e71732 commit af787dd

File tree

5 files changed

+87
-17
lines changed

5 files changed

+87
-17
lines changed

agents/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ dependencies {
88
implementation(libs.koin.core)
99
implementation("ai.koog:koog-agents:0.2.1")
1010
implementation("org.slf4j:slf4j-simple:2.0.17")
11+
implementation("com.google.adk:google-adk:0.1.0")
1112
implementation(projects.composeApp)
1213
}
1314

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package adk
2+
3+
import com.google.adk.agents.BaseAgent
4+
import com.google.adk.agents.LlmAgent
5+
import com.google.adk.events.Event
6+
import com.google.adk.models.Gemini
7+
import com.google.adk.runner.InMemoryRunner
8+
import com.google.adk.tools.mcp.McpToolset
9+
import com.google.genai.Client
10+
import com.google.genai.types.Content
11+
import com.google.genai.types.Part
12+
import io.modelcontextprotocol.client.transport.ServerParameters
13+
import io.reactivex.rxjava3.functions.Consumer
14+
import kotlin.jvm.optionals.getOrNull
15+
16+
17+
const val USER_ID = "MainUser"
18+
const val NAME = "ClimateTrace Agent"
19+
20+
val ROOT_AGENT: BaseAgent = initAgent()
21+
22+
fun initAgent(): BaseAgent {
23+
val apiKeyGoogle = ""
24+
25+
val mcpTools = McpToolset(
26+
ServerParameters
27+
.builder("java")
28+
.args("-jar", "./mcp-server/build/libs/serverAll.jar", "--stdio")
29+
.build()
30+
).loadTools().join()
31+
32+
val model = Gemini(
33+
"gemini-1.5-pro",
34+
Client.builder()
35+
.apiKey(apiKeyGoogle)
36+
.build()
37+
)
38+
39+
return LlmAgent.builder()
40+
.name(NAME)
41+
.model(model)
42+
.description("Agent to answer climate emissions related questions.")
43+
.tools(mcpTools)
44+
.build()
45+
}
46+
47+
fun main() {
48+
val runner = InMemoryRunner(ROOT_AGENT)
49+
val session = runner
50+
.sessionService()
51+
.createSession(NAME, USER_ID)
52+
.blockingGet()
53+
54+
val prompt =
55+
"""
56+
Get emission data for France and Germany for 2023 and 2024.
57+
Use units of millions for the emissions data.
58+
""".trimIndent()
59+
60+
val userMsg = Content.fromParts(Part.fromText(prompt))
61+
val events = runner.runAsync(USER_ID, session.id(), userMsg)
62+
63+
events.blockingForEach(Consumer { event: Event ->
64+
event.content().get().parts().getOrNull()?.forEach { part ->
65+
part.text().getOrNull()?.let { println(it) }
66+
part.functionCall().getOrNull()?.let { println(it) }
67+
part.functionResponse().getOrNull()?.let { println(it) }
68+
}
69+
if (event.errorCode().isPresent || event.errorMessage().isPresent) {
70+
println("error: ${event.errorCode().get()}, ${event.errorMessage().get()}")
71+
}
72+
})
73+
}

agents/src/main/kotlin/ClimateTraceTool.kt renamed to agents/src/main/kotlin/koog/ClimateTraceTool.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
package koog
2+
13
import ai.koog.agents.core.tools.annotations.LLMDescription
24
import ai.koog.agents.core.tools.annotations.Tool
35
import ai.koog.agents.core.tools.reflect.ToolSet
46
import dev.johnoreilly.climatetrace.data.ClimateTraceRepository
5-
7+
import koin
68

79

810
@LLMDescription("Tools for getting climate emission information")

agents/src/main/kotlin/koog_agent.kt renamed to agents/src/main/kotlin/koog/koog_agent.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
package koog
2+
13
import ai.koog.agents.core.agent.AIAgent
4+
import ai.koog.agents.core.tools.Tool
25
import ai.koog.agents.core.tools.ToolRegistry
36
import ai.koog.agents.core.tools.reflect.asTools
47
import ai.koog.agents.features.eventHandler.feature.handleEvents
@@ -16,16 +19,16 @@ val apiKeyGoogle = ""
1619

1720

1821
@OptIn(ExperimentalUuidApi::class)
19-
suspend fun runKoogAgent() {
22+
suspend fun main() {
2023
val agent = AIAgent(
21-
executor = simpleOpenAIExecutor(openAIApiKey),
22-
//executor = simpleGoogleAIExecutor(apiKeyGoogle),
23-
llmModel = OpenAIModels.Chat.GPT4o,
24-
//llmModel = GoogleModels.Gemini1_5Pro,
24+
//executor = simpleOpenAIExecutor(openAIApiKey),
25+
executor = simpleGoogleAIExecutor(apiKeyGoogle),
26+
//llmModel = OpenAIModels.Chat.GPT4o,
27+
llmModel = GoogleModels.Gemini1_5Pro,
2528
toolRegistry = createToolSetRegistry()
2629
) {
2730
handleEvents {
28-
onToolCall { tool: ai.koog.agents.core.tools.Tool<*, *>, toolArgs: ai.koog.agents.core.tools.Tool.Args ->
31+
onToolCall { tool: Tool<*, *>, toolArgs: Tool.Args ->
2932
println("Tool called: tool ${tool.name}, args $toolArgs")
3033
}
3134

@@ -41,9 +44,8 @@ suspend fun runKoogAgent() {
4144

4245
agent.run(
4346
"""
44-
Get emission data for France, Germany for 2023 and 2024.
47+
Get emission data for France and Germany for 2023 and 2024.
4548
Use units of millions for the emissions data.
46-
Also get best estimate of population for each country and show per-capita emissions.
4749
""".trimIndent()
4850
)
4951
}

agents/src/main/kotlin/main.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
11
import dev.johnoreilly.climatetrace.di.initKoin
2-
import kotlinx.coroutines.runBlocking
3-
import kotlin.uuid.ExperimentalUuidApi
4-
52

63
val koin = initKoin(enableNetworkLogs = true).koin
7-
8-
@OptIn(ExperimentalUuidApi::class)
9-
fun main() = runBlocking{
10-
runKoogAgent()
11-
}

0 commit comments

Comments
 (0)