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

153 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 が更新してください。*