From 69d3ae709c23771f16212ef3e25463cc12aed0cb Mon Sep 17 00:00:00 2001 From: Raven95676 Date: Sat, 5 Jul 2025 22:08:17 +0800 Subject: [PATCH] fix: direct send tool_call_result --- .../agent_runner/tool_loop_agent.py | 1 - .../process_stage/method/llm_request.py | 13 +++++++------ dashboard/src/views/ChatPage.vue | 1 - packages/astrbot/main.py | 18 +++++++++++++++++- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/astrbot/core/pipeline/process_stage/agent_runner/tool_loop_agent.py b/astrbot/core/pipeline/process_stage/agent_runner/tool_loop_agent.py index dcb390b2f..3f97c189c 100644 --- a/astrbot/core/pipeline/process_stage/agent_runner/tool_loop_agent.py +++ b/astrbot/core/pipeline/process_stage/agent_runner/tool_loop_agent.py @@ -106,7 +106,6 @@ class ToolLoopAgent(BaseAgentRunner): # 处理 LLM 响应 llm_resp = llm_resp_result - logger.debug(f"LLMResp: {llm_resp}") if llm_resp.role == "err": # 如果 LLM 响应错误,转换到错误状态 diff --git a/astrbot/core/pipeline/process_stage/method/llm_request.py b/astrbot/core/pipeline/process_stage/method/llm_request.py index 5923e8246..000369326 100644 --- a/astrbot/core/pipeline/process_stage/method/llm_request.py +++ b/astrbot/core/pipeline/process_stage/method/llm_request.py @@ -177,7 +177,10 @@ class LLMRequestSubStage(Stage): if event.is_stopped(): return if resp.type == "tool_call_result": - continue # 跳过工具调用结果 + # 处理工具调用结果,直接发送给用户 + resp.data["chain"].type = "tool_call_result" + await event.send(resp.data["chain"]) + continue if resp.type == "tool_call": if self.streaming_response: # 用来标记流式响应需要分节 @@ -254,11 +257,11 @@ class LLMRequestSubStage(Stage): # 异步处理 WebChat 特殊情况 if event.get_platform_name() == "webchat": - asyncio.create_task(self._handle_webchat(event, req)) + asyncio.create_task(self._handle_webchat(event, req, provider)) await self._save_to_history(event, req, tool_loop_agent.get_final_llm_resp()) - async def _handle_webchat(self, event: AstrMessageEvent, req: ProviderRequest): + async def _handle_webchat(self, event: AstrMessageEvent, req: ProviderRequest, prov: Provider): """处理 WebChat 平台的特殊情况,包括第一次 LLM 对话时总结对话内容生成 title""" conversation = await self.conv_manager.get_conversation( event.unified_msg_origin, req.conversation.cid @@ -268,10 +271,9 @@ class LLMRequestSubStage(Stage): latest_pair = messages[-2:] if not latest_pair: return - provider = self.ctx.plugin_manager.context.get_using_provider() cleaned_text = "User: " + latest_pair[0].get("content", "").strip() logger.debug(f"WebChat 对话标题生成请求,清理后的文本: {cleaned_text}") - llm_resp = await provider.text_chat( + llm_resp = await prov.text_chat( system_prompt="You are expert in summarizing user's query.", prompt=( f"Please summarize the following query of user:\n" @@ -333,7 +335,6 @@ class LLMRequestSubStage(Stage): await self.conv_manager.update_conversation( event.unified_msg_origin, req.conversation.cid, history=messages ) - logger.debug(f"messages persisted: {messages}") def fix_messages(self, messages: list[dict]) -> list[dict]: """验证并且修复上下文""" diff --git a/dashboard/src/views/ChatPage.vue b/dashboard/src/views/ChatPage.vue index 1aa8bb9e0..fedb86b3e 100644 --- a/dashboard/src/views/ChatPage.vue +++ b/dashboard/src/views/ChatPage.vue @@ -1473,7 +1473,6 @@ export default { .message-bubble { padding: 8px 16px; border-radius: 12px; - max-width: 80%; } .user-bubble { diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 0a3f8ba6c..d2a78d609 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -10,6 +10,7 @@ import astrbot.api.event.filter as filter from astrbot.api.event import AstrMessageEvent, MessageEventResult from astrbot.api import sp from astrbot.api.provider import ProviderRequest +from astrbot.core import DEMO_MODE from astrbot.core.platform.astr_message_event import MessageSesion from astrbot.core.platform.message_type import MessageType from astrbot.core.provider.entities import ProviderType @@ -59,7 +60,7 @@ class RstScene(Enum): name="astrbot", desc="AstrBot 基础指令结合 + 拓展功能", author="Soulter", - version="4.0.0", + version="4.0.1", ) class Main(star.Star): def __init__(self, context: star.Context) -> None: @@ -233,6 +234,11 @@ class Main(star.Star): @plugin.command("off") async def plugin_off(self, event: AstrMessageEvent, plugin_name: str = None): """禁用插件""" + if DEMO_MODE: + event.set_result( + MessageEventResult().message("演示模式下无法禁用插件。") + ) + return if not plugin_name: event.set_result( MessageEventResult().message("/plugin off <插件名> 禁用插件。") @@ -245,6 +251,11 @@ class Main(star.Star): @plugin.command("on") async def plugin_on(self, event: AstrMessageEvent, plugin_name: str = None): """启用插件""" + if DEMO_MODE: + event.set_result( + MessageEventResult().message("演示模式下无法启用插件。") + ) + return if not plugin_name: event.set_result( MessageEventResult().message("/plugin on <插件名> 启用插件。") @@ -257,6 +268,11 @@ class Main(star.Star): @plugin.command("get") async def plugin_get(self, event: AstrMessageEvent, plugin_repo: str = None): """安装插件""" + if DEMO_MODE: + event.set_result( + MessageEventResult().message("演示模式下无法安装插件。") + ) + return if not plugin_repo: event.set_result( MessageEventResult().message("/plugin get <插件仓库地址> 安装插件")