[responsesAPI][bugfix] serialize harmony messages (#26185)
Signed-off-by: Andrew Xia <axia@meta.com> Co-authored-by: Ye (Charlotte) Qi <yeq@meta.com>
This commit is contained in:
@@ -63,6 +63,7 @@ from pydantic import (
|
||||
Field,
|
||||
TypeAdapter,
|
||||
ValidationInfo,
|
||||
field_serializer,
|
||||
field_validator,
|
||||
model_validator,
|
||||
)
|
||||
@@ -2078,11 +2079,6 @@ class ResponsesResponse(OpenAIBaseModel):
|
||||
model: str
|
||||
object: Literal["response"] = "response"
|
||||
output: list[ResponseOutputItem]
|
||||
# These are populated when enable_response_messages is set to True
|
||||
# TODO: Currently an issue where content of harmony messages
|
||||
# is not available when these are serialized. Metadata is available
|
||||
input_messages: Optional[list[ChatCompletionMessageParam]] = None
|
||||
output_messages: Optional[list[ChatCompletionMessageParam]] = None
|
||||
parallel_tool_calls: bool
|
||||
temperature: float
|
||||
tool_choice: ToolChoice
|
||||
@@ -2102,6 +2098,49 @@ class ResponsesResponse(OpenAIBaseModel):
|
||||
usage: Optional[ResponseUsage] = None
|
||||
user: Optional[str] = None
|
||||
|
||||
# --8<-- [start:responses-extra-params]
|
||||
# These are populated when enable_response_messages is set to True
|
||||
# NOTE: custom serialization is needed
|
||||
# see serialize_input_messages and serialize_output_messages
|
||||
input_messages: Optional[list[ChatCompletionMessageParam]] = None
|
||||
output_messages: Optional[list[ChatCompletionMessageParam]] = None
|
||||
# --8<-- [end:responses-extra-params]
|
||||
|
||||
# NOTE: openAI harmony doesn't serialize TextContent properly,
|
||||
# TODO: this fixes for TextContent, but need to verify for tools etc
|
||||
# https://github.com/openai/harmony/issues/78
|
||||
@field_serializer("output_messages", when_used="json")
|
||||
def serialize_output_messages(self, msgs, _info):
|
||||
if msgs:
|
||||
serialized = []
|
||||
for m in msgs:
|
||||
if isinstance(m, dict):
|
||||
serialized.append(m)
|
||||
elif hasattr(m, "__dict__"):
|
||||
serialized.append(m.to_dict())
|
||||
else:
|
||||
# fallback to pyandic dump
|
||||
serialized.append(m.model_dump_json())
|
||||
return serialized
|
||||
return None
|
||||
|
||||
# NOTE: openAI harmony doesn't serialize TextContent properly, this fixes it
|
||||
# https://github.com/openai/harmony/issues/78
|
||||
@field_serializer("input_messages", when_used="json")
|
||||
def serialize_input_messages(self, msgs, _info):
|
||||
if msgs:
|
||||
serialized = []
|
||||
for m in msgs:
|
||||
if isinstance(m, dict):
|
||||
serialized.append(m)
|
||||
elif hasattr(m, "__dict__"):
|
||||
serialized.append(m.to_dict())
|
||||
else:
|
||||
# fallback to pyandic dump
|
||||
serialized.append(m.model_dump_json())
|
||||
return serialized
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def from_request(
|
||||
cls,
|
||||
|
||||
@@ -1876,6 +1876,6 @@ class OpenAIServingResponses(OpenAIServing):
|
||||
ResponseCompletedEvent(
|
||||
type="response.completed",
|
||||
sequence_number=-1,
|
||||
response=final_response.model_dump(),
|
||||
response=final_response,
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user