Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions langextract/providers/patterns.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,12 @@

# OpenAI provider patterns
OPENAI_PATTERNS = (
r'^gpt-3\.5', # gpt-3.5-turbo, gpt-3.5-turbo-16k, etc.
r'^gpt-4',
r'^gpt4\.',
r'^gpt-5',
r'^gpt5\.',
r'^o[1-9]', # reasoning models: o1, o3, o3-mini, o4-mini, etc.
)
OPENAI_PRIORITY = 10

Expand Down
14 changes: 14 additions & 0 deletions tests/registry_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,20 @@ def test_load_builtins_once_deduplicates_and_recovers_after_clear(self):

self.assertEqual(router.list_providers(), first_providers)

def test_openai_patterns_cover_reasoning_and_gpt35_models(self):
"""OpenAI o-series and gpt-3.5 model IDs resolve to the OpenAI provider."""
providers_module._builtins_loaded = False # pylint: disable=protected-access
providers_module.load_builtins_once()

for model_id in ("o1", "o3-mini", "o4-mini", "gpt-3.5-turbo", "gpt-4o"):
with self.subTest(model_id=model_id):
resolved = router.resolve(model_id)
self.assertEqual(resolved.__name__, "OpenAILanguageModel")

# The o-series pattern must not swallow other o-prefixed model IDs.
with self.assertRaises(exceptions.InferenceConfigError):
router.resolve("openchat")

def test_list_entries(self):
"""Test listing registered entries."""
router.register_lazy(r"^test1", target="fake:Target1", priority=5)
Expand Down
Loading