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
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ def __init__(
has_more_messages: bool = False,
sub_conversation_ids: Optional[List[str]] = None,
attachments: Optional[List[str]] = None,
created_at: Optional[datetime] = None,
):
self.conversation_id = conversation_id
self.agent = agent
Expand All @@ -158,6 +159,7 @@ def __init__(
# Cumulative token usage across every turn of the conversation.
self.total_usage = total_usage
self.last_message_at = last_message_at
self.created_at = created_at
# Chronological, oldest first.
self.messages = messages
# Older messages exist for backward/default paging, newer ones for `after` paging.
Expand All @@ -172,6 +174,7 @@ def to_json(self) -> Dict[str, Any]:
"Parameters": self.parameters,
"TotalUsage": self.total_usage.to_json() if self.total_usage else None,
"LastMessageAt": Utils.datetime_to_string(self.last_message_at),
"CreatedAt": Utils.datetime_to_string(self.created_at),
"HasMoreMessages": self.has_more_messages,
"SubConversationIds": self.sub_conversation_ids,
"Attachments": self.attachments,
Expand All @@ -188,6 +191,7 @@ def from_json(cls, json_dict: Dict[str, Any]) -> AiConversationMessagesResult:
parameters=json_dict.get("Parameters"),
total_usage=AiUsage.from_json(total_usage) if total_usage else None,
last_message_at=Utils.string_to_datetime(json_dict.get("LastMessageAt")),
created_at=Utils.string_to_datetime(json_dict.get("CreatedAt")),
messages=[AiConversationMessage.from_json(message) for message in messages] if messages else None,
has_more_messages=json_dict.get("HasMoreMessages", False),
sub_conversation_ids=json_dict.get("SubConversationIds"),
Expand Down
15 changes: 15 additions & 0 deletions ravendb/tests/ai_agent_tests/test_ai_conversation_messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ class TestAiConversationMessagesResult(unittest.TestCase):
"Parameters": {"customer": "ALFKI", "tags": ["vip", "eu"], "retries": 2},
"TotalUsage": {"PromptTokens": 10, "CompletionTokens": 5, "TotalTokens": 15, "ReasoningTokens": 3},
"LastMessageAt": "2026-06-16T10:30:05.0000000",
"CreatedAt": "2026-06-16T10:29:58.0000000",
"HasMoreMessages": True,
"SubConversationIds": ["chats/1-A/sub/1"],
"Attachments": ["invoice.pdf"],
Expand Down Expand Up @@ -145,6 +146,20 @@ def test_result_parses_the_conversation_envelope(self):
self.assertEqual(["invoice.pdf"], result.attachments)
self.assertEqual(datetime(2026, 6, 16, 10, 30, 5), result.last_message_at)

def test_result_carries_the_conversation_creation_time(self):
result = AiConversationMessagesResult.from_json(self.RESPONSE)

self.assertEqual(datetime(2026, 6, 16, 10, 29, 58), result.created_at)
self.assertEqual("2026-06-16T10:29:58.0000000", result.to_json()["CreatedAt"])

def test_created_at_is_unset_when_the_server_does_not_send_it(self):
response = {key: value for key, value in self.RESPONSE.items() if key != "CreatedAt"}

result = AiConversationMessagesResult.from_json(response)

self.assertIsNone(result.created_at)
self.assertIsNone(result.to_json()["CreatedAt"])

def test_heterogeneous_parameters_come_back_as_they_are(self):
# Parameter values mix primitives and arrays, so they are handed over untouched.
parameters = AiConversationMessagesResult.from_json(self.RESPONSE).parameters
Expand Down
Loading