Yukan は Discord サーバー内の過去 24 時間分のメッセージを収集し、Gemini API を使って夕刊ダイジェストを生成・投稿する自動化ボットです。
Cloud Scheduler などから /tasks/daily-summary を定期実行するだけで、決まったチャンネルにハイライトを届けられます。
Cloud Scheduler/Tasks ──► HTTP /tasks/daily-summary
│
▼
summary.Service
├─ collector (Discord API)
├─ prompt builder
├─ Gemini client
└─ presenter (embeds, fallback)
│
├─ notifier (Discord log)
└─ Discord投稿
- mise を用意し、
mise installで Go と aqua を、aqua iで開発用 CLI ツールをインストールします。 - Discord Bot Token・Gemini API Key を取得し、Secret Manager などに保存します。
- 環境変数を設定してローカルで起動します(
.envファイルの自動読み込みは無いため、exportするか direnv などを利用してください):export DISCORD_BOT_TOKEN=xxxx export GEMINI_API_KEY=yyyy make run
- Bot を動かしたまま
curl -X POST http://localhost:8080/tasks/daily-summary?target=devを実行すると dev チャンネル向け夕刊を投稿します。
| 変数 | 必須 | 説明 |
|---|---|---|
DISCORD_BOT_TOKEN |
✅ | Discord Bot のトークン |
GEMINI_API_KEY |
✅ | Gemini API キー |
GEMINI_MODEL |
使用するモデル (例: gemini-2.5-flash) |
|
PORT |
HTTP サーバーの待ち受けポート (既定: 8080) |
|
YUKAN_LOG_CHANNEL_ID |
ログ通知先 Discord チャンネル ID | |
YUKAN_DEFAULT_TARGET |
/tasks/daily-summary 未指定時に使うターゲット名 (既定: prod) |
|
YUKAN_SUMMARY_TARGETS |
✅ | {"prod":{"guild_id":"...","channel_id":"..."},"dev":{...}} の JSON (本番値は infra/ の Terraform が注入) |
YUKAN_SUMMARY_LOOKBACK_HOURS |
メッセージ収集のルックバック時間 (既定 24) | |
YUKAN_SUMMARY_FETCH_LIMIT |
チャンネルごとのページングサイズ (既定 100) | |
YUKAN_SUMMARY_MESSAGE_BUDGET |
見出しメッセージ最大文字数 (既定 1800) | |
YUKAN_SUMMARY_MAX_HIGHLIGHTS |
Gemini に要求する最大ハイライト数 (既定 3) | |
YUKAN_SUMMARY_MAX_ATTEMPTS |
Gemini 呼び出しリトライ回数 (既定 5) | |
YUKAN_SUMMARY_MAX_CONCURRENCY |
チャンネル収集の並列数 |
デプロイは GitHub Actions で行います。手元からの make deploy は廃止しました。
- main にマージすると
deployワークフローが SHA タグ付きイメージをビルドし prod (discord-yukan) に自動デプロイします - 不具合時は
gcloud run services update-trafficで直前リビジョンに即ロールバックできます - 大きな変更のリハーサルが必要な場合は、
infra/のenable_stagingを true にすると一時 staging 環境を復活できます
インフラ (Cloud Run / Scheduler / IAM / Secret Manager) は infra/ の Terraform + tfaction で管理しています。詳細は infra/README.md を参照。
flowchart LR
subgraph gcp [GCP Project]
SM[Secret Manager]
AR[Artifact Registry]
CB[Cloud Build]
CR[Cloud Run]
Sched[Cloud Scheduler]
end
subgraph external [外部]
Discord[Discord API]
GeminiAPI[Gemini API]
end
User[手動 make deploy] --> CB
CB --> AR
AR --> CR
SM --> CR
Sched -->|POST /tasks/daily-summary| CR
CR --> Discord
CR --> GeminiAPI