إنتقل إلى المحتوى الرئيسي

Work: مساحات العمل المعزولة

Work هو واجهة وكيل البرمجة الأصلية في Libre WebUI. تجمع كل مهمة Work محادثة دائمة ومسارًا صريحًا إلى موفّر نموذج ونظام ملفات مخصصًا في /workspace. يستطيع النموذج المحدد فحص الملفات وتحريرها، وتشغيل أوامر داخل حاوية Docker أو Pod في Kubernetes مخصص للمهمة، وبدء معاينة في المتصفح.

يُنفذ Work مباشرة داخل Libre WebUI. ولا يحتاج إلى Libre Claw أو daemon وكيل آخر.

للمستخدمين الموثوقين فقط

تتطلب كل واجهة Work حسابًا موثّقًا يملك حق الوصول إلى Work. ويعني ذلك افتراضيًا المسؤولين فقط؛ ويمكن لمسؤول فتح Work لكل المستخدمين النشطين من تبويب إدارة المستخدمين في الإعدادات (وتظل مساحات مجلدات المضيف للمسؤولين فقط في كل الأحوال، لأنها تركّب مسارات الخادم). يتيح Work عمدًا للنموذج تنفيذ أوامر shell اعتباطية داخل بيئة معزولة. تستخدم المهام خروج الشبكة إلا إذا عطّلته سياسة وقت التشغيل المسماة المحددة. اعتبر كل من تمنحه وصول Work مشغّل وقت تشغيل موثوقًا، لا مجرد مستخدم محادثة.

أبرز ما في الإصدار

يقدم هذا الإصدار Work كسير مهام كامل:

  • إجراءا Work وChat مستقلان في الشريط الجانبي الرئيسي، مع إظهار الوضع النشط بوضوح.
  • مهام Work في الشريط الجانبي المعتاد بدل شريط مهام ثانٍ. تظل مواضع المهام ثابتة أثناء تحديث عمليات التشغيل، ويمكن حذف المهمة المحددة مباشرة.
  • هوية بيئة معزولة مستقلة ووحدة Docker دائمة أو PVC في Kubernetes لكل مهمة. يمكن إيقاف البيئات أو إعادة إنشائها من دون حذف ملفات المهمة.
  • محادثة دائمة وحالة التشغيل ونشاط الأدوات واختيار النموذج وملكية المهمة في قاعدة بيانات Libre WebUI.
  • تدفق تشغيل مباشر وموثّق لنص المساعد والاستدلال الذي يكشفه الموفّر واستدعاءات الأدوات ونتائجها والاستخدام ومهارات العامل وتغييرات الحالة.
  • مهارات عامل يملكها الخادم تعلّم النموذج المحدد كيف يفحص ويحرر ويتحقق ويعاين بكفاءة، من دون كتابة ملفات تحكم داخل المشروع.
  • نماذج Ollama المحلية الداعمة للأدوات ونماذج Ollama Cloud وإضافات الإكمال أو المحادثة المعدّة.
  • تقسيم متجاوب بين المحادثة ومساحة العمل، قابل للسحب والوصول بلوحة المفاتيح على سطح المكتب، مع مفتاح للسطح المركز على الشاشات الأصغر.
  • عروض مضمّنة للملفات والنشاط وGit والطرفية والمعاينة والشاشة؛ وعرض الشاشة هو سطح Work Computer القابل للمشاهدة والتعليم.
  • تلوين نحوي في الوضعين الداكن والفاتح، وتنسيق الشيفرة في المتصفح، واكتشاف تعارضات الحفظ، ومسودات مؤقتة غير محفوظة.
  • إفصاح يمكن لكل مستخدم إخفاؤه عند تحديد موفّر نموذج بعيد.
  • ترجمات Work كاملة لكل اللغات الـ25 المدعومة، بما فيها تخطيط عربي أصلي من اليمين إلى اليسار مع بقاء الشيفرة والمسارات ومعرّفات النماذج ومخرجات الأوامر من اليسار إلى اليمين.

الوحدة الدائمة هي مساحة عمل المهمة، لا حاوية تعمل باستمرار. يبدأ Libre WebUI حاوية المهمة ويوقفها وقد يعيد إنشاءها حسب الحاجة، مع الاحتفاظ بوحدتها المسماة.

البنية

يختار Libre WebUI — لا النموذج أو المتصفح — أسماء البيئة ومساحة العمل والصورة والتركيب والمستخدم والحدود ووضع الشبكة ومنفذ المعاينة. ولا يتلقى النموذج إلا هذه الأدوات:

  • list_files
  • read_file
  • write_file
  • delete_file
  • move_file
  • search_files
  • run_command
  • start_preview
  • stop_preview

تخضع delete_file وmove_file لحراسة المسارات مثل بقية أدوات الملفات: ترفضان مغادرة مساحة العمل، ولا تعبران الروابط الرمزية، وتتطلبان علامة تكرار صريحة قبل حذف دليل، ولا تستبدلان وجهة نقل أبدًا. ولأنهما تعملان عبر مساعد الملفات لا shell، فإنهما تعملان أيضًا أثناء تشغيل معاينة عندما تكون run_command محجوبة.

ترسل الواجهة الخلفية لـLibre WebUI طلبات النماذج. ولا تنشأ من حاوية Work أو تعتمد على سياسة شبكتها.

المتطلبات

يحتاج Work إلى واجهة خلفية معدّة للبيئة المعزولة:

  • تحتاج الواجهة الافتراضية إلى Docker مثبّت وdaemon يمكن الوصول إليه وصلاحية لعملية الواجهة الخلفية لاستدعاء docker (أو الملف التنفيذي المعدّ عبر WORK_DOCKER_COMMAND).
  • تحتاج واجهة Kubernetes إلى بيانات اعتماد API، وإلى Role وRoleBinding ومساحة أسماء البيئات وNetworkPolicies التي ينشئها مخطط Helm عند work.enabled=true.

وتحتاج كل واجهة خلفية أيضًا إلى:

  • نموذج داعم للأدوات، متاح عبر:
    • خدمة Ollama سليمة، بما فيها النماذج التي يصل إليها Ollama Cloud؛ أو
    • إضافة إكمال/محادثة نشطة مع نموذج مضبوط بدقة وبيانات اعتماد للمسؤول الحالي.
  • تخزين وقت تشغيل كافٍ للصورة والمشروعات المولّدة والتبعيات المحلية للمشروع.
  • حساب موثّق يملك وصول Work. يقتصر Work على المسؤولين افتراضيًا؛ ويمكن لمسؤول فتحه لكل المستخدمين النشطين.

يتحقق Libre WebUI من إمكانات النموذج التي يعلنها Ollama قبل إنشاء تشغيل، ويرفض نموذج Ollama لا يعلن tools. ويجب أن تدعم النماذج المدعومة بإضافات بروتوكول استدعاء الأدوات لدى موفّرها. إذا رفض النموذج البعيد المحدد الأدوات، يفشل التشغيل؛ ولا ينتقل Work بصمت إلى نموذج أو موفّر آخر.

البدء محليًا

لأبسط إعداد Work مدعوم، شغّل Libre WebUI وDocker على الحاسوب نفسه الذي يشغّل المتصفح:

docker info
npx libre-webui@latest

افتح http://localhost:8080، وسجّل الدخول كمسؤول، واختر Work في الشريط الجانبي، واختر نموذجًا متوافقًا، ثم صف المشروع أو التغيير.

إذا كان Docker مفقودًا أو متوقفًا أو غير قابل للوصول، يعرض Work وقت التشغيل غير متاح مع سبب الواجهة الخلفية، ويعطّل محرر التشغيل. ولا يعود Libre WebUI أبدًا إلى تشغيل أوامر Work مباشرة على المضيف.

تُفحص صورة وقت التشغيل عند أول استخدام، وتُسحب تلقائيًا عند غيابها. لذلك قد تستغرق العملية الأولى وقتًا أطول من العمليات اللاحقة.

استخدام واجهة Work

إنشاء المهام والعودة إليها

اختر Work بجوار Chat في الشريط الجانبي. أدخل تعليمات، واختر نموذجًا، ثم اختر تشغيل. تنشئ الرسالة الأولى المهمة وتشغيلها الأول ومسار موفّرها ومساحة عملها الدائمة.

تبقى كل مهمة في الشريط الجانبي الرئيسي. تؤدي إعادة فتحها إلى استعادة محادثتها الحديثة وعرض الملفات واختيار الموفّر/النموذج الحالي ومساحة العمل. ويمكن تحميل رسائل المحادثة الأقدم في صفحات. تستطيع إعادة تسمية المهمة من عنوانها وحذفها نهائيًا من قائمة المهمة المحددة أو الشريط الجانبي.

لا يمكن أن ينشط أكثر من تشغيل واحد للمهمة. تنشئ تعليمات لاحقة تشغيلًا آخر على المحادثة ونظام الملفات نفسيهما.

يدعم محرر الرسائل الإملاء: يستخدم زر الميكروفون واجهة الكلام في المتصفح حيثما توفرت، أو نموذج تحويل الكلام إلى نص معدًّا كحل احتياطي، ويضيف النص المنسوخ إلى ما كُتب بالفعل. وفي المحادثة، تظهر الملفات التي أنشأها التشغيل أو نقلها كشرائح قابلة للنقر أسفل نشاط الأداة الذي أنتجها؛ يؤدي النقر إلى فتح الملف في محرر الملفات داخل مساحة العمل (والانتقال إلى سطح مساحة العمل على الشاشات الضيقة). لا تأتي الشرائح إلا من الأدوات التي تغيّر الملفات، لذلك فإن تشغيلًا قرأ عشرين ملفًا وكتب ملفًا واحدًا يعرض ذلك المنتج الواحد بالضبط.

توظيف وكيل

تعرض صفحة البداية التوظيف كوكيل عندما تكون لديك شخصيات: اختر إحداها فتصبح المهمة المنشأة وكيلًا دائمًا ذا اسم بدل مهمة لمرة واحدة. يحتفظ الوكيل بشخصيته عبر عمليات التشغيل؛ ويُضاف اسم الشخصية ومطالبة نظامها قبل مطالبة نظام Work (ويبقى عقد وقت تشغيل البيئة المعزولة هو صاحب الأولوية دائمًا). ويثبّت الشريط الجانبي الوكلاء في مجموعة الوكلاء الخاصة بهم فوق المهام المؤقتة، مع صورة الشخصية ومؤشر نشاط وسطر حالة واحد لكل وكيل. وعندما يكون الشريط الجانبي مضغوطًا، لا تبقى في الشريط سوى صور الوكلاء المثبّتين تلك؛ وتعود مهام Work المؤقتة عند توسيع الشريط الجانبي.

لسطر الحالة مستويان. بالنسبة إلى الوكلاء الموظفين، يطلب طلب نموذج واحد قليل التكلفة وبلا أدوات في نهاية التشغيل حالة من نحو 8 كلمات ("Inbox at zero. 2 replies ready."). تُحد الإجابة في سطر واحد من 90 حرفًا، ويعود أي فشل أو انتهاء مهلة إلى المستوى الحتمي: السطر الأول من رسالة المساعد النهائية. لا تستخدم المهام المؤقتة وعمليات التشغيل الفاشلة إلا المستوى الحتمي، ويؤدي WORK_STATUS_BLURB_MODEL=0 إلى تعطيل طلب النموذج تمامًا. يحمل الوكلاء أيضًا مؤشرًا لغير المقروء: يؤدي فتح المهمة إلى تقديم علامة المشاهدة الخاصة بها (متزايدة فقط ومتزامنة بين الأجهزة)، ويعرض الشريط نقطة عندما يبلغ تشغيل حالة نهائية بعد تلك العلامة.

يبلغ الوكلاء عن حياتهم عبر التنبيهات أيضًا، داخل التطبيق وعبر Web Push عند تفعيله: work-run-finished عند اكتمال تشغيل، وwork-run-attention عند توقفه لطلب إدخال أو فشله، وwork-takeover لحظة طلب الوكيل من شخص تولي شاشته (لا تظهر لافتة الشاشة إلا أثناء فتح علامة الشاشة، لذلك يصل إليك التنبيه الفوري في مكان آخر). يرتبط كل تنبيه مباشرة بالوكيل.

يمكنك التوظيف باستخدام شخصية تملكها أو شخصية مشتركة معك؛ ولا يكشف العرض المشترك ذكريات شخصية مالكها أبدًا. إذا حُذفت الشخصية لاحقًا، يواصل الوكيل العمل من دونها ويُسجّل تحذير. تقبل API الحقلين personaId وisAgent عند إنشاء المهمة؛ وتصبح المهمة المنشأة مع شخصية وكيلًا تلقائيًا.

علامة الوكيل

تفتح لوحة مساحة عمل الوكيل على علامة أولى إضافية، الوكيل، وهي صفحة الوكيل:

  • الهوية: صورة الشخصية واسمها ومؤشر النشاط وأحدث سطر حالة.
  • الشاشة: عندما تمنح سياسة المهمة Work Computer، تعرض صورة مصغرة مباشرة للقراءة فقط من شاشة الوكيل. وهي عارض حقيقي (يُحتسب من ميزانية المشاهدين لكل مهمة)؛ يؤدي النقر عليها إلى فتح علامة الشاشة الكاملة حيث توجد إمكانات التحكم والتعليم والصوت.
  • الروتينات: عمليات الأتمتة المرتبطة بهذه المهمة. يعمل كل حدوث داخل مساحة عمل الوكيل ومحادثته باستخدام نموذجه ووقت تشغيله، لا في مهمة جديدة، لذلك يتراكم روتين موجز الصباح في مكان واحد. تعرض الصفوف الجدول بالكلمات مع مفتاح إيقاف/استئناف، ويكون نموذج + روتين المضمّن مرتبطًا بالوكيل مسبقًا. يفشل الحدوث الذي ينطلق أثناء انشغال الوكيل بصدق بوصف work-task-busy بدل وضعه في طابور.
  • المراجعة التلقائية: مفتاح الاعتمادات الخاص بالوكيل وقواعد «السماح دائمًا» التي جمعها؛ وحذف قاعدة يعيد إغلاق نطاقها. وعندما تفرض سياسة المهمة المراجعة، يبقى المفتاح مقفلًا في وضع التشغيل.
  • المهارات المعلّمة: إجراءات عُرضت في وضع التعليم، مع مفتاح تفعيل/تعطيل لكل مهارة.

الأدوات المتصلة (خوادم MCP وOpenAPI)

يستطيع وكلاء Work استدعاء خوادم الأدوات نفسها المهيأة للدردشة، سواء كانت MCP أو OpenAPI، والمسجلة من المسؤول تحت الإعدادات ← الأدوات. تظهر الأدوات للوكيل بأسمائها ضمن نطاق الخادم (server__tool)، وتنطلق الاستدعاءات من واجهة Libre WebUI الخلفية عبر بوابة الأدوات المحصّنة (خروج محمي من SSRF، وبيانات اعتماد لكل مستخدم، وحدود للحجم والزمن)، لا من داخل البيئة المعزولة أبدًا.

ويبقى العرض صادقًا بشأن ما يمكن لتشغيل مستقل أن يستخدمه فعلًا:

  • المهمة دون اتصال لا تُعرض عليها أدوات: سواء مرّ الخروج عبر الواجهة الخلفية أو لا، تبقى المهمة المحرومة من الشبكة دون اتصال، للسبب نفسه الذي ينطبق على web_search.
  • الخادم الذي يتطلب بيانات اعتماد شخصية لم يخزّنها المستخدم يُستبعد عند العرض، لأن التشغيل المستقل لا يستطيع التوقف ليطلبها. أضف بيانات الاعتماد تحت الإعدادات ← الأدوات ليعرض التشغيل التالي ذلك الخادم.
  • ينطبق وضع الوصول إلى الأدوات (المسؤولون وحدهم أو كل المستخدمين) وظهور كل خادم تمامًا كما في الدردشة، كما تحصر خوادم الأدوات المرتبطة بشخصية ما يراه الوكيل الموظف بها.
  • عندما تكون الاعتمادات نشطة، تتوقف الأدوات المتصلة التي يصنفها الخادم ذات أثر بانتظار قرارك مثل أي إجراء خاضع للتحكم؛ أما أدوات القراءة فتعمل بلا سؤال.

التفويض بين الوكلاء (الإشارة بـ@)

يستطيع الوكلاء الموظفون تسليم العمل بعضهم إلى بعض. اكتب @ في محرر Work للإشارة إلى وكيل آخر من وكلائك؛ فيرى الوكيل الحالي في تعليماته قائمة أقرانه بأسمائهم وأسطر حالتهم، ويفوّض الطلبات المناسبة بأداة message_agent. التفويض تنسيق عبر الرسائل، وليس عبر حواسيب مشتركة عن قصد: يحتفظ كل وكيل بمساحة عمله وبيئته المعزولة الخاصتين، ولا يرى الوكيل الهدف المحادثة المفوِّضة، لذا يجب أن يحمل الطلب سياقه بنفسه.

والتفويض غير متزامن. تعود الأداة فورًا، ويعمل الوكيل الهدف داخل مهمته الخاصة (وتعرض محادثته الطلب بوسم مفوَّض من المرسل)، وعند انتهائه — مكتملًا أو محتاجًا إلى إدخال أو فاشلًا أو ملغى — تُسلَّم استجابته النهائية إلى محادثة الوكيل المفوِّض كرسالة بوسم تقرير من ذلك الوكيل. فإن كان المفوِّض لا يزال يعمل، بلغ التقرير نموذجه في الجولة التالية؛ وإن كان خاملًا، انتظر التقرير في المحادثة فحسب، إذ لا يبدأ تقرير تشغيلًا من تلقاء نفسه، فلا يمكن لوكيلين أن يتقاذفا الطلبات بلا نهاية. ولا يستطيع التشغيل المفوَّض أن يفوّض بدوره، ويفشل الهدف المشغول المحاولةَ بصدق بدل وضعها في طابور، وعندما تكون الاعتمادات نشطة تتوقف message_agent للمراجعة مثل أي إجراء آخر ذي أثر (وتقتصر قاعدة «السماح دائمًا» عندئذٍ على ذلك الوكيل الهدف وحده).

اعتماد الإجراءات (المراجعة التلقائية)

يمكن للإجراءات ذات الأثر أن تتوقف بانتظار قرارك قبل تنفيذها. فعندما تكون الاعتمادات نشطة لمهمة ما — لأن سياسة Work الخاصة بها تضبط اشتراط الاعتماد للإجراءات ذات الأثر، أو لأن مفتاح المراجعة التلقائية لدى الوكيل مفعّل — يتوقف التشغيل قبل تنفيذ run_command أو computer_act أو delete_file أو move_file أو message_agent، ويعرض بطاقة قرار في المحادثة: السماح مرة أو السماح دائمًا أو الرفض.

  • السماح مرة ينفّذ هذا الاستدعاء وحده ويسأل مجددًا في المرة التالية.
  • السماح دائمًا ينفّذ الاستدعاء ويحفظ قاعدة على المهمة: على مستوى الأداة كلها في إجراءات الملفات والحاسوب، ومحصورة ببرنامج الأمر (كلمته الأولى) في run_command — فاعتماد npm run build يعتمد مسبقًا أوامر npm اللاحقة لا الصدفة بأكملها — ومحصورة بالوكيل الهدف وحده في message_agent. وتُدرج القواعد في فقرة المراجعة التلقائية داخل علامة الوكيل، ويمكن حذفها من هناك.
  • الرفض يرفض الاستدعاء. ويُبلَّغ النموذج بأن المستخدم رفض الإجراء وبأنه يجب ألا يعيد المحاولة كما هي؛ ويمضي التشغيل بهذه الإجابة.

كما يثير الاعتماد المعلّق تنبيهًا (داخل التطبيق، وعبر الويب إذا كان مفعّلًا)، لأن التشغيل قد يكون قد أمضى دقائق من العمل دون إشراف حين بلغ هذه النقطة. وإذا لم يقرر أحد خلال خمس دقائق، انتهت صلاحية الطلب، ولم يُنفَّذ الإجراء، وانتهى التشغيل إلى يحتاج إلى إدخال مع تسليم طبيعي بدل استنفاد ميزانيته.

تتحكم الاعتمادات في الإجراءات لا في الاطلاع: تبقى write_file وأدوات القراءة خارج التحكم، ويصل كل قرار إلى سجل التدقيق الأمني.

فهم حالة المهمة

تربط الواجهة حالات الواجهة الخلفية الدائمة بمجموعة أبسط للمستخدم:

حالة الواجهةحالة الواجهة الخلفيةلون المؤشر
خاملidlergb(255, 255, 255)
يفكرpreparing أو runningrgb(48, 121, 255)
مكتملcompletedrgb(76, 212, 117)
يحتاج إلى إدخالneeds_input أو cancelledrgb(255, 204, 0)
خطأfailedrgb(255, 61, 129)

يغيّر إيقاف تشغيل نشط حالته إلى يحتاج إلى إدخال ويحفظ ملفاته. كما يؤدي نفاد ميزانية الجولات أو أمان استدعاءات الأدوات إلى يحتاج إلى إدخال بعد التسليم النهائي بلا أدوات، فلا يُسمى العمل غير المكتمل مكتملًا أبدًا.

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

تغيير حجم مساحة العمل

عند نقطة سطح المكتب xl، تتشارك المحادثة ومساحة العمل تقسيمًا قابلًا للسحب:

  • العرض الافتراضي للمحادثة 45%.
  • النطاق المفضل من 30% إلى 70%، مع مراعاة الحد الأدنى لعرض المحتوى.
  • تُحفظ النسبة للمستخدم المسجل دخوله في ذلك المتصفح.
  • تحرك مفاتيح الأسهم الفاصل بنسبة 2%؛ اضغط Shift لنسبة 10%.
  • يختار Home وEnd الحد الأدنى والأقصى المتاحين.
  • يعيد Enter أو النقر المزدوج التقسيم إلى الوضع الافتراضي.

تتبع عناصر التحكم اتجاه الكتابة النشط. في العربية، تكون المحادثة على اليمين ومساحة العمل على اليسار، ويظل تغيير الحجم بالمؤشر والأسهم يعمل في الاتجاه المرئي المتوقع.

على الشاشات الأصغر، استخدم عنصر المحادثة/مساحة العمل في رأس المهمة للتبديل بينهما.

الملفات

تتصفح علامة الملفات الأبناء المباشرين لـ/workspace، ولا تفتح إلا ملفات نص UTF-8 صالحة بدقة، وتحفظ التغييرات إلى وحدة المهمة. تُرفض تسلسلات البايت غير الصالحة بدل استبدالها بمحارف بديلة تفقد المعلومات.

يوفّر المحرر:

  • تلوينًا نحويًا في الوضعين الفاتح والداكن للغات الويب والأنظمة والبرامج النصية والبيانات والعلامات الشائعة؛
  • Cmd/Ctrl+S للحفظ؛
  • Shift+Alt+F لتنسيق الملفات المدعومة؛
  • اكتشافًا تفاؤليًا لتعارض الحفظ، كي لا تستبدل شاشة محرر قديمة بصمت ملفًا تغيّر منذ فتحه؛
  • مسودات غير محفوظة بحسب المهمة والمسار في تخزين جلسة المتصفح؛ و
  • تحذيرات تنقل عند وجود تعديل غير محفوظ.

يتوقف التلوين المباشر فوق 8,000 حرف أو 400 سطر للحفاظ على استجابة المحرر. ويتوفر التنسيق حتى 100,000 حرف و4,000 سطر لـJavaScript/JSX وTypeScript/TSX وتنويعات JSON وCSS/SCSS/Less وHTML وMarkdown/MDX وYAML.

عندما يغيّر النموذج ملفًا مفتوحًا لديك، تفتح علامة الملفات عرض تغييرات أحمر/أخضر يوضح بالضبط ما أُضيف وحُذف منذ بداية المداخلة، مع طي المقاطع الطويلة غير المتغيرة. يبدّل زر شريط الأدوات بين الفرق والمحرر، وتلخص عدادات +added −removed المداخلة بسرعة. خط الأساس للمقارنة هو آخر محتوى رآه متصفحك قبل المداخلة، لذلك لا تعرض الملفات التي فُتحت لأول مرة بعد المداخلة فرقًا.

مسودات المتصفح وسيلة راحة، لا نسخة احتياطية. تُمسح بعد حفظ ناجح أو حذف المهمة، وتختفي عادة عند انتهاء جلسة المتصفح.

النشاط

تعرض علامة النشاط استدعاءات الأدوات ونتائجها وعمليات الملفات ومخرجات الأوامر والأخطاء. ويمكن توسيع بيانات الأدوات الوصفية في المحادثة. تظهر مخرجات الأوامر والأدوات من اليسار إلى اليمين حتى عندما تكون الواجهة المحيطة من اليمين إلى اليسار.

أثناء التشغيل، يفتح Libre WebUI تدفق أحداث مرسلة من الخادم وموثّقًا، ويعرض التقدم كلما تلقته الواجهة الخلفية. يستطيع التدفق حمل:

  • snapshot أولية وتغييرات run_state لاحقة؛
  • reasoning_delta عندما يكشف الموفّر المحدد الاستدلال صراحة؛
  • نص assistant_delta؛
  • نشاط tool_call وtool_result؛
  • قياسات usage؛
  • تنبيهات skill_loaded لإرشادات العامل التي يقدمها الخادم؛ و
  • أحداث error أو done النهائية.

يعتمد توفر الاستدلال ودقته على النموذج والموفّر. لا يعرض Libre WebUI إلا محتوى الاستدلال الذي يعيده الموفّر عبر API؛ ولا يستطيع استعادة سلسلة تفكير مخفية، ولا تقدم بعض النماذج تدفق استدلال. يظل نص المساعد ونشاط الأدوات متدفقين عندما يُدعمان بصورة مستقلة عن الاستدلال.

المخرجات محدودة عمدًا. لا تثبت النتيجة المقتطعة أن الأمر لم ينتج مخرجات إضافية؛ اطلب من النموذج فحص نتيجة أضيق أو تشغيل أمر أكثر تركيزًا.

Git

تقدم علامة Git عمليات تحكم بالمصدر محلية لمساحة /workspace الخاصة بالمهمة:

  • تهيئة مستودع بفرع main؛
  • فحص حالة porcelain وأعداد التقدم/التأخر وحتى 20 commit حديثًا؛
  • فحص فرق نصي محدود لمسار متغير؛
  • إضافة حتى 200 مسار محدد صراحة إلى منطقة التجهيز في المرة الواحدة؛
  • تنفيذ commit للتغييرات المجهزة باسم المستخدم والبريد للمسؤول المسجل، أو عنوان محلي لا يرد في المثيل عندما لا يملك الحساب بريدًا؛
  • إنشاء فرع محلي بعد أول commit؛ و
  • الانتقال إلى فرع محلي موجود عندما تكون شجرة العمل نظيفة.

هذه الواجهة محلية فقط عمدًا. لا تقدم clone أو fetch أو pull أو push أو إدارة remote أو أوامر Git اعتباطية أو رموزًا أو مفاتيح SSH أو تحكمًا في pull request. تحتاج تلك العمليات إلى وسيط بيانات اعتماد موثوق منفصل، ويفضل GitHub App أو رمز تثبيت مكافئًا محدودًا بمستودع واحد وعملية واحدة. لا تضع بيانات اعتماد Git طويلة العمر في /workspace أو بيئة حاوية المهمة أو إعداد المستودع.

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

كل أمر Git في الواجهة مصفوفة معاملات ثابتة تُنفذ كـUID/GID 1000:1000 داخل حاوية المهمة؛ ولا يقيّم shell مدخلات المستخدم أبدًا. يعطل وقت التشغيل إعداد Git العام وإعداد النظام والمطالبات وhooks ومساعدات بيانات الاعتماد وتوقيع commits وتكرار الوحدات الفرعية وبرامج الفرق الخارجية وtextconv وبروتوكولات الشبكة لهذه الواجهة. ويرفض المستودعات التي لا تكون شجرة عملها /workspace بالضبط، أو يُحل دليل Git أو الدليل المشترك فيها خارج /workspace. كما تُحجب إجراءات Git الكتابية التي قد تعالج محتوى الملفات عندما يحدد إعداد المستودع مرشح clean أو smudge أو process قابلًا للتنفيذ.

تحمي هذه الضوابط واجهة Git في Libre WebUI. ويظل بإمكان مسؤول استخدام الطرفية، والنموذج استخدام run_command، لتشغيل أوامر Git عادية داخل البيئة. لذلك تبقى البيئة وحد النشر ضوابط الأمان للأوامر الاعتباطية.

مهارات العامل المضمّنة

يتلقى كل تشغيل دليل مساحة عمل يملكه الخادم. يشرح حد /workspace الدائم، وجذر الحاوية للقراءة فقط، وحالة العمليات و/tmp المؤقتة، وسياسة الشبكة، وحدود الأوامر والمخرجات، ودورة حياة المعاينة. وتوجه مهاراته المضمّنة النموذج إلى:

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

لا يوجد الدليل إلا في سياق النموذج. لا ينشئ Libre WebUI ملف AGENTS.md أو دليل مهارات أو ملف تحكم آخر في مساحة المستخدم. تظل التعليمات التي يقدمها المشروع إرشادات للمشروع، ولا تستطيع تجاوز حد أمان الحاوية أو الأدوات.

الطرفية

تربط علامة الطرفية shell تفاعليًا بالحاوية المعزولة نفسها التي يعمل فيها النموذج، بحيث يستطيع مسؤول فحص الحالة أو تشغيل build يدويًا أو تصحيح ما تركه تشغيل، من دون مغادرة المتصفح.

يعمل shell وفق سياسة الحاوية نفسها لكل أداة نموذج: المستخدم غير المميز 1000:1000 ودليل العمل /workspace، داخل حاوية محصّنة ومسقطة القدرات. لا تمنح الطرفية أي صلاحية لا تملكها أداة النموذج run_command؛ فهي واجهة للبشر إلى الحد نفسه، لا طريق للالتفاف عليه.

السلوك التشغيلي:

  • المصادقة — يستبدل المتصفح ترويسة Authorization العادية عبر HTTP بتذكرة قصيرة العمر ولمرة واحدة، مرتبطة ببروتوكول طرفية Work والمهمة الدقيقة. لا يظهر في عنوان ترقية /ws/work-terminal إلا التذكرة ومعرّف المهمة. قبل كل إدخال shell، يعيد Libre التحقق من حالة الحساب ووصول Work ووجود المهمة وملكيتها. يغلق الإلغاء shell ويحرر إيجار وقت التشغيل فورًا.
  • فحوص الأصل — عند إعداد CORS_ORIGIN أو BASE_URL، يجب أن تطابق ترقيات المتصفح أحد تلك الأصول. اضبط واحدًا على الأقل للنشر البعيد. تظل الترقيات بلا أصل متاحة لـElectron والعملاء غير المتصفحات، لكنها تحتاج إلى تذكرة المهمة وفحوص التفويض الحية نفسها؛ استخدم TLS والجدار الناري وسياسة الوكيل العكسي للتحكم فيها.
  • القبول — تأخذ الطرفية المفتوحة إيجار وقت تشغيل مثل الأمر أو المعاينة، وتدخل في WORK_MAX_ACTIVE_RUNTIMES_*.
  • عمر الحاوية — تبقي الطرفية المتصلة الحاوية عاملة وتمنع مسار التوقف عند الخمول من إزالتها وسط الجلسة.
  • التزامن — يحد WORK_TERMINAL_MAX_SESSIONS_PER_TASK (الافتراضي 2) عدد جلسات shell المتزامنة لكل مهمة.
  • مهلة الخمول — يغلق WORK_TERMINAL_IDLE_TIMEOUT_MS (الافتراضي 15 دقيقة) جلسة لم تُلمس ويحرر إيجارها.
  • أثناء التشغيل — توضح العلامة أن النموذج يمتلك الحاوية، وتفتح shell بعد انتهاء المداخلة.

تتصل الطرفية بواجهة Docker Engine مباشرة، لأن جلسة TTY تتطلب تدفقًا ثنائي الاتجاه مخطوفًا لا توفره Docker CLI إلا لطرفية تحكم حقيقية. تستخدم WORK_DOCKER_SOCKET، وإلا DOCKER_HOST — socket من نوع unix:// أو نقطة tcp:// عبر HTTP عادي، مثل وكيل socket يحمل تمريره الواعي بـHTTP التدفق المخطوف عبر نفق Connection: Upgrade قياسي — وإلا /var/run/docker.sock. يبلّغ DOCKER_HOST لا يفهمه هذا العميل (ssh:// أو tcp:// مع تعيين DOCKER_TLS_VERIFY) أن الطرفية غير متاحة مع السبب بدل الاتصال صامتًا بمكان آخر؛ ويواصل باقي Work العمل. في واجهة Kubernetes يمر الاتصال نفسه عبر المورد الفرعي exec كـTTY WebSocket من خلال خادم API — بما في ذلك إطارات تغيير الحجم — من دون نقطة Docker.

جلسات الطرفية تفاعلية وغير مسجلة. لا تظهر الأوامر المكتوبة فيها في مخطط نشاط المهمة.

المعاينة

تبدأ علامة المعاينة تطبيق الويب المولّد وتوقفه وتضمّنه وتفتحه. عندما يكون حقل الأمر فارغًا، يفحص Libre WebUI مساحة العمل ثم:

  • يشغّل برنامج dev في package.json الجذري بالمضيف والمنفذ المطلوبين؛
  • يقدّم index.html جذريًا بخادم ثابت مضمّن بلا تبعيات؛ أو
  • يستخدم القواعد نفسها لتطبيق واحد في دليل متداخل.

تسبق التطبيقات الجذرية. إذا عُثر على عدة تطبيقات متداخلة متساوية الاحتمال، أو لم يوجد مدخل مدعوم، يعيد Work خطأ قابلًا للتصرف بدل محاولة أمر npm غير ذي صلة. أدخل أمرًا مخصصًا قبل اختيار بدء المعاينة لتخطيطات أو خوادم أخرى. تبدأ الأوامر المخصصة في /workspace، لذا أدرج الدليل النسبي عند الحاجة، مثل cd apps/web && npm run dev -- --host 0.0.0.0 --port 4173. يجب أن تستمع العملية المخصصة على 0.0.0.0 وعلى WORK_PREVIEW_PORT المعدّ. ينتظر Work حتى 15 ثانية ليصبح المنفذ جاهزًا.

يمكن للنموذج أيضًا بدء المعاينة بأداة start_preview. وهذه هي الطريقة الوحيدة المدعومة لترك النموذج عملية عاملة. تنظف استدعاءات run_command العادية العمليات التابعة في الخلفية عند انتهاء الأمر.

الشاشة (Work Computer)

شاهد وكيل Libre WebUI Work يبحث عن الصور ويبني معرض فضاء تفاعليًا

شاهد العرض الكامل: تشغيل حقيقي غير معدل (30x، ثم بالوقت الحقيقي) لوكيل Work يتصفح معارض صور NASA على شاشته، ويختار الصور، ثم يبني معرض Three.js تفاعليًا ويختبره، وكل ذلك من مطالبة واحدة.

تحصل المهمة التي تفعّل سياستها Work Computer على علامة شاشة: نافذة مباشرة إلى سطح مكتب افتراضي يعمل داخل البيئة المعزولة نفسها — مدير نوافذ وشريط تطبيقات ومتصفح Chromium على شاشة 1280×800. يمكنك مشاهدة الوكيل يعمل، والتحكم في الفأرة ولوحة المفاتيح، والاستماع إلى صوت الحاسوب، وتعليمه مهامًا بالعرض. يؤدي فتح العلامة إلى بدء جلسة GUI عند الطلب (لا يعمل شيء حتى ينظر أحد) وربط عارض VNC عبر WebSocket.

يحتاج المسؤول إلى نقرة واحدة لتفعيله: تعرض صفحة Work الرئيسية بطاقة Work Computer وبها زر تفعيل. يؤدي الضغط إلى بناء صورة GUI المضمّنة على daemon Docker الخاص بالنشر (يستغرق البناء الأول بضع دقائق)، وإنشاء سياسة Work Computer جاهزة، من دون docker build يدوي أو حقول سياسة. وخلف وكيل Docker API مفلتر، تُرفض نقطة البناء عمدًا؛ اسحب الصورة المنشورة على مضيف Docker بدلًا من ذلك (ghcr.io/libre-webui/libre-work-computer، موسومة libre-work-computer:latest)، أو ابنها هناك من deploy/work-computer/، ثم يتخطى تفعيل البناء وينشئ السياسة فقط. يجب أن تملك المهام تحت السياسة وصولًا إلى الشبكة، فالوصول إلى الشاشة يتم عبر منفذ حاوية منشور على loopback، مثل المعاينة تمامًا.

نموذج الأمان: يرتبط خادم VNC داخل الحاوية بـlocalhost خلف كلمتي مرور لكل جلسة — كلمة للعرض فقط تُسلّم لكل مشاهد مصرح له، وأخرى للتحكم الكامل لا تُفرج إلا لحامل إيجار التحكم الحالي. وبذلك يجعل خادم VNC نفسه إدخال الآخرين خاملًا. جسر WebSocket هو السطح الوحيد القابل للوصول، ويُنشر على loopback لمضيف Docker ولا ينكشف مباشرة. يصادق كل مشاهد بتذكرة لمرة واحدة مرتبطة بجلسته وبالمهمة، وهي الآلية نفسها للطرفية، ويُعاد فحص وصول Work الحالي عند كل اتصال؛ لذلك يؤدي إلغاء وصول المستخدم إلى قطع شاشته فورًا. يستطيع حتى أربعة مشاهدين متزامنين مشاهدة شاشة واحدة، وتُحسب المشاهدة نشاطًا للمهمة في مسح الخمول. لا تتنافس المشاهدة والتشغيل: يؤدي فتح الشاشة أثناء تشغيل الوكيل إلى الاتصال ببيئة ذلك التشغيل، ولا تمنع الشاشة المشاهدة التشغيل التالي من البدء، وتستمر الجلسة بعد انتهاء التشغيل، بما في ذلك نشر الفريق حيث تعمل التشغيلات في عملية عامل منفصلة. يستمر ملف المتصفح في /workspace/.browser-profile، فتظل عمليات تسجيل الدخول داخل الحاسوب بعد إعادة تشغيل الحاوية.

تحكم الوكيل: تقدم المهمة مع Work Computer أداتين إضافيتين للنموذج. تعيد computer_observe لقطة كاملة لسطح المكتب مع موضع المؤشر وهوية النافذة النشطة وعنوان المتصفح الحالي، وما إذا كانت الصفحة (لا واجهة المتصفح نفسها) تملك تركيز لوحة المفاتيح، ووصفًا موجزًا للعنصر المركز، وتجزئة للقطة. تأتي الإشارات الدلالية من نقطة DevTools مرتبطة بـloopback الحاوية، وتغيب ببساطة في صور GUI المبنية قبل وجودها. تنفذ computer_act دفعة تصل إلى 24 إجراءً بالفأرة ولوحة المفاتيح (تحريك، ونقر، ونقر مزدوج، ونقر يمين، وكتابة، ومجموعات مفاتيح، وتمرير، وانتظار)، وتعيد لقطة بعد استقرارها. تحافظ ثلاث حراسات لوقت التشغيل على صدق الدفعات: يمكن لإجراءات type/key حمل تأكيد focus وتفشل بصورة مغلقة إن لم يملك الحقل المؤكد تركيز لوحة المفاتيح (فلا يهبط النص بصمت في omnibox)؛ وتتوقف الدفعة مبكرًا إذا ظهرت نافذة أو تغير العنوان أو انتقل التركيز وسط الدفعة، لأن الإحداثيات المتبقية تستهدف الشاشة السابقة؛ ويمكن للدفعة إعلان نتيجة متوقعة (عنوان أو URL أو منطقة شاشة تغيرت) يتحقق منها وقت التشغيل بمهلة تكيفية — تعني «pending» أنها لم تُرصد بعد، لا أنها نجحت ضمنًا. بعد الدفعة، تستقر الشاشة تكيفيًا (باستطلاعها حتى تتوقف عن التغير) لا بعد تأخير ثابت. تحمل كل نتيجة أيضًا دليلًا يُطلب من النموذج قراءته: تعيد النقرات عند إحداثيات صريحة إيصالًا يذكر هل تغيرت البكسلات قرب النقرة، ويمرر scroll_until نحو نص مستهدف أو حافة الصفحة ويبلغ هل ظهر، وتُقارن كل ملاحظة بالسابقة لتسمية الشاشة غير المتغيرة. يمكن للدفعات إعلان subgoal من سطر واحد يستمر مع النتيجة كنقطة تحقق ويتكرر في مطالبات الاستعادة. تكتشف حلقة الوكيل تعطل الارتكاز (ثلاثة إجراءات متطابقة على شاشة غير متغيرة تطلق إشعار استعادة واحدًا، والتكرار ينهي التشغيل طالبًا إدخالًا بدل حرق الجولات الباقية) وتراكم الالتباس (توقعات متتالية غير متحققة تطلق إشعار إعادة ارتكاز واحدًا). تُختم قياسات الحلقة — الجولات وزمن الأدوات واللقطات والحواجز وأحكام التوقعات — على كل سجل أداة دائم، وتُلخص عند نهاية التشغيل. تصل اللقطات إلى النموذج كمحتوى صورة حقيقي على كل مسار موفّر — Ollama وAnthropic وGemini وإضافات المحادثة وResponses المتوافقة مع OpenAI — لذلك ينبغي أن يكون النموذج الذي يقود المهمة نموذج رؤية. إذا رفض الموفّر إدخال الصور (أي كان النموذج نصيًا فقط)، فلا يفشل التشغيل: تُحذف اللقطات في بقية التشغيل، ويُطلب من النموذج الاعتماد على الملاحظات النصية، وتوضح ملاحظة في النص المسجل هذا التراجع. لكن النموذج الذي لا يرى الشاشة يتحقق بدرجة أقل بكثير، لذا فضّل نموذج رؤية لمهام الحاسوب. لا تبقى في السياق الحي إلا أحدث اللقطات، ولا تحفظ نصوص المهمة الدائمة إلا الملاحظة النصية، لا بايتات الصور. يأتي المتصفح مع حجب محتوى مضمّن: uBlock Origin Lite للإعلانات وأدوات التتبع (مثبت بإصدار محدد ومتحقق من بصمته عند بناء الصورة، ومستوى الترشيح مثبت بسياسة مُدارة)، وأداة ترفض تلقائيًا لافتات الموافقة على ملفات تعريف الارتباط، لأن الإعلانات وجدران الموافقة تهدر لقطات الوكيل ورموزه ونقراته. تُحيّد طلبات الإعلانات على طريقة uBlock: تُحل برامج الإعلانات المعروفة إلى بدائل محلية غير ضارة كي تواصل الصفحات العمل. يُطلب من الوكيل ألا يدخل بيانات اعتماد أو يكمل تحديات CAPTCHA/2FA؛ بل يبلغ بالعائق. وللمهام غير الموثوقة، اجمع سياسة GUI مع محلل DNS مفلتر؛ يجعل متصفح سطح المكتب سياسة الخروج أهم، لا أقل.

الصوت: تكون الشاشة صامتة افتراضيًا (قاعدة متصفح؛ يحتاج الصوت إلى نقرة)، ويبث زر مكبر الصوت في لوحة الشاشة صوت الحاسوب مباشرة. داخل البيئة، يشغّل PulseAudio إلى مصب فارغ، وتُلتقط مراقبته كـPCM خام وتُقدم عبر جسر WebSocket ثانٍ موثّق ومنشور على loopback — بالتذكرة وإعادة فحص الوصول وحد المشاهدين لكل مهمة نفسها المستخدمة للشاشة. يتطلب ذلك صورة GUI مبنية من deploy/work-computer/ في هذا الإصدار أو أحدث.

التحكم: يمنحك زر تولي التحكم في لوحة الشاشة الفأرة ولوحة المفاتيح — لتسجيل الدخول أو تجاوز CAPTCHA أو تنفيذ خطوة يجب ألا يفعلها الوكيل — ويعيد انتهيت الشاشة إلى الوكيل. تخدم جلسة VNC واحدة الدورين: يحتفظ الخادم داخل الحاوية بكلمة تحكم كامل وكلمة عرض فقط (مولدتين لكل جلسة ولا تسجلان)، ولا يتلقى المشاهدون إلا كلمة العرض، بينما تُفرج كلمة التحكم حصريًا لحامل إيجار التحكم الحالي. الإيجار محدود بمدة (ينتهي التحكم المهجور خلال دقيقتين)، ويُجدد أثناء فتح واجهة التحكم، وهو تعاوني لا يمكن انتزاعه من مستخدم آخر. تستطيع سياسة تعطيل التحكم تمامًا (السماح بتولي الشاشة في محرر السياسة): تخفي مهامها عناصر التحكم والتعليم، وترفض نقطة التحكم، وتبلغ request_takeover لدى الوكيل أنه لا يمكن تسليم التحكم لأحد؛ وتظل المشاهدة متاحة. أثناء تحكم شخص، تُحجب computer_observe وcomputer_act، فلا يستطيع الوكيل مقاومة إدخالك أو تصوير ما تكتبه. ويستطيع الوكيل طلبك: تنشر أداة request_takeover شريطًا في لوحة الشاشة بالسبب، وتنتظر أن تتولى ثم تعيد التحكم. تنتقل بيانات الاعتماد التي تكتبها أثناء التحكم مباشرة من لوحة المفاتيح إلى الصفحة، ولا تمر بالنموذج أو نص المهمة. يتطلب التحكم صورة GUI مبنية من deploy/work-computer/ في هذا الإصدار أو أحدث؛ وتظل الجلسات من الصور الأقدم قابلة للمشاهدة لكن للعرض فقط للجميع.

وضع التعليم: يسجل تعليم مهمة في لوحة الشاشة عرضًا — تقود الشاشة الحقيقية (ويتولى التحكم بالطريقة نفسها مع مؤشر تسجيل ظاهر)، بينما تُلتقط إجراءات المؤشر ولوحة المفاتيح والتمرير بإحداثيات الشاشة. ويُثبت كل نقر أيضًا: يحل مسبار للقراءة فقط العنصر التفاعلي تحت المؤشر (وسمه ومعرّفه وتسميته الظاهرة) وعنوان الصفحة، فتسمّي خطوات دليل التشغيل أهدافها — "Click "button#submit (Place order)"" — وتصبح الإحداثيات مجرد مكان كان فيه العنصر أثناء العرض. يبني الحفظ دليلًا حتميًا بلا نموذج في الحلقة: تتجمع ضغطات المفاتيح في نصوص مكتوبة، ويفصل حد 8 بكسلات بين النقر والسحب، وتصبح التوقفات خطوات انتظار صريحة، ويُحجب النص المكتوب الذي يذكر مفردات سرية أو يشبه بيانات اعتماد (8+ محارف تمزج ثلاث فئات محارف)، ويُستبدل بتعليم لاستخدام request_takeover في تلك الخطوة. الدليل إجراء بلغة طبيعية — الأهداف المثبتة أولًا، والإحداثيات كتلميحات، وإعادة تفسير عبر computer_observe — ويشمل متى يُستخدم والمدخلات والخطوات والتحقق ونطاقًا مسموحًا مشتقًا من المضيفين الذين زارهم العرض فعلًا (يجب أن يتوقف التكرار ويسأل قبل مغادرتهم؛ فلا يرث إجراء معلّم سلطة تتجاوز ما عُرض)، وحدود الموافقات، والتوقف والسؤال عند الفشل. يُحفظ كمهارة عادية (بادئة slug هي taught-)، فيظهر في صفحة المهارات مع الإصدارات والتحرير والمشاركة. تحمّل عمليات Work ذات الحاسوب مهارات المالك المعلّمة والمفعّلة في مطالبة النظام، وتعرضها في قائمة مهارات التشغيل؛ لذلك يكون تكرار مهمة معلّمة تشغيلًا عاديًا يطابق طلبه الإجراء. بعد تشغيل منتهٍ، تعرض شرائح المهارة مراجعة نجح/فشل بنقرة واحدة، فتضيف سطرًا مؤرخًا إلى قسم سجل الأداء في المهارة (الأحدث أولًا، بعدد محدود، وكل سطر إصدار عادي للمهارة)، فيبقى تاريخ الإجراء معه. لا تكتب كلمات مرور حقيقية أثناء التسجيل؛ اعرض حتى تسجيل الدخول، واحفظ، ودع request_takeover يتعامل مع بيانات الاعتماد عند التكرار.

الموفّرون والتوجيه والإفصاح عن البيانات

مسارات الموفّرين المدعومة

المسارالتحقق والسلوك
Ollama محلييجب أن يكون Ollama سليمًا، وأن يعلن النموذج الدقيق دعم الأدوات.
Ollama Cloudيُوجّه صراحة عبر Ollama؛ وتعرض النماذج ذات لواحق السحابة إفصاح الموفّر البعيد.
إضافة إكمال/محادثةيجب أن تكون الإضافة نشطة، وتعرض النموذج الدقيق، ولديها بيانات اعتماد للمسؤول الحالي.
إضافة Anthropicتستخدم محول رسائل Anthropic واستخدام الأدوات في Work.
إضافة Geminiتستخدم محول محتويات Gemini واستدعاء الوظائف في Work.
إضافات متوافقة أخرىتستخدم بنية الرسائل والأدوات واختيار الأدوات على نمط OpenAI.

يُخزّن نوع الموفّر ومعرّف الإضافة على المهمة وكل تشغيل. ولا يختار اسم النموذج المسار وحده أبدًا. لا يستطيع تفعيل إضافة باسم نموذج يطابق نموذج Ollama اعتراض مهمة قائمة.

ما يتلقاه الموفّر

في كل جولة نموذج، قد يتلقى الموفّر المحدد:

  • مطالبة نظام Work؛
  • مهارات العامل المضمّنة وحدود وقت التشغيل الحالية؛
  • حتى آخر 30 رسالة مستخدم/مساعد، بحد 256 KB؛
  • تعريفات أدوات Work؛
  • سجل استدعاءات أدوات المساعد؛ و
  • نتائج الأدوات، التي قد تشمل قوائم الأدلة ومحتوى الملفات المطلوب ونتائج البحث ومخرجات الأوامر والأخطاء.

لا تُرفع الوحدة المسماة كاملة. لكن أي محتوى ملف أو مخرج أمر يعود عبر أداة يصبح جزءًا من محادثة النموذج ويُرسل إلى الموفّر المحدد. راجع سياسات الاحتفاظ والتدريب والتسعير والاستخدام لدى الموفّرين البعيدين قبل استخدام شيفرة مصدر حساسة.

تبقى بيانات اعتماد الموفّر على الواجهة الخلفية لـLibre WebUI، سواء أُعدت للنشر كله أو لمستخدم. وتُستخدم لطلبات النموذج من الواجهة الخلفية، ولا تُركّب أبدًا في حاوية Work.

تشفير بيانات الاعتماد في طبقة التطبيق ليس تشفيرًا للمهمة كلها. محادثات Work ونتائج الأدوات ومخرجات الأوامر وبيانات المهمة الوصفية محتوى عادي في قاعدة البيانات، بينما ملفات مساحة العمل وتبعياتها ملفات عادية في وحدة Docker أو PVC Kubernetes الخاصة بالمهمة. استخدم ضوابط وصول المضيف وتشفير القرص عندما يتطلب نموذج تهديد النشر تشفيرًا عند التخزين.

الإفصاح عن الموفّر البعيد

يعتبر Work نماذج الإضافات وأسماء Ollama المنتهية بـ:cloud أو -cloud بعيدة لغرض الإفصاح. يفتح تحديدها إشعارًا قابلًا للإخفاء يشرح تدفق البيانات واحتمال تعدد الاستدعاءات المدفوعة. يُحفظ خيار الإخفاء لكل مستخدم Libre WebUI.

تستخدم كل مسارات الموفّرين ميزانية WORK_MAX_AGENT_ROUNDS نفسها، وهي 48 جولة افتراضيًا. لا يوجد حد منفصل من 12 جولة للإضافات. تكون ميزانية أمان استدعاءات الأدوات الأكبر من 128 استدعاء أو ثمانية استدعاءات لكل جولة معدّة. عند نفاد ميزانية الجولات، يطلب Libre WebUI من النموذج تسليمًا نهائيًا واحدًا بلا أدوات يصف العمل المكتمل والفحوص والعوائق والخطوات الباقية. ثم يسجل التشغيل النهائي يحتاج إلى إدخال بدل كشف استثناء خام لحد الجولات أو تسمية العمل غير المكتمل مكتملًا. يواصل تشغيل لاحق في مساحة العمل الدائمة نفسها. ومع ذلك قد يجري تشغيل Work واحد كثيرًا من طلبات الموفّر المدفوعة.

مساحات عمل مجلد المضيف (اشتراك اختياري)

في واجهة Docker، تكون /workspace للمهمة عادة وحدة مسماة لا توجد إلا لها، فلا يستطيع النموذج الوصول إلى ملفاتك الحقيقية. ويمكن لنشر Docker بدلًا من ذلك السماح بربط المهمة بمجلد حقيقي على المضيف. يرفض Kubernetes مساحات مجلد المضيف ويستخدم PVC تملكه المهمة.

عيّن المتغيرين، ثم أعد تشغيل الواجهة الخلفية:

WORK_HOST_WORKSPACES_ENABLED=true
WORK_HOST_WORKSPACE_ROOTS=/Users/you/Projects

WORK_HOST_WORKSPACE_ROOTS قائمة جذور تفصل بينها :؛ والافتراضي دليل المنزل لمستخدم الخادم. عند تشغيل الميزة، تحصل شاشة Work الرئيسية على حقل مجلد مساحة العمل اختياري. اتركه فارغًا فتعمل المهمة كما قبل بوحدة معزولة خاصة بها.

قبل قبول مسار، يجب أن يكون مطلقًا وموجودًا ودليلًا، وأن يُحل — عبر أي روابط رمزية — إلى موقع داخل أحد الجذور المعدّة. تُرفض الأدلة المسماة .ssh و.gnupg و.aws و.config و.kube و.docker و.claude و.libre-webui وnode_modules رفضًا تامًا. يُخزّن المسار المحلول مع المهمة ويظهر في رأسها، فيبقى المجلد الذي تعمل فيه ظاهرًا دائمًا.

هذا يضيّق العزل

تعني مساحة المضيف أن النموذج يقرأ ملفاتك الحقيقية ويكتبها، ولا تعود حماية الحاوية الأخرى — المستخدم بلا root والقدرات المسقطة وحدود الموارد — تفصل النموذج عن ذلك الدليل. أبقِ الميزة معطّلة إلا إذا أردتها، واجعل الجذور أضيق ما يمكن، وفضّل أدلة خاضعة للتحكم في الإصدارات.

الاستمرارية ودورة حياة وقت التشغيل

يفصل Libre WebUI الحالة الدائمة عن حالة التنفيذ:

الحالةالتخزينالعمر
ملكية المهمة وعنوانها وموفّرها وحالتهاقاعدة بيانات Libre WebUIحتى حذف المهمة أو المستخدم المالك
عمليات التشغيل والأخطاء والرسائل ونشاط الأدواتقاعدة بيانات Libre WebUIحتى حذف المهمة
ملفات مساحة العملوحدة Docker أو PVC في K8s خاص بالمهمةتبقى بعد إلغاء التشغيل وإيقاف المعاينة وإعادة تشغيل البيئة والتطبيق
نظام الملفات الجذري والملفات المؤقتةحاوية أو Pod خاص بالمهمةمؤقت؛ قد يتوقف أو يُعاد إنشاؤه
عملية المعاينةبيئة المهمة العاملةمؤقتة؛ تبقى فقط ما دام التحقق من سلامتها قائمًا
مسودة المحرر غير المحفوظةتخزين جلسة المتصفححالة مؤقتة للراحة في جلسة المتصفح

تحصل كل مهمة على UUID يولده الخادم. تُشتق أسماء بيئتها ومساحتها في الواجهة الخلفية، ولا تُقبل من طلب المتصفح أبدًا. ينشئ Libre WebUI موارد وقت التشغيل بوسوم الإدارة وملكية المهمة. وقبل إعادة الاستخدام أو الحذف، يتحقق من وسم الملكية ويرفض موردًا يعود وسمه إلى مهمة أخرى.

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

يستطيع المسؤولون تعريف سياسات وقت تشغيل مسماة من تبويب إدارة المستخدمين في الإعدادات: إعدادات مسبقة تجمع صورة وقت التشغيل وحدود الذاكرة/CPU/PID وحجم مساحة العمل (Kubernetes) ومهلة الخمول وافتراضي الشبكة ومفتاحي إمكانات — Work Computer (GUI + متصفح)، الذي يمنح مهام السياسة سطح مكتب افتراضيًا وعلامة الشاشة، والسماح بتولي الشاشة، الذي يحدد هل يستطيع إنسان تولي تلك الشاشات (وبما أن التعليم يسجل عبر التحكم، هل يتاح وضع التعليم). تعمل المهمة المنشأة تحت سياسة بإعدادها؛ ويرث كل حقل فارغ القيم العامة للنشر، ويعيد حذف السياسة مهامها إلى تلك القيم عند إعادة إنشاء حاوياتها. تعدل السياسات الموارد ومفتاحي الإمكانات فقط؛ ولا يمثل ملف التحصين (بلا root، وجذر للقراءة فقط، وقدرات مسقطة، وعزل شبكة) حقل سياسة، ولا يمكن إضعافه لكل سياسة.

يحد WORK_RUNTIME_IDLE_TIMEOUT_MS مدة سماح المعاينة: عند تعيينه، يوقف المسح أي بيئة لم تشهد نشاطًا — لا أمرًا انتهى، ولا طرفية متصلة، ولا طلب معاينة عبر الوكيل الموقّع — لذلك العدد من المللي ثوانٍ، محررًا موضع قبولها. الإيقاف رخيص وتبقى مساحة العمل، لذا تُعاد المعاينة الخاملة عند الاستخدام التالي. يحافظ الافتراضي (0) على السلوك الحالي: تعمل المعاينة حتى إيقافها صراحة.

عند بدء الواجهة الخلفية، تُعلم التشغيلات النشطة كفاشلة وتُمسح حالة المعاينات — ماتت حلقة الوكيل ووكيل المعاينة مع العملية ولا يمكن استئنافهما. يسرد السائق المحدد بعد ذلك حاوياته أو Pods المدارة باستعلام وسوم واحد. تُوقف البيئات العاملة المملوكة لمهام معروفة لأن أمرًا مقطوعًا قد يظل يعمل بلا مشرف؛ وتبقى البيئات المتوقفة بلا تغيير؛ وتُزال البيئات المدارة التي لا يعود لها صف مهمة. تأتي الملكية من وسم المهمة، لا اسم المورد. يفترض حذف اليتامى أن مثيل Libre WebUI واحدًا يملك مساحة اسم وقت التشغيل أو daemon Docker. لا توجه مثيلين إلى موارد Work نفسها. إذا تعذر على السائق إثبات التنظيف، يبقى Work مغلقًا بأمان، ويعيد المحاولة كل 10 ثوانٍ، ويحجب العمليات القابلة للتغيير حتى استعادة الوصول.

سلوك الشبكة

تحقق من سياسة الشبكة المحددة

تبدأ المهام من دون سياسة وقت تشغيل مسماة مع الشبكة مفعّلة. يستطيع مسؤول تعريف سياسة مسماة افتراضي شبكتها معطّل، ويستطيع المنشئ تحديدها عند إنشاء المهمة. لا يوجد مفتاح شبكة مستقل لكل مهمة، ويتطلب تغيير السياسة لاحقًا إعادة إنشاء البيئة قبل تطبيق إعداد وقت التشغيل الجديد.

في واجهة Docker، تتصل المهام الشبكية بشبكة bridge مخصصة ومدارة (libre-webui-work افتراضيًا، وWORK_NETWORK_NAME)، منشأة مع تعطيل الاتصال بين الحاويات (com.docker.network.bridge.enable_icc=false). ينتج عن ذلك:

  • لا تستطيع بيئة Work فتح اتصال إلى بيئة Work أخرى؛ و
  • لا تستطيع بيئة Work الوصول إلى حاويات النشر على bridge Docker الافتراضي المشترك، بما فيها قاعدة بيانات أو حاوية Ollama مجاورة لم تُنشر عمدًا.

يرفض Libre WebUI بدء مهمة شبكية إذا كانت شبكة بالاسم المعدّ موجودة لكنها ليست الشبكة المدارة، بدل توصيل البيئات صامتًا بشبكة المشغّل.

في Kubernetes، يحمل Pod البيئة وسم تفعيل الشبكة نفسه. يثبّت مخطط Helm NetworkPolicy للرفض الافتراضي، ودخولًا للمعاينة فقط، وخروجًا إلى الإنترنت للـPods ذات الشبكة فقط، مع استثناء work.networkPolicy.blockedEgressCidrs المعدّة. لا تكون NetworkPolicy فعالة إلا إذا فرضها CNI في العنقود؛ راجع دليل Kubernetes.

يبقى الخروج إلى العالم مسموحًا، لأن تنزيل الحزم وعمليات Git البعيدة وواجهات API الخارجية تجعل Work مفيدًا. هذا ليس جدارًا ناريًا صادرًا. قد تستطيع الشيفرة المولّدة الوصول إلى:

  • خدمات على مضيف Docker؛
  • أنظمة على شبكة المضيف المحلية؛
  • خدمات الإنترنت؛ و
  • نقاط بيانات البنية التحتية، وفق النشر.

نقاط ربط سياسة الخروج

لحد أقوى، استخدم هذه العناصر معًا:

  • WORK_RUNTIME_DNS (Docker) — عناوين محللات IPv4/IPv6 تفصل بينها فواصل، وتُفرض على كل بيئة شبكية (--dns). يمنح توجيهها إلى محلل مفلتر قوائم سماح/رفض بالأسماء من دون تعديل Libre WebUI. تُرفض المدخلات غير العناوين وتُسجل، فلا تستطيع القيمة حقن أعلام Docker إضافية.
  • قواعد جدار المضيف أو الجدار الأعلى (Docker) على الشبكة الفرعية للـbridge المدار، وهي ثابتة لأن الشبكة مسماة ومدارة.
  • WORK_NETWORK_NAME (Docker) موجّهًا إلى شبكة تنشئها مسبقًا بخيارات سائقك؛ يتحقق Libre WebUI من حملها الوسم المدار وخيار تعطيل ICC، فأنشئها بكليهما.

يقيد ترشيح DNS حل الأسماء، لا الخروج إلى IP خام. يحتاج نشر يجب أن يضمن عدم الخروج المباشر بـIP إلى قواعد جدار على مستوى المضيف أو العنقود أو الأعلى أيضًا.

لا تفترض أن وضع الشيفرة في Work يمنع نقل البيانات. لا تمنح وصول Work إلا لمستخدمين موثوقين. استخدم سياسة وقت تشغيل مسماة بلا شبكة عندما ينبغي للمهمة أن تبدأ غير متصلة؛ ولا يوجد متغير بيئة على مستوى النشر يغيّر السياسة الافتراضية.

لا يضيف الوصول إلى الشبكة بيانات اعتماد. لا يركّب Libre WebUI مفاتيح SSH أو بيانات اعتماد سحابية أو ملفات متصفح أو دليل منزل المضيف أو socket Docker داخل حاويات المهام. ومع ذلك تستطيع الشيفرة نقل أي بيانات اعتماد أو أسرار يكتبها مستخدم أو نموذج في /workspace.

حركة البيئة هذه منفصلة عن حركة النموذج. يرسل backend Libre WebUI دائمًا طلبات Ollama والإضافات إلى مسار الموفّر المحدد صراحة.

حد أمان البيئة المعزولة

حاوية Docker في Work:

  • تعمل بلا root كـUID/GID 1000:1000؛
  • تستخدم /workspace دليل عمل؛
  • لا تركّب إلا وحدة المهمة المحددة في /workspace؛
  • تستخدم نظام ملفات جذريًا للقراءة فقط ونظام /tmp مؤقتًا محدودًا؛
  • تسقط كل قدرات Linux؛
  • تفعّل no-new-privileges؛
  • غير مميزة وتستخدم عملية init؛
  • تطبق حدود CPU والذاكرة والعمليات وزمن الأوامر والمخرجات؛
  • تثبّت swap عند حد الذاكرة (--memory-swap يساوي --memory)، فلا يمكن تجاوز حد الذاكرة بالتبديل؛
  • تتصل بشبكة البيئة المدارة مع تعطيل الاتصال بين الحاويات، أو بلا شبكة؛ و
  • لا تنشر إلا منفذ المعاينة المعدّ إلى منفذ مضيف يختاره Docker على loopback.

يُعاد التحقق من كل ذلك عبر docker inspect قبل إعادة استخدام حاوية، وتُجزأ المجموعة كلها في وسم الحاوية ai.libre-webui.policy. تُهدم الحاوية ذات السياسة الأقدم من ترقية Libre WebUI وتُعاد بدل إعادة استخدامها، فتصل تغييرات التحصين إلى المهام القائمة تلقائيًا.

يطبق سائق Kubernetes سياق أمان Pod مكافئًا: UID/GID بلا root، ونظام ملفات جذري للقراءة فقط، وseccomp من نوع RuntimeDefault، ومنع رفع الصلاحيات، وإسقاط كل القدرات، وتخزين مؤقت محدود، وحدود موارد، وبلا رمز ServiceAccount، وPVC تملكه المهمة في /workspace. ويتحقق من وسوم المهمة وبصمة السياسة قبل إعادة استخدام Pod أو PVC أو حذفه.

يرفض تحقق المسارات المسارات المطلقة ومقاطع الاجتياز والشرطات العكسية ومحارف NUL والمسارات الطويلة. تحل أدوات الملفات المسارات الحقيقية وترفض الهروب بالروابط الرمزية. وتستخدم الكتابة ملفًا مؤقتًا وإعادة تسمية ذرية.

تقلل هذه الضوابط كشف المضيف عرضيًا؛ ولا تجعل Work آلة افتراضية أو بيئة آمنة لتحليل البرمجيات الخبيثة. تتشارك الحاويات نواة مضيف التشغيل. وقد تعبر ثغرة في Docker أو Kubernetes أو وقت التشغيل أو الصورة أو التبعية أو النواة الحد المقصود.

لا تملك وحدات Docker المسماة حصة قرص مستقلة. قد يستهلك مشروع مولّد أو تثبيت حزمة تخزين Docker كله، لذا راقب نمو الوحدات وطبّق حدود تخزين على المضيف. يطلب Kubernetes حجم PVC؛ ويعتمد فرض الحصة الفعلي على موفّر التخزين المحدد.

قائمة تحصين Docker للإنتاج

هذه القائمة خاصة بواجهة Docker. وعلى مشغّلي Kubernetes أيضًا التحقق من RBAC المقيد بمساحة الاسم وسياق أمان Pod وفئة التخزين وفرض CNI لـNetworkPolicy، كما في دليل Kubernetes.

يستطيع التطبيق تعيين أعلام الحاوية والتحقق من مسارات مساحة العمل وحراسة API الخاصة به. لكنه لا يستطيع فرض سياسة جدار المضيف أو حصص سائق التخزين أو مستوى صلاحيات daemon Docker الممنوح له. اعتبرها عمل نشر صريحًا لمثيل عميل خاص.

1. عزل التحكم في Docker

تحتاج حاوية Libre WebUI الرئيسية إلى التحكم في daemon لإنشاء حاويات Work وفحصها. لذلك يمثل socket Docker المركب بيانات اعتماد لمستوى التحكم، لا تركيب بيانات عاديًا: قد يؤدي اختراق تطبيق الويب إلى اختراق مضيف Docker.

يأتي التخفيف الأول في هذا المستودع: يبقي docker-compose.socket-proxy.yml الـsocket خارج حاوية Libre WebUI تمامًا. يحتفظ وكيل socket بـ/var/run/docker.sock على شبكة داخلية، ولا يمرر إلا أقسام API التي يستخدمها Work — الحاويات والصور والوحدات والشبكات وexec والمعلومات — بينما يرفض نقاط swarm والأسرار وconfigs والبناء وcommit والنظام قبل وصولها إلى daemon. يُوجّه Libre WebUI إليه عبر DOCKER_HOST=tcp://docker-socket-proxy:2375 ولا يحتاج إلى تركيب socket أو عضوية مجموعته؛ وتتبع CLI والطرفية التفاعلية وتشخيصات Docker تلك النقطة. يضيّق الوكيل سطح API، لا نطاق ضرر ما يمرره؛ فمن يستطيع إنشاء حاويات يستطيع تركيب مسارات المضيف، لذا يبقى الحد أدناه مهمًا.

لحد إنتاج أقوى، شغّل Libre WebUI وdaemon Work على آلة افتراضية مخصصة بلا أحمال أخرى. ولحد أقوى، امنح Work daemon Docker بلا root مخصصًا أو مضيف تشغيل منفصلًا، ولا تعرض إلا ذلك daemon إلى Libre WebUI. تحقق من ملكية الملفات وتوجيه المعاينة والتنظيف ودعم الطرفية مع daemon قبل الإطلاق. لا يجعل تركيب socket المضيف ذي root نفسه للقراءة فقط Docker API للقراءة فقط.

2. حجب وصول البيئة إلى إدارة المضيف

يمنع تعطيل الاتصال بين الحاويات بيئات Work من الوصول إلى بعضها، لكنه لا يمنعها من الوصول إلى خدمات مرتبطة بمضيف Docker. افحص bridge المدار وشبكته الفرعية الفعليين بدل افتراض عنوان:

docker network inspect libre-webui-work \
--format 'id={{.Id}} subnets={{range .IPAM.Config}}{{.Subnet}} {{end}}'
ss -lntup

استخدم مدير جدار المضيف الدائم لرفض الحركة القادمة من bridge إلى خدمات إدارة المضيف، وخصوصًا SSH وDocker API وقواعد البيانات ومنافذ المراقبة/المسؤول. اختبر القاعدة من حاوية مؤقتة متصلة بـlibre-webui-work، واختبر تنزيلات الحزم المسموحة، ثم اجعل القاعدة دائمة. تتحكم سلسلة DOCKER-USER في Docker بالحركة الممررة؛ وقد تحتاج الحركة المتجهة إلى مضيف Docker نفسه أيضًا إلى قاعدة INPUT/خطاف إدخال على واجهة bridge.

3. تقييد الوجهات الصادرة

احجب نقاط بيانات السحابة ونطاقات البنية الخاصة ونطاقات LAN للعميل من شبكة Work الفرعية إلا إذا احتاجها مشروع صراحة. اجمع محللًا مفلترًا عبر WORK_RUNTIME_DNS مع قواعد جدار على المضيف أو في الأعلى. يمكن تجاوز DNS بعنوان IP حرفي. كما لا يكفي وكيل HTTP وحده طالما تستطيع أوامر اعتباطية فتح اتصالات مباشرة؛ افرض سياسة التوجيه خارج الحاوية.

حافظ على سياسات وقت تشغيل مسماة مختلفة عندما يحتاج العملاء إلى سلوك مختلف، مثل وقت بلا شبكة، أو محدود بسجل الحزم، أو مفتوح الخروج. تتحكم السياسة المسماة في ربط Libre للشبكة؛ وتظل قواعد الجدار والوكيل الخارجية تفرض قيود الوجهة للسياسة الشبكية.

4. فرض حصص تخزين حقيقية

لا تحد حدود CPU والذاكرة وswap وPID الوحدة المسماة. قبل خدمة عدة عملاء، اختر واجهة تخزين بحصص قابلة للفرض لكل مساحة: مثل حصص مشروعات XFS أو وحدات منطقية مدعومة بحصة أو سائق وحدة/PVC بحد حجم. لا يحصل سائق Docker local الافتراضي على ext4 عادي على حصة موثوقة لكل وحدة بمجرد توثيق قيمة حجم.

راقب كل وحدة ai.libre-webui.managed=true وجذر بيانات Docker، ونبّه قبل امتلاء نظام الملفات، واختبر الفشل. قد يحذر عداد واجهة أو فحص du دوري، لكنه ليس حد فرض لأن الحاوية تستطيع استهلاك القرص المتبقي بين الفحوص.

5. التحقق من السياسة المنشورة

بعد كل تغيير صورة أو سياسة daemon، أنشئ مهمة Work مؤقتة وتحقق بالحالة الفعلية عبر docker inspect: UID بلا root، وجذر للقراءة فقط، وكل القدرات مسقطة، و no-new-privileges، وحدود الذاكرة/swap/CPU/PID، ووحدة المهمة وحدها مركبة، والشبكة المتوقعة. وتحقق أيضًا من أن حاوية Libre WebUI الرئيسية لا تحمل إلا التركيبات المقصودة، وأن الدخول العام يصل إلى التطبيق عبر الوكيل العكسي أو النفق الموثّق، لا منفذ Docker أو معاينة منشورًا عرضًا.

أمان المعاينة وإمكانية الوصول

لمهمة Docker، ينشر السائق منفذ المعاينة المعدّ إلى منفذ ديناميكي على loopback الواجهة الخلفية. وفي Kubernetes، تستهدف الواجهة داخل العنقود IP لـPod البيئة مباشرة. لا يستطيع النموذج أو المتصفح اختيار أعلى اعتباطي. يوقّع Libre WebUI عنوان قدرة للمهمة والنقطة الدقيقتين، ويتحقق في كل طلب من استمرار المعاينة، ويمرر حركة HTTP وWebSocket عبر /api/work/previews. يؤدي إيقاف المعاينة أو إعادة تشغيلها إلى إلغاء العنوان القديم.

تزيل استجابات المعاينة بيانات اعتماد Libre WebUI وملفات ارتباط الأعلى. يقيّد HTML كل من بيئة iframe وCSP للاستجابة يسمحان بالبرامج النصية والنماذج والمربعات الحوارية والتنزيلات من دون وصول الأصل نفسه. وتحمي CSP المعاينة المفتوحة في علامة مستقلة. تظل شيفرة التطبيق المولّدة غير موثوقة، ويمكنها استخدام خروج الشبكة لنقل ما تقرؤه من مساحة العمل أو مدخلات المتصفح. اعتبر عنوان معاينة عاملًا سرًا قصير العمر ولا تشاركه.

لأن المتصفح يحمّل الوكيل على الأصل العام نفسه لـLibre WebUI، تعمل المتصفحات البعيدة ووكلاء HTTPS العكسية من دون كشف منافذ Docker أو IPs للـPods، ومن دون حجب المحتوى المختلط. يجب أن تحافظ الوكلاء العكسية على ترقيات WebSocket للمسار /api/work/previews/؛ ويفعل إعداد Nginx المرفق ذلك.

لا يسمح التطبيق الرئيسي كمصادر frames إلا بأصله وCloudflare Turnstile. تتجاوز استجابات المعاينة سياسة Helmet الرئيسية كي تتدفق أجسام الطلبات وتطبق سياسة العزل الأضيق أعلاه. وتبقى سياسة التضمين عبر الأصول معطلة لأن خوادم التطوير المولّدة لا ترسل عادة ترويسات موارد متوافقة.

مصفوفة النشر

يتبع توفر Work الجهاز والعملية اللذين يشغّلان الواجهة الخلفية لـLibre WebUI، لا المتصفح أو واجهة سطح المكتب وحدهما.

النشرعمليات Work وملفاتهالمعاينة المضمّنة
npx libre-webui على حاسوب محليمدعوم عند تثبيت Docker وتشغيله وإمكان استدعائه من مستخدم الواجهة الخلفية.مدعومة عبر وكيل موقّع من أصل التطبيق.
تطوير المصدر على حاسوب محليمدعوم تحت متطلبات Docker والموفّر نفسها.مدعومة عبر أصل API التطوير على المنفذ 3001.
عميل Electron لسطح المكتبمشروط. يستخدم Electron واجهة Libre WebUI خلفية خارجية ولا يقدم وقت Work منفصلًا.مدعومة عبر عنوان الوكيل الموقّع لتلك الواجهة.
واجهة bare-metal أو VM على مضيف بعيدتعمل التشغيلات والملفات وطلبات الموفّرين عند توفر Docker على المضيف.مدعومة عندما يحافظ الوكيل العكسي العام على HTTP وWebSocket.
Docker Compose القياسي من المستودعمدعوم افتراضيًا على Docker Desktop: تتضمن الصورة Docker CLI، ويركّب Compose socket المضيف، وتمر منافذ Work عبر host.docker.internal. أما Docker Engine الأصلي فيحتاج إضافةً إلى WORK_PREVIEW_BIND غير عام ويمكن الوصول إليه.مدعومة عبر أصل Libre WebUI العام نفسه.
نشر Kubernetes/Helm الحاليمدعوم مع --set work.enabled=true: تعمل البيئات كـPods مع مساحات PVC (التشغيلات والملفات والأوامر وgit والطرفيات التفاعلية وشاشة Work Computer وصوتها عند IP الـPod)، تحت Role محدود بمساحة الاسم وNetworkPolicies ترفض افتراضيًا، بلا socket Docker مطلقًا. راجع دليل Kubernetes.مدعومة عندما تعمل الواجهة داخل العنقود: يستهدف الوكيل الموقّع IP الـPod مباشرة.

تشغيل Work عندما يكون Libre WebUI نفسه داخل Docker

يفعّل كل ملف Compose في المستودع Work: تتضمن الصورة Docker CLI ويركّب الملف /var/run/docker.sock. ويعمل Docker Desktop بقيم التوجيه المرفقة. أما Docker Engine الأصلي فيحتاج إضافةً إلى ضبط WORK_PREVIEW_BIND على واجهة مضيف غير عامة يمكن الوصول إليها من الحاويات الشقيقة، كما هو موضح أدناه.

يقود Work daemon المضيف عبر socket، لذلك تكون حاويات المهام أشقاء لحاوية Libre WebUI لا أبناءها. تظهر في docker ps على المضيف، وتُنظف بقواعد دورة الحياة نفسها للتثبيت الأصلي.

يمنح تركيب socket Docker في تطبيق ويب الحاوية تحكمًا يعادل root في المضيف. لا يعمل Work من دونه، لذلك يفعله Libre WebUI بدل شحن ميزة لا تفعل شيئًا بصمت. النتيجة صريحة: كل مسؤول Libre WebUI مسؤول فعليًا عن مضيف Docker. يتحمل المشغّلون تبعات أمان daemon والشبكة ودورة الحياة والنسخ والوصول. احذف سطر /var/run/docker.sock من Compose لتعطيل Work؛ ولا يعتمد شيء آخر عليه.

للحفاظ على Work من دون منح socket لتطبيق الويب، استخدم docker-compose.socket-proxy.yml: يحتفظ وكيل على شبكة داخلية بالـsocket ولا يمرر إلا أقسام API المستخدمة، ويصل إليه Libre WebUI عبر DOCKER_HOST. راجع عزل التحكم في Docker لما يغطيه الحد وما لا يغطيه.

يجب تحقق ثلاثة شروط، وتسمّي لوحة Work الشرط الفاشل:

  1. يجب وجود Docker CLI في الصورة. تأتي في الصورة الرسمية؛ وتحتاج صورة مخصصة إلى docker-cli أو WORK_DOCKER_COMMAND يشير إليها. وإلا: The "docker" CLI is not installed….
  2. يجب تركيب socket. وإلا: No Docker daemon is reachable….
  3. يجب أن ينتمي مستخدم الواجهة إلى مجموعة socket. تعمل الصورة باسم nodejs (uid 1001)، ويملك socket عادة root أو docker، لذلك يمرر Compose group_add: ['${DOCKER_GID:-0}']. يناسب الافتراضي Docker Desktop؛ ويحتاج مضيف Linux إلى معرّف مجموعته. وإلا: The Docker socket is mounted but the Libre WebUI user cannot open it….
# Read the socket's group as seen INSIDE a container. A macOS host reports a
# different value, because Docker Desktop proxies the socket through a VM.
echo "DOCKER_GID=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
alpine stat -c '%g' /var/run/docker.sock)" >> .env
docker compose up -d --force-recreate

تبقى منافذ معاينات المهام مرتبطة بـloopback مضيف Docker. يعرض Libre WebUI كل معاينة عاملة عبر عنوان وكيل موقّع من الأصل نفسه، بما في ذلك أصول HTTP وترقيات WebSocket. يعمل ذلك خلف HTTPS والأنفاق البعيدة من دون فتح منافذ Docker المؤقتة للشبكة. تتلقى مستندات المعاينة سياسة عزل متصفح مقيّدة، ويلغي الإيقاف أو إعادة التشغيل العنوان السابق.

عندما تعمل الواجهة نفسها داخل Docker، قد يستخدم النشر والاتصال عناوين مختلفة. أبقِ WORK_PREVIEW_BIND=127.0.0.1 لتجنب كشف المنافذ، وعيّن WORK_DOCKER_PUBLISHED_HOST إلى عنوان مضيف Docker القابل للوصول من حاوية الواجهة (host.docker.internal على Docker Desktop). وتضبط ملفات Compose المرفقة القيمتين معًا وتعيّن اسم المضيف. أما عمليات النشر على Linux الأصلي فيجب أن تتجاوز WORK_PREVIEW_BIND ببوابة جسر Docker (أو أي واجهة مضيف أخرى غير عامة يمكن الوصول إليها صراحةً)؛ ولا يجعل تعيين host.docker.internal وحده مستمع loopback للمضيف قابلًا للوصول. ولا تربط هذه المنافذ المؤقتة الخام بـ0.0.0.0 مطلقًا.

يُحد التزامن بصورة مستقلة: الافتراضي لـWORK_MAX_ACTIVE_RUNTIMES_PER_USER هو 2 ولـWORK_MAX_ACTIVE_RUNTIMES_GLOBAL هو 3، فيستطيع مسؤول تشغيل مهمة ثانية أثناء انشغال الأولى. تعرض استجابة الإمكانات الحدين والإشغال الحي. ارفعهما إذا كانت ذاكرة المضيف وCPU تسمحان.

بالنسبة إلى Kubernetes، ثبّت المخطط مع work.enabled=true بدل كشف socket وقت تشغيل العقدة. ينشئ المخطط RBAC المحدود ومساحة أسماء البيئات وسياسات الشبكة وإعداد Pod/PVC المذكورة في دليل Kubernetes.

إعداد وقت التشغيل

يقرأ Work هذه المتغيرات في عملية الواجهة الخلفية:

المتغيرالافتراضيالغرض
WORK_RUNTIME_BACKENDdockerسائق البيئة: docker أو kubernetes
WORK_RUNTIME_IMAGEnode:22.22-bookworm@sha256:2d178f2785b96dfbf62a416ca2e40f50e30150b4ff3320d706f0d96e90600eb3صورة بيئات المهام
WORK_DOCKER_COMMANDdockerملف Docker CLI لواجهة Docker
WORK_COMMAND_TIMEOUT_MS120000مهلة الأمر الافتراضية
WORK_MAX_OUTPUT_CHARS50000أقصى مخرج أمر/بحث ملتقط
WORK_MAX_AGENT_ROUNDS48ميزانية جولات النموذج/الأداة لكل تشغيل ولكل الموفّرين
WORK_MEMORY_LIMIT2gحد الذاكرة لكل حاوية
WORK_CPU_LIMIT2حد CPU لكل حاوية
WORK_PIDS_LIMIT256حد العمليات لكل حاوية
WORK_PREVIEW_PORT4173المنفذ الذي يجب أن يستمع إليه التطبيق داخل الحاوية
WORK_PREVIEW_BIND127.0.0.1واجهة المضيف التي يُنشر عليها منفذ المعاينة
WORK_DOCKER_PUBLISHED_HOSTمثل WORK_PREVIEW_BINDالمضيف/IP الذي تطلبه الواجهة لمنافذ Work المنشورة من Docker
WORK_COMPUTER_SCREEN_PORT6080منفذ WebSocket لجسر الشاشة داخل الحاوية
WORK_COMPUTER_AUDIO_PORT6081منفذ WebSocket لجسر الصوت داخل الحاوية
WORK_RUN_LEASE_WAIT_MS60000مدة انتظار التشغيل لحامل إيجار مؤقت
WORK_MAX_ACTIVE_RUNTIMES_GLOBAL3مهام الحاويات المتزامنة لكل مثيل Libre WebUI
WORK_MAX_ACTIVE_RUNTIMES_PER_USER2مهام الحاويات المتزامنة لكل مسؤول
WORK_MAX_TASKS_GLOBAL500حد مهام Work الدائمة لكل مثيل
WORK_MAX_TASKS_PER_USER100حد مهام Work الدائمة لكل مسؤول
WORK_NETWORK_NAMElibre-webui-workشبكة bridge المدارة للمهام الشبكية
WORK_RUNTIME_DNSغير معيّنIPs محللات مفصولة بفواصل تُفرض على المهام الشبكية
WORK_DOCKER_SOCKETDOCKER_HOST إذا كان unix:// أو tcp://، وإلا /var/run/docker.sockنقطة Docker Engine للطرفيات التفاعلية
WORK_TERMINAL_MAX_SESSIONS_PER_TASK2الطرفيات التفاعلية المتزامنة لكل مهمة
WORK_TERMINAL_IDLE_TIMEOUT_MS900000مهلة الخمول قبل إغلاق جلسة طرفية
WORK_RUNTIME_IDLE_TIMEOUT_MS0 (معطّل)إيقاف البيئة بعد هذا الخمول، بما فيها المعاينات
WORK_K8S_NAMESPACElibre-webui-workمساحة أسماء Pods/PVCs لبيئات Kubernetes
WORK_K8S_STORAGE_CLASSافتراضي العنقودStorageClass لـPVCs مساحات Kubernetes
WORK_K8S_WORKSPACE_SIZE5Giحجم PVC الافتراضي لكل مهمة
WORK_K8S_POD_READY_TIMEOUT_MS900000أقصى انتظار لجاهزية Pod البيئة
WORK_K8S_POD_GONE_TIMEOUT_MS60000أقصى انتظار لاختفاء Pod محذوف

استخدم إصدار صورة أو digest ثابتًا في الإنتاج. قد تغير علامة صورة متحركة أدوات سطر الأوامر وحد الأمان من دون تغيير Libre WebUI.

تتشارك عمليات التشغيل والمعاينة ومساعد الملفات والأوامر وإعادة إنشاء البيئة حساب السعة نفسه داخل العملية. لا تُحسب عملية متداخلة على مهمة محسوبة كمهمة أخرى. تعيد الطلبات فوق حد قبول المهمة أو وقت التشغيل HTTP 429.

حدود البروتوكول والواجهة الثابتة

العنصرالحد
رسالة مهمة أو تشغيل جديد65,536 حرفًا وبايت UTF-8
معرّف النموذج عند إنشاء/تحديث المهمة500 حرف وبايت UTF-8
معرّف موفّر الإضافة200 حرف
التشغيلات النشطة لكل مهمة1
نص الأمر20,000 حرف
مهلة الأمر المطلوبة بأداة1 إلى 600 ثانية
جاهزية المعاينة15 ثانية
قراءة/كتابة ملف2,000,000 بايت من نص UTF-8
قائمة دليل مباشرةأول 1,000 إدخال
صفحة الرسائلحتى 200 رسالة و1,000,000 بايت
رسالة فردية دائمة100 KB
سياق المحادثة المرسل إلى النموذجآخر 30 رسالة مستخدم/مساعد، حتى 256 KB
مخرج أداة دائمنحو 20,000 حرف مصدر مع علامة
تلوين المحرر المباشر8,000 حرف و400 سطر
التنسيق في المتصفح100,000 حرف و4,000 سطر
مخرج حالة Git2,000,000 حرف ملتقط
مخرج فرق Git600,000 حرف ملتقط
سجل Git20 commit محليًا
مسارات طلب تجهيز Git واحد200
رسالة commit في Git4,000 حرف
حلقة الوكيل، كل مسارات الموفّرين48 جولة افتراضيًا، تُعد عبر WORK_MAX_AGENT_ROUNDS
ميزانية أمان استدعاء الأدواتmax(128, configured rounds × 8) استدعاء

الوصول إلى الملفات مخصص لنص UTF-8. المحرر المضمّن ليس محرر ملفات ثنائية، ولا يمكن فتح ملف أكبر من 2 MB عبر واجهة ملفات Work.

ملخص API

تقع كل النقاط تحت /api/work، وتتطلب المصادقة مع وصول Work الحالي من قاعدة البيانات. يقتصر Work افتراضيًا على المسؤولين؛ ويمكن لمسؤول فتح عمليات المهام العادية للمستخدمين النشطين. ويظل اختيار مجلد المضيف ونقاط سياسات/وصول المسؤول للمسؤولين فقط.

الطريقةالمسارالغرض
GET/capabilitiesتوفر وحدود وقت التشغيل/الموفّر المحدد
GET/tasksعرض مهام المسؤول الحالي
POST/tasksإنشاء مهمة وتشغيلها غير المتزامن الأول
GET/tasks/:idتحميل حالة المهمة والرسائل الحديثة
GET/tasks/:id/messagesصفحات الرسائل الأقدم
PATCH/tasks/:idإعادة التسمية أو تغيير مسار النموذج الصريح
DELETE/tasks/:idحذف المهمة ومساحة العمل الدائمة
POST/tasks/:id/runsبدء تشغيل متابعة
POST/tasks/:id/messagesمراسلة الوكيل أثناء تشغيل نشط
GET/tasks/:taskId/runs/:runId/eventsبث أحداث التشغيل الحية الموثقة باستخدام SSE
POST/tasks/:id/cancelإلغاء التشغيل النشط
GET/tasks/:id/approvalsالاعتمادات المعلّقة وحالة المراجعة التلقائية للمهمة
PUT/tasks/:id/approvalsتفعيل الاعتمادات للمهمة أو تعطيلها
POST/tasks/:id/approvals/:approvalIdالبت في اعتماد معلّق (مرة، أو دائمًا، أو رفض)
DELETE/tasks/:id/approval-rules/:ruleIdحذف قاعدة «السماح دائمًا»
GET/computer/setupحالة إعداد Work Computer (مسؤول)
POST/computer/setupبناء صورة GUI وإنشاء السياسة (مسؤول)
POST/tasks/:id/computer/startبدء جلسة Work Computer للمهمة
GET/tasks/:id/computer/controlمن يقود الشاشة؛ طلب الوكيل التحكم
POST/tasks/:id/computer/controlتولي الشاشة أو تجديد التحكم
DELETE/tasks/:id/computer/controlإعادة الشاشة إلى الوكيل
POST/tasks/:id/computer/teachحفظ عرض مسجل كمهارة معلّمة
POST/tasks/:id/computer/anchorحل العنصر تحت نقرة مسجلة
POST/computer/skills/:slug/traceإضافة سطر نجح/فشل إلى مهارة معلّمة
GET/tasks/:id/filesعرض دليل مساحة العمل
GET/tasks/:id/fileقراءة ملف نص من المساحة
PUT/tasks/:id/fileحفظ ملف نص في المساحة
GET/tasks/:id/gitقراءة حالة Git المحلية المحروسة وسجلها
GET/tasks/:id/git/diffقراءة فرق محلي محدود
POST/tasks/:id/git/initتهيئة Git محليًا
POST/tasks/:id/git/stageتجهيز مسارات مساحة صريحة
POST/tasks/:id/git/commitتنفيذ commit للتغييرات المجهزة
POST/tasks/:id/git/branchesإنشاء فرع محلي
POST/tasks/:id/git/switchالانتقال إلى فرع محلي نظيف موجود
POST/tasks/:id/preview/startبدء المعاينة المدارة
POST/tasks/:id/preview/stopإيقاف المعاينة المدارة

يُتحقق دائمًا من معرّف المهمة مقابل المالك الموثّق. تُقرأ حالة الحساب الحالية والدور وسياسة وصول Work من قاعدة البيانات في كل طلب، فيسري الإلغاء حتى لو حمل JWT قديم مطالبات دور متقادمة.

يحتفظ مخطط تحديث المهمة بحقل backend هو networkEnabled للتوافق الداخلي. ولا يظهر كعنصر مستقل في واجهة Work. اختر سياسة وقت تشغيل مسماة بافتراضي الشبكة المطلوب عند إنشاء المهمة؛ ولا تستخدم الحقل الخام كواجهة إعداد دائمة.

الحذف وتغييرات الحساب والنسخ الاحتياطي

حذف المهمة

حذف المهمة تدميري عمدًا:

  1. تعلّم الواجهة الخلفية المهمة كقيد الإنهاء، فلا تبدأ عملية قابلة للتغيير.
  2. يُلغى التشغيل النشط وتُوقف بيئة المهمة.
  3. يتحقق Libre WebUI من وسوم ملكية المهمة على موارد وقت التشغيل.
  4. تُزال الحاوية/Pod والوحدة المسماة/PVC.
  5. تُحذف المهمة من قاعدة البيانات، فتحذف معها تشغيلاتها ورسائلها.
  6. تُمسح مسودات المتصفح للمهمة بعد نجاح API.

إذا فشل تنظيف وقت التشغيل، يحتفظ Libre WebUI بسجل المهمة في قاعدة البيانات ويعيد خطأ، ليصلح المشغّل واجهة Docker أو Kubernetes ويعيد المحاولة. ولا يحذف البيانات الوصفية بصمت تاركًا بيئة أو مساحة غير متتبعة.

يختلف إيقاف تشغيل أو معاينة عن الحذف: يوقف التنفيذ ويحفظ الوحدة المسماة والمحادثة.

خفض رتبة المسؤول وحذف المستخدم

عند خفض رتبة مسؤول، يحفظ Libre WebUI إلغاء الدور قبل الاعتماد على تنظيف وقت التشغيل. يتحقق كل طلب Work لاحق من الدور الحالي ووضع الوصول. ثم تعلق الواجهة مهام المستخدم عندما لا يملك الدور الجديد وصولًا، وتحاول إجهاض التشغيلات وإيقاف البيئات. إذا فشل التنظيف، يبقى الوصول ملغيًا ويبلغ تحديث الدور بالفشل ليعيد المشغّل وقت التشغيل ويحاول مجددًا.

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

نسخ المهمة كاملة

تحتاج نسخة Work كاملة إلى:

  • قاعدة بيانات Libre WebUI، وفيها ملكية المهمة وأسماء موارد Docker أو Kubernetes وتوجيه الموفّر والتشغيلات والرسائل والنشاط؛ و
  • كل وحدة Docker أو PVC Kubernetes تحمل ai.libre-webui.managed=true، وفيها ملفات Work.

لا تحتاج الحاويات المؤقتة وعمليات المعاينة إلى نسخة. لنسخة متسقة، أوقف نشاط Work الجديد والواجهة الخلفية قبل التقاط قاعدة البيانات ومساحات المهام. اتبع عملية نسخة وحدات Docker أو لقطة موفّر تخزين Kubernetes للواجهة المستخدمة.

استعد قاعدة البيانات ومساحاتها المطابقة معًا. أعد إنشاء كل وحدة أو PVC بالاسم الدقيق المسجل، واستعد بيانات الملكية، بما فيها ai.libre-webui.task=<task UUID> وai.libre-webui.managed=true. لا يحفظ نسخ الملفات وحدها وسوم Docker أو Kubernetes. وينتج عن استعادة القاعدة وحدها سجلات بلا ملفات، وعن استعادة التخزين وحده فقد ملكية المهمة وأسماء الموارد التي يستخدمها Libre WebUI للعثور عليها والتحقق منها.

إذا كان التثبيت يستخدم بيانات اعتماد موفّرين مشفّرة أيضًا، فاتبع إرشادات Libre WebUI الرئيسية لنسخ دليل البيانات ومفتاح التشفير.

الترجمة واتجاه العربية RTL

واجهة Work كاملة مترجمة إلى اللغات الـ25 المدعومة: الإنجليزية والعربية والبنغالية والتشيكية والدنماركية والألمانية والإسبانية والفرنسية والهندية والإندونيسية والآيسلندية والإيطالية واليابانية والكورية والملايوية والهولندية والبولندية والبرتغالية والروسية والسويدية والتايلاندية والتركية والأوكرانية والفيتنامية والصينية.

تطبق العربية lang="ar" وdir="rtl" قبل عرض React. ينتقل الشريط إلى اليمين، وتشغل المحادثة يمين تقسيم سطح المكتب ومساحة العمل اليسار، وتنعكس الأيقونات، ويتبع التنقل RTL، ويستخدم السحب ولوحة المفاتيح دلالات RTL المرئية.

يبقى المحتوى التقني من اليسار إلى اليمين عندما يؤثر الاتجاه في الدقة:

  • الشيفرة والتلوين النحوي؛
  • مسارات نظام الملفات؛
  • معرّفات النماذج؛
  • الأوامر وسجلات المعاينة؛
  • مخرجات الأدوات وبياناتها الوصفية؛ و
  • محتوى كتل الشيفرة.

تستخدم أسماء المهام والمطالبات الطبيعية والأخطاء وأسماء الملفات وأوامر المعاينة اتجاه النص التلقائي عند الحاجة.

استكشاف الأخطاء وإصلاحها

وقت التشغيل غير متاح مع npx

يشغّل npx libre-webui الواجهة الخلفية على المضيف، لكنه لا يثبّت Docker. شغّل docker info كمستخدم نظام التشغيل نفسه الذي يبدأ Libre WebUI. إذا غاب الأمر أو تعذر عليه الوصول إلى daemon، فثبّت/ابدأ Docker أو أصلح صلاحيات المستخدم، ثم أعد تحميل Work.

وتأكد أيضًا من سلامة Ollama أو وجود إضافة إكمال/محادثة نشطة واحدة على الأقل مع نموذج وبيانات اعتماد للمسؤول الحالي.

وقت التشغيل غير متاح في Docker أو Kubernetes

ينبغي ألا يبلغ نشر Compose من المستودع ذلك: تتضمن الصورة Docker CLI ويركّب الملف socket المضيف. وعندما يحدث، تسمّي اللوحة السبب — CLI مفقودة في صورة مخصصة، أو تركيب socket محذوف/غائب، أو مجموعة socket لا ينتمي إليها المستخدم. للحالة الأخيرة، عيّن DOCKER_GID وأعد إنشاء الحاوية. راجع تشغيل Work عندما يكون Libre WebUI نفسه داخل Docker.

على Kubernetes، فعّل وقت التشغيل الأصلي بـ--set work.enabled=true. يبلغ Libre عندئذ kubernetes، ويفحص Kubernetes API، ويشغّل البيئات كـPods بمساحات PVC. لا تركّب socket وقت تشغيل حاويات العقدة؛ راجع دليل Kubernetes.

لا توجد نماذج متوافقة مع Work

في Ollama، افحص أو اختر نموذجًا يعلن tools. وفي الإضافة، تحقق من:

  • أن نوعها إكمال أو محادثة؛
  • أنها نشطة؛
  • ظهور النموذج الدقيق في خريطة نماذجها؛
  • امتلاك المسؤول الحالي مفتاح API صالحًا؛ و
  • تنفيذ النموذج البعيد لاستدعاء الأدوات لدى موفّره.

لا يوجّه Work إلى موفّر آخر كبديل.

يفشل تثبيت حزمة أو أمر Git بعيد

تأكد من تفعيل الشبكة في سياسة وقت التشغيل المسماة المحددة. لا يوجد مفتاح شبكة مستقل لكل مهمة. ثم افحص DNS والوكيل والجدار/NetworkPolicy والسجل والشهادة ووقت التشغيل والخدمة الأعلى. وتأكد من أن صورة وقت التشغيل تحتوي على الأمر المطلوب.

علامة Git محلية فقط ولا تجري عملية بعيدة. استخدم الطرفية أو أوامر النموذج لـGit بعيد فقط عندما تسمح سياسة الشبكة وبيانات الاعتماد بذلك عمدًا. لا تلصق رمز وصول طويل العمر في مساحة المهمة.

يتوقف التشغيل عند حد الوكيل

ربما استنفد النموذج ميزانية الجولات أو أمان استدعاءات الأدوات. يطلب Work تسليمًا نهائيًا بلا أدوات قبل الإنهاء، لذا راجع العمل المكتمل والخطوات الباقية. تبقى المهمة في يحتاج إلى إدخال، وهي نهاية للتشغيل لكنها لا تدعي اكتماله. ابدأ تشغيل متابعة للمواصلة في المساحة نفسها، أو ارفع WORK_MAX_AGENT_ROUNDS عمدًا لكل الموفّرين إذا سمحت موارد المضيف وسياسة تكلفة الموفّر.

HTTP 429 عند بدء العمل

بلغ المثيل أو المسؤول حد قبول أوقات التشغيل النشطة أو المهام الدائمة. انتظر توقف تشغيل أو معاينة، أو احذف مهام قديمة، أو ارفع إعداد WORK_MAX_* المقابل عمدًا على مضيف بموارد كافية.

لا تصبح المعاينة جاهزة

تأكد من استمرار الأمر وارتباطه بـ0.0.0.0 واستماعه على WORK_PREVIEW_PORT خلال 15 ثانية. مع أمر فارغ، يكتشف Work تلقائيًا برنامج dev في package.json أو index.html عاديًا، بما في ذلك تطبيق متداخل واحد. إذا ذكر الخطأ عدة تطبيقات أو غياب مدخل، فأدخل أمرًا صريحًا. تبدأ الأوامر المخصصة في /workspace، لذا استخدم cd <app-directory> && ... لتطبيق متداخل.

تعمل المعاينة على الخادم لا في متصفح بعيد

تأكد من أن النشر يشغّل build مع وكيل معاينة Work الموقّع، ثم أعد المعاينة لاستبدال عنوان loopback قديم. إذا حملت الصفحات ولم يعمل التحديث الساخن، فتأكد من أن الوكيل والنفق يسمحان بترقيات WebSocket على /api/work/previews/. ينبغي أن يبقى منفذ Docker على loopback ولا يحتاج إلى فتح جدار.

تبقى الملفات وتتوقف المعاينة

هذا متوقع بعد الإلغاء أو إعادة الواجهة أو إيقاف المعاينة أو فشل الجاهزية. عملية المعاينة مؤقتة؛ والوحدة المسماة دائمة. أعد فتح المهمة وابدأ المعاينة.

لا يمكن فتح ملف أو حفظه

تقبل API الملفات المضمّنة ملفات UTF-8 حتى 2 MB. إذا أفاد الحفظ بتغير الملف منذ فتحه، فأعد تحميله قبل التحرير كي لا تستبدل تغيير نموذج أو متصفح آخر.

يتحول التلوين عمدًا إلى نص عادي فوق 8,000 حرف أو 400 سطر. وللتنسيق حد منفصل 100,000 حرف و4,000 سطر، ولا يدعم إلا عائلات الملفات الموثقة.

يقول Work إنه يستعيد البيئات

لم يستطع البدء أو الإنهاء إثبات توقف بيئة معروفة. يبقى Work مغلقًا بأمان ويعيد المحاولة كل 10 ثوانٍ. أعد الوصول إلى daemon Docker أو Kubernetes API وافحص سجل الواجهة. لا تحذف صفوف المهام ما دامت مواردها الموسومة تحتاج إلى مطابقة.

يفشل حذف المهمة

تأكد من إمكان الوصول إلى وقت التشغيل المحدد. يُرفض مورد متعارض بلا وسم ai.libre-webui.task المتوقع بدل حذفه. حل تعارض الاسم/الملكية بحذر، ثم أعد الحذف.

ملخص الأمان

قبل تفعيل Work، تذكر:

  • يقتصر Work على المسؤولين افتراضيًا؛ وفتحه للجميع يجعل كل حساب نشط مشغّل بيئة، فقرر عمدًا. تبقى مساحات مجلد المضيف للمسؤولين دائمًا.
  • يجب أن تتحكم الواجهة في daemon Docker أو مساحة بيئات Kubernetes المعدّة.
  • تقلل الحاويات كشف الملفات لكنها ليست آلات افتراضية.
  • تملك المهام بلا سياسة غير متصلة خروج شبكة؛ تختار السياسات الافتراضي، وتبقى قيود الوجهات مسؤولية المشغّل.
  • لا تملك وحدات Work حصة قرص مستقلة.
  • علامة Git محلية فقط؛ ولا تركّب API بيانات اعتماد بعيدة أو تقبلها.
  • تبقى سياسة جدار المضيف وعزل daemon وقيود الخروج وحصص الوحدات الحقيقية ضوابط يفرضها المشغّل.
  • يتلقى الموفّرون البعيدون نتائج الأدوات المطلوبة، وقد تقع عدة استدعاءات لكل تشغيل.
  • تبقى منافذ المعاينة على loopback، ولا تظهر إلا بعناوين وكيل موقّعة وقابلة للإلغاء.
  • يقدم Docker Compose القياسي وقت Docker، ويقدم Kubernetes/Helm وقت Pod/PVC الأصلي عند work.enabled=true.
  • تحتاج النسخة الكاملة إلى قاعدة Libre WebUI ووحدات Work معًا.

مستندات ذات صلة