# 画像生成シーケンス図 ## 概要 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使用時 ```