トークン従量課金制のAPIでAIを使っていて、日々どれくらい使ったかを自動でサクッと確認したかったのでtelegramに自動で送るようにしてみました。
OpenRouterのusageをGitHub Actionsで毎日定期実行してTelegramに送っています。
やっていることはシンプルで、
- OpenRouter の activity API から利用実績を取得する
- 過去 3 日分の usage を集計する
- Telegram Bot 経由でメッセージを送る
という流れです。
できあがり
毎日 Telegram にこんな感じで届きます。
用意する変数
いずれもGithub リポジトリの Secrets に入れます。
- OPENROUTER_PROVISIONING_KEY
- TELEGRAM_BOT_TOKEN
- TELEGRAM_CHAT_ID
telegramの2つについてはこちらの↓手順で取得できます
ワークフロー全体
実装は GitHub リポジトリの .github/workflows/openrouter-usage.yml に置きました。
name: OpenRouter usage notify
on:
schedule:
- cron: "5 15 * * *" # 0:05(JST)
workflow_dispatch:
jobs:
notify:
runs-on: ubuntu-latest
environment: PROD
steps:
- name: Compute & post to Telegram
env:
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
OPENROUTER_PROVISIONING_KEY: ${{ secrets.OPENROUTER_PROVISIONING_KEY }}
run: |
set -euo pipefail
: "${TELEGRAM_BOT_TOKEN:?TELEGRAM_BOT_TOKEN is missing}"
: "${TELEGRAM_CHAT_ID:?TELEGRAM_CHAT_ID is missing}"
: "${OPENROUTER_PROVISIONING_KEY:?OPENROUTER_PROVISIONING_KEY is missing}"
DATA=$(curl -sS -H "Authorization: Bearer $OPENROUTER_PROVISIONING_KEY" \
https://openrouter.ai/api/v1/activity)
TEXT='OpenRouter Usage'
for offset in 3 2 1; do
DAY=$(TZ=Asia/Tokyo date -d "$offset days ago" +%Y-%m-%d)
USAGE=$(echo "$DATA" | jq -r --arg d "$DAY" '
(.data // .items // [])
| map(select((.date // "") | startswith($d)))
| (map(.usage // 0) | add) // 0
')
USAGE=$(printf '%.2f' "$USAGE")
TEXT+=$'\n'
TEXT+="$DAY: \$${USAGE}"
done
curl -sS -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H 'Content-Type: application/json' \
-d "$(jq -n --arg chat_id "$TELEGRAM_CHAT_ID" --arg text "$TEXT" \
'{chat_id:$chat_id, text:$text}')" >/dev/null
ポイント
1. 定期実行は GitHub Actions の schedule
on:
schedule:
- cron: "5 15 * * *"
GitHub Actions の cron は UTC 基準です。
なのでこの設定は、JST だと毎日 00:05 に実行されます。
(時間はぴったりではないので注意。〜数十分のラグがあります)
2. OpenRouter の activity API を叩く
curl -sS -H "Authorization: Bearer $OPENROUTER_PROVISIONING_KEY" \
https://openrouter.ai/api/v1/activity
OpenRouter 側の activity API から usage 情報を取得します。
認証には provisioning key を使っています。
3. 過去 3 日分を集計する
for offset in 3 2 1; do
ここでは「昨日、一昨日、その前日」の 3 日分を出しています。
日付は JST 基準で計算しています。
DAY=$(TZ=Asia/Tokyo date -d "$offset days ago" +%Y-%m-%d)
GitHub Actions の runner は Ubuntu なので、date -d が使えます。
4. jq で JSON を集計する
USAGE=$(echo "$DATA" | jq -r --arg d "$DAY" '
(.data // .items // [])
| map(select((.date // "") | startswith($d)))
| (map(.usage // 0) | add) // 0
')
ここでは API レスポンスの構造差異に少しだけ耐えられるようにしています。
- .data があればそれを使う
- なければ .items を見る
- date が指定した日付で始まるものだけを対象にする
- usage を合計する
もし該当データがなければ 0 を返します。
5. Telegram Bot API に送信する
curl -sS -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H 'Content-Type: application/json' \
-d "$(jq -n --arg chat_id "$TELEGRAM_CHAT_ID" --arg text "$TEXT" \
'{chat_id:$chat_id, text:$text}')" >/dev/null
Telegram への送信は sendMessage を使っています。
JSON の組み立ては jq -n に任せているので、文字列のエスケープで事故りにくいです。
実装してみてよかった点
- OpenRouter の usage を web ページから手動で見に行かなくてよくなった
- Telegram で流れるので見落としにくい
- GitHub Actions だけで完結するので、別サーバーを立てる必要がない
まとめ
GitHub Actions を使うと、OpenRouter の usage を毎日自動で Telegram に送る仕組みをかなり簡単に作れます。
slackやLINEに送るなど拡張も可能です。