|

Nano Banana 2 thought_signature 400 오류 해결: 다중 라운드 이미지 편집 시 반드시 사고 서명을 반환해야 함

작성자 주: Nano Banana 2에서 'Image part is missing a thought_signature' 오류가 발생하나요? 이는 다중 대화 시 '사고 서명(thought_signature)'을 다시 전달하지 않아 발생하는 400 오류입니다. 이 글에서 원인과 해결 방법, 코드 예시를 자세히 설명해 드릴게요.

Nano Banana 2(gemini-3.1-flash-image-preview)를 사용하여 이미지를 편집하다가 다음과 같은 오류를 보셨다면:

{
  "status_code": 400,
  "error": {
    "message": "Image part is missing a thought_signature in content position 2, part position 1."
  }
}

당황하지 마세요. 이는 콘텐츠 보안 문제나 플랫폼 오류가 아니라, Gemini 3 시리즈 모델의 다중 대화 메커니즘 요구 사항입니다. 간단히 말해, 두 번째 요청에서 이전에 생성된 이미지를 보낼 때 해당 이미지의 thought_signature(사고 서명)를 함께 첨부하지 않아서 발생하는 문제입니다.

핵심 요약: 이 글을 읽고 나면 thought_signature의 작동 원리를 이해하고, 3가지 해결 방안을 익히며, 다중 이미지 편집 시 사고 서명을 올바르게 처리하는 방법을 배우게 됩니다.

nano-banana-2-thought-signature-error-400-fix-guide-ko 图示


Nano Banana 2 thought_signature 오류의 핵심 분석

이 에러 메시지는 정확히 무엇을 의미할까요?

에러 메시지를 한 글자씩 뜯어보겠습니다.

필드 의미 설명
status_code: 400 요청 파라미터 오류 서버 오류가 아닌 클라이언트 측 전달값 문제
Image part 요청에 포함된 이미지 데이터 2차 요청에서 이미지를 전송함
missing a thought_signature 사고 서명 누락 이전 라운드에서 생성된 이미지이므로 서명이 필요함
content position 2, part position 1 대화 내 2번째 메시지, 1번째 파트 서명이 누락된 위치를 정확히 지목함

한 줄 요약: Gemini API는 상태가 없는(stateless) 구조입니다. 모델은 thought_signature(사고 서명)를 통해 다중 라운드 대화에서 추론 컨텍스트를 유지합니다. 두 번째 이미지 편집 요청을 보낼 때, 이전 라운드에서 모델이 반환한 thought_signature를 그대로 다시 전달하지 않으면 400 에러가 발생합니다.

왜 Gemini 3 시리즈는 thought_signature를 강제할까요?

비교 Gemini 2.x 시리즈 Gemini 3 시리즈 (NB2 포함)
사고 서명 일부 상황에서 선택 가능 모든 part 유형에서 필수
검증 엄격도 느슨함 엄격함 (누락 시 400)
적용 범위 주로 함수 호출용 텍스트, 이미지, 함수 호출 전체 적용
자동 처리 공식 SDK 자동 처리 공식 SDK 자동 처리

Gemini 3 시리즈 모델(Nano Banana 2 기반의 gemini-3.1-flash 포함)이 사고 서명을 강제하는 이유는 다음과 같습니다.

  1. 추론 상태 복구: 사고 서명은 모델 내부 추론 과정의 암호화된 표현으로, 다음 대화 라운드에서 이전의 '사고 상태'를 복구하게 해줍니다.
  2. 이미지 편집 연속성: 다중 라운드 이미지 편집 시, 모델은 "이 이미지는 내가 방금 생성한 것"임을 이해해야 편집 명령을 올바르게 수행할 수 있습니다.
  3. 보안 및 일관성: 서명 메커니즘은 대화 기록이 변조되지 않았음을 보장하여 다중 라운드 상호작용의 신뢰성을 높입니다.

🎯 핵심 포인트: 이 400 에러는 콘텐츠 보안 정책(IMAGE_SAFETY)과는 전혀 무관하며, APIYI 플랫폼의 문제도 아닙니다. 이는 Gemini 3 시리즈 모델의 정상적인 메커니즘 요구사항이므로 코드 레벨에서 적절히 처리해야 합니다.


Nano Banana 2 thought_signature 오류 해결을 위한 3가지 방법

nano-banana-2-thought-signature-error-400-fix-guide-ko 图示

방법 1: 공식 SDK의 chat 기능 사용 (권장)

Google 공식 SDK(Python / Node.js / Java)를 사용 중이라면, 가장 간단한 방법은 chat 기능을 사용하는 것입니다. SDK가 알아서 thought_signature를 관리해 줍니다.

from google import genai

client = genai.Client(api_key="YOUR_API_KEY")

# chat 기능을 사용하면 SDK가 자동으로 thought_signature를 처리합니다
chat = client.chats.create(model="gemini-3.1-flash-image-preview")

# 1차 라운드: 이미지 생성
response1 = chat.send_message("창가에 앉아 있는 주황색 고양이를 그려줘")

# 2차 라운드: 이미지 편집 (signature가 자동으로 전달됨)
response2 = chat.send_message("고양이에게 산타 모자를 씌워줘")

방법 2: 수동으로 thought_signature 추출 및 전달

사용자 정의 HTTP 호출이나 OpenAI 호환 인터페이스를 통해 호출하는 경우, 서명을 직접 처리해야 합니다. 핵심 로직은 이전 라운드 응답에서 thought_signature를 추출하여 다음 요청의 해당 part에 그대로 포함시키는 것입니다.

import openai

client = openai.OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://vip.apiyi.com/v1"
)

# 1차 라운드: 이미지 생성
response1 = client.chat.completions.create(
    model="gemini-3.1-flash-image-preview",
    messages=[{"role": "user", "content": "주황색 고양이를 그려줘"}]
)

# 핵심: 전체 model response 저장
# 이미지 데이터와 thought_signature가 포함되어 있습니다
model_reply = response1.choices[0].message

# 2차 라운드: 이미지 편집
# 이전 라운드의 전체 model response를 대화 기록으로 전달
response2 = client.chat.completions.create(
    model="gemini-3.1-flash-image-preview",
    messages=[
        {"role": "user", "content": "주황색 고양이를 그려줘"},
        model_reply,  # thought_signature를 포함하여 전체 전달
        {"role": "user", "content": "고양이에게 모자를 씌워줘"}
    ]
)

방법 3: 단일 라운드 요청으로 전환

다중 라운드 대화 편집이 필요 없는 상황이라면, 매번 독립적인 단일 라운드 요청을 보내 thought_signature 문제를 완전히 피할 수 있습니다.

# 단일 라운드 이미지 편집: 원본 이미지 + 편집 명령을 직접 전달
response = client.chat.completions.create(
    model="gemini-3.1-flash-image-preview",
    messages=[{
        "role": "user",
        "content": [
            {"type": "image_url", "image_url": {"url": "data:image/png;base64,/9j/..."}},
            {"type": "text", "text": "이 고양이에게 산타 모자를 씌워줘"}
        ]
    }]
)

🎯 추천: 신규 프로젝트는 방법 1(공식 SDK chat 기능)을 권장하며, 기존 프로젝트는 수정 범위에 따라 방법 2나 3을 선택하세요. APIYI(apiyi.com)를 통해 Nano Banana 2를 호출할 때 방법 2와 3 모두 정상적으로 작동합니다.

Nano Banana 2 thought_signature 흔한 오해

오해 사실
콘텐츠 보안 문제인가요? 아닙니다. 400 에러는 파라미터 검증 실패이며, IMAGE_SAFETY와는 무관합니다.
API 플랫폼 문제인가요? 아닙니다. Gemini 3 시리즈 모델의 메커니즘 요구사항입니다.
직접 서명을 생성할 수 있나요? 불가능합니다. 서명은 암호화되어 있으므로 모델이 반환한 값을 그대로 전달해야 합니다.
함수 호출에만 필요한가요? Gemini 3 시리즈의 모든 part 유형에서 필요할 수 있습니다.
thinking: off로 해결되나요? 안 됩니다. thinking 레벨을 minimal로 설정해도 서명은 반환되며 반드시 다시 전달해야 합니다.

Nano Banana 2 응답에서 thought_signature의 위치

Nano Banana 2의 응답 데이터에서 다음 두 가지 특별한 part를 주의해야 합니다.

임시 이미지 (thought: true): 모델 추론 과정에서 생성된 중간 이미지로, thought: true로 표시됩니다. 이는 임시 데이터이므로 사용자에게 보여줄 필요가 없습니다.

최종 이미지 (thought_signature 포함): 최종 생성된 이미지에는 thought_signature 필드가 포함됩니다. 이것이 바로 다음 요청 시 다시 전달해야 할 서명입니다.

{
  "candidates": [{
    "content": {
      "parts": [
        {
          "inlineData": {"mimeType": "image/png", "data": "..."},
          "thought_signature": "CkYKRAo..."
        }
      ]
    }
  }]
}

🎯 기술적 세부사항: thought_signature는 암호화된 문자열로, 길이는 보통 200~500자 사이입니다. 파싱하거나 수정하거나 직접 생성하려 하지 마세요. 받은 그대로 전달하면 됩니다. APIYI(apiyi.com)를 통해 호출할 경우, 응답 형식은 구글 네이티브 API와 완전히 동일합니다.


Nano Banana 2 thought_signature 오류 해결 체크리스트

nano-banana-2-thought-signature-error-400-fix-guide-ko 图示

빠른 4단계 점검:

  1. 다중 요청 여부 확인: messages 배열에 이전 모델의 응답(특히 이미지 데이터)이 포함되어 있다면 다중 요청입니다.
  2. 전체 응답 저장 여부 확인: 이전 모델 응답에 thought_signature 필드가 포함되어 있나요? 온전히 저장되었나요?
  3. 서명 변조 여부 확인: JSON 직렬화/역직렬화 과정에서 서명 문자열이 잘리거나 이스케이프 처리되지 않았나요?
  4. part 위치 정렬 확인: 에러 메시지의 content position X, part position Y를 통해 서명이 누락된 part를 정확히 찾을 수 있습니다.

자주 묻는 질문(FAQ)

Q1: 단일 턴 이미지 생성에서도 이 오류가 발생하나요?

보통은 발생하지 않습니다. thought_signature 오류는 거의 다중 턴 대화에서만 나타납니다. 이전 모델이 반환한 이미지를 대화 기록에 포함하여 새로운 요청을 보낼 때 트리거되기 때문이죠. 단일 턴의 텍스트-이미지 변환이나 이미지-이미지 변환(원본 이미지를 직접 전달하는 경우)은 대화 기록을 다루지 않으므로 서명을 처리할 필요가 없습니다.

Q2: OpenAI 호환 인터페이스로 호출할 때는 어떻게 처리하나요?

APIYI(apiyi.com)의 OpenAI 호환 인터페이스를 통해 Nano Banana 2를 호출할 때 가장 중요한 점은 이전 턴의 model 응답 객체 전체를 저장하여 다음 턴 요청 시 대화 기록으로 전달하는 것입니다. 이미지 데이터만 저장하고 다른 필드를 버리지 마세요. 만약 Dify나 Cherry Studio 같은 프레임워크를 사용 중이라면, 해당 도구가 대화 기록 내의 thought_signature를 온전히 보존하는지 확인해야 합니다.

Q3: thought: true인 임시 이미지도 다시 전달해야 하나요?

네, 그렇습니다. Nano Banana 2는 추론 과정에서 thought: true로 표시된 임시 이미지를 반환할 수 있는데, 이는 모델의 '사고 과정' 일부입니다. 대화 기록을 구성할 때 모델이 반환한 모든 part(임시 이미지 포함)를 빠짐없이 다시 전달해야 합니다. 가장 안전한 방법은 모델의 전체 응답 객체를 그대로 다시 전달하는 것입니다.


요약

Nano Banana 2의 thought_signature 400 오류 해결 핵심 포인트:

  1. 콘텐츠 안전성 문제 아님: 이는 Gemini 3 시리즈 모델의 다중 턴 대화 메커니즘 요구사항이며, IMAGE_SAFETY와는 무관합니다.
  2. 원인 명확: 다중 턴 요청 시, 이전 턴에서 모델이 반환한 thought_signature를 그대로 전달하지 않았기 때문입니다.
  3. 해결 방안: 공식 SDK의 채팅 기능을 사용(자동 처리)하거나, 수동으로 서명을 추출하여 전달하거나, 단일 턴 요청으로 변경하세요.

핵심 원칙을 기억하세요: 모델이 반환한 thought_signature는 수정하거나, 버리거나, 직접 생성하지 마세요. 받은 그대로 다시 전달하면 됩니다.

타사 플랫폼을 통해 Nano Banana 2를 호출해야 한다면 APIYI(apiyi.com)를 추천합니다. 구글 네이티브 API와 완전히 동일한 응답 형식을 제공하며, 1회당 $0.05, 동시 접속 제한 없이 이용할 수 있습니다.

📚 참고 자료

  1. Google 공식 Thought Signatures 문서: 사고 서명(Thought Signatures) 메커니즘 상세 설명

    • 링크: ai.google.dev/gemini-api/docs/thought-signatures
    • 설명: 작동 원리, 모델 동작 및 SDK 처리 방식을 포함한 공식 문서
  2. Google Gemini 3 개발자 가이드: Gemini 3 시리즈 신규 기능

    • 링크: ai.google.dev/gemini-api/docs/gemini-3
    • 설명: Gemini 3 시리즈의 서명 필수 요구 사항 및 신규 기능 설명
  3. Google 이미지 생성 문서: Nano Banana 이미지 생성 모범 사례

    • 링크: ai.google.dev/gemini-api/docs/image-generation
    • 설명: 다중 라운드 이미지 편집 시 thought_signature 사용 권장 사항
  4. Google Cloud Vertex AI 문서: 엔터프라이즈급 사고 서명 설명

    • 링크: docs.google.com/vertex-ai/generative-ai/docs/thought-signatures
    • 설명: Vertex AI 환경에서의 서명 처리 및 구성 방법

작성자: APIYI 기술 팀
기술 교류: Nano Banana 2 다중 라운드 편집 구현 경험을 댓글로 자유롭게 공유해 주세요. 더 많은 자료는 APIYI 문서(docs.apiyi.com)에서 확인하실 수 있습니다.

Similar Posts