Skip to content

Commit 1d7a8a4

Browse files
committed
fix typing
1 parent 3d7f1b4 commit 1d7a8a4

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

pydantic_ai_slim/pydantic_ai/models/openrouter.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from dataclasses import asdict, dataclass
2-
from typing import Literal, cast
2+
from typing import Any, Literal, cast
33

44
from openai import AsyncOpenAI
55
from openai.types.chat import ChatCompletion, ChatCompletionMessage, ChatCompletionMessageParam
@@ -272,14 +272,15 @@ class ReasoningText(BaseReasoningDetail):
272272

273273

274274
OpenRouterReasoningDetail = ReasoningSummary | ReasoningEncrypted | ReasoningText
275+
_reasoning_detail_adapter: TypeAdapter[OpenRouterReasoningDetail] = TypeAdapter(OpenRouterReasoningDetail)
275276

276277

277278
@dataclass(repr=False)
278279
class OpenRouterThinkingPart(ThinkingPart):
279280
"""A special ThinkingPart that includes reasoning attributes specific to OpenRouter."""
280281

281282
type: Literal['reasoning.summary', 'reasoning.encrypted', 'reasoning.text']
282-
index: int
283+
index: int | None
283284
format: Literal['unknown', 'openai-responses-v1', 'anthropic-claude-v1', 'xai-responses-v1']
284285

285286
__repr__ = _utils.dataclasses_no_defaults_repr
@@ -317,7 +318,7 @@ def from_reasoning_detail(cls, reasoning: OpenRouterReasoningDetail, provider_na
317318
)
318319

319320
def into_reasoning_detail(self):
320-
return TypeAdapter(OpenRouterReasoningDetail).validate_python(asdict(self)).model_dump()
321+
return _reasoning_detail_adapter.validate_python(asdict(self)).model_dump()
321322

322323

323324
class OpenRouterCompletionMessage(ChatCompletionMessage):
@@ -368,7 +369,7 @@ def _openrouter_settings_to_openai_settings(model_settings: OpenRouterModelSetti
368369
Returns:
369370
An 'OpenAIChatModelSettings' object with equivalent settings.
370371
"""
371-
extra_body = model_settings.get('extra_body', {})
372+
extra_body = cast(dict[str, Any], model_settings.get('extra_body', {}))
372373

373374
if models := model_settings.pop('openrouter_models', None):
374375
extra_body['models'] = models
@@ -379,7 +380,9 @@ def _openrouter_settings_to_openai_settings(model_settings: OpenRouterModelSetti
379380
if transforms := model_settings.pop('openrouter_transforms', None):
380381
extra_body['transforms'] = transforms
381382

382-
return OpenAIChatModelSettings(**model_settings, extra_body=extra_body)
383+
model_settings['extra_body'] = extra_body
384+
385+
return OpenAIChatModelSettings(**model_settings) # type: ignore[reportCallIssue]
383386

384387

385388
class OpenRouterModel(OpenAIChatModel):
@@ -463,6 +466,6 @@ async def _map_messages(self, messages: list[ModelMessage]) -> list[ChatCompleti
463466
if reasoning_details := [
464467
part.into_reasoning_detail() for part in message.parts if isinstance(part, OpenRouterThinkingPart)
465468
]:
466-
openai_message['reasoning_details'] = reasoning_details
469+
openai_message['reasoning_details'] = reasoning_details # type: ignore[reportGeneralTypeIssues]
467470

468471
return openai_messages

tests/models/test_openrouter.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from collections.abc import Sequence
12
from typing import cast
23

34
import pytest
@@ -6,6 +7,7 @@
67
from pydantic_ai import (
78
Agent,
89
ModelHTTPError,
10+
ModelMessage,
911
ModelRequest,
1012
TextPart,
1113
ThinkingPart,
@@ -89,15 +91,16 @@ async def test_openrouter_preserve_reasoning_block(allow_model_requests: None, o
8991
provider = OpenRouterProvider(api_key=openrouter_api_key)
9092
model = OpenRouterModel('openai/o3', provider=provider)
9193

92-
messages = [
94+
messages: Sequence[ModelMessage] = []
95+
messages.append(
9396
ModelRequest.user_text_prompt(
9497
"What was the impact of Voltaire's writings on modern french culture? Think about your answer."
9598
)
96-
]
99+
)
97100
response = await model_request(model, messages)
98101
messages.append(response)
99102

100-
openai_messages = await model._map_messages(messages)
103+
openai_messages = await model._map_messages(messages) # type: ignore[reportPrivateUsage]
101104

102105
assistant_message = openai_messages[1]
103106
assert 'reasoning_details' in assistant_message

0 commit comments

Comments
 (0)