| """Factory for creating orchestrators.""" |
|
|
| from typing import Any, Literal |
|
|
| from src.orchestrator import JudgeHandlerProtocol, Orchestrator, SearchHandlerProtocol |
| from src.utils.models import OrchestratorConfig |
|
|
|
|
| def create_orchestrator( |
| search_handler: SearchHandlerProtocol | None = None, |
| judge_handler: JudgeHandlerProtocol | None = None, |
| config: OrchestratorConfig | None = None, |
| mode: Literal["simple", "magentic"] = "simple", |
| ) -> Any: |
| """ |
| Create an orchestrator instance. |
| |
| Args: |
| search_handler: The search handler (required for simple mode) |
| judge_handler: The judge handler (required for simple mode) |
| config: Optional configuration |
| mode: "simple" for Phase 4 loop, "magentic" for ChatAgent-based multi-agent |
| |
| Returns: |
| Orchestrator instance |
| |
| Note: |
| Magentic mode does NOT use search_handler/judge_handler. |
| It creates ChatAgent instances with internal LLMs that call tools directly. |
| """ |
| if mode == "magentic": |
| try: |
| from src.orchestrator_magentic import MagenticOrchestrator |
|
|
| return MagenticOrchestrator( |
| max_rounds=config.max_iterations if config else 10, |
| ) |
| except ImportError: |
| |
| pass |
|
|
| |
| if search_handler is None or judge_handler is None: |
| raise ValueError("Simple mode requires search_handler and judge_handler") |
|
|
| return Orchestrator( |
| search_handler=search_handler, |
| judge_handler=judge_handler, |
| config=config, |
| ) |
|
|