기록용이라 대충 작성.
[versions]
androidx-lifecycle = "2.9.5"
composeHotReload = "1.0.0-rc02"
composeMultiplatform = "1.9.1"
junit = "4.13.2"
kotlin = "2.2.20"
kotlinx-coroutines = "1.10.2"
koog-agent = "0.5.3"
kotlinx-serialization-json = "1.8.1"
slf4j = "2.0.9"
kermit = "2.0.4"
[libraries]
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
kotlin-testJunit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" }
junit = { module = "junit:junit", version.ref = "junit" }
androidx-lifecycle-viewmodelCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" }
androidx-lifecycle-runtimeCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidx-lifecycle" }
kotlinx-coroutinesSwing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" }
koog-agent = { module = "ai.koog:koog-agents", version.ref = "koog-agent" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" }
log-slf4j = { module = "org.slf4j:slf4j-simple", version.ref = "slf4j" }
log-kermit = { module = "co.touchlab:kermit", version.ref = "kermit" }
[plugins]
composeHotReload = { id = "org.jetbrains.compose.hot-reload", version.ref = "composeHotReload" }
composeMultiplatform = { id = "org.jetbrains.compose", version.ref = "composeMultiplatform" }
composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
위 의존성을 주입해서 다음과 같이 AIExecutor를 정의.
fun simpleCustomAIExecutor(
apiToken: String
): SingleLLMPromptExecutor {
...
val customClient = OpenAILLMClient(
apiKey = apiToken,
setting = customSettings
)
return SingleLLMPromptExecutor(llmClient = customClient)
}
여기서 갑자기 `java.lang.NoClassDefFoundError: kotlinx/datetime/Clock$System`에러가 터지면서, ClassNotFound 어쩌구 에러가 뜨면서 못 찾겠다고 버틴다.
이유가 좀 어이가 없는데,
@OptIn(ExperimentalAtomicApi::class)
public open class OpenAILLMClient(
apiKey: String,
private val settings: OpenAIClientSettings = OpenAIClientSettings(),
baseClient: HttpClient = HttpClient(),
clock: Clock = Clock.System,
) : AbstractOpenAILLMClient<OpenAIChatCompletionResponse, OpenAIChatCompletionStreamResponse>(
apiKey,
settings,
baseClient,
clock,
staticLogger
),
...
ai.koog.prompt.executor.clients.openai.OpenAILLMClient가 기본값으로 받은 kotlinx.datetime.Clock이 deprecated 되었다. (kotlinx말고 kotlin 어디에 있던 거 사용하라면서 아예 코드를 다 날려버림;;)
어라 그럼 다운그레이드 하면되는 건가?

그런데 내가 사용하는 건 0.6.2 버전이 자동 주입되었고, Clock.System이 제거된 건 0.7.0.
그럼 대체 내 거는 왜 안되는 건데?
koog만 써서 테스트할 때는 아무런 문제가 없었는데, 아무래도 KMP 쪽 의존성 주입하면서 뭔가 제대로 꼬였다고 추측하고 있다.
나도 진짜 모르겠다. ㅜㅜㅜㅜ
여튼 다행히 나와 동일한 문제를 겪은 사람이 있었다.
그런데 처음에 잘못 해석해서 0.7.1-0.6.x-compat 버전 사용하라는 걸, 그냥 0.6.x 버전으로 내리라는 소린가 했는데
https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-datetime/0.7.1-0.6.x-compat
진짜 말 그대로 0.7.1-0.6.x-compat 버전을 사용하라는 소리였다;;
아니, github release만 봐서 당연히 없는 줄 알았는데 🤦🏻♂️
[versions]
kotlinx-datetime = "0.7.1-0.6.x-compat"
[libraries]
kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" }
kotlin {
jvm()
sourceSets {
...
jvmMain.dependencies {
runtimeOnly(libs.kotlinx.datetime)
...
}
}
}
이렇게 하면 해결된다.
"아니, 이렇게 쉽게 해결되는 걸 뭐하러 포스팅까지 하나요?"

내 말이....올릴까 말까 고민했다.
다만 koog 관련 자료는 너무 찾아보기 힘들어서, 그냥 뭐 보일 때마다 작성할 예정.