חתימות של מחשבות

חתימות חשיבה הן ייצוגים מוצפנים של תהליך החשיבה הפנימי של המודל. חתימות החשיבה שומרות על מצב החשיבה הרציונלית של Gemini במהלך שיחות רב-שלביות עם כמה שלבים, וזה יכול להיות שימושי כשמשתמשים בקריאה להפעלת פונקציות. התגובות יכולות לכלול את השדה thought_signature בכל חלק של התוכן (למשל, text, ‏ functionCall).

מודלים של Gemini 3 מבצעים אימות קפדני יותר של חתימות מחשבה בהשוואה לגרסאות קודמות של Gemini, כי הם משפרים את ביצועי המודל בקריאות לפונקציות. כדי לוודא שהמודל שומר על הקשר מלא לאורך כמה תפניות בשיחה, צריך להחזיר את חתימות המחשבה מהתשובות הקודמות בבקשות הבאות, גם כשמשתמשים ברמות חשיבה של MINIMAL. אם חתימת החשיבה הנדרשת לא מוחזרת כשמשתמשים במודלים של Gemini 3, המודל יחזיר שגיאת 400.

מודל Gemini 3 Pro Image לא מבצע את האימות הזה, אבל כדי לוודא שהמודל שומר על הקשר מלא לאורך כמה תפניות בשיחה, אתם עדיין צריכים להחזיר את חתימות המחשבה מהתשובות הקודמות בבקשות הבאות. ‫Gemini 3 Pro Image לא מחזיר שגיאת 400 אם לא מוחזרת חתימת חשיבה. במאמר דוגמה לעריכת תמונות בכמה שלבים באמצעות חתימות חשיבה יש דוגמאות קוד שקשורות לעריכת תמונות בכמה שלבים באמצעות Gemini 3 Pro Image.

אם אתם משתמשים ב-Google Gen AI SDK הרשמי של Google (ב-Python, ב-Node.js, ב-Go או ב-Java) ובתכונות הרגילות של היסטוריית הצ'אט, או מוסיפים את התשובה המלאה של המודל להיסטוריה, חתימות החשיבה מטופלות באופן אוטומטי.

למה הם חשובים?

כשמודל חושב קורא לכלי חיצוני, הוא משהה את תהליך החשיבה הרציונלית הפנימי שלו. חתימת המחשבה פועלת כמו "מצב שמירה", ומאפשרת למודל להמשיך את שרשרת החשיבה שלו בצורה חלקה אחרי שאתם מספקים את תוצאת הפונקציה. בלי חתימות מחשבה, המודל "שוכח" את שלבי החשיבה הספציפיים שלו במהלך שלב ההפעלה של הכלי. העברת החתימה בחזרה מבטיחה:

  • רציפות ההקשר: המודל שומר את שלבי החשיבה הרציונלית שהצדיקו את השימוש בכלי, ויכול לבדוק אותם.
  • חשיבה מורכבת: מאפשרת לבצע משימות עם כמה שלבים, שבהן הפלט של כלי אחד משמש כבסיס לחשיבה של הכלי הבא.

שימור תהליכי חשיבה

ב-Gemini 3.5 Flash ובמודלים חדשים יותר, המחשבות מסבבים קודמים נשמרות כברירת מחדל. השירות שומר את היסטוריית המחשבות בהקשר של השיחה לפני שהוא מעביר אותה למודל.

כששולחים את היסטוריית השיחה, חשוב לשמור על עקביות עם החלקים הקודמים: או שכוללים את ההקשר המלא (שלבים בתהליך החשיבה, בקשות להפעלת פונקציות ותשובות) או שמשמיטים אותו לגמרי. אם תספקו הקשר חלקי, יכול להיות שהביצועים של המודל יהיו פחות טובים.

חתימות מחשבה ממודלים אחרים

מודלים של Flash-Lite לא יכולים לקרוא מחשבות שנוצרו על ידי מודלים שהם לא Flash-Lite. אם בקשה למודל Flash-Lite כוללת חתימות מחשבה שנוצרו על ידי מודל שאינו Flash-Lite, הבקשה לא תיכשל. במקום זאת, השירות משמיט את המחשבות האלה מההקשר של המודל. לדוגמה, זה קורה כששולחים בקשה למודל Flash-Lite עם היסטוריה ממודל Gemini Flash או Pro.

פניות ושלבים

תזרים שיחה רב-שלבי עם מודל שפה גדול (LLM) שמשתמש בקריאה לפונקציה (FC) ובתשובות לפונקציה (FR) כדי ליצור תשובה סופית. התהליך מחולק לשני שלבים: שלב 1 מורכב משלושה שלבים. שלב 1: הנחיה של המשתמש מובילה למודל FC1. שלב 2: המודל מקבל את FR1, שמוביל למודל FC2. שלב 3: המודל מקבל את FR2, שמוביל לפלט הסופי של טקסט המודל עבור תור 1. תור 2 מתחיל עם הנחיית משתמש חדשה, תוך שימוש בהקשר המלא של תור 1 כדי ליצור את פלט הטקסט הסופי של המודל לתור 2.
תהליך שיחה רב-שלבי עם קריאות להפעלת פונקציות ותגובות.

בהקשר של קריאה להפעלת פונקציות, חשוב להבין את ההבדל בין תורות לשלבים:

  • תור מייצג חילופי דברים מלאים בשיחה, שמתחילים בהנחיה של המשתמש ומסתיימים כשהמודל מספק תשובה סופית להנחיה הזו, שלא כוללת קריאה לפונקציה.
  • שלב מתרחש במהלך סבב שיחה יחיד, כשהמודל מפעיל פונקציה וצריך תשובה מהפונקציה כדי להמשיך בתהליך הסקת המסקנות. כמו שמוצג בדיאגרמה, סבב אחד יכול לכלול כמה שלבים אם המודל צריך לקרוא לכמה פונקציות ברצף כדי למלא את הבקשה של המשתמש.

איך משתמשים בחתימות מחשבה

הדרך הכי פשוטה לטפל בחתימות של מחשבות היא לכלול את כל ה-Part מכל ההודעות הקודמות בהיסטוריית השיחה כששולחים בקשה חדשה, בדיוק כמו שהמודל החזיר אותן.

אם אתם לא משתמשים באחת מערכות ה-Google Gen AI SDK, או אם אתם צריכים לשנות או לקצר את היסטוריית השיחות, אתם צריכים לוודא שחתימות המחשבה נשמרות ונשלחות בחזרה למודל.

כשמשתמשים ב-Google Gen AI SDK (מומלץ)

כשמשתמשים בתכונות של היסטוריית הצ'אט בערכות ה-SDK או מוסיפים את האובייקט content של המודל מהתשובה הקודמת ל-contents של הבקשה הבאה, החתימות מטופלות באופן אוטומטי.

בדוגמה הבאה של Python מוצג טיפול אוטומטי:

from google import genai
from google.genai.types import Content, FunctionDeclaration, GenerateContentConfig, Part, ThinkingConfig, Tool

client = genai.Client()

# 1. Define your tool
get_weather_declaration = FunctionDeclaration(
   name="get_weather",
   description="Gets the current weather temperature for a given location.",
   parameters={
       "type": "object",
       "properties": {"location": {"type": "string"}},
       "required": ["location"],
   },
)
get_weather_tool = Tool(function_declarations=[get_weather_declaration])

# 2. Send a message that triggers the tool
prompt = "What's the weather like in London?"
response = client.models.generate_content(
   model="gemini-3.5-flash",
   contents=prompt,
   config=GenerateContentConfig(
       tools=[get_weather_tool],
       thinking_config=ThinkingConfig(include_thoughts=True)
   ),
)

# 3. Handle the function call
function_call = response.function_calls[0]
location = function_call.args["location"]
print(f"Model wants to call: {function_call.name}")

# Execute your tool (for example, call an API)
# (This is a mock response for the example)
print(f"Calling external tool for: {location}")
function_response_data = {
   "location": location,
   "temperature": "30C",
}

# 4. Send the tool's result back
# Append this turn's messages to history for a final response.
# The `content` object automatically attaches the required thought_signature behind the scenes.
history = [
   Content(role="user", parts=[Part(text=prompt)]),
   response.candidates[0].content, # Signature preserved here
   Content(
     role="tool",
     parts=[
         Part.from_function_response(
             name=function_call.name,
             response=function_response_data,
         )
     ],
   )
]

response_2 = client.models.generate_content(
   model="gemini-3.5-flash",
   contents=history,
   config=GenerateContentConfig(
       tools=[get_weather_tool],
       thinking_config=ThinkingConfig(include_thoughts=True)
   ),
)

# 5. Get the final, natural-language answer
print(f"\nFinal model response: {response_2.text}")

כשמשתמשים ב-REST או בטיפול ידני

אם אתם יוצרים אינטראקציה ישירות עם ה-API, אתם צריכים להטמיע טיפול בחתימות על סמך הכללים הבאים ל-Gemini 3 Pro:

  • קריאה להפעלת פונקציות:
    • אם התשובה של המודל מכילה חלק functionCall אחד או יותר, נדרש thought_signature כדי שהעיבוד יתבצע בצורה נכונה.
    • במקרים של קריאות מקבילות לפונקציות בתשובה אחת, רק החלק הראשון של functionCall יכיל את thought_signature.
    • במקרים של קריאות לפונקציות עוקבות בכמה שלבים בתור, כל חלק functionCall יכיל thought_signature.
    • כלל: כשמנסחים את הבקשה הבאה, צריך לכלול את part שמכיל את functionCall ואת thought_signature שלו בדיוק כפי שהוחזר על ידי המודל. בשיחות רציפות (רב-שלביות) עם פונקציות, האימות מתבצע בכל השלבים בתור הנוכחי, והשמטה של thought_signature חובה בחלק functionCall הראשון בכל שלב בתור הנוכחי מובילה לשגיאה 400. כל סבב מתחיל בהודעת המשתמש האחרונה שהיא לא functionResponse.
    • אם המודל מחזיר קריאות מקבילות לפונקציות (לדוגמה, FC1+signature, FC2), התשובה צריכה לכלול את כל הקריאות לפונקציות ואחריהן את כל התשובות לפונקציות (FC1+signature, FC2, FR1, FR2). אם התשובות משולבות (FC1+signature, FR1, FC2, FR2), תתקבל שגיאה 400.
    • במקרים נדירים, צריך לספק חלקי functionCall שלא נוצרו על ידי ה-API, ולכן אין להם חתימת מחשבה משויכת (לדוגמה, כשמעבירים היסטוריה ממודל שלא כולל חתימות מחשבה). אפשר להגדיר את thought_signature ל-skip_thought_signature_validator, אבל זה צריך להיות המוצא האחרון כי זה ישפיע לרעה על ביצועי המודל.
  • ללא קריאה להפעלת פונקציות:
    • אם התשובה של המודל לא מכילה functionCall, יכול להיות שהיא תכלול thought_signature בחלק part האחרון של התשובה (לדוגמה, החלק האחרון text).
    • כלל: כדי לקבל את הביצועים הטובים ביותר, מומלץ לכלול את החתימה הזו בבקשה הבאה, אבל אם לא תכללו אותה לא תהיה שגיאה. בזמן סטרימינג, יכול להיות שהחתימה הזו תוחזר בחלק עם תוכן טקסט ריק, אז חשוב לנתח את כל החלקים עד שהמודל יחזיר את finish_reason.

כדי לשמור על ההקשר של המודל, חשוב לפעול לפי הכללים הבאים:

  • תמיד שולחים את thought_signature בחזרה למודל בתוך Part המקורי.
  • אל תמזגו Part שמכיל חתימה עם Part שלא מכיל חתימה. זה פוגע בהקשר של המיקום של המחשבה.
  • אל תשלבו בין שני Parts שמכילים חתימות, כי אי אפשר למזג את מחרוזות החתימות.

דוגמה לשרשרת קריאות להפעלת פונקציות

בדוגמה הבאה מוצגת קריאה להפעלת פונקציות בכמה שלבים, שבה המשתמש מבקש "בדוק את סטטוס הטיסה של AA100 והזמן מונית אם יש עיכוב", מה שדורש כמה משימות.

REST

בדוגמה הבאה מוסבר איך לטפל בחתימות של תהליכי חשיבה בכמה שלבים בתהליך עבודה של שרשרת קריאות להפעלת פונקציות באמצעות ה-API בארכיטקטורת REST.

תור 1, שלב 1 (בקשת המשתמש)
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
        }
      ]
    }
  ],
  "tools": [
    {
      "functionDeclarations": [
        {
          "name": "check_flight",
          "description": "Gets the current status of a flight",
          "parameters": {
            "type": "object",
            "properties": {
              "flight": {
                "type": "string",
                "description": "The flight number to check"
              }
            },
            "required": [
              "flight"
            ]
          }
        },
        {
          "name": "book_taxi",
          "description": "Book a taxi",
          "parameters": {
            "type": "object",
            "properties": {
              "time": {
                "type": "string",
                "description": "time to book the taxi"
              }
            },
            "required": [
              "time"
            ]
          }
        }
      ]
    }
  ]
}
תור 1, שלב 1 (תשובה מהמודל)
{
"content": {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "check_flight",
              "args": {
                "flight": "AA100"
              }
            },
            "thoughtSignature": "<SIGNATURE_A>"
          }
        ]
  }
}
סבב 1, שלב 2 (תגובת המשתמש – שליחת פלט של כלים)

מכיוון שהתור הזה של המשתמש מכיל רק functionResponse (אין טקסט חדש), אנחנו עדיין בתור 1. צריך לשמור את <SIGNATURE_A>.

{
      "role": "user",
      "parts": [
        {
          "text": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
        }
      ]
    },
    {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "check_flight",
              "args": {
                "flight": "AA100"
              }
            },
            "thoughtSignature": "<SIGNATURE_A>"
          }
        ]
      },
      {
        "role": "user",
        "parts": [
          {
            "functionResponse": {
              "name": "check_flight",
              "response": {
                "status": "delayed",
                "departure_time": "12 PM"
                }
              }
            }
        ]
}
סבב 1, שלב 2 (תשובה מהמודל)

עכשיו המודל מחליט להזמין מונית על סמך הפלט הקודם של הכלי.

{
      "content": {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "book_taxi",
              "args": {
                "time": "10 AM"
              }
            },
            "thoughtSignature": "<SIGNATURE_B>"
          }
        ]
      }
}
תור 1, שלב 3 (תגובת המשתמש – שליחת פלט הכלי)

כדי לשלוח את אישור הזמנת המונית, צריך לכלול חתימות לכל הקריאות לפונקציות בלולאה הזו (<SIGNATURE_A> ו-<SIGNATURE_B>).

{
      "role": "user",
      "parts": [
        {
          "text": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
        }
      ]
    },
    {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "check_flight",
              "args": {
                "flight": "AA100"
              }
            },
            "thoughtSignature": "<SIGNATURE_A>"
          }
        ]
      },
      {
        "role": "user",
        "parts": [
          {
            "functionResponse": {
              "name": "check_flight",
              "response": {
                "status": "delayed",
                "departure_time": "12 PM"
              }
              }
            }
        ]
      },
      {
        "role": "model",
        "parts": [
          {
            "functionCall": {
              "name": "book_taxi",
              "args": {
                "time": "10 AM"
              }
            },
            "thoughtSignature": "<SIGNATURE_B>"
          }
        ]
      },
      {
        "role": "user",
        "parts": [
          {
            "functionResponse": {
              "name": "book_taxi",
              "response": {
                "booking_status": "success"
              }
              }
            }
        ]
    }
}

השלמות צ'אט

הדוגמה הבאה ממחישה איך לטפל בחתימות של תהליכי חשיבה בכמה שלבים בתהליך עבודה של שרשרת קריאות להפעלת פונקציות באמצעות Chat Completions API.

תור 1, שלב 1 (בקשת המשתמש)
{
  "model": "google/gemini-3.1-pro-preview",
  "messages": [
    {
      "role": "user",
      "content": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
    }
  ],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "check_flight",
        "description": "Gets the current status of a flight",
        "parameters": {
          "type": "object",
          "properties": {
            "flight": {
              "type": "string",
              "description": "The flight number to check."
            }
          },
          "required": [
            "flight"
          ]
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "book_taxi",
        "description": "Book a taxi",
        "parameters": {
          "type": "object",
          "properties": {
            "time": {
              "type": "string",
              "description": "time to book the taxi"
            }
          },
          "required": [
            "time"
          ]
        }
      }
    }
  ]
}
תור 1, שלב 1 (תשובה מהמודל)
{
      "role": "model",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<SIGNATURE_A>"
              }
            },
            "function": {
              "arguments": "{\"flight\":\"AA100\"}",
              "name": "check_flight"
            },
            "id": "function-call-1",
            "type": "function"
          }
        ]
    }
סבב 1, שלב 2 (תגובת המשתמש – שליחת פלט של כלים)

מכיוון שהתור הזה של המשתמש מכיל רק functionResponse (אין טקסט חדש), אנחנו עדיין בתור 1. צריך לשמור את <SIGNATURE_A>.

"messages": [
    {
      "role": "user",
      "content": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
    },
    {
      "role": "model",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<SIGNATURE_A>"
              }
            },
            "function": {
              "arguments": "{\"flight\":\"AA100\"}",
              "name": "check_flight"
            },
            "id": "function-call-1",
            "type": "function"
          }
        ]
    },
    {
      "role": "tool",
      "name": "check_flight",
      "tool_call_id": "function-call-1",
      "content": "{\"status\":\"delayed\",\"departure_time\":\"12 PM\"}"
    }
  ]
סבב 1, שלב 2 (תשובה מהמודל)

עכשיו המודל מחליט להזמין מונית על סמך הפלט הקודם של הכלי.

{
"role": "model",
"tool_calls": [
{
"extra_content": {
"google": {
"thought_signature": "<SIGNATURE_B>"
}
            },
            "function": {
              "arguments": "{\"time\":\"10 AM\"}",
              "name": "book_taxi"
            },
            "id": "function-call-2",
            "type": "function"
          }
       ]
}
תור 1, שלב 3 (תגובת המשתמש – שליחת פלט הכלי)

כדי לשלוח את אישור הזמנת המונית, צריך לכלול חתימות לכל בקשות להפעלת פונקציות בלולאה הזו (<SIGNATURE_A> ו-<SIGNATURE_B>).

"messages": [
    {
      "role": "user",
      "content": "Check flight status for AA100 and book a taxi 2 hours before if delayed."
    },
    {
      "role": "model",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<SIGNATURE_A>"
              }
            },
            "function": {
              "arguments": "{\"flight\":\"AA100\"}",
              "name": "check_flight"
            },
            "id": "function-call-1d6a1a61-6f4f-4029-80ce-61586bd86da5",
            "type": "function"
          }
        ]
    },
    {
      "role": "tool",
      "name": "check_flight",
      "tool_call_id": "function-call-1d6a1a61-6f4f-4029-80ce-61586bd86da5",
      "content": "{\"status\":\"delayed\",\"departure_time\":\"12 PM\"}"
    },
    {
      "role": "model",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<SIGNATURE_B>"
              }
            },
            "function": {
              "arguments": "{\"time\":\"10 AM\"}",
              "name": "book_taxi"
            },
            "id": "function-call-65b325ba-9b40-4003-9535-8c7137b35634",
            "type": "function"
          }
        ]
    },
    {
      "role": "tool",
      "name": "book_taxi",
      "tool_call_id": "function-call-65b325ba-9b40-4003-9535-8c7137b35634",
      "content": "{\"booking_status\":\"success\"}"
    }
  ]

דוגמה לקריאה להפעלת פונקציות במקביל

בדוגמה הבאה מוצגת קריאה להפעלת פונקציות במקביל, שבה המשתמש מבקש "Check weather in Paris and London".

REST

בדוגמה הבאה מוסבר איך לטפל בחתימות של שלבים בתהליך החשיבה בתהליך עבודה של קריאה להפעלת פונקציות במקביל באמצעות ה-API בארכיטקטורת REST.

תור 1, שלב 1 (בקשת משתמש)
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Check the weather in Paris and London."
        }
      ]
    }
  ],
  "tools": [
    {
      "functionDeclarations": [
        {
          "name": "get_current_temperature",
          "description": "Gets the current temperature for a given location.",
          "parameters": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "The city name, e.g. San Francisco"
              }
            },
            "required": [
              "location"
            ]
          }
        }
      ]
    }
  ]
}
תור 1, שלב 1 (תשובה מהמודל)
{
  "content": {
    "parts": [
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "location": "Paris"
          }
        },
        "thoughtSignature": "<SIGNATURE_A>"
      },
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "location": "London"
          }
        }
      }
    ]
  }
}
תור 1, שלב 2 (תגובת המשתמש – שליחת פלט של כלי)

צריך לשמור על <SIGNATURE_A> בחלק הראשון בדיוק כמו שהוא התקבל.

[
  {
    "role": "user",
    "parts": [
      {
        "text": "Check the weather in Paris and London."
      }
    ]
  },
  {
    "role": "model",
    "parts": [
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "city": "Paris"
          }
        },
        "thought_signature": "<SIGNATURE_A>"
      },
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "city": "London"
          }
        }
      }
    ]
  },
  {
    "role": "user",
    "parts": [
      {
        "functionResponse": {
          "name": "get_current_temperature",
          "response": {
            "temp": "15C"
          }
        }
      },
      {
        "functionResponse": {
        "functionResponse": {
          "name": "get_current_temperature",
          "response": {
            "temp": "12C"
          }
        }
      }
    ]
  }
]

השלמות צ'אט

בדוגמה הבאה מוסבר איך לטפל בחתימות של תהליכי חשיבה בתהליך עבודה של קריאה להפעלת פונקציות במקביל באמצעות Chat Completions API.

סבב 1, שלב 1 (בקשת המשתמש)
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Check the weather in Paris and London."
        }
      ]
    }
  ],
  "tools": [
    {
      "functionDeclarations": [
        {
          "name": "get_current_temperature",
          "description": "Gets the current temperature for a given location.",
          "parameters": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "The city name, e.g. San Francisco"
              }
            },
            "required": [
              "location"
            ]
          }
        }
      ]
    }
  ]
}
תור 1, שלב 1 (תשובה מהמודל)
{
"role": "assistant",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<SIGNATURE_A>"
              }
            },
            "function": {
              "arguments": "{\"location\":\"Paris\"}",
              "name": "get_current_temperature"
            },
            "id": "function-call-f3b9ecb3-d55f-4076-98c8-b13e9d1c0e01",
            "type": "function"
          },
          {
            "function": {
              "arguments": "{\"location\":\"London\"}",
              "name": "get_current_temperature"
            },
            "id": "function-call-335673ad-913e-42d1-bbf5-387c8ab80f44",
            "type": "function"
          }
        ]
}
תור 1, שלב 2 (תגובת המשתמש – שליחת פלט של כלי)

צריך לשמור על <SIGNATURE_A> בחלק הראשון בדיוק כמו שהוא התקבל.

"messages": [
    {
      "role": "user",
      "content": "Check the weather in Paris and London."
    },
    {
      "role": "assistant",
        "tool_calls": [
          {
            "extra_content": {
              "google": {
                "thought_signature": "<SIGNATURE_A>"
              }
            },
            "function": {
              "arguments": "{\"location\":\"Paris\"}",
              "name": "get_current_temperature"
            },
            "id": "function-call-f3b9ecb3-d55f-4076-98c8-b13e9d1c0e01",
            "type": "function"
          },
          {
            "function": {
              "arguments": "{\"location\":\"London\"}",
              "name": "get_current_temperature"
            },
            "id": "function-call-335673ad-913e-42d1-bbf5-387c8ab80f44",
            "type": "function"
          }
        ]
    },
    {
      "role":"tool",
      "name": "get_current_temperature",
      "tool_call_id": "function-call-f3b9ecb3-d55f-4076-98c8-b13e9d1c0e01",
      "content": "{\"temp\":\"15C\"}"
    },
    {
      "role":"tool",
      "name": "get_current_temperature",
      "tool_call_id": "function-call-335673ad-913e-42d1-bbf5-387c8ab80f44",
      "content": "{\"temp\":\"12C\"}"
    }
  ]

חתימות ב-functionCall שאינם Part

יכול להיות ש-Gemini יחזיר thought_signature גם ב-Part האחרון של התשובה, גם אם אין בקשה להפעלת פונקציה.

  • התנהגות: התוכן הסופי Part (text,‏ inlineData וכו') שהמודל מחזיר יכול להכיל thought_signature.
  • דרישה: מומלץ להחזיר את החתימה הזו כדי לוודא שהמודל שומר על חשיבה איכותית, במיוחד במקרים של מעקב אחרי הוראות מורכבות או תהליכי עבודה של Agentic Workflows.
  • אימות: ה-API לא אוכף אימות של חתימות בחלקים שהם לא functionCall. אם תשמיטו אותם, לא תקבלו הודעת שגיאה שמונעת את המשך הפעולה, אבל יכול להיות שהביצועים יהיו פחות טובים.

דוגמה לתשובה מהמודל עם חתימה בחלק של הטקסט:

בדוגמאות הבאות מוצגת תשובה של מודל שכוללת thought_signature ב-Part שאינו functionCall, ואיך לטפל בה בבקשה הבאה.

תור 1, שלב 1 (תשובה מהמודל)
{
  "role": "model",
  "parts": [
    {
      "text": "I need to calculate the risk. Let me think step-by-step...",
      "thought_signature": "<SIGNATURE_C>" // OPTIONAL (Recommended)
    }
  ]
}
סבב 2, שלב 1 (משתמש)
[
  { "role": "user", "parts": [{ "text": "What is the risk?" }] },
  {
    "role": "model",
    "parts": [
      {
        "text": "I need to calculate the risk. Let me think step-by-step...",
        // If you omit <SIGNATURE_C> here, no error will occur.
      }
    ]
  },
  { "role": "user", "parts": [{ "text": "Summarize it." }] }
]

דוגמה לעריכת תמונה רב-שלבית באמצעות חתימות מחשבה

בדוגמאות הבאות מוסבר איך לאחזר ולהעביר חתימות של תהליכי חשיבה במהלך יצירה ועריכה של תמונות בשיחה רב-שלבית באמצעות Gemini 3 Pro Image.

תור 1: קבלת התשובה ושמירת הנתונים שכוללים חתימות מחשבה

chat = client.chats.create(
   model="gemini-3-pro-image-preview",
   config=types.GenerateContentConfig(
       response_modalities=['TEXT', 'IMAGE']
   )
)
message = "Create an image of a clear perfume bottle sitting on a vanity."
response = chat.send_message(message)
data = b''
for part in response.candidates[0].content.parts:
   if part.text:
       display(Markdown(part.text))
   if part.inline_data:
       data = part.inline_data.data
       display(Image(data=data, width=500))

שלב 2: מעבירים את הנתונים שכוללים חתימות של מחשבות

response = chat.send_message(
   message=[
       types.Part.from_bytes(
           data=data,
           mime_type="image/png",
       ),
       "Make the perfume bottle purple and add a vase of hydrangeas next to the bottle.",
   ],
)
for part in response.candidates[0].content.parts:
   if part.text:
       display(Markdown(part.text))
   if part.inline_data:
       display(Image(data=part.inline_data.data, width=500))

המאמרים הבאים

סקירה כללית

מידע ולמידה על יכולות החשיבה של Gemini ואיך להגדיר את רמות החשיבה.

מדריך

שיטות ושיטות מומלצות להנדסת פרומפטים שמותאמות למודלים החושבים של Gemini.

מדריך

איך מאפשרים למודלים של Gemini להשתמש בכלים חיצוניים במהלך יצירת התשובות באמצעות קריאה לפונקציות.