برمجة

جافاسكريبت: وكيل ذكاء وfunction calling

الذكاء لا يشغّل الدالة بنفسه. يقول functionCall، أنت تشغّلها وتُرجع functionResponse.

كل الدروس · دروس جافاسكريبت: تعلّم من الصفر

محادثة ووكيل

المحادثة تكتب نصاً فقط. لا تستطيع تشغيل قاعدتك أو دالتك. الوكيل يتحرك، لكنه لا يستدعي الدالة بنفسه. قائمة tools تحمل الاسم وdescription والمعاملات. يقرأ الذكاء السؤال ويُرجع functionCall: اسماً وargs. أنت تشغّل تلك الدالة وتُعيد النتيجة بـ functionResponse. يكتب الذكاء الجملة الأخيرة منها. إذا كان description فارغاً اختار دالة خاطئة. النوع بأحرف كبيرة: STRING وNUMBER وOBJECT.

functionCall والرد

الطلب الأول يذهب مع الأدوات. إذا وُجد parts[0].functionCall فلا نص، بل أمر. أنت تشغّل الدالة. في الطلب الثاني ثلاث قطع: السؤال وfunctionCall الخاص بالنموذج وfunctionResponse. إذا اكتفيت بـ console.log ولم تُعد النتيجة فلن يرى المستخدم جملة مرتبة. في سؤال مثل مرحباً لا يوجد functionCall، ويأتي text مباشرة.

const apiKey = process.env.GEMINI_API_KEY;
const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=${apiKey}`;

function havaMelumatiniVer(seher) {
  if (seher === "Baku") return "Bakıda 24 dərəcə, günəşlidir.";
  return "Bu şəhər üçün məlumat yoxdur.";
}

const aletler = [{
  functionDeclarations: [{
    name: "havaMelumatiniVer",
    description: "Verilmiş şəhər üçün hava mətnini qaytarır.",
    parameters: {
      type: "OBJECT",
      properties: { seher: { type: "STRING", description: "Şəhər, məsələn Baku" } },
      required: ["seher"]
    }
  }]
}];

async function agentSorgusuGonder(istifadeciSuali) {
  const ilkBody = {
    contents: [{ role: "user", parts: [{ text: istifadeciSuali }] }],
    tools: aletler
  };
  const cavab = await fetch(url, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(ilkBody)
  });
  const melumat = await cavab.json();
  const hisse = melumat.candidates[0].content.parts[0];
  if (!hisse.functionCall) {
    console.log(hisse.text);
    return;
  }
  const ad = hisse.functionCall.name;
  const netice = havaMelumatiniVer(hisse.functionCall.args.seher);
  const ikinciBody = {
    contents: [
      { role: "user", parts: [{ text: istifadeciSuali }] },
      { role: "model", parts: [{ functionCall: hisse.functionCall }] },
      { role: "user", parts: [{ functionResponse: { name: ad, response: { netice } } }] }
    ],
    tools: aletler
  };
  const cavab2 = await fetch(url, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(ikinciBody)
  });
  const melumat2 = await cavab2.json();
  console.log(melumat2.candidates[0].content.parts[0].text);
}

أسئلة

هل يشغّل الذكاء الدالة بنفسه؟ لا. يقول الاسم والمعامل فقط. الذي يشغّلها هو كودك.

لماذا description مهم؟ يعرف الذكاء متى يختار الدالة من هذا النص. إذا كان فارغاً أو غامضاً استدعى الخطأ.

ماذا إذا كُتب STRING بأحرف صغيرة؟ Gemini يُرجع خطأ. الأنواع OBJECT وSTRING وNUMBER بأحرف كبيرة.

لماذا لا تصل النتيجة إلى المستخدم؟ functionResponse غائب في الطلب الثاني. console.log لا يكفي.

المؤلف: Nibras Code