دع الوكيل ينفّذ العرض بنفسه
الوكيل ينفّذ العرض على سطح المكتب الحقيقي: يكتب take.json، يجرّبه، ينفّذه أثناء التسجيل، ثم تُحرَّر النتيجة وتُصدَّر.
بدل أن تنفّذ أنت العرض أمام الكاميرا، يستطيع الوكيل أن ينفّذه بنفسه. ينظر إلى شاشتك، ويحرّك الماوس الحقيقي، وينقر ويكتب ويمرّر الصفحة، بينما يسجّل ScreenPilot كل شيء. النتيجة تسجيل مع ملف storyboard.json مبدئي، وتدخل بعدها في دورة التحرير والتصدير المعتادة.
هذه الصفحة موجّهة للمطوّرين ولكل من يريد قراءة الملف الذي يكتبه الوكيل أو تعديله. اسم الملف take، ويُكتب take.json.
الدورة#
كل عرض ينفّذه الوكيل يمرّ بخمس خطوات. يشغّلها الوكيل، ويمكنك تشغيلها بنفسك من سطر الأوامر.
- الاستكشاف. انظر قبل أن تتصرف:
screenshot(مع شبكة إحداثيات من 0 إلى 1)، وwindows، وbrowser_openلتطبيقات الويب. نفّذ الإجراءات بأدوات التحكم مثلclickوtype_text، والتقط لقطة شاشة جديدة بعد كل إجراء للتأكد من نجاحه. - كتابة
take.json. اقرأ المخطط أولاً:take_schema(MCP) أوscreenpilot take-schema. - التجربة. شغّل
performمعdryRun(في سطر الأوامر:screenpilot perform take.json --dry-run). ينفّذ الإجراءات نفسها على سطح المكتب لكن دون تسجيل. إذا فشلت خطوة فالخطأ يذكر رقمها. أصلحها وأعد التشغيل حتى يمرّ كل شيء. - التنفيذ. شغّل
performدونdryRun. يسجّل ScreenPilot وينفّذ الخطوات، ثم يكتب مجلد جلسة فيه الفيديو وevents.jsonlوstoryboard.jsonمبدئي. - المراجعة والتصدير. افحص النتيجة بـ
analyzeوget_frames، وعدّل الـ storyboard، وتحقّق منه، وصدّر مسودة، وراجعها، ثم صدّر بجودة delivery. راجع مرجع الـ Storyboard.
say، لذلك تحتاج الإنترنت في أول مرة. المقاطع تُحفظ بجوار الـ take، فتُستعمل مجدداً في المرات التالية.الأوامر#
screenpilot screenshot [--screen eDP-1] [--grid] # what each monitor shows
screenpilot windows # open windows and their geometry
screenpilot browser --screen HDMI-A-1 --url https://example.com
screenpilot drive move eDP-1,0.5,0.5 # also: drive click, type, key, scroll
screenpilot take-schema # print the take.json schema
screenpilot perform take.json --dry-run # rehearse: same actions, no recording
screenpilot perform take.json # record and drive; writes the session folder
داخل تطبيق الذكاء الاصطناعي تكون هذه الخطوات أدوات MCP. القائمة الكاملة في صفحة الأدوات.
شكل الـ take#
الـ take ملف JSON واحد. الحقل الوحيد المطلوب هو steps.
| المفتاح | القيمة الافتراضية | وظيفته |
|---|---|---|
name | لا شيء | اسم للتعريف بالملف. |
screens | "all" | الشاشات التي تُسجَّل: "all" أو قائمة بأسماء الشاشات. |
voice | en-US-AndrewNeural والسرعة +0% والفاصل 0.35 | الصوت المستخدم في أسطر say (الحقول name وrate وgap، والفاصل بالثواني بين الأسطر). |
setup | [] | خطوات تُنفَّذ قبل بدء التسجيل: فتح التطبيقات وترتيب النوافذ. استخدمها مع browser وopen وrun وfocus وwaitForWindow. |
steps | مطلوب | العرض نفسه، وبه خطوة واحدة على الأقل. |
tail | 1 | عدد الثواني التي يستمر فيها التسجيل بعد آخر خطوة أو سطر صوتي. |
camera | "window" | كيف يؤطّر الـ storyboard المبدئي الفيديو: "window" يتبع التطبيق المستخدم، و"screen" يتبع الشاشة، و"all" يعرض كل الشاشات جنباً إلى جنب. خطوات view لها الأولوية دائماً. |
المسارات داخل الـ take (رابط browser أو goto إذا كان ملفاً) نسبية إلى ملف الـ take نفسه. اكتب site/index.html ولا تكتب مساراً مطلقاً من جهازك.
الأهداف#
الخطوات التي تشير إلى شيء على الشاشة (click وmove وdrag وscroll) تأخذ هدفاً. للهدف ثلاث صيغ.
| الصيغة | معناها | متى تستخدمها |
|---|---|---|
{ "web": "selector" } | عنصر في المتصفح التجريبي، يُعثر عليه بمحدد Playwright: CSS أو text=Submit أو role=button. | عندما يكون العرض تطبيق ويب. هذه الصيغة الدقيقة والمفضّلة: تجد العنصر أينما كان على الشاشة. |
{ "window": "match", "x": 0.5, "y": 0.5 } | نقطة داخل أول نافذة يحتوي صنفها أو عنوانها على match. القيمتان x وy بين 0 و1 داخل تلك النافذة. | تطبيق أصلي على سطح مكتب يستطيع سرد النوافذ. تبقى النقطة صحيحة حتى لو تحرّكت النافذة. |
{ "screen": "eDP-1", "x": 0.5, "y": 0.5 } | نقطة على شاشة واحدة بين 0 و1 (x من اليسار وy من الأعلى). بدون screen تكون الشاشة التي عليها المؤشر. | تعمل في كل مكان. وهي الصيغة الوحيدة التي تعمل على أسطح المكتب التي لا تتيح التحكم بالنوافذ (GNOME على Wayland). |
screenshot مع تفعيل grid واقرأ x وy من الشبكة. وللتأكد من وجود هدف {web} قبل النقر، استدعِ web_locate.كل الخطوات#
كل خطوة كائن له مفتاح رئيسي واحد. المفاتيح غير المعروفة تُرفض، فيظهر الخطأ المطبعي عند التحقق بدل أن يُتجاهل.
| الخطوة | خياراتها | ماذا تفعل |
|---|---|---|
say | voice, wait | سطر تعليق صوتي في هذه اللحظة. لا يبدأ سطر قبل أن ينتهي الذي قبله. مع wait: true يتوقف الـ take حتى ينتهي السطر. |
caption | dur (3), position (bottom أو top أو center) | يعرض نصاً قصيراً على الشاشة مدة dur ثانية. |
view | يوجّه الكاميرا إلى شاشة باسمها، أو إلى "all" لكل الشاشات. بدون خطوات view تتبع الكاميرا المؤشر. | |
browser | screen, url, app | يفتح المتصفح التجريبي على شاشة. app: true يخفي شريط العنوان والتبويبات فيظهر في الفيديو الصفحة وحدها. |
goto | ينقل المتصفح التجريبي إلى رابط أو مسار ملف. | |
move | dur | يحرّك المؤشر إلى هدف بحركة تشبه اليد. |
click | button (left أو right أو middle), count (من 1 إلى 3) | ينتقل إلى هدف وينقر. count: 2 نقر مزدوج. |
drag | dur | يضغط عند from ثم يحرّك إلى to ثم يفلت. كلاهما هدف. |
type | cps | يكتب نصاً في الحقل المحدد بسرعة بشرية. cps عدد الأحرف في الثانية. أعطِه نصاً، أو { "env": "NAME" } للأسرار. |
key | يضغط اختصاراً مثل ctrl+l أو enter أو alt+tab. على macOS استخدم cmd+l بدل ctrl+l. | |
scroll | at, horizontal | يمرّر بعدد صحيح من الخطوات. الرقم الموجب لأسفل (أو لليمين مع horizontal) والسالب لأعلى. at هدف ينتقل إليه المؤشر أولاً. |
wait | ينتظر عدداً من الثواني. | |
waitFor | web, timeout (30) | ينتظر ظهور عنصر في المتصفح التجريبي. يفشل إن لم يظهر في الوقت المحدد. |
waitForWindow | match, timeout (15) | ينتظر وجود نافذة يحتوي صنفها أو عنوانها على match. |
focus | match, screen | يُبرز نافذة، ويمكنه نقلها إلى شاشة محددة. |
open | يفتح ملفاً أو رابطاً بالتطبيق الافتراضي في النظام. | |
run | يشغّل برنامجاً من قائمة: ["xdg-open", "~/Downloads/x.pdf"]. لا يوجد shell، فلا أنابيب ولا علامات اقتباس. فضّل open. |
الخطوات say وcaption وview لا تلمس سطح المكتب. تُكتب في الـ storyboard المبدئي كتعليق صوتي وعناوين وتبديل للكاميرا، في لحظة حدوثها. وداخل setup لا تفعل شيئاً.
take كامل#
يملأ هذا الـ take نموذجاً على الويب، ثم ينزّل ملفاً ويفتحه في تطبيق أصلي على شاشة اللابتوب ويمرّر صفحاته. السطر الصوتي الأخير يغيّر الصوت. أسماء الشاشات (HDMI-A-1 وeDP-1) أمثلة فقط: استخدم الأسماء التي يعرضها screenshot أو doctor على جهازك.
{
"name": "Submit a support ticket",
"screens": "all",
"voice": { "name": "en-US-AndrewNeural", "rate": "+0%" },
"camera": "window",
"setup": [
{ "browser": { "screen": "HDMI-A-1", "url": "https://app.example.com/support", "app": true } }
],
"steps": [
{ "view": "HDMI-A-1" },
{ "say": "Let's open a support ticket.", "wait": true },
{ "wait": 0.6 },
{ "click": { "web": "input[name=subject]" } },
{ "type": "Cannot export my report" },
{ "click": { "web": "textarea[name=body]" } },
{ "type": "The export button spins forever on large reports." },
{ "caption": "Describe the problem", "dur": 3, "position": "top" },
{ "say": "Then we send it.", "wait": true },
{ "click": { "web": "text=Submit" } },
{ "waitFor": { "web": "text=Download receipt", "timeout": 20 } },
{ "click": { "web": "text=Download receipt" } },
{ "wait": 1.5 },
{ "open": "~/Downloads/receipt.pdf" },
{ "waitForWindow": { "match": "receipt", "timeout": 15 } },
{ "view": "eDP-1" },
{ "focus": { "match": "receipt", "screen": "eDP-1" } },
{ "say": "ورقة التأكيد وصلت وبتتفتح على طول.", "voice": "ar-EG-SalmaNeural", "wait": true },
{ "scroll": 3, "at": { "window": "receipt", "x": 0.5, "y": 0.5 } },
{ "key": "ctrl+w" }
],
"tail": 1.5
}
ما الذي يعطيك إياه perform#
ينتج الـ take المنفَّذ مجلد جلسة فيه الفيديو وevents.jsonl (النقرات فيه مأخوذة مما فعله المشغّل نفسه فهي دقيقة) وstoryboard.json. في هذا الـ storyboard تأتي التكبيرات موضوعة على النقرات، والتعليق الصوتي والعناوين في أوقاتها، وتبديلات الكاميرا. عدّله كأي storyboard آخر.
من سطر الأوامر يكون المجلد sessions/<timestamp> ما لم تمرّر --dir. ومن تطبيق ذكاء اصطناعي يكون مجلداً جديداً داخل مجلد ScreenPilot في مجلد Videos (وفي ماك Movies).
إذا فشلت خطوة يتوقف الـ take، ويحتفظ بما سُجّل حتى تلك اللحظة، ويذكر الخطوة التي فشلت. في تطبيق الذكاء الاصطناعي تحتوي النتيجة على failedStep وerror وpartial. شاهد التسجيل الجزئي لتعرف أين حدث الخطأ.
نصائح#
- قُل ثم انقر. ضع
sayمعwait: trueقبل النقرة المهمة، ليسمع المشاهد ما سيحدث قبل أن يحدث. - انتظر الشيء نفسه لا الوقت. بعد نقرة تحمّل شيئاً، استخدم
waitForأوwaitForWindowبدلwaitطويلة. اجعل الانتظار العادي بين 0.3 وثانية واحدة بعد تغيّر الصفحة. - اجعل الـ take قصيراً. ابقَ تحت 90 ثانية تقريباً. الـ take الأقصر أسرع في التجربة وأسهل في التحرير.
- اجعل الأسطر قصيرة. جملة واحدة وأقل من 12 كلمة تقريباً. التصدير يجمّد الفيديو إذا كان السطر أطول من مكانه، فتزيد الأسطر الطويلة وقتاً ميتاً.
- فضّل أهداف
{web}داخل المتصفح التجريبي. تجد العنصر نفسه، فلا تنكسر إذا تغيّر التخطيط. - الأسرار في البيئة. استخدم
{ "type": { "env": "NAME" } }. تُقرأ القيمة من متغيرات البيئة عند تنفيذ الخطوة ولا تُسجَّل ولا تُطبع. لا تكتب كلمة مرور داخلtake.jsonأبداً. - جرّب دائماً بـ dry run. التجربة تكلّف ثوانٍ، أما take حقيقي فاشل فيكلّف تسجيلاً.
- لا تُظهر شيئاً خاصاً. افتح الصفحات مع
"app": trueحتى لا يظهر شريط العنوان ولا التبويبات ولا مسارات الملفات المحلية.
ما الذي يدعمه كل سطح مكتب#
يعمل التحكم على KDE Plasma وأي سطح مكتب X11 وGNOME على Wayland وWindows وmacOS. ولا يعمل على sway وHyprland، مع أن التسجيل يعمل عليهما.
- KDE Plasma وأسطح مكتب X11 وWindows وmacOS: كل ما في هذه الصفحة يعمل، بما فيه أهداف
{web}و{window}والخطوتانfocusوwaitForWindow. - GNOME على Wayland: لا يوجد تحكم بالنوافذ. استخدم أهداف
{ "screen", "x", "y" }فقط. الخطوتانfocusوwaitForWindowوأهداف{window}و{web}تفشل مع رسالة خطأ. - sway وHyprland: التحكم غير ممكن.
على Wayland يطلب منك النظام الموافقة على نافذة التحكم عن بعد مرة واحدة عند أول استخدام. على macOS يحتاج تطبيق الذكاء الاصطناعي إلى إذن Accessibility. وعلى Windows لا يمكن التحكم بتطبيقات تعمل بصلاحيات المسؤول إلا إذا كان تطبيق الذكاء الاصطناعي يعمل بها أيضاً. الجدول الكامل في صفحة المنصات.