From af9aba4d1336806de8e9889b42632bec9ec55502 Mon Sep 17 00:00:00 2001 From: zkllll2002 Date: Mon, 14 Jul 2025 15:32:02 +0800 Subject: [PATCH 1/2] fix --- src/agents/extensions/models/litellm_model.py | 17 +++++++++++++++-- src/agents/models/chatcmpl_converter.py | 13 ++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/agents/extensions/models/litellm_model.py b/src/agents/extensions/models/litellm_model.py index a06c61dc3..cbcf8e6a4 100644 --- a/src/agents/extensions/models/litellm_model.py +++ b/src/agents/extensions/models/litellm_model.py @@ -3,7 +3,7 @@ import json import time from collections.abc import AsyncIterator -from typing import Any, Literal, cast, overload +from typing import Any, Literal, Optional, cast, overload from openai.types.responses.response_usage import InputTokensDetails, OutputTokensDetails @@ -45,6 +45,14 @@ from ...usage import Usage +class InternalChatCompletionMessage(ChatCompletionMessage): + """ + An internal subclass to carry reasoning_content without modifying the original model. + """ + + reasoning_content: Optional[str] = None + + class LitellmModel(Model): """This class enables using any model via LiteLLM. LiteLLM allows you to acess OpenAPI, Anthropic, Gemini, Mistral, and many other models. @@ -364,13 +372,18 @@ def convert_message_to_openai( provider_specific_fields.get("refusal", None) if provider_specific_fields else None ) - return ChatCompletionMessage( + reasoning_content = "" + if hasattr(message, "reasoning_content") and message.reasoning_content: + reasoning_content = message.reasoning_content + + return InternalChatCompletionMessage( content=message.content, refusal=refusal, role="assistant", annotations=cls.convert_annotations_to_openai(message), audio=message.get("audio", None), # litellm deletes audio if not present tool_calls=tool_calls, + reasoning_content=reasoning_content, ) @classmethod diff --git a/src/agents/models/chatcmpl_converter.py b/src/agents/models/chatcmpl_converter.py index d3c71c24e..425b86322 100644 --- a/src/agents/models/chatcmpl_converter.py +++ b/src/agents/models/chatcmpl_converter.py @@ -36,6 +36,7 @@ ResponseOutputRefusal, ResponseOutputText, ResponseReasoningItem, + ResponseReasoningItemParam, ) from openai.types.responses.response_input_param import FunctionCallOutput, ItemReference, Message from openai.types.responses.response_reasoning_item import Summary @@ -210,6 +211,12 @@ def maybe_response_output_message(cls, item: Any) -> ResponseOutputMessageParam return cast(ResponseOutputMessageParam, item) return None + @classmethod + def maybe_reasoning_message(cls, item: Any) -> ResponseReasoningItemParam | None: + if isinstance(item, dict) and item.get("type") == "reasoning": + return cast(ResponseReasoningItemParam, item) + return None + @classmethod def extract_text_content( cls, content: str | Iterable[ResponseInputContentParam] @@ -459,7 +466,11 @@ def ensure_assistant_message() -> ChatCompletionAssistantMessageParam: f"Encountered an item_reference, which is not supported: {item_ref}" ) - # 7) If we haven't recognized it => fail or ignore + # 7) reasoning message => not handled + elif cls.maybe_reasoning_message(item): + pass + + # 8) If we haven't recognized it => fail or ignore else: raise UserError(f"Unhandled item type or structure: {item}") From 0bc5ec861c081a5f2645c2e2ccbf5ad16d915ed0 Mon Sep 17 00:00:00 2001 From: zkllll2002 Date: Wed, 23 Jul 2025 13:16:22 +0800 Subject: [PATCH 2/2] fix --- src/agents/extensions/models/litellm_model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/agents/extensions/models/litellm_model.py b/src/agents/extensions/models/litellm_model.py index cbcf8e6a4..b01b84253 100644 --- a/src/agents/extensions/models/litellm_model.py +++ b/src/agents/extensions/models/litellm_model.py @@ -3,7 +3,7 @@ import json import time from collections.abc import AsyncIterator -from typing import Any, Literal, Optional, cast, overload +from typing import Any, Literal, cast, overload from openai.types.responses.response_usage import InputTokensDetails, OutputTokensDetails @@ -50,7 +50,7 @@ class InternalChatCompletionMessage(ChatCompletionMessage): An internal subclass to carry reasoning_content without modifying the original model. """ - reasoning_content: Optional[str] = None + reasoning_content: str class LitellmModel(Model):