Nano Banana 2.1과 Nano Banana 2로 포스터를 만들고 두 번 수정해 본 결과

Nano Banana 2.1과 2에 같은 포스터 생성·제목 수정·색상 변경을 요청했습니다. 실제 이미지 6장, 응답 시간, 토큰과 전환 시 확인할 사항을 비교합니다.

밝은 카드 위 나침반 선화, 기하학 장식과 Nano Banana 2.1 제목.

2026년 10월 13일 테스트. Ofox의 네이티브 Gemini API 경로를 통해 Nano Banana 2.1과 Nano Banana 2에 같은 프롬프트 세 개를 차례로 보냈습니다. 각 모델은 행사 포스터를 만든 다음, 제목을 바꾸고 그다음에는 그릇 색을 바꿨습니다. 이는 모델별로 세 단계로 이어지는 체인을 한 번씩 실행한 것이며, 독립적인 테스트를 세 번씩 수행한 결과도, 각 모델의 전반적인 품질을 평가한 벤치마크도 아닙니다.

이 글은 Ofox가 발행하며, 여기서 테스트한 게이트웨이도 Ofox가 운영합니다. 초안 작성에는 AI를 활용했고, API 요청과 출력 파일은 도구로 검증했으며, 게시 전에 별도의 AI 검토도 진행했습니다. 아래의 생성 이미지 여섯 장이 시각적 비교의 근거입니다. 공개 모델 페이지의 인터페이스는 그 근거가 아닙니다. 재현 자료 다운로드에서 파일과 요청 자료를 확인할 수 있습니다.

출력 이미지 여섯 장

단계Nano Banana 2.1Nano Banana 2
포스터 생성ORCHARD MARKET과 SATURDAY 10 AM 문구가 있고, 파란 그릇에 사과 세 개가 담긴 Nano Banana 2.1 포스터ORCHARD MARKET과 SATURDAY 10 AM 문구가 있고, 파란 그릇에 사과 세 개가 담긴 Nano Banana 2 포스터
제목 수정제목을 ORCHARD FAIR로 바꾼 Nano Banana 2.1 포스터제목을 ORCHARD FAIR로 바꾼 Nano Banana 2 포스터
그릇 색 수정그릇 색을 짙은 녹색으로 바꾼 Nano Banana 2.1 포스터그릇 색을 짙은 녹색으로 바꾼 Nano Banana 2 포스터

이번 실행에서는 두 모델 모두 요청한 의미상의 작업 순서를 완료했습니다. 첫 포스터에서는 ORCHARD MARKET과 SATURDAY 10 AM을 정확히 표기하고, 파란 그릇에 빨간 사과 세 개를 그렸습니다. 두 번째 단계에서는 작은 문구와 사과, 파란 그릇을 유지하면서 제목을 ORCHARD FAIR로 바꿨습니다. 세 번째 출력에서는 요청한 문구와 레이아웃을 유지하고 그릇을 짙은 녹색으로 바꿨습니다.

다만 두 모델 모두 같은 지시를 놓쳤습니다. 첫 프롬프트에 “테두리 없음”이라고 했지만, 두 모델 모두 디자인을 바깥 여백이나 그림자가 있는 종이 한 장처럼 표현했습니다. “테두리 없음”이 이미지 가장자리까지 그림이 채워져야 한다는 뜻이라면, 첫 출력은 어느 쪽도 그 조건을 충족하지 못합니다. 포스터 구상에는 쓸 만한 결과지만, 두 모델 중 어느 쪽이든 모든 레이아웃 지시를 정확히 따른다는 증거는 아닙니다.

보낸 내용과 이 비교로 확인할 수 있는 범위

실제로 보낸 프롬프트는 다음 순서와 같습니다.

  1. Create a square minimalist event poster on warm cream paper. Large exact headline: ORCHARD MARKET. Smaller exact line: SATURDAY 10 AM. Draw three red apples in a blue ceramic bowl below the text. No other text, no logos, no border.
  2. Change only the headline from ORCHARD MARKET to ORCHARD FAIR. Keep SATURDAY 10 AM exactly unchanged. Preserve the three red apples, blue bowl, cream background, composition and all other pixels as closely as possible.
  3. Now change only the bowl from blue to dark green. Preserve ORCHARD FAIR, SATURDAY 10 AM, the three red apples and the layout.

각 모델의 두 번째 단계에는 해당 모델이 생성한 포스터를 넣었습니다. 세 번째 단계에는 해당 모델의 앞선 대화 내용과 제목 수정 결과를 넣었습니다. 화면에 표시된 PNG를 바탕으로 각 부분을 다시 구성한 것이 아니라, 앞서 반환된 전체 candidates[0].content를 assistant 턴으로 다시 보냈습니다. 대화를 이어갈 때 반환된 콘텐츠에 필요한 부분이 포함될 수 있으므로 중요한 차이입니다.

테스트한 Ofox 경로는 POST https://api.ofox.io/gemini/v1beta/models/{model}:generateContent이며, x-goog-api-key로 인증했습니다. 모델 ID는 구형 모델의 경우 google/gemini-3.1-flash-image, Nano Banana 2.1의 경우 google/gemini-nano-banana-2.1이었습니다. 두 체인 모두 responseModalities: ["TEXT", "IMAGE"], 1:1 가로세로 비율, 1K 이미지 크기를 요청했습니다. seed나 명시적인 thinking level은 설정하지 않았습니다. 따라서 모델마다 서로 다른 기본값을 사용했을 수 있습니다. 프롬프트와 요청한 이미지 설정을 맞췄다고 해서 내부 설정까지 동일해지는 것은 아닙니다.

요청 여섯 건은 모두 HTTP 200과 STOP 종료 사유를 반환했으며, 각 결과는 1024 × 1024 PNG였습니다. 반복 테스트, 다른 언어, 다른 가로세로 비율, 실제 운영 워크로드는 시험하지 않았습니다. 위의 시각적 평가는 이 여섯 파일에만 해당합니다. 특히 “다른 모든 픽셀은 가능한 한 그대로 보존”은 지시일 뿐, 픽셀 단위 편집이나 편집 가능한 레이어를 보장하지 않습니다. 제목을 수정한 결과에서 겉보기에 안정적으로 보이는 하단 영역조차 RGB 픽셀이 많이 바뀌었습니다. 정확한 픽셀 불일치 수는 작은 질감과 색상 차이도 변경으로 세는 값이지, 시각적 손상 점수가 아닙니다. 제품 영역을 더 엄격하게 제어해야 하는 기법은 마스크 기반 보존 및 장면 참조 이미지 한 장과 두 장 비교에 관한 별도 설명을 참고하세요.

응답 시간과 반환된 사용량: 관찰 결과이지 속도 순위는 아닙니다

아래는 요청 여섯 건에 걸린 시간과 반환된 사용량 필드입니다. “미보고”는 해당 필드가 없었다는 뜻이며, 추론 토큰이나 관련 비용이 0이었다는 의미는 아닙니다.

모델 및 단계경과 시간(초)입력 토큰보고된 텍스트 출력 토큰이미지 출력 토큰추론 토큰
2.1 — 포스터15.4654801,120639
2.1 — 제목 수정17.481,167미보고1,120358
2.1 — 그릇 수정18.442,272미보고1,120미보고
2 — 포스터10.0854미보고1,120미보고
2 — 제목 수정13.991,167미보고1,120미보고
2 — 그릇 수정13.062,272미보고1,120미보고

첫 번째 2.1 응답은 TEXT 출력 토큰 80개를 보고했지만, 눈에 보이는 텍스트 부분은 포함하지 않았습니다. 표의 수치는 메타데이터 항목별 값이지, 눈에 보이는 단어 수가 아닙니다.

이번 세 번의 짝지은 단계에서는 Nano Banana 2가 매번 더 빨리 응답했습니다. 반복 없이 통제된 부하 조건도 없는 직렬 요청 여섯 건만으로는 일반적으로 더 빠르다고 결론 내릴 수 없습니다. 이 테스트에서 두 모델 모두 주요 텍스트와 편집 작업을 수행했다고 해서 프롬프트 전반에서 신뢰성도 같다고 볼 수는 없습니다. 입력 토큰 수가 증가한 것은 API가 보고한 다중 턴 요청의 값입니다. 이 수치만으로 제출한 대화 기록이 정확히 어떻게 청구되었는지 알 수는 없습니다. 아래 마이그레이션 단계는 이 제한적인 관찰 결과를 각자의 워크로드에서 확인할 항목으로 바꿔 제시합니다.

세 단계 체인 재현하기

자료 묶음에는 테스트 자료와 출력 이미지가 들어 있습니다. 새 요청을 실행하려면 requests를 설치하고 Ofox API 키를 설정한 뒤 아래 스크립트를 실행하세요. 스크립트는 위의 프롬프트를 그대로 사용하고, 반환된 인라인 이미지 부분을 모두 저장하며, 다음 단계에 사용할 수 있도록 각 응답의 전체 candidate 콘텐츠를 보존합니다. 새로 생성한 결과가 게시된 PNG와 일치할 필요는 없습니다.

python -m pip install requests
export OFOX_API_KEY="your-key"
python compare_posters.py
# compare_posters.py
import base64
import json
import os
import time
from pathlib import Path

import requests

KEY = os.environ["OFOX_API_KEY"]
OUT = Path("poster-comparison")
OUT.mkdir(exist_ok=True)

PROMPTS = [
    "Create a square minimalist event poster on warm cream paper. Large exact headline: ORCHARD MARKET. Smaller exact line: SATURDAY 10 AM. Draw three red apples in a blue ceramic bowl below the text. No other text, no logos, no border.",
    "Change only the headline from ORCHARD MARKET to ORCHARD FAIR. Keep SATURDAY 10 AM exactly unchanged. Preserve the three red apples, blue bowl, cream background, composition and all other pixels as closely as possible.",
    "Now change only the bowl from blue to dark green. Preserve ORCHARD FAIR, SATURDAY 10 AM, the three red apples and the layout.",
]

MODELS = {
    "21": "google/gemini-nano-banana-2.1",
    "2": "google/gemini-3.1-flash-image",
}
STAGES = ("poster", "edit", "turn3")

for label, model in MODELS.items():
    history = []
    url = f"https://api.ofox.io/gemini/v1beta/models/{model}:generateContent"

    for stage, prompt in zip(STAGES, PROMPTS):
        user_turn = {"role": "user", "parts": [{"text": prompt}]}
        payload = {
            "contents": history + [user_turn],
            "generationConfig": {
                "responseModalities": ["TEXT", "IMAGE"],
                "imageConfig": {"aspectRatio": "1:1", "imageSize": "1K"},
            },
        }

        started = time.monotonic()
        response = requests.post(
            url,
            headers={"x-goog-api-key": KEY},
            json=payload,
            timeout=180,
        )
        elapsed = time.monotonic() - started
        response.raise_for_status()
        body = response.json()

        candidates = body.get("candidates") or []
        if not candidates:
            raise RuntimeError(f"{label}/{stage}: no candidate: {body}")
        candidate = candidates[0]
        if candidate.get("finishReason") != "STOP":
            raise RuntimeError(
                f"{label}/{stage}: finishReason={candidate.get('finishReason')}"
            )

        content = candidate["content"]  # Keep all returned parts intact.
        saved = []
        for index, part in enumerate(content.get("parts", [])):
            inline = part.get("inlineData")
            if not inline:
                continue
            mime = inline.get("mimeType", "")
            if not mime.startswith("image/"):
                continue
            extension = ".png" if mime == "image/png" else ".img"
            path = OUT / f"{stage}-{label}-{index}{extension}"
            path.write_bytes(base64.b64decode(inline["data"]))
            saved.append(str(path))

        if not saved:
            raise RuntimeError(f"{label}/{stage}: STOP but no inline image")
        print(json.dumps({
            "model": model, "stage": stage, "seconds": round(elapsed, 2),
            "images": saved, "usageMetadata": body.get("usageMetadata"),
        }))

        history += [user_turn, content]

코드는 텍스트 부분을 이미지가 아닌 텍스트로 처리합니다. 또한 HTTP 응답이 성공했는데도 candidate가 없거나, 종료 사유가 STOP이 아니거나, 인라인 이미지가 없는 경우에는 오류를 명확히 표시합니다. 이미지 생성을 워크플로에 통합하기 전에 이런 경우를 처리해야 합니다. 공개된 Ofox 2.1 모델 페이지에는 모델과 프로토콜이 안내되어 있지만, 페이지에 포함된 Playground를 사용하려면 로그인해야 합니다. 모델 페이지 스크린샷은 공개 인터페이스의 증거일 뿐, 이 이미지들이 해당 페이지에서 생성됐다는 증거는 아닙니다. 인증된 Agent 모델 선택 테스트는 진행하지 않았으므로, Agent가 자동으로 2.1을 선택한다고 주장하지 않습니다. 응답 처리 실패에 관한 내용은 이미지 없음 오류 안내와 Google의 API 문제 해결 문서를 참고하세요.

토큰이 의미하는 것과 의미하지 않는 것

이미지 토큰, 입력 토큰, 보고된 텍스트 출력 토큰, 보고된 추론 토큰은 서로 다른 사용량 항목입니다. Ofox의 2026년 10월 13일 런타임 카탈로그 스냅샷에는 2.1 요금이 입력 토큰 100만 개당 $1.50, 텍스트 출력 토큰 100만 개당 $7.50, 이미지 출력 토큰 100만 개당 $30으로 표시되어 있었습니다. 구형 모델의 해당 스냅샷에는 각각 $0.50, $3, $60으로 표시되어 있었습니다. 2.1 스냅샷에는 검색 요청당 $0.014도 기재되어 있었지만, 이 포스터 테스트에서는 검색을 사용하지 않았습니다. 제공업체 가격 필드가 null이라는 사실만으로 제공업체 할인이 확인된 것은 아닙니다. Ofox의 카탈로그 엔드포인트는 사이트의 Git 저장소에 있는 고정 가격표가 아니라 동적으로 제공되며, 스냅샷에 요금을 대입해 계산한 값은 검증된 청구서가 아닙니다. 예산을 세우기 전에 최신 요금 안내와 실제 청구 내역을 확인하세요.

첫 번째 2.1 포스터 요청에 위 스냅샷 요금을 적용하면 이미지 비용은 1,120 × $30 / 1,000,000 = $0.0336, 입력 비용은 54 × $1.50 / 1,000,000 = $0.000081, 보고된 텍스트 출력 비용은 80 × $7.50 / 1,000,000 = $0.0006입니다. 보고된 추론 토큰 639개에도 동일한 텍스트 출력 요금이 적용된다고 가정하면, 예상 추가 비용은 $0.0047925이며 예시로 계산한 합계는 $0.0390735입니다. 이 조건부 계산은 청구 금액이 아닙니다. 구형 모델에서 추론 토큰 필드가 없었다고 해서 비용이 없었다고 가정하지 마세요.

스냅샷의 이미지 요금을 적용하면 1K 2.1 이미지 100장을 생성했을 때 이미지 비용만 $3.36입니다. 100장의 승인된 이미지를 얻기 위해 125장을 생성한다고 가정하고 승인율을 예시로 80%로 두면, 이미지 비용은 $4.20입니다. 이 이미지 전용 금액에는 입력, 텍스트, 청구될 수 있는 추론 토큰, 재시도, 기타 적용 가능한 요금이 포함되지 않습니다. 구형 모델에서 출력 토큰 1,120개인 이미지의 이미지 비용은 $0.0672로 계산되지만, 이 수치가 모델을 바꾸면 특정 워크로드의 총 청구액이나 승인된 디자인 한 건당 비용이 줄어든다는 사실을 증명하지는 않습니다.

Google의 Gemini 요금 페이지에도 2.1의 텍스트 및 추론 토큰 요금과 이미지 요금이 별도로 기재되어 있으며, 1K 이미지가 이미지 토큰 1,120개에 해당한다고 나와 있습니다. 공개된 4K 수치는 Google의 자료끼리도 명확히 일치하지 않습니다. 이미지 생성 요금 표에는 토큰 2,520개가, Vertex 문서에는 3,780개가 나와 있습니다. 이 테스트에서는 4K 요청을 하지 않았으므로, 어느 수치도 이 테스트에서 확인한 Ofox 4K 청구 금액처럼 제시해서는 안 됩니다.

기존 워크플로의 모델 ID를 바꿔야 할까?

이번 이미지 여섯 장이 보편적인 승자를 증명한다는 이유가 아니라, 실제로 확인한 문제를 해당 모델의 동작이나 사용 가능한 기능이 해결해 줄 때 모델을 바꾸세요. Google은 Nano Banana 2.1의 모델 기능과 이미지 생성 워크플로를 안내하며, 여기에는 더 높은 해상도 옵션과 참조 이미지 워크플로가 포함됩니다. 기능이 문서화되어 있다는 사실은 Ofox 경로를 통해 모든 옵션을 시험했다는 뜻이 아닙니다. 이번 비교에서는 1K만 사용했고, 외부 참조 이미지는 사용하지 않았으며, 영어 프롬프트만 사용했습니다. Pro나 Lite도 비교하지 않았습니다. 두 모델의 문서상 용도는 다른 요구 사항에 맞춰 평가해 볼 이유이지, 이번 테스트에서 우수성이 측정됐다는 뜻은 아닙니다.

신중하게 업그레이드하려면 다음 네 가지를 확인하세요.

  1. 모델 ID를 고정하세요. 프로덕션의 모든 요청을 조용히 바꾸는 대신, 테스트 설정에서 google/gemini-3.1-flash-image를 google/gemini-nano-banana-2.1로 변경하세요.
  2. 설정과 대화 기록을 명시적으로 관리하세요. 요청한 해상도와 가로세로 비율, 모달리티, 프롬프트, 턴 사이에 전달한 전체 assistant 콘텐츠를 기록하세요. seed, temperature, top-p 조정이 이번 결과를 재현 가능하게 만든 것처럼 근거 없는 설정법을 안내하지 마세요.
  3. 실제 결과물에 맞춰 출력 한계를 확인하세요. 실제 자료를 사용해 정확한 문구, 원치 않는 여백, 필요한 경우 참조 이미지 처리, 이미지 누락 응답, 승인율, 지연 시간 분포, 총 청구 사용량을 테스트하세요. 이와 같은 작업에서 추가 제약을 확인하려면 포스터 편집 안내를, 통합 방법은 API 안내를 참고하세요.
  4. 롤백 경로를 마련하세요. 새 모델이 자체 검사를 통과할 때까지 이전 ID와 라우팅 설정을 보존하세요. 이번 테스트로 구형 ID가 종료됐다고 볼 수는 없습니다.

마지막으로, 보기 좋은 생성 포스터가 권리 문제를 해결해 주거나 안전한 데이터 처리 정책을 보장하지는 않습니다. 상업적 용도나 민감한 데이터에 사용하기 전에 제공한 입력의 권리와 적용되는 Gemini API 약관을 확인하세요. SynthID 문서를 눈에 보이는 워터마크, 독점 소유권, 비침해를 약속하는 내용으로 해석해서는 안 됩니다. 여기서 내릴 수 있는 결론은 더 제한적입니다. 영어로 된 같은 포스터 프롬프트를 세 단계에 걸쳐 한 번씩 실행했을 때, 두 모델 모두 요청한 문구와 그릇 색을 수정했지만, 둘 다 테두리 없음 지시는 따르지 못했습니다.