85 lines
2.7 KiB
Python
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)
|