- name
- webtoon-image-generation
- description
- prompts.json을 받아 codex-image의 5장 병렬 배치 기능으로 회차 컷 이미지를 실제로 생성하는 스킬. 시드 그룹 단위 묶음과 실패 재시도, 메타 기록을 처리한다. image-generator 에이전트가 호출한다.
# Webtoon Image Generation — codex-image 병렬 배치 실행
## 핵심 룰
1. **항상 5장 병렬 배치를 우선** — 실측 직렬 대비 2.4~2.85배 빠름 (codex-image 스킬의 핵심 강점)
2. **같은 시드 그룹은 같은 배치에 묶기** — 캐릭터 일관성 최대화
3. **실패는 1회 재시도**, 재실패 시 GEN_FAILED 표기 + 진행 (전체 회차를 막지 않음)
4. **모든 생성에 메타 기록** — 시드·모델·시각 — 재현 가능성 확보
## 워크플로우
### Step 1 — prompts.json 로드 & 시드 그룹 군집화
```python
# 의사 코드
prompts = load("_workspace/episodes/ep{NN}/prompts.json")
groups = group_by(prompts.cuts, key="seed_group")
batches = []
for group_name, cuts in groups.items():
# 5장씩 잘라 배치 구성
for i in range(0, len(cuts), 5):
batches.append(cuts[i:i+5])
```
### Step 2 — 배치별 codex-image 호출
codex-image 스킬은 한 번에 최대 5장 병렬 생성 지원. 각 배치를 `codex exec` 한 번으로 처리:
```
codex exec --task "image_generation_batch" \
--inputs '[
{"prompt": "...cut1...", "size": "1024x1792", "seed_group": "ep01_location_seoul"},
{"prompt": "...cut2...", "size": "1024x1792", "seed_group": "ep01_location_seoul"},
...
]'
```
(실제 호출 형식은 codex-image 스킬의 SKILL.md 참조)
### Step 3 — 결과 저장
각 컷 이미지를 `_workspace/episodes/ep{NN}/images/cut_{ID:02d}.png`로 저장. 메타는 같은 폴더의 `cut_{ID:02d}.meta.json`:
```json
{
"cut_id": 1,
"model": "gpt-image-2",
"seed": 4823917,
"seed_group": "ep01_location_seoul",
"size": "1024x1792",
"generated_at": "2026-05-17T20:00:15Z",
"duration_sec": 12,
"retry_count": 0,
"prompt_hash": "sha256:abc123..."
}
```
### Step 4 — 실패 처리
- 단일 컷 실패 → 즉시 1회 재시도 (같은 시드 유지)
- 재실패 → meta.json의 `status: "GEN_FAILED"`, report에 기록, **빈 placeholder PNG는 생성하지 않는다** (panel-assembler가 자체 처리)
- 배치 전체 실패(quota/network) → 30초 대기 후 1회 재시도. 재실패 시 오케스트레이터에 에스컬레이션.
### Step 5 — generation_report.json 작성
회차 전체 결과 요약을 `_workspace/episodes/ep{NN}/generation_report.json`:
```json
{
"episode": 1,
"total_cuts": 8,
"succeeded": 8,
"failed": [],
"batches": [
{"batch_id": 1, "cut_ids": [1,2,3,4,5], "duration_sec": 45, "seed_group_set": ["ep01_location_seoul", "ep01_han-do-hyun"]},
{"batch_id": 2, "cut_ids": [6,7,8], "duration_sec": 28, "seed_group_set": ["ep01_han-do-hyun", "ep01_group_han-do-hyun"]}
],
"started_at": "2026-05-17T20:00:00Z",
"completed_at": "2026-05-17T20:01:15Z",
"total_duration_sec": 75
}
```
## 모델 선택 가이드
- **기본:** codex-image (병렬 5장, 빠른 속도) — 대부분의 컷
- **고해상도/정밀:** gpt-image-2 — 임팩트 컷(scroll_length 4)만, 단일 호출
- **다중 레퍼런스/캐릭터 시트 합성:** gemini-3-pro-imagegen — 캐릭터 시트 생성 시(여러 portrait를 한 화면에 합성)
prompts.json의 `model_preference` 필드 우선, 없으면 기본 사용.
## 사이즈 표준
| aspect_ratio | size |
|---|---|
| 9:16 | 1024x1792 (세로 임팩트) |
| 16:9 | 1792x1024 (가로 와이드) |
| 1:1 | 1024x1024 (정사각/침묵) |
scroll_length 3-4 임팩트 컷은 가능하면 9:16 + 1024x1792로 통일.
## 체크리스트
- [ ] 모든 컷이 cut_{ID:02d}.png로 저장됨
- [ ] 모든 컷에 meta.json 존재
- [ ] generation_report.json 작성됨
- [ ] 실패 컷은 status 기록 후 진행 (placeholder 자동 생성 금지)
- [ ] panel-assembler와 consistency-qa에게 완료 통지
View on GitHub