diff --git a/packages/opentelemetry-instrumentation-haystack/opentelemetry/instrumentation/haystack/utils.py b/packages/opentelemetry-instrumentation-haystack/opentelemetry/instrumentation/haystack/utils.py index cbb3b8a437..14e0898daa 100644 --- a/packages/opentelemetry-instrumentation-haystack/opentelemetry/instrumentation/haystack/utils.py +++ b/packages/opentelemetry-instrumentation-haystack/opentelemetry/instrumentation/haystack/utils.py @@ -15,6 +15,8 @@ def default(self, o): return dataclasses.asdict(o) if hasattr(o, "to_json"): return o.to_json() + if hasattr(o, "model_dump_json"): + return o.model_dump_json() return super().default(o) diff --git a/packages/opentelemetry-instrumentation-llamaindex/opentelemetry/instrumentation/llamaindex/utils.py b/packages/opentelemetry-instrumentation-llamaindex/opentelemetry/instrumentation/llamaindex/utils.py index 01ab07cc56..affc81c2c4 100644 --- a/packages/opentelemetry-instrumentation-llamaindex/opentelemetry/instrumentation/llamaindex/utils.py +++ b/packages/opentelemetry-instrumentation-llamaindex/opentelemetry/instrumentation/llamaindex/utils.py @@ -64,6 +64,8 @@ class JSONEncoder(json.JSONEncoder): def default(self, o): if dataclasses.is_dataclass(o): return dataclasses.asdict(o) + if hasattr(o, "model_dump_json"): + return o.model_dump_json() elif hasattr(o, "json"): return o.json() elif hasattr(o, "to_json"): diff --git a/packages/traceloop-sdk/pyproject.toml b/packages/traceloop-sdk/pyproject.toml index bc3b4a4fc2..5a8b93f1fe 100644 --- a/packages/traceloop-sdk/pyproject.toml +++ b/packages/traceloop-sdk/pyproject.toml @@ -68,7 +68,7 @@ opentelemetry-instrumentation-groq = { path = "../opentelemetry-instrumentation- opentelemetry-instrumentation-mcp = { path = "../opentelemetry-instrumentation-mcp", develop = true } colorama = "^0.4.6" tenacity = ">=8.2.3, <10.0" -pydantic = ">=1" +pydantic = ">=2" jinja2 = "^3.1.5" deprecated = "^1.2.14" aiohttp = "^3.11.11" diff --git a/packages/traceloop-sdk/tests/test_json_encoder.py b/packages/traceloop-sdk/tests/test_json_encoder.py new file mode 100644 index 0000000000..c880fbe878 --- /dev/null +++ b/packages/traceloop-sdk/tests/test_json_encoder.py @@ -0,0 +1,31 @@ +from pathlib import Path +import pytest +from pydantic import BaseModel + +from traceloop.sdk.decorators import task +from opentelemetry.semconv_ai import SpanAttributes + + +def test_json_encoder_task(exporter, recwarn): + + class TestValue(BaseModel): + value: int + + @task(name="test_task") + def test_method(a: TestValue, b: TestValue): + return TestValue(value=a.value + b.value) + + result = test_method(TestValue(value=2), TestValue(value=3)) + + assert result.value == 5 + + spans = exporter.get_finished_spans() + assert len(spans) == 1 + span = spans[0] + assert span.attributes[SpanAttributes.TRACELOOP_ENTITY_INPUT] == r'{"args": ["{\"value\":2}", "{\"value\":3}"], "kwargs": {}}' + assert span.attributes[SpanAttributes.TRACELOOP_ENTITY_OUTPUT] == r'"{\"value\":5}"' + + for warning in recwarn: + file = Path(warning.filename) + if file.name == "json_encoder.py" and "`json` method is deprecated" in str(warning.message): + pytest.fail(f"Deprecation warning found: {warning.message}") diff --git a/packages/traceloop-sdk/traceloop/sdk/prompts/model.py b/packages/traceloop-sdk/traceloop/sdk/prompts/model.py index dddb80cfdd..04bb819b73 100644 --- a/packages/traceloop-sdk/traceloop/sdk/prompts/model.py +++ b/packages/traceloop-sdk/traceloop/sdk/prompts/model.py @@ -1,7 +1,7 @@ import datetime from typing import List, Literal, Optional, Union -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, ConfigDict from typing_extensions import Annotated @@ -10,8 +10,9 @@ class TemplateEngine: class RegistryObjectBaseModel(BaseModel): - class Config: - arbitrary_types_allowed = True + model_config = ConfigDict( + arbitrary_types_allowed=True + ) class TextContent(RegistryObjectBaseModel): diff --git a/packages/traceloop-sdk/traceloop/sdk/utils/json_encoder.py b/packages/traceloop-sdk/traceloop/sdk/utils/json_encoder.py index ad35a3b504..80d81336b0 100644 --- a/packages/traceloop-sdk/traceloop/sdk/utils/json_encoder.py +++ b/packages/traceloop-sdk/traceloop/sdk/utils/json_encoder.py @@ -14,6 +14,9 @@ def default(self, o): if hasattr(o, "to_json"): return o.to_json() + if hasattr(o, "model_dump_json"): + return o.model_dump_json() + if hasattr(o, "json"): return o.json()