refactor(openai): collapse duplicated add_message branches and drop deprecated .dict()

This commit is contained in:
mateo-berri 2026-08-17 19:25:38 +00:00
parent e7c6c653a5
commit 2adfed279e
No known key found for this signature in database
4 changed files with 86 additions and 19 deletions

View file

@ -18,7 +18,7 @@
"limit": 40
},
"reportDeprecated": {
"limit": 201
"limit": 197
},
"reportDuplicateImport": {
"limit": 19

View file

@ -2465,13 +2465,9 @@ class OpenAIAssistantsAPI(BaseLLM):
**message_data,
)
response_obj: OpenAIMessage | None = None
if getattr(thread_message, "status", None) is None:
thread_message.status = "completed"
response_obj = OpenAIMessage.model_validate(thread_message.dict())
else:
response_obj = OpenAIMessage.model_validate(thread_message.dict())
return response_obj
return OpenAIMessage.model_validate(thread_message.model_dump())
# fmt: off
@ -2544,13 +2540,9 @@ class OpenAIAssistantsAPI(BaseLLM):
**message_data,
)
response_obj: OpenAIMessage | None = None
if getattr(thread_message, "status", None) is None:
thread_message.status = "completed"
response_obj = OpenAIMessage.model_validate(thread_message.dict())
else:
response_obj = OpenAIMessage.model_validate(thread_message.dict())
return response_obj
return OpenAIMessage.model_validate(thread_message.model_dump())
async def async_get_messages(
self,

View file

@ -3,7 +3,7 @@ import pytest
from openai import AsyncOpenAI, OpenAI
from litellm.llms.openai.openai import OpenAIAssistantsAPI
from litellm.types.llms.openai import Thread
from litellm.types.llms.openai import OpenAIMessage, Thread
_THREAD_PAYLOAD = {
"id": "thread_123",
@ -13,6 +13,20 @@ _THREAD_PAYLOAD = {
"unexpected_upstream_field": "kept",
}
_MESSAGE_PAYLOAD = {
"id": "msg_123",
"object": "thread.message",
"created_at": 1700000000,
"thread_id": "thread_123",
"role": "assistant",
"status": "in_progress",
"content": [{"type": "text", "text": {"value": "hi", "annotations": []}}],
"metadata": {"origin": "unit-test"},
"run_id": "run_123",
"assistant_id": "asst_123",
"unexpected_upstream_field": "kept",
}
_COMMON_ARGS = {
"api_key": "test-key",
"api_base": "https://api.openai.com/v1",
@ -22,23 +36,26 @@ _COMMON_ARGS = {
}
def _handler(request: httpx.Request) -> httpx.Response:
return httpx.Response(200, json=_THREAD_PAYLOAD)
def _transport(payload: dict) -> httpx.MockTransport:
def handler(request: httpx.Request) -> httpx.Response:
return httpx.Response(200, json=payload)
return httpx.MockTransport(handler)
def _async_client() -> AsyncOpenAI:
def _async_client(payload: dict = _THREAD_PAYLOAD) -> AsyncOpenAI:
"""A real AsyncOpenAI wired to a mock transport, so the SDK's own response parsing
runs and the handler under test receives exactly what production would."""
return AsyncOpenAI(
api_key="test-key",
http_client=httpx.AsyncClient(transport=httpx.MockTransport(_handler)),
http_client=httpx.AsyncClient(transport=_transport(payload)),
)
def _sync_client() -> OpenAI:
def _sync_client(payload: dict = _THREAD_PAYLOAD) -> OpenAI:
return OpenAI(
api_key="test-key",
http_client=httpx.Client(transport=httpx.MockTransport(_handler)),
http_client=httpx.Client(transport=_transport(payload)),
)
@ -73,6 +90,64 @@ async def test_async_thread_responses_preserve_declared_fields():
_assert_thread(retrieved)
def _assert_message(result: object) -> None:
assert isinstance(result, OpenAIMessage)
assert result.id == "msg_123"
assert result.thread_id == "thread_123"
assert result.role == "assistant"
assert result.metadata == {"origin": "unit-test"}
assert result.model_dump()["unexpected_upstream_field"] == "kept"
@pytest.mark.asyncio
async def test_a_add_message_preserves_fields_and_defaults_status():
api = OpenAIAssistantsAPI()
result = await api.a_add_message(
thread_id="thread_123",
message_data={"role": "user", "content": "hi"},
client=_async_client(_MESSAGE_PAYLOAD),
**_COMMON_ARGS,
)
_assert_message(result)
assert result.status == "in_progress"
without_status = {k: v for k, v in _MESSAGE_PAYLOAD.items() if k != "status"}
defaulted = await api.a_add_message(
thread_id="thread_123",
message_data={"role": "user", "content": "hi"},
client=_async_client(without_status),
**_COMMON_ARGS,
)
assert defaulted.status == "completed"
def test_sync_add_message_preserves_fields_and_defaults_status():
api = OpenAIAssistantsAPI()
result = api.add_message(
thread_id="thread_123",
message_data={"role": "user", "content": "hi"},
client=_sync_client(_MESSAGE_PAYLOAD),
**_COMMON_ARGS,
)
_assert_message(result)
assert result.status == "in_progress"
without_status = {k: v for k, v in _MESSAGE_PAYLOAD.items() if k != "status"}
defaulted = api.add_message(
thread_id="thread_123",
message_data={"role": "user", "content": "hi"},
client=_sync_client(without_status),
**_COMMON_ARGS,
)
assert defaulted.status == "completed"
def test_sync_thread_responses_preserve_declared_fields():
api = OpenAIAssistantsAPI()

View file

@ -27,7 +27,7 @@
"limit": 0
},
"LIT010": {
"limit": 16707
"limit": 16701
},
"LIT011": {
"limit": 5591