Spaces:
Running
Running
Merge feat/graph-integration: Add graph orchestration UI integration
Browse files- src/app.py +12 -6
- 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=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
"
|
| 607 |
"Qwen/Qwen3-235B-A22B-Instruct-2507",
|
| 608 |
"",
|
| 609 |
],
|
| 610 |
[
|
| 611 |
-
"
|
| 612 |
-
"
|
| 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", "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
|