From 70fb56e27475a105a18d5d5ab0754314fad11ce4 Mon Sep 17 00:00:00 2001 From: huanghuoguoguo <1051233107@qq.com> Date: Fri, 30 Oct 2026 10:21:33 +0800 Subject: [PATCH] fix(agent): keep reset generation out of external conversation ID (#2818) Fixes #2814 After a session reset, keep the reset generation marker out of provider-facing external conversation state so Runner plugins start a new remote conversation. --- src/langbot/pkg/agent/runner/persistent_state_store.py | 5 +++-- tests/unit_tests/api/service/test_session_context_reset.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/langbot/pkg/agent/runner/persistent_state_store.py b/src/langbot/pkg/agent/runner/persistent_state_store.py index 4665f127a..14c9a3403 100644 --- a/src/langbot/pkg/agent/runner/persistent_state_store.py +++ b/src/langbot/pkg/agent/runner/persistent_state_store.py @@ -188,7 +188,7 @@ class PersistentStateStore: except json.JSONDecodeError: pass # Skip invalid JSON - # Seed external.conversation_id from event.conversation_id if not set + # Seed the host conversation ID only before the conversation is reset. if self._check_scope_enabled('conversation', binding) and event.conversation_id: if 'external.conversation_id' not in snapshot['conversation']: from .context_reset import get_reset_generation @@ -196,7 +196,8 @@ class PersistentStateStore: generation = await get_reset_generation( self._db_engine, event.workspace_id, event.bot_id, event.conversation_id ) - snapshot['conversation']['external.conversation_id'] = generation or event.conversation_id + if generation is None: + snapshot['conversation']['external.conversation_id'] = event.conversation_id return snapshot diff --git a/tests/unit_tests/api/service/test_session_context_reset.py b/tests/unit_tests/api/service/test_session_context_reset.py index 70989432f..6a5892a11 100644 --- a/tests/unit_tests/api/service/test_session_context_reset.py +++ b/tests/unit_tests/api/service/test_session_context_reset.py @@ -153,7 +153,7 @@ async def test_reset_starts_new_external_runner_conversation(context_service): snapshot = await store.build_snapshot_from_event(event, binding, descriptor) generation = await get_reset_generation(engine, 'w', 'b', 'person_u') assert isinstance(generation, str) and generation and generation not in {'remote-old', 'person_u'} - assert snapshot['conversation']['external.conversation_id'] == generation + assert 'external.conversation_id' not in snapshot['conversation'] @pytest.mark.asyncio