Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions py/src/braintrust/integrations/dspy/test_dspy.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,12 @@ def redact_image(self, image):
@pytest.mark.parametrize("url", ["https://example.com/page.png", "data:image/png;base64,not base64!"])
def test_dspy_image_conversion_preserves_unmaterialized_images(url):
image = dspy.Image(url=url)
assert _process_images(image) is image
assert _process_images({"image": image, "url": url}) == {"image": image, "url": url}
assert _process_images({"image": image, "url": url}) == {
"image": image.model_dump(exclude_none=True),
"url": url,
}
model = RootModel[list[dspy.Image]]([image])
assert _process_images(model) is model
assert _process_images(model) == model.model_dump(exclude_none=True)


@pytest.mark.vcr(
Expand Down
2 changes: 1 addition & 1 deletion py/src/braintrust/integrations/dspy/tracing.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def _process_images_impl(value: Any) -> Any:
serialized = value.model_dump(exclude_none=True)
converted_model = _process_images(serialized)
if converted_model is serialized:
return value
return serialized
# DSPy 2.6 serializes Image as {"url": ...}; later versions use the
# reserved prompt wrapper handled above. Normalize only this SDK type.
if type(value) is Image and isinstance(converted_model, dict) and set(converted_model) == {"url"}:
Expand Down
Loading