@@ -1584,13 +1584,58 @@ def test_anthropic_cache_write_and_read_tokens(mock_client):
15841584 generation_props = generation_args ["properties" ]
15851585
15861586 assert generation_args ["event" ] == "$ai_generation"
1587- assert generation_props ["$ai_input_tokens" ] == 400
1587+ assert (
1588+ generation_props ["$ai_input_tokens" ] == 1200
1589+ ) # No provider metadata, no subtraction
15881590 assert generation_props ["$ai_output_tokens" ] == 30
15891591 assert generation_props ["$ai_cache_creation_input_tokens" ] == 0
15901592 assert generation_props ["$ai_cache_read_input_tokens" ] == 800
15911593 assert generation_props ["$ai_reasoning_tokens" ] == 0
15921594
15931595
1596+ def test_anthropic_provider_subtracts_cache_tokens (mock_client ):
1597+ """Test that Anthropic provider correctly subtracts cache tokens from input tokens."""
1598+ from langchain_core .outputs import LLMResult , ChatGeneration
1599+ from langchain_core .messages import AIMessage
1600+ from uuid import uuid4
1601+
1602+ cb = CallbackHandler (mock_client )
1603+ run_id = uuid4 ()
1604+
1605+ # Set up with Anthropic provider
1606+ cb ._set_llm_metadata (
1607+ serialized = {},
1608+ run_id = run_id ,
1609+ messages = [{"role" : "user" , "content" : "test" }],
1610+ metadata = {"ls_provider" : "anthropic" , "ls_model_name" : "claude-3-sonnet" },
1611+ )
1612+
1613+ # Response with cache tokens: 1200 input (includes 800 cached)
1614+ response = LLMResult (
1615+ generations = [
1616+ [
1617+ ChatGeneration (
1618+ message = AIMessage (content = "Response" ),
1619+ generation_info = {
1620+ "usage_metadata" : {
1621+ "input_tokens" : 1200 ,
1622+ "output_tokens" : 50 ,
1623+ "cache_read_input_tokens" : 800 ,
1624+ }
1625+ },
1626+ )
1627+ ]
1628+ ],
1629+ llm_output = {},
1630+ )
1631+
1632+ cb ._pop_run_and_capture_generation (run_id , None , response )
1633+
1634+ generation_args = mock_client .capture .call_args_list [0 ][1 ]
1635+ assert generation_args ["properties" ]["$ai_input_tokens" ] == 400 # 1200 - 800
1636+ assert generation_args ["properties" ]["$ai_cache_read_input_tokens" ] == 800
1637+
1638+
15941639def test_openai_cache_read_tokens (mock_client ):
15951640 """Test that OpenAI cache read tokens are captured correctly."""
15961641 prompt = ChatPromptTemplate .from_messages (
@@ -1626,7 +1671,7 @@ def test_openai_cache_read_tokens(mock_client):
16261671 generation_props = generation_args ["properties" ]
16271672
16281673 assert generation_args ["event" ] == "$ai_generation"
1629- assert generation_props ["$ai_input_tokens" ] == 50
1674+ assert generation_props ["$ai_input_tokens" ] == 150 # No subtraction for OpenAI
16301675 assert generation_props ["$ai_output_tokens" ] == 40
16311676 assert generation_props ["$ai_cache_read_input_tokens" ] == 100
16321677 assert generation_props ["$ai_cache_creation_input_tokens" ] == 0
@@ -1708,7 +1753,7 @@ def test_combined_reasoning_and_cache_tokens(mock_client):
17081753 generation_props = generation_args ["properties" ]
17091754
17101755 assert generation_args ["event" ] == "$ai_generation"
1711- assert generation_props ["$ai_input_tokens" ] == 200
1756+ assert generation_props ["$ai_input_tokens" ] == 500 # No subtraction for OpenAI
17121757 assert generation_props ["$ai_output_tokens" ] == 100
17131758 assert generation_props ["$ai_cache_read_input_tokens" ] == 300
17141759 assert generation_props ["$ai_cache_creation_input_tokens" ] == 0
@@ -1917,8 +1962,8 @@ def test_cache_read_tokens_subtraction_from_input_tokens(mock_client):
19171962 generation_props = generation_args ["properties" ]
19181963
19191964 assert generation_args ["event" ] == "$ai_generation"
1920- # Input tokens should be reduced: 150 - 100 = 50
1921- assert generation_props ["$ai_input_tokens" ] == 50
1965+ # Input tokens not reduced without provider metadata
1966+ assert generation_props ["$ai_input_tokens" ] == 150
19221967 assert generation_props ["$ai_output_tokens" ] == 40
19231968 assert generation_props ["$ai_cache_read_input_tokens" ] == 100
19241969
@@ -1959,8 +2004,8 @@ def test_cache_read_tokens_subtraction_prevents_negative(mock_client):
19592004 generation_props = generation_args ["properties" ]
19602005
19612006 assert generation_args ["event" ] == "$ai_generation"
1962- # Input tokens should be 0, not negative: max(80 - 100, 0) = 0
1963- assert generation_props ["$ai_input_tokens" ] == 0
2007+ # Input tokens not reduced without provider metadata
2008+ assert generation_props ["$ai_input_tokens" ] == 80
19642009 assert generation_props ["$ai_output_tokens" ] == 20
19652010 assert generation_props ["$ai_cache_read_input_tokens" ] == 100
19662011
0 commit comments