← 一覧に戻る

Discord Bot が10時間止まった原因と、今後の改善プラン

2026年3月13日 00:30 更新

一言でいうと

Botが「質問して止まる」バグを直して、さらに安全装置を複数追加する計画

なぜこれが必要なのか

Discordから @ai-hara にメンションすると、裏で Claude Code(AIがコードを書いてくれるツール)が動いて、結果をDiscordに返してくれる仕組みがある。

ところが3月11日の夜、Botに投げたタスクが10時間以上止まったままになっていた。その間、後続のタスクも全部キュー(順番待ちの列)に詰まって動けなくなっていた。放置すると、誰かがメンションしても永遠に返事が来ない「死んだBot」状態が続く。

何が起きていたのか

仕組みのおさらい

Botは claude --print(クロード プリント)という「一方通行モード」でAIを呼び出している。手紙を投函して返事を待つイメージで、こちらから追加の返事はできない。

今回の問題

起きたこと
AIが「3つ確認したいことがあるんだけど、どうする?」と質問を返してきた。でも一方通行モードなので、こちらから答える手段がない。AIは返事を待ち続け、プロセス(実行中の処理)が10時間以上生き残ったまま停止。
根本原因
AIに「質問するな、自分で判断して最後までやれ」という指示がなかった。

すでに直したこと(3/12 対応済み)

Before

  • AIが質問して止まる可能性あり
  • タイムアウトなし(永遠に走る)
  • 止まっても通知なし

After

  • 「質問せず自律完了せよ」指示を追加
  • 30分タイムアウトで強制停止
  • 停止時はDiscordに通知+再開IDを表示

さらにやるべき改善(調査結果)

X(Twitter)での最新トレンド調査、Claude Code公式ドキュメント、Codex(OpenAIのAI、GPT-5.4搭載)への相談を合わせて、実装すべき改善を優先度順に整理した

OpenCrew(DiscordでAIエージェントを動かすサービス)の流行もあって、「Discord上でAIを動かすならこうすべき」というベストプラクティス(最善の方法)が急速に固まってきている。

すぐやるべき — 設定を1行追加するだけ

Claude Code には「こういう制限で動け」と指定できるオプション(旗のようなもの)がいくつか用意されている。コードをほぼ変えずに追加するだけで安全性が大幅に上がる。

ツール回数上限 / 課金上限 / ツール制限
--max-turns(回数制限)、--max-budget-usd(課金上限)、--allowedTools(ツール制限)の3つ。
💬 追記(3/12): 不要。うちはMaxプラン(サブスクリプション=月額定額制)で使っているので、「使った分だけ課金される」API方式とは違う。予算上限やツール回数制限は、API課金で暴走を防ぐためのもの。定額制なら何回使っても料金は変わらないので意味がない。
1 AI混雑時の自動切替
--fallback-model で、メインのAIモデル(頭脳にあたるもの)が混雑しているときに自動的に別のモデルで処理する。「窓口1が混んでたら窓口2に回す」ようなもの。

次にやるべき — コードの書き換えが必要

リアルタイム進捗表示
ストリーム形式で段階的にDiscordに表示する案。
💬 追記(3/12): 不要。現状の使い方(自分だけが使うBot)では、⏳リアクションで「処理中」が分かれば十分。
2 セキュリティの穴を塞ぐ
今のコードは shell: true(シェル経由で実行する設定)で動いている。これは「玄関のドアを開けっぱなしにしている」ようなもので、悪意のある入力でシステムコマンドが実行される可能性がある。shell: false に変えてAIの実行環境を厳格に制限する必要がある。
💬 回答(3/12): shell: true を外すと、OSが claude というコマンドをPATH(コマンドの探索先一覧)から自動で見つけてくれなくなる。対処法は簡単で、claudeコマンドの「住所」をフルパスで書くだけ。例えば /Users/aiharataketo/.local/bin/claude のように、省略せずに完全な場所を指定する。住所を直書きすることで、シェルという「仲介人」を通さなくなり、悪意のある入力が途中でシステムコマンドに化けるリスクがなくなる。
3 入力の検問所を作る
Discordからの入力は「信頼できないデータ」として扱うべき。Hook(フック = 処理の前後に差し込む検査機能。空港の手荷物検査のようなもの)を使って、危険なコマンド(ファイル全削除など)が実行される前にブロックする。今はチャンネル内の他人の発言もAIに渡しているので、そこが攻撃の入り口になりうる。
4 Bot再起動時にタスクを失わない仕組み
Graceful Shutdown(穏当な停止処理)を入れる。再起動命令が来たら → 新規受付を停止 → 処理中のタスクは完了まで待つ → 待ちきれないものは再開用IDつきで保留にする。今は再起動するとキュー内のタスクが消えてしまう。

将来検討枠 — もっと大きな改造

5 Claude Code SDK(開発キット)への移行 ⭐
今は「コマンドを打って結果を受け取る」方式だが、公式のSDK(プログラムから直接AIを呼べるライブラリ。TypeScript版・Python版あり)に移行すると、プロセス管理の面倒な部分がごっそり消える。
💬 調査結果(3/13): 公式の Agent SDK が存在する。移行推奨。

今の方式(コマンド呼び出し):
Botが claude --print というコマンドを外部プログラムとして起動し、テキストの出力を待っている。例えるなら「レストランに電話注文して、完成まで電話口で待つ」方式。途中経過は見えないし、切りたいときにも面倒。

SDK方式(公式ライブラリ):
Anthropic公式のTypeScript/Pythonパッケージ(@anthropic-ai/claude-code)を使う。Claude Codeの中身(ツール実行・エージェントループ・コンテキスト管理)がそのままプログラムから操作できる。「厨房に直接入って料理を作れる」方式。

SDK移行で何が変わるか:
  • shell:true が不要に — コマンド経由ではなくなるので、セキュリティの穴(項目2)が自動的に消える
  • ストリーミング対応 — SDKは途中経過をイベントとして受け取れる。将来必要になったらすぐ対応可能
  • ツール承認コールバック — 特定のツール実行時に「これやっていい?」をプログラムから制御できる(項目3の入力検問が楽になる)
  • プロセス管理が不要に — spawn/kill/タイムアウトの自前管理が消える。SDKが面倒を見てくれる
  • 構造化された出力 — JSONスキーマを指定して型付きの結果を受け取れる。今の「テキスト出力を丸ごとDiscordに貼る」方式より柔軟

結論: 項目2(shell:true)・3(入力検問)・4(Graceful Shutdown)の問題がSDK移行でまとめて解決する。個別に直すよりSDK移行を先にやる方が効率的。
チャンネル別の並列処理
別チャンネルの依頼を同時に処理する案。
💬 追記(3/12): YAGNI(今必要ないものは作らない)。現状は自分ひとりで使うBotなので、並列処理の需要がない。必要になったときに考える。

ポイント

Claude(Anthropic社)とCodex(OpenAI社)の両方に調査させた結果、意見が一致した点が多かった。特に「ストリーミング応答でUXを上げる」「タスク単位の予算上限」「入力の信頼性チェック」は両者とも上位にランクイン。異なるAI会社のモデルが同じ結論に至っているので、確度が高い。

OpenCrewの影響で「Discord × AIエージェント」のパターンは急速に標準化が進んでいる。共通のトレンドは「最終回答だけ返すBot」から「進捗をリアルタイムで見せる中継役」への進化。

見送った選択肢: AIモデルの切替は「失敗した同じタスクを別AIで再実行」ではなく「タスクの種類ごとに使うAIを最初から決めておく」方が良い、というCodexの助言を採用予定。同じ質問に違うAIが答えると結果がブレて運用が混乱するため。

📝 質問モード — テキストを選択してね
✓ 質問を送信しました