# HTML生成システム要件定義書
## 1. 概要
本システムは、マーケティング改善提案を自動生成し、HTML形式でプレビュー表示するシステムである。
各改善案(A案〜I案)に対して、FV(ファーストビュー)画像とコンテンツHTMLを生成し、タブ形式で表示する。
## 2. ユーザーストーリー
### 2.1 改善案の生成と表示
**As a** マーケティング担当者
**I want to** 複数の改善案を自動生成して比較検討したい
**So that** 最適な施策を選択できる
#### 受け入れ条件
- [ ] 9つの改善案(A案〜I案)が生成される
- [ ] 各案のFV画像とコンテンツHTMLが表示される
- [ ] タブで各案を切り替えて閲覧できる
- [ ] 予測値の高い順に案が並んでいる
### 2.2 パフォーマンスの最適化
**As a** システム利用者
**I want to** 快適な操作レスポンスでシステムを利用したい
**So that** 効率的に作業を進められる
#### 受け入れ条件
- [ ] タブ切り替え時に画像が再生成されない
- [ ] ウィンドウフォーカス時に不要なAPI呼び出しが発生しない
- [ ] 一度生成された画像はキャッシュから表示される
- [ ] ページリロードしても24時間はキャッシュが有効
### 2.3 改善案の再生成
**As a** マーケティング担当者
**I want to** 選択条件を変更して新しい改善案を生成したい
**So that** 異なる観点から施策を検討できる
#### 受け入れ条件
- [ ] /refresh-moments画面で選択を変更できる
- [ ] 選択変更後は新しい改善案が生成される
- [ ] 前回と異なるデータで正しく再生成される
## 3. ビジネス要件
### 3.1 改善案の優先順位管理
#### 3.1.1 予測値による並び替え
- **要件ID**: BR-001
- **優先度**: 高
- **説明**: 改善案は機械学習モデルによる予測値(prediction)の降順で並び替えられる
- **詳細**:
- 予測値は0〜1の範囲の数値
- 値が高いほど改善効果が期待できる
- 同一予測値の場合は戦略順(積極化→改善→差別化)で決定
#### 3.1.2 タブラベルの維持
- **要件ID**: BR-002
- **優先度**: 中
- **説明**: 予測値順に並び替えても、表示ラベルはA案〜I案を維持
- **詳細**:
- 最も予測値の高い案がA案として表示
- 9番目に高い案がI案として表示
- ユーザーは予測値の高い順であることを認識できる
### 3.2 パフォーマンス要件
#### 3.2.1 API呼び出しの最適化
- **要件ID**: BR-003
- **優先度**: 高
- **説明**: 不要なAPI呼び出しを削減し、システム負荷を軽減
- **詳細**:
- ウィンドウフォーカス時の再フェッチを無効化
- コンポーネント再マウント時の再フェッチを無効化
- 同一データでの重複実行を防止
#### 3.2.2 キャッシュ管理
- **要件ID**: BR-004
- **優先度**: 中
- **説明**: 生成済みデータを効率的にキャッシュ
- **詳細**:
- staleTime: Infinity(データは古くならない)
- gcTime: 24時間(ガベージコレクション)
- queryKeyベースのキャッシュ管理
### 3.3 データ生成要件
#### 3.3.1 FV画像生成
- **要件ID**: BR-005
- **優先度**: 高
- **説明**: 各改善案のファーストビュー画像を生成
- **詳細**:
- OpenAI/Gemini APIを使用
- スクリーンショットを基に画像を編集
- タブごとに1回だけ生成(同一セッション内)
#### 3.3.2 コンテンツHTML生成
- **要件ID**: BR-006
- **優先度**: 高
- **説明**: 各改善案のコンテンツセクションHTMLを生成
- **詳細**:
- セクションごとにHTMLを構築
- Adobe Fireflyで画像生成(オプション)
- プレースホルダー画像の自動置換
## 4. 技術仕様
### 4.1 アーキテクチャ
#### 4.1.1 フロントエンド
- **フレームワーク**: Next.js (App Router)
- **状態管理**: Zustand
- **データフェッチング**: React Query (TanStack Query)
- **スタイリング**: Tailwind CSS
#### 4.1.2 API層
- **内部API**: Next.js API Routes
- **外部API**:
- Gradio API(提案データ取得)
- OpenAI API(画像生成)
- Gemini API(画像生成)
- Adobe Firefly API(コンテンツ画像)
### 4.2 データフロー
```mermaid
graph TD
A[ユーザー選択] --> B[Gradio API]
B --> C[提案データ取得]
C --> D[ProposalTranslator]
D --> E[予測値でソート]
E --> F[タブデータ生成]
F --> G[TabContentRenderer]
G --> H[FV HTML生成]
G --> I[Contents HTML生成]
H --> J[画像表示]
I --> J
```
### 4.3 キー・コンポーネント
#### 4.3.1 React Query設定
- **ファイル**: `api-client/query-config.ts`
- **責務**: 全APIフックの共通設定を提供
- **主要設定**:
```typescript
{
refetchOnWindowFocus: false,
refetchOnMount: false,
staleTime: Infinity,
gcTime: 24 * 60 * 60 * 1000
}
```
#### 4.3.2 タブコンテンツレンダラー
- **ファイル**: `components/improvement-result/tab-content-renderer.tsx`
- **責務**: 各タブのコンテンツ生成と表示制御
- **主要機能**:
- 初回生成フラグ管理(useRef)
- 条件付きレンダリング
- キャッシュ制御
#### 4.3.3 提案データ変換
- **ファイル**: `api-client/proposal/proposal/translator.ts`
- **責務**: APIレスポンスを表示用データに変換
- **主要機能**:
- 予測値によるソート
- タブラベル割り当て
- データ正規化
## 5. 制約事項
### 5.1 技術的制約
- React Query v5を使用
- Node.js 18以上が必要
- ブラウザはChrome/Firefox/Safari/Edgeの最新版をサポート
### 5.2 ビジネス制約
- 改善案は必ず9案生成される
- 予測値は0〜1の範囲に正規化される
- ダミーモードでも正常動作が必要
## 6. 非機能要件
### 6.1 パフォーマンス
- タブ切り替え: 100ms以内でレスポンス
- 画像生成: 各タブ30秒以内で完了
- キャッシュヒット率: 90%以上
### 6.2 可用性
- システム稼働率: 99.5%以上
- エラー発生時のフォールバック機能
- ダミーモードでの継続動作
### 6.3 保守性
- TypeScriptによる型安全性
- ESLint/Prettierによるコード品質維持
- 包括的なログ出力
## 7. リスクと対策
### 7.1 API制限
- **リスク**: 外部APIのレート制限
- **対策**:
- ローカル環境では画像生成をスキップ
- キャッシュを積極的に活用
- リトライ処理の実装
### 7.2 パフォーマンス劣化
- **リスク**: 大量データによる処理遅延
- **対策**:
- 非同期バッチ処理
- プログレッシブレンダリング
- 遅延ローディング
## 8. 今後の拡張性
### 8.1 短期的拡張
- 改善案数の動的変更(9案→12案など)
- 新しいAIプロバイダーの追加
- カスタムソート条件の追加
### 8.2 長期的拡張
- リアルタイム協業機能
- A/Bテスト結果の自動反映
- 機械学習モデルの継続的改善