|
4 | 4 |
|
5 | 5 | from typing import Any |
6 | 6 |
|
| 7 | +import httpx |
7 | 8 | import pytest |
8 | | -from openai import AsyncAzureOpenAI |
| 9 | +from azure.core.exceptions import ClientAuthenticationError |
| 10 | +from openai import APIConnectionError, AsyncAzureOpenAI |
9 | 11 | from pydantic import SecretStr |
10 | 12 | from pydantic_ai.embeddings.openai import OpenAIEmbeddingModel |
11 | 13 | from pydantic_ai.models.openai import OpenAIResponsesModel |
|
14 | 16 | from models.config import AzureEntraIdConfiguration, AzureInferenceProviderEntry |
15 | 17 | from providers.inference.azure.provider import AzureInferenceProvider |
16 | 18 | from providers.inference.catalog import CatalogModel |
17 | | -from providers.inference.errors import ModelTypeNotSupportedError |
| 19 | +from providers.inference.errors import ModelDiscoveryError, ModelTypeNotSupportedError |
18 | 20 |
|
19 | 21 | AZURE_ENDPOINT = "https://example.openai.azure.com/" |
20 | 22 | API_VERSION = "2024-12-01-preview" |
@@ -190,6 +192,38 @@ async def test_discover_models_infers_model_types( |
190 | 192 | pai_provider.client.models.list.assert_awaited_once_with() |
191 | 193 |
|
192 | 194 |
|
| 195 | +@pytest.mark.asyncio |
| 196 | +@pytest.mark.parametrize( |
| 197 | + "cause", |
| 198 | + [ |
| 199 | + APIConnectionError( |
| 200 | + message="connection failed", |
| 201 | + request=httpx.Request( # pyright: ignore[reportArgumentType] |
| 202 | + "GET", f"{AZURE_ENDPOINT}openai/models" |
| 203 | + ), |
| 204 | + ), |
| 205 | + ClientAuthenticationError(message="token acquisition failed"), |
| 206 | + ], |
| 207 | + ids=["connection-error", "entra-auth-error"], |
| 208 | +) |
| 209 | +async def test_discover_models_wraps_foreign_failures( |
| 210 | + provider: AzureInferenceProvider, |
| 211 | + mocker: Any, |
| 212 | + cause: Exception, |
| 213 | +) -> None: |
| 214 | + """OpenAI API subclasses and Entra auth failures become ModelDiscoveryError.""" |
| 215 | + pai_provider = mocker.MagicMock(spec=AzureProvider) |
| 216 | + pai_provider.client.models.list = mocker.AsyncMock(side_effect=cause) |
| 217 | + provider._provider = pai_provider |
| 218 | + |
| 219 | + with pytest.raises(ModelDiscoveryError) as exc_info: |
| 220 | + await provider._discover_models() |
| 221 | + |
| 222 | + assert exc_info.value.provider_id == "azure" |
| 223 | + assert str(exc_info.value) == "Failed to discover models for provider 'azure'" |
| 224 | + assert exc_info.value.__cause__ is cause |
| 225 | + |
| 226 | + |
193 | 227 | def test_create_llm_uses_openai_responses_model( |
194 | 228 | provider: AzureInferenceProvider, |
195 | 229 | ) -> None: |
|
0 commit comments