ورشة عمل 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. شكراً.