ترجمة آلية
تمت ترجمة هذه الصفحة تلقائيًا بواسطة الذكاء الاصطناعي وقد تحتوي على أخطاء. إذا كان هناك أي شيء غير واضح، يُرجى الرجوع إلى المصدر الإنجليزي.
المزامنة التزايدية¶
تم تصميم pplx-export batch للعمل بشكل متكرر: كل تشغيل يصدر فقط ما هو جديد أو
مُعدَّل، ويُصلح الفجوات التي تسببها عمليات التشغيل المتقطعة، ولا يعيد لمس
الخيوط التي أنهتها المنصة بالفعل. المصدر الوحيد للحقيقة حول "ما تم تصديره"
هو index/batch_state.json (BatchState،
pplx_export/core/state.py:63)، الذي يتم تحديثه بعد كل خيط — ولا توجد
نسخة ظل منفصلة.
a. المتطلبات الأساسية والاستخدام الأساسي¶
pplx-export index --account alice # refresh index/library_alice.json first
pplx-export batch --account alice # incremental export (early stop, resumable)
يرفض batch العمل بدون الفهرس
(pplx_export/commands/batch_cmd.py:79-81). يقوم --limit N و --mode <mode>
بتصفية صفوف الفهرس قبل التخطيط؛ يتم تخطي الصفوف التي تفتقد entryUUID
مع تحذير بدلاً من تعطل التشغيل (batch_cmd.py:95-100).
b. كيف تعمل الخطة التزايدية¶
- الفرز. يتم فرز صفوف الفهرس حسب
lastUpdated، الأحدث أولاً (batch_cmd.py:89). المحادثات الجديدة تمامًا والمحادثات القديمة المستأنفة (التي نقلهاlastUpdatedإلى الأعلى) تقع في القمة — هذا الترتيب هو ما يجعل التوقف المبكر آمنًا. - التصنيف. يقوم
plan_incremental(pplx_export/hooks/incremental.py:36-87) — وهي دالة خالصة مشتركة بينbatchوschedule— بتعيين إجراء واحد بالضبط لكل صف:
| الإجراء | الشرط | ما تفعله الدفعة |
|---|---|---|
new |
uuid لم يُرَ مطلقًا في batch_state |
تصدير |
updated |
يختلف lastUpdated عن القيمة المسجلة، أو --force |
إعادة تصدير |
done |
الحالة ok و lastUpdated لم تتغير |
تخطي |
expired |
أعادت المنصة ENTRY_EXPIRED في محاولة سابقة |
تخطي — نهائي، لا يُعاد أبدًا |
deleted |
أكد sync-deleted حذفًا عن بُعد |
تخطي — نهائي، لا يُعاد أبدًا |
- التوقف المبكر. افتراضيًا (لا
--fullولا--force) يتم اقتطاع أطول تشغيل متتالي من الإدخالات النهائية (done/expired/deleted) بالكامل ويتم احتسابه كـn_stopped(incremental.py:83-87). نظرًا لأن القائمة مرتبة من الأحدث إلى الأقدم، فإن كل ما هو أسفل إدخال غير متغير هو بالضرورة أقدم وغير متغير أيضًا — الاستمرار في المسح سيضيع الوقت فقط.
flowchart TD
IDX["library index rows<br/>sorted by lastUpdated, newest first"] --> PLAN["plan_incremental"]
PLAN --> NEW["new → export"]
PLAN --> UPD["updated → re-export"]
PLAN --> DONE["done → skip"]
PLAN --> TERM["expired / deleted → skip (terminal)"]
DONE --> STOP["early stop:<br/>trailing terminal run trimmed"]
TERM --> STOP
- التنفيذ. يتم وضع علامة على كل خيط تم تصديره فورًا (
mark_ok/mark_error/mark_expired/mark_deleted) ويتم حفظ ملف الحالة بعد كل عنصر (batch_cmd.py:154-201); كما يحفظKeyboardInterruptقبل النشر (batch_cmd.py:158-161). عمليات الكتابة ذرية — ملف مؤقت بالإضافة إلىos.replace(state.py:145-152) — لذا فإن التشغيل المتقطع لا يترك أبدًا JSON مقطوعًا.
c. إصلاح الفجوات بعد عمليات التشغيل المتقطعة¶
لا يدفن التوقف المبكر فجوة أبدًا. الخيوط التي فشلت (الحالة error) أو لم
يتم الوصول إليها تقع فوق اللاحقة النهائية، لذا فإن التشغيل التالي يعيد تخطيطها
كـ updated / new ويصدرها قبل الوصول إلى نقطة التوقف المبكر
(incremental.py:12-14، batch_cmd.py:206-208). إلى جانب حفظ الحالة لكل عنصر،
يمكن مقاطعة تشغيل دفعة في أي نقطة وإعادة تشغيله ببساطة.
إذا كان batch_state.json نفسه تالفًا، فلن يتم مسحه بصمت: يتم
إعادة تسمية الأصل إلى batch_state.json.corrupt-<timestamp> حتى لا تُفقد الحالات النهائية المسجلة
ويتم إعادة محاولتها دون داع (state.py:68-81).
d. --full و --force¶
| العلامة | التأثير | الحالات النهائية | متى تستخدم |
|---|---|---|---|
| (افتراضي) | توقف مبكر على التشغيل النهائي المتتالي | تم التخطي | كل تشغيل منتظم / مجدول |
--full |
مسح كامل، لا توقف مبكر؛ الخيوط غير المتغيرة لا تزال تُتخطى كـ done |
تم التخطي | شبكة أمان دورية، أو عند الاشتباه بفجوات في الأرشيف |
--force |
إعادة تصدير كل شيء، حتى الخيوط غير المتغيرة | لا تزال مستبعدة — لا تُعاد أبدًا | بعد إصلاحات خط الأنابيب التي يجب إعادة جلب البيانات الأولية |
يتم استبعاد الحالات النهائية من --force عن قصد: إعادة محاولة خيط منتهي الصلاحية أو
محذوف عن بُعد يهدر فقط الطلبات وميزانية التوقف (batch_cmd.py:120-127).
انظر أيضًا status: تقرير بدون شبكة عن
حساب الحالة وخطة التغيير المحسوبة بنفس دلالات plan_incremental
(new/updated/عدد التوقف المبكر).
تعمل مقارنة lastUpdated على تطبيع الأصفار الزائدة في
جزء الكسور من الثانية (.18033Z يساوي .180330Z; state.py:23-55)،
لأن المنصة تسقطها أحيانًا — مقارنة سلسلة نصية دقيقة قد تخطئ في تقدير
"تم التغيير" وتسبب تصديرات مكررة.
e. الحالات النهائية: expired و deleted¶
expired |
deleted |
|
|---|---|---|
| المعنى | قامت المنصة بتنظيف الخيط (نافذة احتفاظ ~3 أشهر)؛ أعادت محاولة التصدير ENTRY_EXPIRED |
حذف من المستخدم/عن بُعد، تم تأكيده بواسطة sync-deleted |
| تم التسجيل بواسطة | batch نفسه (mark_expired، state.py:131-134) |
pplx-export sync-deleted --online (mark_deleted، state.py:136-143) |
| أعيدت المحاولة؟ | أبدًا — ولا حتى مع --force |
أبدًا — ولا حتى مع --force |
| الدليل | استجابة ENTRY_EXPIRED |
حقل note: غياب الفهرس + GET /rest/thread/<uuid> → ENTRY_DELETED / ENTRY_EXPIRED / HTTP 404 |
e.1 sync-deleted: تأكيد الحذف عن بُعد¶
pplx-export sync-deleted --account alice # offline dry-run: list candidates only
pplx-export sync-deleted --account alice --online # confirm each candidate online
- المرشحون (بدون اتصال، بدون شبكة). أي خيط بحالة
okفيbatch_stateمفقود من اتحادentryUUIDلـ جميع فهارس حسابindex/library_*.jsonهو مرشح مشتبه به للحذف عن بُعد (pplx_export/commands/sync_deleted_cmd.py:148-212). الاتحاد عبر الحسابات مطلوب: خيط مملوك لـbobولكن تم تصديره بواسطةaliceمن خلال مساحة مشتركة لا يظهر أبدًا في فهرسaliceالخاص — فرق حساب واحد سيؤدي إلى نتائج إيجابية خاطئة لتلك المجموعة بأكملها. عندما لا يوجد فهرس قابل للاستخدام على الإطلاق، يتم تخطي كل مرشح بأمان مع تسجيل السبب. - تشغيل تجريبي افتراضيًا. بدون
--onlineيسرد الأمر فقط المرشحين — لا شبكة، لا تغييرات في الملفات. - تأكيد
--online. يتم التحقق من كل مرشح باستخدامGET /rest/thread/<uuid>، باستخدام حسابexport_viaللمرشح منthread.json(يتم تبديل ملف تعريف الارتباط تلقائيًا):
| النتيجة | النتيجة النهائية |
|---|---|
ENTRY_DELETED / ENTRY_EXPIRED / HTTP 404 |
تم التأكيد: batch_state يضع علامة نهائية deleted (يسجل note السبب)، وكل thread.json لذلك الخيط يحصل على طابع زمني remote_deleted في مكانه |
| الخيط لا يزال موجودًا | إيجابي خاطئ: يتم الإبلاغ عنه كما هو (قد لا يكون الفهرس محدثًا بالكامل — أعد تشغيل index وتحقق مرة أخرى)، لم يتغير شيء |
| 5xx / خطأ شبكة | لا تغيير في الحالة؛ يُترك المرشح للجولة التالية |
| 3 حالات 401/403 متتالية | إحباط سريع الفشل — لا يمكن لملف تعريف ارتباط منتهي الصلاحية إصلاح نفسه، والاستمرار قد يضع علامة خاطئة على الخيوط الحية (sync_deleted_cmd.py:333-337) |
يتم حفظ العلامات المؤكدة لكل عنصر، لذا فإن تشغيل --online المتقطع
لا يفقد شيئًا وإعادة التشغيل متسقة (sync_deleted_cmd.py:254-256).
f. مبدأ شاهد القبر¶
لا يتم حذف الأرشيفات المحلية أبدًا
هذا الأرشيف هو النسخة الاحتياطية الرسمية للمحادثات المصدرة.
يقوم sync-deleted فقط بتحديد ووضع علامة (شاهد قبر): فهو لا يحذف
أو ينقل أي ملف أرشيف. يؤكد التغيير شيئين بالضبط — حالة
batch_state ومفتاح علامة واحد في thread.json:
"remote_deleted": "2026-07-23T10:20:30Z"
الطابع متسق: مفتاح remote_deleted الموجود لا يتم
إعادة كتابته أو استبداله (sync_deleted_cmd.py:215-244).
g. الاتساق وإعادة العرض دون اتصال¶
- إعادة تشغيل
batchمقابل فهرس غير متغير لا يصدر شيئًا: كل صف يُصنف كـdoneويتوقف التشغيل عند نقطة التوقف المبكر. عمليات كتابة الحالة ذرية، والعلامات لكل خيط، وإعادة تأكيد الحذف لا تكرر أبدًا طابعremote_deleted. - يحتفظ الأرشيف بحمولات API الأولية (
raw_entries.json/raw_blocks.json)، لذا يمكن إعادة إنشاء الملفات المعروضة في أي وقت بدون وصول إلى الشبكة:
pplx-export re-render # rebuild conversation.md + turns/ everywhere
pplx-export re-render --dry-run # only list the thread directories
pplx-export re-render --thread-json # also sync interruptions / answer_variants keys
يقوم re-render بإعادة تحليل JSON الأولي باستخدام العارض الحالي
(pplx_export/commands/rerender_cmd.py:105-190): يتم إعادة كتابة conversation.md و
turns/turn_*.md، وإزالة ملفات الأدوار القديمة المرقمة فوق عدد الأدوار الحالي،
وترك المصادر والأصول و report.md و thread.json
دون تغيير. هكذا يتم نشر إصلاحات العارض على
الأرشيف بأكمله دون طلب واحد.
h. انظر أيضًا¶
- pplx-export.md — مرجع كامل لأمر
batch(--mode،--limit، التأخيرات) - maintenance-commands.md —
sync-deleted،re-renderوأوامر التعبئة الخلفية - archive-layout.md — أين توجد
batch_state.jsonوthread.json - rate-limiting.md — السرعة بين الخيوط، التوقف، الإحباط السريع للمصادقة
- ../architecture/export-pipeline.md — خط أنابيب التصدير الكامل
- ../architecture/offline-operations.md — خط أنابيب إعادة البناء دون اتصال بالتفصيل
- ../architecture/rate-limiting-errors.md — تصنيف الأخطاء ومعالجة الحالة النهائية