Skip to content

Aimitmk/wolf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

92 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

wolfbot

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.11
  • uv
  • Discord Bot アプリケーション
  • xAI / DeepSeek の API キー、または Vertex AI Gemini を呼べる Google Cloud project と ADC (LLM_PROVIDER で選んだもの)
  • 既存のメイン text チャンネル
  • 既存のメイン VC

セットアップ

1. 依存関係をインストールする

uv sync

2. .env を用意する

.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=INFO
  • DISCORD_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_IDMAIN_TEXT_CHANNEL_IDMAIN_VOICE_CHANNEL_ID にはチャンネル名や #channel のようなメンション文字列ではなく、数値の ID を設定してください。どの guild やチャンネルを使うか未定なら、先に手順 3 を済ませてから .env を埋めてください。LLM_PROVIDER=geminiGEMINI_VERTEX_PROJECT の値がまだ決まっていない場合は、先に手順 4 を済ませてから埋めてください。

3. Discord 側の設定を済ませる

  1. bot を運用する guild を 1 つ決めます。

  2. その guild に、ゲーム専用で使う既存のメイン text チャンネルと既存のメイン VC を用意します。

  3. メイン text チャンネルは、ゲーム外の投稿や観戦者の発言が混ざらないよう、専用チャンネルにするか基底権限を事前に確認します。

  4. Discord Developer Portal で対象 app の Bot ページを開き、Privileged Gateway Intents の Message Content IntentServer Members Intent を有効にします。

  5. 同じ Bot ページで Require OAuth2 Code Grant が有効なら無効にします。これが有効だと、通常の Add to server フローだけでは bot が guild に参加しません。owner 以外にも追加させたい場合は Public Bot も有効にしておきます。

  6. Installation ページを開き、Install LinkDiscord Provided Link になっていることを確認します。

  7. Installation ContextsGuild Install を有効にします。

  8. Default Install SettingsGuild Install 側で、scopes に botapplications.commands の両方を入れます。applications.commands だけでは slash command app としては入っても、bot メンバーとして guild に参加しません。

  9. bot に次の権限を付与します。

    権限名 必須 / 補足 用途
    View Channels 必須 メイン text、wolf-heavenwolf-wolves を閲覧するため
    Send Messages 必須 進行案内、朝の通知、ホスト待ち通知、復旧通知を送るため
    Manage Channels 必須 wolf-heavenwolf-wolves を作成・削除するため
    Manage Roles 必須 チャンネルごとの permission overwrite を更新するため
    Administrator 補足 初回の動作確認や切り分けには使えますが、常用は推奨しません

    Manage Roles は Discord の画面によって Manage Permissions のように表示されることがあります。Send Messages がなければ公開チャンネルへの進行通知ができず、View Channels がなければチャンネル自体にアクセスできません。

    この bot は VC に参加したり発話したりしないため、音声系の権限は不要です。DM 送信は guild 権限ではなく各プレイヤーの DM 受信設定に依存します。

  10. Installation ページの default Install Link を開き、Add to server を選んで対象 guild にインストールします。server に bot を入れたい場合は Add to my apps ではなく Add to server を選んでください。

  11. インストール後、対象 guild のメンバー一覧に bot が表示されることを確認します。

  12. メンバー一覧に bot がいない場合は Server Settings > Integrations を確認します。app は見えるのに bot メンバーがいない場合は、Guild Installbot scope の設定がずれている可能性が高いので、Developer Portal の Installation ページを見直してから入れ直します。

  13. Discord クライアントで開発者モードを有効にし、guild とチャンネルの数値 ID をコピーできるようにします。

  14. サーバー ID をコピーして DISCORD_GUILD_ID に入れます。

  15. メイン text チャンネルの ID をコピーして MAIN_TEXT_CHANNEL_ID に入れます。

  16. メイン VC の ID をコピーして MAIN_VOICE_CHANNEL_ID に入れます。

  17. プレイヤーが bot から DM を受け取れる状態か確認します。/wolf start 実行時に DM を開けない参加者がいると開始できません。

  18. wolf-heavenwolf-wolves はゲーム作成時に bot が自動で作成し、ゲーム終了時に削除するため、管理者が事前に作る必要はありません。

4. (Gemini を使う場合) Vertex AI ADC を構成する

LLM_PROVIDER=gemini で起動する場合のみ実施します。xai / deepseek を使う場合は読み飛ばして手順 5 へ進んでください。wolfbot は Vertex AI Express mode と API key 認証には対応せず、ADC/IAM のみをサポートします。

  1. Google Cloud project を用意します。既存 project を使うか、Cloud Console (https://console.cloud.google.com/) または gcloud projects create PROJECT_ID で新規作成します。

  2. その project に billing account を紐付けます。Vertex AI は無料 tier がないため、billing が有効でないと API 呼び出しが reject されます。

  3. gcloud CLI をインストールします (https://cloud.google.com/sdk/docs/install)。インストール済みなら gcloud version で確認できます。

  4. gcloud をログインして既定 project を設定します。

    gcloud init
    gcloud config set project PROJECT_ID
  5. Vertex AI API を有効化します。serviceusage.services.enable 権限が必要で、project の owner/editor なら持っています。

    gcloud services enable aiplatform.googleapis.com
  6. 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"
  7. 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 が呼び出しごとに出ます)。

  8. .env の値を埋めます。

    LLM_PROVIDER=gemini
    GEMINI_VERTEX_PROJECT=PROJECT_ID
    GEMINI_VERTEX_LOCATION=global

    gemini-3-flash-preview は location global で利用可能です。他 region を指定する場合は Vertex AI の Gemini モデル提供 region 一覧で gemini-3-flash-preview の対応 region を確認してください。

  9. (任意) ADC が正しく構成されたか確認します。

    gcloud auth application-default print-access-token

    token が表示されれば ADC は機能しています。bot を起動する (手順 5) で実際に LLM 席が動けば end-to-end で動作確認できます。

production / 常駐サーバーで動かす場合

VM / container などで常駐させる場合は、user 個人の ADC ではなく service account を使ってください。

  1. 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"
  2. 実行環境に応じて 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 を優先してください。

5. 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.02.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 認証は非対応です。

Discord 側の準備

  • メイン text チャンネルとメイン VC は、bot が新規作成するのではなく既存チャンネルを使います。
  • slash command は /wolf グループで提供され、設定された 1 つの guild に同期されます。
  • bot を guild へ入れるときは Add to server を選びます。Add to my apps は user install で、server member としては参加しません。
  • bot はゲーム作成時に秘密 text チャンネル wolf-heavenwolf-wolves を自動作成し、ゲーム終了時に削除します。
  • bot は進行に応じてチャンネル権限の上書きを更新します。必要な権限はセットアップ手順 3 の表を参照してください。
  • Server Settings > Integrations にだけ app が見えて bot メンバーがいない場合は、Installation ページの Guild Installbot scope を見直してください。
  • メイン text チャンネルの基底権限と、プレイヤーの DM 受信設定は事前に管理者が確認してください。

使い方

  1. ホストが /wolf create でゲームを作成します。
  2. 参加者が /wolf join でロビーに入ります。開始前なら /wolf leave で退出できます。
  3. ホストが /wolf start を実行すると、人数不足がある場合は LLM が補完されてゲームが始まります。
  4. 進行中の状況確認には /wolf status を使います。
  5. 締切時に未提出が残って止まった場合は、ホストが /wolf extend または /wolf force-skip で再開します。
  6. 進行中のゲームを中止したい場合は、ホストまたは管理者が /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.mdprompts/IMPLEMENTATION_PROMPT.md を参照してください。

About

discord werewolf bot

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages