diff --git a/python/packages/openai/agent_framework_openai/_chat_client.py b/python/packages/openai/agent_framework_openai/_chat_client.py index 5b7584dc6d..c8a41a204f 100644 --- a/python/packages/openai/agent_framework_openai/_chat_client.py +++ b/python/packages/openai/agent_framework_openai/_chat_client.py @@ -2028,6 +2028,7 @@ def _parse_chunk_from_openai( local_shell_tool_name = self._get_local_shell_tool_name(options.get("tools")) conversation_id: str | None = None response_id: str | None = None + created_at: str | None = None continuation_token: OpenAIContinuationToken | None = None model = self.model match event.type: @@ -2209,6 +2210,9 @@ def _parse_chunk_from_openai( response_id = event.response.id conversation_id = self._get_conversation_id(event.response, options.get("store")) model = event.response.model + created_at = datetime.fromtimestamp(event.response.created_at, tz=timezone.utc).strftime( + "%Y-%m-%dT%H:%M:%S.%fZ" + ) if event.response.usage: usage = self._parse_usage_from_openai(event.response.usage) if usage: @@ -2589,6 +2593,7 @@ def _get_ann_value(key: str) -> Any: response_id=response_id, role="assistant", model=model, + created_at=created_at, continuation_token=continuation_token, additional_properties=metadata, raw_representation=event, diff --git a/python/packages/openai/tests/openai/test_openai_chat_client.py b/python/packages/openai/tests/openai/test_openai_chat_client.py index 8c956a6339..7624f30b65 100644 --- a/python/packages/openai/tests/openai/test_openai_chat_client.py +++ b/python/packages/openai/tests/openai/test_openai_chat_client.py @@ -2192,6 +2192,7 @@ def test_streaming_chunk_with_usage_only() -> None: mock_event.response.id = "resp_usage" mock_event.response.model = "test-model" mock_event.response.conversation = None + mock_event.response.created_at = 1000000000.0 mock_event.response.usage = MagicMock() mock_event.response.usage.input_tokens = 50 mock_event.response.usage.output_tokens = 25 @@ -4438,6 +4439,7 @@ def test_streaming_response_completed_no_continuation_token() -> None: mock_event.response.conversation = MagicMock() mock_event.response.conversation.id = "conv_done" mock_event.response.model = "test-model" + mock_event.response.created_at = 1000000000.0 mock_event.response.usage = None update = client._parse_chunk_from_openai(mock_event, chat_options, function_call_ids) @@ -4445,6 +4447,28 @@ def test_streaming_response_completed_no_continuation_token() -> None: assert update.continuation_token is None +def test_streaming_response_completed_sets_created_at() -> None: + """Test that response.completed sets created_at on the ChatResponseUpdate.""" + client = OpenAIChatClient(model="test-model", api_key="test-key") + chat_options: dict[str, Any] = {} + function_call_ids: dict[int, tuple[str, str]] = {} + + mock_event = MagicMock() + mock_event.type = "response.completed" + mock_event.response = MagicMock() + mock_event.response.id = "resp_created" + mock_event.response.conversation = MagicMock() + mock_event.response.conversation.id = "conv_created" + mock_event.response.model = "test-model" + mock_event.response.created_at = 1000000000.0 + mock_event.response.usage = None + + update = client._parse_chunk_from_openai(mock_event, chat_options, function_call_ids) + + assert update.created_at is not None + assert update.created_at == "2001-09-09T01:46:40.000000Z" + + def test_map_chat_to_agent_update_preserves_continuation_token() -> None: """Test that map_chat_to_agent_update propagates continuation_token.""" from agent_framework._types import map_chat_to_agent_update diff --git a/python/samples/02-agents/conversations/file_history_provider.py b/python/samples/02-agents/conversations/file_history_provider.py index 04a87f8224..20735ffd17 100644 --- a/python/samples/02-agents/conversations/file_history_provider.py +++ b/python/samples/02-agents/conversations/file_history_provider.py @@ -21,7 +21,7 @@ from pydantic import Field try: - import orjson + import orjson # pyright: ignore[reportMissingImports] except ImportError: orjson = None diff --git a/python/samples/02-agents/conversations/file_history_provider_conversation_persistence.py b/python/samples/02-agents/conversations/file_history_provider_conversation_persistence.py index 70c5d7e8e8..693501b0f9 100644 --- a/python/samples/02-agents/conversations/file_history_provider_conversation_persistence.py +++ b/python/samples/02-agents/conversations/file_history_provider_conversation_persistence.py @@ -22,7 +22,7 @@ from pydantic import Field try: - import orjson + import orjson # pyright: ignore[reportMissingImports] except ImportError: orjson = None