fix(webui): preserve casual chat compaction guard

This commit is contained in:
Lumen Yang committed 2026-05-19 14:34:58 +00:00
1 parent 600bb48970
commit a8d429775c
2 files changed
+49 -12

No files matched your search

+12 -11
View File
@@ -2332,21 +2332,22 @@ def _has_task_resume_compaction_marker(messages):
return False
def _new_turn_context_from_messages(messages, msg_text):
"""Return provider-facing history for a new user turn from a message list."""
history = _drop_checkpointed_current_user_from_context(messages, msg_text)
if _is_casual_fresh_chat_message(msg_text) and _has_task_resume_compaction_marker(history):
return []
return history
def _context_messages_for_new_turn(session, msg_text):
"""Return provider-facing history for a new user turn.
Compacted agent sessions can carry a hidden "resume the active task" summary
long after the visible UI looks like normal chat. A short greeting should
not silently reactivate that old task; explicit continuation prompts still
keep the full compacted context.
in context_messages. If the user starts a fresh casual greeting in that old
session, do not feed that stale active-task summary back to the model.
"""
history = _drop_checkpointed_current_user_from_context(
_session_context_messages(session),
msg_text,
)
if _is_casual_fresh_chat_message(msg_text) and _has_task_resume_compaction_marker(history):
return []
return history
return _new_turn_context_from_messages(_session_context_messages(session), msg_text)
def _stream_writeback_is_current(session, stream_id):
@@ -3965,7 +3966,7 @@ def _run_agent_streaming(
state_messages=_external_state_messages,
) or []
)
_previous_context_messages = _drop_checkpointed_current_user_from_context(
_previous_context_messages = _new_turn_context_from_messages(
reconciled_state_db_messages_for_session(
s,
prefer_context=True,
+37 -1
View File
@@ -1,10 +1,12 @@
from api.models import Session
from api.models import Session, reconciled_state_db_messages_for_session
import contextlib
from types import SimpleNamespace
from api.streaming import (
_assistant_reply_added_after_current_turn,
_context_messages_for_new_turn,
_merge_display_messages_after_agent_result,
_new_turn_context_from_messages,
_sanitize_messages_for_api,
_session_context_messages,
)
@@ -314,6 +316,40 @@ def test_explicit_continue_keeps_compacted_active_task_context(tmp_path):
assert _context_messages_for_new_turn(session, "继续") == compacted_task_context
def test_streaming_reconciled_context_keeps_casual_greeting_suppression():
compacted_task_context = [
{
"role": "user",
"content": (
"[CONTEXT COMPACTION — REFERENCE ONLY] Earlier turns were compacted. "
"Your current task is identified in the Active Task section — resume exactly from there."
),
"timestamp": 1.0,
},
{"role": "assistant", "content": "I will inspect api/config.py next.", "timestamp": 2.0},
]
session = SimpleNamespace(
session_id="issue2308-streaming",
messages=[{"role": "user", "content": "old task", "timestamp": 0.5}],
context_messages=compacted_task_context,
)
external_state_messages = list(compacted_task_context)
# Mirror the streaming pre-turn assembly for prefer_context=True: reconcile
# sidecar context with one state.db snapshot, then apply the normal new-turn
# context filter that suppresses casual greetings from resuming stale tasks.
previous_context_messages = _new_turn_context_from_messages(
reconciled_state_db_messages_for_session(
session,
prefer_context=True,
state_messages=external_state_messages,
),
"你好",
)
assert previous_context_messages == []
def test_all_cjk_greetings_drop_stale_compaction_context(tmp_path):
"""Pin every CJK greeting in the casual-fresh-chat set against a stale
compaction context. Catches typos like \\u5616 (嘖, "click of tongue")