From 8e0314a559e7a3a5de2b5bcd121ec61187e8b2c5 Mon Sep 17 00:00:00 2001 From: LIghtJUNction Date: Mon, 23 Mar 2026 13:29:53 +0800 Subject: [PATCH] refactor: reorganize agent runner imports for openai-agents integration - Move AgentResponse to its own module in core/agent/response - Update import paths in all runner files - Add provider_config parameter to ToolLoopAgentRunner --- .../agent/runners/coze/coze_agent_runner.py | 4 +-- .../dashscope/dashscope_agent_runner.py | 4 +-- .../runners/deerflow/deerflow_agent_runner.py | 28 +++++++++++++++---- .../agent/runners/dify/dify_agent_runner.py | 21 ++++++++++++-- .../agent/runners/tool_loop_agent_runner.py | 1 + 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/astrbot/core/agent/runners/coze/coze_agent_runner.py b/astrbot/core/agent/runners/coze/coze_agent_runner.py index 56c7fd814..171b34112 100644 --- a/astrbot/core/agent/runners/coze/coze_agent_runner.py +++ b/astrbot/core/agent/runners/coze/coze_agent_runner.py @@ -8,9 +8,9 @@ import astrbot.core.message.components as Comp from astrbot import logger from astrbot.core import sp from astrbot.core.agent.hooks import BaseAgentRunHooks -from astrbot.core.agent.response import AgentResponseData +from astrbot.core.agent.response import AgentResponse, AgentResponseData from astrbot.core.agent.run_context import ContextWrapper, TContext -from astrbot.core.agent.runners.base import AgentResponse, AgentState, BaseAgentRunner +from astrbot.core.agent.runners.base import AgentState, BaseAgentRunner from astrbot.core.agent.tool_executor import BaseFunctionToolExecutor from astrbot.core.message.message_event_result import MessageChain from astrbot.core.provider.entities import ( diff --git a/astrbot/core/agent/runners/dashscope/dashscope_agent_runner.py b/astrbot/core/agent/runners/dashscope/dashscope_agent_runner.py index 6f672227c..e780c71c4 100644 --- a/astrbot/core/agent/runners/dashscope/dashscope_agent_runner.py +++ b/astrbot/core/agent/runners/dashscope/dashscope_agent_runner.py @@ -23,7 +23,7 @@ from ...hooks import BaseAgentRunHooks from ...response import AgentResponseData from ...run_context import ContextWrapper, TContext from ..base import AgentResponse, AgentState, BaseAgentRunner -from ..tool_executor import BaseFunctionToolExecutor +from ...tool_executor import BaseFunctionToolExecutor if sys.version_info >= (3, 12): from typing import override @@ -295,7 +295,7 @@ class DashscopeAgentRunner(BaseAgentRunner[TContext]): async def _handle_streaming_response( self, response: Any, session_id: str - ) -> T.AsyncGenerator[AgentResponse, None]: + ) -> AsyncGenerator[AgentResponse, None]: """处理流式响应 Args: diff --git a/astrbot/core/agent/runners/deerflow/deerflow_agent_runner.py b/astrbot/core/agent/runners/deerflow/deerflow_agent_runner.py index ce16a3663..66692aa01 100644 --- a/astrbot/core/agent/runners/deerflow/deerflow_agent_runner.py +++ b/astrbot/core/agent/runners/deerflow/deerflow_agent_runner.py @@ -4,7 +4,9 @@ import json import sys import typing as T from collections import deque +from collections.abc import AsyncGenerator from dataclasses import dataclass, field +from typing import Any from uuid import uuid4 import astrbot.core.message.components as Comp @@ -15,12 +17,14 @@ from astrbot.core.provider.entities import ( LLMResponse, ProviderRequest, ) +from astrbot.core.provider.provider import Provider from astrbot.core.utils.config_number import coerce_int_config from ...hooks import BaseAgentRunHooks from ...response import AgentResponseData from ...run_context import ContextWrapper, TContext from ..base import AgentResponse, AgentState, BaseAgentRunner +from ..tool_executor import BaseFunctionToolExecutor from .constants import DEERFLOW_SESSION_PREFIX, DEERFLOW_THREAD_ID_KEY from .deerflow_api_client import DeerFlowAPIClient from .deerflow_content_mapper import ( @@ -261,20 +265,32 @@ class DeerFlowAgentRunner(BaseAgentRunner[TContext]): @override async def reset( self, + provider: Provider, request: ProviderRequest, run_context: ContextWrapper[TContext], + tool_executor: BaseFunctionToolExecutor[TContext], agent_hooks: BaseAgentRunHooks[TContext], - provider_config: dict, - **kwargs: T.Any, + streaming: bool = False, + enforce_max_turns: int = -1, + llm_compress_instruction: str | None = None, + llm_compress_keep_recent: int = 0, + llm_compress_provider: Provider | None = None, + truncate_turns: int = 1, + custom_token_counter: Any = None, + custom_compressor: Any = None, + tool_schema_mode: str | None = "full", + fallback_providers: list[Provider] | None = None, + provider_config: dict | None = None, + **kwargs: Any, ) -> None: self.req = request - self.streaming = kwargs.get("streaming", False) + self.streaming = streaming self.final_llm_resp = None self._state = AgentState.IDLE self.agent_hooks = agent_hooks self.run_context = run_context - await self._load_config_and_client(provider_config) + await self._load_config_and_client(provider_config or {}) @override async def step(self): @@ -304,8 +320,8 @@ class DeerFlowAgentRunner(BaseAgentRunner[TContext]): @override async def step_until_done( - self, max_step: int = 3 - ) -> T.AsyncGenerator[AgentResponse, None]: + self, max_step: int + ) -> AsyncGenerator[AgentResponse, None]: if max_step <= 0: raise ValueError("max_step must be greater than 0") diff --git a/astrbot/core/agent/runners/dify/dify_agent_runner.py b/astrbot/core/agent/runners/dify/dify_agent_runner.py index 679fe51bd..ff22ac299 100644 --- a/astrbot/core/agent/runners/dify/dify_agent_runner.py +++ b/astrbot/core/agent/runners/dify/dify_agent_runner.py @@ -11,11 +11,13 @@ from astrbot.core.agent.response import AgentResponseData from astrbot.core.agent.run_context import ContextWrapper, TContext from astrbot.core.agent.runners.base import AgentResponse, AgentState, BaseAgentRunner from astrbot.core.agent.runners.dify.dify_api_client import DifyAPIClient +from astrbot.core.agent.tool_executor import BaseFunctionToolExecutor from astrbot.core.message.message_event_result import MessageChain from astrbot.core.provider.entities import ( LLMResponse, ProviderRequest, ) +from astrbot.core.provider.provider import Provider from astrbot.core.utils.astrbot_path import get_astrbot_temp_path from astrbot.core.utils.io import download_file @@ -31,19 +33,32 @@ class DifyAgentRunner(BaseAgentRunner[TContext]): @override async def reset( self, + provider: Provider, request: ProviderRequest, run_context: ContextWrapper[TContext], + tool_executor: BaseFunctionToolExecutor[TContext], agent_hooks: BaseAgentRunHooks[TContext], - provider_config: dict, + streaming: bool = False, + enforce_max_turns: int = -1, + llm_compress_instruction: str | None = None, + llm_compress_keep_recent: int = 0, + llm_compress_provider: Provider | None = None, + truncate_turns: int = 1, + custom_token_counter: Any = None, + custom_compressor: Any = None, + tool_schema_mode: str | None = "full", + fallback_providers: list[Provider] | None = None, + provider_config: dict | None = None, **kwargs: Any, ) -> None: self.req = request - self.streaming = kwargs.get("streaming", False) + self.streaming = streaming self.final_llm_resp = None self._state = AgentState.IDLE self.agent_hooks = agent_hooks self.run_context = run_context + provider_config = provider_config or {} self.api_key = provider_config.get("dify_api_key", "") self.api_base = provider_config.get("dify_api_base", "https://api.dify.ai/v1") self.api_type = provider_config.get("dify_api_type", "chat") @@ -100,7 +115,7 @@ class DifyAgentRunner(BaseAgentRunner[TContext]): @override async def step_until_done( - self, max_step: int = 3 + self, max_step: int ) -> AsyncGenerator[AgentResponse, None]: while not self.done(): async for resp in self.step(): diff --git a/astrbot/core/agent/runners/tool_loop_agent_runner.py b/astrbot/core/agent/runners/tool_loop_agent_runner.py index 9d7d9616e..38ef038e6 100644 --- a/astrbot/core/agent/runners/tool_loop_agent_runner.py +++ b/astrbot/core/agent/runners/tool_loop_agent_runner.py @@ -128,6 +128,7 @@ class ToolLoopAgentRunner(BaseAgentRunner[TContext]): custom_compressor: ContextCompressor | None = None, tool_schema_mode: str | None = "full", fallback_providers: list[Provider] | None = None, + provider_config: dict | None = None, **kwargs: Any, ) -> None: self.req = request