diff --git a/learning/tracing.md b/learning/tracing.md index b42b329..9b5277f 100644 --- a/learning/tracing.md +++ b/learning/tracing.md @@ -78,9 +78,9 @@ agentLoop(prompts, context, config, signal, stream_fn) ```julia runAgentLoop(prompts, context, config, emit, signal, stream_fn) - -> new_messages = copy(prompts) # [UserMessage(...)] - -> current_context = AgentContext(context.system_prompt, [UserMessage(...)], context.tools) - -> emit(AgentStartEvent()) + -> new_messages = copy(prompts) # [UserMessage(...)] + -> current_context = AgentContext(context.system_prompt, vcat(context.messages, copy(prompts)), context.tools) + -> emit(AgentStartEvent()) -> emit(TurnStartEvent()) -> for prompt in prompts: emit(MessageStartEvent(prompt)); emit(MessageEndEvent(prompt)) end -> runLoop(current_context, new_messages, config, signal, emit, stream_fn) @@ -98,10 +98,10 @@ Events emitted so far: ```julia runLoop(initial_context, new_messages, initial_config, signal, emit, stream_function) - -> current_context = AgentContext(system_prompt, [UserMessage(...)], tools) - -> first_turn = true - -> pending_messages = [] - -> while true: + -> current_context = initial_context + -> first_turn = true + -> pending_messages = getSteeringMessages(config) # may be empty [] by default (agent_loop.jl:180-182) + -> while true: has_more_tool_calls = true # reset each outer iteration # Inner loop: has_more_tool_calls || !isempty(pending_messages) @@ -139,7 +139,7 @@ TextDeltaEvent(partial=AssistantMessage with ToolCall for "read") TextDeltaEvent(...) -- streaming continues -ToolCallEvent -- tool call detected: read(file="text.txt") +toolcall_start/toolcall_delta/toolcall_end -- tool call detected: read(file="text.txt") (agent_loop.jl:405) DoneEvent(reason="tool_calls", ...) -> final_message = AssistantMessage(role="assistant", content=[ToolCall(...)]) @@ -161,7 +161,7 @@ tool_calls = filter(c -> c isa ToolCall, message.content) # tool_calls = [ToolCall(type="tool_call", id="call_1", name="read", arguments={file="text.txt"}, ...)] tool_results = [] -has_more_tool_calls = true +has_more_tool_calls = false # set to true only if tool calls execute and don't terminate (agent_loop.jl:225) if !isempty(tool_calls) executed_tool_batch = executeToolCalls( @@ -178,8 +178,9 @@ if !isempty(tool_calls) Since there's only one tool call and no sequential mode forced, it uses `executeToolCallsParallel()` (or sequential -- both paths converge for a single tool call). ```julia -executeToolCalls(context, assistant_message, tool_calls, config, signal, emit) - -> tool = findfirst(t -> t.name == "read", context.tools) +executeToolCalls(context, assistant_message, config, signal, emit) + -> tool_calls extracted from assistant_message.content (agent_loop.jl:483-486) + -> tool = findfirst(t -> t.name == "read", context.tools) -> preparation = prepareToolCall(...) -> validated_args = {file="text.txt"} -> return PreparedToolCall("prepared", tool_call, tool, validated_args) @@ -291,8 +292,8 @@ Events emitted at end: | # | Event | Source | |---|-------|--------| -| 1 | `AgentStartEvent` | runLoop() | -| 2 | `TurnStartEvent` | runLoop() | +| 1 | `AgentStartEvent` | runAgentLoop() | +| 2 | `TurnStartEvent` | runAgentLoop() | | 3 | `MessageStartEvent(UserMessage)` | runAgentLoop() | | 4 | `MessageEndEvent(UserMessage)` | runAgentLoop() | | 5 | `MessageStartEvent(AssistantMessage)` | streamAssistantResponse() | @@ -302,11 +303,12 @@ Events emitted at end: | 9 | `ToolExecutionEndEvent` | executeToolCalls() | | 10 | `MessageStartEvent(ToolResultMessage)` | emitToolResultMessage() | | 11 | `MessageEndEvent(ToolResultMessage)` | emitToolResultMessage() | -| 12 | `MessageStartEvent(AssistantMessage)` | streamAssistantResponse() (2nd call) | -| 13 | `MessageUpdateEvent(AssistantMessage)` | streamAssistantResponse() (text streaming) | -| 14 | `MessageEndEvent(AssistantMessage)` | streamAssistantResponse() | -| 15 | `TurnEndEvent(AssistantResponse, [])` | runLoop() | -| 16 | `AgentEndEvent([all messages])` | runLoop() | +| 12 | `TurnEndEvent(AssistantMessage, [tool_results])` | runLoop() | +| 13 | `MessageStartEvent(AssistantMessage)` | streamAssistantResponse() (2nd call) | +| 14 | `MessageUpdateEvent(AssistantMessage)` | streamAssistantResponse() (text streaming) | +| 15 | `MessageEndEvent(AssistantMessage)` | streamAssistantResponse() | +| 16 | `TurnEndEvent(AssistantResponse, [])` | runLoop() | +| 17 | `AgentEndEvent([all messages])` | runLoop() | --- @@ -380,7 +382,9 @@ executeToolCallsParallel(...) Events for parallel execution: ``` ToolExecutionStartEvent(call_1, "read", ...) +ToolExecutionEndEvent(call_1, "read", ...) ToolExecutionStartEvent(call_2, "write", ...) +ToolExecutionEndEvent(call_2, "write", ...) MessageStartEvent(ToolResultMessage[read result]) MessageEndEvent(ToolResultMessage[read result]) MessageStartEvent(ToolResultMessage[write result]) @@ -401,9 +405,11 @@ for tool_call in tool_calls: Events for sequential execution: ``` ToolExecutionStartEvent(call_1, "read", ...) +ToolExecutionEndEvent(call_1, "read", ...) MessageStartEvent(ToolResultMessage[read result]) MessageEndEvent(ToolResultMessage[read result]) ToolExecutionStartEvent(call_2, "write", ...) +ToolExecutionEndEvent(call_2, "write", ...) MessageStartEvent(ToolResultMessage[write result]) MessageEndEvent(ToolResultMessage[write result]) ``` @@ -479,24 +485,26 @@ emit(AgentEndEvent(new_messages)) | # | Event | Source | |---|-------|--------| -| 1 | `AgentStartEvent` | runLoop() | -| 2 | `TurnStartEvent` | runLoop() | +| 1 | `AgentStartEvent` | runAgentLoop() | +| 2 | `TurnStartEvent` | runAgentLoop() | | 3 | `MessageStartEvent(UserMessage)` | runAgentLoop() | | 4 | `MessageEndEvent(UserMessage)` | runAgentLoop() | | 5 | `MessageStartEvent(AssistantMessage)` | streamAssistantResponse() (1st LLM call) | | 6 | `MessageEndEvent(AssistantMessage)` | streamAssistantResponse() | | 7 | `ToolExecutionStartEvent(call_1, "read")` | executeToolCallsParallel() | -| 8 | `ToolExecutionStartEvent(call_2, "write")` | executeToolCallsParallel() | -| 9 | `MessageStartEvent(ToolResultMessage[read])` | emitToolResultMessage() | -| 10 | `MessageEndEvent(ToolResultMessage[read])` | emitToolResultMessage() | -| 11 | `MessageStartEvent(ToolResultMessage[write])` | emitToolResultMessage() | -| 12 | `MessageEndEvent(ToolResultMessage[write])` | emitToolResultMessage() | -| 13 | `TurnEndEvent(AssistantToolCalls, [read_result, write_result])` | runLoop() | -| 14 | `MessageStartEvent(AssistantMessage)` | streamAssistantResponse() (2nd LLM call) | -| 15 | `MessageUpdateEvent(AssistantMessage)` | streamAssistantResponse() (text streaming) | -| 16 | `MessageEndEvent(AssistantMessage)` | streamAssistantResponse() | -| 17 | `TurnEndEvent(AssistantResponse, [])` | runLoop() | -| 18 | `AgentEndEvent([all messages])` | runLoop() | +| 8 | `ToolExecutionEndEvent(call_1, "read")` | executeToolCallsParallel() | +| 9 | `ToolExecutionStartEvent(call_2, "write")` | executeToolCallsParallel() | +| 10 | `ToolExecutionEndEvent(call_2, "write")` | executeToolCallsParallel() | +| 11 | `MessageStartEvent(ToolResultMessage[read])` | emitToolResultMessage() | +| 12 | `MessageEndEvent(ToolResultMessage[read])` | emitToolResultMessage() | +| 13 | `MessageStartEvent(ToolResultMessage[write])` | emitToolResultMessage() | +| 14 | `MessageEndEvent(ToolResultMessage[write])` | emitToolResultMessage() | +| 15 | `TurnEndEvent(AssistantToolCalls, [read_result, write_result])` | runLoop() | +| 16 | `MessageStartEvent(AssistantMessage)` | streamAssistantResponse() (2nd LLM call) | +| 17 | `MessageUpdateEvent(AssistantMessage)` | streamAssistantResponse() (text streaming) | +| 18 | `MessageEndEvent(AssistantMessage)` | streamAssistantResponse() | +| 19 | `TurnEndEvent(AssistantResponse, [])` | runLoop() | +| 20 | `AgentEndEvent([all messages])` | runLoop() | ---