Skip to content

Agent 事件

Agent 事件是作為 Agent 工作流(workflow)一部分發生的操作或互動。它們包括:

  • Agent 生命週期事件
  • 策略(Strategy)事件
  • 節點(Node)執行事件
  • LLM 呼叫事件
  • LLM 串流事件
  • 工具(Tool)執行事件

註:功能事件定義在 agents-core 模組中,並位於套件 ai.koog.agents.core.feature.model.events 下。諸如 agents-features-traceagents-features-event-handler 等功能會取用這些事件,以處理並轉發 Agent 執行期間建立的訊息。

預定義事件類型

Koog 提供預定義的事件類型,可用於自訂訊息處理器。根據其相關的實體,預定義事件可分為以下幾類:

Agent 事件

AgentStartingEvent

代表 Agent 執行的開始。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
agentIdStringAI Agent 的唯一識別碼。
runIdStringAI Agent 執行的唯一識別碼。

AgentCompletedEvent

代表 Agent 執行的結束。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
agentIdStringAI Agent 的唯一識別碼。
runIdStringAI Agent 執行的唯一識別碼。
resultStringAgent 執行的結果。如果沒有結果,可以為 null

AgentExecutionFailedEvent

代表 Agent 執行期間發生的錯誤。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
agentIdStringAI Agent 的唯一識別碼。
runIdStringAI Agent 執行的唯一識別碼。
errorAIAgentErrorAgent 執行期間發生的特定錯誤。欲了解更多資訊,請參閱 AIAgentError

AgentClosingEvent

代表 Agent 的關閉或終止。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
agentIdStringAI Agent 的唯一識別碼。

AIAgentError 類別提供有關 Agent 執行期間發生錯誤的更多詳細資訊。包含以下欄位:

名稱資料型別必填預設值描述
messageString提供有關特定錯誤的詳細資訊訊息。
stackTraceString到最後執行程式碼為止的堆疊記錄集合。
causeStringnull錯誤原因(如果可用)。

AgentExecutionInfo 類別提供有關執行路徑的上下文資訊,以便追蹤 Agent 執行中的巢狀執行上下文。包含以下欄位:

名稱資料型別必填預設值描述
parentAgentExecutionInfonull對父級執行上下文的引用。如果為 null,則代表根執行層級。
partNameString代表當前執行部分或片段名稱的字串。

策略事件

GraphStrategyStartingEvent

代表基於圖(graph-based)的策略執行的開始。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略執行的唯一識別碼。
strategyNameString策略的名稱。
graphStrategyEventGraph代表策略工作流的圖結構。

FunctionalStrategyStartingEvent

代表函數式(functional)策略執行的開始。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略執行的唯一識別碼。
strategyNameString策略的名稱。

StrategyCompletedEvent

代表策略執行的結束。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略執行的唯一識別碼。
strategyNameString策略的名稱。
resultString執行的結果。如果沒有結果,可以為 null

節點事件

NodeExecutionStartingEvent

代表節點執行的開始。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略執行的唯一識別碼。
nodeNameString開始執行的節點名稱。
inputJsonElementnull節點的輸入值。

NodeExecutionCompletedEvent

代表節點執行的結束。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略執行的唯一識別碼。
nodeNameString結束執行的節點名稱。
inputJsonElementnull節點的輸入值。
outputJsonElementnull節點產生的輸出值。

NodeExecutionFailedEvent

代表節點執行期間發生的錯誤。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略執行的唯一識別碼。
nodeNameString發生錯誤的節點名稱。
inputJsonElementnull提供給節點的輸入資料。
errorAIAgentError節點執行期間發生的特定錯誤。欲了解更多資訊,請參閱 AIAgentError

子圖事件

SubgraphExecutionStartingEvent

代表子圖(subgraph)執行的開始。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略執行的唯一識別碼。
subgraphNameString開始執行的子圖名稱。
inputJsonElementnull子圖的輸入值。

SubgraphExecutionCompletedEvent

代表子圖執行的結束。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略執行的唯一識別碼。
subgraphNameString結束執行的子圖名稱。
inputJsonElementnull子圖的輸入值。
outputJsonElementnull子圖產生的輸出值。

SubgraphExecutionFailedEvent

代表子圖執行期間發生的錯誤。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略執行的唯一識別碼。
subgraphNameString發生錯誤的子圖名稱。
inputJsonElementnull提供給子圖的輸入資料。
errorAIAgentError子圖執行期間發生的特定錯誤。欲了解更多資訊,請參閱 AIAgentError

LLM 呼叫事件

LLMCallStartingEvent

代表 LLM 呼叫的開始。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdStringLLM 執行的唯一識別碼。
promptPrompt傳送給模型的提示。欲了解更多資訊,請參閱 Prompt
modelModelInfo模型資訊。請參閱 ModelInfo
toolsList<String>模型可以呼叫的工具列表。

Prompt 類別代表提示的資料結構,由訊息列表、唯一識別碼和語言模型設定的選用參數組成。包含以下欄位:

名稱資料型別必填預設值描述
messagesList<Message>組成提示的訊息列表。
idString提示的唯一識別碼。
paramsLLMParamsLLMParams()控制 LLM 產生內容方式的設定。

ModelInfo 類別代表有關語言模型的資訊,包括其提供者、模型識別碼和特性。包含以下欄位:

名稱資料型別必填預設值描述
providerString提供者識別碼(例如 "openai"、"google"、"anthropic")。
modelString模型識別碼(例如 "gpt-4"、"claude-3")。
displayNameStringnull選用的模型易讀顯示名稱。
contextLengthLongnull模型可以處理的最大權杖(tokens)數量。
maxOutputTokensLongnull模型可以產生的最大權杖數量。

LLMCallCompletedEvent

代表 LLM 呼叫的結束。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdStringLLM 執行的唯一識別碼。
promptPrompt呼叫中使用的提示。
modelModelInfo模型資訊。請參閱 ModelInfo
responsesList<Message.Response>模型傳回的一或多個回應。
moderationResponseModerationResultnull稽核回應(如果有)。

LLMCallFailedEvent

代表 LLM 呼叫期間發生的錯誤。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdStringLLM 執行的唯一識別碼。
promptPrompt傳送給模型的提示。
modelModelInfo模型資訊。請參閱 ModelInfo
toolsList<String>模型可以呼叫的工具列表。
errorAIAgentError呼叫期間發生的特定錯誤。欲了解更多資訊,請參閱 AIAgentError

LLM 串流事件

LLMStreamingStartingEvent

代表 LLM 串流呼叫的開始。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdStringLLM 執行的唯一識別碼。
promptPrompt傳送給模型的提示。
modelModelInfo模型資訊。請參閱 ModelInfo
toolsList<String>模型可以呼叫的工具列表。

LLMStreamingFrameReceivedEvent

代表從 LLM 收到的串流影格(frame)。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdStringLLM 執行的唯一識別碼。
promptPrompt傳送給模型的提示。
modelModelInfo模型資訊。請參閱 ModelInfo
frameStreamFrame從串流收到的影格。

LLMStreamingFailedEvent

代表 LLM 串流呼叫期間發生的錯誤。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdStringLLM 執行的唯一識別碼。
promptPrompt傳送給模型的提示。
modelModelInfo模型資訊。請參閱 ModelInfo
errorAIAgentError串流期間發生的特定錯誤。欲了解更多資訊,請參閱 AIAgentError

LLMStreamingCompletedEvent

代表 LLM 串流呼叫的結束。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdStringLLM 執行的唯一識別碼。
promptPrompt傳送給模型的提示。
modelModelInfo模型資訊。請參閱 ModelInfo
toolsList<String>模型可以呼叫的工具列表。

工具執行事件

ToolCallStartingEvent

代表模型呼叫工具的事件。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略/Agent 執行的唯一識別碼。
toolCallIdStringnull工具呼叫的識別碼(如果可用)。
toolNameString工具的名稱。
toolArgsJsonObject提供給工具的引數。

ToolValidationFailedEvent

代表工具呼叫期間發生的驗證錯誤。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略/Agent 執行的唯一識別碼。
toolCallIdStringnull工具呼叫的識別碼(如果可用)。
toolNameString驗證失敗的工具名稱。
toolArgsJsonObject提供給工具的引數。
toolDescriptionStringnull遇到驗證錯誤的工具描述。
messageStringnull描述驗證錯誤的訊息。
errorAIAgentError發生的特定錯誤。欲了解更多資訊,請參閱 AIAgentError

ToolCallFailedEvent

代表執行工具失敗。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString策略/Agent 執行的唯一識別碼。
toolCallIdStringnull工具呼叫的識別碼(如果可用)。
toolNameString工具的名稱。
toolArgsJsonObject提供給工具的引數。
toolDescriptionStringnull失敗的工具描述。
errorAIAgentError嘗試呼叫工具時發生的特定錯誤。欲了解更多資訊,請參閱 AIAgentError

ToolCallCompletedEvent

代表成功的工具呼叫並傳回結果。包含以下欄位:

名稱資料型別必填預設值描述
eventIdString事件或事件組的唯一識別碼。
executionInfoAgentExecutionInfo提供與此事件關聯的執行上下文資訊。
runIdString執行的唯一識別碼。
toolCallIdStringnull工具呼叫的識別碼。
toolNameString工具的名稱。
toolArgsJsonObject提供給工具的引數。
toolDescriptionStringnull已執行工具的描述。
resultJsonElementnull工具呼叫的結果。

常見問題與疑難排解

以下部分包含與追蹤(Tracing)功能相關的常見問題及解答。

如何僅追蹤 Agent 執行的特定部分?

使用 messageFilter 屬性來篩選事件。例如,僅追蹤節點執行:

=== "Kotlin"

<!--- INCLUDE
import ai.koog.agents.core.agent.AIAgent
import ai.koog.agents.core.feature.model.events.LLMCallCompletedEvent
import ai.koog.agents.core.feature.model.events.LLMCallStartingEvent
import ai.koog.agents.example.exampleTracing01.outputPath
import ai.koog.agents.features.tracing.feature.Tracing
import ai.koog.agents.features.tracing.writer.TraceFeatureMessageFileWriter
import ai.koog.prompt.executor.llms.all.simpleOllamaAIExecutor
import ai.koog.prompt.executor.ollama.client.OllamaModels
import kotlinx.coroutines.runBlocking
const val input = "What's the weather like in New York?"
fun main() {
runBlocking {
// Creating an agent
val agent = AIAgent(
promptExecutor = simpleOllamaAIExecutor(),
llmModel = OllamaModels.Meta.LLAMA_3_2,
) {
-->
<!--- SUFFIX
        }
    }
}
-->
```kotlin
install(Tracing) {
    val fileWriter = TraceFeatureMessageFileWriter.create(outputPath)
    addMessageProcessor(fileWriter)
    
    // 僅追蹤 LLM 呼叫
    fileWriter.setMessageFilter { message ->
        message is LLMCallStartingEvent || message is LLMCallCompletedEvent
    }
}
```
<!--- KNIT example-events-01.kt -->

=== "Java"

<!--- INCLUDE
import ai.koog.agents.core.agent.AIAgent;
import ai.koog.agents.core.feature.model.events.LLMCallCompletedEvent;
import ai.koog.agents.core.feature.model.events.LLMCallStartingEvent;
import ai.koog.agents.features.tracing.feature.Tracing;
import ai.koog.agents.features.tracing.writer.TraceFeatureMessageFileWriter;
import ai.koog.prompt.executor.model.PromptExecutor;
import ai.koog.prompt.executor.ollama.client.OllamaModels;
import java.nio.file.Files;
import java.nio.file.Path;
public class exampleEventsJava01 {
    public static void main(String[] args) {
        var outputPath = Path.of("/path/to/trace.log");
        var agent = AIAgent.builder()
            .promptExecutor(PromptExecutor.builder().ollama().build())
            .llmModel(OllamaModels.Meta.LLAMA_3_2)
-->
<!--- SUFFIX
        .build();
    }
}
-->
```java
.install(Tracing.Feature, config -> {
    var fileWriter = TraceFeatureMessageFileWriter.create(outputPath);
    config.addMessageProcessor(fileWriter);

    // 僅追蹤 LLM 呼叫
    fileWriter.setMessageFilter(message ->
        message instanceof LLMCallStartingEvent || message instanceof LLMCallCompletedEvent
    );
})
```
<!--- KNIT exampleEventsJava01.java -->

我可以使用多個訊息處理器嗎?

可以,您可以新增多個訊息處理器,同時將追蹤記錄傳送到不同的目的地:

=== "Kotlin"

<!--- INCLUDE
import ai.koog.agents.core.agent.AIAgent
import ai.koog.agents.core.feature.remote.server.config.DefaultServerConnectionConfig
import ai.koog.agents.example.exampleTracing01.outputPath
import ai.koog.agents.features.tracing.feature.Tracing
import ai.koog.agents.features.tracing.writer.TraceFeatureMessageFileWriter
import ai.koog.agents.features.tracing.writer.TraceFeatureMessageLogWriter
import ai.koog.agents.features.tracing.writer.TraceFeatureMessageRemoteWriter
import ai.koog.prompt.executor.llms.all.simpleOllamaAIExecutor
import ai.koog.prompt.executor.ollama.client.OllamaModels
import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.coroutines.runBlocking
import kotlinx.io.buffered
import kotlinx.io.files.Path
import kotlinx.io.files.SystemFileSystem
const val input = "What's the weather like in New York?"
val logger = KotlinLogging.logger {}
val connectionConfig = DefaultServerConnectionConfig(host = ai.koog.agents.example.exampleTracing06.host, port = ai.koog.agents.example.exampleTracing06.port)
fun main() {
runBlocking {
// Creating an agent
val agent = AIAgent(
promptExecutor = simpleOllamaAIExecutor(),
llmModel = OllamaModels.Meta.LLAMA_3_2,
) {
-->
<!--- SUFFIX
        }
    }
}
-->
```kotlin
install(Tracing) {
    addMessageProcessor(TraceFeatureMessageLogWriter(logger))
    addMessageProcessor(TraceFeatureMessageFileWriter.create(outputPath))
    addMessageProcessor(TraceFeatureMessageRemoteWriter(connectionConfig))
}
```
<!--- KNIT example-events-02.kt -->

=== "Java"

<!--- INCLUDE
import ai.koog.agents.core.agent.AIAgent;
import ai.koog.agents.features.tracing.feature.Tracing;
import ai.koog.agents.features.tracing.writer.TraceFeatureMessageFileWriter;
import ai.koog.agents.features.tracing.writer.TraceFeatureMessageLogWriter;
import ai.koog.agents.features.tracing.writer.TraceFeatureMessageRemoteWriter;
import ai.koog.prompt.executor.model.PromptExecutor;
import ai.koog.prompt.executor.ollama.client.OllamaModels;
import org.slf4j.LoggerFactory;
import java.nio.file.Files;
import java.nio.file.Path;
public class exampleEventsJava02 {
    public static void main(String[] args) {
        var logger = LoggerFactory.getLogger("tracing");
        var outputPath = Path.of("/path/to/trace.log");
        var agent = AIAgent.builder()
            .promptExecutor(PromptExecutor.builder().ollama().build())
            .llmModel(OllamaModels.Meta.LLAMA_3_2)
-->
<!--- SUFFIX
        .build();
    }
}
-->
```java
.install(Tracing.Feature, config -> {
    config.addMessageProcessor(TraceFeatureMessageLogWriter.create(logger));
    config.addMessageProcessor(TraceFeatureMessageFileWriter.create(outputPath));
    config.addMessageProcessor(new TraceFeatureMessageRemoteWriter());
})
```
<!--- KNIT exampleEventsJava02.java -->

如何建立自訂訊息處理器?

實作 FeatureMessageProcessor 介面:

=== "Kotlin"

<!--- INCLUDE
import ai.koog.agents.core.agent.AIAgent
import ai.koog.agents.core.feature.model.events.NodeExecutionStartingEvent
import ai.koog.agents.core.feature.model.events.LLMCallCompletedEvent
import ai.koog.agents.core.feature.message.FeatureMessage
import ai.koog.agents.core.feature.message.FeatureMessageProcessor
import ai.koog.agents.features.tracing.feature.Tracing
import ai.koog.prompt.executor.llms.all.simpleOllamaAIExecutor
import ai.koog.prompt.executor.ollama.client.OllamaModels
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
-->
<!--- SUFFIX
    }
}
-->
```kotlin
class CustomTraceProcessor : FeatureMessageProcessor() {

    override suspend fun processMessage(message: FeatureMessage) {
        // 自訂處理邏輯
        if (message is NodeExecutionStartingEvent) {
            // 處理節點啟動事件
        } else if (message is LLMCallCompletedEvent) {
            // 處理 LLM 呼叫結束事件
        } else {
            // 處理其他事件類型
        }
    }

    override suspend fun close() {
        // 關閉已建立的連線
    }
}

val agent = AIAgent(
    promptExecutor = simpleOllamaAIExecutor(),
    llmModel = OllamaModels.Meta.LLAMA_3_2,
) {
    install(Tracing) {
        // 使用您的自訂處理器
        addMessageProcessor(CustomTraceProcessor())
    }
}
```
<!--- KNIT example-events-03.kt -->

=== "Java"

<!--- INCLUDE
import ai.koog.agents.core.agent.AIAgent;
import ai.koog.agents.core.feature.message.FeatureMessage;
import ai.koog.agents.core.feature.message.FeatureMessageProcessor;
import ai.koog.agents.core.feature.model.events.NodeExecutionStartingEvent;
import ai.koog.agents.core.feature.model.events.LLMCallCompletedEvent;
import ai.koog.agents.features.tracing.feature.Tracing;
import ai.koog.prompt.executor.model.PromptExecutor;
import ai.koog.prompt.executor.ollama.client.OllamaModels;
public class exampleEventsJava03 {
    public static void main(String[] args) {
-->
<!--- SUFFIX
    }
}
-->
```java
class CustomTraceProcessor extends FeatureMessageProcessor {

    @Override
    protected void handleMessage(FeatureMessage message) {
        // 自訂處理邏輯
        if (message instanceof NodeExecutionStartingEvent) {
            // 處理節點啟動事件
        } else if (message instanceof LLMCallCompletedEvent) {
            // 處理 LLM 呼叫結束事件
        } else {
            // 處理其他事件類型
        }
    }

    @Override
    public void handleClose() {
        // 關閉已建立的連線
    }
}

var agent = AIAgent.builder()
    .promptExecutor(PromptExecutor.builder().ollama().build())
    .llmModel(OllamaModels.Meta.LLAMA_3_2)

    .install(Tracing.Feature, config -> {
        // 使用您的自訂處理器
        config.addMessageProcessor(new CustomTraceProcessor());
    })
    .build();
```
<!--- KNIT exampleEventsJava03.java -->

欲了解更多可由訊息處理器處理的現有事件類型資訊,請參閱 預定義事件類型