- docs/analysis/reroomai-source.md 신규: gemini-3.1-flash-image-preview image-to-image, 보존/교체 프롬프트, CompareSlider/전처리 차용 - PLANNING v1.1: §6-4/6-5 나노바나나 호출스택·부스 프롬프트 빌더 확정, R11 해소·R12(Gemini 외부API 승인 게이트) 추가 - tools/nanobanana/client.py 전면 재작성: build_booth_prompt 4단 조립, 메타데이터 임베드, S6 래스터 합성 분리, seed 폴백, 방어 로직 - BACKLOG B-02/B-03/B-09/B-11/B-12 done - kintex.com 2차 검증 순증 사실 반영(기본부스 사양·이격·홀 스펙) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
68 lines
5.2 KiB
Markdown
68 lines
5.2 KiB
Markdown
---
|
||
name: nanobanana-visualize
|
||
description: 부스/인테리어/배선/조명 설계 데이터를 나노바나나(Gemini 이미지 생성)로 '시공 후 결과 사진'으로 렌더링할 때 사용. 시공 시안 이미지, before/after 비교, 조명 야간 연출, 배선 오버레이 생성 요청 시 트리거.
|
||
---
|
||
|
||
# 나노바나나 시공 결과 시각화 스킬
|
||
|
||
ReRoomAI 실증 패턴(`docs/analysis/reroomai-source.md`)을 표준화한 파이프라인.
|
||
"부스 골격 보존 + 표면(집기·조명·배선) 교체" image-to-image 편집.
|
||
|
||
## 호출 표준
|
||
- **모델**: `gemini-3.1-flash-image-preview` (나노바나나 2). 환경변수 `NANOBANANA_MODEL` 로 오버라이드 가능.
|
||
- **호출**: `tools/nanobanana/client.py`의 `NanoBananaClient`만 사용(직접 API 호출 금지).
|
||
google-genai(`google.genai`) SDK로 `generate_content(model, contents=[Part.from_bytes(...), text])`.
|
||
참조 이미지는 `inlineData(mimeType+base64)`, 지시문은 `text` — parts 배열로 전달. mimeType 자동 감지.
|
||
- **보안**: API 키는 환경변수 `GEMINI_API_KEY` 에서만 로드. 코드/로그/커밋/응답에 절대 기록 금지.
|
||
★ 실제 Gemini 호출은 **소유자 승인 대기**(reroomai-source.md §8) — 승인 전 실호출 강제 금지.
|
||
|
||
## 프롬프트 빌더 (구조화 사전 조립 + 보존/교체 분리)
|
||
`build_booth_prompt(scene, shot_preset, layers)` 가 PLANNING §6-2 스키마를 4단으로 조립:
|
||
1. **대상+스타일** — `BOOTH_TYPES`(독립/조립/코너/아일랜드) × `BOOTH_STYLES`(럭셔리/테크/친환경/미니멀/표준) + 치수·브랜드컬러.
|
||
2. **보존 잠금** — 부스 외곽 치수·기둥·바닥 트렌치 그리드·천장 트러스·통로 방향·카메라 앵글 유지.
|
||
3. **교체 지정** — `FIXTURE_LAYERS`(집기/조명/전기/네트워크) 레이어별 조각 + 간판 문구(한글)·자재·존·색온도.
|
||
4. **사진 품질** — photorealistic tradeshow, natural lighting, high detail, no people/real logos.
|
||
|
||
입력은 §6-2 `scene`(hall/booth/design/lighting/wiring + shot/render_hints). 중첩/평면 모두 관대 파싱.
|
||
|
||
## 절차
|
||
1. 입력 확인: `scene` dict(§6-2)가 구조화됐는지 확인. 없으면 설계 데이터/사용자에서 추출.
|
||
2. `GEMINI_API_KEY` 확인. 없으면 발급 안내 후 중단. (승인 전이면 실호출 보류)
|
||
3. `NanoBananaClient().render_shot(scene, shot_preset="S1", reference_image=빈부스사진, seed=고정값)`.
|
||
4. 표준 샷 세트 S1~S7 순서로 생성:
|
||
- S1 정면 주간 → S2 정면 야간 → S3 통로 → S4 내부 (모두 `render_shot`)
|
||
- S5 Before/After: S1 결과 + `reference_image`(빈 부스 실측) 쌍
|
||
- S7 홀 조감: `render_shot(shot_preset="S7")`
|
||
- **S6 배선 오버레이**: 생성형 아님 → `render_wiring_overlay_raster(wiring, hall_dims_m, kinds, base_image)`
|
||
(도면 위 전기 적/네트워크 청/급배수 녹 경로를 좌표 정합 래스터 합성. 시공 검증용 1차 산출물).
|
||
발표/설명용 보조 이미지가 필요할 때만 `generate_wiring_overlay`(생성형, 검증 사용 금지).
|
||
5. 빈 부스 실측 사진은 `reference_image`로 전달 → 실제 홀 구조 보존 합성(S5 before/after 쌍).
|
||
6. 워터마크: 모든 산출 이미지에 "AI 생성 예상 이미지 — 실제 시공 결과와 다를 수 있음" 합성(Pillow) 후
|
||
`output/visualizations/`에 저장. `GeneratedImage.save()`가 사이드카 `.meta.json`(생성일·스키마 해시·
|
||
모델 버전·seed·워터마크 고지)을 결정적으로 기록하고 PNG는 tEXt 청크에도 임베드.
|
||
7. 일관성: 같은 부스의 추가 샷은 **동일 `seed`** 전달(B-12). seed 미지원 SDK/모델이면 자동으로
|
||
**참조체인 기반 일관성**으로 폴백(첫 생성 이미지를 다음 샷 `reference_image`로 재사용).
|
||
|
||
## 표준 샷 세트 S1~S7
|
||
| 샷 | 호출 | 용도 |
|
||
|---|---|---|
|
||
| S1 정면 주간 | `render_shot(scene,"S1")` | 기본 컨펌 컷 |
|
||
| S2 정면 야간 | `render_shot(scene,"S2")` | 조명 연출 평가 |
|
||
| S3 통로 뷰 | `render_shot(scene,"S3")` | 관람객 동선 |
|
||
| S4 내부 뷰 | `render_shot(scene,"S4")` | 집기 배치 |
|
||
| S5 Before/After | S1 + `reference_image` 쌍 | 시공 전/후 비교 |
|
||
| S6 배선 오버레이 | `render_wiring_overlay_raster(...)` ★래스터 합성 | 시공 검증(좌표 정합) |
|
||
| S7 홀 조감 | `render_shot(scene,"S7")` | 배치안 비교 |
|
||
|
||
## 프로덕션 방어 (ReRoomAI route.ts 패턴)
|
||
- **입력 크기 가드**: 참조 이미지 8MB 상한 + 긴 쪽 1024px 다운스케일/JPEG 0.85(`downscale_for_upload`).
|
||
- **SAFETY 처리**: `finish_reason == SAFETY` → `NanoBananaSafetyError`.
|
||
- **에러 분기**: 키 무효→`NanoBananaAuthError`, 쿼터/429→`NanoBananaQuotaError`, SAFETY→`NanoBananaSafetyError`.
|
||
- **쿼터 차감**: `usage_recorder` 훅은 **성공 시에만** 호출(실패는 카운트 소모 안 함).
|
||
|
||
## 품질 체크
|
||
- 부스 크기 비율이 스펙과 맞는가 (3x3 부스가 대형처럼 보이면 재생성).
|
||
- 텍스트 사이니지가 한국어로 정확한가 (실패 시 간판 영역 후처리 합성 — PLANNING §6-4).
|
||
- 실존 브랜드 로고/사람 얼굴이 없는가.
|
||
- 계약·심사 서류에는 생성 이미지 사용 금지(도면만 유효 — PLANNING §6-5).
|