@@ -42,36 +42,29 @@ def test_dspy_callback(memory_logger):
4242
4343 spans_by_name = {span ["span_attributes" ]["name" ]: span for span in spans }
4444
45- # DSPy modules are pipeline steps → task per spec.
46- module_span = spans_by_name .get ("dspy.module.ChainOfThought" )
47- assert module_span is not None
45+ module_span = spans_by_name ["dspy.module.ChainOfThought" ]
4846 assert module_span ["span_attributes" ]["type" ] == "task"
4947 assert module_span ["metadata" ]["module_class" ].endswith ("ChainOfThought" )
5048
5149 lm_span = spans_by_name ["dspy.lm" ]
5250 assert lm_span ["context" ]["span_origin" ]["instrumentation" ]["name" ] == "dspy-auto"
53- # dspy.lm intentionally has no `llm` type — the underlying provider integration
54- # (litellm/openai/anthropic) owns the `llm` leaf and its token accounting.
5551 assert lm_span ["span_attributes" ].get ("type" ) != "llm"
5652 assert "metadata" in lm_span
5753 assert "model" in lm_span ["metadata" ]
5854 assert MODEL in lm_span ["metadata" ]["model" ]
59- # Still record provider so downstream tools can attribute the call correctly;
60- # derived from the litellm-style "openai/..." prefix.
6155 assert lm_span ["metadata" ]["provider" ] == "openai"
6256 assert "input" in lm_span
6357 assert "output" in lm_span
6458
6559 format_span = spans_by_name ["dspy.adapter.format" ]
66- parse_span = spans_by_name ["dspy.adapter.parse" ]
67-
6860 assert format_span ["span_attributes" ]["type" ] == "task"
6961 assert format_span ["metadata" ]["adapter_class" ].endswith ("ChatAdapter" )
7062 assert "signature" in format_span ["input" ]
7163 assert "demos" in format_span ["input" ]
7264 assert "inputs" in format_span ["input" ]
7365 assert isinstance (format_span ["output" ], list )
7466
67+ parse_span = spans_by_name ["dspy.adapter.parse" ]
7568 assert parse_span ["span_attributes" ]["type" ] == "task"
7669 assert parse_span ["metadata" ]["adapter_class" ].endswith ("ChatAdapter" )
7770 assert "signature" in parse_span ["input" ]
0 commit comments