OpenClawをDiscord連携のパーソナルアシスタントとして常時稼働させている。cronジョブ13本で定期タスクを回している。定期的なデータ同期やインデックス構築、日次振り返り、RSS/wallabagのサマリーなど、雑多なタスクを全部OpenClawに任せていた。

モデルはChatGPT PlusのOAuth経由でopenai-codex/gpt-5.3-codexを使っていたのだが、レートリミットにぶつかり、全ジョブが停止する事態になった。

何が起きていたか

13本のcronジョブが全部同じChatGPT Plusアカウントの枠を叩いていた。LLMが不要なジョブまでagentセッション経由で実行していたので、本来消費しなくていいトークンで枠を食い潰していた。fallbackにopenai-codex/gpt-5.2を設定していたが、同じChatGPT Plusアカウントなのでレートリミットの枠は共有されていて、実質的に意味がなかった。

変更前:
primary:  openai-codex/gpt-5.3-codex
fallback: openai-codex/gpt-5.2        ← 同じOAuth枠で意味なし

さらにまずいことに、エラー監視用のcron(1時間毎)も自身がOpenClawのagentセッションとして動くため、レートリミットで監視ジョブ自体が失敗していた。SREの端くれとして、監視が監視対象と一緒に死ぬのは不覚にもほどがある。

やったこと

LLM不要なジョブをシステムcrontabに移行

まず冷静に13本のジョブを見直した。インデックス構築やデータ同期など計6ジョブは、実態としてはシェルコマンドを実行するだけだった。それなのにOpenClawのagentセッションを起動してLLMに「このコマンドを実行して」と指示していた。完全に無駄。システムcrontabに直接書き直して、OpenClaw側はdisabledにした。

OpenRouter + Gemini 2.5 Flashの導入

今回引っかかったのはWeeklyのレートリミットで、あと3日も待てば解除されるレベルではあった。ただ3日止まったままというのも気持ち悪いので、残りのLLMが必要なジョブにはChatGPT Plusの枠を消費しない別のモデルを充てることにした。

ChatGPTにも追加クレジットの仕組みはあるが、かなり割高だった。もう少し安くAPI課金できるところを探す中でOpenRouterを見つけた。複数プロバイダのモデルを1つのAPIキーで叩けて、従量課金で最低利用額もない。各モデルのツール呼び出しの形式変換もやってくれるので、プロバイダごとのAPI仕様の差を気にしなくていい。APIキーを1つ通すだけでモデルを色々試せるのは、個別に契約して回るより圧倒的に楽だった。

OpenRouterで使えるモデルの中から、コストが安くてツール呼び出しに対応しているgoogle/gemini-2.5-flashを選んだ。実際にtool_callsのテストを行い、正しくツール呼び出しが返ることを確認して採用した。

変更後:
primary:  openrouter/google/gemini-2.5-flash
fallback: openai-codex/gpt-5.3-codex

codexが使えないと不便な場面もあるので、openai-codex/gpt-5.3-codexはfallbackとして残した。これでprimaryとfallbackが別の枠になるので、片方が詰まっても切り替わる。

cron頻度の削減

  • エラー監視: 1時間毎 → 3時間毎
  • 別ホストからrsyncしているデータの同期チェック: 15分毎 → 1日1回

15分毎に同期状態をチェックする必要は冷静に考えてなかった。

agentの実行制限

  • timeoutSeconds: 600 → 120(暴走時の早期打ち切り)
  • tools.loopDetection: 有効化(10回で警告、20回で遮断)

agentが無限ループに入ってトークンを溶かすリスクがあるようなので、設定項目を眺めていて見つけて有効にした。

OpenClawに依存しない失敗通知

システムcrontabに移行したジョブはOpenClaw経由の通知が使えなくなる。Discord Webhookでアラート通知用チャンネルに投げるrun-with-alert.shラッパーを作った。あわせて、失敗時にexit 0で返っていたPythonスクリプト4本をsys.exit(1)に修正した。exit 0で返すなよという話ではあるが、まあOpenClawにやらせていた頃はexit codeを見ていなかったので仕方ない。

コスト面

OpenClawのセッションログから直近7日間のトークン消費量を計測し、月間に換算したところ、推定$11.50(OpenRouter従量課金)。ChatGPT Plusの$20固定から下がる見込み。Gemini 2.5 Flashはgpt-4oの約1/10の単価で、ツール呼び出しの精度も高く、日本語も問題ない。スクリプト系ジョブはAPI呼び出しゼロになったので、レートリミットとは完全に無関係になった。

今後の運用は2パターン考えている。cronの見直しでChatGPT Plusのレートリミット内に収まるなら、codexをprimaryに戻してGemini 2.5 Flashは保険にする。逆にGeminiだけで十分回るなら、ChatGPT Plusを解約してコストを下げる。1-2週間の試用運転で判断するつもり。

学んだこと

  • LLMが不要なジョブにagentセッションを使うのは無駄。シェルスクリプトを直接実行するだけならcrontabで十分
  • agentが死んだら通知も死ぬ。OpenClaw自体がレートリミットで停止するとエラー監視cronも動かない。運用のレジリエンスを高めるなら通知経路は分けておきたい

最初から全部OpenClawに任せるのが楽だったし、実際しばらくはそれで回っていた。ただ無料(ChatGPT Plusの固定料金内)で使い放題だと思って雑にジョブを増やしていった結果、枠を使い切って全部止まった。単一障害点を作るなとは仕事で散々言っているのに、自分の環境でやらかすのだからしょうもない。まあ、自分の環境だから好き勝手やれるんだが。