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