diff --git a/astrbot/core/pipeline/process_stage/method/dify_request.py b/astrbot/core/pipeline/process_stage/method/dify_request.py index 663a9f8b..3dca3792 100644 --- a/astrbot/core/pipeline/process_stage/method/dify_request.py +++ b/astrbot/core/pipeline/process_stage/method/dify_request.py @@ -11,6 +11,7 @@ from astrbot.core.message.components import Image from astrbot.core import logger from astrbot.core.utils.metrics import Metric from astrbot.core.provider.entites import ProviderRequest +from astrbot.core.star.star_handler import star_handlers_registry, EventType class DifyRequestSubStage(Stage): @@ -48,17 +49,40 @@ class DifyRequestSubStage(Stage): return req.session_id = event.unified_msg_origin + + # 执行请求 LLM 前事件钩子。 + # 装饰 system_prompt 等功能 + handlers = star_handlers_registry.get_handlers_by_event_type(EventType.OnLLMRequestEvent) + for handler in handlers: + try: + await handler.handler(event, req) + except BaseException: + logger.error(traceback.format_exc()) try: logger.debug(f"Dify 请求 Payload: {req.__dict__}") llm_response = await provider.text_chat(**req.__dict__) # 请求 LLM await Metric.upload(llm_tick=1, model_name=provider.get_model(), provider_type=provider.meta().type) + + # 执行 LLM 响应后的事件。 + handlers = star_handlers_registry.get_handlers_by_event_type(EventType.OnLLMResponseEvent) + for handler in handlers: + try: + await handler.handler(event, llm_response) + except BaseException: + logger.error(traceback.format_exc()) if llm_response.role == 'assistant': # text completion event.set_result(MessageEventResult().message(llm_response.completion_text) .set_result_content_type(ResultContentType.LLM_RESULT)) - yield # rick roll + return + elif llm_response.role == 'err': + event.set_result(MessageEventResult().message(f"AstrBot 请求失败。\n错误信息: {llm_response.completion_text}")) + return + elif llm_response.role == 'tool': + event.set_result(MessageEventResult().message(f"Dify 暂不支持工具调用。")) + yield except BaseException as e: logger.error(traceback.format_exc()) diff --git a/astrbot/core/provider/sources/dify_source.py b/astrbot/core/provider/sources/dify_source.py index 3b171bda..807520e0 100644 --- a/astrbot/core/provider/sources/dify_source.py +++ b/astrbot/core/provider/sources/dify_source.py @@ -75,52 +75,57 @@ class ProviderDify(Provider): session_vars = sp.get("session_variables", {}) session_var = session_vars.get(session_id, {}) - match self.api_type: - case "chat" | "agent": - async for chunk in self.api_client.chat_messages( - inputs={ - **session_var - }, - query=prompt, - user=session_id, - conversation_id=conversation_id, - files=files_payload, - timeout=self.timeout - ): - logger.debug(f"dify resp chunk: {chunk}") - if chunk['event'] == "message" or \ - chunk['event'] == "agent_message": - result += chunk['answer'] - if not conversation_id: - self.conversation_ids[session_id] = chunk['conversation_id'] - conversation_id = chunk['conversation_id'] - - case "workflow": - async for chunk in self.api_client.workflow_run( - inputs={ - self.dify_query_input_key: prompt, - "astrbot_session_id": session_id, - **session_var - }, - user=session_id, - files=files_payload, - timeout=self.timeout - ): - match chunk['event']: - case "workflow_started": - logger.info(f"Dify 工作流(ID: {chunk['workflow_run_id']})开始运行。") - case "node_finished": - logger.debug(f"Dify 工作流节点(ID: {chunk['data']['node_id']} Title: {chunk['data'].get('title', '')})运行结束。") - case "workflow_finished": - logger.info(f"Dify 工作流(ID: {chunk['workflow_run_id']})运行结束。") - if chunk['data']['error']: - logger.error(f"Dify 工作流出现错误:{chunk['data']['error']}") - raise Exception(f"Dify 工作流出现错误:{chunk['data']['error']}") - if self.workflow_output_key not in chunk['data']['outputs']: - raise Exception(f"Dify 工作流的输出不包含指定的键名:{self.workflow_output_key}") - result = chunk['data']['outputs'][self.workflow_output_key] - case _: - raise Exception(f"未知的 Dify API 类型:{self.api_type}") + try: + match self.api_type: + case "chat" | "agent": + async for chunk in self.api_client.chat_messages( + inputs={ + **session_var + }, + query=prompt, + user=session_id, + conversation_id=conversation_id, + files=files_payload, + timeout=self.timeout + ): + logger.debug(f"dify resp chunk: {chunk}") + if chunk['event'] == "message" or \ + chunk['event'] == "agent_message": + result += chunk['answer'] + if not conversation_id: + self.conversation_ids[session_id] = chunk['conversation_id'] + conversation_id = chunk['conversation_id'] + + case "workflow": + async for chunk in self.api_client.workflow_run( + inputs={ + self.dify_query_input_key: prompt, + "astrbot_session_id": session_id, + **session_var + }, + user=session_id, + files=files_payload, + timeout=self.timeout + ): + match chunk['event']: + case "workflow_started": + logger.info(f"Dify 工作流(ID: {chunk['workflow_run_id']})开始运行。") + case "node_finished": + logger.debug(f"Dify 工作流节点(ID: {chunk['data']['node_id']} Title: {chunk['data'].get('title', '')})运行结束。") + case "workflow_finished": + logger.info(f"Dify 工作流(ID: {chunk['workflow_run_id']})运行结束。") + if chunk['data']['error']: + logger.error(f"Dify 工作流出现错误:{chunk['data']['error']}") + raise Exception(f"Dify 工作流出现错误:{chunk['data']['error']}") + if self.workflow_output_key not in chunk['data']['outputs']: + raise Exception(f"Dify 工作流的输出不包含指定的键名:{self.workflow_output_key}") + result = chunk['data']['outputs'][self.workflow_output_key] + case _: + raise Exception(f"未知的 Dify API 类型:{self.api_type}") + except Exception as e: + logger.error(f"Dify 请求失败:{str(e)}") + return LLMResponse(role="err", completion_text=f"Dify 请求失败:{str(e)}") + return LLMResponse(role="assistant", completion_text=result) async def forget(self, session_id): diff --git a/astrbot/core/star/filter/command.py b/astrbot/core/star/filter/command.py index 6e037456..ea20be1a 100644 --- a/astrbot/core/star/filter/command.py +++ b/astrbot/core/star/filter/command.py @@ -110,9 +110,6 @@ class CommandFilter(HandlerFilter): message_str = message_str[len(_full):].strip() ok = True break - - print(message_str, self.command_name, self.alias, self.parent_command_names, ok) - if not ok: return False