Gemini API 도구 조합, 직접 써봤습니다 — 막히는 조건

Published on

in

Gemini API 도구 조합, 직접 써봤습니다 — 막히는 조건

2026.03.18 출시 기준
gemini-3-flash-preview / gemini-3-pro-preview

Gemini API 도구 조합, 직접 써봤습니다 — 막히는 조건

Google Search로 실시간 데이터를 끌어오면서 동시에 내 커스텀 함수를 호출하는 게 가능해졌습니다. 그런데 thought_signature라는 필드 하나를 빠뜨리면 요청 즉시 400 에러가 납니다. 대부분의 개발자가 이걸 모르고 쓰다가 막힙니다.

3월 18일
공식 출시일
Gemini 3
지원 모델
400 에러
필드 누락 시

이 기능이 나오기 전, 개발자들이 겪던 문제

Gemini API로 에이전트를 만들 때 가장 불편했던 게 하나 있습니다. Google Search 같은 내장 도구와 내가 직접 만든 커스텀 함수를 같은 요청 안에 넣을 수 없었다는 점입니다. 공식 토론 포럼에는 “왜 OpenAI는 되는데 Gemini는 안 되냐”는 글이 꾸준히 올라왔습니다.

결과적으로 개발자들은 두 가지 방법 중 하나를 택했습니다. 첫 번째는 LangGraph 같은 오케스트레이션 프레임워크를 얹어서 내장 도구와 커스텀 함수를 단계별로 나눠 실행하는 방식. 두 번째는 그냥 내장 도구를 포기하고 커스텀 함수만 쓰는 방식입니다. 둘 다 불필요한 코드가 늘어나고, 단계 사이의 컨텍스트가 단절됩니다.

이 근본 문제를 Google이 2026년 3월 18일 공식 API 업데이트로 해결했습니다. 출처: Gemini API 출시 노트, 2026.03.18

Gemini API 도구 조합이란 정확히 무엇인가

Gemini API 도구 조합(Tool Combination)은 단일 API 요청에서 내장 도구(Google Search, Google Maps, URL Context, File Search, Code Execution)와 개발자가 선언한 커스텀 함수를 함께 실행할 수 있는 기능입니다. 출처: Gemini API 공식 가이드 — Combine built-in tools and function calling, 2026.03.18

핵심 매커니즘은 도구 컨텍스트 순환(Tool Context Circulation)입니다. 내장 도구의 실행 결과를 암호화된 형태로 모델의 컨텍스트에 보존하고, 다음 단계의 커스텀 함수가 그 결과를 참조할 수 있게 합니다. 예를 들어 Google Search로 최신 날씨 데이터를 가져온 뒤, 그 결과를 바탕으로 내 예약 함수가 자동으로 실행되는 흐름이 가능해집니다.

💡 공식 발표문과 실제 동작 방식을 함께 보면 이런 차이가 보입니다

발표문에서는 “에이전트 복잡성 감소”를 강조하는데, 실제로는 줄어드는 것이 아니라 복잡성의 위치가 바뀌는 겁니다. 오케스트레이션 코드 대신 thought_signature 관리 로직이 들어옵니다. 간단해지는 것과 다른 이야기입니다.

지원 모델은 gemini-3-flash-previewgemini-3-pro-preview이며, Gemini 2.5 계열은 지원하지 않습니다.

직접 써보니 이렇게 돌아갑니다 — 흐름 분해

실제 요청 흐름을 공식 가이드의 예시로 분해하면 이렇습니다. 질문은 “미국 최북단 도시가 어딘지 알아보고, 거기 날씨는 어때요?”입니다. Google Search(내장)와 getWeather(커스텀)를 동시에 쓰는 케이스입니다.

Turn 1 — 첫 번째 요청

config=types.GenerateContentConfig(
tools=[
types.Tool(
google_search=types.ToolGoogleSearch(),   # 내장 도구
function_declarations=[getWeather]         # 커스텀 함수
),
],
include_server_side_tool_invocations=True       # 이 플래그가 핵심
)

include_server_side_tool_invocations=True를 설정하지 않으면 도구 조합 기능 자체가 동작하지 않습니다. 플래그 하나가 전체 기능의 스위치 역할을 합니다.

API가 돌아오는 응답에는 세 가지 파트가 섞여 있습니다. toolCall + toolResponse(Google Search 실행 결과), functionCall(커스텀 함수 호출 요청), 그리고 암호화된 thoughtSignature입니다. 이 모든 파트를 Turn 2 요청에 그대로 실어서 보내야 합니다.

💡 API 응답 구조를 실제로 출력해보면 처음엔 당황스럽습니다

하나의 응답에 toolCall, toolResponse, functionCall, thoughtSignature가 모두 들어 있습니다. 기존 함수 호출에서는 functionCall 하나만 처리하면 됐는데, 여기서는 파트 타입을 먼저 구분해서 처리해야 합니다.

thought_signature를 빠뜨리면 생기는 일

여기서부터가 핵심입니다. 기존에 Gemini 2.5 계열로 함수 호출 코드를 짜본 분이라면, thought_signature를 반환하지 않아도 그냥 경고 없이 잘 동작했을 겁니다. Gemini 2.5에서는 선택 사항이었기 때문입니다.

Gemini 3 계열은 다릅니다. 공식 문서에 딱 이렇게 나옵니다. “When using Gemini 3 models, you must pass back thought signatures during function calling, otherwise you will get a validation error (4xx status code).” (출처: Thought Signatures 공식 문서, 2026.02.26 기준)

⚠️ 400 에러 발생 패턴

에러 메시지 형태: "Function call FC1 in the 1. content block is missing a thought_signature."
현재 턴의 functionCall 파트에 thoughtSignature가 없을 때 즉시 발생합니다. 이전 턴 기록은 검증하지 않습니다.

병렬 함수 호출에서는 첫 번째 functionCall 파트에만 thought_signature가 붙습니다. 두 번째 이후 병렬 함수에는 없습니다. 여기서 헷갈려서 “두 번째에도 넣어야 하나?”라는 고민을 하는 경우가 많은데, 넣지 않아도 됩니다.

단, 다음 턴으로 히스토리를 넘길 때는 첫 번째 functionCall과 그 thought_signature를 세트로 묶어서 그대로 돌려보내야 합니다. 응답을 파싱하면서 thought_signature만 빼고 저장하는 실수가 생기면 다음 단계에서 바로 막힙니다.

토큰 요금이 예상보다 늘어나는 이유

이 기능을 쓰면서 토큰 카운트가 기대보다 높게 나와서 당황하는 경우가 있습니다. 이유가 있습니다. 공식 문서에 이렇게 나와 있습니다. “toolCall and toolResponse parts in requests are counted towards prompt_token_count.” (출처: Gemini API Tool Combination 공식 가이드, 2026.03.18)

쉽게 말하면, 내장 도구의 실행 결과(toolCall + toolResponse)가 다음 요청의 입력 토큰으로 잡힌다는 뜻입니다. 다단계 에이전트를 짤수록 누적됩니다.

구성 요소 요금 처리 비고
toolCall / toolResponse 입력 토큰으로 과금 응답에는 미포함
Google Search 쿼리 쿼리당 별도 과금 월 5,000건 무료, 이후 $14/1,000건
functionCall / functionResponse 일반 토큰 과금 기존 함수 호출과 동일
thought_signature 토큰 추가 없음 암호화된 컨텍스트 필드

Google Search 툴은 예외적으로 토큰 이중 청구 없이 쿼리 레벨 요금제를 적용합니다. 단, “하나의 요청이 여러 검색 쿼리를 발생시킬 수 있다”는 점은 공식 문서에도 명시돼 있습니다. 복잡한 질문 하나에 내부적으로 검색이 3~4번 일어날 수 있고, 그 각각에 요금이 붙습니다.

이 기능이 작동하지 않는 조건 정리

솔직히 말하면, “드디어 내장 도구와 커스텀 함수를 같이 쓸 수 있다”는 것만 보고 바로 코드에 적용하면 막히는 경우가 꽤 됩니다. 공식 문서에 Limitations(제한 사항) 항목이 따로 있습니다. 이걸 먼저 보고 시작해야 합니다.

💡 발표 내용과 실제 제약을 나란히 놓고 보니 이 부분이 보였습니다

발표는 “자유롭게 조합”을 강조하지만, 실제로 include_server_side_tool_invocations를 켜면 AUTO 모드가 막히고 VALIDATED 모드로만 동작합니다. 모델이 알아서 도구를 선택하는 방식이 제한되는 트레이드오프가 있습니다.

  • Gemini 2.5 계열에서는 작동하지 않습니다. 오직 Gemini 3 모델(gemini-3-flash-preview, gemini-3-pro-preview)만 지원합니다.
  • include_server_side_tool_invocations=True를 설정하면 AUTO 모드가 비활성화됩니다. 공식 문서에 “Default to VALIDATED mode (AUTO mode is not supported)”로 명시돼 있습니다.
  • system_instruction에 날짜·위치 정보가 있으면 충돌할 수 있습니다. Google Search는 현재 시각과 위치를 자동으로 참조하는데, 시스템 지시문에 다른 날짜나 위치를 적으면 도구 조합 기능이 예상대로 동작하지 않을 수 있습니다.
  • Computer Use는 이 기능의 영향을 받지 않습니다. Computer Use는 클라이언트 사이드 도구이며, 자체 컨텍스트 순환 방식을 씁니다.
  • 기존에 gemini-3-flash-preview로 fileSearch + functionDeclarations를 함께 쓰던 코드는 2026년 2월 17일 이전에 오류를 겪었을 수 있습니다. 당시 공식 포럼에도 “지난주엔 됐는데 갑자기 안 된다”는 글이 올라온 적 있습니다. 지금은 공식 지원이 되었습니다.

주관적으로 보면, 이 기능의 가장 큰 실용적 가치는 “에이전트 파이프라인을 단순화”하는 게 아니라, 기존에 별도 스텝으로 나눠야 했던 것을 단일 컨텍스트 내에서 처리해서 중간 결과의 유실을 막는 겁니다. 에이전트 안정성 문제에 더 직접적으로 기여합니다.

자주 묻는 질문 Q&A

Q1. Gemini 2.5 Pro로도 도구 조합이 되나요?

안 됩니다. 도구 조합과 도구 컨텍스트 순환은 Gemini 3 계열(gemini-3-flash-preview, gemini-3-pro-preview)에서만 작동합니다. 2026년 3월 18일 기준, Gemini 2.5 계열에는 아직 지원이 추가되지 않았습니다. (출처: Gemini API 공식 가이드, 2026.03.18)

Q2. thought_signature 없이 Gemini 3 모델로 함수 호출을 하면 무조건 에러가 나나요?

Gemini 3에서 함수 호출(functionCall) 파트가 포함된 턴에서는 thought_signature가 필수입니다. 빠뜨리면 400 에러가 납니다. 단, 함수 호출이 없는 일반 텍스트 응답의 경우 thought_signature를 반환하는 것은 권장이지만 필수는 아닙니다. (출처: Thought Signatures 공식 문서, 2026.02.26)

Q3. Google Search 내장 도구를 쓰면 비용이 얼마나 나오나요?

월 5,000건의 프롬프트까지는 무료이고, 이후에는 1,000 검색 쿼리당 $14가 과금됩니다. 주의할 점은 단일 프롬프트가 내부적으로 여러 쿼리를 발생시킬 수 있다는 것입니다. 각 쿼리마다 따로 요금이 붙습니다. (출처: Gemini API Pricing 페이지, 2026.03 기준)

Q4. 병렬 함수 호출을 할 때 thought_signature는 어디에 붙나요?

병렬로 두 개의 함수가 호출될 때 thought_signature는 첫 번째 functionCall 파트에만 붙습니다. 두 번째 functionCall에는 없습니다. 히스토리를 다음 턴에 넘길 때도 이 구조를 그대로 유지해야 합니다. (출처: Thought Signatures 공식 문서, 2026.02.26)

Q5. 다른 모델에서 생성된 함수 호출 히스토리를 Gemini 3로 가져올 수 있나요?

이 경우 thought_signature가 없는 functionCall 파트가 포함됩니다. 공식 문서에는 이 상황을 위한 더미 시그니처 값을 제공하는 방법이 나와 있습니다. "context_engineering_is_the_way_to_go" 또는 "skip_thought_signature_validator"를 thought_signature 필드에 넣으면 검증을 건너뜁니다. (출처: Thought Signatures FAQ 섹션, 2026.02.26)

마치며 — 총평

Gemini API 도구 조합은 분명히 개발 생산성을 올려주는 변화입니다. 에이전트 코드에서 “내장 도구 파이프라인 → 컨텍스트 저장 → 커스텀 함수 파이프라인” 구조를 유지하던 분들은 코드를 크게 줄일 수 있습니다.

다만 기대했던 것과 달랐던 부분도 있습니다. “간단해진다”는 느낌보다는 “복잡성의 형태가 달라진다”는 게 더 맞습니다. thought_signature 관리, 파트 타입별 분기 처리, VALIDATED 모드 전환에 따른 함수 선택 로직 재점검이 필요합니다. Gemini 2.5 기반 코드를 그대로 올리면 400 에러를 만납니다.

기존에 내장 도구를 안 쓰고 커스텀 함수만 쓰던 구조라면, 아직 전환할 급한 이유가 없습니다. Google Search 실시간 그라운딩이 필요한 케이스에서 먼저 제한적으로 적용해 보고 확장하는 게 안전합니다.

본 포스팅 참고 자료

  1. Google AI for Developers — Combine built-in tools and function calling (Last updated: 2026-03-18) ai.google.dev/gemini-api/docs/tool-combination
  2. Google Blog — Gemini API tooling updates: context circulation, tool combos and more (2026.03.17) blog.google/…/gemini-api-tooling-updates/
  3. Google AI for Developers — Thought Signatures (Last updated: 2026-02-26) ai.google.dev/gemini-api/docs/thought-signatures
  4. Google AI for Developers — Gemini API Pricing (2026.03 기준) ai.google.dev/gemini-api/docs/pricing
  5. Google AI for Developers — Release Notes (2026.03.18 업데이트 확인) ai.google.dev/gemini-api/docs/changelog

본 포스팅은 2026년 3월 22일 기준 Gemini API 공식 문서를 바탕으로 작성됐습니다. 본 포스팅 작성 이후 서비스 정책·UI·기능이 변경될 수 있습니다. Gemini API는 프리뷰 모델 기반으로, 정식 출시 시 스펙이 달라질 수 있습니다. 요금은 공식 Pricing 페이지에서 최신 정보를 확인하시기 바랍니다.

댓글 남기기


최신 글


아이테크 어른경제에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기