The GitHub Actions job "Tests (AMD)" on 
airflow.git/anthropic-session-usage-xcom has failed.
Run started by GitHub user kaxil (triggered by kaxil).

Head commit for run:
3e44b9ebe2eee13423f3cada9a06406e3db33a79 / Kaxil Naik <[email protected]>
Record Anthropic agent session token usage and cost in XCom

A session budget is a stop trigger, not a spend cap: the ceiling is
checked between model requests, so a request already in flight runs to
completion. Measured against the live API, a $0.01 ceiling admitted
between $0.32 and $0.61 of usage across four runs. Setting a budget
therefore tells you nothing about what a run actually cost, and the
operator returned only a session ID.

``AnthropicAgentSessionOperator`` now pushes the session's usage to XCom
under ``usage``, making cost per Dag run queryable:

    {"input_tokens": 827, "output_tokens": 14002,
     "cache_read_input_tokens": 0,
     "cache_creation": {"ephemeral_5m_input_tokens": 0,
                        "ephemeral_1h_input_tokens": 0},
     "server_tool_use": {"web_search_requests": 0,
                         "web_fetch_requests": 0},
     "active_seconds": 213.7,
     "list_cost": {"amount": "36", "currency": "USD"},
     "try_number": 1}

``AnthropicHook.get_session_usage`` flattens the SDK models to plain
scalars so the value survives XCom serialization. ``amount`` stays the
API's minor-unit string rather than becoming a float, because a cost
figure must not pick up binary rounding. ``list_cost`` is ``None`` when
usage includes a model with no list price -- and that is exactly when a
caller has to price the run from usage instead, so every billable
dimension is reported: cache writes are billed above base input and
server tool calls are billed per request.

Usage is recorded on failure as well as success, since a budget-stopped
session is precisely the one whose spend needs recording. Teardown runs
first on the failure paths: it is the time-critical call, and
``sessions.archive`` returns the session carrying its final usage, so
``summarize_usage`` reports spend without a second request against an API
that may be why the task is failing. If archiving fails, usage falls back
to a fetch. The whole push is best effort -- it runs immediately before
re-raising, so anything that throws there would otherwise replace the
exception the task should fail with.

Airflow clears XCom at the start of each attempt, so ``usage`` holds the
final attempt only; ``try_number`` records which, and the docs say total
spend across retries must be summed from the session records.

Verified end to end against the live API: a real deferred run resumed by
a real triggerer failed with AnthropicSessionBudgetExceeded and left the
usage above in XCom, read back over the REST API.

Report URL: https://github.com/apache/airflow/actions/runs/31530602457

With regards,
GitHub Actions via GitBox


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to