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