with one click
daily-llm-usage-report
// Gordon's daily LLM usage report — request metrics sent to Telegram each morning at 6 AM PT. Uses a daemon + cron, no OpenRouter dependency.
// Gordon's daily LLM usage report — request metrics sent to Telegram each morning at 6 AM PT. Uses a daemon + cron, no OpenRouter dependency.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | daily-llm-usage-report |
| description | Gordon's daily LLM usage report — request metrics sent to Telegram each morning at 6 AM PT. Uses a daemon + cron, no OpenRouter dependency. |
| version | 1.0.0 |
| author | Hermes Agent |
| license | MIT |
| metadata | {"hermes":{"tags":["telegram","usage","metrics","cron","daily-routine"],"homepage":"https://github.com/NousResearch/hermes-agent"}} |
Gordon's daily LLM usage report — sends request metrics to Telegram at 6 AM PT every morning.
openai-codex/gpt-5.5 → gpt-5.5), sorted descending by call count/opt/hermes/scripts/cost_report.pyCore report script. Reads request log, computes metrics, sends Telegram message. No OpenRouter dependency — Gordon is on subscription.
Usage:
# Test/send report
python3 /opt/hermes/scripts/cost_report.py
# Take baseline (no send)
python3 /opt/hermes/scripts/cost_report.py --baseline
/opt/hermes/scripts/cost_daemon_wrapper.pyDaemon wrapper that reads Telegram tokens from /opt/data/.env.tokens and execs the daemon with those tokens injected into the environment.
Always start the daemon via this wrapper, not directly. The daemon reads tokens from its process env, and cron/the subprocess don't have the container's env vars.
/opt/hermes/scripts/cost_report_daemon.pySleeps until next 6 AM PT, runs cost_report.py, repeats. Daemon is long-lived.
/opt/data/request-log.jsonlJSONL log of API calls. Each line: {"ts": unix_timestamp, "api_calls": int, "platform": "telegram", ...}
/opt/data/cost-state.jsonState file (keeps prior metrics for comparison).
Tokens live in /opt/data/.env.tokens:
TELEGRAM_BOT_TOKEN=<bot_token>
TELEGRAM_HOME_CHANNEL=<chat_id>
Always use the wrapper to get tokens:
python3 /opt/hermes/scripts/cost_daemon_wrapper.py &
To verify it's running:
ps aux | grep cost_report_daemon
tail /opt/data/cost-report-daemon.log
The daemon must be started via cost_daemon_wrapper.py (not directly), which reads tokens from /opt/data/.env.tokens. Starting it directly causes silent failures — the daemon sleeps and never sends.
If you update /opt/data/.env.tokens, kill and restart the daemon:
pkill -f cost_report_daemon
python3 /opt/hermes/scripts/cost_daemon_wrapper.py &
Hermes cron uses UTC. To fire at 6 AM PT, schedule as 5 13 * * * (13:05 UTC). Always verify UTC equivalent.
Metrics will be 0 until the log has at least 24h of data.