Skip to content

Commit a08ba11

Browse files
committed
Add tests for environment config loading and model id parsing
1 parent 4fbb398 commit a08ba11

File tree

7 files changed

+1196
-150
lines changed

7 files changed

+1196
-150
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
ktor:
2+
application:
3+
modules:
4+
- ai.koog.agents.example.ktor.KtorIntegrationExampleKt.main
5+
6+
koog:
7+
openai:
8+
apikey: "your-openai-api-key"
9+
baseUrl: "https://api.openai.com"
10+
timeout:
11+
requestTimeoutMillis: 30000
12+
connectTimeoutMillis: 10000
13+
socketTimeoutMillis: 30000
14+
15+
anthropic:
16+
apikey: "your-anthropic-api-key"
17+
baseUrl: "https://api.anthropic.com"
18+
timeout:
19+
requestTimeoutMillis: 30000
20+
21+
google:
22+
apikey: "your-google-api-key"
23+
baseUrl: "https://generativelanguage.googleapis.com"
24+
25+
openrouter:
26+
apikey: "your-openrouter-api-key"
27+
baseUrl: "https://openrouter.ai"
28+
29+
ollama:
30+
enable: true
31+
baseUrl: "http://localhost:11434"
32+
timeout:
33+
requestTimeoutMillis: 60000

koog-agents/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ val excluded = setOf(
1212
":examples",
1313
":integration-tests",
1414
":koog-spring-boot-starter",
15+
":koog-ktor-plugin",
1516
project.path, // the current project should not depend on itself
1617
)
1718

@@ -51,8 +52,7 @@ val included = setOf(
5152
":prompt:prompt-tokenizer",
5253
":prompt:prompt-xml",
5354
":rag:rag-base",
54-
":rag:vector-storage",
55-
":koog-ktor-plugin"
55+
":rag:vector-storage"
5656
)
5757

5858
kotlin {

koog-ktor-plugin/src/commonMain/kotlin/ai/koog/ktor/KoogKtorServerPlugin.kt

Lines changed: 2 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import ai.koog.agents.core.feature.AIAgentFeature
1212
import ai.koog.agents.core.tools.ToolDescriptor
1313
import ai.koog.agents.core.tools.ToolRegistry
1414
import ai.koog.agents.features.common.config.FeatureConfig
15+
import ai.koog.ktor.utils.config.getModelFromIdentifier
16+
import ai.koog.ktor.utils.config.loadEnvironmentConfig
1517
import ai.koog.prompt.dsl.ModerationResult
1618
import ai.koog.prompt.dsl.Prompt
1719
import ai.koog.prompt.dsl.PromptBuilder
@@ -986,154 +988,6 @@ public val Koog: RouteScopedPlugin<KoogAgentsConfig> = createRouteScopedPlugin(
986988
application.attributes.put(KoogPluginKey, koogInstance)
987989
}
988990

989-
private fun loadEnvironmentConfig(envConfig: ApplicationConfig): KoogAgentsConfig {
990-
val koogConfig = KoogAgentsConfig()
991-
992-
// Check if koog configuration exists
993-
if (envConfig.propertyOrNull("koog") != null) {
994-
// OpenAI configuration
995-
if (envConfig.propertyOrNull("koog.openai") != null) {
996-
val apiKey = envConfig.propertyOrNull("koog.openai.apikey")?.getString()
997-
if (apiKey != null && apiKey.isNotEmpty()) {
998-
koogConfig.openAI(apiKey) {
999-
envConfig.propertyOrNull("koog.openai.baseUrl")?.getString()?.let { baseUrl = it }
1000-
1001-
// Configure timeouts if present
1002-
if (envConfig.propertyOrNull("koog.openai.timeout") != null) {
1003-
timeouts {
1004-
envConfig.propertyOrNull("koog.openai.timeout.requestTimeoutMillis")?.getString()
1005-
?.toLongOrNull()?.let {
1006-
requestTimeoutMillis = it
1007-
}
1008-
envConfig.propertyOrNull("koog.openai.timeout.connectTimeoutMillis")?.getString()
1009-
?.toLongOrNull()?.let {
1010-
connectTimeoutMillis = it
1011-
}
1012-
envConfig.propertyOrNull("koog.openai.timeout.socketTimeoutMillis")?.getString()
1013-
?.toLongOrNull()?.let {
1014-
socketTimeoutMillis = it
1015-
}
1016-
}
1017-
}
1018-
}
1019-
}
1020-
}
1021-
1022-
// Anthropic configuration
1023-
if (envConfig.propertyOrNull("koog.anthropic") != null) {
1024-
val apiKey = envConfig.propertyOrNull("koog.anthropic.apikey")?.getString()
1025-
if (apiKey != null && apiKey.isNotEmpty()) {
1026-
koogConfig.anthropic(apiKey) {
1027-
envConfig.propertyOrNull("koog.anthropic.baseUrl")?.getString()?.let { baseUrl = it }
1028-
1029-
// Configure timeouts if present
1030-
if (envConfig.propertyOrNull("koog.anthropic.timeout") != null) {
1031-
timeouts {
1032-
envConfig.propertyOrNull("koog.anthropic.timeout.requestTimeoutMillis")?.getString()
1033-
?.toLongOrNull()?.let {
1034-
requestTimeoutMillis = it
1035-
}
1036-
envConfig.propertyOrNull("koog.anthropic.timeout.connectTimeoutMillis")?.getString()
1037-
?.toLongOrNull()?.let {
1038-
connectTimeoutMillis = it
1039-
}
1040-
envConfig.propertyOrNull("koog.anthropic.timeout.socketTimeoutMillis")?.getString()
1041-
?.toLongOrNull()?.let {
1042-
socketTimeoutMillis = it
1043-
}
1044-
}
1045-
}
1046-
}
1047-
}
1048-
}
1049-
1050-
// Google configuration
1051-
if (envConfig.propertyOrNull("koog.google") != null) {
1052-
val apiKey = envConfig.propertyOrNull("koog.google.apikey")?.getString()
1053-
if (apiKey != null && apiKey.isNotEmpty()) {
1054-
koogConfig.google(apiKey) {
1055-
envConfig.propertyOrNull("koog.google.baseUrl")?.getString()?.let { baseUrl = it }
1056-
1057-
// Configure timeouts if present
1058-
if (envConfig.propertyOrNull("koog.google.timeout") != null) {
1059-
timeouts {
1060-
envConfig.propertyOrNull("koog.google.timeout.requestTimeoutMillis")?.getString()
1061-
?.toLongOrNull()?.let {
1062-
requestTimeoutMillis = it
1063-
}
1064-
envConfig.propertyOrNull("koog.google.timeout.connectTimeoutMillis")?.getString()
1065-
?.toLongOrNull()?.let {
1066-
connectTimeoutMillis = it
1067-
}
1068-
envConfig.propertyOrNull("koog.google.timeout.socketTimeoutMillis")?.getString()
1069-
?.toLongOrNull()?.let {
1070-
socketTimeoutMillis = it
1071-
}
1072-
}
1073-
}
1074-
}
1075-
}
1076-
}
1077-
1078-
// OpenRouter configuration
1079-
if (envConfig.propertyOrNull("koog.openrouter") != null) {
1080-
val apiKey = envConfig.propertyOrNull("koog.openrouter.apikey")?.getString()
1081-
if (apiKey != null && apiKey.isNotEmpty()) {
1082-
koogConfig.openRouter(apiKey) {
1083-
envConfig.propertyOrNull("koog.openrouter.baseUrl")?.getString()?.let { baseUrl = it }
1084-
1085-
// Configure timeouts if present
1086-
if (envConfig.propertyOrNull("koog.openrouter.timeout") != null) {
1087-
timeouts {
1088-
envConfig.propertyOrNull("koog.openrouter.timeout.requestTimeoutMillis")?.getString()
1089-
?.toLongOrNull()?.let {
1090-
requestTimeoutMillis = it
1091-
}
1092-
envConfig.propertyOrNull("koog.openrouter.timeout.connectTimeoutMillis")?.getString()
1093-
?.toLongOrNull()?.let {
1094-
connectTimeoutMillis = it
1095-
}
1096-
envConfig.propertyOrNull("koog.openrouter.timeout.socketTimeoutMillis")?.getString()
1097-
?.toLongOrNull()?.let {
1098-
socketTimeoutMillis = it
1099-
}
1100-
}
1101-
}
1102-
}
1103-
}
1104-
}
1105-
1106-
// Ollama configuration
1107-
if (envConfig.propertyOrNull("koog.ollama") != null) {
1108-
koogConfig.ollama {
1109-
envConfig.propertyOrNull("koog.ollama.baseUrl")?.getString()?.let { baseUrl = it }
1110-
1111-
// Configure timeouts if present
1112-
if (envConfig.propertyOrNull("koog.ollama.timeout") != null) {
1113-
timeouts {
1114-
envConfig.propertyOrNull("koog.ollama.timeout.requestTimeoutMillis")?.getString()
1115-
?.toLongOrNull()
1116-
?.let {
1117-
requestTimeoutMillis = it
1118-
}
1119-
envConfig.propertyOrNull("koog.ollama.timeout.connectTimeoutMillis")?.getString()
1120-
?.toLongOrNull()
1121-
?.let {
1122-
connectTimeoutMillis = it
1123-
}
1124-
envConfig.propertyOrNull("koog.ollama.timeout.socketTimeoutMillis")?.getString()?.toLongOrNull()
1125-
?.let {
1126-
socketTimeoutMillis = it
1127-
}
1128-
}
1129-
}
1130-
}
1131-
}
1132-
}
1133-
1134-
return koogConfig
1135-
}
1136-
1137991
/**
1138992
* Represents a type alias for a lambda function that extends the [FeatureContext] receiver,
1139993
* allowing the configuration or addition of specific features to a Kotlin AI Agent instance.

0 commit comments

Comments
 (0)