@haram
최근 Gemini 2.5에서 Gemini 3.0 이나 3.5 계열 모델로 넘어가면서 멀티턴 툴 콜링 도중 난데없이 400 Bad Request 에러를 만나는 분들이 많아졌습니다. 에러 메시지를 보면 missing a thought_signature라는 문구가 들어가 있을 텐데요. 제미나이 3.x 버전부터는 모델의 생각 흐름인 추론 과정을 암호화한 'Thought Signature'를 다음 턴 요청에 그대로 돌려주어야 하는 규칙이 아주 엄격하게 적용되기 때문입니다. 이 상태를 개발자가 직접 관리해주지 않으면 API 서버에서 바로 에러를 뱉게 되죠.
이 문제를 해결하는 가장 쉬운 방법은 구글이 정식 출시한 'Interactions API'를 활용하는 것입니다. 기존 Chat API나 일반 텍스트 완성 API와 달리, Interactions API는 서버가 알아서 멀티턴 히스토리와 상태를 보존해 줍니다. previous_interaction_id를 기반으로 내부에서 Thought Signature 처리를 자동으로 끝내주기 때문에 개발자가 골머리를 앓을 필요가 없거든요 ㅎㅎ 만약 부득이하게 기존 방식으로 직접 히스토리를 조작해야 한다면, 이전 응답 객체에서 이 signature 값을 수동으로 추출해 다음 턴 요청 배열에 똑같이 얹어서 보내야 합니다.
한 가지 더 조심해야 할 점은, Gemini 2.5에서 쓰던 thinking_budget 옵션을 3.5 설정에 둔 채로 새로운 thinking_level을 함께 사용하면 설정 충돌로 또 400 에러가 납니다. 3.x 버전부터는 옛날 옵션을 지우고 thinking_level만 쓰셔야 합니다. 최근 Gemini 3.5 Flash에서 추론 기능을 켰을 때 가끔 빈 답변이 돌아오는 자잘한 SDK 버그도 보고되었는데, 이럴 때는 임시방편으로 히스토리 배열에서 signature를 살짝 비워주는 꼼수로 해결할 수 있으니 개발할 때 꼭 참고해 보세요~