شاهد وأوقف وأرجِع: مراقبة وكيل البرمجة المباشر في Potato
دليل لإعداد مراقبة وكيل البرمجة المباشر عبر Ollama أو Anthropic API أو Claude Agent SDK، ويشمل الإيقاف المؤقت والتراجع والتفريع وتصدير المسارات.
ما الذي يميّز المراقبة المباشرة
يجري معظم تقييم وكلاء البرمجة بعد وقوع الفعل: يعمل الوكيل، فينتج تتبعاً، ثم ينكب المراجعون على التسجيل لاحقاً. أما المراقبة المباشرة فتعمل بالعكس. يراقب المعلّق الوكيل وهو يعمل في الوقت الفعلي، ويرى كل تحرير ملف، وكل أمر طرفية، وكل خطوة تفكير لحظة وقوعها.
وهذا يغيّر ما يمكنك فعله. فإذا بدأ الوكيل يسلك مساراً خاطئاً، أمكن للمعلّق أن يتدخل قبل أن يهدر وقته هناك. ويمكنه الإيقاف المؤقت ليقرأ diff بتمعّن قبل أن يمضي الوكيل، أو أن يرسل تعليمة بلغة عادية ليعيد توجيهه. وأكثر ما أراه مفيداً هو التراجع: عند أي نقطة تحقق سابقة يمكنك الرجوع وترك الوكيل يجرّب مقاربة أخرى. وهذه الفروع هي بالضبط نوع البيانات الذي يحتاج إليه تعلّم التفضيل.
ليس هذا بديلاً عن التعليق التوضيحي على التتبعات الساكنة. إنه وضع مختلف ينتج نوعاً مختلفاً من البيانات. التعليق الساكن أفضل حين تريد كمّاً كبيراً بتكلفة يمكن توقعها. والمراقبة المباشرة أفضل حين تكون وراء بيانات موجّهة، أو تحاول فهم كيف يفشل الوكيل، أو تبني أزواج تفضيل من التفريع.
للاطلاع على مرجع الميزة الكامل، انظر الوثائق المصدرية.
تبث واجهة وكيل البرمجة المباشر إجراءات الوكيل في الوقت الفعلي، فتعرض فروق الكود ومخرجات الطرفية أثناء عمله:
مراقبة وكيل برمجة مباشر مع تصيير الـ diff ومخرجات الطرفية في الوقت الفعلي
ثلاث واجهات خلفية
يمنحك Potato ثلاث واجهات خلفية للمراقبة المباشرة. تشغّل كل واحدة وكيل برمجة في بيئة معزولة وتبث إجراءاته إلى الواجهة لحظة وقوعها.
Ollama (محلي بالكامل)
تعمل واجهة Ollama الخلفية على جهازك بالكامل، من دون مفاتيح API ومن دون نداءات شبكية. الجأ إليها حين تكون قاعدة الكود حساسة، أو حين تريد التجريب فقط من دون تكديس فاتورة API.
أولاً، ثبّت Ollama واجلب نموذجاً يدعم استخدام الأدوات:
# Install Ollama
curl -fsSL https://ollama.ai/install.sh | sh
# Pull a coding-capable model
ollama pull qwen2.5-coder:32b
# Verify the model is available
ollama listهيّئ Potato لاستخدام واجهة Ollama الخلفية:
# config.yaml
project_name: "Live Agent Observation - Ollama"
port: 8000
live_coding_agent:
enabled: true
backend: "ollama"
ollama:
model: "qwen2.5-coder:32b"
host: "http://localhost:11434"
temperature: 0.2
max_tokens: 4096
num_ctx: 32768 # Context window size
sandbox:
type: "docker" # "docker" or "local"
image: "python:3.11-slim" # Base image for sandboxed execution
workspace: "./workspace/" # Agent's working directory
timeout: 600 # Max seconds per agent session
streaming:
update_interval_ms: 100 # How often to push updates to the UI
buffer_output: true # Buffer terminal output for smoother rendering
checkpoints:
enabled: true
strategy: "git" # Git-based checkpoints
auto_commit_on_file_change: true
commit_message_prefix: "[potato-checkpoint]"Anthropic API (Claude مع استخدام الأدوات)
تتصل واجهة Anthropic API الخلفية بنماذج Claude مع استخدام الأدوات. تحصل على تفكير وتوليد كود أقوى مما تعطيه معظم النماذج المحلية، وفي المقابل تدفع ثمن نداءات API.
# Set your API key
export ANTHROPIC_API_KEY="sk-ant-..."# config.yaml
project_name: "Live Agent Observation - Claude"
port: 8000
live_coding_agent:
enabled: true
backend: "anthropic"
anthropic:
model: "claude-sonnet-4-20250514"
api_key_env: "ANTHROPIC_API_KEY"
max_tokens: 8192
temperature: 0.1
tools:
- "file_read"
- "file_edit"
- "bash_command"
- "directory_list"
- "file_search"
system_prompt: >
You are a coding agent. You will be given a task description and
access to a codebase. Use the provided tools to read files, make
edits, and run commands to complete the task. Think step by step
and verify your changes by running tests.
sandbox:
type: "docker"
image: "python:3.11-slim"
workspace: "./workspace/"
timeout: 900
allowed_commands: # Whitelist for bash commands
- "python"
- "pip"
- "pytest"
- "git"
- "ls"
- "cat"
- "find"
- "grep"
streaming:
update_interval_ms: 50
show_thinking: true # Show Claude's thinking in real time
checkpoints:
enabled: true
strategy: "git"
auto_commit_on_file_change: trueClaude Agent SDK (قدرات Claude Code كاملة)
واجهة Claude Agent SDK الخلفية هي الأقدر بين الثلاث، إذ تأتي بمجموعة أدوات Claude Code كاملة وبسلوك مستقل. وهي تتطلب حزمة claude-agent-sdk.
# Install the Claude Agent SDK
pip install claude-agent-sdk# config.yaml
project_name: "Live Agent Observation - Claude Agent SDK"
port: 8000
live_coding_agent:
enabled: true
backend: "claude_agent_sdk"
claude_agent_sdk:
api_key_env: "ANTHROPIC_API_KEY"
model: "claude-sonnet-4-20250514"
max_turns: 50 # Maximum number of agent turns
permission_mode: "auto" # "auto", "ask", or "restricted"
allowed_tools:
- "Read"
- "Edit"
- "Write"
- "Bash"
- "Glob"
- "Grep"
restricted_commands: # Bash commands to block
- "rm -rf /"
- "sudo"
- "curl"
- "wget"
sandbox:
type: "docker"
image: "node:20-slim"
workspace: "./workspace/"
timeout: 1200
mount_volumes:
- "./test-repo:/workspace/repo"
streaming:
update_interval_ms: 50
show_thinking: true
show_tool_inputs: true
checkpoints:
enabled: true
strategy: "git"
auto_commit_on_file_change: true
max_checkpoints: 100سير عمل التعليق التوضيحي
متى عمل الخادم، تمر جلسة المراقبة المباشرة بعدة مراحل.
بدء جلسة
يفتح المعلّق واجهة Potato فيرى حقل إدخال لوصف المهمة. ويلصق فيه أو يكتب المهمة التي ينبغي للوكيل إتمامها، مثل «أصلح الاختبار الفاشل في tests/test_parser.py الناتج عن صيغة التهيئة الجديدة» أو «أضف دعم الترقيم إلى نقطة النهاية /api/users».
# Start the server
potato start config.yaml -p 8000ينقر المعلّق على Start Agent فيبدأ وكيل البرمجة عمله. ويظهر كل إجراء في الوقت الفعلي في لوحة CodingTraceDisplay.
مراقبة الوكيل وهو يعمل
مع تشغيل الوكيل، تظهر كل خطوة في عارض التتبع:
- خطوات التفكير تظهر ككتل رمادية قابلة للطي تعرض تفكير الوكيل.
- قراءات الملفات تظهر ككتل كود مبرَزة البنية مع أرقام الأسطر ومسار الملف.
- تحريرات الملفات تظهر كـ diffs موحّدة بإبراز أحمر/أخضر.
- أوامر الطرفية تظهر ككتل طرفية داكنة مع الأمر ومخرجاته ورمز الخروج.
- شجرة الملفات تتحدّث في الشريط الجانبي مع إنشاء الملفات أو تعديلها أو قراءتها.
يعرض مؤشر تقدّم في الأعلى رقم الخطوة الحالية والزمن المنقضي. وتُعرض حالة الوكيل بصيغة Thinking... أو Editing file... أو Running command... وما إليها.
عناصر التحكم بالإيقاف المؤقت والتعليمات
أثناء تشغيل الوكيل، يمكن للمعلّق التدخل من شريط التحكم:
Pause: يجمّد الوكيل بعد اكتمال خطوته الحالية. فلا ينتقل إلى الخطوة التالية حتى يُستأنف. استخدمه لتفحص diff أو مخرجات طرفية بتمعّن قبل أن يمضي الوكيل.
Send Instruction: أثناء الإيقاف المؤقت (أو حتى أثناء التشغيل)، اكتب رسالة بلغة طبيعية تُحقن في سياق الوكيل. مثلاً: «لا تعدّل مخطط قاعدة البيانات، استخدم migration بدل ذلك» أو «راجع سجل الأخطاء في /var/log/app.log قبل إجراء أي تغيير».
Resume: يتابع تنفيذ الوكيل بعد الإيقاف المؤقت.
Stop: ينهي جلسة الوكيل تماماً. ويُحفظ المسار حتى هذه النقطة.
يمكن للمعلّقين تقييم عمل الوكيل باستخدام تعليق PRM إلى جانب عرض التتبع:
واجهة تعليق PRM لتوسيم الصحة على مستوى الخطوة إلى جانب تتبع البرمجة
# Control bar configuration
live_coding_agent:
controls:
pause_enabled: true
instruction_enabled: true
stop_enabled: true
rollback_enabled: true
branch_enabled: true
pause_keyboard_shortcut: "Space"
instruction_keyboard_shortcut: "i"نظام نقاط التحقق المبني على Git
نظام نقاط التحقق هو ما يجعل بقية هذا يعمل. فالتراجع والتفريع وتصدير المسارات كلها تعتمد عليه، وهو يؤدي عمله بالإيداع في git بعد كل تغيير يجريه الوكيل على الملفات.
كيف يعمل
عند بدء الجلسة، يهيّئ Potato مستودع git في مساحة العمل المعزولة، أو يستخدم المستودع الموجود فيها. وبعد كل تحرير ملف، يودع تلقائياً برسالة منظمة:
[potato-checkpoint] Step 7: Edit src/parser.py
- Modified lines 45-52
- Agent reasoning: Fix the regex pattern to handle escaped quotes
والنتيجة سجل إيداعات خطي يقابل خطوات المسار واحدة بواحدة. ويلتقط كل نقطة تحقق حالةَ مساحة العمل كاملة في تلك اللحظة.
# You can inspect checkpoints directly with git
cd workspace/
git log --oneline
# Output:
# f8a2c1d [potato-checkpoint] Step 12: Edit tests/test_parser.py
# 3b7e9f0 [potato-checkpoint] Step 10: Edit src/parser.py
# a1c4d8e [potato-checkpoint] Step 8: Edit src/parser.py
# 9e2f6b3 [potato-checkpoint] Step 5: Edit src/config.py
# 7d0a3c1 [potato-checkpoint] Step 0: Initial stateالتراجع
انقر Rollback واختر أي نقطة تحقق سابقة من القائمة المنسدلة. يعيد Potato مساحة العمل إلى تلك الحالة بـ git checkout ويرجع عرض المسار ليطابقها، ثم يستأنف الوكيل من هناك بسياق مقتطع إلى تلك الخطوة.
هذه هي الحركة المناسبة حين ترى الوكيل يسلك منعطفاً خاطئاً. فبدل تركه يعمل ويحرق الوقت، ترجع إلى آخر حالة سليمة وتدعه يحاول ثانية، وربما مع تعليمة تدفعه إلى مكان أفضل.
تفريع المسارات
التفريع تراجعٌ يحتفظ بكلا المسارين. فحين تتراجع ويسلك الوكيل طريقاً مختلفاً، ينشئ Potato فرع git مسمّى ويتتبع المسارين معاً:
Step 0 → Step 1 → Step 2 → Step 3 → Step 4 (Branch A: original path)
↘
Step 3' → Step 4' → Step 5' (Branch B: after rollback)
يمكنك التفريع من أي نقطة تحقق، فتبني شجرة مسارات كاملة. وهذا كنز لتعلّم التفضيل، لأن كل زوج فروع هو أصلاً مقارنة موسومة: أنت تراجعت تحديداً لأنك حكمت بخطأ الفرع A، وهذا يجعل الفرع B هو المسار المفضل ابتداءً من نقطة التفريع.
# Branching configuration
live_coding_agent:
branching:
enabled: true
max_branches_per_session: 10
auto_name_branches: true # "branch-A", "branch-B", etc.
require_reason_on_rollback: true # Annotator must explain why they rolled back
compare_branches_view: true # Side-by-side view of branch outcomesصيغ التصدير
تنتج الجلسة المباشرة بيانات مسار مفصّلة، ويمكنك تصديرها بأشكال عدة بحسب ما تدرّب عليه.
تصدير المسارات الخطية
صدّر كل فرع بوصفه مساراً مستقلاً:
potato export \
--format trajectories \
--project ./output/ \
--output ./training_data/trajectories.jsonl \
--flatten_branches true{
"session_id": "session_001",
"branch": "branch-A",
"task": "Fix the failing test in tests/test_parser.py",
"steps": [
{"step_idx": 0, "type": "file_read", "path": "tests/test_parser.py", "...": "..."},
{"step_idx": 1, "type": "thinking", "content": "The test expects..."},
{"step_idx": 2, "type": "file_edit", "path": "src/parser.py", "diff": "..."},
{"step_idx": 3, "type": "bash_command", "command": "pytest tests/test_parser.py"}
],
"human_interventions": [
{"after_step": 2, "type": "instruction", "content": "Use a migration instead"}
],
"rollback_from_step": null,
"outcome": "resolved"
}أزواج التفضيل من الفروع
صدّر أزواج الفروع بوصفها بيانات تفضيل لـ DPO أو RLHF:
potato export \
--format branch_preferences \
--project ./output/ \
--output ./training_data/branch_preferences.jsonl{
"session_id": "session_001",
"task": "Fix the failing test in tests/test_parser.py",
"branch_point_step": 2,
"branch_point_reason": "Agent started modifying the wrong file",
"rejected_branch": "branch-A",
"rejected_steps": [
{"step_idx": 3, "type": "file_edit", "path": "src/wrong_file.py", "...": "..."},
{"step_idx": 4, "type": "bash_command", "command": "pytest", "exit_code": 1}
],
"chosen_branch": "branch-B",
"chosen_steps": [
{"step_idx": 3, "type": "file_edit", "path": "src/parser.py", "...": "..."},
{"step_idx": 4, "type": "bash_command", "command": "pytest", "exit_code": 0}
]
}وسوم PRM من المراقبة المباشرة
يمكنك ضم المراقبة المباشرة إلى توسيم PRM، لأن نقطة التراجع تكون عادةً خطوة الخطأ الأول:
potato export \
--format prm_from_branches \
--project ./output/ \
--output ./training_data/prm_live.jsonlهنا تُوسم الخطوة التي تراجعت عنها بوصفها الخطأ الأول، وتُوسم خطوات الفرع الجديد بأنها صحيحة، لأنك قبلتها.
مجموعات بيانات مراجعة الأكواد
صدّر تعليمات المعلّقين وأسباب التراجع بوصفها بيانات تدريب لمراجعة الأكواد:
potato export \
--format code_review \
--project ./output/ \
--output ./training_data/code_review.jsonlبداية سريعة كاملة
التسلسل كاملاً، من الصفر إلى جلسة Ollama عاملة:
# 1. Install Potato with live agent support
pip install potato-annotation[live-agents]
# 2. Install and start Ollama
curl -fsSL https://ollama.ai/install.sh | sh
ollama pull qwen2.5-coder:32b
# 3. Set up a workspace with a repo to work on
mkdir -p workspace/
git clone https://github.com/example/test-project workspace/repo
# 4. Create the config file
cat > config.yaml << 'YAML'
project_name: "Live Agent Observation"
port: 8000
live_coding_agent:
enabled: true
backend: "ollama"
ollama:
model: "qwen2.5-coder:32b"
host: "http://localhost:11434"
temperature: 0.2
num_ctx: 32768
sandbox:
type: "local"
workspace: "./workspace/repo"
timeout: 600
streaming:
update_interval_ms: 100
checkpoints:
enabled: true
strategy: "git"
auto_commit_on_file_change: true
controls:
pause_enabled: true
instruction_enabled: true
rollback_enabled: true
branch_enabled: true
branching:
enabled: true
max_branches_per_session: 5
require_reason_on_rollback: true
annotation_schemes:
- annotation_type: radio
name: outcome
label: "Final outcome"
options:
- value: "resolved"
text: "Task Fully Resolved"
- value: "partial"
text: "Partially Resolved"
- value: "failed"
text: "Failed"
- annotation_type: text_input
name: notes
label: "Session Notes"
placeholder: "Key observations about agent behavior..."
required: false
output:
path: "./output/"
format: "jsonl"
export_formats:
- "trajectories"
- "branch_preferences"
- "prm_from_branches"
annotators:
- username: "observer1"
password: "observer_pw_1"
YAML
# 5. Start Potato
potato start config.yaml -p 8000
# 6. Open http://localhost:8000 in your browserبعد تسجيل الدخول، الصق مهمة مثل «أضف تحقق المدخلات إلى نقطة النهاية POST على /api/users» وانقر Start Agent. راقبه وهو يعمل، وأوقفه مؤقتاً حين يبدو شيء ما في غير محله، وأرسل تعليمات لتوجيهه، وتراجع لتجرّب مقاربات أخرى. وحين تنتهي، قيّم النتيجة ودوّن ملاحظاتك.
ممارسات مفيدة
ابدأ بمهام واضحة ومحدودة النطاق. أفضل نطاق هو عمل يستغرق من الوكيل 5 إلى 15 دقيقة. فما هو أقصر من ذلك لا ينتج مساراً يستحق التعليق، وما هو أطول بكثير يرهق المعلّق.
استخدم عزل Docker في الإنتاج. وضع العزل المحلي مقبول أثناء التطوير، لكن Docker يمنع الوكيل من المساس بنظامك المضيف. استخدمه دائماً مع النماذج غير الموثوقة.
سجّل أسباب التراجع. فعّل require_reason_on_rollback ليأتي كل نقطة تفريع معها ملاحظة بشرية عما ساء. هذه الملاحظات إشارة تدريب مفيدة بحد ذاتها، وهي تحسّن بيانات التفضيل.
قارن بين واجهات خلفية متعددة. شغّل المهام نفسها عبر Ollama وAnthropic API وClaude Agent SDK للحصول على بيانات تفضيل بين الوكلاء. وبما أن قسم الواجهة الخلفية وحده هو ما يتغير في التهيئة، فالإعداد سهل.
صدّر مبكراً وباستمرار. شغّل تصديراً بعد كل جلسة بدل تأجيل ذلك كله إلى النهاية. فتخسر أقل إن انهار شيء، ويمكنك متابعة جودة البيانات أولاً بأول.