Files
wehub-resource-sync 4b6817381b
CI (OpenClaw E2E) / openclaw test (push) Has been cancelled
CI / coverage-report (push) Has been cancelled
CI / test-kubernetes (push) Has been cancelled
CI / should-run-thorough (push) Has been cancelled
CI / test-thorough (cloudwatch-demo) (push) Has been cancelled
CI / test-thorough (flink-ecs) (push) Has been cancelled
CI / test-thorough (upstream-lambda) (push) Has been cancelled
CI / test-thorough (prefect-ecs-fargate) (push) Has been cancelled
Release / build-binaries (zip, opensre.exe, onefile, windows-latest, windows-x64) (push) Has been cancelled
Benchmark image — build + push to ECR (any adapter) / build + push (push) Has been cancelled
CI / quality (ubuntu-latest) (push) Has been cancelled
CI / test (tools-runtime) (push) Has been cancelled
CI / test (e2e-general) (push) Has been cancelled
CI / test (cli-runtime) (push) Has been cancelled
CI / test (e2e-provider-and-openclaw) (push) Has been cancelled
CI / test (integrations-and-misc) (push) Has been cancelled
Release / verify (push) Has been cancelled
Release / build-python-dist (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-15-intel, darwin-x64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-latest, darwin-arm64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04, linux-x64) (push) Has been cancelled
Release / publish-release (push) Has been cancelled
Release / publish-main-release (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-checks (no-LLM) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-live shard ${{ matrix.shard_index }} (push) Has been cancelled
Release / prepare (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04-arm, linux-arm64) (push) Has been cancelled
Synthetic Deterministic Tests / Synthetic offline (deterministic) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:10:45 +08:00

54 lines
1.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""LLM run cost estimate from token totals (no agent imports)."""
from __future__ import annotations
from typing import Any
DEFAULT_REASONING_USD_PER_MTOK = 3.0
DEFAULT_TOOL_USD_PER_MTOK = 1.0
def _classify_pricing_tier(model_id: str, reasoning_model: str, tool_model: str) -> str:
mid = model_id.lower()
if model_id == reasoning_model or mid == reasoning_model.lower():
return "reasoning"
if model_id == tool_model or mid == tool_model.lower():
return "tool"
if "haiku" in mid:
return "tool"
if "sonnet" in mid or "opus" in mid:
return "reasoning"
return "reasoning"
def _token_bucket_total(tt: Any) -> int:
total = getattr(tt, "total", None)
if callable(total):
return int(total())
if isinstance(total, int):
return total
inp = int(getattr(tt, "input_tokens", 0) or 0)
out = int(getattr(tt, "output_tokens", 0) or 0)
return inp + out
def estimate_run_cost_usd(
tokens_by_model: dict[str, Any],
*,
reasoning_model: str,
tool_model: str,
reasoning_usd_per_mtok: float = DEFAULT_REASONING_USD_PER_MTOK,
tool_usd_per_mtok: float = DEFAULT_TOOL_USD_PER_MTOK,
) -> tuple[float, dict[str, float]]:
"""Estimate USD: per model id, (input+output) tokens × $/MTok for that tier."""
total_usd = 0.0
breakdown_by_model: dict[str, float] = {}
for model_id, tt in tokens_by_model.items():
mtok = _token_bucket_total(tt) / 1_000_000.0
tier = _classify_pricing_tier(model_id, reasoning_model, tool_model)
rate = reasoning_usd_per_mtok if tier == "reasoning" else tool_usd_per_mtok
usd = mtok * rate
breakdown_by_model[model_id] = usd
total_usd += usd
return total_usd, breakdown_by_model