From 3d293908a7768a41f90bebafd7ce7970b6720ebe Mon Sep 17 00:00:00 2001 From: Aniruddha Adak Date: Wed, 26 Aug 2026 22:01:35 +0530 Subject: [PATCH 1/2] fix(agent): run response hooks before yielding llm_result in skills_like fallback (#9788) In the skills_like tool requery fallback path, the runner yielded llm_result (sending the response to the user) before calling _complete_with_assistant_response, which triggers on_agent_done hooks. Plugins doing content safety review, sanitization, or rewriting could not affect text already sent. Moved the completion call before the yields. --- astrbot/core/agent/runners/tool_loop_agent_runner.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/astrbot/core/agent/runners/tool_loop_agent_runner.py b/astrbot/core/agent/runners/tool_loop_agent_runner.py index c9787ed6f0..75b91cf9ea 100644 --- a/astrbot/core/agent/runners/tool_loop_agent_runner.py +++ b/astrbot/core/agent/runners/tool_loop_agent_runner.py @@ -947,6 +947,10 @@ async def step(self): logger.warning( "skills_like tool re-query returned no tool calls; fallback to assistant response." ) + # Complete the assistant response (including hooks) BEFORE + # yielding llm_result so response hooks run before the + # result is sent to the user (#9788). + await self._complete_with_assistant_response(llm_resp) if llm_resp.reasoning_content: yield AgentResponse( type="llm_result", @@ -969,7 +973,6 @@ async def step(self): ), ) - await self._complete_with_assistant_response(llm_resp) # Re-query uses text_chat(), so its reply has no stream chunks. # Supply them after hooks without changing llm_result ordering. if self.streaming: From 01d76c985f8b6cbfb92a9848b8f7d7622582e5be Mon Sep 17 00:00:00 2001 From: Aniruddha Adak Date: Wed, 26 Aug 2026 22:02:27 +0530 Subject: [PATCH 2/2] fix(config): always use global timezone instead of hidden profile value (#9706) Chat profiles can contain a hidden timezone field that is not exposed in the profile WebUI schema. This silently overrides the global timezone setting, leaving users unable to discover or change the effective timezone. Always read timezone from the global config to ensure consistent behavior. --- astrbot/core/astr_main_agent.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/astrbot/core/astr_main_agent.py b/astrbot/core/astr_main_agent.py index 3148d638b6..93a64cbb7a 100644 --- a/astrbot/core/astr_main_agent.py +++ b/astrbot/core/astr_main_agent.py @@ -1061,9 +1061,7 @@ async def _decorate_llm_request( skip_quote_image_caption=quote_images_already_captioned, ) - tz = config.timezone - if tz is None: - tz = plugin_context.get_config().get("timezone") + tz = plugin_context.get_config().get("timezone") _append_system_reminders(event, req, cfg, tz) await _apply_workspace_extra_prompt(event, req, plugin_context)