From a4420669e7d4c714fc3a572cfe12ea830ec539b1 Mon Sep 17 00:00:00 2001 From: Gracjan Sadowicz <25389585+poissoncorp@users.noreply.github.com> Date: Wed, 7 Oct 2026 12:51:39 +0200 Subject: [PATCH] RDBC-1148 Add created_at to AiConversationMessagesResult --- .../agents/get_conversation_messages_operation.py | 4 ++++ .../test_ai_conversation_messages.py | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/ravendb/documents/operations/ai/agents/get_conversation_messages_operation.py b/ravendb/documents/operations/ai/agents/get_conversation_messages_operation.py index 20249dec..e9112ca2 100644 --- a/ravendb/documents/operations/ai/agents/get_conversation_messages_operation.py +++ b/ravendb/documents/operations/ai/agents/get_conversation_messages_operation.py @@ -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 @@ -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. @@ -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, @@ -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"), diff --git a/ravendb/tests/ai_agent_tests/test_ai_conversation_messages.py b/ravendb/tests/ai_agent_tests/test_ai_conversation_messages.py index 9284c1d3..1891fb49 100644 --- a/ravendb/tests/ai_agent_tests/test_ai_conversation_messages.py +++ b/ravendb/tests/ai_agent_tests/test_ai_conversation_messages.py @@ -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"], @@ -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