mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-10 03:28:53 +00:00
fix(datadog): set top-level model_name on embedding LLMObs spans
Datadog prices llm/embedding spans from meta.model_name and meta.model_provider. LiteLLM only put those under meta.metadata, so embedding spans were flagged Partial cost. Lift the existing values onto Meta for llm and embedding kinds. Part of #41601
This commit is contained in:
parent
d5b8400aa9
commit
0cfe667a89
3 changed files with 44 additions and 0 deletions
|
|
@ -654,6 +654,12 @@ class DataDogLLMObsLogger(CustomBatchLogger):
|
|||
"error": error_info,
|
||||
**({"tool_definitions": tool_definitions} if tool_definitions else {}),
|
||||
}
|
||||
# Datadog prices llm/embedding spans from top-level meta.model_name /
|
||||
# model_provider. Those values already live in metadata; lift them so
|
||||
# embedding spans are not flagged "Partial cost — Unsupported model provider".
|
||||
if span_kind in ("llm", "embedding"):
|
||||
meta["model_name"] = standard_logging_payload.get("model", "unknown")
|
||||
meta["model_provider"] = standard_logging_payload.get("custom_llm_provider", "unknown")
|
||||
|
||||
metrics: Final = self._assemble_metrics(standard_logging_payload, tool_output_tokens)
|
||||
|
||||
|
|
|
|||
|
|
@ -69,6 +69,10 @@ class DDLLMObsError(TypedDict, total=False):
|
|||
class Meta(TypedDict, total=False):
|
||||
# The span kind: "agent", "workflow", "llm", "tool", "task", "embedding", or "retrieval".
|
||||
kind: Literal["llm", "tool", "task", "embedding", "retrieval"]
|
||||
# Top-level model fields required for Datadog cost attribution on llm/embedding spans.
|
||||
# Values are also kept under metadata for backwards compatibility.
|
||||
model_name: str
|
||||
model_provider: str
|
||||
input: InputMeta # The span's input information.
|
||||
output: OutputMeta # The span's output information.
|
||||
metadata: dict[str, Any]
|
||||
|
|
|
|||
|
|
@ -1122,3 +1122,37 @@ def test_reasoning_content_survives_the_mapping(logger: DataDogLLMObsLogger) ->
|
|||
)
|
||||
|
||||
assert payload["meta"]["output"]["messages"][0]["reasoning_content"] == "thinking"
|
||||
|
||||
|
||||
def test_embedding_span_sets_top_level_model_name(logger: DataDogLLMObsLogger) -> None:
|
||||
"""Datadog prices embedding spans from meta.model_name, not meta.metadata (issue #41601)."""
|
||||
kwargs = build_payload(messages=None)
|
||||
kwargs["standard_logging_object"]["call_type"] = "aembedding"
|
||||
kwargs["standard_logging_object"]["model"] = "openai/text-embedding-3-small"
|
||||
kwargs["standard_logging_object"]["custom_llm_provider"] = "openai"
|
||||
kwargs["standard_logging_object"]["response"] = {"data": [{"embedding": [0.1, 0.2]}]}
|
||||
kwargs["litellm_params"]["metadata"]["parent_id"] = "parent-span-1"
|
||||
|
||||
start = datetime(2026, 9, 1, 12, 0, 0)
|
||||
span = json.loads(safe_dumps(logger.create_llm_obs_payload(kwargs, start, start + timedelta(seconds=1))))
|
||||
|
||||
assert span["meta"]["kind"] == "embedding"
|
||||
assert span["meta"]["model_name"] == "openai/text-embedding-3-small"
|
||||
assert span["meta"]["model_provider"] == "openai"
|
||||
# Still present under metadata for backwards compatibility.
|
||||
assert span["meta"]["metadata"]["model_name"] == "openai/text-embedding-3-small"
|
||||
assert span["meta"]["metadata"]["model_provider"] == "openai"
|
||||
|
||||
|
||||
def test_llm_span_sets_top_level_model_name(logger: DataDogLLMObsLogger) -> None:
|
||||
"""llm spans must keep top-level model_name/model_provider for Datadog cost attribution."""
|
||||
kwargs = build_payload()
|
||||
kwargs["standard_logging_object"]["model"] = "openai/gpt-4.1-mini"
|
||||
kwargs["standard_logging_object"]["custom_llm_provider"] = "openai"
|
||||
|
||||
start = datetime(2026, 9, 1, 12, 0, 0)
|
||||
span = json.loads(safe_dumps(logger.create_llm_obs_payload(kwargs, start, start + timedelta(seconds=1))))
|
||||
|
||||
assert span["meta"]["kind"] == "llm"
|
||||
assert span["meta"]["model_name"] == "openai/gpt-4.1-mini"
|
||||
assert span["meta"]["model_provider"] == "openai"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue