6.6 KiB
6.6 KiB
Posimai — API キー・認証アーキテクチャ整理
他の AI エージェントへの引き継ぎ用ドキュメント。 最終更新: 2026-03-19
1. 現状のAPI キー全体マップ
Gemini API キー
| アプリ | キーの場所 | 変数名 | 誰が管理 | アクセス範囲 |
|---|---|---|---|---|
| posimai-brain(記事保存時 AI 要約) | Synology .env |
GEMINI_API_KEY |
サーバー側 | Tailscale 内のみ |
| posimai-journal(AI タグ提案) | 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 プロジェクト | 枠 | RPD(1日上限) |
|---|---|---|---|
GEMINI_API_KEY |
メインプロジェクト | 無料枠 | 20 |
GEMINI_TOGETHER_API_KEY |
posimai-together |
無料枠 | 20 |
| think/digest のユーザー入力キー | 各ユーザーが個別プロジェクトで発行 | 無料枠 | 20 |
方針: アプリごとに Google Cloud プロジェクトを分けてキーを発行し、それぞれ独立した無料枠(20 RPD)を持つ。必要になったら個別に有料化する。
3. 現在発生している問題(要対応)
Together API キー問題(未解決)
経緯:
- 元の設定:
GEMINI_TOGETHER_API_KEY(posimai-togetherプロジェクトのキー)を.envに設定 - server.js:
GEMINI_TOGETHER_API_KEYがあれば優先、なければGEMINI_API_KEYにフォールバック(3行構造) - 問題: server.js のモデルが
gemini-2.0-flash-lite(posimai-togetherプロジェクトで割り当て 0)→ 429 エラー - 別チャットでの対応: モデルを
gemini-2.5-flashに変更(これ自体は正しい修正) - 副作用: 同時に
GEMINI_TOGETHER_API_KEYを.envとdocker-compose.ymlから削除してしまった
必要な修正(別チャットで対応中):
GEMINI_TOGETHER_API_KEY=(posimai-together プロジェクトのキー)を.envに再追加docker-compose.ymlにGEMINI_TOGETHER_API_KEY行を再追加- server.js のフォールバック構造(下記)を元に戻す
// 元の正しい構造(復元すべきコード)
const genAITogether = process.env.GEMINI_TOGETHER_API_KEY
? new GoogleGenerativeAI(process.env.GEMINI_TOGETHER_API_KEY)
: genAI; // GEMINI_API_KEY にフォールバック
- モデルは
gemini-2.5-flashのまま(変更不要)
4. アーキテクチャの制約と今後の判断基準
現在の制約
| 制約 | 内容 |
|---|---|
| Tailscale 必須 | Synology の API(posimai-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 → Synology(Tailscale) → Gemini API(brain/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_key(localStorage に保存) |
| 適用アプリ | brain, reader, together, journal |
| 未認証時の動作 | 記事の閲覧は可能、保存・AI 機能は不可 |
このドキュメントは posimai-project/docs/api-key-architecture.md に保存されています。
変更時は CLAUDE.md の担当 AI が更新してください。