
ستون حاوية على خادم واحد
صندوق معادن عارية واحد يشغل عشرات إلى مئات حاويات Hoody. يجعل KSM و BTRFS dedup التكلفة الإضافية قريبة من الصفر.
وكيل أبحاث يستقبل مطالبة معقّدة. بدلاً من فعل كل شيء بنفسه، يُرسل POST إلى واجهة الحاويات ويستعيد ثلاثة روابط وكلاء فرعيّين. كل وكيل فرعي يستطيع توليد فروعه. لا أحد منهم يعرف بـ orchestrator. يستدعون بعضهم عبر HTTP فحسب.
كل عقدة في الشجرة حاوية Hoody بخدمة hoody-agent. الآباء والأبناء يعرفون بعضهم بالرابط فقط. لا مُخطِّط مركزي يراقب من فوق.
يستقبل المطالبة. يقرّر أيّ مهام فرعيّة يتفرّع إليها. يُرسل POST إلى واجهة الحاويات لتوليد حاوية جديدة لكل وكيل فرعي، ثم يستدعي نقطة /api/v1/agent/tasks في كلٍّ منها بشريحة العمل التي يملكها.
كلٌّ يعمل في حاويته بنظام ملفّات وطرفيّة وSQLite خاصّة. لا يستطيع أحدهم إفساد الآخرين. أيّ منهم يستطيع أن يقرّر أنّه يحتاج مساعدة ويُولّد فروعه بنفس الطريقة التي فعلها الأب. البروتوكول متناظر.
المُدقِّق الواقعي يرى خمسة ادّعاءات، يُولّد خمس حاويات بالتوازي، يُطلق خمسة طلبات HTTP، ينتظر خمس استجابات. النمط نفسه، طبقة أعمق. الحاويات الخاملة لا تكلّف شيئاً، فالأشجار العميقة مجّانيّة اقتصادياً.
لا runtime وكيل لتثبيته، لا حافلة رسائل لإعدادها، لا حالة مشتركة لمزامنتها. الوكيل الأب يستخدم نفس واجهة الحاويات التي يستخدمها إنسان: POST لإنشاء، ثم استدعاء رابط الابن.
// وكيل الأب (يعمل في حاويته الخاصة بـ Hoody).
// انبثق ثلاثة وكلاء فرعيين، أعطِ كل واحد منهم شريحة من العمل،
// انتظر نتائجهم بالتوازي.
const HOODY = 'https://api.hoody.com';
async function spawnChild(name) [
// 1. أنشئ حاوية طازجة جديدة مع خدمة الوكيل تعمل.
const res = await fetch(HOODY + '/api/v1/projects/' + PROJECT + '/containers', [
method: 'POST',
headers: [ authorization: 'Bearer ' + TOKEN ],
body: JSON.stringify([
name,
server_id: SERVER,
container_image: 'debian-12',
hoody_kit: true,
ai: true,
]),
]);
const child = (await res.json()).data;
// 2. اضرب عنوان الوكيل الفرعي مثل أي خدمة HTTP أخرى.
const agentUrl = 'https://' + PROJECT + '-' + child.id + '-agent-1.' + SERVER + '.containers.hoody.com';
return [ id: child.id, agentUrl ];
]
const [scrape, summarize, factCheck] = await Promise.all([
spawnChild('scrape'),
spawnChild('summarize'),
spawnChild('fact-check'),
]);
// 3. وجّه المهام. كل وكيل فرعي يعمل بشكل مستقل،
// يستطيع توليد وكلاءه الفرعيين بنفس الطريقة.
const results = await Promise.all([
fetch(scrape.agentUrl + '/api/v1/agent/tasks', [ method: 'POST', body: JSON.stringify([ description: scrapeBrief ]) ]),
fetch(summarize.agentUrl + '/api/v1/agent/tasks', [ method: 'POST', body: JSON.stringify([ description: summarizeBrief ]) ]),
fetch(factCheck.agentUrl + '/api/v1/agent/tasks', [ method: 'POST', body: JSON.stringify([ description: factCheckBrief ]) ]),
]);كلتا نقطتَي النهاية واجهات Hoody موثّقة: POST /api/v1/projects/$PID/containers يُولّد حاوية جديدة بخدمة الوكيل مثبّتة مسبقاً؛ POST $CHILD_URL/api/v1/agent/tasks يُرسل مهمّة إليها. المُدقِّق الواقعي يستطيع تشغيل نفس الكود لتوليد مُتحقِّقي ادّعاءاته — التكرار العَودي ليس سوى HTTP.
كل إطار وكلاء طبقة رقيقة فوق استدعاءات دالة في العمليّة. كلّها تفترض أنّ الوكلاء يتشاركون الذاكرة وPython وruntime واحداً. Hoody يفترض العكس: الوكلاء حواسيب منفصلة، وHTTP هو البروتوكول الذي يتحدّثونه أصلاً.
POST /api/v1/projects/$PID/containers
fetch(child.url + '/api/v1/agent/tasks')
استدعاءا HTTP لكل ابن. الأب لا يستورد إطاراً، لا يُسجِّل أداة، لا يتشارك حالة. كل وكيل فرعي نظير برابط — نفس الشكل كالأب، نفس الشكل كاستدعائك أيّ خدمة HTTP أخرى.
كل وكيل نظير برابط. يستدعون بعضهم بنفس الطريقة التي تستدعي بها أيّ خدمة HTTP أيّ خدمة HTTP أخرى.
لا orchestrator. لا حافلة رسائل. لا حالة مشتركة لمزامنتها. الشيء الوحيد الذي يحدّ كم وكيلاً تُشغّل بالتوازي هو كم تريد أن تنفق — والحاويات الخاملة لا تُكلّف شيئاً.
أُطر التنسيق وخدمات runtime الزائلة التي يلجأ إليها الناس حين لا يكفي وكيل واحد. كلٌّ منها يحلّ شريحة من المشكلة. الأوّليّة الأصليّة لـ HTTP تستبدل الشريحة والإطار الملفوف حولها.
توقّف عن وصل رسوم الوكلاء البيانيّة. أطلق واحداً. دعه يُطلق البقيّة.