diff --git a/pydantic_ai_slim/pydantic_ai/durable_exec/dbos/_model.py b/pydantic_ai_slim/pydantic_ai/durable_exec/dbos/_model.py index d38457bdde..6b5bc757e9 100644 --- a/pydantic_ai_slim/pydantic_ai/durable_exec/dbos/_model.py +++ b/pydantic_ai_slim/pydantic_ai/durable_exec/dbos/_model.py @@ -46,6 +46,10 @@ def model_name(self) -> str: def provider_name(self) -> str: return self.response.provider_name or '' # pragma: no cover + @property + def provider_url(self) -> str | None: + return self.response.provider_url # pragma: no cover + @property def timestamp(self) -> datetime: return self.response.timestamp # pragma: no cover diff --git a/pydantic_ai_slim/pydantic_ai/durable_exec/prefect/_model.py b/pydantic_ai_slim/pydantic_ai/durable_exec/prefect/_model.py index 7a8e812677..bd6c5b2cd4 100644 --- a/pydantic_ai_slim/pydantic_ai/durable_exec/prefect/_model.py +++ b/pydantic_ai_slim/pydantic_ai/durable_exec/prefect/_model.py @@ -55,6 +55,10 @@ def model_name(self) -> str: def provider_name(self) -> str: return self.response.provider_name or '' # pragma: no cover + @property + def provider_url(self) -> str | None: + return self.response.provider_url # pragma: no cover + @property def timestamp(self) -> datetime: return self.response.timestamp # pragma: no cover diff --git a/pydantic_ai_slim/pydantic_ai/durable_exec/temporal/_model.py b/pydantic_ai_slim/pydantic_ai/durable_exec/temporal/_model.py index 794f36ba16..e1e928171a 100644 --- a/pydantic_ai_slim/pydantic_ai/durable_exec/temporal/_model.py +++ b/pydantic_ai_slim/pydantic_ai/durable_exec/temporal/_model.py @@ -60,6 +60,10 @@ def model_name(self) -> str: def provider_name(self) -> str: return self.response.provider_name or '' # pragma: no cover + @property + def provider_url(self) -> str | None: + return self.response.provider_url # pragma: no cover + @property def timestamp(self) -> datetime: return self.response.timestamp # pragma: no cover diff --git a/pydantic_ai_slim/pydantic_ai/messages.py b/pydantic_ai_slim/pydantic_ai/messages.py index 53b6734d34..a93875bd47 100644 --- a/pydantic_ai_slim/pydantic_ai/messages.py +++ b/pydantic_ai_slim/pydantic_ai/messages.py @@ -1249,6 +1249,9 @@ class ModelResponse: provider_name: str | None = None """The name of the LLM provider that generated the response.""" + provider_url: str | None = None + """The base URL of the LLM provider that generated the response.""" + provider_details: Annotated[ dict[str, Any] | None, # `vendor_details` is deprecated, but we still want to support deserializing model responses stored in a DB before the name was changed @@ -1337,6 +1340,17 @@ def cost(self) -> genai_types.PriceCalculation: Uses [`genai-prices`](https://github.com/pydantic/genai-prices). """ assert self.model_name, 'Model name is required to calculate price' + # Try matching on provider_api_url first as this is more specific, then fall back to provider_id. + if self.provider_url: + try: + return calc_price( + self.usage, + self.model_name, + provider_api_url=self.provider_url, + genai_request_timestamp=self.timestamp, + ) + except LookupError: + pass return calc_price( self.usage, self.model_name, diff --git a/pydantic_ai_slim/pydantic_ai/models/__init__.py b/pydantic_ai_slim/pydantic_ai/models/__init__.py index aef137cc29..0393c510f0 100644 --- a/pydantic_ai_slim/pydantic_ai/models/__init__.py +++ b/pydantic_ai_slim/pydantic_ai/models/__init__.py @@ -875,6 +875,7 @@ def get(self) -> ModelResponse: timestamp=self.timestamp, usage=self.usage(), provider_name=self.provider_name, + provider_url=self.provider_url, provider_response_id=self.provider_response_id, provider_details=self.provider_details, finish_reason=self.finish_reason, @@ -897,6 +898,12 @@ def provider_name(self) -> str | None: """Get the provider name.""" raise NotImplementedError() + @property + @abstractmethod + def provider_url(self) -> str | None: + """Get the provider base URL.""" + raise NotImplementedError() + @property @abstractmethod def timestamp(self) -> datetime: diff --git a/pydantic_ai_slim/pydantic_ai/models/anthropic.py b/pydantic_ai_slim/pydantic_ai/models/anthropic.py index 2c7ff578d5..9bc04f7619 100644 --- a/pydantic_ai_slim/pydantic_ai/models/anthropic.py +++ b/pydantic_ai_slim/pydantic_ai/models/anthropic.py @@ -561,6 +561,7 @@ def _process_response(self, response: BetaMessage) -> ModelResponse: model_name=response.model, provider_response_id=response.id, provider_name=self._provider.name, + provider_url=self._provider.base_url, finish_reason=finish_reason, provider_details=provider_details, ) @@ -1298,6 +1299,11 @@ def provider_name(self) -> str: """Get the provider name.""" return self._provider_name + @property + def provider_url(self) -> str: + """Get the provider base URL.""" + return self._provider_url + @property def timestamp(self) -> datetime: """Get the timestamp of the response.""" diff --git a/pydantic_ai_slim/pydantic_ai/models/bedrock.py b/pydantic_ai_slim/pydantic_ai/models/bedrock.py index 1424d2cb58..78d71ba700 100644 --- a/pydantic_ai_slim/pydantic_ai/models/bedrock.py +++ b/pydantic_ai_slim/pydantic_ai/models/bedrock.py @@ -330,6 +330,7 @@ async def request_stream( _model_name=self.model_name, _event_stream=response['stream'], _provider_name=self._provider.name, + _provider_url=self.base_url, _provider_response_id=response.get('ResponseMetadata', {}).get('RequestId', None), ) @@ -381,6 +382,7 @@ async def _process_response(self, response: ConverseResponseTypeDef) -> ModelRes model_name=self.model_name, provider_response_id=response_id, provider_name=self._provider.name, + provider_url=self.base_url, finish_reason=finish_reason, provider_details=provider_details, ) @@ -700,6 +702,7 @@ class BedrockStreamedResponse(StreamedResponse): _model_name: BedrockModelName _event_stream: EventStream[ConverseStreamOutputTypeDef] _provider_name: str + _provider_url: str _timestamp: datetime = field(default_factory=_utils.now_utc) _provider_response_id: str | None = None @@ -787,6 +790,11 @@ def provider_name(self) -> str: """Get the provider name.""" return self._provider_name + @property + def provider_url(self) -> str: + """Get the provider base URL.""" + return self._provider_url + @property def timestamp(self) -> datetime: return self._timestamp diff --git a/pydantic_ai_slim/pydantic_ai/models/cohere.py b/pydantic_ai_slim/pydantic_ai/models/cohere.py index 60ae329065..7d5bfeaa11 100644 --- a/pydantic_ai_slim/pydantic_ai/models/cohere.py +++ b/pydantic_ai_slim/pydantic_ai/models/cohere.py @@ -225,6 +225,7 @@ def _process_response(self, response: V2ChatResponse) -> ModelResponse: usage=_map_usage(response), model_name=self._model_name, provider_name=self._provider.name, + provider_url=self.base_url, finish_reason=finish_reason, provider_details=provider_details, ) diff --git a/pydantic_ai_slim/pydantic_ai/models/function.py b/pydantic_ai_slim/pydantic_ai/models/function.py index 94a635296f..4eb0f0738a 100644 --- a/pydantic_ai_slim/pydantic_ai/models/function.py +++ b/pydantic_ai_slim/pydantic_ai/models/function.py @@ -347,6 +347,11 @@ def provider_name(self) -> None: """Get the provider name.""" return None + @property + def provider_url(self) -> None: + """Get the provider base URL.""" + return None + @property def timestamp(self) -> datetime: """Get the timestamp of the response.""" diff --git a/pydantic_ai_slim/pydantic_ai/models/gemini.py b/pydantic_ai_slim/pydantic_ai/models/gemini.py index 2772e26631..1e71d16257 100644 --- a/pydantic_ai_slim/pydantic_ai/models/gemini.py +++ b/pydantic_ai_slim/pydantic_ai/models/gemini.py @@ -148,8 +148,8 @@ def __init__( @property def base_url(self) -> str: - assert self._url is not None, 'URL not initialized' # pragma: no cover - return self._url # pragma: no cover + assert self._url is not None, 'URL not initialized' + return self._url @property def model_name(self) -> GeminiModelName: @@ -298,6 +298,7 @@ def _process_response(self, response: _GeminiResponse) -> ModelResponse: usage, vendor_id=vendor_id, vendor_details=vendor_details, + provider_url=self.base_url, ) async def _process_streamed_response( @@ -329,6 +330,7 @@ async def _process_streamed_response( _content=content, _stream=aiter_bytes, _provider_name=self._provider.name, + _provider_url=self.base_url, ) async def _message_to_gemini_content( @@ -453,6 +455,7 @@ class GeminiStreamedResponse(StreamedResponse): _content: bytearray _stream: AsyncIterator[bytes] _provider_name: str + _provider_url: str _timestamp: datetime = field(default_factory=_utils.now_utc, init=False) async def _get_event_iterator(self) -> AsyncIterator[ModelResponseStreamEvent]: @@ -527,6 +530,11 @@ def provider_name(self) -> str: """Get the provider name.""" return self._provider_name + @property + def provider_url(self) -> str: + """Get the provider base URL.""" + return self._provider_url + @property def timestamp(self) -> datetime: """Get the timestamp of the response.""" @@ -713,6 +721,7 @@ def _process_response_from_parts( model_name: GeminiModelName, usage: usage.RequestUsage, vendor_id: str | None, + provider_url: str, vendor_details: dict[str, Any] | None = None, ) -> ModelResponse: items: list[ModelResponsePart] = [] @@ -731,7 +740,12 @@ def _process_response_from_parts( f'Unsupported response from Gemini, expected all parts to be function calls or text, got: {part!r}' ) return ModelResponse( - parts=items, usage=usage, model_name=model_name, provider_response_id=vendor_id, provider_details=vendor_details + parts=items, + usage=usage, + model_name=model_name, + provider_response_id=vendor_id, + provider_details=vendor_details, + provider_url=provider_url, ) diff --git a/pydantic_ai_slim/pydantic_ai/models/google.py b/pydantic_ai_slim/pydantic_ai/models/google.py index bf3ba0206d..c6f5459f08 100644 --- a/pydantic_ai_slim/pydantic_ai/models/google.py +++ b/pydantic_ai_slim/pydantic_ai/models/google.py @@ -517,6 +517,7 @@ def _process_response(self, response: GenerateContentResponse) -> ModelResponse: candidate.grounding_metadata, response.model_version or self._model_name, self._provider.name, + self._provider.base_url, usage, vendor_id=vendor_id, vendor_details=vendor_details, @@ -789,6 +790,11 @@ def provider_name(self) -> str: """Get the provider name.""" return self._provider_name + @property + def provider_url(self) -> str: + """Get the provider base URL.""" + return self._provider_url + @property def timestamp(self) -> datetime: """Get the timestamp of the response.""" @@ -867,6 +873,7 @@ def _process_response_from_parts( grounding_metadata: GroundingMetadata | None, model_name: GoogleModelName, provider_name: str, + provider_url: str, usage: usage.RequestUsage, vendor_id: str | None, vendor_details: dict[str, Any] | None = None, @@ -936,6 +943,7 @@ def _process_response_from_parts( provider_response_id=vendor_id, provider_details=vendor_details, provider_name=provider_name, + provider_url=provider_url, finish_reason=finish_reason, ) diff --git a/pydantic_ai_slim/pydantic_ai/models/groq.py b/pydantic_ai_slim/pydantic_ai/models/groq.py index 780ee0b305..d5f70fa451 100644 --- a/pydantic_ai_slim/pydantic_ai/models/groq.py +++ b/pydantic_ai_slim/pydantic_ai/models/groq.py @@ -209,6 +209,7 @@ async def request( model_name=e.model_name, timestamp=_utils.now_utc(), provider_name=self._provider.name, + provider_url=self.base_url, finish_reason='error', ) except ValidationError: @@ -349,6 +350,7 @@ def _process_response(self, response: chat.ChatCompletion) -> ModelResponse: timestamp=timestamp, provider_response_id=response.id, provider_name=self._provider.name, + provider_url=self.base_url, finish_reason=finish_reason, provider_details=provider_details, ) @@ -371,6 +373,7 @@ async def _process_streamed_response( _model_profile=self.profile, _timestamp=number_to_datetime(first_chunk.created), _provider_name=self._provider.name, + _provider_url=self.base_url, ) def _get_tools(self, model_request_parameters: ModelRequestParameters) -> list[chat.ChatCompletionToolParam]: @@ -524,6 +527,7 @@ class GroqStreamedResponse(StreamedResponse): _response: AsyncIterable[chat.ChatCompletionChunk] _timestamp: datetime _provider_name: str + _provider_url: str async def _get_event_iterator(self) -> AsyncIterator[ModelResponseStreamEvent]: # noqa: C901 try: @@ -621,6 +625,11 @@ def provider_name(self) -> str: """Get the provider name.""" return self._provider_name + @property + def provider_url(self) -> str: + """Get the provider base URL.""" + return self._provider_url + @property def timestamp(self) -> datetime: """Get the timestamp of the response.""" diff --git a/pydantic_ai_slim/pydantic_ai/models/huggingface.py b/pydantic_ai_slim/pydantic_ai/models/huggingface.py index f439b3ccb6..ab6652dbb4 100644 --- a/pydantic_ai_slim/pydantic_ai/models/huggingface.py +++ b/pydantic_ai_slim/pydantic_ai/models/huggingface.py @@ -150,6 +150,11 @@ def __init__( super().__init__(settings=settings, profile=profile or provider.model_profile) + @property + def base_url(self) -> str: + """The base URL of the provider.""" + return self._provider.base_url + @property def model_name(self) -> HuggingFaceModelName: """The model name.""" @@ -295,6 +300,7 @@ def _process_response(self, response: ChatCompletionOutput) -> ModelResponse: timestamp=timestamp, provider_response_id=response.id, provider_name=self._provider.name, + provider_url=self.base_url, finish_reason=finish_reason, provider_details=provider_details, ) @@ -317,6 +323,7 @@ async def _process_streamed_response( _response=peekable_response, _timestamp=datetime.fromtimestamp(first_chunk.created, tz=timezone.utc), _provider_name=self._provider.name, + _provider_url=self.base_url, ) def _get_tools(self, model_request_parameters: ModelRequestParameters) -> list[ChatCompletionInputTool]: @@ -465,6 +472,7 @@ class HuggingFaceStreamedResponse(StreamedResponse): _response: AsyncIterable[ChatCompletionStreamOutput] _timestamp: datetime _provider_name: str + _provider_url: str async def _get_event_iterator(self) -> AsyncIterator[ModelResponseStreamEvent]: async for chunk in self._response: @@ -515,6 +523,11 @@ def provider_name(self) -> str: """Get the provider name.""" return self._provider_name + @property + def provider_url(self) -> str: + """Get the provider base URL.""" + return self._provider_url + @property def timestamp(self) -> datetime: """Get the timestamp of the response.""" diff --git a/pydantic_ai_slim/pydantic_ai/models/mistral.py b/pydantic_ai_slim/pydantic_ai/models/mistral.py index 2a3752c370..01fee32a25 100644 --- a/pydantic_ai_slim/pydantic_ai/models/mistral.py +++ b/pydantic_ai_slim/pydantic_ai/models/mistral.py @@ -380,6 +380,7 @@ def _process_response(self, response: MistralChatCompletionResponse) -> ModelRes timestamp=timestamp, provider_response_id=response.id, provider_name=self._provider.name, + provider_url=self._provider.base_url, finish_reason=finish_reason, provider_details=provider_details, ) @@ -408,6 +409,7 @@ async def _process_streamed_response( _model_name=first_chunk.data.model, _timestamp=timestamp, _provider_name=self._provider.name, + _provider_url=self._provider.base_url, ) @staticmethod @@ -615,6 +617,7 @@ class MistralStreamedResponse(StreamedResponse): _response: AsyncIterable[MistralCompletionEvent] _timestamp: datetime _provider_name: str + _provider_url: str _delta_content: str = field(default='', init=False) @@ -676,6 +679,11 @@ def provider_name(self) -> str: """Get the provider name.""" return self._provider_name + @property + def provider_url(self) -> str: + """Get the provider base URL.""" + return self._provider_url + @property def timestamp(self) -> datetime: """Get the timestamp of the response.""" diff --git a/pydantic_ai_slim/pydantic_ai/models/openai.py b/pydantic_ai_slim/pydantic_ai/models/openai.py index 61c8df132b..148879ec74 100644 --- a/pydantic_ai_slim/pydantic_ai/models/openai.py +++ b/pydantic_ai_slim/pydantic_ai/models/openai.py @@ -676,6 +676,7 @@ def _process_response(self, response: chat.ChatCompletion | str) -> ModelRespons provider_details=self._process_provider_details(response), provider_response_id=response.id, provider_name=self._provider.name, + provider_url=self._provider.base_url, finish_reason=self._map_finish_reason(choice.finish_reason), ) @@ -1297,6 +1298,7 @@ def _process_response( # noqa: C901 provider_response_id=response.id, timestamp=timestamp, provider_name=self._provider.name, + provider_url=self._provider.base_url, finish_reason=finish_reason, provider_details=provider_details, ) @@ -2069,6 +2071,11 @@ def provider_name(self) -> str: """Get the provider name.""" return self._provider_name + @property + def provider_url(self) -> str: + """Get the provider base URL.""" + return self._provider_url + @property def timestamp(self) -> datetime: """Get the timestamp of the response.""" @@ -2400,6 +2407,11 @@ def provider_name(self) -> str: """Get the provider name.""" return self._provider_name + @property + def provider_url(self) -> str: + """Get the provider base URL.""" + return self._provider_url + @property def timestamp(self) -> datetime: """Get the timestamp of the response.""" diff --git a/pydantic_ai_slim/pydantic_ai/models/outlines.py b/pydantic_ai_slim/pydantic_ai/models/outlines.py index 4791cbacd5..d8dc6b2241 100644 --- a/pydantic_ai_slim/pydantic_ai/models/outlines.py +++ b/pydantic_ai_slim/pydantic_ai/models/outlines.py @@ -546,6 +546,7 @@ class OutlinesStreamedResponse(StreamedResponse): _response: AsyncIterable[str] _timestamp: datetime _provider_name: str + _provider_url: str | None = None async def _get_event_iterator(self) -> AsyncIterator[ModelResponseStreamEvent]: async for content in self._response: @@ -567,6 +568,11 @@ def provider_name(self) -> str: """Get the provider name.""" return self._provider_name + @property + def provider_url(self) -> str | None: + """Get the provider base URL.""" + return self._provider_url + @property def timestamp(self) -> datetime: """Get the timestamp of the response.""" diff --git a/pydantic_ai_slim/pydantic_ai/models/test.py b/pydantic_ai_slim/pydantic_ai/models/test.py index eddc98787b..8fdd5b4880 100644 --- a/pydantic_ai_slim/pydantic_ai/models/test.py +++ b/pydantic_ai_slim/pydantic_ai/models/test.py @@ -297,6 +297,7 @@ class TestStreamedResponse(StreamedResponse): _structured_response: ModelResponse _messages: InitVar[Iterable[ModelMessage]] _provider_name: str + _provider_url: str | None = None _timestamp: datetime = field(default_factory=_utils.now_utc, init=False) def __post_init__(self, _messages: Iterable[ModelMessage]): @@ -345,6 +346,11 @@ def provider_name(self) -> str: """Get the provider name.""" return self._provider_name + @property + def provider_url(self) -> str | None: + """Get the provider base URL.""" + return self._provider_url + @property def timestamp(self) -> datetime: """Get the timestamp of the response.""" diff --git a/tests/models/test_anthropic.py b/tests/models/test_anthropic.py index 95fb44c502..0e1230a7a5 100644 --- a/tests/models/test_anthropic.py +++ b/tests/models/test_anthropic.py @@ -142,7 +142,7 @@ class MockAnthropic: stream: Sequence[MockRawMessageStreamEvent] | Sequence[Sequence[MockRawMessageStreamEvent]] | None = None index = 0 chat_completion_kwargs: list[dict[str, Any]] = field(default_factory=list) - base_url: str | None = None + base_url: str = 'https://api.anthropic.com' @cached_property def beta(self) -> AsyncBeta: @@ -248,6 +248,7 @@ async def test_sync_request_text_response(allow_model_requests: None): model_name='claude-3-5-haiku-123', timestamp=IsNow(tz=timezone.utc), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='123', finish_reason='stop', @@ -263,6 +264,7 @@ async def test_sync_request_text_response(allow_model_requests: None): model_name='claude-3-5-haiku-123', timestamp=IsNow(tz=timezone.utc), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='123', finish_reason='stop', @@ -1069,6 +1071,7 @@ async def test_request_structured_response(allow_model_requests: None): model_name='claude-3-5-haiku-123', timestamp=IsNow(tz=timezone.utc), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='123', finish_reason='stop', @@ -1139,6 +1142,7 @@ async def get_location(loc_name: str) -> str: model_name='claude-3-5-haiku-123', timestamp=IsNow(tz=timezone.utc), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='123', finish_reason='stop', @@ -1167,6 +1171,7 @@ async def get_location(loc_name: str) -> str: model_name='claude-3-5-haiku-123', timestamp=IsNow(tz=timezone.utc), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='123', finish_reason='stop', @@ -1189,6 +1194,7 @@ async def get_location(loc_name: str) -> str: model_name='claude-3-5-haiku-123', timestamp=IsNow(tz=timezone.utc), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='123', finish_reason='stop', @@ -1464,6 +1470,7 @@ async def my_tool(first: str, second: str) -> int: model_name='claude-3-5-haiku-123', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_123', finish_reason='stop', @@ -1555,6 +1562,7 @@ async def get_image() -> BinaryContent: model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'tool_use'}, provider_response_id='msg_01Kwjzggomz7bv9og51qGFuH', finish_reason='tool_call', @@ -1597,6 +1605,7 @@ async def get_image() -> BinaryContent: model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_015btMBYLTuDnMP7zAeuHQGi', finish_reason='stop', @@ -1753,6 +1762,7 @@ def simple_instructions(): model_name='claude-3-opus-20240229', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01Fg1JVgvCYUHWsxrj9GkpEv', finish_reason='stop', @@ -1808,6 +1818,7 @@ async def test_anthropic_model_thinking_part(allow_model_requests: None, anthrop model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01BnZvs3naGorn93wjjCDwbd', finish_reason='stop', @@ -1865,6 +1876,7 @@ async def test_anthropic_model_thinking_part(allow_model_requests: None, anthrop model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id=IsStr(), finish_reason='stop', @@ -1916,6 +1928,7 @@ async def test_anthropic_model_thinking_part_redacted(allow_model_requests: None model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01TbZ1ZKNMPq28AgBLyLX3c4', finish_reason='stop', @@ -1962,6 +1975,7 @@ async def test_anthropic_model_thinking_part_redacted(allow_model_requests: None model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_012oSSVsQdwoGH6b2fryM4fF', finish_reason='stop', @@ -2027,6 +2041,7 @@ async def test_anthropic_model_thinking_part_redacted_stream(allow_model_request model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_018XZkwvj9asBiffg3fXt88s', finish_reason='stop', @@ -2175,6 +2190,7 @@ async def test_anthropic_model_thinking_part_from_other_model( model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c1fda6f11081a1b9fa80ae9122743506da9901a3d98ab7', finish_reason='stop', @@ -2225,6 +2241,7 @@ async def test_anthropic_model_thinking_part_from_other_model( model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_016e2w8nkCuArd5HFSfEwke7', finish_reason='stop', @@ -2281,6 +2298,7 @@ async def test_anthropic_model_thinking_part_stream(allow_model_requests: None, model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01PiJ6i3vjEZjHxojahi2YNc', finish_reason='stop', @@ -2856,6 +2874,7 @@ async def test_anthropic_web_search_tool(allow_model_requests: None, anthropic_a model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_0119wM5YxCLg3hwUWrxEQ9Y8', finish_reason='stop', @@ -3055,6 +3074,7 @@ async def test_anthropic_web_search_tool(allow_model_requests: None, anthropic_a model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01Vatv9GeGaeqVHfSGhkU7mo', finish_reason='stop', @@ -3338,6 +3358,7 @@ async def test_anthropic_model_web_search_tool_stream(allow_model_requests: None model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01QmxBSdEbD9ZeBWDVgFDoQ5', finish_reason='stop', @@ -4191,6 +4212,7 @@ async def test_anthropic_web_fetch_tool(allow_model_requests: None, anthropic_ap model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id=IsStr(), finish_reason='stop', @@ -4272,6 +4294,7 @@ async def test_anthropic_web_fetch_tool(allow_model_requests: None, anthropic_ap model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id=IsStr(), finish_reason='stop', @@ -4332,6 +4355,7 @@ async def test_anthropic_web_fetch_tool(allow_model_requests: None, anthropic_ap model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id=IsStr(), finish_reason='stop', @@ -4433,6 +4457,7 @@ async def test_anthropic_web_fetch_tool_stream( model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id=IsStr(), finish_reason='stop', @@ -5059,6 +5084,7 @@ async def test_anthropic_mcp_servers(allow_model_requests: None, anthropic_api_k model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01MYDjkvBDRaKsY6PDwQz3n6', finish_reason='stop', @@ -5196,6 +5222,7 @@ async def test_anthropic_mcp_servers(allow_model_requests: None, anthropic_api_k model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01DSGib8F7nNoYprfYSGp1sd', finish_reason='stop', @@ -5305,6 +5332,7 @@ async def test_anthropic_mcp_servers_stream(allow_model_requests: None, anthropi model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01Xf6SmUVY1mDrSwFc5RsY3n', finish_reason='stop', @@ -5556,6 +5584,7 @@ async def test_anthropic_code_execution_tool(allow_model_requests: None, anthrop model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn', 'container_id': 'container_011CTCwceSoRxi8Pf16Fb7Tn'}, provider_response_id='msg_018bVTPr9khzuds31rFDuqW4', finish_reason='stop', @@ -5623,6 +5652,7 @@ async def test_anthropic_code_execution_tool(allow_model_requests: None, anthrop model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn', 'container_id': 'container_011CTCwdXe48NC7LaX3rxQ4d'}, provider_response_id='msg_01VngRFBcNddwrYQoKUmdePY', finish_reason='stop', @@ -5732,6 +5762,7 @@ async def test_anthropic_code_execution_tool_stream(allow_model_requests: None, model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01TaPV5KLA8MsCPDuJNKPLF4', finish_reason='stop', @@ -6252,6 +6283,7 @@ async def test_anthropic_server_tool_pass_history_to_another_provider( model_name='gpt-4.1-2025-04-14', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0dcd74f01910b54500691e5594957481a0ac36dde76eca939f', finish_reason='stop', @@ -6372,6 +6404,7 @@ async def get_user_country() -> str: model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'tool_use'}, provider_response_id='msg_012TXW181edhmR5JCsQRsBKx', finish_reason='tool_call', @@ -6409,6 +6442,7 @@ async def get_user_country() -> str: model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'tool_use'}, provider_response_id='msg_01K4Fzcf1bhiyLzHpwLdrefj', finish_reason='tool_call', @@ -6479,6 +6513,7 @@ async def get_user_country() -> str: model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'tool_use'}, provider_response_id='msg_01MsqUB7ZyhjGkvepS1tCXp3', finish_reason='tool_call', @@ -6514,6 +6549,7 @@ async def get_user_country() -> str: model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_0142umg4diSckrDtV9vAmmPL', finish_reason='stop', @@ -6570,6 +6606,7 @@ async def get_user_country() -> str: model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'tool_use'}, provider_response_id='msg_018YiNXULHGpoKoHkTt6GivG', finish_reason='tool_call', @@ -6601,6 +6638,7 @@ async def get_user_country() -> str: model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01WiRVmLhCrJbJZRqmAWKv3X', finish_reason='stop', @@ -6656,6 +6694,7 @@ class CountryLanguage(BaseModel): model_name='claude-sonnet-4-5-20250929', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_01N2PwwVQo2aBtt6UFhMDtEX', finish_reason='stop', diff --git a/tests/models/test_bedrock.py b/tests/models/test_bedrock.py index ceb0e76680..c26f9bfddd 100644 --- a/tests/models/test_bedrock.py +++ b/tests/models/test_bedrock.py @@ -142,6 +142,7 @@ async def test_bedrock_model(allow_model_requests: None, bedrock_provider: Bedro model_name='us.amazon.nova-micro-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), @@ -321,6 +322,7 @@ async def temperature(city: str, date: datetime.date) -> str: model_name='us.amazon.nova-micro-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'tool_use'}, finish_reason='tool_call', run_id=IsStr(), @@ -351,6 +353,7 @@ async def temperature(city: str, date: datetime.date) -> str: model_name='us.amazon.nova-micro-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'tool_use'}, finish_reason='tool_call', run_id=IsStr(), @@ -457,6 +460,7 @@ async def get_capital(country: str) -> str: model_name='us.amazon.nova-micro-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'tool_use'}, finish_reason='tool_call', run_id=IsStr(), @@ -486,6 +490,7 @@ async def get_capital(country: str) -> str: model_name='us.amazon.nova-micro-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), @@ -776,6 +781,7 @@ def instructions() -> str: model_name='us.amazon.nova-pro-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), @@ -833,6 +839,7 @@ async def test_bedrock_model_thinking_part_deepseek(allow_model_requests: None, model_name='us.deepseek.r1-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), @@ -861,6 +868,7 @@ async def test_bedrock_model_thinking_part_deepseek(allow_model_requests: None, model_name='us.deepseek.r1-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), @@ -901,6 +909,7 @@ async def test_bedrock_model_thinking_part_anthropic(allow_model_requests: None, model_name='us.anthropic.claude-sonnet-4-20250514-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), @@ -936,6 +945,7 @@ async def test_bedrock_model_thinking_part_anthropic(allow_model_requests: None, model_name='us.anthropic.claude-sonnet-4-20250514-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), @@ -984,6 +994,7 @@ async def test_bedrock_model_thinking_part_redacted(allow_model_requests: None, model_name='us.anthropic.claude-3-7-sonnet-20250219-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), @@ -1020,6 +1031,7 @@ async def test_bedrock_model_thinking_part_redacted(allow_model_requests: None, model_name='us.anthropic.claude-3-7-sonnet-20250219-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), @@ -1084,6 +1096,7 @@ async def test_bedrock_model_thinking_part_redacted_stream( model_name='us.anthropic.claude-3-7-sonnet-20250219-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), @@ -1228,6 +1241,7 @@ async def test_bedrock_model_thinking_part_from_other_model( model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c1ffe0f9a48191894c46b63c1a4f440003919771fccd27', finish_reason='stop', @@ -1271,6 +1285,7 @@ async def test_bedrock_model_thinking_part_from_other_model( model_name='us.anthropic.claude-sonnet-4-20250514-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), @@ -1424,6 +1439,7 @@ async def test_bedrock_model_thinking_part_stream(allow_model_requests: None, be model_name='us.anthropic.claude-sonnet-4-20250514-v1:0', timestamp=IsDatetime(), provider_name='bedrock', + provider_url='https://bedrock-runtime.us-east-1.amazonaws.com', provider_details={'finish_reason': 'end_turn'}, finish_reason='stop', run_id=IsStr(), diff --git a/tests/models/test_cohere.py b/tests/models/test_cohere.py index 07cb6ae9b9..a1b7785801 100644 --- a/tests/models/test_cohere.py +++ b/tests/models/test_cohere.py @@ -62,10 +62,20 @@ def test_init(): assert m.base_url == 'https://api.cohere.com' +@dataclass +class MockClientWrapper: + def get_base_url(self) -> str: + return 'https://api.cohere.com' + + @dataclass class MockAsyncClientV2: completions: MockChatResponse | Sequence[MockChatResponse] | None = None index = 0 + _client_wrapper: MockClientWrapper = None # type: ignore + + def __post_init__(self): + self._client_wrapper = MockClientWrapper() @classmethod def create_mock(cls, completions: MockChatResponse | Sequence[MockChatResponse]) -> AsyncClientV2: @@ -125,6 +135,7 @@ async def test_request_simple_success(allow_model_requests: None): model_name='command-r7b-12-2024', timestamp=IsNow(tz=timezone.utc), provider_name='cohere', + provider_url='https://api.cohere.com', provider_details={'finish_reason': 'COMPLETE'}, finish_reason='stop', run_id=IsStr(), @@ -138,6 +149,7 @@ async def test_request_simple_success(allow_model_requests: None): model_name='command-r7b-12-2024', timestamp=IsNow(tz=timezone.utc), provider_name='cohere', + provider_url='https://api.cohere.com', provider_details={'finish_reason': 'COMPLETE'}, finish_reason='stop', run_id=IsStr(), @@ -213,6 +225,7 @@ async def test_request_structured_response(allow_model_requests: None): model_name='command-r7b-12-2024', timestamp=IsNow(tz=timezone.utc), provider_name='cohere', + provider_url='https://api.cohere.com', provider_details={'finish_reason': 'COMPLETE'}, finish_reason='stop', run_id=IsStr(), @@ -305,6 +318,7 @@ async def get_location(loc_name: str) -> str: model_name='command-r7b-12-2024', timestamp=IsNow(tz=timezone.utc), provider_name='cohere', + provider_url='https://api.cohere.com', provider_details={'finish_reason': 'COMPLETE'}, finish_reason='stop', run_id=IsStr(), @@ -332,6 +346,7 @@ async def get_location(loc_name: str) -> str: model_name='command-r7b-12-2024', timestamp=IsNow(tz=timezone.utc), provider_name='cohere', + provider_url='https://api.cohere.com', provider_details={'finish_reason': 'COMPLETE'}, finish_reason='stop', run_id=IsStr(), @@ -352,6 +367,7 @@ async def get_location(loc_name: str) -> str: model_name='command-r7b-12-2024', timestamp=IsNow(tz=timezone.utc), provider_name='cohere', + provider_url='https://api.cohere.com', provider_details={'finish_reason': 'COMPLETE'}, finish_reason='stop', run_id=IsStr(), @@ -451,6 +467,7 @@ def simple_instructions(ctx: RunContext): model_name='command-r7b-12-2024', timestamp=IsDatetime(), provider_name='cohere', + provider_url='https://api.cohere.com', provider_details={'finish_reason': 'COMPLETE'}, finish_reason='stop', run_id=IsStr(), @@ -497,6 +514,7 @@ async def test_cohere_model_thinking_part(allow_model_requests: None, co_api_key model_name='o3-mini-2025-01-31', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68bb5f153efc81a2b3958ddb1f257ff30886f4f20524f3b9', finish_reason='stop', @@ -532,6 +550,7 @@ async def test_cohere_model_thinking_part(allow_model_requests: None, co_api_key model_name='command-a-reasoning-08-2025', timestamp=IsDatetime(), provider_name='cohere', + provider_url='https://api.cohere.com', provider_details={'finish_reason': 'COMPLETE'}, finish_reason='stop', run_id=IsStr(), diff --git a/tests/models/test_deepseek.py b/tests/models/test_deepseek.py index a8c0d8ceaa..0ecdbbb0bb 100644 --- a/tests/models/test_deepseek.py +++ b/tests/models/test_deepseek.py @@ -55,6 +55,7 @@ async def test_deepseek_model_thinking_part(allow_model_requests: None, deepseek model_name='deepseek-reasoner', timestamp=IsDatetime(), provider_name='deepseek', + provider_url='https://api.deepseek.com', provider_details={'finish_reason': 'stop'}, provider_response_id='181d9669-2b3a-445e-bd13-2ebff2c378f6', finish_reason='stop', @@ -102,6 +103,7 @@ async def test_deepseek_model_thinking_stream(allow_model_requests: None, deepse model_name='deepseek-reasoner', timestamp=IsDatetime(), provider_name='deepseek', + provider_url='https://api.deepseek.com', provider_details={'finish_reason': 'stop'}, provider_response_id='33be18fc-3842-486c-8c29-dd8e578f7f20', finish_reason='stop', diff --git a/tests/models/test_gemini.py b/tests/models/test_gemini.py index 0f2e51c0ce..ee1aa83b15 100644 --- a/tests/models/test_gemini.py +++ b/tests/models/test_gemini.py @@ -568,6 +568,7 @@ async def test_text_success(get_gemini_client: GetGeminiClient): usage=RequestUsage(input_tokens=1, output_tokens=2), model_name='gemini-1.5-flash-123', timestamp=IsNow(tz=timezone.utc), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, run_id=IsStr(), ), @@ -588,6 +589,7 @@ async def test_text_success(get_gemini_client: GetGeminiClient): usage=RequestUsage(input_tokens=1, output_tokens=2), model_name='gemini-1.5-flash-123', timestamp=IsNow(tz=timezone.utc), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, run_id=IsStr(), ), @@ -600,6 +602,7 @@ async def test_text_success(get_gemini_client: GetGeminiClient): usage=RequestUsage(input_tokens=1, output_tokens=2), model_name='gemini-1.5-flash-123', timestamp=IsNow(tz=timezone.utc), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, run_id=IsStr(), ), @@ -628,6 +631,7 @@ async def test_request_structured_response(get_gemini_client: GetGeminiClient): usage=RequestUsage(input_tokens=1, output_tokens=2), model_name='gemini-1.5-flash-123', timestamp=IsNow(tz=timezone.utc), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, run_id=IsStr(), ), @@ -694,6 +698,7 @@ async def get_location(loc_name: str) -> str: usage=RequestUsage(input_tokens=1, output_tokens=2), model_name='gemini-1.5-flash-123', timestamp=IsNow(tz=timezone.utc), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, run_id=IsStr(), ), @@ -716,6 +721,7 @@ async def get_location(loc_name: str) -> str: usage=RequestUsage(input_tokens=1, output_tokens=2), model_name='gemini-1.5-flash-123', timestamp=IsNow(tz=timezone.utc), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, run_id=IsStr(), ), @@ -741,6 +747,7 @@ async def get_location(loc_name: str) -> str: usage=RequestUsage(input_tokens=1, output_tokens=2), model_name='gemini-1.5-flash-123', timestamp=IsNow(tz=timezone.utc), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, run_id=IsStr(), ), @@ -903,6 +910,7 @@ async def bar(y: str) -> str: model_name='gemini-1.5-flash', timestamp=IsNow(tz=timezone.utc), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', run_id=IsStr(), ), ModelRequest( @@ -922,6 +930,7 @@ async def bar(y: str) -> str: model_name='gemini-1.5-flash', timestamp=IsNow(tz=timezone.utc), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', run_id=IsStr(), ), ModelRequest( @@ -994,6 +1003,7 @@ def get_location(loc_name: str) -> str: model_name='gemini-1.5-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', run_id=IsStr(), ), ModelRequest( @@ -1200,6 +1210,7 @@ async def get_image() -> BinaryContent: ), model_name='gemini-3-pro-preview', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -1261,6 +1272,7 @@ async def get_image() -> BinaryContent: ), model_name='gemini-3-pro-preview', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -1389,6 +1401,7 @@ async def test_gemini_model_instructions(allow_model_requests: None, gemini_api_ ), model_name='gemini-1.5-flash', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, run_id=IsStr(), ), @@ -1497,6 +1510,7 @@ async def test_gemini_model_thinking_part(allow_model_requests: None, gemini_api model_name='o3-mini-2025-01-31', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_680393ff82488191a7d0850bf0dd99a004f0817ea037a07b', finish_reason='stop', @@ -1530,6 +1544,7 @@ async def test_gemini_model_thinking_part(allow_model_requests: None, gemini_api model_name='o3-mini-2025-01-31', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_680393ff82488191a7d0850bf0dd99a004f0817ea037a07b', finish_reason='stop', @@ -1590,6 +1605,7 @@ async def test_gemini_model_thinking_part(allow_model_requests: None, gemini_api ), model_name='gemini-2.5-flash-preview-04-17', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, run_id=IsStr(), ), @@ -1634,6 +1650,7 @@ async def test_gemini_youtube_video_url_input(allow_model_requests: None, gemini ), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, run_id=IsStr(), ), @@ -1707,6 +1724,7 @@ async def bar() -> str: ), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -1735,6 +1753,7 @@ async def bar() -> str: ), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -1789,6 +1808,7 @@ async def get_user_country() -> str: ), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -1817,6 +1837,7 @@ async def get_user_country() -> str: ), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -1878,6 +1899,7 @@ def upcase(text: str) -> str: ), model_name='models/gemini-2.5-pro-preview-05-06', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id='TT9IaNfGN_DmqtsPzKnE4AE', run_id=IsStr(), @@ -1951,6 +1973,7 @@ class CityLocation(BaseModel): ), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -2008,6 +2031,7 @@ class CountryLanguage(BaseModel): ), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -2051,6 +2075,7 @@ class CityLocation(BaseModel): ), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -2096,6 +2121,7 @@ async def get_user_country() -> str: ), model_name='models/gemini-2.5-pro-preview-05-06', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -2118,6 +2144,7 @@ async def get_user_country() -> str: ), model_name='models/gemini-2.5-pro-preview-05-06', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -2167,6 +2194,7 @@ class CountryLanguage(BaseModel): ), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_url='https://generativelanguage.googleapis.com/v1beta/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), diff --git a/tests/models/test_gemini_vertex.py b/tests/models/test_gemini_vertex.py index 20e2e5e0dc..a361f51033 100644 --- a/tests/models/test_gemini_vertex.py +++ b/tests/models/test_gemini_vertex.py @@ -148,6 +148,7 @@ async def test_url_input( usage=IsInstance(RequestUsage), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_url='https://us-central1-aiplatform.googleapis.com/v1/projects/pydantic-ai/locations/us-central1/publishers/google/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), @@ -187,6 +188,7 @@ async def test_url_input_force_download(allow_model_requests: None) -> None: # usage=IsInstance(RequestUsage), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_url='https://us-central1-aiplatform.googleapis.com/v1/projects/pydantic-ai/locations/us-central1/publishers/google/models/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), run_id=IsStr(), diff --git a/tests/models/test_google.py b/tests/models/test_google.py index bdb3f0a864..be6d4bd68a 100644 --- a/tests/models/test_google.py +++ b/tests/models/test_google.py @@ -147,6 +147,7 @@ async def test_google_model(allow_model_requests: None, google_provider: GoogleP model_name='gemini-1.5-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -218,6 +219,7 @@ async def temperature(city: str, date: datetime.date) -> str: model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -247,6 +249,7 @@ async def temperature(city: str, date: datetime.date) -> str: model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -285,6 +288,7 @@ async def test_google_model_stream(allow_model_requests: None, google_provider: model_name='gemini-2.0-flash-exp', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='w1peaMz6INOvnvgPgYfPiQY', finish_reason='stop', @@ -386,6 +390,7 @@ async def test_google_model_builtin_code_execution_stream( model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='1NjJaIDxJcL7qtsP5aPfqQs', finish_reason='stop', @@ -584,6 +589,7 @@ async def get_capital(country: str) -> str: model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -615,6 +621,7 @@ async def get_capital(country: str) -> str: model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -644,6 +651,7 @@ async def get_capital(country: str) -> str: model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -945,6 +953,7 @@ def instructions() -> str: model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -1067,6 +1076,7 @@ async def test_google_model_web_search_tool(allow_model_requests: None, google_p model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='btnJaOrqE4_6qtsP7bOboQs', finish_reason='stop', @@ -1144,6 +1154,7 @@ async def test_google_model_web_search_tool(allow_model_requests: None, google_p model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='dtnJaKyTAri3qtsPu4imqQs', finish_reason='stop', @@ -1211,6 +1222,7 @@ async def test_google_model_web_search_tool_stream(allow_model_requests: None, g model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='ftnJaMmAMcm-qtsPwvCCoAo', finish_reason='stop', @@ -1388,6 +1400,7 @@ async def test_google_model_web_search_tool_stream(allow_model_requests: None, g model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='itnJaJK1BsGxqtsPrIeb6Ao', finish_reason='stop', @@ -1469,6 +1482,7 @@ async def test_google_model_web_fetch_tool( model_name='gemini-2.5-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='qgqkaI-iDLrTjMcP0bP24A4', finish_reason='stop', @@ -1546,6 +1560,7 @@ async def test_google_model_web_fetch_tool_stream(allow_model_requests: None, go model_name='gemini-2.5-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -1689,6 +1704,7 @@ async def test_google_model_code_execution_tool(allow_model_requests: None, goog model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -1745,6 +1761,7 @@ async def test_google_model_code_execution_tool(allow_model_requests: None, goog model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -1946,6 +1963,7 @@ def dummy() -> None: ... # pragma: no cover model_name='gemini-3-pro-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -1983,6 +2001,7 @@ def dummy() -> None: ... # pragma: no cover model_name='gemini-3-pro-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='UN4gafq5OY-kmtkPwqS6kAs', finish_reason='stop', @@ -2050,6 +2069,7 @@ def dummy() -> None: ... # pragma: no cover model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c1fb6b6a248196a6216e80fc2ace380c14a8a9087e8689', finish_reason='stop', @@ -2092,6 +2112,7 @@ def dummy() -> None: ... # pragma: no cover model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2148,6 +2169,7 @@ def dummy() -> None: ... # pragma: no cover model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='beHBaJfEMIi-qtsP3769-Q8', finish_reason='stop', @@ -2339,6 +2361,7 @@ async def test_google_url_input( model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-vertex', + provider_url='https://aiplatform.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2380,9 +2403,10 @@ async def test_google_url_input_force_download( usage=IsInstance(RequestUsage), model_name='gemini-2.0-flash', timestamp=IsDatetime(), + provider_name='google-vertex', + provider_url='https://aiplatform.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), - provider_name='google-vertex', finish_reason='stop', run_id=IsStr(), ), @@ -2433,6 +2457,7 @@ async def bar() -> str: model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2463,6 +2488,7 @@ async def bar() -> str: model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2529,6 +2555,7 @@ async def get_user_country() -> str: model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2559,6 +2586,7 @@ async def get_user_country() -> str: model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2615,6 +2643,7 @@ async def get_user_country() -> str: model_name='models/gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2639,6 +2668,7 @@ async def get_user_country() -> str: model_name='models/gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2712,6 +2742,7 @@ class CityLocation(BaseModel): model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2770,6 +2801,7 @@ class CountryLanguage(BaseModel): model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2810,6 +2842,7 @@ class CityLocation(BaseModel): model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2856,6 +2889,7 @@ async def get_user_country() -> str: model_name='models/gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2880,6 +2914,7 @@ async def get_user_country() -> str: model_name='models/gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -2930,6 +2965,7 @@ class CountryLanguage(BaseModel): model_name='gemini-2.0-flash', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -3140,6 +3176,7 @@ async def test_google_image_generation(allow_model_requests: None, google_provid model_name='gemini-3-pro-image-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -3185,6 +3222,7 @@ async def test_google_image_generation(allow_model_requests: None, google_provid model_name='gemini-3-pro-image-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -3256,6 +3294,7 @@ async def test_google_image_generation_stream(allow_model_requests: None, google model_name='gemini-2.5-flash-image', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -3335,6 +3374,7 @@ async def test_google_image_generation_with_text(allow_model_requests: None, goo model_name='gemini-3-pro-image-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -3443,6 +3483,7 @@ class Animal(BaseModel): model_name='gemini-3-pro-image-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='D2Eoab-bKZvpz7IPx__4kA8', finish_reason='stop', @@ -3478,6 +3519,7 @@ class Animal(BaseModel): model_name='gemini-3-pro-image-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='FWEoacC5OqGEz7IPgMjBwAc', finish_reason='stop', @@ -3580,6 +3622,7 @@ async def test_google_image_generation_with_web_search(allow_model_requests: Non model_name='gemini-3-pro-image-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='cmIoaZ6pJYXRz7IPs4ia-Ag', finish_reason='stop', @@ -4125,6 +4168,7 @@ def get_country() -> str: model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id=IsStr(), finish_reason='stop', @@ -4158,6 +4202,7 @@ def get_country() -> str: model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id=IsStr(), finish_reason='stop', @@ -4187,6 +4232,7 @@ def get_country() -> str: model_name='gemini-3-pro-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -4293,6 +4339,7 @@ async def test_google_model_retrying_after_empty_response(allow_model_requests: model_name='gemini-3-pro-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -4484,6 +4531,7 @@ def get_country() -> str: model_name='gemini-3-pro-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -4506,6 +4554,7 @@ def get_country() -> str: model_name='gemini-3-pro-preview', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', diff --git a/tests/models/test_groq.py b/tests/models/test_groq.py index dd3395750e..0f10b4b7e4 100644 --- a/tests/models/test_groq.py +++ b/tests/models/test_groq.py @@ -97,6 +97,7 @@ class MockGroq: completions: MockChatCompletion | Sequence[MockChatCompletion] | None = None stream: Sequence[MockChatCompletionChunk] | Sequence[Sequence[MockChatCompletionChunk]] | None = None index: int = 0 + base_url: str = 'https://api.groq.com' @cached_property def chat(self) -> Any: @@ -175,6 +176,7 @@ async def test_request_simple_success(allow_model_requests: None): model_name='llama-3.3-70b-versatile-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -189,6 +191,7 @@ async def test_request_simple_success(allow_model_requests: None): model_name='llama-3.3-70b-versatile-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -248,6 +251,7 @@ async def test_request_structured_response(allow_model_requests: None): model_name='llama-3.3-70b-versatile-123', timestamp=datetime(2024, 1, 1, tzinfo=timezone.utc), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -342,6 +346,7 @@ async def get_location(loc_name: str) -> str: model_name='llama-3.3-70b-versatile-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -370,6 +375,7 @@ async def get_location(loc_name: str) -> str: model_name='llama-3.3-70b-versatile-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -391,6 +397,7 @@ async def get_location(loc_name: str) -> str: model_name='llama-3.3-70b-versatile-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -511,6 +518,7 @@ async def test_stream_structured(allow_model_requests: None): model_name='llama-3.3-70b-versatile', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='groq', + provider_url='https://api.groq.com', provider_response_id='x', run_id=IsStr(), ), @@ -615,6 +623,7 @@ async def get_image() -> BinaryContent: model_name='meta-llama/llama-4-scout-17b-16e-instruct', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-3c327c89-e9f5-4aac-a5d5-190e6f6f25c9', finish_reason='tool_call', @@ -644,6 +653,7 @@ async def get_image() -> BinaryContent: model_name='meta-llama/llama-4-scout-17b-16e-instruct', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-82dfad42-6a28-4089-82c3-c8633f626c0d', finish_reason='stop', @@ -742,6 +752,7 @@ async def test_groq_model_instructions(allow_model_requests: None, groq_api_key: model_name='llama-3.3-70b-versatile', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-7586b6a9-fb4b-4ec7-86a0-59f0a77844cf', finish_reason='stop', @@ -1010,6 +1021,7 @@ async def test_groq_model_web_search_tool(allow_model_requests: None, groq_api_k model_name='groq/compound', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='stub', finish_reason='stop', @@ -1177,6 +1189,7 @@ async def test_groq_model_web_search_tool_stream(allow_model_requests: None, gro model_name='groq/compound', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='stub', finish_reason='stop', @@ -1942,6 +1955,7 @@ async def test_groq_model_thinking_part(allow_model_requests: None, groq_api_key model_name='deepseek-r1-distill-llama-70b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id=IsStr(), finish_reason='stop', @@ -1968,6 +1982,7 @@ async def test_groq_model_thinking_part(allow_model_requests: None, groq_api_key model_name='deepseek-r1-distill-llama-70b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-9748c1af-1065-410a-969a-d7fb48039fbb', finish_reason='stop', @@ -1989,6 +2004,7 @@ async def test_groq_model_thinking_part(allow_model_requests: None, groq_api_key model_name='deepseek-r1-distill-llama-70b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-994aa228-883a-498c-8b20-9655d770b697', finish_reason='stop', @@ -2109,6 +2125,7 @@ async def test_groq_model_thinking_part_iter(allow_model_requests: None, groq_ap model_name='deepseek-r1-distill-llama-70b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-4ef92b12-fb9d-486f-8b98-af9b5ecac736', finish_reason='stop', @@ -3471,6 +3488,7 @@ async def test_groq_model_thinking_part_iter(allow_model_requests: None, groq_ap model_name='deepseek-r1-distill-llama-70b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-dd0af56b-f71d-4101-be2f-89efcf3f05ac', finish_reason='stop', @@ -5326,6 +5344,7 @@ async def get_something_by_name(name: str) -> str: model_name='openai/gpt-oss-120b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', finish_reason='error', run_id=IsStr(), ), @@ -5369,6 +5388,7 @@ async def get_something_by_name(name: str) -> str: model_name='openai/gpt-oss-120b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'tool_calls'}, provider_response_id=IsStr(), finish_reason='tool_call', @@ -5397,6 +5417,7 @@ async def get_something_by_name(name: str) -> str: model_name='openai/gpt-oss-120b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id=IsStr(), finish_reason='stop', @@ -5454,6 +5475,7 @@ async def get_something_by_name(name: str) -> str: model_name='openai/gpt-oss-120b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_response_id='chatcmpl-4e0ca299-7515-490a-a98a-16d7664d4fba', run_id=IsStr(), ), @@ -5495,6 +5517,7 @@ async def get_something_by_name(name: str) -> str: model_name='openai/gpt-oss-120b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-fffa1d41-1763-493a-9ced-083bd3f2d98b', finish_reason='tool_call', @@ -5518,6 +5541,7 @@ async def get_something_by_name(name: str) -> str: model_name='openai/gpt-oss-120b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-fe6b5685-166f-4c71-9cd7-3d5a97301bf1', finish_reason='stop', @@ -5573,6 +5597,7 @@ class CityLocation(BaseModel): model_name='openai/gpt-oss-120b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id=IsStr(), finish_reason='stop', @@ -5616,6 +5641,7 @@ class CityLocation(BaseModel): model_name='openai/gpt-oss-120b', timestamp=IsDatetime(), provider_name='groq', + provider_url='https://api.groq.com', provider_details={'finish_reason': 'stop'}, provider_response_id=IsStr(), finish_reason='stop', diff --git a/tests/models/test_huggingface.py b/tests/models/test_huggingface.py index 56d74ed619..ed99de4e56 100644 --- a/tests/models/test_huggingface.py +++ b/tests/models/test_huggingface.py @@ -80,6 +80,7 @@ class MockHuggingFace: stream: Sequence[MockStreamEvent] | Sequence[Sequence[MockStreamEvent]] | None = None index: int = 0 chat_completion_kwargs: list[dict[str, Any]] = field(default_factory=list) + model: str = 'https://api-inference.huggingface.co' @cached_property def chat(self) -> Any: @@ -239,6 +240,7 @@ async def test_request_structured_response( model_name='hf-model', timestamp=datetime(2024, 1, 1, tzinfo=timezone.utc), provider_name='huggingface', + provider_url='https://api-inference.huggingface.co', provider_details={'finish_reason': 'stop'}, provider_response_id='123', run_id=IsStr(), @@ -375,6 +377,7 @@ async def get_location(loc_name: str) -> str: model_name='hf-model', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='huggingface', + provider_url='https://api-inference.huggingface.co', provider_details={'finish_reason': 'stop'}, provider_response_id='123', run_id=IsStr(), @@ -402,6 +405,7 @@ async def get_location(loc_name: str) -> str: model_name='hf-model', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='huggingface', + provider_url='https://api-inference.huggingface.co', provider_details={'finish_reason': 'stop'}, provider_response_id='123', run_id=IsStr(), @@ -422,6 +426,7 @@ async def get_location(loc_name: str) -> str: model_name='hf-model', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='huggingface', + provider_url='https://api-inference.huggingface.co', provider_details={'finish_reason': 'stop'}, provider_response_id='123', run_id=IsStr(), @@ -814,6 +819,7 @@ def response_validator(value: str) -> str: model_name='hf-model', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='huggingface', + provider_url='https://api-inference.huggingface.co', provider_details={'finish_reason': 'stop'}, provider_response_id='123', run_id=IsStr(), @@ -834,6 +840,7 @@ def response_validator(value: str) -> str: model_name='hf-model', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='huggingface', + provider_url='https://api-inference.huggingface.co', provider_details={'finish_reason': 'stop'}, provider_response_id='123', run_id=IsStr(), diff --git a/tests/models/test_instrumented.py b/tests/models/test_instrumented.py index 651a5b6a41..62dc4a48b6 100644 --- a/tests/models/test_instrumented.py +++ b/tests/models/test_instrumented.py @@ -131,6 +131,10 @@ def model_name(self) -> str: def provider_name(self) -> str: return 'openai' + @property + def provider_url(self) -> str: + return 'https://api.openai.com' + @property def timestamp(self) -> datetime: return datetime(2022, 1, 1) diff --git a/tests/models/test_mistral.py b/tests/models/test_mistral.py index 32a56c6395..424be8d39b 100644 --- a/tests/models/test_mistral.py +++ b/tests/models/test_mistral.py @@ -69,12 +69,22 @@ ] +@dataclass +class MockSdkConfiguration: + def get_server_details(self) -> tuple[str, ...]: + return ('https://api.mistral.ai',) + + @dataclass class MockMistralAI: completions: MockChatCompletion | Sequence[MockChatCompletion] | None = None stream: Sequence[MockCompletionEvent] | Sequence[Sequence[MockCompletionEvent]] | None = None index: int = 0 + @cached_property + def sdk_configuration(self) -> MockSdkConfiguration: + return MockSdkConfiguration() + @cached_property def chat(self) -> Any: if self.stream: @@ -223,6 +233,7 @@ async def test_multiple_completions(allow_model_requests: None): model_name='mistral-large-123', timestamp=IsNow(tz=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -238,6 +249,7 @@ async def test_multiple_completions(allow_model_requests: None): model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -287,6 +299,7 @@ async def test_three_completions(allow_model_requests: None): model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -302,6 +315,7 @@ async def test_three_completions(allow_model_requests: None): model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -317,6 +331,7 @@ async def test_three_completions(allow_model_requests: None): model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -440,6 +455,7 @@ class CityLocation(BaseModel): model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -508,6 +524,7 @@ class CityLocation(BaseModel): model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -573,6 +590,7 @@ async def test_request_output_type_with_arguments_str_response(allow_model_reque model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -1128,6 +1146,7 @@ async def get_location(loc_name: str) -> str: model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -1156,6 +1175,7 @@ async def get_location(loc_name: str) -> str: model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -1178,6 +1198,7 @@ async def get_location(loc_name: str) -> str: model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -1285,6 +1306,7 @@ async def get_location(loc_name: str) -> str: model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -1313,6 +1335,7 @@ async def get_location(loc_name: str) -> str: model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -1341,6 +1364,7 @@ async def get_location(loc_name: str) -> str: model_name='mistral-large-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -1446,6 +1470,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='x', finish_reason='tool_call', @@ -1468,6 +1493,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='x', finish_reason='tool_call', @@ -1560,6 +1586,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='x', finish_reason='tool_call', @@ -1582,6 +1609,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='x', finish_reason='stop', @@ -1676,6 +1704,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='x', finish_reason='tool_call', @@ -1704,6 +1733,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='x', finish_reason='tool_call', @@ -1726,6 +1756,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='x', finish_reason='stop', @@ -1906,6 +1937,7 @@ async def get_image() -> BinaryContent: model_name='pixtral-12b-latest', timestamp=IsDatetime(), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='412174432ea945889703eac58b44ae35', finish_reason='tool_call', @@ -1939,6 +1971,7 @@ async def get_image() -> BinaryContent: model_name='pixtral-12b-latest', timestamp=IsDatetime(), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='049b5c7704554d3396e727a95cb6d947', finish_reason='stop', @@ -1983,6 +2016,7 @@ async def test_image_url_input(allow_model_requests: None): model_name='mistral-large-123', timestamp=IsDatetime(), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -2024,6 +2058,7 @@ async def test_image_as_binary_content_input(allow_model_requests: None): model_name='mistral-large-123', timestamp=IsDatetime(), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -2068,6 +2103,7 @@ async def test_pdf_url_input(allow_model_requests: None): model_name='mistral-large-123', timestamp=IsDatetime(), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -2106,6 +2142,7 @@ async def test_pdf_as_binary_content_input(allow_model_requests: None): model_name='mistral-large-123', timestamp=IsDatetime(), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -2202,6 +2239,7 @@ async def test_mistral_model_instructions(allow_model_requests: None, mistral_ap model_name='mistral-large-123', timestamp=IsDatetime(), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -2240,6 +2278,7 @@ async def test_mistral_model_thinking_part(allow_model_requests: None, openai_ap model_name='o3-mini-2025-01-31', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68bb6452990081968f5aff503a55e3b903498c8aa840cf12', finish_reason='stop', @@ -2274,6 +2313,7 @@ async def test_mistral_model_thinking_part(allow_model_requests: None, openai_ap model_name='magistral-medium-latest', timestamp=IsDatetime(), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='9abe8b736bff46af8e979b52334a57cd', finish_reason='stop', @@ -2338,6 +2378,7 @@ async def test_mistral_model_thinking_part_iter(allow_model_requests: None, mist model_name='magistral-medium-latest', timestamp=IsDatetime(), provider_name='mistral', + provider_url='https://api.mistral.ai', provider_details={'finish_reason': 'stop'}, provider_response_id='9f9d90210f194076abeee223863eaaf0', finish_reason='stop', diff --git a/tests/models/test_openai.py b/tests/models/test_openai.py index ed68edd94f..74cb3c1414 100644 --- a/tests/models/test_openai.py +++ b/tests/models/test_openai.py @@ -132,6 +132,7 @@ async def test_request_simple_success(allow_model_requests: None): model_name='gpt-4o-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -146,6 +147,7 @@ async def test_request_simple_success(allow_model_requests: None): model_name='gpt-4o-123', timestamp=datetime(2024, 1, 1, 0, 0, tzinfo=timezone.utc), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -251,6 +253,7 @@ async def test_request_structured_response(allow_model_requests: None): model_name='gpt-4o-123', timestamp=datetime(2024, 1, 1, tzinfo=timezone.utc), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -351,6 +354,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4o-123', timestamp=datetime(2024, 1, 1, tzinfo=timezone.utc), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -383,6 +387,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4o-123', timestamp=datetime(2024, 1, 1, tzinfo=timezone.utc), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -404,6 +409,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4o-123', timestamp=datetime(2024, 1, 1, tzinfo=timezone.utc), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -477,6 +483,7 @@ async def test_stream_text_finish_reason(allow_model_requests: None): model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_details={'finish_reason': 'stop'}, provider_response_id='123', finish_reason='stop', @@ -909,6 +916,7 @@ async def get_image() -> ImageUrl: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRmTHlrARTzAHK1na9s80xDlQGYPX', finish_reason='tool_call', @@ -950,6 +958,7 @@ async def get_image() -> ImageUrl: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BRmTI0Y2zmkGw27kLarhsmiFQTGxR', finish_reason='stop', @@ -996,6 +1005,7 @@ async def get_image() -> BinaryContent: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRlkLhPc87BdohVobEJJCGq3rUAG2', finish_reason='tool_call', @@ -1034,6 +1044,7 @@ async def get_image() -> BinaryContent: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BRlkORPA5rXMV3uzcOcgK4eQFKCVW', finish_reason='stop', @@ -1257,6 +1268,7 @@ async def test_message_history_can_start_with_model_response(allow_model_request model_name='gpt-4.1-mini-2025-04-14', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-Ceeiy4ivEE0hcL1EX5ZfLuW5xNUXB', finish_reason='stop', @@ -2062,6 +2074,7 @@ async def test_openai_instructions(allow_model_requests: None, openai_api_key: s model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BJjf61mLb9z5H45ClJzbx0UWKwjo1', finish_reason='stop', @@ -2111,6 +2124,7 @@ async def get_temperature(city: str) -> float: model_name='gpt-4.1-mini-2025-04-14', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BMxEwRA0p0gJ52oKS7806KAlfMhqq', finish_reason='tool_call', @@ -2140,6 +2154,7 @@ async def get_temperature(city: str) -> float: model_name='gpt-4.1-mini-2025-04-14', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BMxEx6B8JEj6oDC45MOWKp0phg8UP', finish_reason='stop', @@ -2177,6 +2192,7 @@ async def test_openai_model_thinking_part(allow_model_requests: None, openai_api model_name='o3-mini-2025-01-31', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c1fa0523248197888681b898567bde093f57e27128848a', finish_reason='stop', @@ -2216,6 +2232,7 @@ async def test_openai_model_thinking_part(allow_model_requests: None, openai_api model_name='o3-mini-2025-01-31', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-CENUmtwDD0HdvTUYL6lUeijDtxrZL', finish_reason='stop', @@ -2526,6 +2543,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BSXk0dWkG4hfPt0lph4oFO35iT73I', finish_reason='tool_call', @@ -2563,6 +2581,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BSXk1xGHYzbhXgUkSutK08bdoNv5s', finish_reason='tool_call', @@ -2626,6 +2645,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BgeDFS85bfHosRFEEAvq8reaCPCZ8', finish_reason='tool_call', @@ -2657,6 +2677,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BgeDGX9eDyVrEI56aP2vtIHahBzFH', finish_reason='stop', @@ -2712,6 +2733,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BSXjyBwGuZrtuuSzNCeaWMpGv2MZ3', finish_reason='tool_call', @@ -2743,6 +2765,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BSXjzYGu67dhTy5r8KmjJvQ4HhDVO', finish_reason='stop', @@ -2800,6 +2823,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-Bgg5utuCSXMQ38j0n2qgfdQKcR9VD', finish_reason='tool_call', @@ -2835,6 +2859,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-Bgg5vrxUtCDlvgMreoxYxPaKxANmd', finish_reason='stop', @@ -2888,6 +2913,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-Bgh27PeOaFW6qmF04qC5uI2H9mviw', finish_reason='tool_call', @@ -2919,6 +2945,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-Bgh28advCSFhGHPnzUevVS6g6Uwg0', finish_reason='stop', @@ -2976,6 +3003,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-Bgh2AW2NXGgMc7iS639MJXNRgtatR', finish_reason='tool_call', @@ -3011,6 +3039,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-Bgh2BthuopRnSqCuUgMbBnOqgkDHC', finish_reason='stop', diff --git a/tests/models/test_openai_responses.py b/tests/models/test_openai_responses.py index 17964a2bdf..cc496fcabd 100644 --- a/tests/models/test_openai_responses.py +++ b/tests/models/test_openai_responses.py @@ -306,6 +306,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_67e547c48c9481918c5c4394464ce0c60ae6111e84dd5c08', finish_reason='stop', @@ -343,6 +344,7 @@ async def get_location(loc_name: str) -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_67e547c5a2f08191802a1f43620f348503a2086afed73b47', finish_reason='stop', @@ -388,6 +390,7 @@ async def get_image() -> BinaryContent: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_681134d3aa3481919ca581a267db1e510fe7a5a4e2123dc3', finish_reason='stop', @@ -422,6 +425,7 @@ async def get_image() -> BinaryContent: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_681134d53c48819198ce7b89db78dffd02cbfeaababb040c', finish_reason='stop', @@ -524,6 +528,7 @@ async def get_capital(country: str) -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_67e554a21aa88191b65876ac5e5bbe0406c52f0e511c76ed', finish_reason='stop', @@ -702,6 +707,7 @@ async def test_openai_responses_model_builtin_tools_web_search(allow_model_reque model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0e3d55e9502941380068c4aa9a62f48195a373978ed720ac63', finish_reason='stop', @@ -735,6 +741,7 @@ async def test_openai_responses_model_instructions(allow_model_requests: None, o model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_67f3fdfd9fa08191a3d5825db81b8df6003bc73febb56d77', finish_reason='stop', @@ -799,6 +806,7 @@ async def test_openai_responses_model_web_search_tool(allow_model_requests: None model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_028829e50fbcad090068c9c82e1e0081958ddc581008b39428', finish_reason='stop', @@ -859,6 +867,7 @@ async def test_openai_responses_model_web_search_tool(allow_model_requests: None model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_028829e50fbcad090068c9c83b9fb88195b6b84a32e1fc83c0', finish_reason='stop', @@ -929,6 +938,7 @@ async def test_openai_responses_model_web_search_tool_with_user_location( model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0b385a0fdc82fd920068c4aaf3ced88197a88711e356b032c4', finish_reason='stop', @@ -1000,6 +1010,7 @@ async def test_openai_responses_model_web_search_tool_with_invalid_region( model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0b4f29854724a3120068c4ab0b660081919707b95b47552782', finish_reason='stop', @@ -1084,6 +1095,7 @@ async def test_openai_responses_model_web_search_tool_stream(allow_model_request model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_00a60507bf41223d0068c9d2fbf93481a0ba2a7796ae2cab4c', finish_reason='stop', @@ -1303,6 +1315,7 @@ async def test_openai_responses_model_web_search_tool_stream(allow_model_request model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_00a60507bf41223d0068c9d31574d881a090c232646860a771', finish_reason='stop', @@ -1411,6 +1424,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68477f0b40a8819cb8d55594bc2c232a001fd29e2d5573f7', finish_reason='stop', @@ -1440,6 +1454,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68477f0bfda8819ea65458cd7cc389b801dc81d4bc91f560', finish_reason='stop', @@ -1500,6 +1515,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68477f0d9494819ea4f123bba707c9ee0356a60c98816d6a', finish_reason='stop', @@ -1527,6 +1543,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68477f0e2b28819d9c828ef4ee526d6a03434b607c02582d', finish_reason='stop', @@ -1579,6 +1596,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68477f0f220081a1a621d6bcdc7f31a50b8591d9001d2329', finish_reason='stop', @@ -1606,6 +1624,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68477f0fde708192989000a62809c6e5020197534e39cc1f', finish_reason='stop', @@ -1660,6 +1679,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68477f10f2d081a39b3438f413b3bafc0dd57d732903c563', finish_reason='stop', @@ -1687,6 +1707,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68477f119830819da162aa6e10552035061ad97e2eef7871', finish_reason='stop', @@ -1737,6 +1758,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68482f12d63881a1830201ed101ecfbf02f8ef7f2fb42b50', finish_reason='stop', @@ -1764,6 +1786,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68482f1b556081918d64c9088a470bf0044fdb7d019d4115', finish_reason='stop', @@ -1818,6 +1841,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68482f1d38e081a1ac828acda978aa6b08e79646fe74d5ee', finish_reason='stop', @@ -1845,6 +1869,7 @@ async def get_user_country() -> str: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68482f28c1b081a1ae73cbbee012ee4906b4ab2d00d03024', finish_reason='stop', @@ -2056,6 +2081,7 @@ async def test_openai_responses_usage_without_tokens_details(allow_model_request model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), @@ -2101,6 +2127,7 @@ async def test_openai_responses_model_thinking_part(allow_model_requests: None, model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c42c902794819cb9335264c342f65407460311b0c8d3de', finish_reason='stop', @@ -2145,6 +2172,7 @@ async def test_openai_responses_model_thinking_part(allow_model_requests: None, model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c42cb3d520819c9d28b07036e9059507460311b0c8d3de', finish_reason='stop', @@ -2198,6 +2226,7 @@ async def test_openai_responses_thinking_part_from_other_model( model_name='claude-sonnet-4-20250514', timestamp=IsDatetime(), provider_name='anthropic', + provider_url='https://api.anthropic.com', provider_details={'finish_reason': 'end_turn'}, provider_response_id='msg_0114iHK2ditgTf1N8FWomc4E', finish_reason='stop', @@ -2245,6 +2274,7 @@ async def test_openai_responses_thinking_part_from_other_model( model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c42ce277ac8193ba08881bcefabaf70ad492c7955fc6fc', finish_reason='stop', @@ -2308,6 +2338,7 @@ async def test_openai_responses_thinking_part_iter(allow_model_requests: None, o model_name='o3-mini-2025-01-31', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c42d0fb418819dbfa579f69406b49508fbf9b1584184ff', finish_reason='stop', @@ -2380,6 +2411,7 @@ def update_plan(plan: str) -> str: model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c42d28772c819684459966ee2201ed0e8bc41441c948f6', finish_reason='stop', @@ -2405,6 +2437,7 @@ def update_plan(plan: str) -> str: model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c42d3fd6a08196bce23d6be960ff8a0e8bc41441c948f6', finish_reason='stop', @@ -2456,6 +2489,7 @@ async def test_openai_responses_thinking_without_summary(allow_model_requests: N model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), @@ -2532,6 +2566,7 @@ async def test_openai_responses_thinking_with_multiple_summaries(allow_model_req model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), @@ -2600,6 +2635,7 @@ async def test_openai_responses_thinking_with_modified_history(allow_model_reque model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c42ddf9bbc8194aa7b97304dd909cb0202c9ad459e0d23', finish_reason='stop', @@ -2653,6 +2689,7 @@ async def test_openai_responses_thinking_with_modified_history(allow_model_reque model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c42de4afcc819f995a1c59fe87c9d5051f82c608a83beb', finish_reason='stop', @@ -2737,6 +2774,7 @@ async def test_openai_responses_thinking_with_code_execution_tool(allow_model_re model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68cdba511c7081a389e67b16621029c609b7445677780c8f', finish_reason='stop', @@ -2772,6 +2810,7 @@ async def test_openai_responses_thinking_with_code_execution_tool(allow_model_re model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68cdba6a610481a3b4533f345bea8a7b09b7445677780c8f', finish_reason='stop', @@ -2870,6 +2909,7 @@ async def test_openai_responses_thinking_with_code_execution_tool_stream( model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68c35098e6fc819e80fb94b25b7d031b0f2d670b80edc507', finish_reason='stop', @@ -3645,6 +3685,7 @@ def get_meaning_of_life() -> int: model_name='gpt-4.1-2025-04-14', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68cc4fa5603481958e2143685133fe530548824120ffcf74', finish_reason='stop', @@ -3676,6 +3717,7 @@ def get_meaning_of_life() -> int: model_name='gpt-4.1-2025-04-14', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68cc4fa6a8a881a187b0fe1603057bff0307c6d4d2ee5985', finish_reason='stop', @@ -3808,6 +3850,7 @@ async def test_openai_responses_code_execution_return_image(allow_model_requests model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68cdc382bc98819083a5b47ec92e077b0187028ba77f15f7', finish_reason='stop', @@ -3967,6 +4010,7 @@ async def test_openai_responses_code_execution_return_image(allow_model_requests model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68cdc39da72481909e0512fef9d646240187028ba77f15f7', finish_reason='stop', @@ -4052,6 +4096,7 @@ async def test_openai_responses_code_execution_return_image_stream(allow_model_r model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_06c1a26fd89d07f20068dd9367869c819788cb28e6f19eff9b', finish_reason='stop', @@ -5546,6 +5591,7 @@ async def test_openai_responses_image_generation(allow_model_requests: None, ope model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id=IsStr(), finish_reason='stop', @@ -5618,6 +5664,7 @@ async def test_openai_responses_image_generation(allow_model_requests: None, ope model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id=IsStr(), finish_reason='stop', @@ -5710,6 +5757,7 @@ async def test_openai_responses_image_generation_stream(allow_model_requests: No model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id=IsStr(), finish_reason='stop', @@ -5889,6 +5937,7 @@ async def test_openai_responses_image_generation_tool_without_image_output( model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68cdec1f3290819f99d9caba8703b251079003437d26d0c0', finish_reason='stop', @@ -5946,6 +5995,7 @@ async def test_openai_responses_image_generation_tool_without_image_output( model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_68cdec61d0a0819fac14ed057a9946a1079003437d26d0c0', finish_reason='stop', @@ -6050,6 +6100,7 @@ class Animal(BaseModel): model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0360827931d9421b0068dd8328c08c81a0ba854f245883906f', finish_reason='stop', @@ -6084,6 +6135,7 @@ class Animal(BaseModel): model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0360827931d9421b0068dd8370a70081a09d6de822ee43bbc4', finish_reason='stop', @@ -6168,6 +6220,7 @@ class Animal(BaseModel): model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_09b7ce6df817433c0068dd8407c37881a0ad817ef3cc3a3600', finish_reason='stop', @@ -6241,6 +6294,7 @@ class Animal(BaseModel): model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0d14a5e3c26c21180068dd871d439081908dc36e63fab0cedf', finish_reason='stop', @@ -6296,6 +6350,7 @@ async def get_animal() -> str: model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0481074da98340df0068dd88dceb1481918b1d167d99bc51cd', finish_reason='stop', @@ -6346,6 +6401,7 @@ async def get_animal() -> str: model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0481074da98340df0068dd88f0ba04819185a168065ef28040', finish_reason='stop', @@ -6449,6 +6505,7 @@ async def test_openai_responses_multiple_images(allow_model_requests: None, open model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0b6169df6e16e9690068dd80d64aec81919c65f238307673bb', finish_reason='stop', @@ -6522,6 +6579,7 @@ async def test_openai_responses_image_generation_jpeg(allow_model_requests: None model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_08acbdf1ae54befc0068dd9ced226c8197a2e974b29c565407', finish_reason='stop', @@ -6604,6 +6662,7 @@ class CityLocation(BaseModel): model_name='gpt-5-2025-08-07', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_001fd29e2d5573f70068ece2e6dfbc819c96557f0de72802be', finish_reason='stop', @@ -6778,6 +6837,7 @@ async def test_openai_responses_model_mcp_server_tool(allow_model_requests: None model_name='o4-mini-2025-04-16', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0083938b3a28070e0068fabd81970881a0a1195f2cab45bd04', finish_reason='stop', @@ -6825,6 +6885,7 @@ async def test_openai_responses_model_mcp_server_tool(allow_model_requests: None model_name='o4-mini-2025-04-16', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0083938b3a28070e0068fabd9d414881a089cf24784f80e021', finish_reason='stop', @@ -7045,6 +7106,7 @@ async def test_openai_responses_model_mcp_server_tool_stream(allow_model_request model_name='o4-mini-2025-04-16', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_00b9cc7a23d047270068faa0e25934819f9c3bfdec80065bc4', finish_reason='stop', @@ -7423,6 +7485,7 @@ async def test_openai_responses_model_mcp_server_tool_with_connector(allow_model model_name='o4-mini-2025-04-16', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'completed'}, provider_response_id='resp_0558010cf1416a490068faa0f945bc81a0b6a6dfb7391030d5', finish_reason='stop', @@ -7532,6 +7595,7 @@ async def test_openai_responses_raw_cot_only(allow_model_requests: None): model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), @@ -7596,6 +7660,7 @@ async def test_openai_responses_raw_cot_with_summary(allow_model_requests: None) model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), @@ -7664,6 +7729,7 @@ async def test_openai_responses_multiple_summaries(allow_model_requests: None): model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), @@ -7717,6 +7783,7 @@ async def test_openai_responses_raw_cot_stream_openrouter(allow_model_requests: model_name='openai/gpt-oss-20b', timestamp=IsDatetime(), provider_name='openrouter', + provider_url='https://openrouter.ai/api/v1', provider_details={'finish_reason': 'completed'}, provider_response_id='gen-1764265411-Fu1iEX7h5MRWiL79lb94', finish_reason='stop', @@ -7847,6 +7914,7 @@ async def capture_messages(*args: Any, **kwargs: Any) -> Any: model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), @@ -7879,6 +7947,7 @@ async def capture_messages(*args: Any, **kwargs: Any) -> Any: model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), @@ -7906,6 +7975,7 @@ async def capture_messages(*args: Any, **kwargs: Any) -> Any: model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), @@ -7938,6 +8008,7 @@ async def capture_messages(*args: Any, **kwargs: Any) -> Any: model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), @@ -7965,6 +8036,7 @@ async def capture_messages(*args: Any, **kwargs: Any) -> Any: model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), @@ -7990,6 +8062,7 @@ async def capture_messages(*args: Any, **kwargs: Any) -> Any: model_name='gpt-4o-123', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1', provider_response_id='123', run_id=IsStr(), ), diff --git a/tests/test_agent.py b/tests/test_agent.py index 9c44f4adfb..ec52b05a2a 100644 --- a/tests/test_agent.py +++ b/tests/test_agent.py @@ -3821,6 +3821,7 @@ def test_binary_content_serializable(): 'provider_name': None, 'provider_details': None, 'provider_response_id': None, + 'provider_url': None, 'timestamp': IsStr(), 'kind': 'response', 'finish_reason': None, @@ -3883,6 +3884,7 @@ def test_image_url_serializable_missing_media_type(): 'timestamp': IsStr(), 'provider_name': None, 'provider_details': None, + 'provider_url': None, 'provider_response_id': None, 'kind': 'response', 'finish_reason': None, @@ -3952,6 +3954,7 @@ def test_image_url_serializable(): 'timestamp': IsStr(), 'provider_name': None, 'provider_details': None, + 'provider_url': None, 'provider_response_id': None, 'kind': 'response', 'finish_reason': None, diff --git a/tests/test_dbos.py b/tests/test_dbos.py index 1d3b9991db..de99f1b1d0 100644 --- a/tests/test_dbos.py +++ b/tests/test_dbos.py @@ -1433,6 +1433,7 @@ async def hitl_main_loop(prompt: str) -> AgentRunResult[str | DeferredToolReques model_name=IsStr(), timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id=IsStr(), finish_reason='tool_call', @@ -1473,6 +1474,7 @@ async def hitl_main_loop(prompt: str) -> AgentRunResult[str | DeferredToolReques model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id=IsStr(), finish_reason='stop', @@ -1564,6 +1566,7 @@ def hitl_main_loop_sync(prompt: str) -> AgentRunResult[str | DeferredToolRequest model_name=IsStr(), timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id=IsStr(), finish_reason='tool_call', @@ -1604,6 +1607,7 @@ def hitl_main_loop_sync(prompt: str) -> AgentRunResult[str | DeferredToolRequest model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id=IsStr(), finish_reason='stop', @@ -1665,6 +1669,7 @@ async def test_dbos_agent_with_model_retry(allow_model_requests: None, dbos: DBO model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id=IsStr(), finish_reason='tool_call', @@ -1702,6 +1707,7 @@ async def test_dbos_agent_with_model_retry(allow_model_requests: None, dbos: DBO model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id=IsStr(), finish_reason='tool_call', @@ -1733,6 +1739,7 @@ async def test_dbos_agent_with_model_retry(allow_model_requests: None, dbos: DBO model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id=IsStr(), finish_reason='stop', diff --git a/tests/test_mcp.py b/tests/test_mcp.py index d53ad47551..b1f283018e 100644 --- a/tests/test_mcp.py +++ b/tests/test_mcp.py @@ -248,6 +248,7 @@ async def test_agent_with_stdio_server(allow_model_requests: None, agent: Agent) model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRlnvvqIPFofAtKqtQKMWZkgXhzlT', finish_reason='tool_call', @@ -279,6 +280,7 @@ async def test_agent_with_stdio_server(allow_model_requests: None, agent: Agent) model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BRlnyjUo5wlyqvdNdM5I8vIWjo1qF', finish_reason='stop', @@ -417,6 +419,7 @@ async def test_tool_returning_str(allow_model_requests: None, agent: Agent): model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRlo3e1Ud2lnvkddMilmwC7LAemiy', finish_reason='tool_call', @@ -452,6 +455,7 @@ async def test_tool_returning_str(allow_model_requests: None, agent: Agent): model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BRlo41LxqBYgGKWgGrQn67fQacOLp', finish_reason='stop', @@ -497,6 +501,7 @@ async def test_tool_returning_text_resource(allow_model_requests: None, agent: A model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRmhyweJVYonarb7s9ckIMSHf2vHo', finish_reason='tool_call', @@ -528,6 +533,7 @@ async def test_tool_returning_text_resource(allow_model_requests: None, agent: A model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BRmhzqXFObpYwSzREMpJvX9kbDikR', finish_reason='stop', @@ -573,6 +579,7 @@ async def test_tool_returning_text_resource_link(allow_model_requests: None, age model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BwdHSFe0EykAOpf0LWZzsWAodIQzb', finish_reason='tool_call', @@ -604,6 +611,7 @@ async def test_tool_returning_text_resource_link(allow_model_requests: None, age model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BwdHTIlBZWzXJPBR8VTOdC4O57ZQA', finish_reason='stop', @@ -651,6 +659,7 @@ async def test_tool_returning_image_resource(allow_model_requests: None, agent: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRlo7KYJVXuNZ5lLLdYcKZDsX2CHb', finish_reason='tool_call', @@ -687,6 +696,7 @@ async def test_tool_returning_image_resource(allow_model_requests: None, agent: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BRloBGHh27w3fQKwxq4fX2cPuZJa9', finish_reason='stop', @@ -736,6 +746,7 @@ async def test_tool_returning_image_resource_link( model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BwdHygYePH1mZgHo2Xxzib0Y7sId7', finish_reason='tool_call', @@ -772,6 +783,7 @@ async def test_tool_returning_image_resource_link( model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BwdI2D2r9dvqq3pbsA0qgwKDEdTtD', finish_reason='stop', @@ -802,6 +814,7 @@ async def test_tool_returning_audio_resource( model_name='models/gemini-2.5-pro-preview-05-06', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -830,6 +843,7 @@ async def test_tool_returning_audio_resource( model_name='models/gemini-2.5-pro-preview-05-06', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id=IsStr(), finish_reason='stop', @@ -872,6 +886,7 @@ async def test_tool_returning_audio_resource_link( model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='Pe_BaJGqOKSdz7IP0NqogA8', finish_reason='stop', @@ -906,6 +921,7 @@ async def test_tool_returning_audio_resource_link( model_name='gemini-2.5-pro', timestamp=IsDatetime(), provider_name='google-gla', + provider_url='https://generativelanguage.googleapis.com/', provider_details={'finish_reason': 'STOP'}, provider_response_id='QO_BaLC6AozQz7IPh5Kj4Q4', finish_reason='stop', @@ -951,6 +967,7 @@ async def test_tool_returning_image(allow_model_requests: None, agent: Agent, im model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRloGQJWIX0Qk7gtNzF4s2Fez0O29', finish_reason='tool_call', @@ -989,6 +1006,7 @@ async def test_tool_returning_image(allow_model_requests: None, agent: Agent, im model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BRloJHR654fSD0fcvLWZxtKtn0pag', finish_reason='stop', @@ -1028,6 +1046,7 @@ async def test_tool_returning_dict(allow_model_requests: None, agent: Agent): model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRloOs7Bb2tq8wJyy9Rv7SQ7L65a7', finish_reason='tool_call', @@ -1059,6 +1078,7 @@ async def test_tool_returning_dict(allow_model_requests: None, agent: Agent): model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BRloPczU1HSCWnreyo21DdNtdOM7L', finish_reason='stop', @@ -1102,6 +1122,7 @@ async def test_tool_returning_unstructured_dict(allow_model_requests: None, agen model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-CLbP82ODQMEznhobUKdq6Rjn9Aa12', finish_reason='tool_call', @@ -1133,6 +1154,7 @@ async def test_tool_returning_unstructured_dict(allow_model_requests: None, agen model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-CLbPAOYN3jPYdvYeD8JNOOXF5N554', finish_reason='stop', @@ -1180,6 +1202,7 @@ async def test_tool_returning_error(allow_model_requests: None, agent: Agent): model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRloSNg7aGSp1rXDkhInjMIUHKd7A', finish_reason='tool_call', @@ -1217,6 +1240,7 @@ async def test_tool_returning_error(allow_model_requests: None, agent: Agent): model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRloTvSkFeX4DZKQLqfH9KbQkWlpt', finish_reason='tool_call', @@ -1252,6 +1276,7 @@ async def test_tool_returning_error(allow_model_requests: None, agent: Agent): model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BRloU3MhnqNEqujs28a3ofRbs7VPF', finish_reason='stop', @@ -1291,6 +1316,7 @@ async def test_tool_returning_none(allow_model_requests: None, agent: Agent): model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRloX2RokWc9j9PAXAuNXGR73WNqY', finish_reason='tool_call', @@ -1322,6 +1348,7 @@ async def test_tool_returning_none(allow_model_requests: None, agent: Agent): model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BRloYWGujk8yE94gfVSsM1T1Ol2Ej', finish_reason='stop', @@ -1369,6 +1396,7 @@ async def test_tool_returning_multiple_items(allow_model_requests: None, agent: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id='chatcmpl-BRlobKLgm6vf79c9O8sloZaYx3coC', finish_reason='tool_call', @@ -1416,6 +1444,7 @@ async def test_tool_returning_multiple_items(allow_model_requests: None, agent: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id='chatcmpl-BRloepWR5NJpTgSqFBGTSPeM1SWm8', finish_reason='stop', diff --git a/tests/test_messages.py b/tests/test_messages.py index f116502882..f5aaf972d4 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -513,6 +513,7 @@ def test_file_part_serialization_roundtrip(): 'timestamp': IsStr(), 'kind': 'response', 'provider_name': None, + 'provider_url': None, 'provider_details': None, 'provider_response_id': None, 'finish_reason': None, diff --git a/tests/test_temporal.py b/tests/test_temporal.py index 98039d9078..9db53172e8 100644 --- a/tests/test_temporal.py +++ b/tests/test_temporal.py @@ -1856,6 +1856,7 @@ async def test_temporal_agent_with_hitl_tool(allow_model_requests: None, client: model_name=IsStr(), timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id=IsStr(), finish_reason='tool_call', @@ -1898,6 +1899,7 @@ async def test_temporal_agent_with_hitl_tool(allow_model_requests: None, client: model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id=IsStr(), finish_reason='stop', @@ -1975,6 +1977,7 @@ async def test_temporal_agent_with_model_retry(allow_model_requests: None, clien model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id=IsStr(), finish_reason='tool_call', @@ -2012,6 +2015,7 @@ async def test_temporal_agent_with_model_retry(allow_model_requests: None, clien model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'tool_calls'}, provider_response_id=IsStr(), finish_reason='tool_call', @@ -2043,6 +2047,7 @@ async def test_temporal_agent_with_model_retry(allow_model_requests: None, clien model_name='gpt-4o-2024-08-06', timestamp=IsDatetime(), provider_name='openai', + provider_url='https://api.openai.com/v1/', provider_details={'finish_reason': 'stop'}, provider_response_id=IsStr(), finish_reason='stop',