posimai-root/docs/api-key-architecture.md

6.6 KiB
Raw Blame History

Posimai — API キー・認証アーキテクチャ整理

他の AI エージェントへの引き継ぎ用ドキュメント。 最終更新: 2026-03-19


1. 現状のAPI キー全体マップ

Gemini API キー

アプリ キーの場所 変数名 誰が管理 アクセス範囲
posimai-brain記事保存時 AI 要約) Synology .env GEMINI_API_KEY サーバー側 Tailscale 内のみ
posimai-journalAI タグ提案) Synology .env GEMINI_API_KEY サーバー側 Tailscale 内のみ
posimai-togetherアーカイブ AI 要約) Synology .env GEMINI_TOGETHER_API_KEY(→要復旧) サーバー側 Tailscale 内のみ
posimai-think ブラウザ localStorage posimai-think-apikey ユーザーが設定画面で入力 誰でもTailscale 不要)
posimai-digest ブラウザ localStorage gemini_api_key ユーザーが設定画面で入力 誰でもTailscale 不要)

その他の API キー

アプリ キー種別 場所 備考
posimai-maps GOOGLE_PLACES_API_KEY Vercel 環境変数 Vercel サーバーレス関数経由Places API New
posimai-reader posimai_api_key ブラウザ localStorage Brain API キーGemini ではない)
posimai-brain / journal / together posimai_api_key ブラウザ localStorage Brain API への認証キーMagic Link 発行)

2. Gemini キーの Google Cloud プロジェクト構成

変数名 Google Cloud プロジェクト RPD1日上限
GEMINI_API_KEY メインプロジェクト 無料枠 20
GEMINI_TOGETHER_API_KEY posimai-together 無料枠 20
think/digest のユーザー入力キー 各ユーザーが個別プロジェクトで発行 無料枠 20

方針: アプリごとに Google Cloud プロジェクトを分けてキーを発行し、それぞれ独立した無料枠20 RPDを持つ。必要になったら個別に有料化する。


3. 現在発生している問題(要対応)

Together API キー問題(未解決)

経緯:

  • 元の設定: GEMINI_TOGETHER_API_KEYposimai-together プロジェクトのキー)を .env に設定
  • server.js: GEMINI_TOGETHER_API_KEY があれば優先、なければ GEMINI_API_KEY にフォールバック3行構造
  • 問題: server.js のモデルが gemini-2.0-flash-liteposimai-together プロジェクトで割り当て 0→ 429 エラー
  • 別チャットでの対応: モデルを gemini-2.5-flash に変更(これ自体は正しい修正)
  • 副作用: 同時に GEMINI_TOGETHER_API_KEY.envdocker-compose.yml から削除してしまった

必要な修正(別チャットで対応中):

  1. GEMINI_TOGETHER_API_KEY=posimai-together プロジェクトのキー).env に再追加
  2. docker-compose.ymlGEMINI_TOGETHER_API_KEY 行を再追加
  3. server.js のフォールバック構造(下記)を元に戻す
// 元の正しい構造(復元すべきコード)
const genAITogether = process.env.GEMINI_TOGETHER_API_KEY
    ? new GoogleGenerativeAI(process.env.GEMINI_TOGETHER_API_KEY)
    : genAI; // GEMINI_API_KEY にフォールバック
  1. モデルは gemini-2.5-flash のまま(変更不要)

4. アーキテクチャの制約と今後の判断基準

現在の制約

制約 内容
Tailscale 必須 Synology の APIposimai-lab.tail72e846.ts.net)は Tailscale 接続端末のみアクセス可能
think/digest の例外 クライアント側で Gemini を直接呼ぶため Tailscale 不要。ただしユーザーがキーを入力する必要あり
単一障害点 Synology がオフライン → brain/journal/together の AI 機能が停止

将来の拡張パス(今はやらない)

タイミング 対応
知人・テストユーザーへの展開時 Tailscale Funnel を有効化(設定数分、無料)
商用展開時 クラウドバックエンドVercel / Railway / Fly.ioに移行、独自ドメインapi.posimai.app 等)に統一

理想的な最終形(商用時)

現状:
  browser → Gemini API 直接think/digest
  browser → SynologyTailscale → Gemini APIbrain/journal/together

理想:
  browser → api.posimai.appクラウド → Gemini API全アプリ

.env 構成(理想):
  GEMINI_BRAIN_API_KEY=...
  GEMINI_TOGETHER_API_KEY=...
  GEMINI_THINK_API_KEY=...
  GEMINI_DIGEST_API_KEY=...
  GEMINI_JOURNAL_API_KEY=...

5. 現時点での推奨方針(やること・やらないこと)

今すぐやること

  • Together: GEMINI_TOGETHER_API_KEY.env に復活 + server.js フォールバック構造を復元(別チャット対応中)

現状維持(変更しない)

  • brain / journal / together: server.js 経由Tailscale 内)のまま
  • think / digest: クライアント側 Geminiユーザーキー入力のまま

将来検討(今はやらない)

  • think/digest を server.js 経由に移行Tailscale Funnel 有効化後に検討)
  • クラウドバックエンドへの移行(商用展開時)
  • API_BASE_URL を環境変数・設定ファイルで一元管理(移行コストを下げるため)

6. server.js の Gemini 関連コード現状

// メイン Gemini インスタンスbrain/journal 用)
const genAI = process.env.GEMINI_API_KEY
    ? new GoogleGenerativeAI(process.env.GEMINI_API_KEY) : null;

// Together 専用インスタンス(要復元)
// 現在は genAI と同値になっているGEMINI_TOGETHER_API_KEY 削除の副作用)
const genAITogether = genAI; // ← これを上記3行構造に戻す必要がある

// 使用モデル
// brain/journal: gemini-2.0-flash-liteライン 231, 867
// together: gemini-2.5-flashライン 1338← 別チャットで修正済み

7. 認証設計Brain API キー)

項目 内容
認証方式 Magic Linkメール送信→ JWT トークン発行
キー名 posimai_api_keylocalStorage に保存)
適用アプリ brain, reader, together, journal
未認証時の動作 記事の閲覧は可能、保存・AI 機能は不可

このドキュメントは posimai-project/docs/api-key-architecture.md に保存されています。 変更時は CLAUDE.md の担当 AI が更新してください。