Skip to content

Metrics: Real vs Estimated

Metric Status Source
Tokens in (non-cached) ✅ Real post_api_request.usage.input_tokens
Tokens out ✅ Real post_api_request.usage.output_tokens
Cache read tokens ✅ Real post_api_request.usage.cache_read_tokens
Cache write tokens ✅ Real post_api_request.usage.cache_write_tokens
Reasoning tokens ✅ Real post_api_request.usage.reasoning_tokens
API call latency ✅ Real post_api_request.api_duration (seconds → ms)
Tool call latency ✅ Real post_tool_call.duration_ms
Model name ✅ Real post_api_request.response_model or model
Provider name ✅ Real (verbatim) post_api_request.provider
Platform ✅ Real on_session_start.platform
Cron job ID ✅ Real (parsed) session_id regex extraction
Session duration ✅ Real (wall time) started_at → ended_at (last turn)
Tool success/failure ✅ Real post_tool_call.status; result-JSON fallback (truthy error, terminal exit_code, success is False) on older Hermes
Subagent count ✅ Real (proxy) subagent_stop hook count
Cost (USD) ⚠️ Estimated Local pricing table × token counts
Tokens when usage=None ⚠️ Estimated, flagged approx_input_tokens + chars/4, row marked estimated=1
Subagent cost (global) ✅ Real Child runs fire own hooks → independent runs rows
Subagent cost (per-cron-job) ✅ Real (attributed) subagent_edges (v11) + recursive CTE in db.spend_by_scope("cron_job", ...)
MoA aggregator cost ✅ Real (re-attributed) Aggregator usage from post_api_request, priced under the aggregator’s real provider/model resolved from the preset (moa.py)
MoA reference-model cost ❌ Not available References run via auxiliary call_llm, which fires no hooks — tokens unrecoverable (recorded MoA cost is a lower bound)

Cost is always an estimate — computed from a local pricing table, not from a provider billing API. Users can override prices via ~/.hermes/telemetry/pricing.yaml.

hermes-telemetry is an independent community plugin for Hermes Agent. It is not affiliated with or endorsed by Nous Research.