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

153 lines
6.6 KiB
Markdown
Raw Normal View 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_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` から削除してしまった
**必要な修正**(別チャットで対応中):
1. `GEMINI_TOGETHER_API_KEY=posimai-together プロジェクトのキー)``.env` に再追加
2. `docker-compose.yml``GEMINI_TOGETHER_API_KEY` 行を再追加
3. server.js のフォールバック構造(下記)を元に戻す
```js
// 元の正しい構造(復元すべきコード)
const genAITogether = process.env.GEMINI_TOGETHER_API_KEY
? new GoogleGenerativeAI(process.env.GEMINI_TOGETHER_API_KEY)
: genAI; // GEMINI_API_KEY にフォールバック
```
4. モデルは `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 → 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 関連コード現状
```js
// メイン 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 が更新してください。*