From 2bc4d135aae3a21da2b64913c8da36a11b2ff39c Mon Sep 17 00:00:00 2001 From: Daniel Novikov <36117344+dannovikov@users.noreply.github.com> Date: Tue, 17 Feb 2026 19:05:31 -0500 Subject: [PATCH 1/3] Replace `!event.Partial` with `event.IsFinalResponse()` in `maybeSaveOutputToState` to stop overwriting OutputKey with empty string on function-call events --- agent/llmagent/llmagent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/llmagent/llmagent.go b/agent/llmagent/llmagent.go index c6ebb6778..82d3b5fc1 100644 --- a/agent/llmagent/llmagent.go +++ b/agent/llmagent/llmagent.go @@ -389,7 +389,7 @@ func (a *llmAgent) maybeSaveOutputToState(event *session.Event) { // TODO: log "Skipping output save for agent %s: event authored by %s" return } - if a.OutputKey != "" && !event.Partial && event.Content != nil && len(event.Content.Parts) > 0 { + if a.OutputKey != "" && !event.IsFinalResponse() && event.Content != nil && len(event.Content.Parts) > 0 { var sb strings.Builder for _, part := range event.Content.Parts { if part.Text != "" && !part.Thought { From 5ae898debc3598eb27d4c8d03b6f68e0c16b4c0c Mon Sep 17 00:00:00 2001 From: Daniel Novikov <36117344+dannovikov@users.noreply.github.com> Date: Tue, 17 Feb 2026 19:26:58 -0500 Subject: [PATCH 2/3] Update llmagent_saveoutput_test.go Adds tests to verify output key writing skips overwriting outputkey on function calls and responses --- agent/llmagent/llmagent_saveoutput_test.go | 44 ++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/agent/llmagent/llmagent_saveoutput_test.go b/agent/llmagent/llmagent_saveoutput_test.go index e25ac2526..acb095dcc 100644 --- a/agent/llmagent/llmagent_saveoutput_test.go +++ b/agent/llmagent/llmagent_saveoutput_test.go @@ -105,6 +105,50 @@ func TestLlmAgent_MaybeSaveOutputToState(t *testing.T) { event: createTestEvent("testagent", "Test response", true), wantStateDelta: map[string]any{}, }, + { + name: "skips for function call events", + agentConfig: Config{Name: "test_agent", OutputKey: "result"}, + event: &session.Event{ + InvocationID: "test_invocation", + Author: "test_agent", + LLMResponse: model.LLMResponse{ + Content: &genai.Content{ + Role: "model", + Parts: []*genai.Part{ + {FunctionCall: &genai.FunctionCall{ + Name: "get_weather", + Args: map[string]any{"city": "NYC"}, + }}, + }, + }, + Partial: false, + }, + Actions: session.EventActions{StateDelta: make(map[string]any)}, + }, + wantStateDelta: map[string]any{}, + }, + { + name: "skips for function response events", + agentConfig: Config{Name: "test_agent", OutputKey: "result"}, + event: &session.Event{ + InvocationID: "test_invocation", + Author: "test_agent", + LLMResponse: model.LLMResponse{ + Content: &genai.Content{ + Role: "model", + Parts: []*genai.Part{ + {FunctionResponse: &genai.FunctionResponse{ + Name: "get_weather", + Response: map[string]any{"temperature": "72F"}, + }}, + }, + }, + Partial: false, + }, + Actions: session.EventActions{StateDelta: make(map[string]any)}, + }, + wantStateDelta: map[string]any{}, + }, // TODO tests with OutputSchema } From d7ee5cee87e4db17ccb35e997cd186b5f071e4df Mon Sep 17 00:00:00 2001 From: Daniel Novikov <36117344+dannovikov@users.noreply.github.com> Date: Tue, 17 Feb 2026 19:49:29 -0500 Subject: [PATCH 3/3] Correct typo Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- agent/llmagent/llmagent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/llmagent/llmagent.go b/agent/llmagent/llmagent.go index 82d3b5fc1..73f7f76f8 100644 --- a/agent/llmagent/llmagent.go +++ b/agent/llmagent/llmagent.go @@ -389,7 +389,7 @@ func (a *llmAgent) maybeSaveOutputToState(event *session.Event) { // TODO: log "Skipping output save for agent %s: event authored by %s" return } - if a.OutputKey != "" && !event.IsFinalResponse() && event.Content != nil && len(event.Content.Parts) > 0 { +if a.OutputKey != "" && event.IsFinalResponse() && event.Content != nil && len(event.Content.Parts) > 0 { var sb strings.Builder for _, part := range event.Content.Parts { if part.Text != "" && !part.Thought {