wolfbot は、Discord 上で 9 人村の人狼を進行する Python 製 bot です。/wolf コマンドでロビー作成から開始、進行確認、延長、強制終了まで操作できます。人間プレイヤーが 9 人に満たない場合は、xAI Grok / DeepSeek / Vertex AI 経由の Google Gemini いずれかを使う LLM プレイヤーが不足人数を補完します。LLM backend は環境変数 LLM_PROVIDER で切り替えます (既定は xai)。9 人村専用で、人間は主に VC で会話し、LLM を含む村ではメイン text チャンネルの投稿も議論材料として扱います。
- 固定配役
人狼2 / 狂人1 / 占い師1 / 霊媒師1 / 騎士1 / 村人3の 9 人村を Discord 上で進行できます。 - 人間プレイヤーが 9 人未満のとき、不足人数を Gnosia 風 persona の LLM プレイヤーで自動補完します。
- 秘密投票と夜行動を bot DM で受け付けます。
- 死者専用の
wolf-heavenと、人狼専用のwolf-wolvesを自動で作成します。 - メイン text チャンネルと秘密チャンネルの権限を進行に合わせて更新します。
- SQLite にゲーム状態を保存し、bot 再起動後は進行中ゲームの復旧を試みます。
- 締切時に未提出が残った場合は自動進行せず、ホスト判断待ちに入れます。
Python 3.11uv- Discord Bot アプリケーション
- xAI / DeepSeek の API キー、または Vertex AI Gemini を呼べる Google Cloud project と ADC (
LLM_PROVIDERで選んだもの) - 既存のメイン text チャンネル
- 既存のメイン VC
uv sync.env.example をコピーして .env を作成し、各値を設定します。
cp .env.example .env最初は次の内容を埋めれば起動に必要な最低限の設定が揃います (xAI を使う場合)。DeepSeek を使う場合は LLM_PROVIDER=deepseek にして DEEPSEEK_API_KEY を、Gemini を使う場合は LLM_PROVIDER=gemini にして GEMINI_VERTEX_PROJECT を設定し、gcloud auth application-default login などで ADC を構成してください。
DISCORD_TOKEN=your_discord_bot_token
LLM_PROVIDER=xai
XAI_API_KEY=your_xai_api_key
XAI_MODEL=grok-4-1-fast-reasoning
DEEPSEEK_API_KEY=
DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_MODEL=deepseek-v4-flash
DEEPSEEK_THINKING=enabled
DEEPSEEK_REASONING_EFFORT=max
GEMINI_VERTEX_PROJECT=
GEMINI_VERTEX_LOCATION=global
GEMINI_MODEL=gemini-3-flash-preview
GEMINI_THINKING_LEVEL=high
GEMINI_TEMPERATURE=1.0
DISCORD_GUILD_ID=123456789012345678
MAIN_TEXT_CHANNEL_ID=123456789012345678
MAIN_VOICE_CHANNEL_ID=123456789012345678
WOLFBOT_DB_PATH=./wolfbot.db
LOG_LEVEL=INFODISCORD_TOKEN: Discord Developer Portal で作成した bot のトークンを入れます。LLM_PROVIDER:xai/deepseek/geminiのいずれか。既定はxai。XAI_API_KEY:LLM_PROVIDER=xaiのとき必須。xAI の API キーを入れます。DEEPSEEK_API_KEY:LLM_PROVIDER=deepseekのとき必須。DeepSeek の API キーを入れます。GEMINI_VERTEX_PROJECT:LLM_PROVIDER=geminiのとき必須。Vertex AI を使う Google Cloud project ID を入れます。認証は ADC/IAM で行います (gcloud auth application-default login、または実行環境に attach した service account)。DISCORD_GUILD_ID: bot を動かす Discord サーバーの ID を入れます。MAIN_TEXT_CHANNEL_ID: 議論用に使うメイン text チャンネルの ID を入れます。MAIN_VOICE_CHANNEL_ID: プレイヤーが会話するメイン VC の ID を入れます。XAI_MODEL,DEEPSEEK_BASE_URL,DEEPSEEK_MODEL,DEEPSEEK_THINKING,DEEPSEEK_REASONING_EFFORT,GEMINI_VERTEX_LOCATION,GEMINI_MODEL,GEMINI_THINKING_LEVEL,GEMINI_TEMPERATURE,WOLFBOT_DB_PATH,LOG_LEVELは最初は既定値のままで構いません。
DISCORD_GUILD_ID、MAIN_TEXT_CHANNEL_ID、MAIN_VOICE_CHANNEL_ID にはチャンネル名や #channel のようなメンション文字列ではなく、数値の ID を設定してください。どの guild やチャンネルを使うか未定なら、先に手順 3 を済ませてから .env を埋めてください。LLM_PROVIDER=gemini で GEMINI_VERTEX_PROJECT の値がまだ決まっていない場合は、先に手順 4 を済ませてから埋めてください。
-
bot を運用する guild を 1 つ決めます。
-
その guild に、ゲーム専用で使う既存のメイン text チャンネルと既存のメイン VC を用意します。
-
メイン text チャンネルは、ゲーム外の投稿や観戦者の発言が混ざらないよう、専用チャンネルにするか基底権限を事前に確認します。
-
Discord Developer Portal で対象 app の
Botページを開き、Privileged Gateway Intents のMessage Content IntentとServer Members Intentを有効にします。 -
同じ
BotページでRequire OAuth2 Code Grantが有効なら無効にします。これが有効だと、通常のAdd to serverフローだけでは bot が guild に参加しません。owner 以外にも追加させたい場合はPublic Botも有効にしておきます。 -
Installationページを開き、Install LinkがDiscord Provided Linkになっていることを確認します。 -
Installation ContextsでGuild Installを有効にします。 -
Default Install SettingsのGuild Install側で、scopes にbotとapplications.commandsの両方を入れます。applications.commandsだけでは slash command app としては入っても、bot メンバーとして guild に参加しません。 -
bot に次の権限を付与します。
権限名 必須 / 補足 用途 View Channels必須 メイン text、 wolf-heaven、wolf-wolvesを閲覧するためSend Messages必須 進行案内、朝の通知、ホスト待ち通知、復旧通知を送るため Manage Channels必須 wolf-heavenとwolf-wolvesを作成・削除するためManage Roles必須 チャンネルごとの permission overwrite を更新するため Administrator補足 初回の動作確認や切り分けには使えますが、常用は推奨しません Manage Rolesは Discord の画面によってManage Permissionsのように表示されることがあります。Send Messagesがなければ公開チャンネルへの進行通知ができず、View Channelsがなければチャンネル自体にアクセスできません。この bot は VC に参加したり発話したりしないため、音声系の権限は不要です。DM 送信は guild 権限ではなく各プレイヤーの DM 受信設定に依存します。
-
Installationページの default Install Link を開き、Add to serverを選んで対象 guild にインストールします。server に bot を入れたい場合はAdd to my appsではなくAdd to serverを選んでください。 -
インストール後、対象 guild のメンバー一覧に bot が表示されることを確認します。
-
メンバー一覧に bot がいない場合は
Server Settings > Integrationsを確認します。app は見えるのに bot メンバーがいない場合は、Guild Installやbotscope の設定がずれている可能性が高いので、Developer Portal のInstallationページを見直してから入れ直します。 -
Discord クライアントで開発者モードを有効にし、guild とチャンネルの数値 ID をコピーできるようにします。
-
サーバー ID をコピーして
DISCORD_GUILD_IDに入れます。 -
メイン text チャンネルの ID をコピーして
MAIN_TEXT_CHANNEL_IDに入れます。 -
メイン VC の ID をコピーして
MAIN_VOICE_CHANNEL_IDに入れます。 -
プレイヤーが bot から DM を受け取れる状態か確認します。
/wolf start実行時に DM を開けない参加者がいると開始できません。 -
wolf-heavenとwolf-wolvesはゲーム作成時に bot が自動で作成し、ゲーム終了時に削除するため、管理者が事前に作る必要はありません。
LLM_PROVIDER=gemini で起動する場合のみ実施します。xai / deepseek を使う場合は読み飛ばして手順 5 へ進んでください。wolfbot は Vertex AI Express mode と API key 認証には対応せず、ADC/IAM のみをサポートします。
-
Google Cloud project を用意します。既存 project を使うか、Cloud Console (
https://console.cloud.google.com/) またはgcloud projects create PROJECT_IDで新規作成します。 -
その project に billing account を紐付けます。Vertex AI は無料 tier がないため、billing が有効でないと API 呼び出しが reject されます。
-
gcloud CLI をインストールします (
https://cloud.google.com/sdk/docs/install)。インストール済みならgcloud versionで確認できます。 -
gcloud をログインして既定 project を設定します。
gcloud init gcloud config set project PROJECT_ID -
Vertex AI API を有効化します。
serviceusage.services.enable権限が必要で、project の owner/editor なら持っています。gcloud services enable aiplatform.googleapis.com -
bot を実行する Google アカウントに
roles/aiplatform.user(Vertex AI User) を付与します。owner/editor を持っているなら不要です。gcloud projects add-iam-policy-binding PROJECT_ID \ --member="user:YOUR_ACCOUNT@example.com" \ --role="roles/aiplatform.user"
-
ADC (Application Default Credentials) を構成します。
gcloud auth application-default login gcloud auth application-default set-quota-project PROJECT_ID
1 行目はブラウザを開いて Google ログインを行い、credentials を
~/.config/gcloud/application_default_credentials.jsonに保存します。2 行目は ADC が請求先として参照する project を書き込みます (未設定だとYour application has authenticated using end user credentialsの quota project warning が呼び出しごとに出ます)。 -
.envの値を埋めます。LLM_PROVIDER=gemini GEMINI_VERTEX_PROJECT=PROJECT_ID GEMINI_VERTEX_LOCATION=global
gemini-3-flash-previewは locationglobalで利用可能です。他 region を指定する場合は Vertex AI の Gemini モデル提供 region 一覧でgemini-3-flash-previewの対応 region を確認してください。 -
(任意) ADC が正しく構成されたか確認します。
gcloud auth application-default print-access-token
token が表示されれば ADC は機能しています。
bot を起動する(手順 5) で実際に LLM 席が動けば end-to-end で動作確認できます。
VM / container などで常駐させる場合は、user 個人の ADC ではなく service account を使ってください。
-
service account を作成して
roles/aiplatform.userを付与します。gcloud iam service-accounts create wolfbot-vertex \ --display-name="wolfbot Vertex AI runner" gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:wolfbot-vertex@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/aiplatform.user"
-
実行環境に応じて service account を attach します。
- GCE / Cloud Run / GKE: instance attach か workload identity を使えば、bot 側で
GOOGLE_APPLICATION_CREDENTIALSを設定する必要はありません。ADC が自動で拾います。 - その他 (オンプレ / 別クラウド): service account key (JSON) を発行して
GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.jsonを bot プロセスの環境変数に設定。key file は漏洩リスクが高いので、可能なら attached service account / workload identity を優先してください。
- GCE / Cloud Run / GKE: instance attach か workload identity を使えば、bot 側で
uv run wolfbot起動後、/wolf コマンドが設定した guild に同期されます。
| 変数名 | 必須 / 既定値 | 用途 |
|---|---|---|
DISCORD_TOKEN |
必須 | Discord bot のトークン |
LLM_PROVIDER |
既定値: xai |
LLM backend: xai / deepseek / gemini |
XAI_API_KEY |
LLM_PROVIDER=xai のとき必須 |
xAI API キー |
XAI_MODEL |
既定値: grok-4-1-fast |
使用する xAI モデル名 |
DEEPSEEK_API_KEY |
LLM_PROVIDER=deepseek のとき必須 |
DeepSeek API キー |
DEEPSEEK_BASE_URL |
既定値: https://api.deepseek.com |
DeepSeek API の base URL |
DEEPSEEK_MODEL |
既定値: deepseek-v4-flash |
使用する DeepSeek モデル名 |
DEEPSEEK_THINKING |
既定値: enabled |
DeepSeek thinking mode (enabled / disabled) |
DEEPSEEK_REASONING_EFFORT |
既定値: max |
thinking enabled 時の reasoning effort (high / max) |
GEMINI_VERTEX_PROJECT |
LLM_PROVIDER=gemini のとき必須 |
Vertex AI を使う Google Cloud project ID。認証は ADC/IAM (gcloud auth application-default login か service account) |
GEMINI_VERTEX_LOCATION |
既定値: global |
Vertex AI Gemini API の location |
GEMINI_MODEL |
既定値: gemini-3-flash-preview |
使用する Gemini モデル名 |
GEMINI_THINKING_LEVEL |
既定値: high |
Gemini 3 Flash thinking level (minimal / low / medium / high) |
GEMINI_TEMPERATURE |
既定値: 1.0 (範囲 0.0〜2.0) |
Vertex AI Gemini sampling temperature。Gemini 3 では 1.0 推奨。低くしすぎると looping や品質低下の原因になり得ます |
DISCORD_GUILD_ID |
必須 | /wolf コマンドを同期する guild の ID |
MAIN_TEXT_CHANNEL_ID |
必須 | 議論用に使う既存のメイン text チャンネル ID |
MAIN_VOICE_CHANNEL_ID |
必須 | 参加者が会話する既存のメイン VC の ID |
WOLFBOT_DB_PATH |
既定値: ./wolfbot.db |
SQLite データベースの保存先 |
LOG_LEVEL |
既定値: INFO |
ログ出力レベル |
LLM_PROVIDER=gemini は Vertex AI ADC/IAM 専用です。Vertex AI Express mode と API key 認証は非対応です。
- メイン text チャンネルとメイン VC は、bot が新規作成するのではなく既存チャンネルを使います。
- slash command は
/wolfグループで提供され、設定された 1 つの guild に同期されます。 - bot を guild へ入れるときは
Add to serverを選びます。Add to my appsは user install で、server member としては参加しません。 - bot はゲーム作成時に秘密 text チャンネル
wolf-heavenとwolf-wolvesを自動作成し、ゲーム終了時に削除します。 - bot は進行に応じてチャンネル権限の上書きを更新します。必要な権限はセットアップ手順 3 の表を参照してください。
Server Settings > Integrationsにだけ app が見えて bot メンバーがいない場合は、InstallationページのGuild Installとbotscope を見直してください。- メイン text チャンネルの基底権限と、プレイヤーの DM 受信設定は事前に管理者が確認してください。
- ホストが
/wolf createでゲームを作成します。 - 参加者が
/wolf joinでロビーに入ります。開始前なら/wolf leaveで退出できます。 - ホストが
/wolf startを実行すると、人数不足がある場合は LLM が補完されてゲームが始まります。 - 進行中の状況確認には
/wolf statusを使います。 - 締切時に未提出が残って止まった場合は、ホストが
/wolf extendまたは/wolf force-skipで再開します。 - 進行中のゲームを中止したい場合は、ホストまたは管理者が
/wolf abortを使います。
| コマンド | 役割 |
|---|---|
/wolf create |
新しい 9 人村ゲームを作成し、秘密チャンネルを準備します。 |
/wolf join |
ロビー中のゲームに参加します。 |
/wolf leave |
ロビー中のゲームから退出します。 |
/wolf start |
ゲームを開始します。人数不足があると LLM を補完します。 |
/wolf status |
現在のフェイズ、残り時間、参加者、生死、ホスト待ち情報を確認します。 |
/wolf extend |
ホスト判断待ち中の締切を延長します。 |
/wolf force-skip |
ホスト判断待ち中に未提出を確定扱いにして進行します。 |
/wolf abort |
ホストまたは管理者が進行中のゲームを強制終了します。 |
- ゲームは
LOBBYから始まり、開始時に不足人数があれば LLM プレイヤーを自動補完します。 - 役職配布と初夜処理のあと、1 日目の昼議論に入ります。
- 以後は、昼議論、投票、必要なら決選投票、夜行動を繰り返します。
- 投票と夜行動は bot DM で行います。
- 死亡者は天国チャンネルを使い、人狼は夜に人狼専用チャットを使います。
- 締切を過ぎても未提出が残っている場合は自動で先に進まず、ホストが
/wolf extendまたは/wolf force-skipを実行するまで待機します。
- LLM は VC 音声を読みません。LLM を含む村では、重要な情報をメイン text チャンネルにも流してください。
- CO、占い結果、霊媒結果、質問、強い疑い、要約などは text に残しておく運用が前提です。
- VC の音声認識や自動文字起こしはありません。
- Web UI はありません。
- 9 人村以外の配役には対応していません。
- 実運用では、メインチャンネルの権限設定とプレイヤーの DM 受信設定が前提になります。
/wolf create実行中に bot プロセスが強制終了した場合、Discord 上にwolf-heaven/wolf-wolvesのチャンネルが orphan として残ることがあります。bot は安全のため次回/wolf createを「同名チャンネルが既に存在する」エラーで止めるので、Discord 上で該当チャンネルを手動削除してから再実行してください (DB エラーなど通常の例外で create が失敗した場合は bot 側で自動クリーンアップされます)。
開発用の基本コマンドは以下です。
uv run pytest tests
uv run ruff check src tests
uv run ruff format src tests
uv run mypy詳細な仕様や実装上の前提を確認したい場合は CLAUDE.md と prompts/IMPLEMENTATION_PROMPT.md を参照してください。