From 1faf9acbdee6ed9a444f183c4dd57a7f309adb08 Mon Sep 17 00:00:00 2001 From: Luna-channel Date: Sat, 21 Mar 2026 03:35:31 +0800 Subject: [PATCH] fix(agent): call on_agent_done hook before storing assistant message in history --- .../agent/runners/tool_loop_agent_runner.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/astrbot/core/agent/runners/tool_loop_agent_runner.py b/astrbot/core/agent/runners/tool_loop_agent_runner.py index 93f45475e5..bb35df8e98 100644 --- a/astrbot/core/agent/runners/tool_loop_agent_runner.py +++ b/astrbot/core/agent/runners/tool_loop_agent_runner.py @@ -468,7 +468,14 @@ async def step(self): self._transition_state(AgentState.DONE) self.stats.end_time = time.time() - # record the final assistant message + # call the on_agent_done hook BEFORE recording the message, + # so that plugins can clean metadata tags from completion_text first. + try: + await self.agent_hooks.on_agent_done(self.run_context, llm_resp) + except Exception as e: + logger.error(f"Error in on_agent_done hook: {e}", exc_info=True) + + # record the final assistant message (now cleaned by hooks) parts = [] if llm_resp.reasoning_content or llm_resp.reasoning_signature: parts.append( @@ -485,11 +492,6 @@ async def step(self): ) self.run_context.messages.append(Message(role="assistant", content=parts)) - # call the on_agent_done hook - try: - await self.agent_hooks.on_agent_done(self.run_context, llm_resp) - except Exception as e: - logger.error(f"Error in on_agent_done hook: {e}", exc_info=True) self._resolve_unconsumed_follow_ups() # θΏ”ε›ž LLM η»“ζžœ @@ -971,6 +973,11 @@ async def _finalize_aborted_step( self._transition_state(AgentState.DONE) self.stats.end_time = time.time() + try: + await self.agent_hooks.on_agent_done(self.run_context, llm_resp) + except Exception as e: + logger.error(f"Error in on_agent_done hook: {e}", exc_info=True) + parts = [] if llm_resp.reasoning_content or llm_resp.reasoning_signature: parts.append( @@ -984,11 +991,6 @@ async def _finalize_aborted_step( if parts: self.run_context.messages.append(Message(role="assistant", content=parts)) - try: - await self.agent_hooks.on_agent_done(self.run_context, llm_resp) - except Exception as e: - logger.error(f"Error in on_agent_done hook: {e}", exc_info=True) - self._resolve_unconsumed_follow_ups() return AgentResponse( type="aborted",