النشر الإنتاجي والسلامة

المشروع النهائي: مُعبِّئ نماذج التقديم للوظائف الآلي

50 دقيقة للقراءة

النتيجة: بنهاية هذا الدرس سيكون لديك وكيل استخدام حاسوب Claude يعمل يقرأ وصف الوظيفة، يفتح نموذج التقديم في متصفح حقيقي (معزول)، يملأ كل حقل بمحتوى مصمم لذلك الوصف، يرفق ملف PDF لسيرتك الذاتية — ويتوقف عند زر الإرسال لمراجعتك. لا تقديمات مفاجئة، لا تاريخ عمل مهلوس، لا تقديمات آلية مشبوهة.

هذا المشروع النهائي يجمع كل شيء من الوحدات الخمس السابقة: حلقة الوكيل (م1)، حاوية Docker (م2)، أتمتة سطح المكتب (م3)، أتمتة المتصفح (م4)، وحواجز الأمان (م5).

ما ستشحنه — هذا الأمر يشغّل الوكيل من البداية إلى النهاية:

python apply.py \
  --jd ./jds/anthropic-applied-ai.txt \
  --form https://boards.greenhouse.io/anthropic/jobs/4087737 \
  --resume ./me.pdf \
  --profile ./profile.yaml

المخرج: Chrome يفتح (داخل حاوية Docker)، الوكيل يملأ النموذج حقلاً بحقل مستشهداً بأي تفصيل من السيرة/الملف استخدم لكل، يرفع PDF، ويخرج بالمتصفح متوقفاً عند شاشة المراجعة. تنظر إلى النموذج، تعدّل إن لزم، وتضغط إرسال بنفسك.


الجزء 1 — إعداد المشروع (5 دقائق)

(انظر النسخة الإنجليزية أعلاه لهيكل الملفات الكامل والمتطلبات. profile.yaml يحتوي إجاباتك الثابتة: الاسم، البريد، الروابط، توقعات الراتب، صوت الكتابة).


الجزء 2 — حاوية Docker (5 دقائق)

الوحدة 2 الدرس 3 بنت هذا. تذكير سريع — Dockerfile يستخدم xvfb + chromium + xdotool + scrot. بناء:

docker build -t job-form-filler .
docker run --rm --env-file .env \
  -v $(pwd)/jds:/app/jds \
  -v $(pwd)/me.pdf:/app/me.pdf \
  -p 5900:5900 \
  job-form-filler

المنفذ 5900 هو VNC — لرؤية الوكيل يعمل مباشرة، اتصل بعارض VNC.


الجزء 3 — مخطط JD (10 دقائق)

قبل أن يلمس الوكيل المتصفح، يحلل الوصف ويقرر ما يعنيه "مصمم" لهذا الدور.

planner.py:

import yaml, json, re
from anthropic import Anthropic

client = Anthropic()


def plan(jd_text: str, profile: dict) -> dict:
    prompt = f"""أنت تجهّز طلب وظيفة. اقرأ JD وملف المرشح،
ثم أنتج مخطط JSON المعرّف أدناه. لا تخترع تاريخ عمل —
استخدم فقط الحقائق من الملف.

JD:
\"\"\"
{jd_text}
\"\"\"

PROFILE:
{yaml.safe_dump(profile, sort_keys=False)}

Return ONLY JSON:
{{
  "role_summary": "...",
  "why_us": "80-120 word paragraph",
  "highlights": ["3-5 bullets"],
  "answers": {{"years_experience": "...", "work_authorization": "...", "salary_expectations": "..."}}
}}
"""
    reply = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=2048,
        messages=[{"role": "user", "content": prompt}],
    )
    text = reply.content[0].text
    match = re.search(r"\{[\s\S]*\}", text)
    if not match:
        raise ValueError(f"المخطط لم يُرجع JSON:\n{text[:500]}")
    return json.loads(match.group(0))

لماذا خطوة مخطط منفصلة: سياق الوكيل المتصفح مزدحم أصلاً بلقطات الشاشة ودورات tool_use/tool_result. حساب الإجابات المصممة مرة واحدة يُبقي حلقة المتصفح مركزة على ميكانيكا الواجهة، ليس إعادة التفكير فيما يجب كتابته.


الجزء 4 — أدوات استخدام الحاسوب (10 دقائق)

أدوات استخدام الحاسوب القياسية من م3 + م4، بالإضافة إلى واحدة لرفع الملفات. (راجع tools.py في النسخة الإنجليزية للكود الكامل — take_screenshot, click, type_text, key, scroll, file_upload مع تأخيرات مناسبة).


الجزء 5 — حلقة الوكيل (10 دقائق)

apply.py يعرّف 3 أدوات:

  1. computer_20250124 — مُدارة من Anthropic (لقطة شاشة + نقر/كتابة بالإحداثيات)
  2. file_upload — أداة مخصصة لحوار ملف نظام التشغيل خارج إطار عرض المتصفح
  3. stop_for_reviewالحاجز الأهم — الوكيل يستدعي هذا بدلاً من النقر على "إرسال"

موجّه النظام يفرض:

  • لا تضغط إرسال أبداً. استدعِ stop_for_review عند اكتمال النموذج.
  • استخدم فقط معلومات من الخطة — لا تخترع تاريخ عمل.
  • إذا رأيت CAPTCHA/MFA، استدعِ stop_for_review فوراً.

الحلقة تعمل حتى 40 دوراً (نماذج طويلة تحتاج 40–60).


الجزء 6 — حواجز الأمان (10 دقائق)

الوحدة 5 الدرس 3 غطت هذه؛ في المشروع النهائي:

  1. أداة stop_for_review هي الحاجز الأساسي — موجّه النظام يمنع الضغط على إرسال.
  2. لا أداة bash — لا يستطيع الوكيل تنفيذ أوامر shell حرفياً.
  3. حقائق من الملف فقط — الموجّه يمنع تاريخ العمل المخترع.
  4. عزل Docker — الوكيل يعمل في حاوية بلا أدوات شبكة.
  5. فتحة نجاة CAPTCHA/MFA — توقف ومراجعة بشرية.

الجزء 7 — قائمة استكشاف الأخطاء

العرضأول شيء تتحقق منهالسبب المعتاد
الوكيل يحاول النقر على إرسالسجل الرسائلموجّه النظام لم يُحمّل — تأكد من تمرير system=SYSTEM_PROMPT
حوار رفع الملف يمتلئ بنفاياتسلوك ctrl+l في tools.pyبعض حوارات Linux تستخدم ctrl+location
حقول النموذج ممتلئة بشكل خاطئفحص blueprint في السجلاتالمخطط هلوس — شدّد موجّه النظام في planner.py
المتصفح يفتح لكن الوكيل لا يراهenv DISPLAY في DockerfileXvfb لم يبدأ
الوكيل يتوقف في الدور الثالثزد max_turnsالنماذج الطويلة تحتاج 40–60 دوراً
موجّه MFA يظهر والوكيل يتجمدتحقق من لقطة الشاشةالوكيل استدعى stop_for_review بشكل صحيح — أكمل MFA بنفسك

نقطة تحقق — أنجز هذا قبل ادعاء الشهادة

  1. شحن الحاوية. docker build + docker run يبدأ بلا أخطاء، Xvfb يبدأ.
  2. شحن المخطط. شغّل planner.plan(jd_text, profile) مستقلاً وتحقق من أن مخرج JSON يذكر تفاصيل من JD وملفك.
  3. شحن الحلقة الكاملة على نموذج واحد. اختر أبسط نموذج وجدته. الوكيل يجب أن يصل stop_for_review بنموذج ممتلئ تماماً.
  4. شحن الحالة الصعبة. جرّب نموذجاً بـ (أ) رفع ملف، (ب) قائمة منسدلة، (ج) مربع إجابة طويلة. الثلاثة يجب أن تعمل.
  5. التقط النموذج الممتلئ، سطر سجل stop_for_review، وتأكيد تقديمك النهائي — كإثبات عملك.

الآن لديك وكيل استخدام حاسوب آمن وقابل للنشر. كل نمط من الوحدات الخمس السابقة هبط للتو في سير عمل حقيقي.

التالي (اختياري): اربط هذا بكاشف لوحة وظائف (مثل خلاصات Greenhouse RSS) لتُصاغ تقديمات آلية للمنشورات الجديدة لمراجعتك كل صباح. :::

اختبار

الوحدة 5: النشر الإنتاجي والسلامة

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.