Gemini 連携(プロンプトの渡し方)
前提
Gemini API に Cursor Skills / Gemini Gems 相当の「Skills」機能はない。
代わりに、次を組み合わせて再現する。
| 仕組み | 役割 |
|---|---|
| system instruction | 役割・禁止事項・会計ルール |
| Structured Output (JSON schema) | 返答形式を固定 |
| few-shot examples | 速報 / 明細 / 無視の見本 |
| プロンプトファイル | リポジトリ内で版管理(Git) |
| Context caching(任意) | 固定指示が長くなったときの最適化 |
運用 Bot は Cursor 契約ではなく、別途 GEMINI_API_KEY を使う。
推奨モデル
- MVP デフォルト:
gemini-3.5-flash(環境変数GEMINI_MODEL) - フォールバック:
GEMINI_MODEL_FALLBACKS(カンマ区切り)。未設定時はgemini-3.1-flash-lite,gemini-1.5-flash - 安さ・量:
gemini-3.1-flash-lite/gemini-1.5-flash - より新しい Flash:
gemini-3.6-flash - 分類・抽出・短文コメント用途。個人用途なら無料枠で足りる想定
- 家計データの学習利用が気になる場合は有料(従量)へ
呼び出しの分け方
プロンプトを1本に詰め込みすぎない。
| 呼び出し | 目的 | 入力 | 出力 |
|---|---|---|---|
email_classify_extract |
メール種別+抽出 | 件名+本文 | 構造化 JSON |
discord_manual_extract |
手動テキスト/画像から抽出 | 文言 + 任意画像 | 構造化 JSON |
notify_coach |
Discord 用厳し目文 | 抽出済み支出 | 短文テキスト |
weekly_review(後) |
週次レビュー | 集計 JSON | 短文テキスト |
画像は Gemini の multimodal(Vision)入力として渡す(Discord 添付は実装済み)。
スクショから読めない金額・明細は捏造しない(メールと同じルール)。
追加フィールド(Discord 解釈):
| フィールド | 意味 |
|---|---|
occasion |
時間帯・店種からの場面推定(夕食 / 遊び など) |
occasion_reason |
推定根拠の短文 |
line_items |
レシート明細(読めるときだけ) |
リポジトリ上の置き場(予定)
prompts/
email_classify_extract.system.md
email_classify_extract.schema.json
email_classify_extract.examples.json
discord_manual_extract.system.md
discord_manual_extract.schema.json
notify_coach.system.md
- system.md … 役割・ルール(「金額を捏造しない」等)
- schema.json … Gemini structured output 用スキーマ
- examples.json … few-shot(個人情報が載らないよう匿名化した例)
コードはこれらのファイルを読んで API に渡す。
「Skills」の代わりに ファイルとして版管理された指示セット を使う。
API に渡すイメージ
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: 読む・分類する・候補を抜く
App: 保存する・検証する・重複を除く・Discord/Grafana に出す
検証に失敗したら Gemini の結果をそのまま信じない(メール取込)。
秘密情報
GEMINI_API_KEYはサーバ env のみ- プロンプトファイルに実メールや実トークンを入れない
- few-shot は匿名化サンプルだけ