diff --git a/python/packages/anthropic/agent_framework_anthropic/_chat_client.py b/python/packages/anthropic/agent_framework_anthropic/_chat_client.py index ab9b1d79a09..5cc91b1efed 100644 --- a/python/packages/anthropic/agent_framework_anthropic/_chat_client.py +++ b/python/packages/anthropic/agent_framework_anthropic/_chat_client.py @@ -746,7 +746,8 @@ def _prepare_options( # Handle user option -> metadata.user_id (Anthropic uses metadata.user_id instead of user) if user := run_options.pop("user", None): - metadata = run_options.get("metadata", {}) + # Copy so the caller's metadata dict is not modified across requests. + metadata = dict(run_options.get("metadata") or {}) if "user_id" not in metadata: metadata["user_id"] = user run_options["metadata"] = metadata diff --git a/python/packages/anthropic/tests/test_anthropic_client.py b/python/packages/anthropic/tests/test_anthropic_client.py index 30de6f63193..fb35902fe74 100644 --- a/python/packages/anthropic/tests/test_anthropic_client.py +++ b/python/packages/anthropic/tests/test_anthropic_client.py @@ -3662,6 +3662,23 @@ def test_prepare_options_user_metadata_no_override( assert result["metadata"]["user_id"] == "existing_user" +def test_prepare_options_user_does_not_mutate_caller_metadata( + mock_anthropic_client: MagicMock, +) -> None: + """Test mapping user to metadata.user_id leaves the caller's metadata dict untouched.""" + client = create_test_anthropic_client(mock_anthropic_client) + + messages = [Message(role="user", contents=[Content.from_text("Hello")])] + metadata = {"trace": "t1"} + + first = client._prepare_options(messages, {"user": "alice", "metadata": metadata}) + second = client._prepare_options(messages, {"user": "bob", "metadata": metadata}) + + assert metadata == {"trace": "t1"} + assert first["metadata"] == {"trace": "t1", "user_id": "alice"} + assert second["metadata"] == {"trace": "t1", "user_id": "bob"} + + def test_process_stream_event_message_stop(mock_anthropic_client: MagicMock) -> None: """Test processing message_stop event.""" client = create_test_anthropic_client(mock_anthropic_client)