In-house routing
OpenSmartRoute vs Building it yourself
The first if-statement takes a week. Policy, learning, drift detection, audit, explainability and the maintenance after every model release take a year. OpenSmartRoute is Apache-2.0 with zero dependencies, so you build on it rather than instead of it.
“Build on it, not instead of it.”
Choose Building it yourself when
- One model, one app, nobody asks why
Choose OpenSmartRoute when
- Anyone asks why a request went where it went
- Compliance needs region, boundary or PII enforcement with evidence
- The catalogue changes more than once a quarter
- You want savings you can show finance
Capability by capability
Our reading of public documentation; corrections welcome via GitHub issues.
| Capability | OpenSmartRoute | Building it yourself |
|---|---|---|
| Routes to LLMs | Yes | Yes |
| Routes to agents, skills, tools, workflows and humansUsually a growing if/else per app | Yes | Partial |
| Hard policy before scoring (region, data boundary, PII, tenant, cost)Ad hoc checks; no rejection trace | Yes | Partial |
| Per-request trace with ranked candidates and rejections | Yes | No |
| Learns from your outcomes (per target, per tenant) | Yes | No |
| Multi-step plans (persona -> skill -> model) | Yes | No |
| Self-hosted, air-gapped, zero runtime dependencies | Yes | Yes |
| Prompt-injection and steering-gadget defences on the router | Yes | No |
| Savings ledger and Routing Audit | Yes | No |
| OpenAI-compatible proxy | Yes | Partial |
| Provider marketplace with credits | No | No |
| Request/response observability UI for every callDecision traces and usage; pair with your APM for payload-level tracing | Partial | No |
Keep your rules, add the engine
Register your existing handlers as targets with the decorator SDK and keep your rules as a RulesStrategy; the router adds policy, trace, learning and the ledger around them.
from opensmartroute.sdk import ComponentRegistry
components = ComponentRegistry()
@components.tool("sql-report", domains=["reporting"], cost={"usd_per_1k_tokens": 0.0})
def sql_report(request, target): ...
router = components.router() # your rules: @components.policy_rule / RulesStrategyProve it on your traffic
Run the Routing Audit on a week of anonymised logs: savings versus your current mix, policy violations your routing allowed, and where agents or humans would have been the better answer.
Other comparisons: OpenRouter, LiteLLM, Portkey.