Skip to content

Commit 6c21f57

Browse files
committed
fix:timing gate 裁切过度
1 parent 39e6a2d commit 6c21f57

2 files changed

Lines changed: 54 additions & 0 deletions

File tree

pytests/test_maisaka_timing_gate.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,3 +238,47 @@ def test_finish_tool_removes_empty_assistant_history_message() -> None:
238238
)
239239

240240
assert runtime._chat_history == []
241+
242+
243+
def test_timing_gate_head_trim_keeps_short_history() -> None:
244+
messages = [
245+
AssistantMessage(content="第一条消息", timestamp=datetime.now()),
246+
AssistantMessage(content="第二条消息", timestamp=datetime.now()),
247+
]
248+
249+
trimmed_messages = MaisakaHeartFlowChatting._drop_head_context_messages(
250+
messages,
251+
drop_context_count=3,
252+
)
253+
254+
assert trimmed_messages == messages
255+
256+
257+
def test_timing_gate_head_trim_keeps_history_within_config_limit() -> None:
258+
messages = [
259+
AssistantMessage(content=f"消息 {index}", timestamp=datetime.now())
260+
for index in range(10)
261+
]
262+
263+
trimmed_messages = MaisakaHeartFlowChatting._drop_head_context_messages(
264+
messages,
265+
drop_context_count=7,
266+
trim_threshold_context_count=10,
267+
)
268+
269+
assert trimmed_messages == messages
270+
271+
272+
def test_timing_gate_head_trim_applies_after_config_limit_exceeded() -> None:
273+
messages = [
274+
AssistantMessage(content=f"消息 {index}", timestamp=datetime.now())
275+
for index in range(11)
276+
]
277+
278+
trimmed_messages = MaisakaHeartFlowChatting._drop_head_context_messages(
279+
messages,
280+
drop_context_count=7,
281+
trim_threshold_context_count=10,
282+
)
283+
284+
assert trimmed_messages == messages[7:]

src/maisaka/runtime.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,7 @@ async def run_sub_agent(
614614
sub_agent_history = self._drop_head_context_messages(
615615
selected_history,
616616
drop_head_context_count,
617+
trim_threshold_context_count=context_message_limit,
617618
)
618619
if extra_messages:
619620
sub_agent_history.extend(list(extra_messages))
@@ -637,12 +638,21 @@ async def run_sub_agent(
637638
def _drop_head_context_messages(
638639
chat_history: Sequence[LLMContextMessage],
639640
drop_context_count: int,
641+
*,
642+
trim_threshold_context_count: int | None = None,
640643
) -> list[LLMContextMessage]:
641644
"""从已选上下文头部丢弃指定数量的普通上下文消息。"""
642645

643646
if drop_context_count <= 0:
644647
return list(chat_history)
645648

649+
context_message_count = sum(1 for message in chat_history if message.count_in_context)
650+
if trim_threshold_context_count is not None and context_message_count <= trim_threshold_context_count:
651+
return list(chat_history)
652+
653+
if context_message_count <= drop_context_count:
654+
return list(chat_history)
655+
646656
first_kept_index = 0
647657
dropped_context_count = 0
648658
while (

0 commit comments

Comments
 (0)