سطر أوامر محرّك الوسم وواجهة REST API وأدوات MCP وSDK
شغّل محرّك الوسم من potato label، أو من مسارات REST تحت /api/engine/v1، أو من خمس أدوات MCP للمحرّك، أو من الصنف Study في Python، وكلها تعمل على ملف engine.sqlite واحد.
يشغّل خادم التوسيم، وسطر الأوامر، وواجهة REST API، وأدوات MCP، وPython SDK كلها محرّك الوسم نفسه على ملف engine.sqlite نفسه في مجلد المهمة. فيمكنك أن تبدأ دراسة من سطر الأوامر، وتقدّم الطلبات البشرية بالخادم، وتُشهِد من دفتر ملاحظات (notebook).
لا تشغّل الدراسةَ إلا عمليةٌ واحدة في كل مرة. فالمخطِّط في الخادم العامل يحمل قفل الكتابة الخاص بالدراسة، وما دام يحمله يرفض potato label run وpotato label certify وStudy.run() العمل ويذكر ذلك. أشهِد عبر الخادم بدلاً من ذلك، باستخدام POST /api/engine/v1/certify أو صفحة الإدارة. والقفل موجود لأن مشغّلَين اثنين سيسحبان عيّنتي معايرة ويُشهِد كل منهما مقابل وسوم الآخر. ويُحرَّر القفل حين يخرج حامله. والحامل الذي قُتلت عمليته على الجهاز نفسه يُنتزع منه القفل فوراً، والحامل على جهاز آخر بعد دقيقتين دون نبضة حياة (heartbeat). أما أوامر القراءة فقط (status، certificate، calls، export) فتعمل في أي وقت.
سطر الأوامر
يأخذ كل أمر من أوامر المحرّك ملف إعداد الدراسة:
potato label <command> <config.yaml> [options]تغطي الأوامر التسعة الدراسة من أول استدعاء للنموذج إلى مجموعة البيانات المصدَّرة:
| الأمر | ما يفعله |
|---|---|
run | يَسِم كل عنصر بالسلسلة المتتالية، ويسحب عيّنة المعايرة العمياء، ويُشهِد، ويحسم. يتوقف --until predicted (الافتراضي) بعد تمريرة واحدة، ويستمر --until met حتى تُستوفى كل العقود أو يصير المحرّك منتظراً للبشر. ويأخذ أيضاً --max-items N و--budget-usd X (يتجاوز budgets.model_usd لهذا التشغيل) و--max-ticks N (20 افتراضياً) و--json. والتشغيل الذي قُطع يستأنف من حيث توقف دون تكرار استدعاءات النماذج. ويخرج بالحالة 1، مسمّياً المصدر، حين يكون آخر تشغيل لمصدر قد فشل أو كانت كل إجاباته أخطاء، أو حين لا يستطيع أي مصدر وسم مخطط يسمّيه عقد. |
status | العناصر، والتنبؤات، والطلبات حسب الغرض، والعقود، والإنفاق، والعناصر التي لا وسم لها بعد، وسطر لكل مصدر فيه أخطاء أو تشغيل فاشل أو متوقف مؤقتاً. --json. |
certify | يختبر كل عقد على وسوم cert الجديدة والتنبؤات الجديدة. وحين لا تتغيّر إلا وسوم dev، تعود النتيجة المخزّنة مع ملاحظة، ويختبر --retest القاعدة التي صار dev يختارها، في النظرة التالية (انظر النظرات). --json. |
certificate | شهادة الجودة. --format md (الافتراضي) أو html أو json، و--out FILE. |
export | الوسوم مع مصدرها، والشهادة (JSON، Markdown، HTML)، وبطاقة مجموعة البيانات، وسجل الاستدعاءات، في --out DIR (<output_annotation_dir>/labeling_engine افتراضياً). |
calls | سجل تدقيق استدعاءات النماذج بصيغة أسطر JSON. --out FILE. |
distill | يدرّب نموذجاً على الوسوم الموجودة حتى الآن ويضعه أولاً في السلسلة المتتالية. |
optimize | يقيّم كل مجموعة جزئية من السلسلة المتتالية على وسوم dev ويُبلغ عن أرخصها الذي يحافظ على التغطية. وحين لا تحافظ أي مجموعة جزئية على أي تغطية، لا يوصي بأي منها. ويطلب --prompts N أيضاً من مستوى LLM عدد N من إعادات الصياغة لموجّهه ويقيّم كلاً منها على عناصر dev. وهذه استدعاءات نماذج، تُسجَّل وتُحتسب من الميزانية، وتُخزَّن تحت إصدارات مصادر خاصة بها، في حين يُقيَّم الموجّه الحالي من تنبؤاته المخزّنة. ولا تتغيّر السلسلة المتتالية ولا الشهادة. |
migrate-config | يكتب نسخة من الإعداد فيها كتلة labeling_engine مكافئة لمفاتيح الذكاء الاصطناعي الأقدم فيه. --out FILE. انظر الانتقال إلى محرّك الوسم. |
لا تنفق متابعة التقدم شيئاً، لأن status وcertificate وصفحة الإدارة تقرأ النتائج المخزّنة. أما كل اختبار جديد، سواء أكان من certify على وسوم جديدة أم من certify --retest، فينفق جزءاً من ميزانية الخطأ الخاصة بالعقد.
الملفات التي يكتبها التصدير
يكتب potato label export أربعة أنواع من الملفات في مجلد المخرجات:
| الملف | المحتوى |
|---|---|
labels.jsonl، labels.csv | صف واحد لكل عنصر ومخطط، موسوماً كان أم لا، مع id وschema وlabel وlabel_origin (auto، human، adjudicated، ...) وstatus (accepted، وaccepted_uncertified في ظل threshold_legacy، وpending، وpending_recert) وsource وmodel وsource_version وconfidence وcontract_version وrequest_ids. والوسم الآلي الذي تغيّر مصدره منذ قبوله تكون حالته pending_recert حتى تُعيد التمريرة التالية الإشهاد عليه. |
certificate.json، .md، .html | الشهادة. |
README.md | بطاقة مجموعة بيانات مع ترويسة Hugging Face الأمامية (front matter)، مبنية من الشهادة. |
model_calls.jsonl | كل استدعاء للنماذج، مع النموذج، وتجزئات الموجّه والرد، والرموز، وزمن الاستجابة، والتكلفة، وإصابات ذاكرة التخزين المؤقت، وفئات الإخفاء. |
تُصدِّر أدوات التصدير العادية (python -m potato.export والتصدير من صفحة الإدارة) توسيمات البشر، وتسردها صفحة صيغ التصدير. ومن بينها صيغة labeling_engine، التي تكتب الملفات نفسها التي يكتبها potato label export، وترفض العمل حين لا يكون المحرّك مفعّلاً. وحين يكون المحرّك مفعّلاً، تضيف تصديرات CSV وParquet وHugging Face عمودين يذكران طلب المحرّك الذي أجاب عنه كل توسيم. يحمل engine_purpose الغرض، مثل calibration، ويحمل engine_request بيانات JSON فيها الغرض واحتمال الإدراج والظهور والقسم ومعرّف الطلب. استخدم هذين العمودين لفصل العيّنة العشوائية العمياء عن إجابات التحقق.
REST API
كل مسارات المحرّك تحت /api/engine/v1 وتعيد JSON. استوثق بمفتاح المسؤول في الترويسة X-API-Key أو بجلسة مسؤول. تحتاج القراءة إلى صلاحية لوحة تحكم المسؤول، ويحتاج certify وplan إلى صلاحية إدارة الإسناد، وتحتاج الشهادة إلى صلاحية التصدير.
| الطريقة والمسار | يعيد |
|---|---|
GET /status | العناصر، والتنبؤات، والطلبات، ومجاميع الاستدعاءات، والميزانيات، ولكل مخطط سلسلته المتتالية وعقوده وأعداد وسومه المحسومة |
GET /schemes/<name>/contracts | أحدث نتيجة لكل عقد على المخطط، مع وضع stale عليها إن تغيّرت السلسلة المتتالية |
GET /schemes/<name>/risk_coverage | لكل عتبة في المستوى الأخير، النسبة المقبولة، والخطأ الملاحَظ، والحد الأعلى المضمون، على وسوم cert |
GET /schemes/<name>/reliability | فئات الموثوقية وECE ودرجة Brier لكل مستوى، على وسوم المعايرة |
GET /schemes/<name>/drift | مراقب التدقيق لكل عقد مخاطرة انتقائية |
GET /schemes/<name>/optimize | تقرير السلسلة المتتالية الأرخص، مقيَّماً على وسوم dev |
GET /requests | أعداد الطلبات حسب الغرض والحالة، والطلبات نفسها. والمرشّحات هي purpose وstatus (كرّر المعامل أو افصل القيم بفواصل) وschema وlimit (1000 على الأكثر) |
GET /calls | سجل الاستدعاءات، الأحدث أولاً، والمجاميع حسب المصدر. limit (500 على الأكثر)، offset |
GET /certificate | الشهادة. format=json (الافتراضي) أو md أو html، ويخزّنها save=1 أيضاً |
GET /crowd | آخر خطة تعهيد جماعي وضعها المخطِّط، وهي تشغيل تجريبي ما لم يكن الإنفاق الفعلي مفعّلاً |
POST /certify | اختبار كل عقد الآن. ويختبر ?retest=1 (أو {"retest": true}) أيضاً القاعدة التي لم تغيّرها إلا وسوم dev |
POST /plan | تشغيل تمريرة واحدة للمخطِّط الآن |
تجيب المسارات بـ 404 حين يكون المحرّك معطّلاً للدراسة. وتجيب بـ 400 مع خطأ JSON عن معامل غير صالح، مثل limit ليس رقماً، أو purpose أو status غير معروفين، أو format غير json وmd وhtml.
مثلاً، يجلب هذا الطلب الشهادة الحالية بصيغة Markdown من خادم على المنفذ 8000:
curl -H "X-API-Key: $ADMIN_API_KEY" \
"http://localhost:8000/api/engine/v1/certificate?format=md"أدوات MCP
يتيح خادم MCP خمس أدوات للمحرّك، بالصلاحيات نفسها التي لمسارات REST:
engine_statusengine_requestsengine_run، الذي يشغّل تمريرة واحدة للمخطِّطengine_certify، الذي يأخذretestengine_certificate، بصيغةjsonأوmdأوhtml
منح هذه الأدوات والمحرّك معطّل تحذير تحقّق. وعبر potato mcp connect، يعود الاستدعاء المرفوض (صلاحية ناقصة، أو معامل خاطئ) خطأَ أداة يحمل رسالة الخادم. ويشرح توثيق خادم MCP منح الأدوات وربط عميل.
Python SDK
يشغّل الصنف Study المحرّك من Python، في دفتر ملاحظات مثلاً:
from potato.labeling_engine.sdk import Study
study = Study("examples/labeling-engine/text-certified-sentiment/config.yaml")
study.run() # label, sample, certify, resolve
for req in study.requests(status="open")[:5]:
study.label(req.item_id, req.schema, "positive", user="me")
study.certify()
print(study.certificate(fmt="md"))
study.export("out/")تقابل كل طريقة أمراً أو مساراً:
| الطريقة | ما تفعله |
|---|---|
Study(config_path) | تحميل الإعداد والعناصر |
run(until="predicted", max_ticks=20) | مثل potato label run، وتأخذ قفل الكتابة |
label(item_id, scheme, value, user, request_id=None) | تسجيل وسم وضعه شخص. تُغلق request_id، وإلا فطلباً يحمله هذا الشخص على العنصر، وإلا يُحتفظ به وسماً عضوياً لا يُشهِد أبداً. والوسم الثاني من الشخص نفسه على العنصر نفسه يحدّث وسمه الأول |
status() | مثل GET /status |
requests(status=None, purpose=None, ...) | سجل الطلبات |
certify(retest=False) | مثل potato label certify |
certificate(fmt="json") | json أو md أو html |
export(out_dir) | مثل potato label export |
يَسِم المثال كل طلب مفتوح بـ "positive" فقط لعرض الاستدعاءات. والوسم المسجَّل عبر Study.label الذي لا يجيب عن أي طلب يُحتفظ به وسماً عضوياً، والوسوم العضوية لا تُشهِد أبداً، لذا فإن السكربت الذي يَسِم عناصر لم يطلبها المحرّك يضيف وسوماً لا يقرؤها أي عقد.
قراءة إضافية
- محرّك الوسم
- إعداد محرّك الوسم
- عقود محرّك الوسم
- لوحة تحكم المسؤول، التي ترتبط بصفحة إدارة المحرّك
للاطلاع على تفاصيل التنفيذ، راجع الوثائق المصدرية.