ورشة عمل Ship 26 NYC - العمال الصغار

VVercel
Computing/SoftwareSmall Business/StartupsInternet Technology

Transcript

00:00:00مرحباً بالجميع. اسمي جوناثان كليم، أو يمكنكم مناداتي جاي كليم، وأنا مهندس برمجيات في شركة
00:00:11Notion، حيث أعمل على منصة المطورين، لكنني أركز بشكل خاص على منتج جديد نسبياً
00:00:17قد تكونون سمعتم عنه يسمى Notion Workers. في ورشة العمل هذه اليوم، سأقدم لكم
00:00:23نظرة عامة بسيطة حول ماهية Notion Workers ولماذا أنشأناها باستخدام Vercel
00:00:28Sandbox. وبعد ذلك، سأصطحبكم عبر نسخة مصغرة بعض الشيء من Workers،
00:00:36لكي تحصلوا على فكرة على الأقل عن كيفية بناء منتج كهذا باستخدام Vercel Sandbox.
00:00:43لذا، إذا لم تكن على دراية بماهية Workers، فهي عبارة عن مجموعة أدوات تطوير (SDK) وبيئة تشغيل يمكنك من خلالها كتابة
00:00:50كود مخصص وتوسيع نطاق Notion به. لذا يمكنك القيام بأشياء مثل مزامنة بيانات الطرف الثالث في Notion،
00:00:57ويمكنك كتابة استدعاءات أدوات مخصصة لوكلائك. لقد رأينا أشخاصاً يقومون بأشياء ممتعة ومجنونة مثل طلب
00:01:04بقالتهم باستخدام Notion Workers أو التحكم في منازلهم الذكية. لقد رأينا أيضاً سير عمل معقداً حقاً
00:01:11خاصة من مجالات تكنولوجيا المعلومات والأمن. الشيء الجميل في Workers هو أنه لا توجد
00:01:17بنية تحتية لتدارة ها. أنت فقط تكتب الكود أو تجعل عميلاً برمجياً يكتبه لك، و Notion
00:01:23تتولى التأكد من أنها تعمل ومتاحة دائماً. لقد كان هذا فائدة كبيرة لمستخدمي Notion،
00:01:30خاصة المطورين. لم يعودوا مضطرين إلى الانتظار حتى تقوم Notion ببناء، كما تعلمون، عمليات تكامل أساسية
00:01:36لهم. أي شيء يتمنون لو أن Notion تستطيع فعله ولكنها لا تفعل، أصبح بإمكانهم كتابته
00:01:42أنفسهم. لذا عندما بدأنا لأول مرة في بناء Notion Workers، كان شاغلي الأساسي هو
00:01:53الأمان. لدي القليل من الخبرة في بناء منصات تقوم بتشغيل كود مستخدم غير موثوق.
00:01:59لقد عملت على GitHub Actions، على سبيل المثال، لفترة طويلة. وكنت قلقاً بشكل أساسي بشأن
00:02:04صعوبة بناء البنية التحتية لمنتج كهذا وخاصة الأمان. هناك الكثير
00:02:09من الأشياء التي يجب عليك القلق بشأنها. على سبيل المثال، تريد التأكد من أن الكود الذي يكتبه المستخدمون
00:02:14لا يمكنه لمس قواعد بيانات Notion، بالطبع، أو لا يمكنه لمس خدمات Notion التي يجب ألا يتمكنوا عادةً
00:02:20من الوصول إليها. وتريد أيضاً التأكد من أن المستخدمين لا يمكنهم التأثير على المستخدمين الآخرين. لا تريد أن يتمكن كود
00:02:26مستخدم واحد، كما تعلمون، من الوصول إلى كود مستخدم آخر أو بالطبع أسرارهم أو أي شيء من
00:02:31قبيل ذلك. هذا ليس مجرد أمر يتعلق بالأمان. بل يتعلق أيضاً بالعدالة ومشاركة الموارد. إذا كان هناك مستخدم
00:02:37يقوم بشيء يستهلك طناً من وحدة المعالجة المركزية وطناً من الذاكرة، فإنك تريد التأكد من أن ذلك لا يؤثر
00:02:42بشكل غير عادل على المستخدمين الآخرين الذين يحاولون القيام بأشياء في نفس الوقت. سأأخذ دقيقة
00:02:48وأبتعد قليلاً لأروي قصة هنا. هذه - مثل مشاركة الموارد - هي خاصة أمر معقد حقاً.
00:02:54من المحتمل أن يأكل هذا من وقتي، لكني أحب هذه القصة. عندما كنا نبني
00:02:58GitHub Actions، وهذا شيء فكرنا فيه مع workers أيضاً، بمجرد أن يكون لديك
00:03:02منصة تنفيذ تعليمات برمجية تعسفية، يحاول الناس فوراً القيام بتعدين العملات الرقمية عليها.
00:03:07كنت أجري محادثة مع شخص ما قبل بضعة أسابيع وكان يقولون، حسناً،
00:03:10كيف تكتشف ذلك؟ يمكنك فقط معرفة ما إذا كانت وحدة المعالجة المركزية مثقلة بنسبة مئوية مئة، أليس كذلك؟
00:03:14حسناً، ليس حقاً، لأنه بمجرد أن تصبح منصة ناجحة، سيبدأ معدنو العملات الرقمية فوراً
00:03:20في فعل أشياء مثل مشاركة البرامج النصية مع بعضهم البعض والتي تعدل نوعاً ما الطريقة التي
00:03:26يشغلون بها تعليمات وحدة المعالجة المركزية بحيث تبدو وكأنها نشاط بريء تماماً، لكنهم يستخدمون
00:03:31القدر الأقصى المطلق من الموارد الممكنة دون إشهار العلم ضدهم في نظامك.
00:03:37لذا فهو أمر صعب بشكل استثنائي، ويستغرق سنوات عديدة والعديد من طبقات الأمان
00:03:42والمراقبة حتى يتسنى إنجازه بشكل صحيح. شيء آخر يجب عليك القلق بشأنه هو عندما يكون لديك
00:03:48منصة لتنفيذ التعليمات البرمجية، عليك أن تقلق بشأن قيام الأشخاص بهجمات حجب الخدمة باستخدامها،
00:03:54واستخدامها لشبكات القيادة والتحكم للبوتات (botnets). ونحن لم نكن نريد أن نضطر للقلق بشأن كل
00:04:00هذا الكلام دفعة واحدة مع Notion Workers. أردنا التركيز على ما نحب فعله، وهو
00:04:07تقديم منتج يحب مستخدمونا استخدامه. ولهذا السبب قررنا البناء باستخدام Vercel Sandbox.
00:04:14Vercel Sandbox، استطعنا أن نرى فوراً أنها كانت بنية تحتية صلبة حقاً حلت الكثير من
00:04:18هذه المشاكل، العديد من هذه المشاكل بالنسبة لنا جاهزة للاستخدام. لذا سأعرض عليكم عرضاً توضيحياً سريعاً للغاية
00:04:25لماهية Notion Workers. إذن لدي وكيل مخصص هنا ومهمة هذا الوكيل المخصص هي إخباري
00:04:33ما إذا كانت ورشة العمل هذه ملعونة أم لا. لقد كتبت عاملاً يسمى Mercury Retrograde (تراجع عطارد). لا أعرف إن كان أحد
00:04:40على دراية بهذا، ولكن عندما يصطف كوكب عطارد بطريقة تجعله في حالة تراجع، يكون ذلك عادةً
00:04:47فألاً سيئاً. لذا فإن هذا العامل لديه استدعاء أداة مخصص واحد يستخدم واجهة برمجة تطبيقات وجدتُها لا تفعل شيئاً آخر
00:04:54سوى إخبارك ما إذا كان عطارد في حالة تراجع أم لا. لذا سأوجه وكيلي وأقول: “هل
00:05:01ورشة عملي ملعونة؟” وسيفكر لمدة دقيقة ثم ينبغي لنا، طالما أن الإنترنت يتصرف بشكل جيد،
00:05:14أن نبدأ في رؤيته يقوم باستدعاء أداة. لذا فهو يستخدم عامل Mercury in retrograde الخاص بي، مستدعياً
00:05:22الأداة الوحيدة التي يكشف عنها هذا العامل ومعرفة ما إذا كان عطارد في حالة تراجع أم لا، وبعد ذلك
00:05:27سيرد علينا الوكيل. أعتقد أنني متصل بشيء مثل GPT-54 nano. لذا فهو عادةً أسرع بكثير.
00:05:37أعتقد أن هذه هي مشكلة الإنترنت، للأسف. إذا تحقق أي شخص صدفة مما إذا كان عطارد في
00:05:46حالة تراجع، فأنا أعلم مسبقاً أنه كذلك. ولذا ربما هذا هو سبب حدوث ذلك. سأقوم فقط
00:05:53بتخطي الأمر. سنعود إليه خلال دقيقة ونرى ما إذا كنا سنحصل على رد في النهاية. لكني أعتقد أننا نعرف
00:05:59الإجابة بالفعل، على ما يبدو. حسناً، إذن لديكم الآن فكرة عن ماهية notion workers. سأصطحبكم
00:06:05عبر سكريبت صغير كتبته يقوم بالكثير من المهام الأساسية المتضمنة في أخذ
00:06:13كود المستخدم، ونشره، وتنفيذه بأمان، ونوعاً ما إخبار الوكيل بذلك الكود حتى يتسنى له
00:06:20إجراء استدعاءات أدوات إليه. هل اكتمل هذا أبداً؟ أوه، نعم، ها نحن ذا. أوه، أعتقد ربما،
00:06:28أظن أنني لا بد أنني أوقفت تشغيل واجهة برمجة تطبيقات Mercury in retrograde لأنه يبدو أن واجهة برمجة التطبيقات لم تستجب.
00:06:35على أي حال، سيتعين علي فتح تذكرة في مكان ما. رائع. إذن لدي سكريبت أساسي. لا أتوقع
00:06:40منكم أن تتابعوا تماماً وتكتبوا الكود أو أي شيء من هذا القبيل. سأقوم بالقفز نوعاً ما
00:06:44وأعطيكم فكرة عن بعض المشاكل التي حللناها والتي يجب عليك حلها عندما تبني
00:06:49منتجاً كهذا. ولكن إذا أردتم، هناك مستودع (repo) اسمه notion / forcell ship 2026 workers
00:06:55يحتوي على كل الكود الذي سأقوم بتشغيله هنا.
00:07:01رائع. إذن دعوني أفتح شرائح العمل الأخرى الخاصة بي هنا.
00:07:08إذن ما الذي نعمل على تحقيقه؟ لدينا وكيل دردشة تدقيقي (streaming). سنسمح له باستدعاء الأدوات التي
00:07:16تُعرَّف بواسطة كود مستخدم مخصص لا نثق به أو لا نعرف ما يوجد في ذلك الكود.
00:07:22وسنبني هذا باستخدام Vercel sandbox وخدمة تخزين البيانات الثنائية (blob storage) الخاصة بـ Vercel.
00:07:26لذا سأقوم بتشغيل عرض توضيحي سريع هنا ونأمل ألا نكون ملعونين حقاً.
00:07:31يمكنك بشكل أساسي تمرير رسالة واحدة إليه. سأقول مرحباً ونأمل أن نحصل على رد
00:07:36للخلف. ستكون الأمور بطيئة بعض الشيء لأنكم ستلاحظون أنها تقوم ببعض عمليات النشر في الخلفية.
00:07:40لذا فقد استدعت أداة هذه المرة. لقد استدعت للتو أداة تسمى say hello وقررت أن تحييني.
00:07:47سأرسل لها رسالة عادية هنا أطلب فيها فقط معرفة كم يساوي واحد زائد واحد حتى نتمكن من رؤيتها وهي تقوم
00:07:52فقط ببث استجابة عادية.
00:07:58إذا كنتم قد استخدمتم Vercel AI SDK، فهذه تستخدم فقط حلقة وكيل الأدوات. رائع. إذن حصلنا على استجابة
00:08:04بثية للخلف. يمكنك أيضاً استدعاء workers أكثر تعقيداً بكثير. لذا لدي واحدة أخرى هنا سأعرضها لكم.
00:08:14مع هذه الواحدة نخبرها أنني أتواجد في عنوان هذا المبنى.
00:08:17لدي 90 دقيقة وأريد الذهاب لرؤية موقع تاريخي ما ولا أريد المشي لأكثر من 15 دقيقة.
00:08:24لذا فإن هذا يوضح نوعاً ما سبب تفضيل هذه الخيارات أحياناً على خوادم MCP. مع خادم
00:08:29MCP لديك مجموعة من استدعاءات الأدوات المتباينة التي يمكنك إجراؤها. وإذا كنت تحاول فعل شيء
00:08:33معقد، فيتعين عليك وصف تلك الخطوات للوكيل وسيقوم بشيء مثل تنفيذ خطوة، وقضاء بعض
00:08:38رموز التفكير (thinking tokens)، وتنفيذ خطوة أخرى. لذا سيقوم هذا باستدعاء worker يحتوي على نوع من خوارزميات البحث
00:08:45الكبيرة والمعقدة حقاً والتي تستخدم مجموعة من واجهات برمجة تطبيقات أوقات عبور الموقع الجغرافي وتخطيط المسارات في مدينة نيويورك.
00:08:52تسمى plan outing.
00:08:56وسيستجيب هذا العامل بموقع تاريخي مقترح يمكننا زيارته.
00:09:00ويبدو أنه عثر على علامة شجرة الحرية (freedom tree marker) وهي نصب تذكاري لـ MIPOW يقع بالقرب من
00:09:07حديقة قاعة المدينة (City Hall Park). رائع. إذن دعونا نلقي نظرة على كيف يعمل هذا. إذن ما هو العامل (worker)؟
00:09:14إنه كود مستخدم في هذه الحالة يتم تعريفه في ملف فقط. عادةً ما يكون هذا كما تعلمون معرفاً
00:09:20بواسطة مستخدميك أو على GitHub في مكان ما ويتم نشره باستخدام واجهة سطر الأوامر (CLI). ولكن لدينا فقط بعض الأمثلة المحفوظة
00:09:26داخل المستودع هنا. وكل من هؤلاء العاملين يحتاج إلى كشف اسم الأداة، ووصف للأداة حتى
00:09:34يتسنى للوكيل توجيه الطلب إلى الأداة الصحيحة، والمخطط المدخل (input schema) حتى يعرف الوكيل المدخلات التي يحتاج إلى
00:09:38توفيرها في كل مرة يستدعي فيها تلك الأداة. ودالة تنفيذ تقول عندما يستدعي الوكيل هذه الأداة،
00:09:44فما هو الكود الفعلي الذي يتم تشغيله. لذا دعونا ننظر إلى مثال. إليك أداة الترحيب التي رأيتها
00:09:51في وقت سابق. إنها بسيطة للغاية. هذا العامل عبارة عن وحدة JavaScript واحدة هنا في ملف index.ts هذا. وهو يصدر وحدة
00:09:59واحدة تسمى say hello. لذا سترون كيف تعمل عملية البناء هذه. ولكن في هذا المثال،
00:10:04جميع مفاتيح تصدير وحداتنا مقترنة بأسماء أدواتنا. لذا ستمسى هذه الأداة
00:10:09say hello. ولديها وصف بسيط، ومخطط إدخال (input schema). في هذه الحالة، أنا أستخدم Zod فقط لتحديد
00:10:16المخطط. ومن ثم أقوم بتحويله إلى مخطط JSON. هذا هو التنسيق الذي تتوقعه هذه الوكلاء.
00:10:22وهناك دالة تنفيذ بسيطة. ومع ذلك، يمكنك إنشاء وحدات أكثر تعقيداً بكثير. لذا إذا قمت بفتح
00:10:27سير عمل plan outing، يمكنك أن ترى أن لديه وصفاً أطول بكثير يخبر الوكيل
00:10:34بكل شيء عن كيفية عمل هذه الأداة، ومتى يجب استدعاؤها، وما الذي تفعله. والسكريبت الخاص بهذا أطول بكثير،
00:10:39وأكثر تعقيداً بكثير. لن أستعرض كل هذا، ولم أقرأ سوى أجزاء صغيرة
00:10:45منه، ولكنه يعمل بشكل جيد جداً. هذا هو العالم الذي نعيش فيه الآن. لذا سيتم بناء هؤلاء العمال
00:10:54ونشرهم في تخزين Vercel blob. وبعد ذلك سنتعلم محتويات
00:10:59العاملين بطريقة ما. وسنكشف عنهم لوكيل ما. وبعد ذلك سيتم تنفيذ تلك الأدوات
00:11:03بأمان داخل صندوق رمل (sandbox). جزء البناء، سنقوم بتخطيه نوعاً ما. مع Notion workers، لدينا
00:11:09عملية بناء ونشر قائمة على السحابة. في هذه الحالة، قمت فقط ببناء هؤلاء العاملين مسبقاً على القرص. لذا كل
00:11:15عامل لديه ملف مضغوط (tarball) يحتوي على جميع تبعيات كود TypeScript المترجم وأشياء من هذا القبيل.
00:11:22إنه ليس الجزء الأكثر إثارة للاهتمام، لذا سأتخطاه فحسب.
00:11:26لذا فإن سؤال اليوم هو، كيف ننتقل من كود المستخدم الذي لم نره من قبل والذي لا نثق به
00:11:34إلى أدوات مكشوفة يتم تشغيلها بأمان بواسطة الوكيل؟ إذن هناك نوعاً ما جزأين من هذا.
00:11:39الجزء الأول منه هو، بمجرد حصولنا على كود المستخدم هذا في التخزين الثنائي (blob storage)، لنقل،
00:11:43كيف نتعرف على ما هو موجود في ذلك الكود؟ لأننا يجب أن نكون قادرين على إخبار الوكيل قبل أن
00:11:48يستدعي الأداة أبداً، ما هو اسم الأداة، وما هو مخطط الإدخال، وما هو وصف
00:11:53الأداة؟ ومن ثم السؤال الثاني هو، عندما يقرر الوكيل استدعاء تلك الأداة،
00:11:58كيف ننفذها بأمان؟ أحد الأشياء التي أحبها حقاً بشأن ما فعلناه مع
00:12:04Notion Workers SDK والذي قمنا به نوعاً ما هنا هو أن الكود يصف نفسه. إذن ما لم نكن
00:12:11نريده عندما كنا نصمم Notion Workers هو ألا نطلب من المستخدمين كتابة بعض كود TypeScript
00:12:16الذي يحدد أداتهم ثم يقولون، حسناً، والآن علي إنشاء ملف بيان (manifest) ثابت يصف
00:12:21عمالي وإعادة كتابة نفس الاشياء أساساً. لم نكن نريد عملية بناء محلية محرجة حيث
00:12:27كان عليهم تشغيل سكريبت، وإجراء بعض التحليلات، وتجميعه على القرص ثم نشره. لذا أردنا البدء
00:12:34بما بدا وكأنه تجربة المطور المثلى حيث تكتب الأداة وحدها ومن ثم تصبح
00:12:40مشكلتنا نحن في حل الأمر الصعب المتمثل في معرفة كيفية استخراج المعلومات من ذلك.
00:12:46إذن هذا مخطط بسيط للغاية، ولكن قبل أن ندخل في الكود، سأخبركم عن
00:12:52طريقة حلنا لهذا الأمر نوعاً ما. لدينا كود المستخدم المجمع على التخزين الثنائي.
00:12:59سنستخدم هذا الكود لإنشاء صندوق رمل (sandbox). لذا عندما نشغل أوامر في صندوق الرمل، سيكون كود
00:13:04المستخدم هذا موجوداً في جذر مساحة العمل (workspace root). سنقوم باستيراد ملف index.js الخاص بالمستخدم الذي كتبوه.
00:13:11لذا سيعطينا ذلك جميع أسماء الصادرات وتلك الوصف ومخططات الإدخال.
00:13:19هنا تصبح الأمور غريبة بعض الشيء، لكنها تعمل بشكل جيد حقاً. سنقوم باستدعاء
00:13:23json.stringify على تلك الوحدة ثم سنقوم بتسجيلها في مخرج النظام القياسي (standard out). يحدث كل ذلك في
00:13:29صندوق الرمل ومن ثم يستهلك سكريبت النشر الخاص بنا مخرج النظام القياسي هذا ويقوم بتحليله ويقول، حسناً،
00:13:34إذن أنا الآن أعرف اسم جميع الأدوات على هذا العامل، والمدخلات، والوصف. وفي هذه
00:13:40الحالة، سنمرره مباشرة إلى الوكيل. ولكن في حالة notion workers، على سبيل المثال،
00:13:44هذا جزء من خط أنابيب النشر الخاص بنا. لذا نأخذ كل هذه المعلومات ونخزنها في قاعدة بيانات بحيث
00:13:49في كل مرة تقوم فيها بتشغيل وكيل مخصص، نقوم بجلب تلك الأدوات، وتلك أوصاف الأدوات من
00:13:53قاعدة البيانات. هل يبدو ذلك منطقياً حتى الآن كيف يعمل هذا؟ حسناً. إذن دعونا نلقي نظرة على سكريبت
00:14:02النشر. يجب أن أعود إلى أول التزام (commit) لي هنا. لذا يحتوي هذا السكريبت على كل عمليات النشر الخاصة بنا ثم استدعاء
00:14:12الوكيل مدمجة فيه. إنه بسيط للغاية. في هذه الحالة، نقوم فقط بالتكرار على جميع الدلائل
00:14:18والعمال (workers). يحتوي كل من تلك الدلائل الفرعية على كود عامل كما رأيتم قبل قليل.
00:14:23مهمتنا هي معرفة كيفية استخراج كافة معلومات الأدوات من كل من هؤلاء العاملين وتعبئة
00:14:29كائن الأدوات هذا. يتم تمرير ذلك إلى وكيل حلقة الأدوات (tool loop agent). هذا مجرد جزء من AI SDK المصنوع
00:14:35بواسطة Vercel. ومن ثم سنرسل رسالة المستخدم إلى ذلك الوكيل، ونبث المخرج، ونكتبه
00:14:42إلى مخرج النظام القياسي من السكريبت. إذن أول شيء نحتاج إلى معرفته هو كيف نقوم فقط بتحميل
00:14:48الكود المصدر. هذا الجزء سهل جداً. إنه سريع جداً. بدلاً من البرمجة الحية، سأقوم فقط بنوع من
00:14:53التخطي بين كل من هذه المقاطع حتى لا تضطروا إلى مشاهدتي وأنا أكتب. أعدكم أنني أستطيع كتابة
00:14:59الكود. أنا فقط أظن أنه لا أحد يريد مشاهدتي وأنا أفعل ذلك. لذا بالتقدم للأمام قليلاً، لدينا هذه الدالة
00:15:06التي تسمى upload source والتي سأتعمق فيها. ولكن يمكنكم أن تروا أنني قمت باستيراد Vercel blob SDK. هذا أمر
00:15:13بسيط جداً هنا. لذا إذا نظرنا إلى دالة upload source هذه، فإننا نستدعي أساساً دالة put
00:15:20هذه. ونقول إننا نريد تخزين حزمة هذا المستخدم تحت اسم العامل / bundle.tar.gzip.
00:15:29سنقوم ببث الملف من القرص وسنقوم بتخزين ذلك في التخزين الثنائي. لذا بمجرد الانتهاء من ذلك،
00:15:35نصبح قادرين على إنشاء صناديق رمل من ذلك الكائن الثنائي. وبهذا يكون جزء التحميل قد تم حله.
00:15:43الشيء التالي الذي نحتاج إلى فعله هو أننا بحاجة إلى أخذ هذا الكود المصدر المجمع ونحتاج إلى إنشاء
00:15:49صندوق رمل منه. وللقيام بذلك، قمت باستيراد Vercel sandbox SDK. هناك دالة مساعدة أخرى
00:15:56هنا في الأسفل تسمى create sandbox. سأتخطى بعض أجزاء هذا. ولكن أساساً ما
00:16:03نفعله هو عندما يكون لدينا هذا الكائن في التخزين الثنائي، فإننا نستخدم عناوين URL موقعة مسبقاً (pre-signed URLs) سنقوم
00:16:10بتمريرها إلى خدمة صندوق الرمل. لكي تستطيع خدمة صندوق الرمل، على سبيل المثال، أعتقد أن هذا مضبوط على انتهاء صلاحية لمدة 10 دقائق،
00:16:16جلب ذلك الكائن الثنائي من التخزين الثنائي واستخدامه لملء صندوق رمل. هذه إحدى
00:16:23الميزات التي تعجبني حقاً في Vercel sandbox وهي أنها تعمل مع الملفات المضغوطة مثل هذه. من السهل
00:16:28بناء ملف مضغوط لكود المستخدم، وتريد خدمة صندوق الرمل التي تريد إنشاء صندوق رمل منها،
00:16:35أن تسحبه من التخزين أو أي عنوان URL تعطيه إياه ويقوم تلقائياً باستخراج هذا الملف المضغوط في
00:16:40جذر مساحة العمل. لذا تكون جميع الملفات هناك فقط وجاهزة للعمل معها. لذا يتم إنجاز ذلك فقط عن طريق استدعاء
00:16:46sandbox.create. نحن لسنا في الجزء شديد التعقيد من هذا، لكننا سنصل إليه قريباً.
00:16:52شيء آخر هو أنه في هذا المثال، للاختصار، أنا أنشئ صناديق رمل جديدة في كل مرة
00:16:57نقوم بتشغيلها فيها. في الواقع، تريد استخدام التقاط اللقطات (snapshotting) حتى لا تقوم باستمرار مثل كل
00:17:02مرة يتم فيها استدعاء أداة، بإعادة نشر صندوق الرمل أو إعادة بثه من تخزين Vercel الثنائي
00:17:09أو أي تخزين ثنائي سحابي آخر تستخدمه. هناك آلية تخزين مؤقت مدمجة أساساً
00:17:15في المنصة. لقد تخطيتها هنا فقط من أجل البساطة.
00:17:19لذا هذا ينشئ صندوق الرمل وهنا يصبح الأمر مثيراً للاهتمام بعض الشيء.
00:17:23الشيء التالي الذي نحتاج إلى فعله هو أننا بحاجة إلى استخراج معلومات حول الأدوات
00:17:31المعرفة في ذلك العامل من صندوق الرمل الذي أنشأناه للتو.
00:17:36سأتوقف مؤقتاً حقاً هنا حقاً هنا وهناك بعض النصائح التي نثرتها
00:17:40في كل مكان. تريد التأكد بشكل عام، إذا كنت تبني خدمة بمستوى إنتاجي مثل
00:17:44هذه، من أنك تتوقف دائماً، وتبذل قصارى جهدك لإيقاف صناديق الرمل الخاصة بك. لذا في هذه الحالة، ستشاهد
00:17:51ما تفعله دالة extract tools، ولكن عندما ننتهي منها، نتأكد من حذف صندوق الرمل صراحة.
00:17:56في الواقع، تريد أيضاً التأكد من أنك على الأرجح تضع في طابور الانتظار مهمة تنظيف غير متزامنة
00:18:00أو شيء من هذا القبيل. لا تريد أن تبقى صناديق الرمل هذه معلقة إلى أجل غير مسمى.
00:18:06لذا دعونا نلقي نظرة على ما تفعله دالة extract tools. لذا لدينا صندوق الرمل الخاص بنا وأنا حقاً أحب هذه
00:18:15الأمثلة لأنها تبدو سخيفة لمدى بساطتها، لكنها تعمل بشكل جيد جداً جداً. لذا نحن نشغل
00:18:23أمر node فقط باستخدام ثنائي node على صندوق الرمل وفي السكريبت، نقوم باستيراد الوحدة التي
00:18:30كتبها المستخدم، والتي هي ببساطة index.js. نقوم بتحويل هذا الكائن إلى سلسلة نصية (stringifying) ثم نستدعي
00:18:36console.log. الشيء الذي يجب وضعه في الاعتبار هو أن صناديق الرمل ليست مثل خادم ويب حيث يمكنك
00:18:42إرسال طلب والحصول على استجابة مقابلة. كل الإدخال والإخراج يتم عبر تنفيذ أمر وبعد ذلك
00:18:48يمكنك جعله يرسل استجابة إلى بعض الخدمات التي تسحب منها أو في هذه الحالة، يمكنك فقط جعله
00:18:52يسجل إلى مخرج النظام القياسي. بضع نصائح هنا. عادة لا تريد فقط القيام بـ console.log والثقة في كل
00:19:00المخرجات التي تحصل عليها من صندوق الرمل. قد تكون هناك حزم أخرى قام المستخدم بتثبيتها أو
00:19:07كود آخر يقومون بتشغيله ويمكنه تسجيل أشياء في نفس الوقت لبث مخرج النظام القياسي.
00:19:12لذا فإن أحد الأمور الجيدة التي يجب فعلها هو التفاف مخرجاتك في نوع من العلامات التي يمكنك تحليلها.
00:19:18هذه تشبه علامة تشبه XML سنقوم بها هنا. أنا فقط لا أفعل ذلك في المثال.
00:19:23تريد أيضاً التأكد من أنك تحد من حجم السجلات التي تستهلكها. أنا فقط
00:19:29أجمع كل المخرجات في هذا المثال في تدفق (stream). في تطبيق بمستوى إنتاجي، لا تريد
00:19:34فعل ذلك لأن ذلك قد يكون، كما تعلمون، جيجابايت من التدفقات وستتسبب في نفاد الذاكرة (OOM) لخوادمك.
00:19:39لذا توجد أيضاً أوامر تمتلكها واجهة برمجة تطبيقات صندوق الرمل لبث السجلات. ولذا فهذا ما نفعلـ
00:19:45ه مع Notion work هو أننا نستهلك هذا التدفق أساساً حتى نرى بداية رمز المخرج
00:19:53الذي نُعنى به. ثم نبدأ في تخزين ووصف ذلك الوصف مؤقتاً، الشيء الذي سجلناه عمداً.
00:19:58ونتوقف عن معالجة تدفق المخرجات بمجرد أن نصل إلى علامتنا الختامية. لذا هكذا إذا حدث شيء
00:20:04غريب وخاطئ في صندوق الرمل وكانت هناك كميات هائلة من البيانات يتم تسجيلها،
00:20:08فلن تتجمع كلها في الذاكرة. يمكننا فقط تجاهلها والانتظار حتى نحصل على الأشياء التي نُعنى بها.
00:20:14لذا بمجرد تشغيل هذا الأمر، ننتظر حتى ينتهي ونلتقط مخرج النظام القياسي الخاص به.
00:20:22وإذا كنت قد استخدمت شيئاً مثل Zod من قبل، فيجب أن تبدو هذه النظرة مألوفة تماماً. نحن نقوم فقط بتحليل هذا النص كـ JSON.
00:20:27ثم لدينا نوع Zod هنا
00:20:31للتحقق من أنه يمتلك الهيئة التي نريدها.
00:20:34من المهم حقاً عدم الثقة في هذه البيانات لأن هذا كود مستخدم غير موثوق. ليس لديك أي فكرة
00:20:39عما يمكن للناس تسجيله. لذا فأنت تريد التأكد من أنك
00:20:43تقوم التحقق من الحجم والتحقق من هيئته العامة. لذا في هذه الحالة، ما نتوقعه
00:20:50هو سجل تكون مفاتيحه، وهي عبارة عن نصوص، أسماءً لكل أداة من أدواتنا.
00:20:57وستكون الكائنات عبارة عن الوصف ثم مخطط الإدخال، وهو ذلك
00:21:02مخطط JSON. ستلاحظ أن دالة التنفيذ غير موجودة هنا. وهذا ببساطة
00:21:06لا يتم إرجاعه وهو أمر جيد لأن عملية تحويل JSON تتخطى الأشياء التي لا يمكن
00:21:11تسلسلسها. لذا يتم تجاهلها نوعاً ما. وبهذا نحصل فقط على الوصف ومخطط الإدخال منها.
00:21:18لذا بالعودة إلى هنا، لدينا أدوات العامل الخاصة بنا وهي عبارة عن
00:21:23سجل لكل أداة تم توفيرها في ذلك العامل.
00:21:28الشيء التالي الذي نقوم به هو أننا نقوم بطريقة ما بوضع تلك البيانات بالشكل الذي يتوقعه حزمة الذكاء الاصطناعي SDK
00:21:36وعلينا إرفاق دالة تنفيذ بكل واحدة من تلك الأدوات.
00:21:42لذا لم نحصل على دالة تنفيذ بالطبع عندما كنا نقوم بتسجيل الأشياء في مخرجات النظام القياسية.
00:21:46إذن السؤال الآن هو، بما أن لدينا هذا الوصف للأداة، كيف نوفر
00:21:51دالة يمكن للحزمة SDK استدعاؤها في كل مرة تريد فيها استدعاء هذا العامل أو هذه الأداة التي يوفرها
00:21:58هذا العامل؟ إذن لدي هذا الغلاف الصغير هنا المسمى execute tool. ودعنا نلقي نظرة على ما
00:22:04فعله. يجب أن يبدو مألوفاً تماماً الآن. إنه يستدعي نفس دالة إنشاء المساحة المعزولة create sandbox. لذا فهو
00:22:10ينشئ مساحة معزولة جديدة. حتى إذا كنت تستخدم التخزين المؤقت، فهناك ميزة في مساحات Vercel المعزولة تسمى
00:22:16الاستمرارية حيث يقوم في كل مرة يتم فيها تعليق المساحة المعزولة أو توقفها بتخزين الحالة مؤقتاً مثل كل شيء موجود
00:22:23على القرص. بالنسبة لميزة مثل هذه، أنت لا تريد ذلك في الواقع. أنت تريد أخذ لقطة لحالتك الأولية
00:22:28حيث يحتوي على كل كود المستخدم عليه. ولكن بشكل عام، بعد ذلك، تريد التأكد من أن كل
00:22:33مرة يتم فيها تنفيذ هذه الأداة، ربما تريد نسخة جديدة تماماً. بهذه الطريقة، تشغيل واحد للأداة،
00:22:38إذا حدث خطأ ما، فلن يلوث بيئة الأداة التي تعمل بعدها.
00:22:43لذا فإننا نقوم بإنشاء مساحة معزولة جديدة، ونقوم بتشغيل نص نودي آخر عليها. لذا يجب أن يبدو هذا مألوفاً جداً،
00:22:49ولكنه مختلف قليلاً. نحن نقوم باستيراد الوحدة النمطية التي كتبها المستخدم. ونقوم بأخذ
00:22:56الأداة من تلك الوحدة، وهي فقط اسم الأداة الذي حصلنا عليه عندما أنشأنا غلاف تنفيذ الأداة هذا.
00:23:03نحن نستدعي دالة التنفيذ عليها. ونمرر لتلك الدالة المدخلات التي تم
00:23:09توفيرها بواسطة النموذج. هنا أقوم فقط بتعريف هذا على أنه غير معروف unknown. هذا آمن جداً هنا، على الرغم من أننا
00:23:19قدمنا - ألم أفعل ذلك هنا؟ أعتقد أنني ربما تخطيت هذا في هذا المثال. ولكن ما
00:23:27ستفعله عادة هو - أوه، لا، أعتقد أنني فعلت ذلك. دعني أعود إلى هنا. نعم. إذن عندما نقوم نوعاً ما
00:23:34بالتلاعب بأدواتنا لإرسالها إلى الوكيل، فإننا نأخذ مخطط JSON هذا، ونحوله
00:23:39مرة أخرى إلى نوع Zod. لذلك لا داعي لإجراء أي تحليل بأنفسنا. حزمة الذكاء الاصطناعي SDK، وكود وكيل حلقة الأدوات،
00:23:46في كل مرة يتم فيها استدعاء هذه الأداة، ستقوم بالتحقق من صحة المدخلات القادمة من الوكيل نيابة عنا.
00:23:52لذا يمكننا بشكل أو بآخر الوثوق في أن هذه القيمة هي ما نتوقعه أن تكون. لذا سنقوم بتمريرها
00:23:56إلى دالة التنفيذ هنا. ثم عندما تكتمل تلك الدالة غير المتزامنة، سنقوم
00:24:03بتحويلها إلى سلسلة نصية. وسنقوم بتسجيلها في مخرجات النظام. وبعد ذلك سننتظر - سأتطرق إلى
00:24:10هذه الأشياء هنا خلال ثانية. سننتظر حتى يكتمل هذا الأمر. ومرة أخرى، سنقوم بـ
00:24:14حذف مساحتنا المعزولة ونكون قد انتهينا منها. وبعد ذلك سنقوم بتحليل ملف JSON هذا، وهو القيمة المرتجعة
00:24:21لدالة التنفيذ تلك التي كتبها المستخدم. وسنرسل ذلك مرة أخرى إلى وكيل حلقة الأدوات
00:24:26أنتقل. لذا فإن التدفق هنا بشكل أساسي هو أن وكيل حلقة الأدوات يقول، أستريد استدعاء أداة التخطيط للخروج
00:24:35التي رأيناها من قبل حيث يستخدم كل واجهات برمجة التطبيقات الخاصة بالمواصلات. وينتهي ذلك باستدعاء هذه الدالة هنا مع
00:24:40أي مدخلات يقررها الوكيل. نحن نقوم بإنشاء مساحة معزولة باستخدام الملف المضغوط الذي قمنا بتحميله من
00:24:48كود المستخدم المترجم من قبل. ثم نقوم بتشغيل أمر على تلك المساحة المعزولة حيث ندعو
00:24:55دالة التنفيذ الخاصة بالمستخدم. ونحن ننتظر حتى تعود هذه الدالة. وبعد ذلك نقوم بتسجيل تلك القيمة المرتجعة إلى
00:25:00مخرجات النظام، وتحليلها، ثم إرسالها مرة أخرى إلى الوكيل، الذي سيقوم بعد ذلك بمواصلة حلقة
00:25:05الأدوات وإما إجراء استدعاء أداة آخر أو الرد على المستخدم. بضع نصائح سريعة هنا. نفس
00:25:13قواعد التحقق من المخرجات تنطبق في نظام الإنتاج. مرة أخرى، تريد التأكد من أن المستخدمين لا يستطيعون
00:25:19إرجاع كائن يستغرق جيجابايت أو نحو ذلك لتحليله. وتريد أيضاً
00:25:28على الأرجح توفير حزمة تطوير برمجيات SDK. نحن لا نعل ذلك في هذا المثال، ولكن في حزمة Notion Workers SDK،
00:25:35تم إعداد الأنواع بحيث يجب أن تكون القيمة المرتجعة لدالة التنفيذ تلك قابلة للتسلسل كـ JSON.
00:25:41هذا نوع من الفخاخ السهلة حقاً لمستخدميك إذا جعلت الأمر بحيث تستطيع
00:25:47تلك الدالة إرجاع أي شيء، فسينتهي بهم المطاف بإرجاع أشياء لا يمكن تسلسلسها كـ JSON ثم إرسالها عبر
00:25:52الشبكة عبر مخرجات النظام ومن ثم تحليلها. وسيصابون بالارتباك الشديد ولن يفهموا سبب
00:25:57عدم عمل العامل. وبعد ذلك فهذه قصة صغيرة حدثت مع Notion Workers. أنت تريد أيضاً
00:26:05أن تكون دائماً حريصاً جداً على ضمان أن العملية، عملية نود التي تقوم بإنشائها
00:26:11هنا تنتهي مهما حدث. لقد واجهنا خطأ مع Notion حيث كان كود المستخدم يعمل وينتهي نوعاً ما
00:26:18حتى النهاية. ولكن لسبب ما، لم تكن عملية نود هذه تنتهي. كانت تتوقف مؤقتاً حتى نفاد
00:26:25دورة حياة المساحة المعزولة، والتي كانت حوالي خمس دقائق أو نحو ذلك. لذلك لم يكن كارثياً،
00:26:30ولكنه كان يهدر الموارد. وما اكتشفناه أو تذكرناه، لقد نسيت تماماً نوعاً ما أن هذه
00:26:38هي سمة من سمات بيئة تشغيل نود وهي أن المستخدمين كانوا يشغلون كوداً يقوم بإعداد مؤقتات مثل
00:26:44set interval أو set timeout. وخاصة مع الفترات الزمنية أو أعتقد أن الوعود المعلقة ستفعل نفس الشيء.
00:26:52إذا تم تشغيل السكريبت وكان هناك أي فترات زمنية أو أي شيء من هذا القبيل قيد التشغيل، فلن
00:26:58تعود عملية نود أبداً. ولن تعود من تلقاء نفسها حتى تنفد كل تلك المؤقتات. لذا إذا كانت
00:27:03فترة زمنية، فسوف تستمر في العمل إلى الأبد حتى تموت المساحة المعزولة. لذا عليك دائماً التأكد من أنه
00:27:08عندما يكتمل الكود أو الدالة التي تحاول تنفيذها بالفعل، أن تخبر
00:27:14العملية صراحة بالخروج. بهذه الطريقة تتوقف المساحة المعزولة، وتعيد العملية نتيجتها بعد ذلك.
00:27:23إذن هذا هو سير العمل بأكمله تقريباً. سأقوم بتشغيله مرة أخرى وسأقوم بتشغيل
00:27:29وضع تصحيح الأخطاء حتى تتمكن نوعاً ما من رؤية ما يحدث.
00:27:42لذا فإننا ننشر عامل المغادرين الخاص بنا أولاً. سأستعرض هذا خلال ثانية. نحن ننشر
00:27:48عامل المغادرين الخاص بنا عن طريق تحميل تلك الحزمة أولاً. نحن ننشئ مساحة معزولة سنستخدمها لاستخراج
00:27:54معلومات حول هذا العامل. لقد استخرجنا هذه الأدوات. إذن هذا ما نحصل عليه عندما نسجل
00:28:01محتويات الوحدات النمطية في مخرجات النظام. نحصل على مفاتيح كل أداة، والوصف، ومخطط الإدخال.
00:28:08نحن نفعل الشيء نفسه بالنسبة لعامل الترحيب البسيط هذا. ثم نأخذ كل ذلك ونمرره إلى الوكيل حتى
00:28:13يتمكن من إجراء استدعاءات الأدوات والرد على المستخدم. إذن هذا كل شيء تقريباً. هذا مثال بسيط للغاية
00:28:19لكيفية أخذ كود مستخدم غير موثوق به، وتخزينه في مكان ما، والتعرف عليه بطريقة آمنة
00:28:26بحيث يمكنك وضعه في تخزين دائم أو إرساله مباشرة إلى الوكلاء ثم جعل وكلائك ينفذون
00:28:31هذا الكود بأمان. لذلك يتبقى لدينا حوالي 10 دقائق. إذا كان لدى أي شخص أي أسئلة، إذا كنت تريد أن تسأل عن
00:28:39Notion workers أو العمل مع الأشياء الخاصة بمساحات Vercel المعزولة بشكل عام أو تنفيذ الكود غير الموثوق،
00:28:46يسعدني التحدث عن ذلك. شكراً.
00:28:56أوه نعم. وأوه بعد ذلك، إذا كنت تريد التحدث عن منصة مطوري Notion بشكل عام،
00:29:01يمكنك التحدث إلي أو إلى زميلتي MJ هنا. إنها مدير المنتج لمنصة المطورين في Notion.
00:29:08مرحباً. هذا سؤال تشغيلي، ولكن كيف تحدود، نظراً لأنه يبدو وكأن المستخدمين يمكنهم فعل أي شيء.
00:29:15نعم. قد يكون لديك عدة مستخدمين يكتبون أداة متشابهة.
00:29:20مستخدمون متعددون ماذا؟ يكتبون أداة متشابهة. على سبيل المثال، مثل التخطيط لرحلة إلى مدينة نيويورك.
00:29:24نعم. يمكن أن يكون لديك 10 مستخدمين مختلفين لديك 10 رموز مختلفة. نعم. تفعل نفس الشيء.
00:29:29نعم. هل هناك شيء تقومون به لمنع ذلك أم أن الأمر متروك للوكيل فقط؟
00:29:33لا. نحن نتركهم فقط، إذا كان عدة مستخدمين سيفعلون نفس الشيء جميعاً، فنحن نسمح لهم بذلك.
00:29:37إنه سؤال متعلق بالمنتج جزئياً. مثل إذا كان عدة مستخدمين في نفس المؤسسة، كما تعلم،
00:29:42تريد التأكد من ذلك، لذا فهو سؤال تشغيلي، وسؤال متعلق بالمنتج أيضاً.
00:29:46تريد التأكد من أن لديك أساسيات مشاركة جيدة وما شابه. لذا يمكنني
00:29:50البحث والقول مثل، هل هناك بالفعل عامل يقوم بهذه المهمة؟ وبهذه الطريقة لا يقومون
00:29:55بإعادة كتابتها. ولكن على نطاق واسع على مستوى المنصة، نحن لا نفعل أي شيء لـ - من غير المرجح جداً أن يقوم المستخدمون
00:30:02نشر كود متطابق. وليس الأمر يستحق محاولة إزالة التكرار من ذلك.
00:30:19حسناً. نعم. أعتقد أن لدينا بضع أسئلة أخرى. لست متأكداً من لديه الميكروفون.
00:30:24لم أسمعه. أوه، أوه، نعم. أنا آسف جداً.
00:30:29ظننت أنه التقطه في سماعات الرأس.
00:30:33أوه، نعم. السؤال الذي طرح كان، إذا كان لديك الكثير من المستخدمين الذين ينشرون نفس الكود،
00:30:40فهل نفعل أي شيء لتشغيل ذلك بشكل أو بآخر؟ ونحن لا نفعل ذلك. إنه أقرب إلى سؤال متعلق بالمنتج.
00:30:45مثل أننا نريد التأكد من أن المستخدمين لا يعيدون القيام بنفس العمل. لذلك نريد أساسيات مشاركة جيدة
00:30:50نحن نعمل عليها الآن لـ Notion workers. ولكن تشغيلياً على مستوى المنصة،
00:30:54إذا قام الأشخاص بنشر نفس الكود 50 مرة، فنحن لا نبالي.
00:30:56هل تواجهون مشاكل في نفاد وقت تشغيل العمال بسبب المساحة المعزولة
00:31:04حيث يقومون بعملهم ثم تموت مبكراً جداً؟
00:31:07إذن ما هو السؤال بالتحديد حول انتهاء المهلة؟
00:31:10هل تواجهون مشاكل مع انتهاء المهلة بين Vercel، مثل المنتجات الأخرى وسير العمل،
00:31:15على سبيل المثال، أو الدوال ومساحتك المعزولة؟ أم أن الأمر يبدو وكأن كل شيء على ما يرام؟
00:31:20نعم، لم تكن لدينا أي مشاكل في ذلك. لقد كانت المنصة صلبة للغاية بالنسبة لنا
00:31:25حتى الآن. أنا لا أروج لأحد. أنا أتحدث بجدية. لقد كانت جيدة حقاً.
00:31:32نحن نواجه مشاكل أكثر بكثير مع قيام المستخدمين عن طريق الخطأ بعمل الشيء الخاطئ. لذا بمرور
00:31:36الوقت، يتعلق الأمر أكثر بإزالة تلك الفخاخ وجعل المنصة أسهل فأسهل في
00:31:42الاستخدام للمطورين وغير المطورين على حد سواء. رائع. كان ذلك رائعاً. أردت أن أسأل عن،
00:31:48أعتقد، عندما تقوم بتحويل كود المستخدم الأولي إلى سلسلة نصية. أفترض أنك تحاول التأكد
00:31:52إما أنه آمن أو يمكنك تشغيله. أعتقد - أظن أنني أردت أن أسأل قليلاً أكثر.
00:31:57لقد قلت إنك تحول الكود إلى سلسلة نصية وتتحصل، أظن، على علامات العامل للحصول على المدخلات المطلوبة
00:32:04لكود المستخدم ثم وصف لتلك الأداة. هل هذا من أجل notion، أظن،
00:32:10مثل لكي ينفذ وكيلك الكود؟ لأني لاحظت أنك تقوم بتشغيل كود تنفيذ المستخدم
00:32:15أو دالة المنفذ بالفعل. لذا كنت مهتماً بمعرفة لماذا أنت، لا أقول إنك اهتممت، ولكنك تقوم بهذه
00:32:21الخطوة الإضافية للحصول على المدخلات ووصف الأداة نفسها.
00:32:24هذا سؤال جيد. إنه واضح قليلاً في المنتج الحقيقي، ولكنه مبسط هنا.
00:32:29السؤال هو أساساً مثل، لماذا أقوم بتنفيذ كود المستخدم مرة واحدة للحصول على معلومات حول
00:32:34العامل ثم القيام بذلك مرة أخرى عند استدعاء كود الأداة؟ السبب هو أنه قبل أن يتمكن الوكيل
00:32:39من استدعاء الأداة في المقام الأول أو معرفة وجود الأداة، يجب أن نتعرف على
00:32:45محتويات تلك الأداة ثم نعرضها للوكيل من خلال حزمة SDK. إذن ما يحدث في Notion
00:32:50Workers، على سبيل المثال، عندما تقوم بتشغيل شيء مثل NTN Workers Deploy، فإننا نمر عبر خط أنابيب البناء،
00:32:55المساحة المعزولة التي تنفذ عملية البناء تأخذ الأرشيف المضغوط (tarball)، وتضعه في مكان ما في التخزين. نبدأ،
00:33:02أعتقد أننا نقوم بذلك في عامل جديد حيث نستخرج اسم الأدوات والوصافات و
00:33:09المخططات ونخزنها في شيء مثل DynamoDB. بهذه الطريقة، كما تعلم، بعد ذلك، لا نشغل أبداً
00:33:14مساحات معزولة حتى يتم استدعاء الأداة بالفعل. لقد ذكرت نظام الملفات المضغوطة (tarball). أعتقد أن هذا ما أنا
00:33:21فضولي حيال أكثر شيء. من حيث التوزيع، مثل، كيف يعمل ذلك بالضبط عندما يتعلق الأمر بالملف المضغوط؟
00:33:26مثل، هل لديك سوق مفتوح الآن أو كيف يعمل للتوزيع؟
00:33:31أوه، مثل ما الذي يوجد في الملف المضغوط الفعلي؟ نعم، نعم.
00:33:33ليس لدينا، حسناً، من حيث الجانب الميكانيكي لما نفعله، وما يدخل في ذلك الملف المضغوط،
00:33:38فهو، نستخدم فقط ES build الآن لـ، الطريقة التي يعمل بها خط النشر الحقيقي بأكمله هي أنك تشغل
00:33:47NTN workers deploy، وتتصل بنقطة نهاية API، ويحصل جهازك على عنوان URL محدد مسبقاً، ويقوم بتجميع كل
00:33:52الكود المصدر الخاص بك، ونحن ننشئ ملفاً مضغوطاً يحتوي على الكود المصدر، ونشغل عملية بناء باستخدام ES build على
00:33:58تلك المساحة المعزولة، ثم يتم وضع الناتج مرة أخرى في تخزين الكائنات حتى نتمكن من تشغيل الشيء الفعلي
00:34:04من هناك. ليس لدينا سوق حقيقي للعمال حتى الآن. نحن نعمل على أساسيات المشاركة
00:34:11داخل مساحة عمل Notion أولاً، ولكن هناك بالتأكيد خطط لنوع من سوق العمال في المستقبل.
00:34:18في هذه الأثناء، رغم ذلك، يمكنك فقط توزيع هذه على GitHub وهي تعمل بشكل رائع. هذا ما يفعله الناس اليوم.
00:34:23نعم، فقط قم بنشر مستودع ويمكن لشخص ما استنساخه وتشغيل NTN workers deploy واستخدامه بأنفسهم.
00:34:29نعم.
00:34:34أعتقد أن هناك سؤالاً في الخلف هناك.
00:34:37نعم، لذلك لدي سؤال حول الفوترة.
00:34:40حول الفوترة؟
00:34:40نعم، لقد نظرت للتو إلى، أعني، لا تكشف عن كل أسرارك بالطبع،
00:34:44ولكنني أجريت بحثاً سريعاً على جوجل. يبدو أن الوكلاء المخصصين يعملون بنظام رصيد معين. أنا
00:34:48أخمّن أن هذا مرتبط باستهلاك الموارد.
00:34:51نعم، نعم.
00:34:51أعتقد كيف يعمل ذلك مع منصة Vercel بخطوط عريضة؟
00:34:54حسناً، إذن السؤال هو، كيف تعمل فوترة هذه الأشياء مع منصة Vercel؟
00:35:02إذن إحدى فوائد العمال هي أنه يمكنك كتابة هؤلاء - لقد تمكنت الكثير من الفرق من الانتقال من
00:35:08مجموعة تعليمات ضخمة باستخدام خوادم MCP التي يقدمونها لوكلائهم. وفي كل مرة يقومون فيها استدعاء مهمة،
00:35:16سيقضي هذا الوكيل أطنان وأطنان من رموز التفكير في القيام بنفس الشيء مراراً وتكراراً.
00:35:21ولذلك إذا كان بإمكانك أخذ تلك المهام المتكررة التي يقوم بها الوكيل ونشرها كعامل،
00:35:33فستظل تحاسب على وقت تنفيذ العمال الخاص بك، ولكنه أقل تكلفة بكثير من رموز حسابات الذكاء الاصطناعي.
00:35:40لذا إذا كنت تشغل وكيلًا مخصصًا، فإنه يقوم ببعض التفكير، وينفذ أداة، ثم يقوم ببعض التفكير الإضافي.
00:35:48سيتم محاسبتك على استهلاك الرموز في الوكيل المخصص الذي يقوم به قبل استدعاء الأداة.
00:35:53لذا عندما تعمل الأداة، تتم محاسبتك بمعدل مختلف يستهلك رصيدك، رصيد Notion AI الخاص بك بمعدل أقل بكثير، بكثير، بكثير.
00:36:01وبعد ذلك تتم محاسبتك، كما تعلم، بأرصدة الذكاء الاصطناعي العادية مرة أخرى عندما يستجيب الوكيل أخيرًا.
00:36:05لذا فهذه طريقة إذا كنت تستخدم وكلاء Notion المخصصين، فيمكنك تقليل التكلفة كثيراً إذا كان لديك مهام متكررة.
00:36:16هذا صحيح أيضاً. ليس عليك أيضاً امتلاك Notion AI، مثل أنهم ليسوا كذلك - نحن نعرض استدعاءات الأدوات هنا، والتي تتكامل مع Notion AI.
00:36:24ولكن العمال يقومون أيضاً بمزامنة طرف ثالث في Notion. لذلك لا يتطلب ذلك أي ميزات ذكاء اصطناعي على الإطلاق.
00:36:31إذن هو ليس مجرد منتج ذكاء اصطناعي. الناس يستخدمون ذلك للمزامنة.
00:36:36لدي عمال يقومون بمزامنة موجز letterbox الخاص بي في Notion. هذا هو أهمها بالنسبة لي شخصياً.
00:36:46حسناً. أي شيء آخر؟
00:36:52هل لديك سؤال آخر؟
00:37:06أوه، مثل عرضهم من خلال مستخدم الخاص بك، مثل عرض وكلاء Notion المخصصين من خلال واجهتك الخاصة.
00:37:13إنه ليس شيئاً نمتلكه اليوم.
00:37:16أنا آسف. شكرا لك، MJ. كان السؤال، إذا كان لديك عمالك الخاصون ووكلاؤك المخصصون،
00:37:22فهل هناك طريقة يمكنك من خلالها عرضهم من خلال تطبيقك الخاص لمستهلكيك الخاصين؟
00:37:28واليوم لا توجد طريقة للقيام بذلك. لدينا نوع من إصدار ألفا لواجهة برمجة تطبيقات الوكلاء المخصصة حيث يمكنك
00:37:35بالتأكيد القيام بذلك. إذا قمت بتحديد وكلاء وعمال مخصصين أو وكلاء مخصصين في مساحة عملك،
00:37:40يمكنك استخدام واجهة برمجة تطبيقات لاستدعاء هؤلاء الوكلاء ثم الحصول على استجابة متدفقة. لذلك هذا ممكن.
00:37:46لا أعتقد أن طناً من الناس يقومون بذلك حتى الآن. وتلك ميزة لا تزال في مرحلة ألفا، عامة ولكنها في مرحلة ألفا.
00:37:57أسئلة أخرى؟
00:38:00حسناً. رائع. حسنًا، شكرا لكم جميعا على قضاء الوقت
00:38:04لقد حان وقت القدوم للاستماع إلى هذا اليوم. ونعم، إذا كان لديك أسئلة حول Notion و Notion workers،
00:38:08أو Vercel Sandbox، تعال وابحث عن NJRI. شكراً.

Key Takeaway

تتيح منصة Notion Workers للمطورين بناء ونشر أدوات مخصصة لتوسيع نطاق Notion وتنفيذ كود غير موثوق بأمان تام باستخدام بيئة Vercel Sandbox.

Highlights

  • تعتمد أداة Notion Workers على Vercel Sandbox لتشغيل كود JavaScript و TypeScript المخصص بشكل آمن ودون الحاجة لإدارة البنية التحتية.

  • تتيح Notion Workers للمطورين مزامنة بيانات الطرف الثالث مع Notion أو كتابة استدعاءات أدوات مخصصة للوكلاء.

  • تتطلب عملية استخراج أدوات العامل تشغيل الكود في صندوق رمل (Sandbox) وتسجيل محتويات الوحدة النمطية في مخرج النظام القياسي لتحليلها.

  • تتطلب بيئة Node.js إنهاء العمليات صراحة عند اكتمال الكود لمنع تسرب الموارد بسبب المؤقتات المعلقة مثل set interval أو set timeout.

  • تساهم Notion Workers في تقليل استهلاك رموز الذكاء الاصطناعي والتكاليف عبر استبدال المهام المتكررة التي يقوم بها الوكيل.

Timeline

نظرة عامة على Notion Workers والبنية التحتية

  • تُمكّن Notion Workers المستخدمين من كتابة كود مخصص لتوسيع وظائف Notion ومزامنة بيانات الطرف الثالث.
  • تم اختيار Vercel Sandbox لحل تحديات الأمان ومشاركة الموارد الصعبة عند تشغيل كود مستخدم غير موثوق.
  • تتضمن التحديات الأمنية منع كود المستخدم من الوصول إلى قواعد بيانات Notion أو التأثير على مستخدمين آخرين.

تستعرض هذه القسم مفهوم Notion Workers كأداة تطوير تتيح للمطورين بناء تكاملات مخصصة ووظائف متقدمة دون الحاجة لإدارة البنية التحتية الخاصة بها. يوضح الشرح المخاوف الأمنية المرتبطة بتشغيل كود غير موثوق، مثل تعدين العملات الرقمية واستهلاك الموارد بشكل غير عادل. تم الاعتماد على Vercel Sandbox لتجاوز هذه التعقيدات البنيوية وتوفير بيئة تشغيل صلبة وآمنة.

كيفية عمل العمال واستدعاء الأدوات

  • يتم تعريف كل عامل في ملف يحتوي على اسم الأداة، والوصف، ومخطط الإدخال، ودالة التنفيذ.
  • تعتمد العروض التوضيحية على استدعاء أدوات مثل التحقق من تراجع كوكب عطارد أو التخطيط للرحلات.
  • تستفاد أدوات الوكيل من Vercel blob storage لتخزين الحزم المصدرية ونشرها.

يتم التركيز في هذا القسم على الهيكل البرمجي لأدوات Notion Workers وكيفية تعريفها باستخدام وحدات JavaScript و TypeScript. يوضح الشرح كيفية استخدام Vercel AI SDK وحلقة وكيل الأدوات لتنفيذ مهام معقدة مثل تخطيط المسارات في مدينة نيويورك باستخدام واجهات برمجة تطبيقات الموقع الجغرافي.

استخراج الأدوات وتنفيذها داخل صندوق الرمل

  • تتم استخراج معلومات الأدوات عبر تشغيل كود المستخدم في صندوق رمل وتسجيله في مخرج النظام القياسي.
  • يتم التحقق من صحة المدخلات والمخرجات باستخدام Zod لضمان سلامة البيانات المتداولة.
  • تتطلب عملية إدارة صناديق الرمل حذفها صراحة بعد الانتهاء لتجنب استهلاك الموارد.

يشرح هذا القسم الآلية التقنية لتحويل كود المستخدم غير الموثوق إلى أدوات متاحة للوكيل. يتم إنشاء صندوق رمل مؤقت، واستيراد ملف index.js الخاص بالمستخدم، وتسجيل معلومات الوحدة لتحليلها. كما يتم التطرق إلى أهمية إنهاء عمليات Node.js صراحة لمنع توقف العمليات بسبب المؤقتات المعلقة وفترات الانتظار الطويلة.

الأسئلة والأجوبة حول المنصة والفوترة

  • لا تقوم المنصة بإزالة تكرار الأداة إذا قام عدة مستخدمين بنشر كود متطابق، بل تعتبره سؤالاً متعلقاً بالمنتج.
  • تتم فوترة تشغيل العمال بمعدل أقل بكثير مقارنة باستهلاك رموز حسابات الذكاء الاصطناعي.
  • تتيح Notion Workers مزامنة البيانات للطرف الثالث حتى دون استخدام ميزات الذكاء الاصطناعي.

تتضمن هذه الجلسة الختامية إجابات حول تساؤلات المستخدمين المتعلقة بإدارة الأكواد المتطابقة وتكاليف التشغيل. يوضح النقاش أن استخدام العمال يقلل التكلفة الإجمالية للذكاء الاصطناعي من خلال معالجة المهام المتكررة خارج نطاق رموز التفكير الباهظة. كما يناقش الحضور إمكانية توسيع استخدام العمال لتشمل مزامنة التطبيقات الخارجية مثل Letterbox.

Community Posts

View all posts