From 8229a68f86909baf918add2a390f7d9de9734d56 Mon Sep 17 00:00:00 2001 From: Pat Date: Sun, 15 Mar 2026 18:03:56 -0500 Subject: [PATCH] fix: add claude-sonnet-4 pricing + model data in span Two bugs causing $0 cost and "unknown" model in dashboard: 1. claude-sonnet-4-20250514 and claude-opus-4-20250515 were missing from the pricing table. All calls returned $0.00 with UnknownModelWarning. Added both models. 2. patch_anthropic/patch_openai created spans with empty data={}. Dashboard queries e.data->>'model' for cost-by-model aggregation, which returned 'unknown'. Now passes data={"model": ..., "provider": ...} when creating the trace span. Both fixes apply to all 4 patch variants (sync/async x openai/anthropic). Co-Authored-By: Claude Opus 4.6 (1M context) --- sdk/agentguard/cost.py | 2 ++ sdk/agentguard/instrument.py | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/sdk/agentguard/cost.py b/sdk/agentguard/cost.py index 3fdcf77..03c6f94 100644 --- a/sdk/agentguard/cost.py +++ b/sdk/agentguard/cost.py @@ -30,8 +30,10 @@ class UnknownModelWarning(UserWarning): ("anthropic", "claude-3-5-sonnet-20241022"): (0.003, 0.015), ("anthropic", "claude-3-5-haiku-20241022"): (0.0008, 0.004), ("anthropic", "claude-3-opus-20240229"): (0.015, 0.075), + ("anthropic", "claude-sonnet-4-20250514"): (0.003, 0.015), ("anthropic", "claude-sonnet-4-5-20250929"): (0.003, 0.015), ("anthropic", "claude-haiku-4-5-20251001"): (0.0008, 0.004), + ("anthropic", "claude-opus-4-20250515"): (0.015, 0.075), ("anthropic", "claude-opus-4-6"): (0.015, 0.075), # Google ("google", "gemini-1.5-pro"): (0.00125, 0.005), diff --git a/sdk/agentguard/instrument.py b/sdk/agentguard/instrument.py index d135db0..d86b75d 100644 --- a/sdk/agentguard/instrument.py +++ b/sdk/agentguard/instrument.py @@ -236,7 +236,7 @@ def _traced_openai_create( ) -> Any: """Shared traced wrapper for sync OpenAI create calls.""" model = kwargs.get("model", "unknown") - with tracer.trace(f"llm.openai.{model}") as ctx: + with tracer.trace(f"llm.openai.{model}", data={"model": model, "provider": "openai"}) as ctx: result = original(*args, **kwargs) _emit_llm_result(ctx, budget_guard, model, "openai", getattr(result, "usage", None)) return result @@ -295,7 +295,7 @@ def _patch_anthropic_instance(client: Any, tracer: Any, budget_guard: Any = None @functools.wraps(original_create) def traced_create(*args: Any, **kwargs: Any) -> Any: model = kwargs.get("model", "unknown") - with tracer.trace(f"llm.anthropic.{model}") as ctx: + with tracer.trace(f"llm.anthropic.{model}", data={"model": model, "provider": "anthropic"}) as ctx: result = original_create(*args, **kwargs) _emit_llm_result(ctx, budget_guard, model, "anthropic", getattr(result, "usage", None)) return result @@ -436,7 +436,7 @@ def _patch_openai_async_instance(client: Any, tracer: Any, budget_guard: Any = N @functools.wraps(original_create) async def traced_create(*args: Any, **kwargs: Any) -> Any: model = kwargs.get("model", "unknown") - async with tracer.trace(f"llm.openai.{model}") as ctx: + async with tracer.trace(f"llm.openai.{model}", data={"model": model, "provider": "openai"}) as ctx: result = await original_create(*args, **kwargs) _emit_llm_result(ctx, budget_guard, model, "openai", getattr(result, "usage", None)) return result @@ -494,7 +494,7 @@ def _patch_anthropic_async_instance(client: Any, tracer: Any, budget_guard: Any @functools.wraps(original_create) async def traced_create(*args: Any, **kwargs: Any) -> Any: model = kwargs.get("model", "unknown") - async with tracer.trace(f"llm.anthropic.{model}") as ctx: + async with tracer.trace(f"llm.anthropic.{model}", data={"model": model, "provider": "anthropic"}) as ctx: result = await original_create(*args, **kwargs) _emit_llm_result(ctx, budget_guard, model, "anthropic", getattr(result, "usage", None)) return result