Standalone CLI
The hermes-telemetry command reads the same SQLite database as the in-session /stats and /budget commands, so the gateway does not need to be running. Installation explains how to put it on your PATH.
If your Hermes version supports plugin CLI commands, every subcommand below is also available as hermes telemetry <subcommand>.
# Session summaryhermes-telemetry stats todayhermes-telemetry stats weekhermes-telemetry stats month
# Per cron jobhermes-telemetry stats cronhermes-telemetry stats cron-week
# By provider and by modelhermes-telemetry stats providershermes-telemetry stats modelsThe full set of stats subcommands is:
| Group | Subcommands |
|---|---|
| Summary | today (default), week, month, last-7-days, last-30-days |
| Cron jobs | cron, cron-week, cron-month |
| Providers | providers, providers-week, providers-month |
| Models | models, models-week, models-month |
The summary presets today, week, and month start at 00:00 UTC of the day that begins the window (today, 7 days ago, 30 days ago). The cron, provider, and model subcommands use rolling windows of 7 days, 24 hours, and 24 hours by default (-week is 7 days, -month is 30 days).
Budget
Section titled “Budget”hermes-telemetry budget # status of every scopehermes-telemetry budget cron # per-cron-job statushermes-telemetry budget forecast monthly # burn-rate projection (defaults: monthly, global)hermes-telemetry budget forecast daily profile faro
hermes-telemetry budget set global daily 5.00hermes-telemetry budget set profile monthly 50 --id farobudget set <scope> <window> <usd> takes the optional override id as --id. See Budgets for what the limits do.
Date range filters
Section titled “Date range filters”Every stats subcommand accepts --from and --to. Values are ISO-8601 dates or timestamps, or the literal now. --from is inclusive and --to is exclusive. A date without a time means 00:00:00 UTC of that day.
# Everything since a specific instant (good for post-deploy windows)hermes-telemetry stats models --from 2026-06-16T12:00:00Z
# Bounded rangehermes-telemetry stats providers --from 2026-06-10 --to 2026-06-15
# Date-only is 00:00:00 UTC of that dayhermes-telemetry stats today --from 2026-06-01Use case: validating a pricing fix
Section titled “Use case: validating a pricing fix”Suppose you fix how a model is priced. The rolling 24-hour window in stats models keeps mixing calls from before and after the fix until the old ones age out, so the aggregate is misleading even though new calls are right. Pass the fix’s deploy time to see only post-fix calls immediately:
hermes-telemetry stats models --from 2026-06-16T12:00:00ZThe same flags work inside Hermes chat through /stats, so you do not need to leave the session to run the check.
JSON output
Section titled “JSON output”--json prints machine-readable output for scripting.
hermes-telemetry stats today --json | jq '.cost_usd'hermes-telemetry stats models --from 2026-06-16T12:00:00Z --json \ | jq '.[] | {model, calls: .total_calls, cost: .cost_usd}'hermes-telemetry budget --json | jq '.global'hermes-telemetry budget forecast daily --json | jq '.status'Summary subcommands return one object. cron, providers, and models return an array of rows. budget --json returns global, cron_jobs, and senders entries; use the text view or the dashboard to see profile scopes.
Pricing snapshots
Section titled “Pricing snapshots”Every real LLM call captures a pricing snapshot of the tariff that Hermes core resolved for that model. Two subcommands work with that history. Both are dry-run by default and need --apply to write.
# Seed snapshots for historical models that never got onehermes-telemetry pricing backfillhermes-telemetry pricing backfill --applyhermes-telemetry pricing backfill --json
# Compare pricing.yaml against the core snapshotshermes-telemetry pricing drifthermes-telemetry pricing drift --apply # rewrite drifted entrieshermes-telemetry pricing drift --threshold 5 # flag drift above 5% (default 1%)hermes-telemetry pricing drift --model deepseek/deepseek-v4-prohermes-telemetry pricing drift --jsonpricing backfill seeds a current snapshot for every historical (provider, model) pair in llm_calls that has none, mainly dated model ids that never matched a live capture. It is a coverage seed, not a historical reconstruction: the tariff written is whatever Hermes core resolves today. It is idempotent and safe to re-run, and it needs the Hermes core importable in the same Python environment.
pricing drift compares the input and output rates in pricing.yaml with the latest core snapshot per model. Cache and reasoning rates are excluded because pricing.yaml has no direct analog. It skips _subscription: true entries, because a declared $0 is intentional, and flags anything beyond --threshold percent. If some models in llm_calls still lack a snapshot, the report tells you to run pricing backfill first so that a clean result is not a false all-clear. With --apply it merges the core rates back into pricing.yaml, never clobbering other fields, and tags each repaired entry _source: core-snapshot.
See Pricing for how snapshots fit into cost calculation, and Pricing engine for the design rationale.
Profile consolidation
Section titled “Profile consolidation”hermes-telemetry sync-profiles points every Hermes profile at one shared telemetry home. See Profiles and shared home.
hermes-telemetry is an independent community plugin for Hermes Agent. It is not affiliated with or endorsed by Nous Research.