Skip to content

Commit 852fbaa

Browse files
Pass along logprobs
1 parent 473e0a2 commit 852fbaa

2 files changed

Lines changed: 36 additions & 3 deletions

File tree

src/agents/extensions/models/litellm_model.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
)
2727
from openai.types.chat.chat_completion_message_tool_call import Function
2828
from openai.types.responses import Response
29+
from openai.types.responses.response_output_text import Logprob, LogprobTopLogprob
2930

3031
from ... import _debug
3132
from ...agent_output import AgentOutputSchemaBase
@@ -51,6 +52,7 @@ class InternalChatCompletionMessage(ChatCompletionMessage):
5152
"""
5253

5354
reasoning_content: str
55+
logprobs: list[Logprob] | None
5456

5557

5658
class 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:
356360
class 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

src/agents/models/chatcmpl_converter.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,12 @@ def message_to_output_items(cls, message: ChatCompletionMessage) -> list[TRespon
112112
)
113113
if message.content:
114114
message_item.content.append(
115-
ResponseOutputText(text=message.content, type="output_text", annotations=[])
115+
ResponseOutputText(
116+
text=message.content,
117+
type="output_text",
118+
annotations=[],
119+
logprobs=getattr(message, "logprobs", None),
120+
)
116121
)
117122
if message.refusal:
118123
message_item.content.append(

0 commit comments

Comments
 (0)