diff --git a/agent/agent.go b/agent/agent.go index 10c512f5..2203e120 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -486,17 +486,23 @@ func (a *Agent) shouldStoreHistoryProvider(provider HistoryProvider, session *Se if provider == nil { return false } - if !a.hasDefaultHistoryProvider { - return true - } if a.providerDoesNotManageHistory { // Provider never uses server-side history; always persist locally. return true } + if session != nil && session.ServiceID() != "" { + // Once the provider service owns the conversation history, no history + // provider should persist the run locally, even if a configured provider + // remains attached for future local sessions. + return false + } + if !a.hasDefaultHistoryProvider { + return true + } // A provider can promote a local session to a service-managed one during the // run. Once that happens, the default in-memory provider should stop storing. - return session != nil && session.ServiceID() == "" + return session != nil } func (a *Agent) handleHistoryProviderConflict(ctx context.Context, provider HistoryProvider, session *Session) (bool, error) { diff --git a/agent/agent_test.go b/agent/agent_test.go index 3c2576ff..df526090 100644 --- a/agent/agent_test.go +++ b/agent/agent_test.go @@ -1538,7 +1538,7 @@ func TestAgent_Run_HistoryProvider_ClearsWhenThrowDisabledAndClearEnabled(t *tes } } -func TestAgent_Run_HistoryProvider_KeepsWhenThrowAndClearDisabled(t *testing.T) { +func TestAgent_Run_HistoryProvider_KeepsReferenceButSkipsStoreWhenThrowAndClearDisabled(t *testing.T) { provideCalls := 0 storeCalls := 0 historyProvider := agent.NewHistoryProvider(agent.HistoryProviderConfig{ @@ -1575,14 +1575,14 @@ func TestAgent_Run_HistoryProvider_KeepsWhenThrowAndClearDisabled(t *testing.T) if _, err := a.RunText(t.Context(), "input", agent.WithSession(agenttest.CreateSession())).Collect(); err != nil { t.Fatalf("unexpected first run error: %v", err) } - if provideCalls != 1 || storeCalls != 1 { - t.Fatalf("after first run provide/store = %d/%d, want 1/1", provideCalls, storeCalls) + if provideCalls != 1 || storeCalls != 0 { + t.Fatalf("after first run provide/store = %d/%d, want 1/0", provideCalls, storeCalls) } if _, err := a.RunText(t.Context(), "next", agent.WithSession(agenttest.CreateSession())).Collect(); err != nil { t.Fatalf("unexpected second run error: %v", err) } - if provideCalls != 2 || storeCalls != 2 { - t.Fatalf("after second run provide/store = %d/%d, want 2/2", provideCalls, storeCalls) + if provideCalls != 2 || storeCalls != 1 { + t.Fatalf("after second run provide/store = %d/%d, want 2/1", provideCalls, storeCalls) } }