プライバシーファースト メンタルヘルスAI相談API
- ノーログ設計: IPアドレス・メッセージ内容を記録しない
- 暗号化Blob保存:
/v1/user-data/blobでクライアント側暗号化データ保存に対応 - Misskey OAuth: Misskeyアカウントで認証可能
- API Key認証: シンプルなAPI Key認証もサポート
- 汎用API: 任意のフロントエンドから利用可能
- GDPR対応: データエクスポート・削除機能を標準実装
Yamix(または、任意のWebアプリ)
├── Misskeyログイン(OAuth) or API Key認証
├── メッセージ暗号化(AES-256-GCM、サーバー側)
└── 会話履歴はYamixのDB管理(暗号化保存)
↓
Yamii API v1.0.0 (FastAPI)
├── /v1/auth/* - Misskey OAuth認証
├── /v1/counseling - AIカウンセリング(ノーログ)
├── /v1/users/* - ユーザー管理(GDPR対応)
├── /v1/user-data/* - 暗号化Blob保存
├── /v1/commands/* - Botコマンド処理
└── /v1/health, /docs, /redoc
↓
OpenAI API(メッセージ処理のため平文で送信)
詳細なエンドポイントは Swagger UI で確認できます。
| プロジェクト | 説明 |
|---|---|
| Yamii (このリポジトリ) | プライバシーファースト API サーバー |
| Yamix | 公式フロントエンド Webアプリ |
Yamiiは汎用的なAPIサーバーとして設計されているため、Yamix以外のフロントエンドからも利用できます。
YamixはYamiiを以下のように利用します:
- 認証方式: API Key認証(
X-API-Keyヘッダー)- Yamix自体のユーザー認証はMisskey MiAuthを使用
- Yamii APIへのアクセスはYamixサーバー経由でAPI Key認証
- 使用エンドポイント:
POST /v1/counseling- AI相談機能GET /v1/users/{userId}- ユーザー情報取得PUT /v1/users/{userId}- プロファイル更新DELETE /v1/users/{userId}- AI学習データ削除GET /v1/health- ヘルスチェック
- 会話履歴管理: Yamixのデータベースで暗号化保存(Yamiiはノーログ)
- 暗号化Blob: 現在未使用(将来的な拡張用)
# 1. 環境変数を設定
cp .env.example .env
nano .env # OPENAI_API_KEY を設定
# 2. 起動
docker compose up -d
# 3. 確認
curl http://localhost:8000/v1/health必須環境変数 (.env):
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx# 依存関係インストール
uv sync
# サーバー起動(FastAPI CLI)
uv run fastapi dev yamii/api/main.pyYamii APIは OpenAPI 3.0 標準に準拠しています。FastAPIが自動生成する対話的なAPIドキュメントをご利用ください。
- Swagger UI: http://localhost:8000/docs - 対話的なAPIドキュメント
- ReDoc: http://localhost:8000/redoc - 見やすいリファレンス
1. Misskey OAuth (MiAuth):
/v1/user-data/*エンドポイントで使用- OAuth Bearer トークンが必要
2. API Key認証:
/v1/counseling,/v1/users/*,/v1/commands/*で使用X-API-Keyヘッダーで認証
curl -H "X-API-Key: your-api-key" http://localhost:8000/v1/counselingノーログ設計:
- IPアドレス・User-Agentは記録しません
- メッセージ内容はログに出力されません
conversation_historyパラメータでクライアント側から送信- セッション中のみ使用され、Yamii側では永続化されません
プライバシーに関する注意:
- AI相談機能を提供するため、メッセージはOpenAI APIに平文で送信されます
- これは技術的に不可避であり、真のエンドツーエンド暗号化(E2EE)ではありません
/v1/user-data/blobでクライアント側暗号化データを保存可能(サーバーは内容を知ることができません)
メッセージから感情を自動検出:
- happiness, sadness, anxiety, anger, loneliness
- depression, stress, confusion, hope, neutral
「死にたい」等のキーワードを検出し、専門機関への相談を案内。
対話を重ねることでフェーズが進行:
| フェーズ | 説明 |
|---|---|
| STRANGER | 初対面。丁寧な対応 |
| ACQUAINTANCE | 顔見知り。過去の会話を参照 |
| FAMILIAR | 親しい関係。自然な会話 |
| TRUSTED | 信頼関係。率直なやり取り |
OpenAI APIへの送信前に個人情報を自動マスク:
- 電話番号、メールアドレス、住所
- 生年月日、名前
- マイナンバー、カード番号
/v1/commands/* エンドポイントは、Botプラットフォーム統合用の便利機能です(help, status, classify, export, clear_data)。一般的なWebアプリでは不要です。
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
OPENAI_API_KEY |
✅ | - | OpenAI APIキー |
OPENAI_MODEL |
- | gpt-4.1 | 使用モデル |
YAMII_DATA_DIR |
- | data | データ保存先 |
YAMII_DEBUG |
- | false | デバッグモード |
YAMII_API_KEYS |
- | - | API認証キー(カンマ区切り) |
API_HOST |
- | http://localhost:8000 | APIベースURL |
FRONTEND_URL |
- | http://localhost:3000 | フロントエンドURL |
# テスト実行
uv run pytest tests/ -v
# 型チェック
uv run ty check yamii/
# フォーマット
uv run ruff format yamii/ tests/yamii/
├── api/ # FastAPI エンドポイント
│ └── routes/ # auth, counseling, user, user_data, commands
├── domain/ # ドメインモデル・サービス
│ ├── models/ # UserState, Relationship, Emotion
│ ├── services/ # Emotion, Counseling
│ └── ports/ # インターフェース定義
├── adapters/ # 外部サービス実装
│ ├── ai/ # OpenAI(PII匿名化付き)
│ └── storage/ # ファイル / 暗号化Blobストレージ
└── core/ # ログ、設定
MIT