153 lines
6.6 KiB
Markdown
153 lines
6.6 KiB
Markdown
# 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` から削除してしまった
|
||
|
||
**必要な修正**(別チャットで対応中):
|
||
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 → 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 関連コード現状
|
||
|
||
```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 が更新してください。*
|