Skip to content

Gemini 連携(プロンプトの渡し方)

関連: メール取込 / アーキテクチャ / Discord / Bot の構成 / Discord エージェント

前提

Gemini API に Cursor Skills / Gemini Gems 相当の「Skills」機能はない。 代わりに、次を組み合わせて再現する。

仕組み 役割
system instruction 役割、口調、ツール使い分けの要約
Function calling (tools) Discord 経路。読み取り・書き込みを tool として定義し、モデルが選んで呼ぶ
Structured Output (JSON schema) 通知取込(interpret)向けの固定 JSON
few-shot examples 速報 / 明細 / 無視の見本(メール向け・これから)
Context caching(任意) 固定指示が長くなったときの最適化

運用 Bot は Cursor 契約ではなく、別途 GEMINI_API_KEY を使う。

用途 URL
レート制限(直近28日) Google AI Studio

推奨モデル

運用中の例:

GEMINI_MODEL=gemini-3.5-flash
GEMINI_MODEL_FALLBACKS=gemini-3.5-flash-lite
  • MVP デフォルト: gemini-3.5-flash(環境変数 GEMINI_MODEL)
  • フォールバック: GEMINI_MODEL_FALLBACKS(カンマ区切り)。未設定時のコードデフォルトは gemini-3.5-flash-lite
  • gemini-3.5-flash の無料 RPD はごく小さいことがある(例: 20/日)。尽きるとフォールバックへ落ちる
  • gemini-1.5-flash / gemini-2.5-flash-lite は、このキーでは 404 になり得る(フォールバックに置かない)
  • より新しい Flash: gemini-3.6-flash
  • 家計データの学習利用が気になる場合は有料(従量)へ

店名を Google Search grounding で正規化する試行と、無料枠での失敗理由は 店名 Web 検索の試行知見 にある。 現状その機能はコードに無い。

呼び出しの分け方

プロンプトを1本に詰め込みすぎない。

呼び出し 目的 状態
GeminiClient.run_agent Discord。Function calling で tool を自律選択 実装済み。gemini_client.py + agent_tools.py
GeminiClient.interpret 通知取込など。JSON(action + 抽出) 実装済み(ingest が使用)
email_classify_extract メール種別と抽出 これから
weekly_review 週次レビュー これから

Discord では長い action 列挙の代わりに、次のような tool を渡す。

  • 読む: get_remaining / get_month_breakdown / get_period_spend / get_surplus / get_budget_summary
  • 書く: create_expenses / create_incomes / update_expenses / delete_expense など
  • 予算: confirm_budget / set_budget / reopen_budget / set_fixed_cost / close_month
  • その他: create_wishlist / create_planned_expense

モデルが tool を呼ぶ → Bot が DB を実行 → 表示テキストを正本として reply に付ける。 口調は関西弁。数字の捏造は禁止(tool 結果だけが正)。

画像は Gemini の multimodal(Vision)入力として渡す(Discord 添付は実装済み)。 スクショから読めない金額、明細は捏造しない。

リポジトリ上の置き場

ファイル 内容
gemini_client.py AGENT_SYSTEM_PROMPT / run_agent / 通知用 SYSTEM_PROMPT+RESPONSE_SCHEMA
agent_tools.py FunctionDeclaration と tool 実行

コードが prompts/ を読む実装にはなっていない。

通知取込(interpret)の主な action 例:

  • create / create_income / update / delete
  • show_remaining / show_month_expenses(Discord 本体は tool 経由)
  • confirm_budget / set_budget / reopen_budget / set_fixed_cost / close_month / show_surplus

メール取込向けに、次のようなファイル分割を後から足す想定である。

prompts/
  email_classify_extract.system.md
  email_classify_extract.schema.json
  email_classify_extract.examples.json
  • system.md … 役割、ルール(「金額を捏造しない」等)
  • schema.json … Gemini structured output 用スキーマ
  • examples.json … few-shot(個人情報が載らないよう匿名化した例)

API に渡すイメージ

Discord(いま):

system_instruction  ← gemini_client.py の SYSTEM_PROMPT
response_schema     ← RESPONSE_SCHEMA
contents            ←
  今月の支出一覧(訂正用 id)
  直近の収入
  今月の予算
  直近のやりとり
  ユーザー文 + 任意画像

メール取込(これから):

system_instruction  ← prompts/email_classify_extract.system.md
response_schema     ← prompts/email_classify_extract.schema.json
contents            ←
  [example_1 user/model]
  [example_2 user/model]
  [example_3 user/model]
  [実際のメール: 件名 + 本文]

ポイント:

  • 毎回「よしなに」とだけ書かない
  • スキーマで必須フィールドを固定する
  • 例で速報 / 明細 / ignore を見せる
  • 本文にない金額を作らない、と system に明記する

system 指示に必ず入れるルール(メール)

  • 出力はスキーマ以外出さない
  • 本文から読めない金額、店名は捏造しない(不明なら null / ignore)
  • キャンペーン、お知らせは kind=ignore
  • 利用速報は flash、明細、請求まとめは statement
  • PayPay チャージ相当、資金移動っぽいものは is_expense=false(判定できないなら notes に書く)

アプリ側との役割分担

Gemini: 読む、分類する、候補を抜く、短い reply
App:    保存する、検証する、内訳の数字を付ける、Discord/Grafana に出す

検証に失敗したら Gemini の結果をそのまま信じない(メール取込)。

秘密情報

  • GEMINI_API_KEY はサーバ env のみ
  • プロンプトファイルに実メールや実トークンを入れない
  • few-shot は匿名化サンプルだけ