2626)
2727from openai .types .chat .chat_completion_message_tool_call import Function
2828from openai .types .responses import Response
29+ from openai .types .responses .response_output_text import Logprob , LogprobTopLogprob
2930
3031from ... import _debug
3132from ...agent_output import AgentOutputSchemaBase
@@ -51,6 +52,7 @@ class InternalChatCompletionMessage(ChatCompletionMessage):
5152 """
5253
5354 reasoning_content : str
55+ logprobs : list [Logprob ] | None
5456
5557
5658class LitellmModel (Model ):
@@ -149,7 +151,9 @@ async def get_response(
149151 }
150152
151153 items = Converter .message_to_output_items (
152- LitellmConverter .convert_message_to_openai (response .choices [0 ].message )
154+ LitellmConverter .convert_message_to_openai (
155+ response .choices [0 ].message , response .choices [0 ].logprobs
156+ )
153157 )
154158
155159 return ModelResponse (
@@ -356,7 +360,9 @@ def _remove_not_given(self, value: Any) -> Any:
356360class LitellmConverter :
357361 @classmethod
358362 def convert_message_to_openai (
359- cls , message : litellm .types .utils .Message
363+ cls ,
364+ message : litellm .types .utils .Message ,
365+ logprobs : litellm .types .utils .ChoiceLogprobs | None = None ,
360366 ) -> ChatCompletionMessage :
361367 if message .role != "assistant" :
362368 raise ModelBehaviorError (f"Unsupported role: { message .role } " )
@@ -384,8 +390,30 @@ def convert_message_to_openai(
384390 audio = message .get ("audio" , None ), # litellm deletes audio if not present
385391 tool_calls = tool_calls ,
386392 reasoning_content = reasoning_content ,
393+ logprobs = cls .convert_logprobs_to_openai (logprobs ) if logprobs else None ,
387394 )
388395
396+ @classmethod
397+ def convert_logprobs_to_openai (
398+ cls , logprobs : litellm .types .utils .ChoiceLogprobs
399+ ) -> list [Logprob ]:
400+ return [
401+ Logprob (
402+ token = logprob .token ,
403+ logprob = logprob .logprob ,
404+ bytes = cast (list [int ], logprob .bytes ),
405+ top_logprobs = [
406+ LogprobTopLogprob (
407+ token = top_logprob .token ,
408+ logprob = top_logprob .logprob ,
409+ bytes = cast (list [int ], top_logprob .bytes ),
410+ )
411+ for top_logprob in logprob .top_logprobs
412+ ],
413+ )
414+ for logprob in logprobs .content or []
415+ ]
416+
389417 @classmethod
390418 def convert_annotations_to_openai (
391419 cls , message : litellm .types .utils .Message
0 commit comments