ลายเซ็นความคิด

ลายเซ็นความคิดคือการแสดงผลที่เข้ารหัสของกระบวนการคิดภายในของโมเดล และใช้เพื่อรักษาบริบทการให้เหตุผลในการโต้ตอบหลายขั้นตอน เมื่อใช้โมเดลการคิด (เช่น Gemini 3 และ 2.5 Series) API อาจ แสดงผลฟิลด์ thoughtSignature ภายในส่วนเนื้อหา ของการตอบกลับ (เช่น ส่วน text หรือ functionCall)

โดยทั่วไป หากคุณได้รับลายเซ็นความคิดในการตอบกลับของโมเดล คุณควรส่งลายเซ็นความคิดกลับไปตามที่ได้รับเมื่อส่งประวัติการสนทนาในรอบถัดไป เมื่อใช้โมเดล Gemini 3 คุณต้องส่งลายเซ็นความคิดกลับไปในระหว่างการเรียกใช้ฟังก์ชัน ไม่เช่นนั้นคุณจะได้รับข้อผิดพลาดในการตรวจสอบ (รหัสสถานะ 4xx) ซึ่งรวมถึงเมื่อใช้การตั้งค่าminimal ระดับการคิดสำหรับ Gemini 3 Flash

วิธีการทำงาน

กราฟิกด้านล่างแสดงความหมายของ "รอบ" และ "ขั้นตอน" ที่เกี่ยวข้องกับ การเรียกใช้ฟังก์ชันใน Gemini API "รอบ" คือการแลกเปลี่ยนข้อมูลที่สมบูรณ์ครั้งเดียวในการสนทนาระหว่างผู้ใช้กับโมเดล "ขั้นตอน" คือการดำเนินการหรือการทำงานที่ละเอียดยิ่งขึ้นซึ่งโมเดลดำเนินการ โดยมักจะเป็นส่วนหนึ่งของกระบวนการที่ใหญ่ขึ้นเพื่อทำให้รอบสมบูรณ์

แผนภาพการเรียกใช้ฟังก์ชันและขั้นตอน

เอกสารนี้มุ่งเน้นที่การจัดการการเรียกใช้ฟังก์ชันสำหรับโมเดล Gemini 3 โปรดดูส่วน ลักษณะการทำงานของโมเดลเพื่อดูความแตกต่างกับ 2.5

Gemini 3 จะแสดงผลลายเซ็นความคิดสำหรับการตอบกลับของโมเดลทั้งหมด (การตอบกลับจาก API) ที่มีการเรียกใช้ฟังก์ชัน ลายเซ็นความคิดจะปรากฏในกรณีต่อไปนี้

  • เมื่อมีการเรียกใช้ฟังก์ชันแบบขนาน ส่วนการเรียกใช้ฟังก์ชันแรกที่การตอบกลับของโมเดลแสดงผลจะมี ลายเซ็นความคิด
  • เมื่อมีการเรียกใช้ฟังก์ชันแบบลำดับ (หลายขั้นตอน) การเรียกใช้ฟังก์ชันแต่ละรายการจะมีลายเซ็น และคุณต้องส่งลายเซ็นทั้งหมดกลับไป
  • การตอบกลับของโมเดลที่ไม่มีการเรียกใช้ฟังก์ชันจะแสดงผลลายเซ็นความคิดภายในส่วนสุดท้ายที่โมเดลแสดงผล

ตารางต่อไปนี้แสดงภาพการเรียกใช้ฟังก์ชันหลายขั้นตอน โดยรวมคำจำกัดความของรอบและขั้นตอนเข้ากับแนวคิดของลายเซ็นที่กล่าวถึงข้างต้น

รอบ

ขั้นตอน

คำขอของผู้ใช้

การตอบกลับของโมเดล

FunctionResponse

1

1

request1 = user_prompt FC1 + signature FR1

1

2

request2 = request1 + (FC1 + signature) + FR1 FC2 + signature FR2

1

3

request3 = request2 + (FC2 + signature) + FR2 text_output

(no FCs)

ไม่มี

ลายเซ็นในส่วนการเรียกใช้ฟังก์ชัน

เมื่อ Gemini สร้าง functionCall โมเดลจะใช้ thought_signature เพื่อประมวลผลเอาต์พุตของเครื่องมืออย่างถูกต้องในรอบถัดไป

  • ลักษณะการทำงาน:
    • การเรียกใช้ฟังก์ชันเดียว: ส่วน functionCall จะมี thought_signature
    • การเรียกใช้ฟังก์ชันแบบขนาน: หากโมเดลสร้างการเรียกใช้ฟังก์ชันแบบขนาน ในการตอบกลับ ระบบจะแนบ thought_signature เฉพาะกับ functionCall ส่วน ส่วน functionCall ที่ตามมาในการตอบกลับเดียวกันจะไม่มี ลายเซ็น
  • ข้อกำหนด: คุณต้อง แสดงผลลายเซ็นนี้ในส่วนที่ได้รับมาเป๊ะๆ เมื่อส่งประวัติการสนทนากลับไป
  • การตรวจสอบ: ระบบจะบังคับใช้การตรวจสอบอย่างเข้มงวดกับการเรียกใช้ฟังก์ชันทั้งหมดภายในรอบปัจจุบัน (เฉพาะรอบปัจจุบันเท่านั้นที่จำเป็น เราจะไม่ตรวจสอบรอบก่อนหน้า)
    • API จะย้อนกลับไปในประวัติ (ใหม่สุดไปเก่าสุด) เพื่อค้นหาข้อความผู้ใช้ ล่าสุดที่มีเนื้อหามาตรฐาน (เช่น text) ( ซึ่งจะเป็นจุดเริ่มต้นของรอบปัจจุบัน) ข้อความนี้จะbe เป็น functionResponse
    • ระบบจะพิจารณาว่ารอบ functionCall ของโมเดลทั้งหมด ที่เกิดขึ้นหลังจากข้อความผู้ใช้ที่เฉพาะเจาะจงนั้นเป็นส่วนหนึ่งของรอบ
    • ส่วน functionCall แรก ในแต่ละขั้นตอน ของรอบปัจจุบันต้อง มี thought_signature
    • หากคุณละเว้น thought_signature สำหรับส่วน functionCall แรกในขั้นตอนใดก็ตามของรอบปัจจุบัน คำขอจะล้มเหลวโดยมีข้อผิดพลาด 400
  • หากไม่แสดงผลลายเซ็นที่ถูกต้อง ระบบจะแสดงข้อผิดพลาดดังนี้
    • โมเดล Gemini 3: การไม่ใส่ลายเซ็นจะส่งผลให้เกิดข้อผิดพลาด 400 ข้อความจะมีรูปแบบดังนี้
      • การเรียกใช้ฟังก์ชัน <Function Call> ในบล็อกเนื้อหา <index of contents array> ไม่มี thought_signature เช่น การเรียกใช้ ฟังก์ชัน FC1 ในบล็อกเนื้อหา 1. ไม่มี thought_signature.

ตัวอย่างการเรียกใช้ฟังก์ชันแบบลำดับ

ส่วนนี้แสดงตัวอย่างการเรียกใช้ฟังก์ชันหลายรายการที่ผู้ใช้ถามคำถามที่ซับซ้อนซึ่งต้องใช้หลายงาน

ลองดูตัวอย่างการเรียกใช้ฟังก์ชันหลายรอบที่ผู้ใช้ถาม คำถามที่ซับซ้อนซึ่งต้องใช้หลายงาน: "Check flight status for AA100 and book a taxi if delayed"

รอบ

ขั้นตอน

คำขอของผู้ใช้

การตอบกลับของโมเดล

FunctionResponse

1

1

request1="Check flight status for AA100 and book a taxi 2 hours before if delayed." FC1 ("check_flight") + signature FR1

1

2

request2 = request1 + FC1 ("check_flight") + signature + FR1 FC2("book_taxi") + signature FR2

1

3

request3 = request2 + FC2 ("book_taxi") + signature + FR2 text_output

(no FCs)

None

โค้ดต่อไปนี้แสดงลำดับในตารางด้านบน

รอบที่ 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>" //Required and Validated
          }
        ]
      },
      {
        "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>" //Required and Validated
          }
        ]
      },
      {
        "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>" //Required and Validated
          }
        ]
      },
      {
        "role": "user",
        "parts": [
          {
            "functionResponse": {
              "name": "book_taxi",
              "response": {
                "booking_status": "success"
              }
              }
            }
        ]
    }
}

ตัวอย่างการเรียกใช้ฟังก์ชันแบบขนาน

ลองดูตัวอย่างการเรียกใช้ฟังก์ชันแบบขนานที่ผู้ใช้ถาม "Check weather in Paris and London" เพื่อดูว่าโมเดลจะตรวจสอบที่ใด

รอบ

ขั้นตอน

คำขอของผู้ใช้

การตอบกลับของโมเดล

FunctionResponse

1

1

request1="Check the weather in Paris and London"

FC1 ("Paris") + signature

FC2 ("London")

FR1

1

2

request 2 = request1 + FC1 ("Paris") + signature + FC2 ("London")

text_output

(no FCs)

ไม่มี

โค้ดต่อไปนี้แสดงลำดับในตารางด้านบน

รอบที่ 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>"// INCLUDED on First FC
      },
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "location": "London"
          }// NO signature on subsequent parallel FCs
        }
      }
    ]
  }
}

รอบที่ 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>" // MUST BE INCLUDED
      },
      {
        "functionCall": {
          "name": "get_current_temperature",
          "args": {
            "city": "London"
          }
        }
      } // NO SIGNATURE FIELD
    ]
  },
  {
    "role": "user",
    "parts": [
      {
        "functionResponse": {
          "name": "get_current_temperature",
          "response": {
            "temp": "15C"
          }
        }
      },
      {
        "functionResponse": {
          "name": "get_current_temperature",
          "response": {
            "temp": "12C"
          }
        }
      }
    ]
  }
]

ลายเซ็นในส่วนที่ไม่ใช่ functionCall

นอกจากนี้ Gemini ยังอาจแสดงผล thought_signatures ในส่วนสุดท้ายของการตอบกลับในส่วนที่ไม่ใช่การเรียกใช้ฟังก์ชัน

  • ลักษณะการทำงาน: ส่วนเนื้อหาสุดท้าย (text, inlineData…) ที่ โมเดลแสดงผลอาจมี thought_signature
  • คำแนะนำ: เราขอแนะนำ ให้แสดงผลลายเซ็นเหล่านี้เพื่อให้ โมเดลรักษาการให้เหตุผลคุณภาพสูงไว้ โดยเฉพาะอย่างยิ่งสำหรับการปฏิบัติตามคำแนะนำที่ซับซ้อน หรือเวิร์กโฟลว์ของเอเจนต์ที่จำลองขึ้น
  • การตรวจสอบ: API จะไม่ บังคับใช้การตรวจสอบอย่างเข้มงวด คุณจะไม่ได้รับข้อผิดพลาดที่บล็อกหากละเว้นลายเซ็นเหล่านี้ แม้ว่าประสิทธิภาพอาจลดลง

การให้เหตุผลตามบริบท/ข้อความ (ไม่มีการตรวจสอบ)

รอบที่ 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." }] }
]

ลายเซ็นเพื่อความเข้ากันได้กับ OpenAI

ตัวอย่างต่อไปนี้แสดงวิธีจัดการลายเซ็นความคิดสำหรับ Chat completion API โดยใช้ ความเข้ากันได้กับ OpenAI

ตัวอย่างการเรียกใช้ฟังก์ชันแบบลำดับ

นี่คือตัวอย่างการเรียกใช้ฟังก์ชันหลายรายการที่ผู้ใช้ถามคำถามที่ซับซ้อนซึ่งต้องใช้หลายงาน

ลองดูตัวอย่างการเรียกใช้ฟังก์ชันหลายรอบที่ผู้ใช้ถามว่า Check flight status for AA100 and book a taxi if delayed และคุณจะเห็นสิ่งที่ เกิดขึ้นเมื่อผู้ใช้ถามคำถามที่ซับซ้อนซึ่งต้องใช้หลายงาน

รอบ

ขั้นตอน

คำขอของผู้ใช้

การตอบกลับของโมเดล

FunctionResponse

1

1

request1 = "Check flight status for AA100 and book a taxi 2 hours before if delayed." FC1 ("check_flight") + signature FR1

1

2

request2 = request1 + FC1 ("check_flight") + signature + FR1 FC2("book_taxi") + signature FR2

1

3

request3 = request2 + FC2 ("book_taxi") + signature + FR2 text_output

(no FCs)

None

โค้ดต่อไปนี้แสดงลำดับที่กำหนด

รอบที่ 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>" //Required and Validated
              }
            },
            "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>" //Required and Validated
              }
            },
            "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>" //Required and Validated
              }
            },
            "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" และคุณจะเห็นว่าโมเดลจะตรวจสอบที่ใด

รอบ

ขั้นตอน

คำขอของผู้ใช้

การตอบกลับของโมเดล

FunctionResponse

1

1

request1="Check the weather in Paris and London" FC1 ("Paris") + signature

FC2 ("London")

FR1

1

2

request 2 = request1 + FC1 ("Paris") + signature + FC2 ("London") text_output

(no FCs)

None

โค้ดต่อไปนี้แสดงลำดับที่กำหนด

รอบที่ 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>" //Signature returned
              }
            },
            "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" // No signature on Parallel FC
          }
        ]
}

รอบที่ 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>" //Required
              }
            },
            "function": {
              "arguments": "{\"location\":\"Paris\"}",
              "name": "get_current_temperature"
            },
            "id": "function-call-f3b9ecb3-d55f-4076-98c8-b13e9d1c0e01",
            "type": "function"
          },
          {
            "function": { //No Signature
              "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\"}"
    }
  ]

คำถามที่พบบ่อย

  1. ฉันจะโอนประวัติจากโมเดลอื่นไปยัง Gemini 3 ที่มีส่วนการเรียกใช้ฟังก์ชันในรอบและขั้นตอนปัจจุบันได้อย่างไร ฉันต้องระบุส่วนการเรียกใช้ฟังก์ชัน ที่ไม่ได้สร้างโดย API จึงไม่มีลายเซ็นความคิดที่เชื่อมโยง ใช่ไหม

    แม้ว่าเราจะไม่แนะนำให้แทรกบล็อกการเรียกใช้ฟังก์ชันที่กำหนดเองลงในคำขอ แต่ในกรณีที่หลีกเลี่ยงไม่ได้ เช่น การให้ข้อมูลแก่โมเดลเกี่ยวกับการเรียกใช้ฟังก์ชันและการตอบกลับที่ไคลเอ็นต์ดำเนินการอย่างแน่นอน หรือการโอนการติดตามจากโมเดลอื่นที่ไม่มีลายเซ็นความคิด คุณสามารถตั้งค่าลายเซ็นจำลองต่อไปนี้เป็น "context_engineering_is_the_way_to_go" หรือ "skip_thought_signature_validator" ในฟิลด์ลายเซ็นความคิดเพื่อข้ามการตรวจสอบ

  2. ฉันส่งการเรียกใช้ฟังก์ชันและการตอบกลับแบบขนานที่สลับกันกลับไป แต่ API แสดงผล 400 ทำไมจึงเป็นเช่นนั้น

    เมื่อ API แสดงผลการเรียกใช้ฟังก์ชันแบบขนาน "FC1 + signature, FC2" การตอบกลับของผู้ใช้ที่คาดไว้คือ "FC1+ signature, FC2, FR1, FR2" หากคุณสลับการตอบกลับเป็น "FC1 + signature, FR1, FC2, FR2" API จะแสดงผลข้อผิดพลาด 400

  3. เมื่อสตรีมมิงและโมเดลไม่แสดงผลการเรียกใช้ฟังก์ชัน ฉันจะค้นหา ลายเซ็นความคิดไม่พบ

    ระหว่างการตอบกลับของโมเดลที่ไม่มี FC พร้อมคำขอสตรีมมิง โมเดลอาจแสดงผลลายเซ็นความคิดในส่วนที่มีส่วนเนื้อหาข้อความว่างเปล่า เราขอแนะนำให้แยกวิเคราะห์คำขอทั้งหมดจนกว่าโมเดลจะแสดงผล finish_reason

ลายเซ็นความคิดสำหรับโมเดลต่างๆ

โมเดล Gemini 3 และโมเดล Gemini 2.5 มีลักษณะการทำงานที่แตกต่างกันกับลายเซ็นความคิดในการเรียกใช้ฟังก์ชัน:

  • หากมีการเรียกใช้ฟังก์ชันในการตอบกลับ
    • Gemini 3 จะมีลายเซ็นในส่วนการเรียกใช้ฟังก์ชันแรกเสมอ คุณต้อง แสดงผลส่วนดังกล่าว
    • Gemini 2.5 จะมีลายเซ็นในส่วนแรก (ไม่ว่าจะเป็นประเภทใด) คุณจะเลือก แสดงผลส่วนดังกล่าวหรือไม่ก็ได้
  • หากไม่มีการเรียกใช้ฟังก์ชันในการตอบกลับ
    • Gemini 3 จะมีลายเซ็นในส่วนสุดท้ายหากโมเดลสร้างความคิด
    • Gemini 2.5 จะไม่มีลายเซ็นในส่วนใดเลย

ดูรายละเอียดการเปรียบเทียบเพิ่มเติมได้ที่หน้าการคิดเพิ่มเติม สำหรับโมเดลรูปภาพ Gemini 3 โปรดดูส่วนกระบวนการคิดของ คู่มือการสร้างรูปภาพ