fischer-agentkit/src/agentkit/core/agent_pool.py

85 lines
2.7 KiB
Python

"""AgentPool - 运行时 Agent 实例池"""
import logging
from typing import TYPE_CHECKING
from agentkit.core.config_driven import ConfigDrivenAgent
from agentkit.core.protocol import AgentStatus
from agentkit.llm.gateway import LLMGateway
from agentkit.skills.registry import SkillRegistry
from agentkit.tools.registry import ToolRegistry
if TYPE_CHECKING:
from agentkit.core.compressor import CompressionStrategy
logger = logging.getLogger(__name__)
class AgentPool:
"""运行时 Agent 实例池,管理 Agent 的创建、获取、删除"""
def __init__(
self,
llm_gateway: LLMGateway,
skill_registry: SkillRegistry,
tool_registry: ToolRegistry | None = None,
compressor: "CompressionStrategy | None" = None,
):
self._agents: dict[str, ConfigDrivenAgent] = {}
self._llm_gateway = llm_gateway
self._skill_registry = skill_registry
self._tool_registry = tool_registry or ToolRegistry()
self._compressor = compressor
async def create_agent(self, config) -> ConfigDrivenAgent:
"""Create and start an Agent instance
Args:
config: AgentConfig or SkillConfig instance
Returns:
The created ConfigDrivenAgent
"""
# If agent with same name exists, stop it first
if config.name in self._agents:
await self.remove_agent(config.name)
agent = ConfigDrivenAgent(
config=config,
tool_registry=self._tool_registry,
llm_gateway=self._llm_gateway,
compressor=self._compressor,
)
await agent.start()
self._agents[config.name] = agent
logger.info(f"Agent '{config.name}' created and started in pool")
return agent
async def remove_agent(self, name: str) -> None:
"""Stop and remove an Agent"""
agent = self._agents.pop(name, None)
if agent:
await agent.stop()
logger.info(f"Agent '{name}' stopped and removed from pool")
def get_agent(self, name: str) -> ConfigDrivenAgent | None:
"""Get agent by name"""
return self._agents.get(name)
def list_agents(self) -> list[dict]:
"""List all agents with info"""
return [
{
"name": agent.name,
"agent_type": agent.agent_type,
"version": agent.version,
"state": agent.status.value,
}
for agent in self._agents.values()
]
async def create_agent_from_skill(self, skill_name: str) -> ConfigDrivenAgent:
"""Create agent from a registered skill"""
skill = self._skill_registry.get(skill_name)
return await self.create_agent(skill.config)