SeasonalFall84 commited on
Commit
ce99b59
·
1 Parent(s): 2e8ec14

feat: integrate graph orchestration modes into UI

Browse files

- Extend orchestrator factory to support 5 modes (simple, advanced, iterative, deep, auto)
- Add lazy import for create_graph_orchestrator to avoid circular dependencies
- Update Gradio UI dropdown to show all 5 modes with descriptions
- Update example queries to demonstrate different orchestration modes (simple, iterative, deep)

Files changed (2) hide show
  1. src/app.py +12 -6
  2. src/orchestrator_factory.py +33 -3
src/app.py CHANGED
@@ -555,10 +555,16 @@ def create_demo() -> gr.Blocks:
555
  # Settings will use defaults from configure_orchestrator
556
  with gr.Row(visible=False):
557
  mode_radio = gr.Radio(
558
- choices=["simple", "advanced"],
559
  value="simple",
560
  label="Orchestrator Mode",
561
- info="Simple: Linear | Advanced: Multi-Agent (HuggingFace Inference)",
 
 
 
 
 
 
562
  )
563
 
564
  # Hidden text components for model/provider (not dropdowns to avoid value mismatch)
@@ -602,14 +608,14 @@ def create_demo() -> gr.Blocks:
602
  "",
603
  ],
604
  [
605
- "Is metformin effective for treating cancer?",
606
- "simple",
607
  "Qwen/Qwen3-235B-A22B-Instruct-2507",
608
  "",
609
  ],
610
  [
611
- "What medications show promise for Long COVID treatment?",
612
- "simple",
613
  "zai-org/GLM-4.5-Air",
614
  "nebius",
615
  ],
 
555
  # Settings will use defaults from configure_orchestrator
556
  with gr.Row(visible=False):
557
  mode_radio = gr.Radio(
558
+ choices=["simple", "advanced", "iterative", "deep", "auto"],
559
  value="simple",
560
  label="Orchestrator Mode",
561
+ info=(
562
+ "Simple: Linear search-judge loop | "
563
+ "Advanced: Multi-agent (OpenAI) | "
564
+ "Iterative: Knowledge-gap driven | "
565
+ "Deep: Parallel sections | "
566
+ "Auto: Smart routing"
567
+ ),
568
  )
569
 
570
  # Hidden text components for model/provider (not dropdowns to avoid value mismatch)
 
608
  "",
609
  ],
610
  [
611
+ "Is metformin effective for treating cancer? Investigate mechanism of action.",
612
+ "iterative",
613
  "Qwen/Qwen3-235B-A22B-Instruct-2507",
614
  "",
615
  ],
616
  [
617
+ "Create a comprehensive report on Long COVID treatments including clinical trials, mechanisms, and safety.",
618
+ "deep",
619
  "zai-org/GLM-4.5-Air",
620
  "nebius",
621
  ],
src/orchestrator_factory.py CHANGED
@@ -28,11 +28,24 @@ def _get_magentic_orchestrator_class() -> Any:
28
  ) from e
29
 
30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  def create_orchestrator(
32
  search_handler: SearchHandlerProtocol | None = None,
33
  judge_handler: JudgeHandlerProtocol | None = None,
34
  config: OrchestratorConfig | None = None,
35
- mode: Literal["simple", "magentic", "advanced"] | None = None,
36
  ) -> Any:
37
  """
38
  Create an orchestrator instance.
@@ -41,7 +54,12 @@ def create_orchestrator(
41
  search_handler: The search handler (required for simple mode)
42
  judge_handler: The judge handler (required for simple mode)
43
  config: Optional configuration
44
- mode: "simple", "magentic", "advanced" or None (auto-detect)
 
 
 
 
 
45
 
46
  Returns:
47
  Orchestrator instance
@@ -55,6 +73,16 @@ def create_orchestrator(
55
  max_rounds=config.max_iterations if config else 10,
56
  )
57
 
 
 
 
 
 
 
 
 
 
 
58
  # Simple mode requires handlers
59
  if search_handler is None or judge_handler is None:
60
  raise ValueError("Simple mode requires search_handler and judge_handler")
@@ -71,9 +99,11 @@ def _determine_mode(explicit_mode: str | None) -> str:
71
  if explicit_mode:
72
  if explicit_mode in ("magentic", "advanced"):
73
  return "advanced"
 
 
74
  return "simple"
75
 
76
- # Auto-detect: advanced if paid API key available
77
  if settings.has_openai_key:
78
  return "advanced"
79
 
 
28
  ) from e
29
 
30
 
31
+ def _get_graph_orchestrator_factory() -> Any:
32
+ """Import create_graph_orchestrator lazily to avoid circular dependencies."""
33
+ try:
34
+ from src.orchestrator.graph_orchestrator import create_graph_orchestrator
35
+
36
+ return create_graph_orchestrator
37
+ except ImportError as e:
38
+ logger.error("Failed to import create_graph_orchestrator", error=str(e))
39
+ raise ValueError(
40
+ "Graph orchestrators require Pydantic Graph. Please check dependencies."
41
+ ) from e
42
+
43
+
44
  def create_orchestrator(
45
  search_handler: SearchHandlerProtocol | None = None,
46
  judge_handler: JudgeHandlerProtocol | None = None,
47
  config: OrchestratorConfig | None = None,
48
+ mode: Literal["simple", "magentic", "advanced", "iterative", "deep", "auto"] | None = None,
49
  ) -> Any:
50
  """
51
  Create an orchestrator instance.
 
54
  search_handler: The search handler (required for simple mode)
55
  judge_handler: The judge handler (required for simple mode)
56
  config: Optional configuration
57
+ mode: Orchestrator mode - "simple", "advanced", "iterative", "deep", "auto", or None (auto-detect)
58
+ - "simple": Linear search-judge loop (Free Tier)
59
+ - "advanced": Multi-agent coordination (Requires OpenAI)
60
+ - "iterative": Knowledge-gap-driven research (Free Tier)
61
+ - "deep": Parallel section-based research (Free Tier)
62
+ - "auto": Intelligent mode detection (Free Tier)
63
 
64
  Returns:
65
  Orchestrator instance
 
73
  max_rounds=config.max_iterations if config else 10,
74
  )
75
 
76
+ # Graph-based orchestrators (iterative, deep, auto)
77
+ if effective_mode in ("iterative", "deep", "auto"):
78
+ create_graph_orchestrator = _get_graph_orchestrator_factory()
79
+ return create_graph_orchestrator(
80
+ mode=effective_mode, # type: ignore[arg-type]
81
+ max_iterations=config.max_iterations if config else 5,
82
+ max_time_minutes=10,
83
+ use_graph=True,
84
+ )
85
+
86
  # Simple mode requires handlers
87
  if search_handler is None or judge_handler is None:
88
  raise ValueError("Simple mode requires search_handler and judge_handler")
 
99
  if explicit_mode:
100
  if explicit_mode in ("magentic", "advanced"):
101
  return "advanced"
102
+ if explicit_mode in ("iterative", "deep", "auto"):
103
+ return explicit_mode
104
  return "simple"
105
 
106
+ # Auto-detect: advanced if paid API key available, otherwise simple
107
  if settings.has_openai_key:
108
  return "advanced"
109