Spaces:
Sleeping
Sleeping
File size: 9,232 Bytes
68f7925 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 |
# 画像生成シーケンス図
## 概要
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<br/>[HTTP/JSON]<br/>screenshotUrl (PNG Base64)<br/>fvData (object)<br/>provider (openai or gemini)
API->>FvService: generateFvHtml(options)<br/>[TypeScript]
FvService->>FvService: executeSimplePipeline()
alt ダミーモード
FvService-->>API: ダミー画像返却<br/>JPEG Base64
else 本番モード
FvService->>ImgGen: editImage()<br/>[TypeScript]<br/>image Buffer (PNG)<br/>mask Buffer (PNG)<br/>size 1024x1536
Note over ImgGen: プロンプト生成<br/>OpenAI/Gemini用
ImgGen->>ExtAPI: 画像生成API<br/>[HTTPS/REST]<br/>OpenAI - multipart/form-data<br/>Gemini - application/json
ExtAPI-->>ImgGen: 生成画像<br/>URL or Base64
ImgGen->>Optimizer: optimizeFvImage()<br/>[TypeScript]<br/>Buffer (PNG/JPEG)
Note over Optimizer: Sharp処理<br/>WebP変換<br/>品質65%
Optimizer-->>ImgGen: WebP Buffer<br/>圧縮率 60-80%
ImgGen->>Cache: store(id, buffer)<br/>[TypeScript]<br/>WebP Buffer保存
Note over Cache: /tmp/image-cache<br/>ファイル書き込み<br/>24時間保持
Cache-->>ImgGen: URL返却<br/>/api/temp-images/id
ImgGen-->>FvService: ImageEditResult<br/>buffer + url<br/>metadata
FvService->>FvService: generateFvHtml()<br/>URLをimgタグに埋め込み
FvService-->>API: HTML (URL埋め込み)
end
API-->>Client: HTTP 200 OK<br/>JSON Response<br/>html (string)<br/>css (string)<br/>batchId (string)<br/>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<br/>[HTTP/JSON]<br/>html (string)<br/>tabName (string)<br/>cnData (object)<br/>provider (openai or claude)
StartAPI->>ImgGen: ContentImagesGenerator.getInstance()<br/>[TypeScript]
StartAPI->>ImgGen: startImageGenerationBatch()<br/>[TypeScript]<br/>htmlContent + contentContext
Note over ImgGen: HtmlImageAnalyzer<br/>画像要素抽出<br/>5-10個
ImgGen->>PromptGen: generateImageInstructions()<br/>[TypeScript]<br/>elements[] + context
par 各画像要素に対して並列処理
PromptGen->>AI: プロンプト生成API<br/>[HTTPS/REST]<br/>OpenAI or Anthropic API
AI-->>PromptGen: 最適化されたプロンプト
end
PromptGen-->>ImgGen: ImageInstruction[]<br/>imageId + prompt + context
ImgGen->>ImgGen: バッチとジョブ作成<br/>batchId生成
ImgGen-->>StartAPI: batchId + estimatedTime
StartAPI-->>Client: HTTP 200 OK<br/>JSON Response
Note over ImgGen: 非同期バッチ処理開始
ImgGen->>OpenAI: generateMultipleImages()<br/>[TypeScript]<br/>maxConcurrency 3
par 各画像を並列生成 (最大3並列)
OpenAI->>OpenAIAPI: 画像生成API<br/>[HTTPS/REST]<br/>gpt-image-1<br/>1024x1024 low quality
OpenAIAPI-->>OpenAI: 生成画像<br/>URL or Base64
end
par 各画像を最適化処理
OpenAI->>Optimizer: optimizeContentImage()<br/>[TypeScript]<br/>Buffer or Base64
Note over Optimizer: Sharp処理<br/>800x800リサイズ<br/>800x600クロップ<br/>WebP 65%
Optimizer-->>OpenAI: WebP Buffer<br/>サイズ 20-40%
OpenAI->>Cache: store(id, buffer)<br/>[TypeScript]<br/>WebP Buffer保存
Note over Cache: /tmp/image-cache<br/>ファイル書き込み<br/>24時間保持
Cache-->>OpenAI: URL返却<br/>/api/temp-images/id
end
OpenAI-->>ImgGen: Map(imageId -> URL)
ImgGen->>ImgGen: ジョブステータス更新
loop クライアントポーリング (2秒間隔)
Client->>StatusAPI: GET /image-generation-status/batchId<br/>[HTTP]
StatusAPI->>ImgGen: getBatchStatus(batchId)<br/>[TypeScript]
ImgGen-->>StatusAPI: バッチオブジェクト
StatusAPI-->>Client: HTTP 200 OK<br/>status + completedJobs + totalJobs<br/>completedImages[] (URLs)
alt 新しい画像が完了
Client->>Client: JavaScript DOM操作<br/>img.src = URL<br/>loading=lazy
end
end
Note over ImgGen: バッチ完了<br/>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への埋め込み**: `<img src="/api/temp-images/{id}" loading="lazy">`
- **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使用時
```
|