|

تفسير thoughtSignature الخاص بـ APIYI Nano Banana 2: لماذا لا تظهر الصورة بعد فك تشفير base64؟

ملاحظة من المؤلف: تحليل معمق لجوهر حقل thoughtSignature في استجابة API لنموذج Nano Banana 2: إنه ليس صورة، بل توقيع تفكير مشفر. سنشرح بالتفصيل هيكل استجابة نمط التفكير (Thinking)، وكيفية التعامل معه بشكل صحيح، والأخطاء الشائعة التي يقع فيها المطورون.

يلاحظ العديد من المطورين عند استدعاء API الخاص بـ Nano Banana 2 لتوليد الصور، وجود حقل thoughtSignature في الاستجابة بجانب بيانات الصورة—وهو عبارة عن سلسلة طويلة مشفرة بـ base64، تبدو للوهلة الأولى كبيانات صورة. بعد محاولة فك تشفيره، ستكتشف أنه لا يمكن تحويله إلى صورة على الإطلاق، فما هو هذا الحقل؟ ستوضح هذه المقالة جوهر thoughtSignature، ولماذا ليس صورة، وكيفية التعامل معه بشكل صحيح في المحادثات متعددة الجولات.

القيمة الجوهرية: بعد قراءة هذا المقال، ستفهم المبادئ التقنية لـ thoughtSignature، وتتجنب الخطأ في التعامل معه كصورة، وتتقن طريقة تمرير التوقيع بشكل صحيح في المحادثات متعددة الجولات.

nano-banana-2-api-thoughtsignature-explained-thinking-mode-guide-ar 图示

النقاط الجوهرية حول thoughtSignature في واجهة برمجة تطبيقات Nano Banana 2

لنبدأ بالإجابة المباشرة على السؤال الأكثر شيوعاً: thoughtSignature ليست صورة، ولا يمكن فك تشفيرها لتصبح صورة؛ إنها توقيع مشفر لعملية تفكير النموذج.

النقطة الشرح ملاحظة للمطورين
الماهية بيانات ثنائية مشفرة بترميز base64 لا يمكن فك تشفيرها، تعديلها، أو تزويرها
المحتوى لقطة للحالة الداخلية لعملية استدلال النموذج غير شفافة تماماً للمطورين
الغرض الحفاظ على استمرارية الاستدلال في المحادثات متعددة الجولات يجب إعادتها كما هي في الطلب التالي
التنسيق تبدو كصورة base64 ولكنها ليست كذلك لا تحتوي على "بايتات سحرية" (magic bytes)، ولا يمكن التعرف عليها كأي تنسيق صور
الإلزامية يجب تمريرها في سيناريوهات استدعاء الأدوات (وإلا سيظهر خطأ 400) يمكن تجاهلها في سيناريوهات النصوص البحتة لكنها ستقلل الجودة

كيف يبدو thoughtSignature في استجابة Nano Banana 2 API؟

عندما تستدعي Nano Banana 2 لتوليد صورة، قد تحتوي مصفوفة parts في استجابة الـ API على عناصر متعددة. هيكل الاستجابة النموذجي يبدو كالتالي:

{
  "candidates": [{
    "content": {
      "role": "model",
      "parts": [
        {
          "text": "دعني أفكر في كيفية توليد هذه الصورة...",
          "thought": true
        },
        {
          "text": "",
          "thoughtSignature": "CpcHAdHtim9+q4rstcbvQC0ic4x1/vqQlCJ..."
        },
        {
          "inlineData": {
            "mime_type": "image/png",
            "data": "iVBORw0KGgoAAAANSUhEUg..."
          }
        }
      ]
    }
  }]
}

هنا يوجد ثلاثة أجزاء (part)، وهي:

  1. ملخص التفكير (thought: true): وصف نصي لعملية استدلال النموذج.
  2. توقيع التفكير (thoughtSignature): لقطة مشفرة لحالة الاستدلال.
  3. بيانات الصورة (inlineData): بيانات الصورة الفعلية بترميز base64.

تكمن المشكلة الرئيسية في أن الجزء الثاني والثالث يحتويان على بيانات بترميز base64. إذا لم يقم كود البرمجة الخاص بك بالتمييز بينهما بشكل صحيح، فسيقوم باعتبار thoughtSignature بيانات صورة ويحاول فك تشفيرها، ليكتشف في النهاية أنها لا تتحول إلى صورة أبداً.

nano-banana-2-api-thoughtsignature-explained-thinking-mode-guide-ar 图示

المبادئ التقنية لـ thoughtSignature في Nano Banana 2 API

بعد أن فهمنا أن thoughtSignature ليست صورة، دعونا نلقي نظرة على ماهيتها الحقيقية.

جوهر thoughtSignature

وفقاً لتعريف وثائق Google الرسمية:

thoughtSignature (سلسلة نصية، اختيارية): "توقيع غير شفاف للفكرة بحيث يمكن إعادة استخدامه في الطلبات اللاحقة. سلسلة نصية مشفرة بترميز base64."

ببساطة: thoughtSignature هي "لقطة ذاكرة" لعملية تفكير النموذج، يتم إرجاعها بعد توقيعها تشفيرياً بصيغة base64. وتكمن وظيفتها في تمكين النموذج من "تذكر" عملية الاستدلال السابقة في المحادثات متعددة الجولات، مما يحافظ على ترابط الأفكار.

أهم خصائصها:

  • غير شفافة (Opaque): لا يمكن للمطورين قراءة محتواها، ولا داعي للاهتمام بهيكلها الداخلي.
  • توقيع تشفيري: موقعة من قبل خوادم Google، ولا يمكن تزويرها—إرسال سلسلة base64 عشوائية سيؤدي إلى خطأ "توقيع غير صالح".
  • حالة (Stateful): تحتوي على سلسلة الاستدلال ونتائج الحسابات الوسيطة التي استخدمها النموذج عند توليد الإجابة الحالية.

الفرق بين thought و thoughtSignature

غالباً ما يتم الخلط بين هذين الحقلين، لكنهما مختلفان تماماً:

الحقل النوع المعنى قابلية القراءة الاستخدام
thought منطقي (boolean) يحدد ما إذا كان الجزء الحالي هو ملخص للتفكير مقروء (نص) عرض عملية استدلال النموذج
thoughtSignature سلسلة (base64) لقطة مشفرة لحالة الاستدلال غير مقروء (نص مشفر) تمرير حالة الاستدلال في المحادثات

thought هو ملخص الاستدلال الموجه للبشر، بينما thoughtSignature هي ذاكرة الاستدلال الموجهة للنموذج.

لماذا تحتاج Nano Banana 2 API إلى thoughtSignature؟

ينتمي Nano Banana 2 إلى سلسلة Gemini 3.1، ويدعم وضع التفكير (Thinking). يقوم النموذج بإجراء استدلال داخلي قبل توليد الصورة—مثل تحليل نية الموجه، وتخطيط التكوين، واختيار نظام الألوان، إلخ.

يتم ضغط وتشفير الحالة الكاملة لعملية الاستدلال هذه في thoughtSignature. عندما تقوم بتعديل صورة في محادثة متعددة الجولات (مثل "تغيير الخلفية إلى اللون الأزرق")، يحتاج النموذج إلى استعادة حالة الاستدلال السابقة ليفهم نية التعديل بدقة.

إذا لم تقم بإعادة إرسال thoughtSignature:

  • في سيناريوهات النصوص فقط: لن يظهر خطأ، لكن جودة الاستدلال والترابط ستنخفض.
  • في سيناريوهات استدعاء الأدوات/الوظائف: سيتم إرجاع خطأ HTTP 400 مباشرة.
  • في محادثات تعديل الصور: قد تفقد السياق، ولن تكون نتائج التعديل دقيقة.

🎯 نصيحة للمطورين: في أي سيناريو محادثة متعددة الجولات، يجب عليك الاحتفاظ بـ thoughtSignature وإعادة إرسالها بالكامل.
عند الاستدعاء عبر APIYI (apiyi.com)، تقوم المنصة تلقائياً بمعالجة تمرير التوقيع وتوافق الصيغ، دون الحاجة لإدارة ذلك يدوياً.


الطريقة الصحيحة للتعامل مع thoughtSignature في Nano Banana 2 API

مثال مبسط: استخراج الصورة والتمييز بينها وبين التوقيع بشكل صحيح

يوضح الكود التالي كيفية استخراج الصورة من استجابة Nano Banana 2 بشكل صحيح، مع حفظ thoughtSignature للاستخدام اللاحق:

from google import genai
from google.genai import types

client = genai.Client(api_key="YOUR_API_KEY")

response = client.models.generate_content(
    model="gemini-3.1-flash-image-preview",
    contents=["ارسم قطة بيضاء تحت شجرة كرز"],
    config=types.GenerateContentConfig(
        response_modalities=["TEXT", "IMAGE"],
        image_config=types.ImageConfig(image_size="2K"),
        thinking_config=types.ThinkingConfig(
            include_thoughts=True
        ),
    )
)

saved_signature = None
for part in response.parts:
    if hasattr(part, 'thought') and part.thought:
        print(f"عملية التفكير: {part.text[:100]}...")
    elif hasattr(part, 'thought_signature') and part.thought_signature:
        saved_signature = part.thought_signature  # حفظ، بدون فك تشفير!
        print("تم حفظ thoughtSignature (ليست صورة)")
    elif image := part.as_image():
        image.save("cat_sakura.png", format="PNG")
        print("تم حفظ الصورة")

عرض الكود الكامل لإعادة إرسال thoughtSignature في محادثة متعددة الجولات
from google import genai
from google.genai import types

client = genai.Client(api_key="YOUR_API_KEY")

# الجولة الأولى: توليد الصورة
response1 = client.models.generate_content(
    model="gemini-3.1-flash-image-preview",
    contents=["ارسم قطة بيضاء تحت شجرة كرز"],
    config=types.GenerateContentConfig(
        response_modalities=["TEXT", "IMAGE"],
        image_config=types.ImageConfig(image_size="2K"),
        thinking_config=types.ThinkingConfig(
            include_thoughts=True
        ),
    )
)

# استخراج الصورة والتوقيع
image_data = None
thought_signature = None
model_parts = []

for part in response1.parts:
    model_parts.append(part)  # الاحتفاظ بالأجزاء كاملة
    if hasattr(part, 'thought_signature') and part.thought_signature:
        thought_signature = part.thought_signature
    elif image := part.as_image():
        image.save("round1.png", format="PNG")

# الجولة الثانية: التعديل بناءً على نتائج الجولة السابقة
# مفتاح الحل: تمرير الأجزاء الكاملة للجولة السابقة (بما في ذلك thoughtSignature) كسياق
history = [
    {"role": "user", "parts": [{"text": "ارسم قطة بيضاء تحت شجرة كرز"}]},
    {"role": "model", "parts": model_parts},  # تحتوي على thoughtSignature
]

response2 = client.models.generate_content(
    model="gemini-3.1-flash-image-preview",
    contents=history + [
        {"role": "user", "parts": [{"text": "غير الخلفية إلى سماء ليلية وأضف قمراً"}]}
    ],
    config=types.GenerateContentConfig(
        response_modalities=["TEXT", "IMAGE"],
        image_config=types.ImageConfig(image_size="2K"),
    )
)

for part in response2.parts:
    if image := part.as_image():
        image.save("round2_edited.png", format="PNG")
        print("تم حفظ الصورة المعدلة")

نصيحة: عند استدعاء Nano Banana 2 عبر APIYI (apiyi.com)، توفر المنصة واجهة متوافقة مع OpenAI، وتتعامل تلقائياً مع تمرير thoughtSignature، مما يغنيك عن إدارة حالة التوقيع في المحادثات متعددة الجولات يدوياً.

دليل الأخطاء الشائعة والحلول لـ thoughtSignature في Nano Banana 2 API

ملخص سيناريوهات الأخطاء الشائعة

السيناريو المشكلة السبب الحل
اعتبار التوقيع صورة فك تشفير base64 لا ينتج صورة صالحة thoughtSignature بيانات مشفرة وليست صورة تحقق من وجود حقل inlineData قبل فك التشفير
فقدان التوقيع في المحادثات انخفاض جودة الرد أو خطأ 400 عدم إعادة إرسال thoughtSignature احفظ كامل parts بما فيها التوقيع وأرسلها في الجولة التالية
تزوير التوقيع خطأ "invalid signature" التوقيع يخضع للتحقق من جانب الخادم يجب استخدام القيمة التي يعيدها الـ API كما هي
اختلاف أسماء الحقول اختلاف التسمية بين Python و REST REST يستخدم camelCase، و SDK يستخدم snake_case REST: thoughtSignature، Python: thought_signature
تجاهل الاستجابة المتدفقة ضياع بيانات التوقيع قد يكون التوقيع في جزء نصي فارغ في آخر chunk تحقق من حقل التوقيع حتى لو كان النص فارغاً

مقارنة تسمية حقول thoughtSignature في Nano Banana 2 API

تختلف تسمية الحقول حسب طريقة الاستدعاء، وهو خطأ شائع آخر:

طريقة الاستدعاء اسم الحقل الموقع
REST API (JSON الخام) thoughtSignature parts[].thoughtSignature
Python SDK thought_signature part.thought_signature
تنسيق متوافق مع OpenAI (وكيل) thought_signature provider_specific_fields.thought_signature

حل الطوارئ لـ Nano Banana 2 API: التوقيع الوهمي (dummy)

إذا كنت تقوم بترحيل سجل محادثات قديم ولا تملك thoughtSignature صالحاً، توفر Google قيمة تجاوز خاصة:

DUMMY_SIGNATURE = "context_engineering_is_the_way_to_go"

تمرير هذه السلسلة كقيمة لـ thoughtSignature سيجنبك خطأ 400. لكن لاحظ أن هذا حل مؤقت، وقد تتأثر استمرارية استنتاج النموذج.

🎯 أفضل الممارسات: احفظ جميع قيم thoughtSignature بالكامل منذ أول استدعاء لبناء سلسلة تاريخ محادثة صحيحة.
إذا وجدت أن الإدارة اليدوية معقدة، فإن استخدام الواجهات المتوافقة مع OpenAI عبر APIYI (apiyi.com) يمكن أن يقلل من التعقيد بشكل كبير.

nano-banana-2-api-thoughtsignature-explained-thinking-mode-guide-ar 图示

الأسئلة الشائعة

س1: ماذا يمكن أن نستخرج من فك تشفير بيانات base64 الخاصة بـ thoughtSignature؟

لا يمكنك استخراج أي محتوى ذي معنى. فهي عبارة عن بيانات ثنائية مشفرة وموقعة، وقد صُممت لتكون "غير شفافة" (opaque). يمكنك فك تشفير base64 للحصول على سلسلة من البايتات الثنائية، لكن هذه البايتات لا تنتمي لأي تنسيق ملف معروف؛ فهي ليست صورة، ولا نصاً، ولا JSON. الطريقة الصحيحة الوحيدة للتعامل معها هي حفظها وإعادة إرسالها كما هي تماماً.

س2: ماذا يحدث إذا لم أقم بإعادة إرسال thoughtSignature؟

هناك حالتان: 1) في سيناريوهات المحادثة النصية البحتة، لن يظهر خطأ، لكن تماسك استنتاج النموذج سينخفض، وقد تكون جودة الإجابات اللاحقة أقل من المتوقع؛ 2) في سيناريوهات استدعاء الأدوات (function calling)، ستعيد نماذج Gemini 3 خطأ HTTP 400 مباشرة. بالنسبة للمحادثات متعددة الجولات لتحرير الصور في Nano Banana 2، سيؤدي فقدان التوقيع إلى عدم قدرة النموذج على استعادة السياق بشكل صحيح، مما قد يجعل نتائج التحرير غير دقيقة. نوصي باستخدام واجهة OpenAI المتوافقة عبر APIYI (apiyi.com)، حيث تقوم المنصة بمعالجة نقل التوقيع تلقائياً.

س3: كيف يمكن التمييز بين الصور والتوقيعات في الاستجابة؟

تحقق من نوع الحقل: الأجزاء التي تحتوي على inlineData (بما في ذلك mime_type و data) هي بيانات صور؛ الأجزاء التي تحتوي على حقل thoughtSignature أو thought_signature هي توقيعات؛ أما الأجزاء التي تحمل thought: true فهي نصوص ملخص التفكير. عند البرمجة، تحقق أولاً من وجود inlineData ثم افحص الحقول الأخرى.

س4: سجلات المحادثة القديمة لا تحتوي على thoughtSignature، كيف يمكنني تعويضها؟

توفر Google قيمة توقيع وهمية (dummy) خاصة هي "context_engineering_is_the_way_to_go"، والتي يمكن تمريرها كقيمة مؤقتة لـ thoughtSignature لتجنب خطأ 400. لكن هذا مجرد حل توافقي ولا يمتلك قدرة حقيقية على استعادة الاستنتاج. على المدى الطويل، نوصي بحفظ جميع التوقيعات بالكامل منذ بداية المحادثات الجديدة.


ملخص

النقاط الجوهرية حول thoughtSignature في واجهة برمجة تطبيقات Nano Banana 2:

  1. ليست صورة: thoughtSignature هو توقيع مشفر لعملية التفكير، وليس بيانات صورة بنظام base64، ولا يمكن فك تشفيره إلى أي تنسيق صور.
  2. يجب إعادة إرساله كما هو: يجب حفظ وإعادة إرسال thoughtSignature كما هو في المحادثات متعددة الجولات، وإلا ستواجه خطأ 400 عند استدعاء الأدوات، وستنخفض جودة المحادثة النصية.
  3. التمييز الصحيح بين الأجزاء الثلاثة: الأجزاء التي تحتوي على inlineData هي صور، والتي تحتوي على thoughtSignature هي توقيعات، والتي تحتوي على thought: true هي ملخصات التفكير.

بعد فهم طبيعة هذا الحقل، لن تقع في فخ "محاولة فك تشفير التوقيع كصورة" عند تحليل استجابات واجهة برمجة تطبيقات Nano Banana 2.

نوصي باستخدام APIYI (apiyi.com) للتحقق السريع من ميزة تحرير الصور في المحادثات متعددة الجولات لـ Nano Banana 2، حيث تتعامل المنصة تلقائياً مع تمرير thoughtSignature وتوفر أرصدة مجانية وواجهة موحدة.

📚 المراجع

  1. وثائق Thought Signatures الرسمية: شرح كامل من Google لآلية thoughtSignature.

    • الرابط: ai.google.dev/gemini-api/docs/thought-signatures
    • الوصف: يتضمن تعريفات الحقول، قواعد التمرير، وأمثلة على المحادثات متعددة الجولات.
  2. وثائق نمط التفكير في Gemini: كيفية تفعيل ميزة التفكير ومعلمات الإعداد.

    • الرابط: ai.google.dev/gemini-api/docs/thinking
    • الوصف: فهم إعدادات مثل include_thoughts و thinking_level.
  3. مرجع واجهة برمجة تطبيقات الاستدلال في Vertex AI: تعريف كامل لحقول كائن Part في REST API.

    • الرابط: docs.cloud.google.com/vertex-ai/generative-ai/docs/model-reference/inference
    • الوصف: يتضمن تعريف النوع وقيود الاستخدام لـ thoughtSignature.
  4. مركز وثائق APIYI: حل مبسط لاستدعاء Nano Banana 2 عبر واجهة متوافقة مع OpenAI.

    • الرابط: docs.apiyi.com
    • الوصف: معالجة تلقائية لتمرير thoughtSignature، مما يقلل من تعقيد التطوير.

المؤلف: الفريق التقني لـ APIYI
النقاش التقني: نرحب بمشاركتكم في قسم التعليقات، ولمزيد من المعلومات يمكنكم زيارة مركز وثائق APIYI على الرابط docs.apiyi.com

موضوعات ذات صلة