ポストモーテム:Claude Max + OpenClawにおける古いOAuthと孤立したCronジョブによる課金エラー

Claude Maxを使用したセルフホスト型OpenClaw環境で、割り当てを十分に下回っているにもかかわらず、billing error — API key has run out of creditsが返されるようになりました。2日間のデバッグの結果、2つの根本原因と、エラーをランダムに見せるキルチェーンが明らかになりました。
根本原因1: 期限切れOAuthトークンがプロバイダ全体を汚染
auth-profiles.jsonには2つのエントリがありました。有効なanthropic:claude-cli OAuthプロファイルと、sk-ant-oat01-...トークンを持つanthropic:manualプロファイルです。手動トークンの期限が切れると、OpenClawはそのプロファイルを失敗させるだけでなく、プロバイダレベルの課金失敗として分類し、anthropicプロバイダ全体をブラックリスト化し、正常なOAuthプロファイルを含むすべてのモデルをスキップしました。ログには次のように表示されていました:
reason: "billing" errorPreview: "Provider anthropic has billing issue (skipping all models)" chain_exhausted
有効なリフレッシュトークンを持つ正常なOAuthプロファイルは試行されませんでした。
修正: anthropic:manualをauth-profiles.jsonとopenclaw.jsonから完全に削除します。anthropic:claude-cliのみを残します。
根本原因2: 分離されたcronジョブが別の課金バケットにヒット
OpenClawには2つの実行パスがあります:
- メインセッション —
/usr/bin/claudeバイナリを実行し、Max/Proサブスクリプションに請求されます ✅ - 分離/組み込み実行 — Anthropic APIへの直接HTTP呼び出しで、Extra Usageバケットに請求されます ❌
sessionTarget: isolatedのcronジョブは、スタンドアロンの組み込みエージェントを起動し、HTTP経由でAnthropic APIを直接呼び出します — CLIが送信するClaude Codeヘッダーは含まれません。AnthropicはこれをExtra Usageバケットにルーティングし、これは完全に別の割り当てです。Extra Usageがオフの場合、すべての分離cron実行は400エラーを返します。OpenClawはさらに悪化させます: 1回の課金エラーでauth-state.jsonのdisabledUntilが約24時間先に設定され、クールダウンが発動するまで通常のチャットを含むすべてのリクエストをロックアウトします。ロックアウトはゲートウェイ再起動後も持続します。
完全なキルチェーン
- ゲートウェイ再起動 → 見逃されたcronジョブがキャッチアップのためにキューイングされる
- 分離エージェントが組み込みランナーを介して起動 → Anthropic APIへの直接HTTP呼び出し(CLIヘッダーなし)
- Extra Usageバケット → 400エラー
- OpenClawが認証プロファイルを約24時間ロック → 通常のチャットを含むすべてのリクエストがブロックされる
修正手順
- 課金ロックアウトを即座に解除:
python3 -c " import json with open('/home/USER/.openclaw/agents/main/agent/auth-state.json') as f: d = json.load(f) if 'usageStats' in d: for profile in d['usageStats']: d['usageStats'][profile].pop('disabledUntil', None) d['usageStats'][profile].pop('failureCounts', None) d['usageStats'][profile].pop('errorCount', None) d['usageStats'][profile].pop('disabledReason', None) d['usageStats'][profile].pop('lastFailureAt', None) with open('/home/USER/.openclaw/agents/main/agent/auth-state.json', 'w') as f: json.dump(d, f, indent=2) print('クリア完了。') " openclaw gateway restart - すべてのcronジョブを
isolatedからmainに移動:python3 -c " import json with open('/home/USER/.openclaw/cron/jobs.json') as f: d = json.load(f) jobs = d if isinstance(d, list) else d.get('jobs', []) for j in jobs: if j.get('sessionTarget') == 'isolated': print(f'修正中: {j["name"]}') j['sessionTarget'] = 'main' with open('/home/USER/.openclaw/cron/jobs.json', 'w') as f: json.dump(d, f, indent=2) print('完了。') "
対象者: OpenClawをセルフホストし、Claude MaxまたはProを使用していて、割り当てを下回っているにもかかわらずランダムな課金エラーが発生するすべての人。
📖 全文ソースを読む: r/openclaw
👀 See Also

マルチエージェントアーキテクチャ:AIシステムにおけるシングルエージェントの落とし穴を回避する
Redditの投稿では、複数のタスクに単一のエージェントを使用するという一般的なアーキテクチャ上の誤りが指摘されており、これが絶え間ない監視を必要とする脆弱なシステムにつながっています。提案されている解決策は、各エージェントが狭く特定の役割を持つオーケストレーターとスペシャリストのモデルです。

ローカルLLMとクラウドLLMの一貫したベンチマーク手法
開発者が、llama.cpp、vLLM、Ollamaなどのローカルモデルと、GPT-5.4、Claude Sonnet 4.6、Gemini 3.1 ProなどのクラウドAPIを、ZenMuxのような統一エンドポイントを通じて比較するために、順次リクエストとルールベースのスコアリングを使用した測定セットアップを共有しています。

修正自托管Docker版OpenClaw中的“导航不支持”和浏览器插件错误
VPS(例:Hostinger)でOpenClawをセルフホスティングする際に発生するEACCES権限エラー、Playwrightの欠落、Chromiumバイナリ問題のステップバイステップ修正方法。

ClaudeでAPIエンドポイントを構築:70以上のエンドポイントプロジェクトから得た実践的プロンプトエンジニアリングの教訓
開発者がClaudeを使用してコードの約80%を書き、70以上のLinkedIn自動化APIエンドポイントを構築しました。アクション実行エージェントに対しては、自然言語の指示よりも、明示的な制約を持つ契約のようなプロンプトの扱いが効果的であることを発見しました。