# 画像生成シーケンス図
## 概要
FV画像とコンテンツ画像の生成・最適化フローを示すシーケンス図です。OpenAI/Gemini APIで画像を生成し、WebP形式への圧縮とリサイズを行った後、URL形式で配信します。
## FV画像生成フロー
```mermaid
sequenceDiagram
participant Client as クライアント
participant API as /api/cn-html-preview
participant FvService as FvGenerationService
participant ImgGen as OpenAI/Gemini Generator
participant Optimizer as ImageOptimizer
participant Cache as TempStorageCache
participant ExtAPI as OpenAI/Gemini API
Client->>API: POST /api/cn-html-preview
[HTTP/JSON]
screenshotUrl (PNG Base64)
fvData (object)
provider (openai or gemini)
API->>FvService: generateFvHtml(options)
[TypeScript]
FvService->>FvService: executeSimplePipeline()
alt ダミーモード
FvService-->>API: ダミー画像返却
JPEG Base64
else 本番モード
FvService->>ImgGen: editImage()
[TypeScript]
image Buffer (PNG)
mask Buffer (PNG)
size 1024x1536
Note over ImgGen: プロンプト生成
OpenAI/Gemini用
ImgGen->>ExtAPI: 画像生成API
[HTTPS/REST]
OpenAI - multipart/form-data
Gemini - application/json
ExtAPI-->>ImgGen: 生成画像
URL or Base64
ImgGen->>Optimizer: optimizeFvImage()
[TypeScript]
Buffer (PNG/JPEG)
Note over Optimizer: Sharp処理
WebP変換
品質65%
Optimizer-->>ImgGen: WebP Buffer
圧縮率 60-80%
ImgGen->>Cache: store(id, buffer)
[TypeScript]
WebP Buffer保存
Note over Cache: /tmp/image-cache
ファイル書き込み
24時間保持
Cache-->>ImgGen: URL返却
/api/temp-images/id
ImgGen-->>FvService: ImageEditResult
buffer + url
metadata
FvService->>FvService: generateFvHtml()
URLをimgタグに埋め込み
FvService-->>API: HTML (URL埋め込み)
end
API-->>Client: HTTP 200 OK
JSON Response
html (string)
css (string)
batchId (string)
message (string)
```
## コンテンツ画像生成フロー
```mermaid
sequenceDiagram
participant Client as クライアント
participant StartAPI as /start-contents-image-generation
participant StatusAPI as /image-generation-status/batchId
participant ImgGen as ContentImagesGenerator
participant OpenAI as OpenAIContentsImageGenerator
participant Optimizer as ImageOptimizer
participant Cache as TempStorageCache
participant PromptGen as ImagePromptGenerator
participant AI as AI (Claude/OpenAI)
participant OpenAIAPI as OpenAI Images API
Client->>StartAPI: POST /start-contents-image-generation
[HTTP/JSON]
html (string)
tabName (string)
cnData (object)
provider (openai or claude)
StartAPI->>ImgGen: ContentImagesGenerator.getInstance()
[TypeScript]
StartAPI->>ImgGen: startImageGenerationBatch()
[TypeScript]
htmlContent + contentContext
Note over ImgGen: HtmlImageAnalyzer
画像要素抽出
5-10個
ImgGen->>PromptGen: generateImageInstructions()
[TypeScript]
elements[] + context
par 各画像要素に対して並列処理
PromptGen->>AI: プロンプト生成API
[HTTPS/REST]
OpenAI or Anthropic API
AI-->>PromptGen: 最適化されたプロンプト
end
PromptGen-->>ImgGen: ImageInstruction[]
imageId + prompt + context
ImgGen->>ImgGen: バッチとジョブ作成
batchId生成
ImgGen-->>StartAPI: batchId + estimatedTime
StartAPI-->>Client: HTTP 200 OK
JSON Response
Note over ImgGen: 非同期バッチ処理開始
ImgGen->>OpenAI: generateMultipleImages()
[TypeScript]
maxConcurrency 3
par 各画像を並列生成 (最大3並列)
OpenAI->>OpenAIAPI: 画像生成API
[HTTPS/REST]
gpt-image-1
1024x1024 low quality
OpenAIAPI-->>OpenAI: 生成画像
URL or Base64
end
par 各画像を最適化処理
OpenAI->>Optimizer: optimizeContentImage()
[TypeScript]
Buffer or Base64
Note over Optimizer: Sharp処理
800x800リサイズ
800x600クロップ
WebP 65%
Optimizer-->>OpenAI: WebP Buffer
サイズ 20-40%
OpenAI->>Cache: store(id, buffer)
[TypeScript]
WebP Buffer保存
Note over Cache: /tmp/image-cache
ファイル書き込み
24時間保持
Cache-->>OpenAI: URL返却
/api/temp-images/id
end
OpenAI-->>ImgGen: Map(imageId -> URL)
ImgGen->>ImgGen: ジョブステータス更新
loop クライアントポーリング (2秒間隔)
Client->>StatusAPI: GET /image-generation-status/batchId
[HTTP]
StatusAPI->>ImgGen: getBatchStatus(batchId)
[TypeScript]
ImgGen-->>StatusAPI: バッチオブジェクト
StatusAPI-->>Client: HTTP 200 OK
status + completedJobs + totalJobs
completedImages[] (URLs)
alt 新しい画像が完了
Client->>Client: JavaScript DOM操作
img.src = URL
loading=lazy
end
end
Note over ImgGen: バッチ完了
20分後に自動削除
Note over Client: 全画像生成完了
```
## 処理の詳細
### 1. FV画像生成
- **入力**: スクリーンショット、FVデータ、プロバイダー選択
- **処理**:
- OpenAI: マスク画像を使用した編集、gpt-image-1モデル
- Gemini: マスクフリー編集、gemini-2.5-flash-imageモデル
- **最適化**: WebP 65%品質に圧縮
- **保存**: TempStorageCacheで/tmpディレクトリに保存
- **出力**: URL形式 (/api/temp-images/id)
### 2. コンテンツ画像生成
- **バッチ処理**: 5-10枚の画像を非同期で生成
- **並列実行**: 最大3枚同時生成で効率化
- **画像最適化**:
- 800x800にリサイズ
- 上下100pxをクロップして800x600に
- WebP 65%品質で圧縮
- **保存**: TempStorageCacheで/tmpディレクトリに保存
- **出力**: URL形式 (/api/temp-images/id)
- **フォールバック**: 生成失敗時はno-image.jpgを使用
### 3. 画像圧縮・最適化
- **ImageOptimizer** (`server/utils/image-optimizer.ts`)
- FV画像: WebP変換のみ
- コンテンツ画像: リサイズ+クロップ+WebP変換
- 圧縮率: 約60-80%のファイルサイズ削減
### 4. 画像キャッシュ管理
- **TempStorageCache** (`server/utils/temp-storage-cache.ts`)
- 保存先: `/tmp/image-cache/` ディレクトリ
- 保持期間: 24時間(自動削除)
- クリーンアップ: 6時間ごと
- 容量制限: 1GB超過時に古いファイルから削除
- シングルトンパターンでインスタンス管理
### 5. クライアント側の更新
- 2秒間隔でステータスをポーリング
- 完了した画像から順次JavaScriptで動的に置換
- 遅延読み込み: `loading="lazy"`属性で最適化
- プログレスバーで進捗を可視化
## データ形式とプロトコル
### プロトコル
- **HTTP/JSON**: クライアント↔API間の通信
- **TypeScript**: サーバー内部の関数呼び出し
- **HTTPS/REST**: 外部API(OpenAI、Gemini、Anthropic)との通信
- **multipart/form-data**: OpenAIへの画像送信
- **application/json**: Geminiへのデータ送信
### データ形式
- **入力画像**: data:image/png;base64形式
- **処理中**: Buffer(Node.js内部バイナリ)
- **保存形式**: WebP形式ファイル(/tmpディレクトリ)
- **画像配信**: URL形式 `/api/temp-images/{id}`
- **HTMLへの埋め込み**: `
`
- **APIレスポンス**: JSON形式 `{ html: string, css: string, batchId?: string, message: string }`
- **圧縮率**: 60-80%削減(WebP 65%品質)
- **コンテンツ画像サイズ**: 800x600固定
## パフォーマンス最適化
1. **並列処理**
- 最大3枚同時生成で総処理時間を短縮
- 10枚の場合: 逐次30-100秒 → 並列10-20秒
2. **画像圧縮**
- WebP形式採用で60-80%のサイズ削減
- 品質65%で視覚的品質とファイルサイズのバランス
3. **リソース管理**
- ContentImagesGeneratorはシングルトンパターン
- TempStorageCacheはシングルトンパターン
- バッチは20分後に自動削除
- 画像ファイルは24時間後に自動削除
- メモリ効率を考慮した実装
4. **配信最適化**
- URL形式配信でJSONパースのオーバーヘッド削減
- ブラウザキャッシュ活用(Cache-Control: max-age=86400)
- 遅延読み込み(loading="lazy")で初期表示高速化
## 環境変数要件
```bash
# FV画像生成用
OPENAI_TEMPLATE_AI_DEV=your_openai_key # OpenAI使用時
GCP_TEMPLATE_AI_DEV=your_gcp_key # Gemini使用時
# コンテンツ画像生成用
OPENAI_TEMPLATE_AI_DEV=your_openai_key # OpenAI画像生成
# プロンプト生成AI
OPENAI_API_KEY=your_openai_key # OpenAI使用時
ANTHROPIC_API_KEY=your_anthropic_key # Claude使用時
```