ترجمة آلية
تمت ترجمة هذه الصفحة تلقائيًا بواسطة الذكاء الاصطناعي وقد تحتوي على أخطاء. إذا كان هناك أي شيء غير واضح، يُرجى الرجوع إلى المصدر الإنجليزي.
هيكل استجابة API ودلالات الأخطاء¶
جزء من مرجع واجهة برمجة التطبيقات Perplexity — الخريطة الكاملة في فهرس API.
1. أساسيات هيكل الاستجابة (انضباط التحليل)¶
- البيانات الأولية المحفوظة في الأرشيفات الناجحة: يتم تخزين
raw_entries.json(عادي) وraw_blocks.json(مخطط، عند جلبه) جنبًا إلى جنب مع القطع الأثرية المقدمة؛ يمكن إعادة تشغيل التحليل/العرض دون اتصال (pplx-export re-render) دون إعادة الجلب. - استخراج الحقول مركزي في
sites/perplexity/parsers.py(انحراف المخطط يحتاج فقط إلى تغيير مكان واحد). - كشف الوضع (
normalize.detect_mode؛ شجرة القرار في export-pipeline.md): أعلى إشارة أولوية هي حقلsearch_modeلأي إدخال (التعيين في نهاية §3.9)؛ عندما تفشل جميع الإشارات، الرجوع — computer = URL/computer/tasks/أو metadata.mode=="4" أو index mode ∈ {ASI,COMPUTER}؛ council = توجد خطوة COUNCIL_RESEARCH؛ deep-research = توجد خطوة RESEARCH_ANSWER (قائم على المحتوى، لا يعتمد على التسميات الصينية)؛ وإلا search. - واجهة المستخدم الخاصة بـ computer تطوي كل شيء — اذهب دائمًا بواسطة إدخالات/كتل API؛ لا تستخدم نص واجهة المستخدم أبدًا كحدود للمحتوى.
- القناة المزدوجة للوكيل الفرعي (اكتُشفت 2026-07-19): المطالبة في
workflow_payload.objective_chunksالمخطط؛ الخطوات/الاستنتاج فيbackground_entriesالعادي؛ مرتبطة عبرworkflow_payload.id(toolu_X). - عناصر
WORKFLOW_ITEM_SOURCESغالبًا ما تحملtext_payload(نص استخراج الصفحة للوكيل الفرعي / جداول المقارنة؛ 450 ظهورًا عبر المكتبة، 408 داخل الحمولات المتداخلة في الخلفية) بالإضافة إلىsources_payload.sources(قائمة الروابط)؛ يظهر نفس المحتوى في كل من إدخال الخلفية العاديtextJSON الخطوة المضمنة وفي الحمولة المتداخلة المخطط — الوكلاء الفرعيون المرتكزون المقدمون عبر المسار العادي يحافظون بالفعل على النص (فحص المكتبة 2026-07-22: 408/408 موجود، لا شيء مفقود). related_queries/related_query_items(تم التسوية 2026-07-23): كل إدخال يحمل توصيات مطالبة السؤال التالي — اقتراحات متابعة يولدها النظام الأساسي لإجابة مكتملة؛related_queriesهو مصفوفة من نصوص التوصيات،related_query_itemsالعناصر المنظمة (uuid/upsell_type، إلخ). الاستنتاج الجنائي: uuid العنصر ليس uuid سلسلة (0/988 تطابق مع uuids سلسلة المكتبة)، ونصوص التوصيات لا تحتوي على أي تداخل مع استعلامات السلاسل الأخرى — لا يمكن حلها في علاقات بين السلاسل في الوقت الحالي؛ تظل فرضية "uuids سلسلة مخصصة مسبقًا (تتحقق عند النقر)" غير مثبتة. يتم حفظ البيانات بشكل طبيعي في الأرشيفraw_entries.json(ظهور في أكثر من نصف سلاسل مكتبة أرشيف واحدة)؛ لا حاجة لإجراء جمع إضافي؛ لا يبني الرسم البياني للعلاقات أي حواف منه.
2. دلالات الأخطاء والتحكم في المخاطر¶
| الأعراض | المعنى / المعالجة |
|---|---|
| 403 (مع صفحة تحدي cf) | حظر Cloudflare (بصمة TLS / التحكم في المعدل) — التراجع؛ urllib + ملفات تعريف الارتباط للمتصفح لا تسببه عمومًا |
| 401 / 403 على مستوى API (بدون صفحة تحدي cf) | انتهاء صلاحية/عدم صلاحية ملف تعريف ارتباط الجلسة — ترفع الأداة فورًا، لا تراجع؛ يفشل الدفعة بسرعة بعد 3 حالات فشل متتالية في المصادقة (تحديث ملف تعريف الارتباط) |
| 429 | تحديد المعدل — التراجع الأسي (مطبق في الأداة) |
| 5xx (500/502/503/504) | أخطاء خادم عابرة (504 غالبًا مهلة Cloudflare) — التراجع وإعادة المحاولة (مطبق في الأداة) |
| ENTRY_EXPIRED | تمت إزالته بواسطة النظام الأساسي (~3 أشهر) — نهائي، لا تعاود المحاولة |
| ENTRY_DELETED | تم حذفه بواسطة المستخدم/البعيد (أيضًا HTTP 400، رمز مختلف) — نهائي deleted، لا تعاود المحاولة |
_response_type: VIEW_COLLECTION_NOT_ALLOWED (HTTP 200) |
الحساب الحالي لا يمكنه عرض المساحة — أعد المحاولة بحساب يمكنه ذلك |
error_code: VIEW_THREAD_NOT_ALLOWED (HTTP 403) |
الحساب الحالي لا يمكنه عرض السلسلة (تم اختباره 2026-07-23: استقصاء uuid المتغير الشقيق؛ الكائن موجود ولكن لا يمكن الوصول إليه، ليس "غير موجود") |
status:"failed" بيانات فارغة |
نفس الفئة (شكل فشل get_collection) |
انضباط تحديد المعدل (مكافحة الحظر، متطلب مستخدم صريح): عشوائي 10–20 ثانية بين سلاسل الدفعة، لا تزامن، تراجع 429/403، تراجع-إعادة محاولة 5xx؛ الترقيم ≥3 ثوانٍ؛ إعادة الجلب المخطط ≥4 ثوانٍ؛ جلب بيانات المساحة ≥3 ثوانٍ. تصدير سلسلة واحدة = 1–2 طلب ≈ فتح الصفحة مرة واحدة.
2.1 دلالات الانقطاع — القيم المرصودة (2026-07-22؛ مصدر تصنيف الحقيقة: parsers.classify_wf_status)¶
حقل locked_reason: يظهر في thread_metadata / entries[] / background_entries[]
(على الجانبين العادي والمخطط). القيمة الوحيدة المرصودة:
| locked_reason | المعنى | التوزيع المرصود |
|---|---|---|
spending_limit_exceeded |
انقطاع حد الإنفاق (استنفاد الحصة؛ يتوقف سير العمل عند نقطة الانقطاع) | سلسلة واحدة بالضبط عبر المكتبة (علامات في كل من raw_entries و raw_blocks) |
حقل حالة سير العمل (workflow_block.status و workflow_payload.status المتداخل يشتركان في نفس التعداد) القيم المرصودة:
| الحالة | الدلالات | تعليق العرض (COMPLETED لا يحصل على شيء) |
|---|---|---|
WORKFLOW_COMPLETED |
إكمال عادي | — |
WORKFLOW_AWAITING_NEXT_STEPS |
في انتظار الخطوات التالية؛ مع locked_reason=spending_limit_exceeded هو انقطاع حد الإنفاق (يتوقف المحتوى عند نقطة الانقطاع)؛ بدون locked_reason، متقطع في انتظار الاستمرار |
⏸ 限额中断(内容截至中断点) (⏸ مقيد بالحد — يتوقف المحتوى عند نقطة الانقطاع) / ⏸ 中断待续 (⏸ متقطع، في انتظار الاستمرار) |
WORKFLOW_CANCELED |
ملغي (إجهاض المستخدم/النظام الأساسي) | ⛔ 已取消 (⛔ ملغي) |
WORKFLOW_CANCELEDلوحظ 19 مرة (16 رئيسية + 3 متداخلة)، عبر 7 سلاسل computer (a5e8f481/cfca382d/f2e5957d/8417b02a/2dc5716d/356f833e/ed3714ff).- ملاحظة: قد تتأخر حالة حمولة الارتساء للإدخال الرئيسي (لوحظ ارتساء COMPLETED بينما كانت الخلفية في الواقع CANCELED) —
الحالة الحقيقية للوكيل الفرعي هي
workflow_block.statusجانب الخلفية. - المهام الخلفية المتقطعة لا تنتج إشعار إكمال subagent_result؛ الحمولات الخلفية غير المستهلكة تعود إلى ملحق السلسلة (انظر "شلال الإسناد" في subagents-interruptions.md).
- الإجابات الفارغة في وضع computer (تم التحقق مرتين 2026-07، غير قابلة للاسترداد): في وضع computer، بعض الأدوار تحتوي على
إجابة فارغة لأن الخادم ببساطة ليس لديه إجابة — إعادة جلب API ترجع بيانات مطابقة للأرشيف، و
توسيع شريط "N steps completed" في واجهة المستخدم لا يطلق أي طلبات بيانات (عرض خالص من جانب العميل؛ واجهة المستخدم و
API يشتركان في مصدر واحد)، لذلك لا يمكن لـ API استردادها. فقط مجموعة فرعية من هذه الأدوار مرتبطة بـ
locked_reason=spending_limit_exceeded؛ الباقي لا يحمل أي علامة من جانب الخادم.
2.2 side_by_side_metadata: إشارة متغير إعادة كتابة الإجابة (تم التسوية 2026-07-23)¶
مسار الحقل: entries[].side_by_side_metadata (استجابة /rest/thread/<uuid> العادية).
عندما يولد النظام الأساسي إصدارات إجابة متعددة لنفس الاستعلام (تجربة A/B أو إعادة كتابة)، هذا هو
الأثر الوحيد المتبقي على الإدخال النشط حاليًا — نص المتغير المستبدل (النص/الخطوات/الاستشهادات) ليس في استجابة API للسلسلة (حالة حقيقية
b2d2632b: الاستجابة تحتوي على إدخال واحد فقط، 1 FINAL؛ المتغير 2 غير مرئي تمامًا).
المفاتيح والقيم المرصودة (دليل: b2d2632b خام؛ مسح المكتبة لـ 2442 إدخالًا):
{
"experiment_role": "override-default-model-class:qwen3_instruct-01f7f",
"sibling_uuid": "00000000-0000-5000-8000-000000000000",
"experiment_override": {"override-default-model-class": "qwen3_instruct"},
"selection_status": "SELECTED",
"execution_log": {}
}
| المفتاح | الدلالات (مرصودة/مفترضة) |
|---|---|
sibling_uuid |
يشير إلى متغير الإجابة الشقيق لنفس الاستعلام (معرف إدخال/سياق آخر). 7 سلاسل ظهرت عبر المكتبة؛ التحقيقات عبر الإنترنت (2026-07-23) تؤكد رابطًا ميتًا: حسابات كل من GET /rest/thread/<sibling_uuid> ترجع 403 VIEW_THREAD_NOT_ALLOWED (ليس 404/ENTRY_EXPIRED — يتعرف عليه الخادم ككائن موجود ولكن غير قابل للعرض)، وفتح /search/<sibling_uuid> في المتصفح (حساب المالك) يتم إعادة توجيه SPA إلى الصفحة الرئيسية — لا يمكن استرداد المتغيرات المستبدلة عبر sibling_uuid |
selection_status |
SELECTED = إجابة هذا الإدخال هي الإصدار المختار للعرض؛ جميع حالات المجموعة الضابطة هي SELECTION_STATUS_UNSPECIFIED |
experiment_role |
دور التجربة. المجموعة الضابطة تحمل بادئة [control] (6 حالات عبر المكتبة: [control]default-model-class:gpt41، إلخ.)؛ الحالة الحقيقية ليس لها بادئة (override-default-model-class:qwen3_instruct-01f7f، أي مجموعة المعالجة لتجربة تجاوز النموذج) |
experiment_override |
معلمات تجاوز التجربة (مثل override-default-model-class: qwen3_instruct)؛ لوحظ فقط على حالات مجموعة المعالجة |
execution_log |
لوحظ ككائن فارغ؛ دلالات غير معروفة |
معايير التضييق (تمييز "إعادة كتابة حقيقية تحتفظ بكلا الإصدارين" عن "تحكم A/B روتيني"):
sibling_uuid غير فارغ و (selection_status غير فارغ وليس SELECTION_STATUS_UNSPECIFIED،
أو experiment_role بدون بادئة [control]) → فقط b2d2632b يصيب من بين 2442 إدخالًا عبر المكتبة
(الحالة الحقيقية الوحيدة المؤكدة؛ الدقة والاستدعاء كلاهما 1 في هذه المكتبة، لكن n=1 لا يمكن استقراؤه).
سلوك الأداة: parsers.collect_answer_variants يستخرج الإصابات؛ adapter.get_thread
يسجل تحذيرًا + يكتب thread.json.answer_variants (المفتاح غائب عند عدم وجود إصابات)؛
re-render --thread-json يضيف/يزيل في المكان (idempotent). دليل الوقت: إدخال الحالة الحقيقية created→updated
دلتا هو 53.66 ثانية (تم إنشاؤه في 17:13، ثم إعادة كتابته/اختياره)، وأعادت الكتابة تقدم lastUpdated على مستوى السلسلة (إعادة تصدير تدريجية
يمكن أن تؤدي إلى إعادة جلب، لكن الاستجابة المعاد جلبها لا تزال تحتوي فقط على الإجابة النشطة؛ المتغيرات القديمة غير قابلة للاسترداد).
سجل الكشف وسير المعالجة (2026-07-23، sites/perplexity/variant_log.py):
- علامة السجل: كل إصابة تصدر سطر WARNING واحد مع العلامة القابلة للبحث الموحدة
ANSWER_VARIANT_DETECTED، بما في ذلك جميع حقول التحديد وإرشادات المعالجة، بشكل يشبه:ANSWER_VARIANT_DETECTED thread=<full uuid> uuid8=<8 chars> title="…" entry=<entry_uuid> sibling=<sibling_uuid> selection_status=SELECTED experiment_role=… | action: …المسار عبر الإنترنت (adapter.get_thread) يخرج في كل إصابة جلب فعلية؛ دون اتصالre-renderيخرج فقط عند إضافة/تغيير المحتوى المسجل (عمليات إعادة التشغيل المتطابقة لا تسبب إزعاجًا)؛batchيمرر أيضًا تذكيرًا بعدد الإصابات في سطر واحد في الملخص النهائي (دون كسر تنسيق الملخص الحالي). - السجل المركزي:
<out>/index/answer_variants_log.jsonl(ملف مدقق، ليس تحتlogs/المتجاهل بواسطة git) — JSON واحد لكل سطر (detected_at / source=online|offline / web_uuid / uuid8 / title / entry_uuid / sibling_uuid / selection_status / experiment_role)، مكرر حسب (web_uuid, entry_uuid)؛ عمليات التصدير/إعادة العرض المتكررة لا تضيف بلا نهاية؛ detected_at يحتفظ بوقت الرؤية الأولى. - الإجراء الموصى به عند الإصابة: الأشقاء هم روابط ميتة تجريبيًا (انظر الجدول أعلاه)؛ الإجابة البديلة عادةً
لا يمكن استردادها عبر API — تحقق يدويًا بسرعة مما إذا كانت الإجابة البديلة لا تزال قابلة للتحصيل (محادثة النظام الأساسي / ذاكرة المستخدم / لقطات الشاشة)؛ إذا كانت قابلة للتحصيل،
سجلها يدويًا كملف
rewritten_answer_variant.mdفي دليل السلسلة؛ إذا لم تكن كذلك،thread.json.answer_variants+ سجل jsonl يعمل كسجل نهائي قابل للتتبع.