Skip to content

Commit 295f0a9

Browse files
committed
(#234) Allow appending handlers for the EventHandler feature
- Update EventHandler feature with the ability to append multiple handlers instead of set one function; - Update examples and documentation; - Deprecate Kotlin setters for the EventHandler feature.
1 parent ce8b814 commit 295f0a9

File tree

20 files changed

+538
-189
lines changed

20 files changed

+538
-189
lines changed

agents/agents-core/src/commonMain/kotlin/ai/koog/agents/core/agent/AIAgent.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,10 +379,11 @@ public open class AIAgent(
379379
val messageContent = message.content
380380
val messageError = message.error
381381

382+
logger.debug { "Finished execution chain, processing final result (content: $messageContent, error: $messageError)" }
383+
382384
if (messageError == null) {
383-
logger.debug { "Finished execution chain, processing final result..." }
384-
check(messageContent != null) { NO_CONTENT }
385385

386+
check(messageContent != null) { NO_CONTENT }
386387
check(messageContent.toolName == TerminationTool.NAME) { INVALID_TOOL }
387388

388389
val element = messageContent.toolArgs[TerminationTool.ARG]

agents/agents-core/src/commonTest/kotlin/ai/koog/agents/core/dsl/extension/AIAgentNodesHistoryCompressionTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class AIAgentNodesHistoryCompressionTest {
6464
}
6565
) {
6666
install(EventHandler) {
67-
onAgentFinished = { _, result -> results += result }
67+
onAgentFinished { _, result -> results += result }
6868
}
6969
}
7070

@@ -116,7 +116,7 @@ class AIAgentNodesHistoryCompressionTest {
116116
}
117117
) {
118118
install(EventHandler) {
119-
onAgentFinished = { _, result -> results += result }
119+
onAgentFinished { _, result -> results += result }
120120
}
121121
}
122122

@@ -171,7 +171,7 @@ class AIAgentNodesHistoryCompressionTest {
171171
}
172172
) {
173173
handleEvents {
174-
onAgentFinished = { _, result -> results += result }
174+
onAgentFinished { _, result -> results += result }
175175
}
176176
}
177177

agents/agents-core/src/commonTest/kotlin/ai/koog/agents/core/dsl/extension/AIAgentNodesTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class AIAgentNodesTest {
4949
}
5050
) {
5151
install(EventHandler) {
52-
onAgentFinished = { _, result -> results += result }
52+
onAgentFinished { _, result -> results += result }
5353
}
5454
}
5555

agents/agents-features/agents-features-event-handler/Module.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ val testAgent = AIAgents(
5656
var agentFinished = false
5757

5858
handleEvents {
59-
onToolCall = { stage, tool, toolArgs ->
59+
onToolCall { stage, tool, toolArgs ->
6060
toolCalled = true
6161
println("[DEBUG_LOG] Tool called: ${tool.name}")
6262
}
6363

64-
onAgentFinished = { strategyName, result ->
64+
onAgentFinished { strategyName, result ->
6565
agentFinished = true
6666
println("[DEBUG_LOG] Agent finished with result: $result")
6767
}
@@ -86,33 +86,33 @@ val agent = AIAgents(
8686
) {
8787
handleEvents {
8888
// Log LLM interactions
89-
onBeforeLLMCall = { prompt ->
89+
onBeforeLLMCall { prompt ->
9090
println("Sending prompt to LLM: ${prompt.toString().take(100)}...")
9191
}
9292

93-
onAfterLLMCall = { response ->
93+
onAfterLLMCall { response ->
9494
println("Received response from LLM: ${response.take(100)}...")
9595
}
9696

9797
// Monitor tool usage
98-
onToolCall = { stage, tool, toolArgs ->
98+
onToolCall { stage, tool, toolArgs ->
9999
println("Tool called: ${tool.name} with args: $toolArgs")
100100
}
101101

102-
onToolCallResult = { stage, tool, toolArgs, result ->
102+
onToolCallResult { stage, tool, toolArgs, result ->
103103
println("Tool result: $result")
104104
}
105105

106-
onToolCallFailure = { stage, tool, toolArgs, throwable ->
106+
onToolCallFailure { stage, tool, toolArgs, throwable ->
107107
println("Tool failed: ${throwable.message}")
108108
}
109109

110110
// Track agent progress
111-
onStrategyStarted = { strategy ->
111+
onStrategyStarted { strategy ->
112112
println("Strategy started: ${strategy.name}")
113113
}
114114

115-
onStrategyFinished = { strategyName, result ->
115+
onStrategyFinished { strategyName, result ->
116116
println("Strategy finished: $strategyName with result: $result")
117117
}
118118
}

agents/agents-features/agents-features-event-handler/src/commonMain/kotlin/ai/koog/agents/features/eventHandler/feature/EventHandler.kt

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ import kotlin.uuid.ExperimentalUuidApi
1919
* Example usage:
2020
* ```
2121
* handleEvents {
22-
* onToolCall = { stage, tool, toolArgs ->
22+
* onToolCall { stage, tool, toolArgs ->
2323
* println("Tool called: ${tool.name} with args $toolArgs")
2424
* }
2525
*
26-
* onAgentFinished = { strategyName, result ->
26+
* onAgentFinished { strategyName, result ->
2727
* println("Agent finished with result: $result")
2828
* }
2929
* }
@@ -44,11 +44,11 @@ public class EventHandler {
4444
* Example usage:
4545
* ```
4646
* handleEvents {
47-
* onToolCall = { stage, tool, toolArgs ->
47+
* onToolCall { stage, tool, toolArgs ->
4848
* println("Tool called: ${tool.name} with args $toolArgs")
4949
* }
5050
*
51-
* onAgentFinished = { strategyName, result ->
51+
* onAgentFinished { strategyName, result ->
5252
* println("Agent finished with result: $result")
5353
* }
5454
* }
@@ -74,27 +74,27 @@ public class EventHandler {
7474
//region Intercept Agent Events
7575

7676
pipeline.interceptBeforeAgentStarted(this, featureImpl) intercept@{
77-
config.onBeforeAgentStarted(strategy, agent)
77+
config.invokeOnBeforeAgentStarted(strategy, agent)
7878
}
7979

8080
pipeline.interceptAgentFinished(this, featureImpl) intercept@{ strategyName, result ->
81-
config.onAgentFinished(strategyName, result)
81+
config.invokeOnAgentFinished(strategyName, result)
8282
}
8383

8484
pipeline.interceptAgentRunError(this, featureImpl) intercept@{ strategyName, sessionUuid, throwable ->
85-
config.onAgentRunError(strategyName, sessionUuid, throwable)
85+
config.invokeOnAgentRunError(strategyName, sessionUuid, throwable)
8686
}
8787

8888
//endregion Intercept Agent Events
8989

9090
//region Intercept Strategy Events
9191

9292
pipeline.interceptStrategyStarted(this, featureImpl) intercept@{
93-
config.onStrategyStarted(strategy)
93+
config.invokeOnStrategyStarted(strategy)
9494
}
9595

9696
pipeline.interceptStrategyFinished(this, featureImpl) intercept@{ result ->
97-
config.onStrategyFinished(strategy, result)
97+
config.invokeOnStrategyFinished(strategy, result)
9898
}
9999

100100
//endregion Intercept Strategy Events
@@ -105,46 +105,46 @@ public class EventHandler {
105105
this,
106106
featureImpl
107107
) intercept@{ node: AIAgentNodeBase<*, *>, context: AIAgentContextBase, input: Any? ->
108-
config.onBeforeNode(node, context, input)
108+
config.invokeOnBeforeNode(node, context, input)
109109
}
110110

111111
pipeline.interceptAfterNode(
112112
this,
113113
featureImpl
114114
) intercept@{ node: AIAgentNodeBase<*, *>, context: AIAgentContextBase, input: Any?, output: Any? ->
115-
config.onAfterNode(node, context, input, output)
115+
config.invokeOnAfterNode(node, context, input, output)
116116
}
117117

118118
//endregion Intercept Node Events
119119

120120
//region Intercept LLM Call Events
121121

122122
pipeline.interceptBeforeLLMCall(this, featureImpl) intercept@{ prompt, tools, model, sessionUuid ->
123-
config.onBeforeLLMCall(prompt, tools, model, sessionUuid)
123+
config.invokeOnBeforeLLMCall(prompt, tools, model, sessionUuid)
124124
}
125125

126126
pipeline.interceptAfterLLMCall(this, featureImpl) intercept@{ prompt, tools, model, responses, sessionUuid ->
127-
config.onAfterLLMCall(prompt, tools, model, responses, sessionUuid)
127+
config.invokeOnAfterLLMCall(prompt, tools, model, responses, sessionUuid)
128128
}
129129

130130
//endregion Intercept LLM Call Events
131131

132132
//region Intercept Tool Call Events
133133

134134
pipeline.interceptToolCall(this, featureImpl) intercept@{ tool, toolArgs ->
135-
config.onToolCall(tool, toolArgs)
135+
config.invokeOnToolCall(tool, toolArgs)
136136
}
137137

138138
pipeline.interceptToolValidationError(this, featureImpl) intercept@{ tool, toolArgs, value ->
139-
config.onToolValidationError(tool, toolArgs, value)
139+
config.invokeOnToolValidationError(tool, toolArgs, value)
140140
}
141141

142142
pipeline.interceptToolCallFailure(this, featureImpl) intercept@{ tool, toolArgs, throwable ->
143-
config.onToolCallFailure(tool, toolArgs, throwable)
143+
config.invokeOnToolCallFailure(tool, toolArgs, throwable)
144144
}
145145

146146
pipeline.interceptToolCallResult(this, featureImpl) intercept@{ tool, toolArgs, result ->
147-
config.onToolCallResult(tool, toolArgs, result)
147+
config.invokeOnToolCallResult(tool, toolArgs, result)
148148
}
149149

150150
//endregion Intercept Tool Call Events
@@ -166,12 +166,12 @@ public class EventHandler {
166166
* ```
167167
* handleEvents {
168168
* // Log when tools are called
169-
* onToolCall = { stage, tool, toolArgs ->
169+
* onToolCall { stage, tool, toolArgs ->
170170
* println("Tool called: ${tool.name}")
171171
* }
172172
*
173173
* // Handle errors
174-
* onAgentRunError = { strategyName, throwable ->
174+
* onAgentRunError { strategyName, throwable ->
175175
* logger.error("Agent error: ${throwable.message}")
176176
* }
177177
* }

0 commit comments

Comments
 (0)