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
This commit is contained in:
LIghtJUNction
2026-03-23 13:29:53 +08:00
parent 524b5cbe42
commit 8e0314a559
5 changed files with 45 additions and 13 deletions

View File

@@ -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 (

View File

@@ -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:

View File

@@ -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")

View File

@@ -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():

View File

@@ -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