توقيعات الأفكار

توقيعات التفكير هي تمثيلات مشفّرة لعملية التفكير الداخلية للنموذج، وتُستخدم للحفاظ على سياق الاستدلال في التفاعلات المتعدّدة الخطوات. عند استخدام نماذج التفكير (مثل سلسلة Gemini 4 و3 و2.5)، قد تعرض واجهة برمجة التطبيقات الحقل thoughtSignature ضمن أجزاء المحتوى في الردّ (مثل الأجزاء text أو functionCall).

كقاعدة عامة، إذا تلقّيت توقيعًا فكريًا في ردّ من النموذج، يجب إرساله مرة أخرى تمامًا كما تم تلقّيه عند إرسال سجلّ المحادثة في الدور التالي. عند استخدام نماذج Gemini 4 وGemini 3، يجب إعادة توقيعات الفكرة أثناء استدعاء الدالة، وإلا سيظهر لك خطأ في التحقّق من الصحة (رمز الحالة 4xx). ويشمل ذلك استخدام إعداد minimal مستوى التفكير في Gemini 3 Flash.

آلية العمل

يوضّح الرسم البياني أدناه معنى "الدور" و "الخطوة" في ما يتعلّق باستدعاء الدوال في Gemini API. "الدورة" هي تبادل واحد وكامل في محادثة بين مستخدم ونموذج. "الخطوة" هي إجراء أو عملية أكثر دقة ينفّذها النموذج، وغالبًا ما تكون جزءًا من عملية أكبر لإكمال دورة المحادثة.

مخطّط بياني يوضّح خطوات استدعاء الدالة

يركّز هذا المستند على كيفية التعامل مع ميزة "استدعاء الدوال" في نموذجَي Gemini 4 وGemini 3. راجِع قسم سلوك النموذج لمعرفة الاختلافات مع الإصدار 2.5.

يُرجع Gemini 4 وGemini 3 توقيعات التفكير لجميع ردود النماذج (الردود من واجهة برمجة التطبيقات) مع استدعاء دالة. تظهر التوقيعات في الحالات التالية:

  • عندما تكون هناك استدعاءات دوال متوازية، سيحتوي الجزء الأول من استدعاء الدالة الذي يعرضه ردّ النموذج على توقيع فكرة.
  • عندما تكون هناك استدعاءات دوال تسلسلية (متعددة الخطوات)، سيكون لكل استدعاء دالة توقيع، وعليك إعادة جميع التوقيعات.
  • ستعرض ردود النموذج التي لا تتضمّن استدعاء دالة توقيعًا فكريًا داخل الجزء الأخير الذي يعرضه النموذج.

يقدّم الجدول التالي عرضًا مرئيًا لاستدعاءات الدوال المتعدّدة الخطوات، ويجمع بين تعريفات الجولات والخطوات ومفهوم التوقيعات الموضّح أعلاه:

الاستدارة

Step

طلب المستخدم

ردّ النموذج

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 في الردّ نفسه أي توقيع.
  • شرط: يجب إرجاع هذا التوقيع في الجزء نفسه الذي تم استلامه فيه عند إعادة إرسال سجلّ المحادثات.
  • التحقّق من الصحة: يتم فرض التحقّق الصارم من الصحة على جميع استدعاءات الدوال ضمن الدور الحالي . (يجب فقط تقديم الدور الحالي، ولا نتحقّق من الأدوار السابقة)
    • تبحث واجهة برمجة التطبيقات في السجلّ (من الأحدث إلى الأقدم) للعثور على أحدث رسالة من المستخدم تحتوي على محتوى عادي (مثل text) ( والتي ستكون بداية الدور الحالي). لن يكون هذا be functionResponse.
    • جميع ردود النموذج functionCall التي تحدث بعد رسالة الاستخدام المحدّدة هذه تُعتبر جزءًا من الردّ.
    • يجب أن يتضمّن الجزء functionCall الأول في كل خطوة من الدور الحالي thought_signature.
    • إذا حذفت thought_signature للجزء الأول من functionCall في أي خطوة من الدور الحالي، سيتعذّر تنفيذ الطلب وسيظهر الخطأ 400.
  • في حال عدم عرض التواقيع الصحيحة، إليك كيفية ظهور الخطأ
    • نماذج Gemini 3: سيؤدي عدم تضمين التواقيع إلى ظهور الخطأ 400. سيكون الصياغة على النحو التالي:
      • يجب إضافة thought_signature إلى استدعاء الدالة <Function Call> في كتلة المحتوى <index of contents array>. على سبيل المثال، يجب إضافة thought_signature إلى استدعاء الدالة FC1 في مجموعة بيانات المحتوى 1..

مثال على استدعاء الدوال التسلسلي

يعرض هذا القسم مثالاً على عدة طلبات لتنفيذ وظائف حيث يطرح المستخدم سؤالاً معقّدًا يتطلّب تنفيذ مهام متعدّدة.

لنتناول مثالاً على استدعاء دالة متعددة الجولات حيث يطرح المستخدم سؤالاً معقدًا يتطلب مهام متعددة: "Check flight status for AA100 and book a taxi if delayed".

Turn

Step

طلب المستخدم

ردّ النموذج

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" لمعرفة أين يتحقّق النموذج من صحة البيانات.

Turn

Step

طلب المستخدم

ردّ النموذج

FunctionResponse

1

1

request1="Check the weather in Paris and London"

FC1 ("باريس") + التوقيع

‫FC2 ("لندن")

FR1

1

2

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

text_output

(بدون بطاقات ميزة)

بدون

يوضّح الرمز التالي التسلسل في الجدول أعلاه.

الجولة 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.
  • الاقتراح: يُنصح بإرجاع هذه التواقيع لضمان الحفاظ على جودة عالية في عملية الاستدلال التي يجريها النموذج، خاصةً في ما يتعلّق باتّباع التعليمات المعقّدة أو محاكاة سير العمل المستند إلى الوكيل.
  • التحقّق من الصحة: لا تفرض واجهة برمجة التطبيقات التحقّق من الصحة بشكل صارم. ولن يظهر لك خطأ حظر إذا لم تدرجها، ولكن قد ينخفض الأداء.

النص/الاستدلال في السياق (بدون تحقّق)

الردّ 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

توضّح الأمثلة التالية كيفية التعامل مع توقيعات الأفكار لواجهة برمجة تطبيقات لإكمال المحادثة باستخدام التوافق مع OpenAI.

مثال على استدعاء الدوال التسلسلي

هذا مثال على استدعاء دوال متعددة حيث يطرح المستخدم سؤالاً معقدًا يتطلب مهام متعددة.

لنتعرّف على مثال على عملية استدعاء دالة متعددة الأدوار حيث يطرح المستخدم السؤال Check flight status for AA100 and book a taxi if delayed، ويمكنك الاطّلاع على ما يحدث عندما يطرح المستخدم سؤالاً معقّدًا يتطلّب تنفيذ مهام متعددة.

Turn

Step

طلب المستخدم

ردّ النموذج

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-4-argon",
  "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" ويمكنك الاطّلاع على المكان الذي يجري فيه النموذج عملية التحقّق.

الاستدارة

Step

طلب المستخدم

ردّ النموذج

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 4 أو Gemini 3 مع تضمين جزء من استدعاء الدالة في الخطوة الحالية؟ هل أحتاج إلى تقديم أجزاء استدعاء الدوال التي لم يتم إنشاؤها بواسطة واجهة برمجة التطبيقات وبالتالي ليس لها توقيع فكري مرتبط بها؟

    مع أنّنا لا ننصح بشدة بإدخال حِزم استدعاء دالة مخصّصة في الطلب، يمكنك ضبط التوقيعات الوهمية التالية "context_engineering_is_the_way_to_go" أو "skip_thought_signature_validator" في حقل توقيع الفكرة لتخطّي عملية التحقّق في الحالات التي لا يمكن تجنُّب ذلك فيها، مثلاً عند تقديم معلومات للنموذج عن استدعاءات الدوال والردود التي نفّذها العميل بشكل حتمي، أو عند نقل عملية تتبُّع من نموذج مختلف لا يتضمّن توقيعات الأفكار.

  2. أرسلُ طلبات استدعاء متوازية للدوال وردودًا متداخلة، ويتلقّى واجهة برمجة التطبيقات الرمز 400. ما السبب؟

    عندما تعرض واجهة برمجة التطبيقات طلبات استدعاء دالة متوازية "FC1 + signature, FC2"، يكون ردّ المستخدم المتوقّع هو "FC1+ signature, FC2, FR1, FR2". إذا كانت البيانات متداخلة على النحو التالي: "FC1 + signature, FR1, FC2, FR2"، ستعرض واجهة برمجة التطبيقات الخطأ 400.

  3. عند البث وعدم عرض النموذج لاستدعاء دالة، لا يمكنني العثور على توقيع التفكير

    خلال ردّ النموذج الذي لا يحتوي على طلب بث مع FC، قد يعرض النموذج توقيع الفكرة في جزء يحتوي على جزء فارغ من محتوى النص. ننصحك بتحليل الطلب بأكمله إلى أن يعرض النموذج finish_reason.

التوقيعات الفكرية لنماذج مختلفة

تختلف طريقة تعامل نماذج Gemini 4 وGemini 3 وGemini 2.5 مع توقيعات التفكير في استدعاءات الدوال:

  • إذا كانت هناك طلبات استدعاء دوال في الرد،
    • ستتضمّن Gemini 4 وGemini 3 دائمًا التوقيع في الجزء الأول من استدعاء الدالة. ومن الإلزامي إرجاع هذا الجزء.
    • سيحتوي Gemini 2.5 على التوقيع في الجزء الأول (بغض النظر عن النوع). وإرجاع هذا الجزء اختياري.
  • إذا لم يتضمّن الردّ أي استدعاءات دوال،
    • سيتم تضمين التوقيع في الجزء الأخير من الردود التي ينشئها نموذج Gemini 4 وGemini 3 إذا كان الرد يتضمّن فكرة.
    • لن يتضمّن Gemini 2.5 توقيعًا في أي جزء.

يمكنك الرجوع إلى صفحة Thinking لمزيد من التفاصيل حول المقارنة. بالنسبة إلى نماذج Gemini 3 Image، يُرجى الاطّلاع على قسم عملية التفكير في دليل إنشاء الصور.