Skip to content

Discord Bot(構成)

関連: Discord / 支出の保存 / 月次予算 / Discord エージェント / 更新手順 / systemd

用途 URL
この Bot の Application Discord Developer Portal

日常のコード反映は systemd 前提で、Bot の更新 を使う。 このページは、何がどう起動するか を説明する。

いまできること

  • Discord のギルドチャンネル / DM でメッセージを受信する
  • Gemini で関西弁の返答を返す(ツッコミ多め。依存・嫉妬は出さない)
  • 支出っぽい文を抽出して PostgreSQL (expenses) に保存(1メッセージで複数件可)
  • 収入も同様に記録(incomes / create_income)
  • 画像添付(レシート、決済画面)を Vision で解析し、金額、店名、内訳、場面を推定
  • 大分類 / 小分類 / occasion / 収入分類 は固定リスト(src/finance_manager/taxonomy.py)
  • 会話コンテキスト: 今月の支出内訳、支出と収入の訂正、削除
  • DISCORD_CHANNEL_ID 指定時: そのギルドチャンネル + DM
  • DISCORD_CHANNEL_ID 空: 見えるギルドチャンネル全部 + DM

ディレクトリ

src/finance_manager/
  __main__.py      … python -m finance_manager の入口
  config.py        … .env 読み込み
  bot.py           … Discord イベント(メニュー・tool 結果の表示保険つき)
  discord_views.py … 利用状況・予算のボタンメニュー
  gemini_client.py … Gemini(Discord は run_agent / 通知は interpret)
  agent_tools.py   … Function calling の tool 定義と DB 実行
  memory.py        … 直近やりとり(プロセス内)
scripts/run.sh     … venv + PYTHONPATH 込みの起動スクリプト
deploy/finance-manager.service  … systemd unit の参考

scripts/run.sh

systemd の ExecStart も、手元のフォアグラウンド起動も、このスクリプトを使う。

source .venv/bin/activate
export PYTHONPATH=src
exec python -m finance_manager
コマンド 効く範囲
source .venv/bin/activate そのプロセス(または今のシェル)だけ
export PYTHONPATH=src 同上。finance_manager パッケージを src/ から見つける

SSH 先の対話シェルで毎回 source / export しなくてよい。 常駐時は systemd が run.sh を直接実行するので、ログインセッションには依存しない。

フォアグラウンドで試すとき(デバッグ用。本番と二重起動しない):

cd ~/finance-manager
./scripts/run.sh

止める: Ctrl+C

成功時のログ例:

Gemini model chain: gemini-3.5-flash -> ...
Logged in as ...
Listening to DMs + guild channel_id=...

「さっきの〇〇」と今月の内訳

  1. DB からそのユーザーの 今月の支出(最大80件) と直近8件を読む
  2. プロセス内の直近チャット(最大12往復)を添える
  3. Gemini が tool(get_remaining / create_expenses / update_expenses など)を選んで呼ぶ
  4. update/delete は 自分の支出 id だけ 許可(他人の id は拒否)
  5. 「今月の内訳」→ get_month_breakdown。カテゴリ表+直近明細(絞り込み)。全文は Grafana
  6. 「今日いくら」「食費の残り」→ get_remaining。表形式の【変動の残り】。内訳一覧にはしない
  7. そのあと「id 42 を趣味に」「サイゼは趣味、スタバは食費」で直せる(複数件可)

Bot 再起動でチャット履歴は消える。 支出一覧は DB から復元されるので、「さっきのスタバ」はまだ効く。