import time from typing import AsyncGenerator, Callable, Optional, Union from autogen_agentchat.base import TaskResult from autogen_agentchat.messages import AgentMessage, ChatMessage from autogen_core.base import CancellationToken from .database import Component, ComponentFactory from .datamodel import ComponentConfigInput, TeamResult class TeamManager: def __init__(self) -> None: self.component_factory = ComponentFactory() async def _create_team(self, team_config: ComponentConfigInput, input_func: Optional[Callable] = None) -> Component: """Create team instance with common setup logic""" return await self.component_factory.load(team_config, input_func=input_func) def _create_result(self, task_result: TaskResult, start_time: float) -> TeamResult: """Create TeamResult with timing info""" return TeamResult(task_result=task_result, usage="", duration=time.time() - start_time) async def run_stream( self, task: str, team_config: ComponentConfigInput, input_func: Optional[Callable] = None, cancellation_token: Optional[CancellationToken] = None, ) -> AsyncGenerator[Union[AgentMessage, ChatMessage, TaskResult], None]: """Stream the team's execution results""" start_time = time.time() try: team = await self._create_team(team_config, input_func) stream = team.run_stream(task=task, cancellation_token=cancellation_token) async for message in stream: if cancellation_token and cancellation_token.is_cancelled(): break if isinstance(message, TaskResult): yield self._create_result(message, start_time) else: yield message except Exception as e: raise e async def run( self, task: str, team_config: ComponentConfigInput, input_func: Optional[Callable] = None, cancellation_token: Optional[CancellationToken] = None, ) -> TeamResult: """Original non-streaming run method with optional cancellation""" start_time = time.time() team = await self._create_team(team_config, input_func) result = await team.run(task=task, cancellation_token=cancellation_token) return self._create_result(result, start_time)