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 |
推奨モデル¶
運用中の例:
- 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/deleteshow_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 の結果をそのまま信じない(メール取込)。
秘密情報¶
GEMINI_API_KEYはサーバ env のみ- プロンプトファイルに実メールや実トークンを入れない
- few-shot は匿名化サンプルだけ