From 00554149377bd003f5cf8d9cf3edbd27e93ae32a Mon Sep 17 00:00:00 2001 From: Raven95676 Date: Sun, 8 Feb 2026 22:06:20 +0800 Subject: [PATCH] fix: dedupe preset messages --- astrbot/core/agent/message.py | 10 +++++++++- astrbot/core/agent/runners/tool_loop_agent_runner.py | 5 ++++- astrbot/core/persona_mgr.py | 2 +- .../process_stage/method/agent_sub_stages/internal.py | 4 +--- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/astrbot/core/agent/message.py b/astrbot/core/agent/message.py index 582b1eef22..bde6353ff3 100644 --- a/astrbot/core/agent/message.py +++ b/astrbot/core/agent/message.py @@ -3,7 +3,13 @@ from typing import Any, ClassVar, Literal, cast -from pydantic import BaseModel, GetCoreSchemaHandler, model_serializer, model_validator +from pydantic import ( + BaseModel, + GetCoreSchemaHandler, + PrivateAttr, + model_serializer, + model_validator, +) from pydantic_core import core_schema @@ -178,6 +184,8 @@ class Message(BaseModel): tool_call_id: str | None = None """The ID of the tool call.""" + _no_save: bool = PrivateAttr(default=False) + @model_validator(mode="after") def check_content_required(self): # assistant + tool_calls is not None: allow content to be None diff --git a/astrbot/core/agent/runners/tool_loop_agent_runner.py b/astrbot/core/agent/runners/tool_loop_agent_runner.py index e43fcbda67..8fb01bfcb9 100644 --- a/astrbot/core/agent/runners/tool_loop_agent_runner.py +++ b/astrbot/core/agent/runners/tool_loop_agent_runner.py @@ -149,7 +149,10 @@ async def reset( messages = [] # append existing messages in the run context for msg in request.contexts: - messages.append(Message.model_validate(msg)) + m = Message.model_validate(msg) + if isinstance(msg, dict) and msg.get("_no_save"): + m._no_save = True + messages.append(m) if request.prompt is not None: m = await request.assemble_context() messages.append(Message.model_validate(m)) diff --git a/astrbot/core/persona_mgr.py b/astrbot/core/persona_mgr.py index ec99584e10..a2f4065538 100644 --- a/astrbot/core/persona_mgr.py +++ b/astrbot/core/persona_mgr.py @@ -313,7 +313,7 @@ def get_v3_persona_data( { "role": "user" if user_turn else "assistant", "content": dialog, - "_no_save": None, # 不持久化到 db + "_no_save": True, # 不持久化到 db }, ) user_turn = not user_turn diff --git a/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py b/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py index 87f0dd4195..b095a7cbb1 100644 --- a/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py +++ b/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py @@ -355,9 +355,7 @@ async def _save_to_history( if message.role == "system" and not skipped_initial_system: skipped_initial_system = True continue - if message.role in ["assistant", "user"] and getattr( - message, "_no_save", None - ): + if message.role in ["assistant", "user"] and message._no_save: continue message_to_save.append(message.model_dump())