Three Routing Strategies
DomainRouter
Rule-Based
Regex pattern matching for fast, deterministic routing. Each domain has 4-8 distinctive patterns.
- Deterministic & reproducible
- Sub-millisecond latency
- Confidence: 0.0-1.0
LLMDomainRouter
LLM-Based
LLM-powered routing for ambiguous queries. Fallback when rule confidence < 0.5.
- Handles ambiguity
- Context-aware
- Claude/OpenAI/Ollama
HybridDomainRouter
Recommended
Rule-based first, LLM fallback. Best of both: speed + intelligence.
- Fast for clear queries
- Smart for edge cases
- Production default
Routing Flow
# Hybrid Routing Decision Flow
User Query: "analyze my forehand consistency"
|
v
+---------------------------+
| Rule-Based Router |
| Pattern: "forehand" |
| Match: TennisAgent |
| Confidence: 0.85 |
+---------------------------+
|
| confidence >= 0.5?
|
+---> YES: Route to TennisAgent
|
+---> NO: LLM Fallback
|
v
+------------------+
| LLM Router |
| "Which domain |
| handles this?" |
+------------------+
|
v
Route to selected domain
Domain Patterns
Each domain has distinctive regex patterns for rule-based routing.
| Domain |
Primary Patterns |
Confidence Boost |
| TennisAgent |
zepp|babolat|serve|forehand|backhand|tennis|racquet |
+0.3 per match |
| Portfolio |
portfolio|holdings|tax|options|dividend|allocation|stock |
+0.3 per match |
| Optiver |
optiver|trading|kaggle|feature|ensemble|backtest|wap |
+0.3 per match |
| WQ |
worldquant|wqu|housing|air quality|bankruptcy|volatility |
+0.25 per match |
| Stan |
stats 315|eslii|ridge|lasso|spline|boosting|statistical |
+0.25 per match |
| AI_WQ |
computer vision|cnn|resnet|yolo|image|deep learning |
+0.25 per match |
| QCiAgent |
quantum|qubit|dirac|qatalyst|qci|optimization|eqc |
+0.35 per match |
| YieldModel |
yield|wafer|defect|semiconductor|manufacturing|ic |
+0.35 per match |
| ParableAgent |
parable|jesus|gospel|matthew|luke|biblical|kingdom |
+0.35 per match |
| PPR_Agent |
ppr|pacemaker|implant|device|cardiac|medical |
+0.35 per match |
Routing Result Structure
# RoutingResult dataclass
@dataclass
class RoutingResult:
domain: str # "TennisAgent"
confidence: float # 0.85
method: str # "rule" | "llm" | "hybrid"
matched_patterns: List[str] # ["forehand", "tennis"]
reasoning: Optional[str] # LLM explanation (if used)
# Example Result
RoutingResult(
domain="TennisAgent",
confidence=0.85,
method="rule",
matched_patterns=["forehand", "consistency"],
reasoning=None
)
LLM Routing Prompt
When rule-based confidence is low, the LLM router uses this structured prompt:
# LLM Router System Prompt
You are a query router for Project Phoenix domains.
Given a user query, determine which domain should handle it.
Available domains:
- TennisAgent: Tennis sensor analysis, match/practice data
- Portfolio: Investment portfolio, tax, options
- Optiver: Trading ML, Kaggle competition
- WQ: WorldQuant data science projects
- Stan: Stanford Stats 315A coursework
- AI_WQ: Computer vision, deep learning
- QCiAgent: Quantum computing products
- YieldModel: Semiconductor manufacturing
- ParableAgent: Biblical parables analysis
- PPR_Agent: Medical device reports
Respond with JSON: {"domain": "...", "confidence": 0.X, "reasoning": "..."}
Routing Accuracy by Domain
100%
TennisAgent
Perfect routing
100%
YieldModel
Perfect routing
100%
QCiAgent
Perfect routing
100%
PPR_Agent
Perfect routing
90%
Portfolio
High accuracy
80%
Optiver
Good accuracy
80%
ParableAgent
Good accuracy
40%
Stan
Needs improvement
Overall: 80.6% routing accuracy (83/103 queries)