feat(registry): add openai reasoning-family fallback generalization

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
kerry 2026-09-12 21:14:24 +00:00
parent 261807114a
commit db6b851884
3 changed files with 47 additions and 0 deletions

View file

@ -57470,6 +57470,14 @@
"model_info": {
"supports_reasoning": true
}
},
{
"name": "openai-reasoning-family-baseline",
"pattern": "^(?!.*search-api)(?:[a-z0-9_.-]+/)*(?:ft:)?(?:o[1-9]\\d*(?![a-z0-9])|gpt-(?:[5-9]|[1-9]\\d)(?:\\.\\d+)?(?![0-9.])|(?:[a-z0-9.-]+-)?(?:codex|deep-research|chat-latest))",
"description": "OpenAI reasoning families by id shape, under any provider namespace and with an optional ft: prefix: the o-series (o1, o3-pro, o4-mini), any gpt-5 or later major including dotted minors and suffixed variants (gpt-5.5-cyber, gpt-6-astra), and the codex, deep-research and chat-latest lines. gpt-5-search-api is excluded because it is a search-only surface. Every model here is a reasoning model, and the Responses API drops the caller's reasoning param for any mapped OpenAI model whose info lacks supports_reasoning, so an id the registry has not named yet keeps its reasoning settings instead of silently losing them. Rules lose to exact entries. Carries no mode and no pricing, so cost stays on the standard unpriced behavior.",
"model_info": {
"supports_reasoning": true
}
}
]
},

View file

@ -57470,6 +57470,14 @@
"model_info": {
"supports_reasoning": true
}
},
{
"name": "openai-reasoning-family-baseline",
"pattern": "^(?!.*search-api)(?:[a-z0-9_.-]+/)*(?:ft:)?(?:o[1-9]\\d*(?![a-z0-9])|gpt-(?:[5-9]|[1-9]\\d)(?:\\.\\d+)?(?![0-9.])|(?:[a-z0-9.-]+-)?(?:codex|deep-research|chat-latest))",
"description": "OpenAI reasoning families by id shape, under any provider namespace and with an optional ft: prefix: the o-series (o1, o3-pro, o4-mini), any gpt-5 or later major including dotted minors and suffixed variants (gpt-5.5-cyber, gpt-6-astra), and the codex, deep-research and chat-latest lines. gpt-5-search-api is excluded because it is a search-only surface. Every model here is a reasoning model, and the Responses API drops the caller's reasoning param for any mapped OpenAI model whose info lacks supports_reasoning, so an id the registry has not named yet keeps its reasoning settings instead of silently losing them. Rules lose to exact entries. Carries no mode and no pricing, so cost stays on the standard unpriced behavior.",
"model_info": {
"supports_reasoning": true
}
}
]
},

View file

@ -677,3 +677,34 @@ def test_deployment_model_info_beats_the_seeded_rule_defaults(shipped_cost_map):
assert litellm.model_cost[model]["supports_reasoning"] is False
assert litellm.supports_reasoning(model="some-org/NoThink-1", custom_llm_provider="wandb") is False
def test_shipped_rules_flag_unmapped_openai_reasoning_families(shipped_cost_map):
"""OpenAI ships reasoning families faster than this registry names them. Any id in
the o-series, gpt-5+ major, codex, deep-research or chat-latest shape resolves as
reasoning-capable through the rule, under any provider namespace and an optional
ft: prefix, so the Responses API keeps the caller's reasoning settings instead of
silently dropping them."""
for model in ("gpt-5.7-nova", "openai/gpt-6", "ft:gpt-5.1-2025-11-13:org::abc", "o5-mini", "gpt-5.6-codex-max", "o4-mini-deep-research-2027-01-01", "gpt-5.7-chat-latest", "azure/gpt-5.7-cyber"):
assert model not in litellm.model_cost, model
assert match_capability_generalizations(model) == {"supports_reasoning": True}, model
info = litellm.get_model_info("gpt-5.7-nova", custom_llm_provider="openai")
assert info["litellm_provider"] == "openai"
assert info["supports_reasoning"] is True
assert info.get("mode") is None
assert not info.get("input_cost_per_token")
assert litellm.supports_reasoning(model="gpt-5.7-nova", custom_llm_provider="openai") is True
def test_shipped_openai_reasoning_rule_skips_non_reasoning_gpt_ids(shipped_cost_map):
"""The rule is gated on the reasoning-family shapes, so gpt-4.x, gpt-oss, realtime,
image, moderation, embedding and search-api ids all stay unflagged."""
for model in ("gpt-4o", "gpt-4.1-nano-new", "gpt-oss-120b", "gpt-realtime-2027", "gpt-image-2", "gpt-5-search-api-2027-01-01", "omni-moderation-new", "text-embedding-4"):
assert match_capability_generalizations(model) is None, model
def test_shipped_openai_reasoning_rule_loses_to_mapped_entries(shipped_cost_map):
"""Rules lose to exact entries: gpt-5-search-api is mapped non-reasoning, and the
search-api negative lookahead keeps the rule from flagging it anyway."""
assert "gpt-5-search-api" in litellm.model_cost
assert litellm.supports_reasoning(model="gpt-5-search-api", custom_llm_provider="openai") is False