Skip to content

Commit c811019

Browse files
authored
Merge pull request #87 from LiberiFatali/fix/pydantic-ai-pin
fix: make CachingOpenAIModel._map_messages version-adaptive
2 parents a61f0f2 + 7157a7e commit c811019

2 files changed

Lines changed: 59 additions & 4 deletions

File tree

‎codewiki/src/be/llm_services.py‎

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
77
Supports multiple providers: openai-compatible, anthropic, bedrock, azure-openai.
88
"""
9+
import inspect
910
import logging
1011
from typing import Optional
1112

@@ -148,10 +149,20 @@ def __init__(self, model_name, *, prompt_caching=True, cache_registry_key="", **
148149
def _prompt_caching_active(self) -> bool:
149150
return self._prompt_caching_enabled and self._cache_registry_key not in _CACHE_UNSUPPORTED
150151

151-
async def _map_messages(self, messages, model_request_parameters, *, model_settings=None):
152-
openai_messages = await super()._map_messages(
153-
messages, model_request_parameters, model_settings=model_settings
154-
)
152+
async def _map_messages(self, messages, model_request_parameters=None, *, model_settings=None):
153+
base = OpenAIChatModel._map_messages
154+
base_params = set(inspect.signature(base).parameters)
155+
if "model_settings" in base_params:
156+
openai_messages = await super()._map_messages(
157+
messages, model_request_parameters, model_settings=model_settings
158+
)
159+
elif "model_request_parameters" in base_params:
160+
# Intermediate pydantic-ai versions accept request parameters but
161+
# predate the keyword-only model_settings argument.
162+
openai_messages = await super()._map_messages(messages, model_request_parameters)
163+
else:
164+
# Early pydantic-ai versions accept only messages.
165+
openai_messages = await super()._map_messages(messages)
155166
if self._prompt_caching_active:
156167
# Breakpoint 1: last system/developer message (covers tools + system).
157168
for message in reversed(openai_messages):

‎tests/test_prompt_caching.py‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,50 @@ def _map(model: CachingOpenAIModel) -> list:
5757
)
5858

5959

60+
def test_map_messages_adapts_to_all_base_signatures():
61+
"""Forward only the arguments supported by each pydantic-ai API era."""
62+
model = _make_model(prompt_caching=False)
63+
history = _history()
64+
request_parameters = ModelRequestParameters()
65+
model_settings = {"temperature": 0}
66+
calls = []
67+
68+
async def one_argument(self, messages):
69+
calls.append(("one", messages))
70+
return []
71+
72+
async def two_arguments(self, messages, model_request_parameters):
73+
calls.append(("two", messages, model_request_parameters))
74+
return []
75+
76+
async def three_arguments(
77+
self, messages, model_request_parameters, *, model_settings=None
78+
):
79+
calls.append(("three", messages, model_request_parameters, model_settings))
80+
return []
81+
82+
original = OpenAIChatModel._map_messages
83+
try:
84+
for base_method in (one_argument, two_arguments, three_arguments):
85+
OpenAIChatModel._map_messages = base_method
86+
result = asyncio.run(
87+
model._map_messages(
88+
history,
89+
request_parameters,
90+
model_settings=model_settings,
91+
)
92+
)
93+
assert result == []
94+
finally:
95+
OpenAIChatModel._map_messages = original
96+
97+
assert calls == [
98+
("one", history),
99+
("two", history, request_parameters),
100+
("three", history, request_parameters, model_settings),
101+
]
102+
103+
60104
def test_injects_breakpoints_on_system_and_final_message():
61105
_CACHE_UNSUPPORTED.clear()
62106
messages = _map(_make_model())

0 commit comments

Comments
 (0)