T1 · Intermediate · 8 دقيقةثابت · آخر مراجعة: 2026-08-19مسودة أولى — بنراجعها

لوب الـ Tool Call

في سطر واحد · الشغل الحقيقي لوب: الموديل يطلب أداة، إنت بتشغّلها، بترجّعله النتيجة، وهو يكمّل — لحد ما يوصل لرد نهائي.

القاموس:AgentContext WindowInferenceTool Calling
ليه ده مهم؟

الموديل نفسه ما بيشغّلش أي أداة؛ إنت المسؤول عن اللوب ده. لو مش فاهمه، تطبيقك هيقف بعد أول طلب أداة.

زي مكالمة رايح جاي: الموديل بيقولّك «هات لي X»، إنت بتجيبه وترجّعه، وهو ممكن يطلب Y بعده. بتفضل تلفّ لحد ما يقول «خلاص، الرد كده».

خلينا نفهمها بمثال

زي طبّاخ بيطلب مكوّنات واحد ورا التاني من المخزن، وكل ما يوصله مكوّن يقرّر محتاج إيه بعده، لحد ما الطبق يخلص.

مستخدم يسأل «فاتورة العميل رقم ٧ اتدفعت؟» — الموديل يطلب get_invoice(7)، ترجّعله «مدفوعة»، فيرد على المستخدم بجملة طبيعية «آه، الفاتورة اتدفعت».

طيب بتحصل إزاي؟

كل لفّة في اللوب هي request كامل جديد: (1) تبعت المحادثة + تعريفات الأدوات. (2) الموديل يرد إمّا بنص نهائي أو بطلب أداة (اسم + مدخلات + id). (3) كودك يتحقّق من المدخلات، ينفّذ، ويضيف النتيجة كرسالة مربوطة بنفس الـ id. (4) تبعت المحادثة كلها تاني وتلفّ. المحادثة بتكبر مع كل لفّة جوه الـ context window، وكل لفّة inference بتكلّف — عشان كده لازم حد أقصى للفّات (max iterations) يمنع اللوب من إنه يلفّ للأبد.

هيكل اللوب في TypeScript مبسّط:

let messages = [{ role: "user", content: userQuestion }];
for (let turn = 0; turn < MAX_TURNS; turn++) {
  const reply = await llm.chat({ messages, tools });
  if (reply.type === "text") return reply.text; // رد نهائي

  // الموديل طلب أداة — إنت اللي بتتحقّق وتنفّذ
  const input = validate(reply.toolName, reply.input);
  const result = await runTool(reply.toolName, input);

  messages.push(assistantToolRequest(reply));
  messages.push(toolResult(reply.id, result)); // مربوطة بنفس الـ id
}
throw new Error("وصلنا للحد الأقصى من اللفّات");
خلينا نبنيها

🧪 جرّب بنفسك: مستخدم بيسأل «ابعت تذكير للعميل اللي فاتورته متأخرة». تتبّع اللوب خطوة بخطوة على ورق: اللفة ١ الموديل يطلب إيه؟ (find_overdue_invoice) — بترجّعله إيه؟ اللفة ٢ يطلب إيه؟ (send_reminder بإيميل العميل) — واللفة ٣ الرد النهائي يقول إيه؟ اكتب محتوى الـ messages array في كل لفة.

أشهر الأخطاء

أشهر الأخطاء: (1) تعامل أول رد فيه tool call كأنه الرد النهائي وتعرضه للمستخدم. (2) تنسى ترجّع نتيجة الأداة فالموديل يفضل مستنّي. (3) مفيش max iterations فموديل تايه يلفّ بلا نهاية ويحرق فلوس. (4) ترجّع النتيجة من غير الـ id بتاع الطلب فالـ API يرفض أو الموديل يلخبط. (5) تنفّذ من غير validation — طلب الموديل مش أمر.

إمتى تستخدمها؟

أي تطبيق فيه أدوات محتاج اللوب ده — سؤال واحد ممكن يحتاج سلسلة أدوات: دوّر على العميل، هات فاتورته، ابعتله إيميل.

وإمتى لأ؟

لو المهمة دايمًا استدعاء واحد معروف مسبقًا (استخراج JSON منظّم مثلًا)، مش محتاج لوب كامل — نفّذ الطلب الواحد وخلاص، ووفّر التعقيد.

خلينا نبنيهاالقراءة خلصت — دلوقتي ابنيها بإيدك.تتبّع لوب أداتين ورا بعض