Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/gen/gen_ai_hub/orchestration_v2/models/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,14 @@ class AssistantMessage(BaseModel):
refusal: A string indicating refusal reason.

tool_calls: A list of tool call objects.

reasoning_content: A list of reasoning content blocks.
"""
role: Role = Role.ASSISTANT
content: Optional[Union[str, List[TextPart]]] = None
refusal: Optional[str] = None
tool_calls: Optional[List[MessageToolCall]] = None
reasoning_content: Optional[List[ReasoningBlock]] = None


class ToolChatMessage(BaseModel):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from pydantic import ConfigDict, Field

from gen_ai_hub.orchestration_v2.models.base import ResponseBaseModel
from gen_ai_hub.orchestration_v2.models.message import ChatMessage, FunctionCall, ResponseChatMessage
from gen_ai_hub.orchestration_v2.models.message import ChatMessage, FunctionCall, ReasoningBlock, ResponseChatMessage



Expand Down Expand Up @@ -189,6 +189,7 @@ class StreamDelta(ResponseBaseModel):
content: str
tool_calls: Optional[List[StreamToolCall]] = None
refusal: Optional[str] = None
reasoning_content: Optional[List[ReasoningBlock]] = None


class StreamLLMChoice(ResponseBaseModel):
Expand Down
21 changes: 18 additions & 3 deletions packages/gen/tests/orchestration_v2/test_message_v2.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import unittest

from gen_ai_hub.orchestration_v2.models.message import (
ReasoningBlock,
AssistantMessage,
FunctionCall,
MessageToolCall,
ReasoningBlock,
ResponseChatMessage,
)
from gen_ai_hub.orchestration_v2.models.response import (
Expand Down Expand Up @@ -36,7 +37,7 @@

class TestResponseChatMessageValidation(unittest.TestCase):

def test_reasoning_content_deserialized_from_dict(self):
def test_deserialization_from_dict(self):
msg = ResponseChatMessage.model_validate({
"role": "assistant",
"content": "Hello",
Expand All @@ -49,6 +50,20 @@ def test_reasoning_content_optional(self):
msg = ResponseChatMessage.model_validate({"role": "assistant", "content": "Hello"})
self.assertIsNone(msg.reasoning_content)

class TestAssistantMessageValidation(unittest.TestCase):

def test_deserialization_from_dict(self):
msg = AssistantMessage.model_validate({
"content": "Hello",
"reasoning_content": [{"content": "I think...", "signature": "sig123"}],
})
self.assertIsNotNone(msg.reasoning_content)
self.assertIsInstance(msg.reasoning_content[0], ReasoningBlock)

def test_reasoning_content_optional(self):
msg = AssistantMessage.model_validate({"role": "assistant", "content": "Hello"})
self.assertIsNone(msg.reasoning_content)

class TestExtraFieldsAllowed(unittest.TestCase):
"""Response-side models (ResponseBaseModel subclasses) must silently accept
unknown fields so that new API attributes never break existing clients."""
Expand Down Expand Up @@ -246,4 +261,4 @@ def test_orchestration_response_with_retries_stores_extra_field(self):
},
"extra_field": "extra",
})
self.assertEqual(resp.extra_field, "extra")
self.assertEqual(resp.extra_field, "extra")
Loading