Skip to content
Tutorials11 min read

شاهد وأوقف وأرجِع: مراقبة وكيل البرمجة المباشر في Potato

دليل لإعداد مراقبة وكيل البرمجة المباشر عبر Ollama أو Anthropic API أو Claude Agent SDK، ويشمل الإيقاف المؤقت والتراجع والتفريع وتصدير المسارات.

Potato Team

ما الذي يميّز المراقبة المباشرة

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

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

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

للاطلاع على مرجع الميزة الكامل، انظر الوثائق المصدرية.

تبث واجهة وكيل البرمجة المباشر إجراءات الوكيل في الوقت الفعلي، فتعرض فروق الكود ومخرجات الطرفية أثناء عمله:

واجهة وكيل البرمجة المباشر تعرض فروق الكود ومخرجات الطرفية في الوقت الفعليمراقبة وكيل برمجة مباشر مع تصيير الـ diff ومخرجات الطرفية في الوقت الفعلي

ثلاث واجهات خلفية

يمنحك Potato ثلاث واجهات خلفية للمراقبة المباشرة. تشغّل كل واحدة وكيل برمجة في بيئة معزولة وتبث إجراءاته إلى الواجهة لحظة وقوعها.

Ollama (محلي بالكامل)

تعمل واجهة Ollama الخلفية على جهازك بالكامل، من دون مفاتيح API ومن دون نداءات شبكية. الجأ إليها حين تكون قاعدة الكود حساسة، أو حين تريد التجريب فقط من دون تكديس فاتورة API.

أولاً، ثبّت Ollama واجلب نموذجاً يدعم استخدام الأدوات:

bash
# 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 الخلفية:

yaml
# 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.

bash
# Set your API key
export ANTHROPIC_API_KEY="sk-ant-..."
yaml
# 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: true

Claude Agent SDK (قدرات Claude Code كاملة)

واجهة Claude Agent SDK الخلفية هي الأقدر بين الثلاث، إذ تأتي بمجموعة أدوات Claude Code كاملة وبسلوك مستقل. وهي تتطلب حزمة claude-agent-sdk.

bash
# Install the Claude Agent SDK
pip install claude-agent-sdk
yaml
# 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».

bash
# 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 لتوسيم الصحة على مستوى الخطوة إلى جانب تتبع البرمجة

yaml
# 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 في مساحة العمل المعزولة، أو يستخدم المستودع الموجود فيها. وبعد كل تحرير ملف، يودع تلقائياً برسالة منظمة:

text
[potato-checkpoint] Step 7: Edit src/parser.py
- Modified lines 45-52
- Agent reasoning: Fix the regex pattern to handle escaped quotes

والنتيجة سجل إيداعات خطي يقابل خطوات المسار واحدة بواحدة. ويلتقط كل نقطة تحقق حالةَ مساحة العمل كاملة في تلك اللحظة.

bash
# 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 مسمّى ويتتبع المسارين معاً:

text
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 هو المسار المفضل ابتداءً من نقطة التفريع.

yaml
# 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

صيغ التصدير

تنتج الجلسة المباشرة بيانات مسار مفصّلة، ويمكنك تصديرها بأشكال عدة بحسب ما تدرّب عليه.

تصدير المسارات الخطية

صدّر كل فرع بوصفه مساراً مستقلاً:

bash
potato export \
  --format trajectories \
  --project ./output/ \
  --output ./training_data/trajectories.jsonl \
  --flatten_branches true
json
{
  "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:

bash
potato export \
  --format branch_preferences \
  --project ./output/ \
  --output ./training_data/branch_preferences.jsonl
json
{
  "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، لأن نقطة التراجع تكون عادةً خطوة الخطأ الأول:

bash
potato export \
  --format prm_from_branches \
  --project ./output/ \
  --output ./training_data/prm_live.jsonl

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

مجموعات بيانات مراجعة الأكواد

صدّر تعليمات المعلّقين وأسباب التراجع بوصفها بيانات تدريب لمراجعة الأكواد:

bash
potato export \
  --format code_review \
  --project ./output/ \
  --output ./training_data/code_review.jsonl

بداية سريعة كاملة

التسلسل كاملاً، من الصفر إلى جلسة Ollama عاملة:

bash
# 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 للحصول على بيانات تفضيل بين الوكلاء. وبما أن قسم الواجهة الخلفية وحده هو ما يتغير في التهيئة، فالإعداد سهل.

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