Skip to content

Commit c267b02

Browse files
feat(examples): unify DataStore settings implementation across platforms
1 parent 44a7d9d commit c267b02

26 files changed

Lines changed: 184 additions & 256 deletions

File tree

examples/demo-compose-app/androidApp/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ android {
1414

1515
defaultConfig {
1616
applicationId = "com.jetbrains.example.koog.compose"
17-
minSdk = 24
17+
minSdk = 26
1818
targetSdk = 36
1919
versionCode = 1
2020
versionName = "1.0"

examples/demo-compose-app/commonApp/build.gradle.kts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ kotlin {
2828

2929
sourceSets {
3030
commonMain.dependencies {
31+
implementation(libs.androidx.datastore.core.okio)
3132
implementation(libs.jetbrains.compose.animation)
3233
implementation(libs.jetbrains.compose.animation.graphics)
3334
implementation(libs.jetbrains.compose.components.resources)
@@ -57,21 +58,18 @@ kotlin {
5758
}
5859

5960
androidMain.dependencies {
60-
implementation(libs.androidx.datastore.preferences)
6161
implementation(libs.jetbrains.compose.ui.tooling)
6262
implementation(libs.kotlinx.coroutines.android)
6363
implementation(libs.ktor.client.okhttp)
6464
}
6565

6666
jvmMain.dependencies {
6767
implementation(compose.desktop.currentOs)
68-
implementation(libs.androidx.datastore.preferences)
6968
implementation(libs.kotlinx.coroutines.swing)
7069
implementation(libs.ktor.client.apache5)
7170
}
7271

7372
iosMain.dependencies {
74-
implementation(libs.androidx.datastore.preferences)
7573
implementation(libs.ktor.client.darwin)
7674
}
7775

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
package com.jetbrains.example.koog.compose
22

33
import android.content.Context
4+
import androidx.datastore.core.Storage
5+
import androidx.datastore.core.okio.OkioStorage
46
import com.jetbrains.example.koog.compose.settings.AppSettings
7+
import com.jetbrains.example.koog.compose.settings.AppSettingsData
8+
import com.jetbrains.example.koog.compose.settings.AppSettingsSerializer
59
import com.jetbrains.example.koog.compose.settings.DataStoreAppSettings
6-
import com.jetbrains.example.koog.compose.settings.PrefPathProvider
7-
import okio.Path
10+
import com.jetbrains.example.koog.compose.settings.StorageProvider
11+
import okio.FileSystem
812
import okio.Path.Companion.toPath
913
import org.koin.core.module.Module
1014
import org.koin.dsl.module
1115

1216
actual val appPlatformModule: Module = module {
13-
single<PrefPathProvider> {
17+
single<StorageProvider> {
1418
val context: Context = get()
15-
object : PrefPathProvider {
16-
override fun get(): Path {
17-
val file = context.filesDir.resolve("settings.preferences_pb")
18-
return file.absolutePath.toPath()
19-
}
19+
object : StorageProvider {
20+
override fun getStorage(): Storage<AppSettingsData> = OkioStorage(
21+
fileSystem = FileSystem.SYSTEM,
22+
serializer = AppSettingsSerializer,
23+
producePath = { context.filesDir.resolve("app_settings.json").absolutePath.toPath() }
24+
)
2025
}
2126
}
22-
single<AppSettings> { DataStoreAppSettings(prefPathProvider = get()) }
27+
single<AppSettings> { DataStoreAppSettings(storageProvider = get()) }
2328
}

examples/demo-compose-app/commonApp/src/androidMain/kotlin/com/jetbrains/example/koog/compose/settings/DataStoreAppSettings.kt

Lines changed: 0 additions & 49 deletions
This file was deleted.

examples/demo-compose-app/commonApp/src/androidMain/kotlin/com/jetbrains/example/koog/compose/settings/PrefPathProvider.kt

Lines changed: 0 additions & 7 deletions
This file was deleted.

examples/demo-compose-app/commonApp/src/commonMain/kotlin/com/jetbrains/example/koog/compose/agents/calculator/CalculatorAgentProvider.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.jetbrains.example.koog.compose.agents.calculator
22

33
import ai.koog.agents.core.agent.AIAgent
44
import ai.koog.agents.core.agent.config.AIAgentConfig
5-
import ai.koog.agents.core.dsl.builder.forwardTo
5+
import ai.koog.agents.core.dsl.builder.node
66
import ai.koog.agents.core.dsl.builder.strategy
77
import ai.koog.agents.core.dsl.extension.nodeExecuteMultipleTools
88
import ai.koog.agents.core.dsl.extension.nodeLLMCompressHistory
@@ -15,7 +15,7 @@ import ai.koog.agents.core.tools.ToolRegistry
1515
import ai.koog.agents.features.eventHandler.feature.handleEvents
1616
import ai.koog.prompt.dsl.prompt
1717
import ai.koog.prompt.executor.clients.LLMClient
18-
import ai.koog.prompt.executor.llms.SingleLLMPromptExecutor
18+
import ai.koog.prompt.executor.llms.MultiLLMPromptExecutor
1919
import ai.koog.prompt.llm.LLModel
2020
import com.jetbrains.example.koog.compose.agents.common.AgentProvider
2121
import com.jetbrains.example.koog.compose.agents.common.ExitTool
@@ -33,7 +33,7 @@ internal class CalculatorAgentProvider(private val provideLLMClient: suspend ()
3333
onAssistantMessage: suspend (String) -> String,
3434
): AIAgent<String, String> {
3535
val (llmClient, model) = provideLLMClient.invoke()
36-
val executor = SingleLLMPromptExecutor(llmClient = llmClient)
36+
val executor = MultiLLMPromptExecutor(llmClient)
3737

3838
// Create tool registry with calculator tools
3939
val toolRegistry = ToolRegistry {

examples/demo-compose-app/commonApp/src/commonMain/kotlin/com/jetbrains/example/koog/compose/agents/calculator/CalculatorTools.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ package com.jetbrains.example.koog.compose.agents.calculator
22

33
import ai.koog.agents.core.tools.Tool
44
import ai.koog.agents.core.tools.annotations.LLMDescription
5+
import ai.koog.serialization.typeToken
56
import kotlinx.serialization.Serializable
67

78
sealed class CalculatorTool(
89
name: String,
910
description: String,
1011
) : Tool<CalculatorTool.Args, CalculatorTool.Result>(
11-
argsSerializer = Args.serializer(),
12-
resultSerializer = Result.serializer(),
12+
argsType = typeToken<Args>(),
13+
resultType = typeToken<Result>(),
1314
name = name,
1415
description = description
1516
) {

examples/demo-compose-app/commonApp/src/commonMain/kotlin/com/jetbrains/example/koog/compose/agents/common/ExitTool.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ package com.jetbrains.example.koog.compose.agents.common
22

33
import ai.koog.agents.core.tools.SimpleTool
44
import ai.koog.agents.core.tools.annotations.LLMDescription
5+
import ai.koog.serialization.typeToken
56
import kotlinx.serialization.Serializable
67

78
object ExitTool : SimpleTool<ExitTool.Args>(
8-
argsSerializer = Args.serializer(),
9+
argsType = typeToken<Args>(),
910
name = "exit",
1011
description = "Exit the agent session with the specified result. Call this tool to finish the conversation with the user."
1112
) {

examples/demo-compose-app/commonApp/src/commonMain/kotlin/com/jetbrains/example/koog/compose/agents/weather/WeatherAgentProvider.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.jetbrains.example.koog.compose.agents.weather
22

33
import ai.koog.agents.core.agent.AIAgent
44
import ai.koog.agents.core.agent.config.AIAgentConfig
5-
import ai.koog.agents.core.dsl.builder.forwardTo
5+
import ai.koog.agents.core.dsl.builder.node
66
import ai.koog.agents.core.dsl.builder.strategy
77
import ai.koog.agents.core.dsl.extension.nodeExecuteMultipleTools
88
import ai.koog.agents.core.dsl.extension.nodeLLMCompressHistory
@@ -15,7 +15,7 @@ import ai.koog.agents.core.tools.ToolRegistry
1515
import ai.koog.agents.features.eventHandler.feature.handleEvents
1616
import ai.koog.prompt.dsl.prompt
1717
import ai.koog.prompt.executor.clients.LLMClient
18-
import ai.koog.prompt.executor.llms.SingleLLMPromptExecutor
18+
import ai.koog.prompt.executor.llms.MultiLLMPromptExecutor
1919
import ai.koog.prompt.llm.LLModel
2020
import com.jetbrains.example.koog.compose.agents.common.AgentProvider
2121
import com.jetbrains.example.koog.compose.agents.common.ExitTool
@@ -35,7 +35,7 @@ internal class WeatherAgentProvider(private val provideLLMClient: suspend () ->
3535
onAssistantMessage: suspend (String) -> String,
3636
): AIAgent<String, String> {
3737
val (llmClient, model) = provideLLMClient.invoke()
38-
val executor = SingleLLMPromptExecutor(llmClient)
38+
val executor = MultiLLMPromptExecutor(llmClient)
3939

4040
// Create tool registry with weather tools
4141
val toolRegistry = ToolRegistry {
@@ -139,7 +139,7 @@ internal class WeatherAgentProvider(private val provideLLMClient: suspend () ->
139139
onErrorEvent("${ctx.throwable.message}")
140140
}
141141

142-
onAgentCompleted { ctx ->
142+
onAgentCompleted { _ ->
143143
// Skip finish event handling
144144
}
145145
}

examples/demo-compose-app/commonApp/src/commonMain/kotlin/com/jetbrains/example/koog/compose/agents/weather/WeatherTools.kt

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.jetbrains.example.koog.compose.agents.weather
22

33
import ai.koog.agents.core.tools.Tool
44
import ai.koog.agents.core.tools.annotations.LLMDescription
5+
import ai.koog.serialization.JSONSerializer
6+
import ai.koog.serialization.typeToken
57
import kotlinx.datetime.DateTimePeriod
68
import kotlinx.datetime.LocalDate
79
import kotlinx.datetime.LocalDateTime
@@ -44,8 +46,8 @@ sealed interface WeatherTools {
4446
val defaultTimeZone: TimeZone = UTC_ZONE,
4547
val clock: Clock = CLOCK,
4648
) : Tool<CurrentDatetimeTool.Args, CurrentDatetimeTool.Result>(
47-
argsSerializer = Args.serializer(),
48-
resultSerializer = Result.serializer(),
49+
argsType = typeToken<Args>(),
50+
resultType = typeToken<Result>(),
4951
name = "current_datetime",
5052
description = "Get the current date and time in the specified timezone"
5153
) {
@@ -87,7 +89,7 @@ sealed interface WeatherTools {
8789
)
8890
}
8991

90-
override fun encodeResultToString(result: Result): String {
92+
override fun encodeResultToString(result: Result, serializer: JSONSerializer): String {
9193
return "Current datetime: ${result.datetime}, Date: ${result.date}, Time: ${result.time}, Timezone: ${result.timezone}"
9294
}
9395
}
@@ -99,8 +101,8 @@ sealed interface WeatherTools {
99101
val defaultTimeZone: TimeZone = UTC_ZONE,
100102
val clock: Clock = CLOCK,
101103
) : Tool<AddDatetimeTool.Args, AddDatetimeTool.Result>(
102-
argsSerializer = Args.serializer(),
103-
resultSerializer = Result.serializer(),
104+
argsType = typeToken<Args>(),
105+
resultType = typeToken<Result>(),
104106
name = "add_datetime",
105107
description = "Add a duration to a date. Use this tool when you need to calculate offsets, such as tomorrow, in two days, etc."
106108
) {
@@ -159,7 +161,7 @@ sealed interface WeatherTools {
159161
)
160162
}
161163

162-
override fun encodeResultToString(result: Result): String {
164+
override fun encodeResultToString(result: Result, serializer: JSONSerializer): String {
163165
return buildString {
164166
append("Date: ${result.date}")
165167
if (result.originalDate.isBlank()) {
@@ -196,8 +198,8 @@ sealed interface WeatherTools {
196198
private val openMeteoClient: OpenMeteoClient = OpenMeteoClient(),
197199
val defaultTimeZone: TimeZone = UTC_ZONE
198200
) : Tool<WeatherForecastTool.Args, WeatherForecastTool.Result>(
199-
argsSerializer = Args.serializer(),
200-
resultSerializer = Result.serializer(),
201+
argsType = typeToken<Args>(),
202+
resultType = typeToken<Result>(),
201203
name = "weather_forecast",
202204
description = "Get a weather forecast for a location with specified granularity (daily or hourly)"
203205
) {
@@ -350,7 +352,7 @@ sealed interface WeatherTools {
350352
}
351353
}
352354

353-
override fun encodeResultToString(result: Result): String {
355+
override fun encodeResultToString(result: Result, serializer: JSONSerializer): String {
354356
val granularityText = when (result.granularity) {
355357
Granularity.DAILY -> "daily"
356358
Granularity.HOURLY -> "hourly"

0 commit comments

Comments
 (0)