Coverage for pydantic_ai_slim/pydantic_ai/models/wrapper.py: 96.55%

29 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-03-28 17:27 +0000

1from __future__ import annotations 

2 

3from collections.abc import AsyncIterator 

4from contextlib import asynccontextmanager 

5from dataclasses import dataclass 

6from typing import Any 

7 

8from ..messages import ModelMessage, ModelResponse 

9from ..settings import ModelSettings 

10from ..usage import Usage 

11from . import KnownModelName, Model, ModelRequestParameters, StreamedResponse, infer_model 

12 

13 

14@dataclass(init=False) 

15class WrapperModel(Model): 

16 """Model which wraps another model. 

17 

18 Does nothing on its own, used as a base class. 

19 """ 

20 

21 wrapped: Model 

22 """The underlying model being wrapped.""" 

23 

24 def __init__(self, wrapped: Model | KnownModelName): 

25 self.wrapped = infer_model(wrapped) 

26 

27 async def request(self, *args: Any, **kwargs: Any) -> tuple[ModelResponse, Usage]: 

28 return await self.wrapped.request(*args, **kwargs) 

29 

30 @asynccontextmanager 

31 async def request_stream( 

32 self, 

33 messages: list[ModelMessage], 

34 model_settings: ModelSettings | None, 

35 model_request_parameters: ModelRequestParameters, 

36 ) -> AsyncIterator[StreamedResponse]: 

37 async with self.wrapped.request_stream(messages, model_settings, model_request_parameters) as response_stream: 

38 yield response_stream 

39 

40 @property 

41 def model_name(self) -> str: 

42 return self.wrapped.model_name 

43 

44 @property 

45 def system(self) -> str: 

46 return self.wrapped.system 

47 

48 def __getattr__(self, item: str): 

49 return getattr(self.wrapped, item)