Motivation
Jev returns a confidence value and a probability for each candidate, but route() throws them away. Callers could use them to fall back to a safe default when confidence is low, to log decisions, or to A/B test.
Proposal
Keep route() returning a plain str (no breaking change) and add:
result = router.route_details(task)
result.model # "openai/gpt-6-luna"
result.confidence # 0.95 or None (e.g. when Jev was skipped)
result.probabilities # {"openai/gpt-6-luna": 0.96, ...}, keyed by real model id, not alias
result.candidates # ids that passed the limits
result.rejected # {model_id: reason}
Both backends need mapping: OpenRouter answers use aliases m0..mN, and Jev returns data.probabilities.
Done when
Motivation
Jev returns a confidence value and a probability for each candidate, but
route()throws them away. Callers could use them to fall back to a safe default when confidence is low, to log decisions, or to A/B test.Proposal
Keep
route()returning a plainstr(no breaking change) and add:Both backends need mapping: OpenRouter answers use aliases
m0..mN, and Jev returnsdata.probabilities.Done when