diff --git a/langextract/providers/patterns.py b/langextract/providers/patterns.py index 9fd18cab..27f2632a 100644 --- a/langextract/providers/patterns.py +++ b/langextract/providers/patterns.py @@ -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 diff --git a/tests/registry_test.py b/tests/registry_test.py index fa907067..b5822923 100644 --- a/tests/registry_test.py +++ b/tests/registry_test.py @@ -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)