Skip to content

Commit 8012ab8

Browse files
fix: use model_dump() instead of deprecated dict() in OpenAI output paths
The pydantic v1 .dict() API emits PydanticDeprecatedSince20 on pydantic v2, which breaks anyone running with DeprecationWarnings as errors. Every supported openai/openai-agents version requires pydantic v2, so model_dump() is a drop-in replacement here. Fixes #7827.
1 parent 8afefe8 commit 8012ab8

3 files changed

Lines changed: 58 additions & 7 deletions

File tree

‎sentry_sdk/integrations/openai.py‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -730,15 +730,15 @@ def _set_common_output_data(
730730
if record_outputs:
731731
for output in response.output:
732732
if output.type == "function_call":
733-
output_messages["tool"].append(output.dict())
733+
output_messages["tool"].append(output.model_dump())
734734
elif output.type == "message":
735735
for output_message in output.content:
736736
try:
737737
output_messages["response"].append(output_message.text) # type: ignore[union-attr]
738738
except AttributeError:
739739
# Unknown output message type, just return the json
740740
output_messages["response"].append(
741-
output_message.dict()
741+
output_message.model_dump()
742742
)
743743

744744
if len(output_messages["tool"]) > 0:
@@ -761,14 +761,16 @@ def _set_common_output_data(
761761
):
762762
for output in response.output:
763763
if output.type == "function_call":
764-
output_messages["tool"].append(output.dict())
764+
output_messages["tool"].append(output.model_dump())
765765
elif output.type == "message":
766766
for output_message in output.content:
767767
try:
768768
output_messages["response"].append(output_message.text) # type: ignore[union-attr]
769769
except AttributeError:
770770
# Unknown output message type, just return the json
771-
output_messages["response"].append(output_message.dict())
771+
output_messages["response"].append(
772+
output_message.model_dump()
773+
)
772774

773775
if len(output_messages["tool"]) > 0:
774776
set_data_normalized(

‎sentry_sdk/integrations/openai_agents/utils.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,14 +226,14 @@ def _set_output_data(
226226

227227
for output in result.output:
228228
if output.type == "function_call":
229-
output_messages["tool"].append(output.dict())
229+
output_messages["tool"].append(output.model_dump())
230230
elif output.type == "message":
231231
for output_message in output.content:
232232
try:
233233
output_messages["response"].append(output_message.text)
234234
except AttributeError:
235235
# Unknown output message type, just return the json
236-
output_messages["response"].append(output_message.dict())
236+
output_messages["response"].append(output_message.model_dump())
237237

238238
if record_outputs and len(output_messages["tool"]) > 0:
239239
if isinstance(span, StreamedSpan):

‎tests/integrations/openai_agents/test_openai_agents.py‎

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import json
33
import logging
44
import os
5+
import warnings
6+
from types import SimpleNamespace
57
from unittest import mock
68
from unittest.mock import MagicMock, patch
79

@@ -20,6 +22,7 @@
2022
from agents.items import (
2123
ResponseFunctionToolCall,
2224
ResponseOutputMessage,
25+
ResponseOutputRefusal,
2326
ResponseOutputText,
2427
)
2528
from agents.models.openai_responses import OpenAIResponsesModel
@@ -72,7 +75,11 @@
7275
from sentry_sdk.consts import OP, SPANDATA
7376
from sentry_sdk.integrations.logging import LoggingIntegration
7477
from sentry_sdk.integrations.openai_agents import OpenAIAgentsIntegration
75-
from sentry_sdk.integrations.openai_agents.utils import _set_input_data, safe_serialize
78+
from sentry_sdk.integrations.openai_agents.utils import (
79+
_set_input_data,
80+
_set_output_data,
81+
safe_serialize,
82+
)
7683
from sentry_sdk.integrations.stdlib import StdlibIntegration
7784
from sentry_sdk.utils import package_version, parse_version
7885

@@ -7483,3 +7490,45 @@ async def test_runner_run_streamed_with_starting_agent_kwarg(
74837490

74847491
(transaction,) = events
74857492
assert transaction["transaction"] == "test_agent workflow"
7493+
7494+
7495+
def test_set_output_data_tool_calls_no_pydantic_deprecation(sentry_init):
7496+
"""Serializing tool-call output must not use the deprecated pydantic v1 API.
7497+
7498+
Regression test for GH-7827: _set_output_data called BaseModel.dict(),
7499+
which raises PydanticDeprecatedSince20 when DeprecationWarnings are errors.
7500+
"""
7501+
sentry_init(
7502+
integrations=[OpenAIAgentsIntegration()],
7503+
send_default_pii=True,
7504+
traces_sample_rate=1.0,
7505+
)
7506+
7507+
tool_call = ResponseFunctionToolCall(
7508+
type="function_call",
7509+
id="call_1",
7510+
call_id="call_1",
7511+
name="get_weather",
7512+
arguments='{"city": "Berlin"}',
7513+
status="completed",
7514+
)
7515+
refusal = ResponseOutputRefusal(type="refusal", refusal="I cannot help.")
7516+
message = ResponseOutputMessage(
7517+
type="message",
7518+
id="msg_1",
7519+
role="assistant",
7520+
content=[refusal],
7521+
status="completed",
7522+
)
7523+
result = SimpleNamespace(output=[tool_call, message])
7524+
7525+
with start_span(op="test") as span:
7526+
with warnings.catch_warnings():
7527+
warnings.simplefilter("error", DeprecationWarning)
7528+
_set_output_data(span, result)
7529+
7530+
tool_calls = json.loads(span._data[SPANDATA.GEN_AI_RESPONSE_TOOL_CALLS])
7531+
assert tool_calls[0]["name"] == "get_weather"
7532+
assert tool_calls[0]["arguments"] == '{"city": "Berlin"}'
7533+
7534+
assert "I cannot help." in span._data[SPANDATA.GEN_AI_RESPONSE_TEXT]

0 commit comments

Comments
 (0)