diff --git a/docs/ar/index.mdx b/docs/ar/index.mdx
index 217b561b2..0887d98c1 100644
--- a/docs/ar/index.mdx
+++ b/docs/ar/index.mdx
@@ -1,19 +1,20 @@
---
-title: "اجعل وكيلك آمناً من الأعطال"
-description: "المراقبة والإنفاذ لكل بيئة تشغيل يعمل بها وكيلك — واجهات سطر الأوامر للترميز، بوابات الدردشة، المساعدات المستضافة ذاتياً، ووكلاؤك المجهزون بأدوات المراقبة."
+---
+title: "اجعل وكيلك آمنًا تماماً"
+description: "قابلية الملاحظة والتطبيق لكل بيئة تشغيل يعمل فيها وكيلك — واجهات سطر الأوامر للترميز، بوابات الدردشة، المساعدات المستضافة ذاتياً، والوكلاء المزودين بأدوات المراقبة الخاصة بك."
icon: "shield-check"
---
-يساعد Failproof AI الفرق على فهم ما فعله الوكيل، واكتشاف مكان فشله، ونشر الحماية قبل تكرار السلوك نفسه مرة أخرى.
+Failproof AI يساعد الفرق على فهم ما فعله الوكلاء، والعثور على أماكن فشلهم، ونشر الحماية قبل حدوث نفس السلوك مرة أخرى.
-**البيئة التشغيلية** هي ما يعمل وكيلك بداخله فعلياً. يتصل Failproof AI بـ 12 منها — واجهات سطر الأوامر للترميز مثل Claude Code و Codex، بوابات الدردشة مثل Hermes، المساعدات المستضافة ذاتياً مثل OpenClaw — وتطبق الأحداث والسياسات وسجل الجلسات نفسه على كل واحدة منها. يرسل الوكلاء بدون بيئة تشغيلية البيانات من خلال [Python SDK](/ar/reference/custom-agents)، الذي يتتبع ويدقق فيها؛ لإنفاذ سياسة هناك تحتاج إلى hook في runtime الخاص بك.
+**البيئة التشغيلية** هي أي شيء يعمل فيه وكيلك بالفعل. Failproof AI يربط 12 منها — واجهات سطر أوامر للترميز مثل Claude Code و Codex، وبوابات دردشة مثل Hermes، ومساعدات مستضافة ذاتياً مثل OpenClaw — وتنطبق نفس الأحداث والسياسات وسجل الجلسات على كل واحدة منها. الوكلاء الذين ليس لديهم بيئة تشغيلية يقدمون تقارير من خلال [Python SDK](/ar/reference/custom-agents)، الذي يتتبعهم ويقومون بتدقيقهم؛ تطبيق سياسة هناك يتطلب خطاف في وقت التشغيل الخاص بك.
-
- استخدم المهارة لتجهيز مشروعك، واتصل به، وتحقق من وصول سجلات الوكيل.
+
+ استخدم المهارة لأتمتة مشروعك وتوصيله والتحقق من وصول سجلات الوكيل.
- حلل واستعلم وأنشئ لوحات معلومات وقم بعمليات تدقيق باللغة الطبيعية على سجلات الوكيل.
+ حلل واستعلم وقم ببناء لوحات معلومات وتشغيل عمليات التدقيق باللغة الطبيعية على سجلات وكيلك.
@@ -22,20 +23,20 @@ icon: "shield-check"
تابع استدعاءات النموذج والأدوات والأخطاء والمدخلات البشرية والكمون وقرارات السياسة في جلسة واحدة.
- دقق مجموعة محددة من الجلسات، راجع النتائج المدعومة بالأدلة، وتتبع التصحيح كمشاكل.
+ قم بتدقيق مجموعة محددة من الجلسات وراجع النتائج المدعومة بالأدلة وتابع الإصلاح كمشاكل.
- حول طريقة فشل معروفة إلى سياسة، راقب تأثيرها، ونشرها عبر أسطولك.
+ حول وضع فشل معروف إلى سياسة وراقب تأثيره ونشره عبر أسطولك.
-> **الجلسة → التدقيق → البحث → المشكلة → السياسة**
-> تتبع ما حدث، ابحث عن الفشل، أدر الاستجابة، ثم منع السلوك نفسه في الأدوار المستقبلية.
+> **جلسة → تدقيق → نتيجة → مشكلة → سياسة**
+> تتبع ما حدث، أوجد الفشل، أدر الاستجابة، ثم منع نفس السلوك في التشغيلات المستقبلية.
## ابدأ من هنا
-إذا كنت تنشر وكيلك المجهز بأدوات المراقبة للمرة الأولى، ابدأ بـ [الدليل السريع](/ar/start/quickstart). إذا كانت البيانات تصل بالفعل، افتح [الجلسات](/ar/sessions/overview) وفتش عملية تشغيل حقيقية قبل تكوين عمليات التدقيق أو السياسات.
+إذا كنت تنشر وكيلك المزود بأدوات المراقبة للمرة الأولى، فابدأ بـ [البدء السريع](/ar/start/quickstart). إذا كانت البيانات تصل بالفعل، فافتح [الجلسات](/ar/sessions/overview) وتفحص تشغيلاً حقيقياً قبل تكوين عمليات التدقيق أو السياسات.
-
- أكمل سير العمل الشامل من الالتقاط إلى سياسة تم نشرها بأمان.
+
+ أكمل سير العمل من الطرف إلى الطرف الآخر من المراقبة إلى سياسة آمنة ومنشورة.
\ No newline at end of file
diff --git a/docs/ar/policies/deploy.mdx b/docs/ar/policies/deploy.mdx
index ea2ad5828..8cc7efbea 100644
--- a/docs/ar/policies/deploy.mdx
+++ b/docs/ar/policies/deploy.mdx
@@ -1,7 +1,7 @@
---
---
title: "نشر السياسات"
-description: "طرح نسخة سياسة تم مراجعتها على الأجهزة المستهدفة."
+description: "إطلاق نسخة سياسة تم مراجعتها إلى الأجهزة المقصودة."
icon: "cloud-upload"
---
@@ -11,38 +11,42 @@ icon: "cloud-upload"
- 1. انتقل إلى **المسؤول → الإنفاذ**، ابحث عن الجهاز، وقم بتوسيع صفه.
- 2. اختر **تعديل**، أضف نسخة السياسة المراجعة، واختر **مراقبة** أو تأثيرها الإنفاذي.
- 3. طبّق التغيير، ثم انتظر الفحص التالي للجهاز وأكّد حالة النشر والتغطية.
- 4. انتقل إلى **مراقبة → سياسة** لفحص القرارات المباشرة.
+ 1. انتقل إلى **Admin → enforcement**، ابحث عن الجهاز، وقم بتوسيع صفه.
+ 2. اختر **edit**، أضف نسخة السياسة المراجعة، واختر **observe** أو تأثيرها الإجباري.
+ 3. طبّق التغيير، ثم انتظر فحص الجهاز التالي وتأكد من حالة نشره وتغطيته.
+ 4. انتقل إلى **Observe → policy** للفحص القرارات المباشرة.
- 
+ 
- لا يتم عن قصد كشف نقاط نهاية النشر السحابي كأوامر `fp` عادية. تحقق من الجهاز محليًا، ثم قم بالنشر عبر لوحة التحكم:
+ قم بالنشر من واجهة سطر الأوامر باستخدام `fp fleet`. راجع مجموعة النتائج قبل تطبيقها — يطبع `deploy` الخطة الكاملة ويسأل **فقط على محطة تفاعلية بدون `--json`**. تحت `--json`، مع `--yes`، أو مع إعادة توجيه stdin (خطوة CI، سكريبت، وكيل يشغل shell) يتم التطبيق فوراً بدون خطة وبدون مطالبة — لذا قم بتشغيل `fp fleet show ` أولاً إذا كنت تريد المراجعة:
```bash
- failproofai config --status
+ fp fleet list
+ fp fleet show
+ fp fleet deploy --add no-force-push
```
- استخدم `fp sessions --env production --since 24h` و `fp events --event-type hook_completed` بعد النشر للتحقق من وصول النشاط إلى Cloud.
+ يعرض `fp fleet diff ` النية مقابل التسليم (يُقرأ الجهاز كـ `behind` حتى يقوم بالاستطلاع التالي)، `fp fleet history ` يسرد الأجيال، و `fp fleet rollback ` يستعيد واحداً — يرفض إذا كان هذا الجيل يسمي سياسة تم تعطيلها أو حذفها.
+
+ تحقق من الجهاز نفسه باستخدام `failproofai config --status`، واستخدم `fp sessions --env production --since 24h` و `fp events --event-type hook_completed` بعد النشر للتحقق من وصول النشاط إلى Cloud.
- قم بنشر نسخة تم مراجعتها وليس مسودة قابلة للتغيير، بدءًا بجهاز غير إنتاجي أو مجموعة صغيرة يمكنك فحص جلساتها.
+ قم بنشر نسخة تم مراجعتها، وليس مسودة قابلة للتغيير، بدءاً بجهاز غير إنتاجي أو مجموعة صغيرة يمكنك فحص جلساتها.
-
- راجع المطابقات والأسباب والأدوات المتأثرة والإيجابيات الخاطئة دون حجب العمل.
+
+ راجع التطابقات والأسباب والأدوات المتأثرة والإيجابيات الكاذبة بدون حجب العمل.
-
- قم بالترقية بعد أن تفصل المطابقات المراقبة الإجراءات غير الآمنة عن الإجراءات الصحيحة، ثم تأكد من أن كل جهاز مستهدف قد سحب النشر ويُبلّغ عن القرارات.
+
+ قم بالترقية بعد المطابقات المرصودة التي تفصل الإجراءات غير الآمنة عن الإجراءات الصحيحة، ثم تأكد من أن كل جهاز مقصود قد سحب النشر ويقدم التقارير عن القرارات.
-تحتاج الأجهزة إلى قدرة `policies:pull`. يتم التحكم في تقارير الأحداث بشكل منفصل بواسطة `events:add`؛ تحقق من كليهما عندما تتوقع تحليل الـ Cloud والإنفاذ.
+تحتاج الأجهزة إلى القدرة على `policies:pull`. يتم التحكم في الإبلاغ عن الأحداث بشكل منفصل بواسطة `events:add`؛ تحقق من كليهما عندما تتوقع تحليل Cloud والفرض.
- إدارة الإنفاذ هي عملية سير عمل إدارية في الـ Cloud. لا تتعامل مع مسارات الإنفاذ الحصرية للجذر كنقاط نهاية `/v1` API عادية للعملاء.
+ إدارة الفرض هي سير عمل إداري في Cloud. لا تعامل مسارات الفرض للمسؤول الجذر فقط كنقاط نهاية API عادية للعملاء `/v1`.
\ No newline at end of file
diff --git a/docs/ar/policies/editor.mdx b/docs/ar/policies/editor.mdx
index 54a17a217..ed6ed1238 100644
--- a/docs/ar/policies/editor.mdx
+++ b/docs/ar/policies/editor.mdx
@@ -1,48 +1,50 @@
---
---
title: "محرر السياسات"
-description: "إنشاء وتعديل السياسات ذات الإصدارات من نمط فشل مؤكد."
+description: "إنشاء ومراجعة السياسات ذات الإصدارات من نمط فشل مؤكد."
icon: "file-pen-line"
---
-استخدم محرر السياسات لتحويل نتيجة بحث أو مشكلة إلى قاعدة قابلة للنشر. حافظ على فصل عملية التأليف عن النشر بحيث لا يمكن لمسودة أن تغيّر السلوك المباشر بصمت.
+استخدم محرر السياسات لتحويل نتيجة بحث أو مشكلة إلى قاعدة قابلة للنشر. احتفظ بالتأليف منفصلاً عن النشر بحيث لا يمكن لمسودة أن تغيّر السلوك الحي بصمت.
-عندما تكون لديك مشكلة بها نمط إجراء قابل للتكرار، افتحها ضمن **Analyze → issues** واختر **generate policy**. يشرح Failproof AI أولاً ما إذا كانت السياسة يمكنها التعبير عن المشكلة، ثم ينقل النية المراجعة وسياق البحث إلى المحرر. يبقى المصدر المُنشأ مسودة إلى أن تنشره.
+عندما تكون لديك مشكلة بها نمط إجراء قابل للتكرار، افتحها تحت **Analyze → issues** واختر **generate policy**. يشرح Failproof AI أولاً ما إذا كانت السياسة يمكنها التعبير عن المشكلة، ثم تنقل النية المراجعة وسياق النتيجة إلى المحرر. يبقى المصدر المُنتج كمسودة حتى تنشره.
## نشر إصدار السياسة
-
- 1. انتقل إلى **Admin → policy editor** وفي **compose**، صِف نمط الفشل أو الصق مصدر سياسة JavaScript.
- 2. تحقق من صحة المصدر وأصلح كل خطأ مُبلّغ عنه.
- 3. أدخل هوية السياسة ونشرها، ثم استخدم **library** للمقارنة أو تعطيل الإصدارات.
- 4. اختر **enforcement** عندما يكون الإصدار جاهزاً لطرح آلي على الآلات.
+
+ 1. انتقل إلى **Admin → policy editor** وفي **compose**، وصف نمط الفشل أو الصق مصدر سياسة JavaScript.
+ 2. تحقق من صحة المصدر وأصلح كل خطأ يتم الإبلاغ عنه.
+ 3. أدخل هوية السياسة وانشرها، ثم استخدم **library** للمقارنة أو تعطيل الإصدارات.
+ 4. اختر **enforcement** عندما يكون الإصدار جاهزاً لنشر الآلة.
- 
+ 
- لا ينشر Cloud CLI إصدارات السياسات. تحقق من صحة المصدر محلياً قبل نسخه إلى المحرر:
+ انشر من واجهة سطر الأوامر باستخدام `fp policies publish`. تُنشئ **إصدار جديد** ولا تحرر واحداً موجوداً، وتتحقق من المصدر باستخدام node قبل الإرسال — لا يفعل ذلك شيء آخر في المراحل اللاحقة، لذا كان خطأ بناء الجملة قد يظهر على الآلة في وقت الفرض:
```bash
- failproofai policies --install --custom ./checkout.policies.ts \
- --cli claude --scope project
+ fp policies test ./checkout.policy.mjs --command "git push --force" --expect deny
+ fp policies publish checkout-guard ./checkout.policy.mjs --description "Block force-push"
```
- انشر الإصدار المراجع من **Admin → policy editor**.
+ النشر لا ينشر أي شيء — يبقى إصدار جديد غير مستخدم حتى يضعه `fp fleet deploy` على آلة. يقوم `fp policies compose ""` بصياغة المصدر بمساعدة مساعد Cloud ويطبعه للمراجعة بدلاً من نشره.
+
+ لتثبيت سياسة في وكيل CLI محلي بدلاً من ذلك (وليس Cloud)، استخدم `failproofai policies --install --custom ./checkout.policies.ts --cli claude --scope project`.
-## قائمة فحص التأليف
+## قائمة التحقق من التأليف
-1. سمّ نمط الفشل باستخدام لغة تشغيلية.
-2. اختر أحداث الخطاف والأدوات التي توفر أدلة كافية للقرار.
-3. اكتب الشرط الأضيق الذي يطابق السلوك غير الآمن.
-4. أرجع سبباً يخبر الوكيل أو المشغل بما يجب فعله بعد ذلك.
-5. أضف أمثلة يجب أن تطابق والأمثلة التي يجب أن تبقى مسموحة.
-6. احفظ إصدارة جديدة وطلب مراجعة.
+1. سمّ نمط الفشل باللغة التشغيلية.
+2. اختر أحداث الخطاف والأدوات التي تحتوي على أدلة كافية للقرار.
+3. اكتب أضيق شرط يطابق السلوك غير الآمن.
+4. أرجع سبباً يخبر الوكيل أو المشغل ما يجب فعله بعد ذلك.
+5. أضف أمثلة يجب أن تطابق وأمثلة يجب أن تبقى مسموحة.
+6. احفظ إصدار جديد واطلب مراجعة.
-استخدم `instruct` عندما يمكن للوكيل تصحيح المسار بأمان. استخدم `deny` عندما يؤدي السماح بالإجراء إلى إنشاء خطر غير مقبول أو لا يمكن عكسه.
+استخدم `instruct` عندما يمكن للوكيل تصحيح المسار بأمان. استخدم `deny` عندما يؤدي السماح بالإجراء إلى خلق خطر غير مقبول أو غير قابل للعكس.
- إصدارات السياسات عبارة عن مدخلات نشر ثابتة. تحرير مسودة ينشئ إصدارة جديدة؛ يجب ألا يعيد كتابة الإصدار المُعيَّن بالفعل للآلات.
+ إصدارات السياسة هي مدخلات نشر غير قابلة للتغيير. يؤدي تحرير مسودة إلى إنشاء إصدار جديد؛ لا ينبغي أن يعيد كتابة الإصدار المعين بالفعل للآلات.
\ No newline at end of file
diff --git a/docs/ar/reference/cloud-cli.mdx b/docs/ar/reference/cloud-cli.mdx
index 6daae59c4..5c9e415ad 100644
--- a/docs/ar/reference/cloud-cli.mdx
+++ b/docs/ar/reference/cloud-cli.mdx
@@ -1,12 +1,12 @@
---
-title: "واجهة سطر أوامر Failproof Cloud"
-description: "مرجع شامل للاستعلام وإدارة Failproof AI Cloud باستخدام fp."
+title: "واجهة سطر الأوامر Failproof Cloud"
+description: "مرجع شامل للاستعلام عن Failproof AI Cloud وإدارته باستخدام fp."
icon: "cloud-cog"
---
-استخدم `fp` للتحقق من تلمترية Cloud وإدارة عمليات التدقيق والنتائج والمشاكل والتنبيهات والمفاتيح والمستخدمين والاستعلامات والإعدادات. استخدم [`failproofai`](/ar/reference/failproof-cli) للتعاملات المحلية والسياسات والالتقاط وتسجيل الأجهزة.
+استخدم `fp` لفحص بيانات Cloud الوصفية وإدارة الفرض المدار بواسطة السحابة (السياسات وعمليات نشر الأسطول وقرارات الحماية) وإدارة التدقيق والنتائج والقضايا والتنبيهات والمفاتيح والمستخدمين والاستعلامات والإعدادات. استخدم [`failproofai`](/ar/reference/failproof-cli) للخطافات المحلية والسياسات والالتقاط وتسجيل الماكينات.
-قم بتثبيت واجهة سطر الأوامر السحابية المُصدرة كأداة معزولة:
+ثبّت Cloud CLI المُصدرة كأداة معزولة:
```bash
uv tool install fp-cloud-cli
@@ -20,7 +20,7 @@ fp login
fp whoami
```
-## الصيغة
+## بناء الجملة
```text
fp [GLOBAL_OPTIONS] COMMAND [SUBCOMMAND] [ARGUMENTS] [OPTIONS]
@@ -32,19 +32,19 @@ fp [GLOBAL_OPTIONS] COMMAND [SUBCOMMAND] [ARGUMENTS] [OPTIONS]
fp --json sessions --since 24h
```
-قم بتشغيل `fp COMMAND --help` أو `fp COMMAND SUBCOMMAND --help` للحصول على مساعدة في الطرفية.
+شغّل `fp COMMAND --help` أو `fp COMMAND SUBCOMMAND --help` للحصول على المساعدة في المحطة الطرفية.
-## أوامر واجهة سطر الأوامر
+## أوامر CLI
### المصادقة
| الأمر | الغرض | الخيارات |
| --- | --- | --- |
-| `fp login` | قم بالتسجيل برمز لمرة واحدة تم إرساله عبر البريد الإلكتروني واختر منظمة. | `--email`, `-e`; `--org`; `--force` |
-| `fp logout` | قم بإلغاء وإزالة جلسة المستخدم المحفوظة. | — |
-| `fp whoami` | اعرض الهوية الحالية وطريقة المصادقة والمنظمة والأذونات. | — |
-| `fp version` | اعرض إصدار واجهة سطر الأوامر المثبتة. | — |
-| `fp help` | اعرض مساعدة الأمر على المستوى الأعلى. | — |
+| `fp login` | سجّل دخولك باستخدام رمز لمرة واحدة مرسل بالبريد الإلكتروني واختر مؤسسة. | `--email`, `-e`; `--org`; `--force` |
+| `fp logout` | اسحب وأزل جلسة المستخدم المحفوظة. | — |
+| `fp whoami` | اعرض الهوية الحالية وطريقة المصادقة والمؤسسة والأذونات. | — |
+| `fp version` | اعرض إصدار CLI المثبت. | — |
+| `fp help` | اعرض مساعدة الأمر من المستوى الأعلى. | — |
```bash
fp login --email you@example.com --org reliability-team
@@ -57,30 +57,34 @@ fp whoami
fp events [OPTIONS]
```
-يسرد أحداث الوكيل الفردية. يستبعد الخلاصة الخفيفة الافتراضية الحمولات الخام؛ استخدم `--full` فقط للتحقيق المحدود.
+يسرد أحداث الوكيل الفردية. يستبعد الخلاصة الخفيفة الافتراضية الأحمال الأولية؛ استخدم `--full` فقط للتحقيق المحدود.
| الخيار | الوصف |
| --- | --- |
-| `--limit`, `-n ` | الحد الأقصى للصفوف الإجمالية. الافتراضي: `50`. |
+| `--limit`, `-n ` | الحد الأقصى الكلي للصفوف. الافتراضي: `50`. |
| `--since ` | `all`, `15m`, `1h`, `6h`, `24h`, أو `7d`. |
| `--from ` / `--to ` | نطاق ISO 8601 UTC؛ يتجاوز `--since`. |
-| `--env ` | مرشح البيئة؛ كرر أو افصل بفواصل. |
-| `--event-type ` | مرشح نوع الحدث؛ كرر أو افصل بفواصل. |
-| `--agent-id ` | مرشح الوكيل؛ كرر أو افصل بفواصل. |
-| `--session-id ` | مرشح الجلسة؛ كرر أو افصل بفواصل. |
-| `--search ` | البحث في نص الحمولة؛ قابل للتكرار، مع مطابقة أي مصطلح. |
-| `--order asc\|desc` | ترتيب زمني. الافتراضي: الأحدث أولاً. |
-| `--all` | ترقيم تلقائي حتى `--limit`. |
+| `--env ` | مرشح البيئة؛ كرّر أو افصل القيم بفواصل. |
+| `--event-type ` | مرشح نوع الحدث؛ كرّر أو افصل القيم بفواصل. |
+| `--agent-id ` | مرشح الوكيل؛ كرّر أو افصل القيم بفواصل. |
+| `--session-id ` | مرشح الجلسة؛ كرّر أو افصل القيم بفواصل. |
+| `--search ` | بحث نصي في الحمل الأولي؛ قابل للتكرار، مع مطابقة أي حد. |
+| `--order asc\|desc` | ترتيب الوقت. الافتراضي: الأحدث أولاً. |
+| `--all` | صفحة تلقائية تصل إلى `--limit`. |
| `--cursor ` | استئنف من مؤشر معتم. |
-| `--page-size ` | صفوف لكل طلب مع `--all`؛ بحد أقصى `200`. |
-| `--full` | قم بتضمين الحمولات الخام من خلال نقطة الحدث الأثقل. |
-| `--fields ` | إرجاع الحقول المحددة فقط؛ طلب `payload` يفعل الوضع الكامل. |
+| `--page-size ` | الصفوف لكل طلب مع `--all`؛ الحد الأقصى `200`. |
+| `--full` | ضمّن الأحمال الأولية عبر نقطة الحدث الأثقل وزناً. |
+| `--fields ` | أرجع الحقول المحددة فقط؛ يتطلب طلب `payload` وضع المحرّر الكامل. |
```bash
-fp events --session-id --order asc --all
-fp --json events --full --session-id --all
+fp events --session-id --order asc --all --limit 10000
+fp --json events --full --session-id --all --limit 10000
```
+
+ `--all` ينقّح **حتى `--limit`**، والذي يأتي بقيمة افتراضية تبلغ **50** — لذلك `--all` بمفردها تتوقف عند 50 صفاً. عندما تتوقف مبكراً، تحمل الاستجابة `next_cursor` للاستئناف منها؛ `"next_cursor": null` تعني أن الخلاصة استُنفدت حقاً.
+
+
### الجلسات
```text
@@ -89,19 +93,19 @@ fp sessions [OPTIONS]
| الخيار | الوصف |
| --- | --- |
-| `--limit`, `-n ` | الحد الأقصى للصفوف الإجمالية. الافتراضي: `50`. |
+| `--limit`, `-n ` | الحد الأقصى الكلي للصفوف. الافتراضي: `50`. |
| `--since ` | `all`, `15m`, `1h`, `6h`, `24h`, أو `7d`. |
| `--from ` / `--to ` | نطاق ISO 8601 UTC؛ يتجاوز `--since`. |
-| `--env ` | مرشح البيئة؛ كرر أو افصل بفواصل. |
-| `--status ` | `done`, `error`, أو `timeout`؛ كرر أو افصل بفواصل. |
-| `--agent-id ` | مطابقة الجلسات التي تتضمن أي وكيل مُختار. |
-| `--session-id ` | مرشح الجلسة؛ كرر أو افصل بفواصل. |
-| `--all` | ترقيم تلقائي حتى `--limit`. |
+| `--env ` | مرشح البيئة؛ كرّر أو افصل القيم بفواصل. |
+| `--status ` | `done`, `error`, أو `timeout`؛ كرّر أو افصل القيم بفواصل. |
+| `--agent-id ` | طابق الجلسات التي تتضمن أي وكيل محدد. |
+| `--session-id ` | مرشح الجلسة؛ كرّر أو افصل القيم بفواصل. |
+| `--all` | صفحة تلقائية تصل إلى `--limit`. |
| `--cursor ` | استئنف من مؤشر معتم. |
-| `--page-size ` | صفوف لكل طلب مع `--all`؛ بحد أقصى `200`. |
-| `--fields ` | إرجاع الحقول المحددة فقط. |
-| `--full-ids` | لا تقصر معرفات الجلسة في مخرجات الطرفية. |
-| `--agents` | قم بتوسيع قائمة الوكلاء لجلسات الوكلاء المتعددين. |
+| `--page-size ` | الصفوف لكل طلب مع `--all`؛ الحد الأقصى `200`. |
+| `--fields ` | أرجع الحقول المحددة فقط. |
+| `--full-ids` | لا تختصر معرّفات الجلسة في إخراج المحطة الطرفية. |
+| `--agents` | وسّع قائمة الوكيل لجلسات متعددة الوكلاء. |
### التقييمات
@@ -111,15 +115,15 @@ fp evals [OPTIONS]
| الخيار | الوصف |
| --- | --- |
-| `--aggregate` | اعرض الإجماليات والإحصائيات لكل نقاط بدلاً من التقييمات الفردية. |
+| `--aggregate` | اعرض الإجماليات والإحصائيات حسب الدرجة بدلاً من التقييمات الفردية. |
| `--limit`, `-n ` | الحد الأقصى لصفوف القائمة. الافتراضي: `50`. |
-| `--since`, `--from`, `--to` | اختر نطاق الوقت. |
+| `--since`, `--from`, `--to` | حدّد النطاق الزمني. |
| `--env`, `--status`, `--agent-id`, `--session-id` | ضيّق إلى قيمة واحدة محددة لكل مرشح. |
-| `--score KEY:MIN..MAX` | نطاق النقاط؛ قابل للتكرار ويجب أن تتطابق جميع النطاقات. |
-| `--all`, `--cursor`, `--page-size` | التحكم في ترقيم قائمة. |
-| `--fields ` | إرجاع الحقول المحددة فقط. |
-| `--full-ids` | اعرض معرفات الجلسة الكاملة. |
-| `--scores-full` | اعرض كل نقطة في مخرجات الطرفية. |
+| `--score KEY:MIN..MAX` | نطاق الدرجة؛ قابل للتكرار ويجب أن تتطابق جميع النطاقات. |
+| `--all`, `--cursor`, `--page-size` | تحكم في ترقيم قائمة الصفحات. |
+| `--fields ` | أرجع الحقول المحددة فقط. |
+| `--full-ids` | اعرض معرّفات الجلسة الكاملة. |
+| `--scores-full` | اعرض كل درجة في إخراج المحطة الطرفية. |
### الأخطاء
@@ -129,118 +133,118 @@ fp errors [OPTIONS]
| الخيار | الوصف |
| --- | --- |
-| `--aggregate` | لخّص الأخطاء المطابقة بدلاً من سرد الصفوف. |
+| `--aggregate` | ملخّص الأخطاء المطابقة بدلاً من إدراج الصفوف. |
| `--limit`, `-n ` | الحد الأقصى لصفوف القائمة. الافتراضي: `50`. |
-| `--since`, `--from`, `--to` | اختر نطاق الوقت. |
-| `--env`, `--error-type`, `--event-type`, `--agent-id`, `--session-id` | ضيّق نطاق مجموعة الأخطاء. |
-| `--search ` | البحث في نص الحمولة؛ قابل للتكرار. |
-| `--order asc\|desc` | ترتيب زمني. |
-| `--all`, `--cursor`, `--page-size` | التحكم في ترقيم القائمة. |
-| `--fields ` | إرجاع الحقول المحددة فقط. |
-| `--full-ids` | اعرض معرفات الجلسة الكاملة. |
+| `--since`, `--from`, `--to` | حدّد النطاق الزمني. |
+| `--env`, `--error-type`, `--event-type`, `--agent-id`, `--session-id` | ضيّق مجموعة الأخطاء. |
+| `--search ` | ابحث في نص الحمل الأولي؛ قابل للتكرار. |
+| `--order asc\|desc` | ترتيب الوقت. |
+| `--all`, `--cursor`, `--page-size` | تحكم في ترقيم قائمة الصفحات. |
+| `--fields ` | أرجع الحقول المحددة فقط. |
+| `--full-ids` | اعرض معرّفات الجلسة الكاملة. |
### الاستخدام وقيم المرشحات
| الأمر | الغرض |
| --- | --- |
-| `fp usage` | اعرض الاستخدام لنافذة القياس الحالية. |
-| `fp list envs` | اعرض قائمة البيئات المرصودة. |
-| `fp list agents` | اعرض قائمة معرفات الوكلاء المرصودة. |
-| `fp list event_types` | اعرض قائمة أنواع الأحداث. |
-| `fp list score_filters` | اعرض قائمة مفاتيح نقاط التقييم. |
-| `fp list models` | اعرض قائمة أسماء النماذج. |
-| `fp list hooks` | اعرض قائمة أسماء الخطافات. |
-| `fp list tools` | اعرض قائمة أسماء الأدوات. |
-| `fp list error_types` | اعرض قائمة أنواع الأخطاء. |
-
-### المنظمات
+| `fp usage` | اعرض الاستخدام لنافذة الفوترة الحالية. |
+| `fp list envs` | ادرج البيئات المرصودة. |
+| `fp list agents` | ادرج معرّفات الوكيل المرصودة. |
+| `fp list event_types` | ادرج أنواع الأحداث. |
+| `fp list score_filters` | ادرج مفاتيح درجة التقييم. |
+| `fp list models` | ادرج أسماء النماذج. |
+| `fp list hooks` | ادرج أسماء الخطافات. |
+| `fp list tools` | ادرج أسماء الأدوات. |
+| `fp list error_types` | ادرج أنواع الأخطاء. |
+
+### المؤسسات
| الأمر | الغرض |
| --- | --- |
-| `fp orgs list` | اعرض قائمة المنظمات المتاحة. |
-| `fp orgs switch [SLUG]` | احفظ منظمة نشطة؛ يطلب عند الحذف. |
-| `fp orgs current` | اعرض المنظمة النشطة. |
-| `fp orgs perms` | اعرض أذوناتك في المنظمة النشطة. |
+| `fp orgs list` | ادرج المؤسسات التي يمكن الوصول إليها. |
+| `fp orgs switch [SLUG]` | احفظ مؤسسة نشطة؛ اطلب عند الحذف. |
+| `fp orgs current` | اعرض المؤسسة النشطة. |
+| `fp orgs perms` | اعرض أذوناتك في المؤسسة النشطة. |
### مفاتيح API
| الأمر | الغرض | الخيارات |
| --- | --- | --- |
-| `fp keys list` | اعرض قائمة مفاتيح المنظمة. | `--show-id`; `--fields ` |
-| `fp keys show NAME` | اعرض مفتاح واحد وامتيازاته. | — |
-| `fp keys create NAME` | أنشئ مفتاح وكشف سره مرة واحدة. | `--permission-set`; `--add`; `--remove` |
-| `fp keys update NAME` | استبدل مجموعة الأذونات أو اضبط الامتيازات. | `--permission-set`; `--add`; `--remove`; `--yes`, `-y` |
-| `fp keys regenerate NAME` | قم بتدوير السر وكشف الاستبدال مرة واحدة. | `--yes`, `-y` |
-| `fp keys disable NAME` | قم بإلغاء مفتاح بشكل دائم. | `--yes`, `-y` |
+| `fp keys list` | ادرج مفاتيح المؤسسة. | `--show-id`; `--fields ` |
+| `fp keys show NAME` | اعرض مفتاحاً واحداً وأذوناته. | — |
+| `fp keys create NAME` | أنشئ مفتاحاً وأظهر سره مرة واحدة. | `--permission-set`; `--add`; `--remove` |
+| `fp keys update NAME` | استبدل مجموعة الأذونات أو اضبط الأذونات. | `--permission-set`; `--add`; `--remove`; `--yes`, `-y` |
+| `fp keys regenerate NAME` | دوّر السر وأظهر البديل مرة واحدة. | `--yes`, `-y` |
+| `fp keys disable NAME` | اسحب مفتاحاً بشكل دائم. | `--yes`, `-y` |
-استخدم رموز الأذونات `resource:action`، مثل `events:add`. كرر `--add` أو افصل الرموز بفواصل أو استخدم الإجراءات ذات النقاط مثل `events:read.add`.
+تستخدم رموز الأذونات `resource:action`، مثل `events:add`. كرّر `--add` أو افصل الرموز بفواصل أو استخدم الإجراءات المنقوطة مثل `events:read.add`.
### الاستعلامات
| الأمر | الغرض | الخيارات |
| --- | --- | --- |
-| `fp query list` | اعرض قائمة الاستعلامات المحفوظة. | `--show-id`; `--fields ` |
-| `fp query show NAME` | اعرض استعلام واحد. | — |
-| `fp query create NAME` | احفظ استعلام. | `--sql `; `--description` |
+| `fp query list` | ادرج الاستعلامات المحفوظة. | `--show-id`; `--fields ` |
+| `fp query show NAME` | اعرض استعلاماً واحداً. | — |
+| `fp query create NAME` | احفظ استعلاماً. | `--sql `; `--description` |
| `fp query update NAME` | حدّث أو أعد تسمية استعلام. | `--name`; `--sql`; `--description`; `--yes`, `-y` |
-| `fp query delete NAME` | احذف استعلام محفوظ. | `--yes`, `-y` |
-| `fp query run [NAME]` | شغّل استعلام محفوظ أو SQL مؤقت. | `--sql`; `--limit`; `--all`; `--arg`, `--param` |
-| `fp query schema [TABLE]` | اعرض قائمة الجداول القابلة للاستعلام أو افحص جدول واحد. | — |
+| `fp query delete NAME` | احذف استعلاماً محفوظاً. | `--yes`, `-y` |
+| `fp query run [NAME]` | شغّل استعلاماً محفوظاً أو SQL مخصص. | `--sql`; `--limit`; `--all`; `--arg`, `--param` |
+| `fp query schema [TABLE]` | ادرج الجداول القابلة للاستعلام أو افحص جدول واحد. | — |
### المستخدمون
| الأمر | الغرض | الخيارات |
| --- | --- | --- |
-| `fp users list` | اعرض قائمة أعضاء المنظمة. | `--active-only`; `--show-id` |
-| `fp users show EMAIL` | اعرض عضو وامتيازاته. | — |
-| `fp users create EMAIL` | أضف عضو. | `--permission-set`; `--add`; `--remove` |
-| `fp users update EMAIL` | غيّر امتيازات العضو. | `--permission-set`; `--add`; `--remove`; `--yes`, `-y` |
-| `fp users disable EMAIL` | عطّل التسجيل. | `--yes`, `-y` |
-| `fp users enable EMAIL` | أعد تفعيل التسجيل. | `--yes`, `-y` |
+| `fp users list` | ادرج أعضاء المؤسسة. | `--active-only`; `--show-id` |
+| `fp users show EMAIL` | اعرض عضواً وأذوناته. | — |
+| `fp users create EMAIL` | أضف عضواً. | `--permission-set`; `--add`; `--remove` |
+| `fp users update EMAIL` | غيّر أذونات العضو. | `--permission-set`; `--add`; `--remove`; `--yes`, `-y` |
+| `fp users disable EMAIL` | عطّل تسجيل الدخول. | `--yes`, `-y` |
+| `fp users enable EMAIL` | أعد تفعيل تسجيل الدخول. | `--yes`, `-y` |
### الإعدادات
| الأمر | الغرض | الخيارات |
| --- | --- | --- |
-| `fp settings list` | اعرض قائمة إعدادات المنظمة والقيم الحالية. | — |
+| `fp settings list` | ادرج إعدادات المؤسسة والقيم الحالية. | — |
| `fp settings schema` | اعرض القيم المقبولة والأوصاف. | — |
-| `fp settings set KEY` | غيّر إعداد موجود. | واحد بالضبط من `--value`, `--json-value`, `--file`؛ `--yes`, `-y` اختياري |
+| `fp settings set KEY` | غيّر إعداداً موجوداً. | واحد فقط من `--value`, `--json-value`, `--file`؛ اختياري `--yes`, `-y` |
### التنبيهات
| الأمر | الغرض | الخيارات |
| --- | --- | --- |
-| `fp alerts list` | اعرض قائمة قواعد التنبيهات. | `--show-id` |
-| `fp alerts show NAME` | اعرض تنبيه واحد. | — |
-| `fp alerts create NAME` | أنشئ تنبيه. | `--file`; `--description`; `--severity`; `--trigger-kind`; `--trigger-spec`; `--channels`; `--eval-interval-secs`; `--min-breaches`; `--eval-window` |
+| `fp alerts list` | ادرج قواعد التنبيهات. | `--show-id` |
+| `fp alerts show NAME` | اعرض تنبيهاً واحداً. | — |
+| `fp alerts create NAME` | أنشئ تنبيهاً. | `--file`; `--description`; `--severity`; `--trigger-kind`; `--trigger-spec`; `--channels`; `--eval-interval-secs`; `--min-breaches`; `--eval-window` |
| `fp alerts update NAME` | حدّث أو أعد تسمية تنبيه. | خيارات الإنشاء بالإضافة إلى `--name`; `--yes`, `-y` |
-| `fp alerts delete NAME` | احذف تنبيه. | `--yes`, `-y` |
-| `fp alerts test NAME` | أرسل إشعار اختبار. | `--channels`; `--yes`, `-y` |
+| `fp alerts delete NAME` | احذف تنبيهاً. | `--yes`, `-y` |
+| `fp alerts test NAME` | أرسل إخطاراً اختبارياً. | `--channels`; `--yes`, `-y` |
-درجات شدة التنبيهات هي `info` و `warning` و `critical`. أنواع المشغلات هي `metric_threshold` و `custom_sql` و `evaluation_score` و `eval_compound` و `per_event`. يجب أن تكون فترات التقييم بين 30 و 86,400 ثانية.
+درجات التنبيهات هي `info`, `warning`, و `critical`. أنواع المشغلات هي `metric_threshold`, `custom_sql`, `evaluation_score`, `eval_compound`, و `per_event`. يجب أن تكون فترات التقييم بين 30 و 86400 ثانية.
### التدقيقات
| الأمر | الغرض | الخيارات |
| --- | --- | --- |
-| `fp audits list` | اعرض قائمة التدقيقات. | `--enabled-only`; `--show-id` |
-| `fp audits show NAME` | اعرض تعريف تدقيق واحد وحالته. | — |
-| `fp audits create NAME` | أنشئ تدقيق وضع في قائمة الانتظار على الفور لتشغيله الأول. | انظر [خيارات الإنشاء](#audit-create-options). |
+| `fp audits list` | ادرج التدقيقات. | `--enabled-only`; `--show-id` |
+| `fp audits show NAME` | اعرض تعريف وحالة التدقيق. | — |
+| `fp audits create NAME` | أنشئ تدقيقاً وأدرج تشغيله الأول فوراً. | انظر [خيارات الإنشاء](#audit-create-options). |
| `fp audits edit NAME` | استبدل إعدادات التدقيق مع الاحتفاظ بالقيم غير المحددة. | خيارات تعريف الإنشاء؛ `--name`; `--yes`, `-y` |
-| `fp audits delete NAME` | احذف تدقيق ونتائجه وسجل التشغيل. | `--yes`, `-y` |
-| `fp audits run NAME` | ضع تشغيل يدوي في قائمة الانتظار. | — |
-| `fp audits runs NAME` | اعرض قائمة سجل التشغيل. | `--limit`, `-n`; `--show-id` |
-| `fp audits context-show NAME` | اعرض حالة الموجز وجلب عنوان URL المرجعي. | — |
+| `fp audits delete NAME` | احذف تدقيقاً ونتائجه وسجل التشغيل. | `--yes`, `-y` |
+| `fp audits run NAME` | أدرج تشغيلاً يدوياً. | — |
+| `fp audits runs NAME` | ادرج سجل التشغيل. | `--limit`, `-n`; `--show-id` |
+| `fp audits context-show NAME` | اعرض حالة جلب الموجز والمرجع. | — |
| `fp audits context-set NAME` | غيّر الموجز أو عناوين URL المرجعية. | `--text`; `--text-file`; `--url`; `--clear-urls` |
| `fp audits context-refresh NAME` | أعد جلب عناوين URL المرجعية. | — |
-| `fp audits findings` | اعرض قائمة النتائج. | `--audit`; `--run-id`; `--status`; `--limit`, `-n`; `--offset`; `--show-id` |
+| `fp audits findings` | ادرج النتائج. | `--audit`; `--run-id`; `--status`; `--limit`, `-n`; `--offset`; `--show-id` |
| `fp audits finding FINDING_ID` | اعرض نتيجة واحدة وأدلتها. | — |
-| `fp audits ack FINDING_ID` | اعترف بنتيجة. | `--reason` |
-| `fp audits mute FINDING_ID` | اكتم نمط متكرر. | `--reason`; `--yes`, `-y` |
-| `fp audits dismiss FINDING_ID` | ضع علامة على نمط غير قابل للتنفيذ واكتمه. | `--reason`; `--yes`, `-y` |
-| `fp audits resolve FINDING_ID` | ضع علامة على نتيجة مُصلحة بدون تكتم مستقبلي. | `--yes`, `-y` |
-| `fp audits reopen FINDING_ID` | أعد نتيجة إلى قائمة الانتظار المباشرة وامسح الكتم. | — |
-| `fp audits assign FINDING_ID` | عيّن صاحب النتيجة. | مطلوب `--to ` |
+| `fp audits ack FINDING_ID` | أقرّ بنتيجة. | `--reason` |
+| `fp audits mute FINDING_ID` | كبّت نمطاً متكرراً. | `--reason`; `--yes`, `-y` |
+| `fp audits dismiss FINDING_ID` | ضع علامة على النمط غير قابل للتنفيذ وكبّته. | `--reason`; `--yes`, `-y` |
+| `fp audits resolve FINDING_ID` | ضع علامة على النتيجة كمحلولة دون قمع مستقبلي. | `--yes`, `-y` |
+| `fp audits reopen FINDING_ID` | أعد النتيجة إلى قائمة الانتظار المباشرة وامسح القمع. | — |
+| `fp audits assign FINDING_ID` | ضع مالك النتيجة. | `--to ` مطلوب |
#### خيارات إنشاء التدقيق
@@ -257,95 +261,139 @@ fp audits create checkout-reliability \
| الخيار | الوصف |
| --- | --- |
-| `--file ` | استند التعريف على JSON أو استخدم `-` للمدخلات المعيارية. الأعلام الصريحة تتجاوز قيم الملف. |
+| `--file ` | اعتمد التعريف على JSON، أو استخدم `-` لـ stdin. الأعلام الصريحة تتجاوز قيم الملف. |
| `--description ` | اذكر سؤال الفشل أو الغرض. |
-| `--enabled` / `--disabled` | ابدأ الجدولة قيد التشغيل أو الإيقاف. الافتراضي: مُفعّل. |
+| `--enabled` / `--disabled` | ابدأ الجدولة على أو بدونها. الافتراضي: مفعل. |
| `--schedule-interval-secs ` | `3600`–`604800`. الافتراضي: `86400`. |
-| `--schedule-anchor ` | مرحلة UTC ثابتة في شكل ISO 8601. الافتراضي: الساعة 09:00 UTC التالية. |
-| `--window-mode since_last\|fixed` | المتابعة بعد آخر نافذة تم تحليلها بالكامل أو فحص نافذة متغيرة بشكل متكرر. الافتراضي: `since_last`. |
+| `--schedule-anchor ` | مرحلة UTC ثابتة بصيغة ISO 8601. الافتراضي: الساعة 09:00 UTC القادمة. |
+| `--window-mode since_last\|fixed` | ابدأ بعد آخر نافذة تم تحليلها بالكامل أو افحص نافذة متحركة بشكل متكرر. الافتراضي: `since_last`. |
| `--lookback-window-secs ` | `3600`–`7776000`. الافتراضي: `604800`. |
-| `--scope ''` | تصفية حسب `environments` أو `agent_ids` أو حقول النطاق المدعومة الأخرى. |
-| `--ignore-error-type ` | استبعد أنواع الأخطاء؛ كرر أو افصل بفواصل. |
-| `--llm` / `--no-llm` | فعّل أو عطّل التحليل الوكلاء. الافتراضي: مُفعّل. |
+| `--scope ''` | صفّ حسب `environments`, `agent_ids`, أو حقول نطاق مدعومة أخرى. |
+| `--ignore-error-type ` | استبعد أنواع الأخطاء؛ كرّر أو افصل. |
+| `--llm` / `--no-llm` | فعّل أو عطّل التحليل المدعوم بالوكيل. الافتراضي: مفعل. |
| `--top-k ` | احتفظ بـ `1`–`500` نتيجة. الافتراضي: `50`. |
-| `--sensitivity low\|medium\|high` | عيّن حساسية الإبلاغ. الافتراضي: `medium`. |
-| `--channels ''` | مصفوفة قناة الإشعار. |
-| `--text ` | موجز مضمّن، بحد أقصى 8,192 حرف. |
-| `--text-file ` | اقرأ الموجز من ملف؛ متنافر حصراً مع `--text`. |
-| `--url ` | أضف مرجع HTTPS عام؛ كرر حتى خمس مرات. |
+| `--sensitivity low\|medium\|high` | اضبط حساسية الإبلاغ. الافتراضي: `medium`. |
+| `--channels ''` | مصفوفة قناة الإخطار. |
+| `--text ` | موجز مضمّن، بحد أقصى 8192 حرفاً. |
+| `--text-file ` | اقرأ الموجز من ملف؛ متنافي مع `--text`. |
+| `--url ` | أضف مرجعاً عاماً HTTPS؛ كرّر حتى خمس مرات. |
-قم بتضمين السياق أثناء الإنشاء عندما يحتاج التشغيل الأول إليه. يلتزم الإنشاء بالتعريف والسياق معاً قبل بدء التشغيل المُدرج في قائمة الانتظار.
+ضمّن السياق أثناء الإنشاء عندما يحتاج التشغيل الأول إليه. يسجّل الإنشاء التعريف والسياق معاً قبل بدء التشغيل المجدول.
- `fp audits run` غير متزامن. استقصي `fp audits runs NAME` حتى ينجح التشغيل الأخير أو يفشل قبل قراءة نتائجه.
+ `fp audits run` غير متزامن. استقصِ `fp audits runs NAME` حتى ينجح التشغيل الأحدث أو يفشل قبل قراءة نتائجه.
-### المشاكل
+### القضايا
| الأمر | الغرض | الخيارات |
| --- | --- | --- |
-| `fp issues list` | اعرض قائمة المشاكل. | `--state`; `--alert-id`; `--limit`, `-n`; `--show-id` |
-| `fp issues count` | عد حالات المشكلة المفتوحة أو المحددة. | `--state` |
-| `fp issues show INCIDENT_ID` | اعرض تفاصيل المشكلة والتعليقات والمشتركين والنشاط. | — |
-| `fp issues open` | افتح مشكلة يدوية أو مرتبطة بتنبيه. | مطلوب `--summary`؛ اختياري `--title`, `--alert-id`, `--severity` |
-| `fp issues ack INCIDENT_ID` | اعترف بمشكلة. | — |
-| `fp issues assign INCIDENT_ID` | استبدل المسؤولين؛ حذف الخيار لمسحهم. | قابل للتكرار `--assignee` |
-| `fp issues resolve INCIDENT_ID` | حل مشكلة. | `--yes`, `-y` |
-| `fp issues comment-list INCIDENT_ID` | اعرض قائمة التعليقات. | — |
-| `fp issues comment-add INCIDENT_ID` | أضف تعليق. | واحد بالضبط من `--body`, `--file` |
-| `fp issues comment-delete INCIDENT_ID COMMENT_ID` | احذف تعليق. | `--yes`, `-y` |
-| `fp issues subscribers INCIDENT_ID` | اعرض قائمة المشتركين. | — |
-| `fp issues subscribe INCIDENT_ID` | اشترك بنفسك أو مشغل آخر. | `--email` |
+| `fp issues list` | ادرج القضايا. | `--state`; `--alert-id`; `--limit`, `-n`; `--show-id` |
+| `fp issues count` | عدّ القضايا المفتوحة أو حالات محددة. | `--state` |
+| `fp issues show INCIDENT_ID` | اعرض تفاصيل القضية والتعليقات والمشتركين والنشاط. | — |
+| `fp issues open` | افتح قضية يدوية أو مرتبطة بتنبيه. | `--summary` مطلوب; اختياري `--title`, `--alert-id`, `--severity` |
+| `fp issues ack INCIDENT_ID` | أقرّ بقضية. | — |
+| `fp issues assign INCIDENT_ID` | استبدل المسؤولين؛ اترك الخيار فارغاً لمسحهم. | `--assignee` قابل للتكرار |
+| `fp issues resolve INCIDENT_ID` | حلّ قضية. | `--yes`, `-y` |
+| `fp issues comment-list INCIDENT_ID` | ادرج التعليقات. | — |
+| `fp issues comment-add INCIDENT_ID` | أضف تعليقاً. | واحد فقط من `--body`, `--file` |
+| `fp issues comment-delete INCIDENT_ID COMMENT_ID` | احذف تعليقاً. | `--yes`, `-y` |
+| `fp issues subscribers INCIDENT_ID` | ادرج المشتركين. | — |
+| `fp issues subscribe INCIDENT_ID` | اشترك أنت أو مشغل آخر. | `--email` |
| `fp issues unsubscribe INCIDENT_ID` | أزل الاشتراك. | `--email` |
-حالات المشكلة الصحيحة هي `firing` و `acknowledged` و `resolved`. درجات شدة المشكلة المستقلة هي `info` و `warning` و `critical`.
+حالات القضايا الصحيحة هي `firing`, `acknowledged`, و `resolved`. درجات القضايا المستقلة هي `info`, `warning`, و `critical`.
-### مساعد Cloud
+### مساعد السحابة
| الأمر | الغرض | الخيارات |
| --- | --- | --- |
-| `fp agent health` | تحقق من توفر المساعد والإعدادات. | — |
-| `fp agent models` | اعرض قائمة نماذج المساعد المتاحة. | — |
-| `fp agent chats` | اعرض قائمة الدردشات المحفوظة. | — |
-| `fp agent ask [MESSAGE]` | ابدأ أو تابع دردشة؛ اقرأ من stdin عند حذف الرسالة. | `--chat`; `--model`; `--page-context` |
+| `fp agent health` | تحقق من توفر المساعد والتكوين. | — |
+| `fp agent models` | ادرج نماذج المساعد المتاحة. | — |
+| `fp agent chats` | ادرج المحادثات المحفوظة. | — |
+| `fp agent ask [MESSAGE]` | ابدأ أو استمر محادثة؛ اقرأ stdin عند حذف الرسالة. | `--chat`; `--model`; `--page-context` |
| `fp agent show CHAT_ID` | اعرض محادثة محفوظة. | — |
-| `fp agent rename CHAT_ID` | أعد تسمية محادثة. | مطلوب `--title` |
+| `fp agent rename CHAT_ID` | أعد تسمية محادثة. | `--title` مطلوب |
| `fp agent delete CHAT_ID` | احذف محادثة. | `--yes`, `-y` |
-## أعلام عامة
+### السياسات
+
+إصدارات السياسات المدارة بواسطة السحابة. **جلسة فقط** — كل أمر هنا ينتهي برمز `2` بموجب مفتاح API، قبل أي طلب، لأن هذه عمليات كتابة جذرية متعمدة غير موجودة في `/v1`.
+
+| الأمر | الغرض | الخيارات |
+| --- | --- | --- |
+| `fp policies list` | ادرج إصدارات السياسة. | `--json` |
+| `fp policies show POLICY_ID` | اعرض سياسة واحدة مع مصدرها. | — |
+| `fp policies publish NAME PATH` | اصك إصدارة من `.mjs` محلي. | `--description`; `--no-verify` |
+| `fp policies enable POLICY_ID` | أضفها مجدداً إلى كل نشر تمت إزالتها منه، واصك جيل جديد على كل واحد. | `--yes`, `-y` |
+| `fp policies disable POLICY_ID` | أزلها من كل نشر يحملها، واصك جيل جديد على كل واحد. | `--yes`, `-y` |
+| `fp policies delete POLICY_ID` | احذف إصدار سياسة. | `--yes`, `-y` |
+| `fp policies test PATH` | شغّل سياسة محلياً مقابل سياق اصطناعي. تطبّق مرشح `match` لكل سياسة، لذلك يتم الإبلاغ عن واحد لا يغطي الحدث/الأداة المعطاة باسم `skipped` بدلاً من التشغيل. | `--event`; `--tool`; `--command`; `--file-path`; `--expect` |
+| `fp policies compose PROMPT` | صغ سياسة مع المساعد. تحتاج `policies:write`. | — |
+
+### الأسطول
+
+ما هي الماكينات التي تشغّل السياسات. **جلسة فقط**، نفس السبب أعلاه.
+
+| الأمر | الغرض | الخيارات |
+| --- | --- | --- |
+| `fp fleet list` | ادرج الماكينات المسجلة وجيل النشر الخاص بها. | — |
+| `fp fleet show MACHINE_ID` | مجموعة السياسات التي تشغّلها ماكينة حالياً. | — |
+| `fp fleet deploy MACHINE_ID` | **استبدل مجموعة السياسة الكاملة للماكينة.** اطبع الخطة واسأل فقط على محطة طرفية تفاعلية بدون `--json`. | `--add`; `--remove`; `--set`; `--create`; `--yes`, `-y` |
+| `fp fleet diff MACHINE_ID` | قارن ماكينة مقابل نشر آخر. | — |
+| `fp fleet history MACHINE_ID` | عمليات النشر السابقة لماكينة. | — |
+| `fp fleet rollback MACHINE_ID` | استعد نشراً سابقاً. | `--yes`, `-y` |
+| `fp fleet rename MACHINE_ID` | أعط الماكينة اسماً يسهل قراءته. | `--name` مطلوب |
+
+### الحماية
+
+ماذا فعل الفرض فعلاً. **جلسة فقط**، نفس السبب أعلاه.
+
+| الأمر | الغرض | الخيارات |
+| --- | --- | --- |
+| `fp guardrails summary` | التغطية والمجاميع المحجوبة/المقيّمة وخط شرارة الرفض والجدول لكل سياسة. | `--since` (`1h`, `6h`, `24h`, `7d`); `--machine` |
+| `fp guardrails timeline` | القرارات المرتبة على النافذة، مجموع القيمة على كل مصدر السياسة. | `--since` (`1h`, `6h`, `24h`, `7d`); `--machine` |
+
+## الأعلام العامة
| العلم | الوصف |
| --- | --- |
-| `--json` | أصدر JSON قابل لقراءة الآلة. |
-| `--base-url ` | استخدم لوحة تحكم ذاتية الاستضافة أو تطوير. |
-| `--org ` | اختر منظمة لهذا الاستدعاء. |
+| `--json` | أصدر JSON قابلاً للقراءة الآلية. |
+| `--base-url ` | استخدم لوحة قيادة ذاتية التدقيق أو للتطوير. |
+| `--org ` | حدّد مؤسسة لهذا الاستدعاء. |
| `--token ` | تجاوز رمز جلسة المستخدم المحفوظ. |
-| `--api-key ` | مصادقة الأتمتة برمز API؛ لا تُحفظ أبداً. |
+| `--api-key ` | صرّح الأتمتة باستخدام مفتاح API؛ لم يتم الحفظ أبداً. |
| `--timeout ` | مهلة HTTP؛ يجب أن تكون موجبة. الافتراضي: `30`. |
-| `--quiet`, `-q` | اكتم مخرجات الحالة على stderr. |
+| `--quiet`, `-q` | كبّت إخراج الحالة على stderr. |
| `--no-color` | عطّل الإخراج الملون. |
| `--insecure` / `--secure` | عطّل أو استعد التحقق من شهادة TLS. |
-| `--version` | اطبع الإصدار غير المعبأ وخرج. |
+| `--version` | اطبع الإصدار الصريح والخروج. |
| `--help`, `-h` | اعرض المساعدة. |
-`--api-key` مقصود للأتمتة. تتطلب عمليات تسجيل الدخول وتبديل المنظمة والأوامر المساعدة جلسة مستخدم.
+`--api-key` مخصص للأتمتة. تسجيل الدخول وتبديل المؤسسة وأوامر المساعد تتطلب جلسة مستخدم.
## متغيرات البيئة
-| المتغير | المكافئ أو الغرض |
+| المتغير | ما يعادله أو الغرض |
| --- | --- |
-| `AGENTEYE_DASHBOARD_URL` | `--base-url` |
-| `AGENTEYE_ORG` | `--org` |
-| `AGENTEYE_CLI_TOKEN` | `--token` |
-| `AGENTEYE_CLI_API_KEY` | `--api-key` |
-| `AGENTEYE_CLI_JSON` | `--json` |
-| `AGENTEYE_INSECURE` | `--insecure` |
-| `AGENTEYE_HOME` | أعد تحديد موقع مجلد إعدادات CLI الحالي. |
-| `AGENTEYE_ANALYTICS_DISABLED` أو `DO_NOT_TRACK` | عطّل تحليلات CLI المجهولة. |
+| `FP_DASHBOARD_URL` | `--base-url` |
+| `FP_ORG` | `--org` |
+| `FP_TOKEN` | `--token` |
+| `FP_API_KEY` | `--api-key` |
+| `FP_JSON` | `--json` |
+| `FP_INSECURE` | `--insecure` |
+| `FP_HOME` | أعد تحديد موقع دليل تكوين CLI (افتراضي `~/.failproofai/fpcli`). |
+| `FP_ANALYTICS_DISABLED` أو `DO_NOT_TRACK` | عطّل تحليل CLI المجهول. |
| `NO_COLOR` | عطّل الإخراج الملون. |
-تتجاوز الأعلام الصريحة متغيرات البيئة، التي تتجاوز الإعدادات المحفوظة. في وضع مفتاح API، اختر المستأجر بوضوح مع `--org` أو `AGENTEYE_ORG`.
+الأعلام الصريحة تتجاوز متغيرات البيئة، التي تتجاوز التكوين المحفوظ. في وضع مفتاح API، حدّد المستأجر بشكل صريح باستخدام `--org` أو `FP_ORG`.
+
+
+ تهجئات `AGENTEYE_*` لهذه **لا يتم قراءتها بواسطة `fp`** ولم تكن أبداً — يصرّح CLI بـ `FP_*` (`fp_cli/app.py`)، والمتغير غير المعروف ليس خطأ. تعيين `AGENTEYE_DASHBOARD_URL` لا يعيد استهداف CLI؛ يتم تجاهله والأمر يعمل بصمت ضد لوحة القيادة المحفوظة بدلاً من ذلك.
+
+ `AGENTEYE_HOME` و `AGENTEYE_ENVIRONMENT` موجودة بعد، لكنها تنتمي إلى **جامع وSDK القياس**، وليس إلى هذا CLI.
+
- تطلب الأوامر التي تحذف أو تلغي أو تكتم أو تحل أو تستبدل الإعدادات بشكل افتراضي. استخدم `--yes` فقط بعد التحقق من المنظمة النشطة والهدف.
+ الأوامر التي تحذف أو تسحب أو تكبّت أو تحلّ أو تستبدل التكوين تطلب بشكل افتراضي. استخدم `--yes` فقط بعد التحقق من المؤسسة النشطة والهدف.
\ No newline at end of file
diff --git a/docs/ar/reference/custom-agents.mdx b/docs/ar/reference/custom-agents.mdx
index 1a23541dd..0e8e23129 100644
--- a/docs/ar/reference/custom-agents.mdx
+++ b/docs/ar/reference/custom-agents.mdx
@@ -1,47 +1,43 @@
---
-title: "وكلاء مخصصون"
-description: "قم بتتبع الآثار من الوكلاء المخصصين باستخدام Failproof AI حتى يتمكن من إعادة بناء التشغيلات والعثور على الأخطاء."
+---
+title: "الوكلاء المخصصون"
+description: "التكوين وفهرس الأحداث وقواعد الارتباط والتسليم لـ failproofai-sdk."
icon: "python"
---
-قم بتتبع الآثار من وكيل مخصص باستخدام `failproofai-sdk` بحيث يمكن لـ Failproof AI إعادة بناء كل تشغيل، وتدقيق سلوكه، والعثور على الأخطاء المدعومة بالأدلة. يكتب SDK أحداثًا منظمة لـ Failproof daemon لتسليمها إلى Cloud. يتطلب Python 3.10 أو أحدث.
-
-يجعل التتبع الوكلاء المخصصين قابلين للملاحظة والتدقيق. يتطلب منع إجراء غير آمن قبل تنفيذه أيضًا خطاف إنفاذ في وقت التشغيل الخاص بك.
-
-
- لفرض السياسات في إعداد وكيل مخصص، [اتصل بـ Failproof AI](mailto:support@befailproof.ai). سنساعدك في ربط نموذج وقت التشغيل الخاص بك والأداة وحدود دورة الحياة بـ policy hooks.
-
+شرح لكل إعدادات وطرق وحقول. إذا كنت تقوم بالأداة لأول مرة، ابدأ بالدليل — هذه الصفحة مخصصة للبحث عن معلومات محددة.
-
-
-
+
+
+ التثبيت والأداة وطرق الأحداث ومثال عملي والمشاكل الشائعة.
+
+
+ LangChain و CrewAI و LlamaIndex و Pydantic AI توفر الأداة لنفسها بنداء واحد.
+
+
-## تثبيت `failproofai-sdk`
+Python 3.10 أو أحدث. بدون تبعيات وقت التشغيل.
-يتم توزيع SDK حاليًا كعجلة خاصة. اطلب من جهة اتصالك في Failproof AI الحصول على الإصدار الحالي وإمكانية التنزيل.
+## التثبيت
```bash
-VERSION=
-pip install "./failproofai_sdk-${VERSION}-py3-none-any.whl"
-python -c "import failproofai; print(failproofai.__version__)"
+pip install failproofai-sdk
```
-مع `uv`، قم بتنزيل العجلة أولاً وقم بتشغيل `uv add ./failproofai_sdk-${VERSION}-py3-none-any.whl`. قم بتثبيت العجلة في مستودع آثار خاص أو قفل التبعيات.
+يتم تثبيت الحزمة باسم `failproofai-sdk` واستيرادها في Python باسم `failproofai_sdk`. ملحقات الأطر مثل `failproofai-sdk[langgraph]` تثبت الإطار نفسه؛ المحولات تأتي دائماً في عجلة القاعدة.
-يتم تثبيت الحزمة باسم `failproofai-sdk` وتُستورد في Python باسم `failproofai`.
-
-## توصيل Failproof daemon
+## توصيل خادم Failproof
-
- 1. انتقل إلى **Admin → Keys** وأنشئ مفتاحًا باستخدام `events:add`.
- 2. [وصّل Failproof daemon إلى Cloud](/ar/start/setup#connect-a-machine-to-cloud) على جهاز الوكيل.
- 3. قم بتشغيل جلسة واحدة مزودة بتتبع، ثم ابحث عن معرّفها الدقيق ضمن **Observe → Events**.
- 4. انتقل إلى **Observe → Sessions**، واختر نفس البيئة، وافتح الآثار المعاد بناؤها.
+
+ 1. انتقل إلى **Admin → Keys** وأنشئ مفتاحاً بصلاحية `events:add`.
+ 2. [وصّل خادم Failproof إلى السحابة](/ar/start/setup#connect-a-machine-to-cloud) على جهاز الوكيل.
+ 3. قم بتشغيل جلسة واحدة موصولة بالأداة، ثم ابحث عن معرّفها الدقيق تحت **Observe → Events**.
+ 4. انتقل إلى **Observe → Sessions**، اختر نفس البيئة، وافتح التتبع المعاد بناؤه.
- 
+ 
-
+
```bash
failproofai config \
--connect https://app.befailproof.ai \
@@ -51,102 +47,84 @@ python -c "import failproofai; print(failproofai.__version__)"
-## تتبع تشغيل كامل
-
-استدع `configure()` مرة واحدة أثناء بدء العملية. كل استدعاء حدث هو keyword-only ويتطلب `session_id` و `agent_id` مستقرة.
+## التكوين
```python
-import traceback
-import uuid
+import failproofai_sdk
+
+failproofai_sdk.configure(
+ base_dir=None,
+ flush_interval=0.5,
+ environment="production",
+)
+```
-import failproofai
+| المعامل | الوظيفة |
+| --- | --- |
+| `environment` | التسمية على كل حدث — `production` أو `staging` أو `prod-eu`. القيمة الافتراضية `dev`. |
+| `flush_interval` | مدى تكرار كتابة الخيط الخلفي إلى القرص، بالثواني. القيمة الافتراضية `0.5`. |
+| `base_dir` | مكان الكتابة. القيمة الافتراضية سpool الخادم، وهو ما تريده ما لم تعرف خلاف ذلك. |
-failproofai.configure(environment="production")
+اضبط عن طريق متغير البيئة بدلاً من ذلك:
-session_id = uuid.uuid4().hex
-agent_id = "checkout-agent"
+| المتغير | الوظيفة |
+| --- | --- |
+| `AGENTEYE_ENVIRONMENT` | يضبط `environment` دون تغيير الكود، عندما تكون التسمية تابعة للنشر وليس التطبيق. معامل `configure()` يتفوق عليه. |
+| `FAILPROOFAI_HOME` | ينقل جذر Failproof AI الذي يحتوي على spool. |
+| `FAILPROOFAI_SDK_STRICT` | `1` يجعل أخطاء الأداة ترفع استثناءات بدلاً من تسجيلها. |
+| `FAILPROOFAI_SDK_STRICT_INTEGRATIONS` | `1` يجعل مشكلة توافق الإطار ترفع استثناءً بدلاً من تحذير والمتابعة. |
-failproofai.event.agent_start(
- session_id=session_id,
- agent_id=agent_id,
- goal="Resolve a failed checkout",
-)
+
+ **بدون فواصل في `environment`.** يقسم الاستيعاب هذا الحقل على الفواصل لبناء مرشحاته، وينطبق أي حدث يحتوي التسمية على واحد — لذا قد يختفي التشغيل الكامل بصمت. اكتب `prod-eu` وليس `prod,eu`.
-try:
- tool_call_id = uuid.uuid4().hex
- failproofai.event.tool_use(
- session_id=session_id,
- agent_id=agent_id,
- tool_name="lookup_order",
- tool_call_id=tool_call_id,
- input={"order_id": "ord_8421"},
- )
- result = {"status": "payment_failed"}
- failproofai.event.tool_result(
- session_id=session_id,
- agent_id=agent_id,
- tool_name="lookup_order",
- tool_call_id=tool_call_id,
- output=result,
- )
-except Exception as exc:
- failproofai.event.error(
- session_id=session_id,
- agent_id=agent_id,
- error_type=type(exc).__name__,
- message=str(exc),
- traceback=traceback.format_exc(),
- )
- failproofai.event.agent_end(
- session_id=session_id,
- agent_id=agent_id,
- outcome="failed",
- )
- raise
-else:
- failproofai.event.agent_end(
- session_id=session_id,
- agent_id=agent_id,
- outcome="success",
- summary="Escalated the failed payment",
- )
-```
+ `configure(environment="prod,eu")` يرفع الاستثناء لتكتشف على الفور. `AGENTEYE_ENVIRONMENT` لا يمكنه الرفع — لا أحد يناديك — لذا يحذر مرة واحدة ويعود إلى `dev`.
+
+
+تُصف الأحداث في الذاكرة وتُكتب في الخلفية كل `flush_interval` ثانية، مع كتابة نهائية عند خروج المفسّر. العملية المقتولة مباشرة تفقد أي شيء لم يُكتب بعد.
-أصدر `agent_start` مرة واحدة لكل فاعل. بالنسبة للوكلاء الفرعيين، أعد استخدام `session_id` الخاص بالأب، وأعط كل فاعل `agent_id` مميز، واضبط `parent_id` على معرّف الوكيل الأب، وليس معرّف الجلسة.
+## الهوية
-## مرجع التكوين
+ينتمي كل حدث إلى جلسة ووكيل. **النطاقات تملأ كليهما**، لذا نادراً ما تمرّرهما:
```python
-failproofai.configure(
- base_dir=None,
- flush_interval=0.5,
- environment="production",
-)
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("planner"):
+ failproofai_sdk.event.tool_use(tool_name="search", tool_call_id="c1")
```
-| الإعداد | السلوك |
-| --- | --- |
-| `base_dir` | جذر spool صريح. يأخذ الأولوية على جميع متغيرات البيئة. |
-| `flush_interval` | الثواني بين الكتابات في الخلفية من الذاكرة إلى JSONL. الافتراضي: `0.5`. |
-| `environment` | تسمية النشر على كل حدث. الافتراضي هو `dev`. |
-| `FAILPROOFAI_HOME` | يغير جذر Failproof AI الذي يحتوي على spool `custom-agents`. |
-
-يكتب SDK إلى `base_dir` الصريح عند تعيينه. وإلا، فإنه يستخدم spool `custom-agents` الخاص بـ Failproof daemon ضمن `FAILPROOFAI_HOME` أو `~/.failproofai`.
+إمرار `session_id` أو `agent_id` صراحةً يعمل أيضاً ويتفوق. بدون ربط أو تمرير، يرفع النداء `TypeError` بدلاً من إطلاق حدث قد تتجاهله السحابة.
-يقوم SDK بطلب الاستدعاءات في الذاكرة ويكتب دفعات على سلسلة خيط في الخلفية. كما يحاول التنظيف النهائي من خلال معالجة Python `atexit`. بالنسبة للعمال قصيري الأجل، اسمح بإيقاف المترجم الطبيعي؛ قد يؤدي إنهاء العملية الثابتة إلى فقدان الأحداث التي لا تزال في الذاكرة.
+
+ الهوية تعمل على متغيرات السياق. تتبع مهام `asyncio` تلقائياً، لكن **ليس** الخيوط الجديدة — غلّف عامل في `failproofai_sdk.propagate()` أو أحداثه ستنفصل.
+
## فهرس الأحداث
-جميع الطرق ترجع `None`. يتم حذف الحقول المتروكة كـ `None` بدلاً من كتابتها كـ JSON `null`.
+خمس عشرة طريقة. معظمها يأتي في **أزواج** — تستدعي المفتاح، ثم الإغلاق، و SDK يوقت الفجوة.
-| الطريقة | الحقول المطلوبة بخلاف الهوية | الحقول الاختيارية |
+| | يفتح | يغلق |
+| --- | --- | --- |
+| **الوكلاء** | `agent_start` | `agent_end` |
+| | `agent_pause` | `agent_resume` |
+| **النماذج** | `model_request` | `model_response` |
+| **الأدوات** | `tool_use` | `tool_result` |
+| **الخطافات** | `hook_triggered` | `hook_completed` |
+| **البشر** | `human_wait` | `human_input` |
+
+ثلاثة تقف بمفردها: `error` و `human_pause` و `human_interrupt`.
+
+
+
+كل طريقة تأخذ أيضاً `session_id` و `agent_id`، والتي تملأ النطاقات لك. أي شيء متُرك كـ `None` يُحذف بدلاً من إرساله كـ JSON `null`، وكل طريقة تعيد `None`.
+
+| الطريقة | مطلوب | اختياري |
| --- | --- | --- |
| `agent_start` | — | `goal`, `parent_id` |
| `agent_end` | — | `outcome`, `summary` |
| `agent_pause` | `pause_id` | `reason`, `user_id` |
| `agent_resume` | `pause_id` | `reason`, `user_id` |
-| `model_request` | — | `model`, `messages`, `system`, `tools` |
-| `model_response` | — | `model`, `stop_reason`, `input_tokens`, `output_tokens`, `content`, `role` |
+| `model_request` | — | `model`, `messages`, `system`, `tools`, `request_id` |
+| `model_response` | — | `model`, `stop_reason`, `input_tokens`, `output_tokens`, `content`, `role`, `request_id`, `duration_ms` |
| `tool_use` | `tool_name`, `tool_call_id` | `input` |
| `tool_result` | `tool_name`, `tool_call_id` | `output`, `error` |
| `hook_triggered` | `hook_name`, `hook_id` | `trigger_event`, `input` |
@@ -157,29 +135,66 @@ failproofai.configure(
| `human_pause` | — | `reason`, `user_id` |
| `human_interrupt` | — | `reason`, `user_id`, `at_step` |
-استخدم `outcome="failed"`، `"error"`، `"timeout"`، أو `"rejected"` عندما يجب أن تُعتبر عملية الإكمال بمثابة فشل. القيم الأخرى، بما فيها `"failure"`، لا تُصنف كفشل من قبل backend الحالي.
+
+
+
+ لتحديد تشغيل كفاشل، يجب أن يكون `outcome` واحداً من `failed` أو `error` أو `timeout` أو `rejected`. أي شيء آخر — بما فيه الحالة القريبة `"failure"` — يُحسب كنجاح.
+
+
+## الاقتران والمدة
+
+**قاعدة واحدة: أعطِ حدث الإغلاق نفس المعرّف الذي لفاتح.** هذا هو ما يقترنها، وما يسمح لـ SDK بقياس الفجوة.
+
+| الزوج | مطابق على |
+| --- | --- |
+| `tool_use` → `tool_result` | `tool_call_id` |
+| `hook_triggered` → `hook_completed` | `hook_id` |
+| `agent_pause` → `agent_resume` | `pause_id` |
+| `human_wait` → `human_input` | `input_id` |
+| `model_request` → `model_response` | `request_id` |
+
+**لا تمرّر `duration_ms` بنفسك.** يقيسها SDK، وتمريرها يرفع `ValueError`.
-## قواعد الارتباط والمدة
+الاستثناء الوحيد هو `model_response`، حيث أنت وحدك تعرف زمن الكمون الفعلي للمزود. مرّر عدداً صحيحاً من الميلي ثانية — العدد العشري يرفع، لأن العمود عدد صحيح 32 بت وقد ينتهي به الحال فارغاً.
-- أعد استخدام نفس `tool_call_id` أو `hook_id` أو `pause_id` أو `input_id` لحدث الإكمال المطابق.
-- يحسب SDK `duration_ms` لـ `tool_result` و `hook_completed` و `agent_resume` و `human_input`. تمرير قيمة بنفسك إلى تلك الطرق يرفع `ValueError`.
-- معرفات الأداة والخطاف تشترك في خريطة انتظار واحدة على مستوى العملية. اجعلها فريدة عالميًا عبر الجلسات المتزامنة وعبر كلا المساحة؛ معرّفات الموفر أو UUIDs هي الأكثر أمانًا.
-- الزوج المنقسم عبر العمليات لا يزال يرتبط بالتطبيق، لكن SDK لا يمكنه حساب مدته داخل العملية.
-- تحتفظ خريطة الانتظار بـ 10000 بداية على الأكثر وتزيل الإدخال الأقدم عند امتلاء الحد.
+
-## الحقول المخصصة والبيانات الضخمة
+- **المعرّفات تحتاج فقط إلى أن تكون فريدة لكل نوع، لكل جلسة.** استدعاء أداة وخطاف قد يشاركان واحداً؛ جلستان تعملان في نفس الوقت قد تعيد استخدام نفس المعرّفات دون تصادم.
+- **لا يتم تحديد نطاقها لوكيل.** زوج فُتح تحت وكيل واحد وأُغلق تحت آخر يطابق أيضاً — وهذه هي الحالة الطبيعية في كود متعدد الوكلاء.
+- **`request_id` اختياري لكن موصى به.** بدونه، تقترن أحداث النموذج بالترتيب الذي تصل، لذا نداءان متزامنان في نفس الوكيل قد يقترنان خطأً.
+- **زوج مقسم عبر العمليات** يطابق أيضاً في السحابة، لكن SDK لا يمكنه قياسه — لا شيء في أي عملية رأى كلا النصفين.
+- **على الأكثر 10000 فاتح ينتظر أقرب في نفس الوقت.** بعد ذلك الأقدم يُحذف، لذا تسريب لا يمكنه النمو بدون حد.
-كل حدث يقبل حقول keyword إضافية. استخدم القيم المتوافقة مع JSON عندما تحتاج الاستعلامات الموضوعية إلى البنية. الأوراق غير المدعومة مثل UUIDs والتواريخ والكسور العشرية والمجموعات والبايتات وكائنات النموذج يتم تحويلها إلى نصوص من قبل الكاتب.
+
-الأسماء المخصصة المحجوزة هي `timestamp` و `session_id` و `agent_id` و `type` و `environment`. الأخطاء المطبعية في الحقول الاختيارية يتم قبولها كحقول مخصصة جديدة، لذلك قم بمراجعة JSON المُرسل عندما لا يظهر حقل قياسي في Cloud.
+## حقولك الخاصة
+
+أي كلمة مفتاح إضافية تمررها يتم تخزينها مع الحدث:
+
+```python
+failproofai_sdk.event.tool_use(
+ tool_name="search", tool_call_id="c1",
+ fw_tenant="acme", fw_region="eu-west-1", # خاصة بك
+)
+```
+
+فضّل أنواع JSON إذا أردت الاستعلام عنها لاحقاً. أي شيء آخر — UUID أو datetime أو `Decimal` أو set أو bytes أو كائن نموذج — يُخزّن كسلسلة نصية.
+
+
+ **اجعل أسماء حقولك بادئة.** الإضافات تُطبق أخيراً، لذا حقل يُسمى `model` أو `tool_name` أو `outcome` يستبدل الحقل الحقيقي بصمت. محولات الإطار تستخدم `fw_`؛ افعل الشيء نفسه ولا شيء قد يصطدم.
+
+ هذا هو أيضاً السبب في أن حقل اختياري خاطئ الإملاء لا يرفع أخطاء أبداً — يصبح حقل مخصص جديد. إذا كان حقل قياسي مفقوداً في السحابة، تحقق من الإملاء أولاً.
+
+
+هذه الأسماء الخمسة مreserved وترفع مباشرة: `timestamp` و `session_id` و `agent_id` و `type` و `environment`.
## التسليم والتحقق
-
- في **Observe → Events**، تحقق من وجود `agent_start` أولاً و `agent_end` أخيرًا. ثم افتح **Observe → Sessions** وتأكد من ظهور أحداث النموذج والأداة والإنسان والخطاف والخطأ بالترتيب المقصود. استخدم معرّف الجلسة كمفتاح استكشاف الأخطاء الأساسي.
+
+ في **Observe → Events**، تحقق من أن `agent_start` موجود أولاً و `agent_end` موجود أخيراً. ثم افتح **Observe → Sessions** وأكّد أن أحداث النموذج والأداة والإنسان والخطاف والخطأ تظهر بالترتيب المقصود. استخدم معرّف الجلسة كمفتاح استكشاف الأخطاء الأساسي.
-
+
```bash
failproofai flush --wait --timeout 60
failproofai config --status
@@ -189,10 +204,14 @@ failproofai.configure(
-إذا كانت Cloud فارغة، فافحص `$FAILPROOFAI_HOME/custom-agents/events`، وإلا `~/.failproofai/custom-agents/events`. ملفات JSONL تثبت انبعاث SDK؛ يشير spool متزايد إلى تكوين daemon أو تسليم، بينما يشير spool فارغ إلى تتبع أو عمر العملية.
+إذا كانت السحابة فارغة، افحص `$FAILPROOFAI_HOME/custom-agents/events`، وإلا `~/.failproofai/custom-agents/events`. ملفات JSONL تثبت إطلاق SDK؛ spool متنامٍ يشير إلى تكوين الخادم أو التسليم، بينما spool فارغ يشير إلى الأداة أو عمر العملية.
+
+
+ افحص spool فقط عندما يكون الخادم متوقفاً. بينما يعمل، يجمع ويحذف كل دفعة في ميلي ثانية، لذا قائمة دليل تتسابق مع المجمّع وتظهر أحداثاً أقل بكثير مما تم إطلاقه.
+
## منع الأخطاء في وقت تشغيل مخصص
-استخدم النتائج المدققة والآثار المرتبطة لتحديد الإجراء غير الآمن والأدلة المطلوبة والاستجابة المقصودة. يجب أن يكشف تكامل الإنفاذ المخصص الإجراء قبل التنفيذ، وتمرير مدخلاته المنظمة إلى محرك السياسة، وتطبيق قرار allow أو instruct أو deny الناتج.
+استخدم نتائج التدقيق والتتبعات المرتبطة لتحديد الإجراء غير الآمن والأدلة المطلوبة والاستجابة المقصودة. يجب على التكامل الإنفاذ المخصص أن يعرّض الإجراء قبل التنفيذ ويمرّ إدخاله المهيكل إلى محرك السياسة ويطبّق قرار allow أو instruct أو deny الناتج.
-أرسل بريدًا إلى [support@befailproof.ai](mailto:support@befailproof.ai) لتصميم والتحقق من هذا التكامل لوقت التشغيل الخاص بك.
\ No newline at end of file
+[اتصل بـ Failproof AI](mailto:support@befailproof.ai) وسنساعدك في ربط حدود النموذج والأداة ودورة حياة وقت التشغيل بـ policy hooks، ثم التحقق من التكامل معك.
\ No newline at end of file
diff --git a/docs/ar/reference/events-and-configuration.mdx b/docs/ar/reference/events-and-configuration.mdx
index 2a6e0c29e..2ed5c272f 100644
--- a/docs/ar/reference/events-and-configuration.mdx
+++ b/docs/ar/reference/events-and-configuration.mdx
@@ -1,41 +1,41 @@
---
title: "الأحداث والتكوين"
-description: "مرجعية نموذج الحدث والبيئات والتخزين المحلي وحدود التكوين."
+description: "مرجعية نموذج الأحداث والبيئات والتخزين المحلي وحدود التكوين."
icon: "list-tree"
---
## عائلات الأحداث
-- بدء الوكيل وإنهاؤه والإيقاف المؤقت واستئناف التشغيل
-- طلب النموذج والاستجابة
+- بدء الوكيل وإنهاؤه وإيقافه مؤقتًا واستئنافه
+- طلب واستجابة النموذج
- استخدام الأداة والنتيجة
-- تشغيل الخطاف واكتماله
+- تفعيل Hook واكتماله
- انتظار الإنسان والإدخال والإيقاف المؤقت والمقاطعة
- الأخطاء الصريحة
-كل حدث يحمل طابع زمني ومعرّف جلسة ومعرّف وكيل ونوع حدث وبيئة. تحتوي الحقول الخاصة بالحدث على بيانات النموذج والأداة والارتباط والنتيجة والمحتوى والمدة أو الخطأ.
+يحمل كل حدث طابع زمني ومعرّف الجلسة ومعرّف الوكيل ونوع الحدث والبيئة. تحتوي الحقول الخاصة بالحدث على بيانات النموذج أو الأداة أو الارتباط أو النتيجة أو المحتوى أو المدة أو الخطأ.
## فحص عقد الحدث
-
+
1. افتح **Observe → Events**.
2. عيّن نافذة زمنية قصيرة وقم بالتصفية حسب البيئة والوكيل ونوع الحدث.
- 3. حدد حدثًا لفحص حقوله المعايرة والحمولة الأولية، ثم افتح جلسته لرؤية سياق التنفيذ.
- 4. إذا كانت المدة المقترنة مفقودة، تحقق من أن أحداث البداية والاكتمال تستخدم نفس معرّف الارتباط.
+ 3. حدد حدثًا لفحص حقوله المعيارية والحمل الأولي، ثم افتح جلسته لرؤية سياق التنفيذ.
+ 4. إذا كانت المدة المرتبطة مفقودة، تحقق من أن أحداث البدء والاكتمال تستخدم نفس معرّف الارتباط.
- استخدم تدفق الأحداث لتضييق البيانات إلى تشغيل وكيل واحد وفحص حقول الحدث المعايرة.
+ استخدم مجرى الأحداث لتضييق البيانات على تشغيل وكيل واحد وفحص حقول الأحداث المعيارية.
- 
+ 
- ثم اتبع الحدث إلى جلسته. يُظهر التتبع ما حدث مباشرة قبله وبعده، وهو ضروري عندما تكون الحمولة وحدها غامضة.
+ ثم اتبع الحدث إلى جلسته. يوضح التتبع ما حدث قبل الحدث وبعده مباشرة، وهذا ضروري عندما يكون الحمل الأولي غامضًا بمفرده.

- قارن معرّفات الارتباط والطوابع الزمنية عبر كلا العرضين عندما يكون حدث مقترن أو مدة مفقودة.
+ قارن معرّفات الارتباط والطوابع الزمنية عبر كلا العرضين عندما يكون الحدث أو المدة المقترنة مفقودة.
- اكتشف قيم التصفية الصالحة، ثم احصل على حمولات الأحداث الكاملة لجلسة واحدة:
+ اكتشف قيم المرشح الصحيحة، ثم احصل على حمولات الأحداث الكاملة لجلسة واحدة:
```bash
fp list event_types
@@ -47,32 +47,32 @@ icon: "list-tree"
--full
```
- استخدم `fp --json events ... --fields ts,event_type,session_id,payload` للفحص الذي يمكن قراءته بواسطة الآلات.
+ استخدم `fp --json events ... --fields ts,event_type,session_id,payload` للفحص القابل للقراءة الآلية.
## حقول SDK المحجوزة
-لا تستخدم `timestamp` أو `session_id` أو `agent_id` أو `type` أو `environment` كحقول Python SDK مخصصة. يتم حساب مدات الأحداث المقترنة مثل مدة نتيجة الأداة بواسطة SDK ولا يمكن توفيرها يدويًا.
+لا تستخدم `timestamp` أو `session_id` أو `agent_id` أو `type` أو `environment` كحقول Python SDK مخصصة. يتم حساب مدد الأحداث المرتبطة مثل مدة نتيجة الأداة من قبل SDK ولا يمكن توفيرها يدويًا.
## الحدود المحلية
-- يعيش Failproof AI تحت `~/.failproofai` ما لم يتم تكوينها بشكل صريح بخلاف ذلك.
-- يستخدم `failproofai-sdk` `AGENTEYE_HOME` لتجاوز دليل البداية الخاص به القديم.
-- يمكن تعيين تسميات البيئة من خلال تكوين SDK أو `AGENTEYE_ENVIRONMENT`.
-- يتم تخزين بيانات اعتماد الخادم بشكل منفصل عن الإعدادات غير السرية.
+- تعيش حالة Failproof AI تحت `~/.failproofai` ما لم يتم تكوينها بشكل صريح بخلاف ذلك.
+- يقوم `failproofai-sdk` دائمًا بإعادة التوجيه تحت `~/.failproofai/custom-agents`. ينقل `FAILPROOFAI_HOME` هذا المنزل؛ يتم إلحاق مقطع `custom-agents` دائمًا، وبالتالي لا يمكن وضع التوجيه خارجه. فقط `configure(base_dir=...)` الخاص بـ SDK يكتب في مكان آخر. يتم قراءة `AGENTEYE_HOME` من قبل `agenteye-collector` الأقدم لاختيار ما يجب مراقبته، وليس له تأثير بعد الآن على مكان كتابة SDK.
+- يمكن تعيين علامات البيئة من خلال تكوين SDK أو `AGENTEYE_ENVIRONMENT`.
+- يتم تخزين بيانات اعتماد Daemon بشكل منفصل عن الإعدادات غير السرية.
-استخدم أسماء بيئة مستقرة وقليلة الأساسية. الفواصل المنقوطة غير مدعومة في تسميات بيئة خادم Failproof AI.
+استخدم أسماء بيئات مستقرة منخفضة الأساسية. لا يتم دعم الفواصل في علامات بيئة daemon.
-## تغيير تسمية البيئة
+## تغيير علامة البيئة
-
- يتم تعيين تسميات البيئة بواسطة SDK الباعث أو خادم Failproof AI. بعد تغيير أحدها، افتح **Observe → Sessions** واستخدم عامل تصفية البيئة للتأكد من أن الجلسات الجديدة تحمل القيمة الجديدة. تحتفظ الجلسات الموجودة بالبيئة الأصلية.
+
+ يتم تعيين علامات البيئة من قبل SDK الذي ينبعث منه أو من Failproof daemon. بعد تغيير واحد، افتح **Observe → Sessions** واستخدم مرشح البيئة للتأكد من أن الجلسات الجديدة تحمل القيمة الجديدة. تحتفظ الجلسات الموجودة ببيئتها الأصلية.
- بالنسبة إلى `failproofai-sdk`، قم بتكوين البيئة في الكود أو باستخدام متغير البيئة القديم الخاص به. أعد تشغيل تكوين الخادم عند تغيير الإعدادات على مستوى الجهاز.
+ بالنسبة إلى `failproofai-sdk`، قم بتكوين البيئة في الكود أو باستخدام متغير البيئة الخاص به. أعد تشغيل تكوين daemon عند تغيير الإعدادات على مستوى الجهاز.
```bash
export AGENTEYE_ENVIRONMENT=production-us-east
diff --git a/docs/ar/reference/harnesses.mdx b/docs/ar/reference/harnesses.mdx
index 2b54b50c2..d2ad35c84 100644
--- a/docs/ar/reference/harnesses.mdx
+++ b/docs/ar/reference/harnesses.mdx
@@ -1,72 +1,72 @@
---
---
-title: "خوادم الوكيل"
-description: "التقط الجلسات وفرض السياسات عبر 12 خادم وكيل مدعوم."
+title: "أدوات تشغيل الوكلاء"
+description: "التقط الجلسات وفرض السياسات عبر جميع أدوات التشغيل الـ 12 المدعومة."
icon: "plug-zap"
---
-الخادم هو البيئة التي يعمل فيها الوكيل بالفعل. يدعم Failproof AI اثنا عشر منها، في فئتين:
+أداة التشغيل هي البيئة التي يعمل فيها الوكيل بالفعل. يدعم Failproof AI اثنا عشر منها، في فئتين:
-- **أدوات سطر الأوامر لكتابة الأكواد** (10) — Claude Code, Codex, GitHub Copilot CLI, Cursor, OpenCode, Pi, Factory Droid, Devin CLI, Antigravity CLI, Goose
-- **بوابات الدردشة والمساعدات** (2) — Hermes (Slack, Telegram, cron), OpenClaw (مساعد موثوق بنفسك)
+- **واجهات سطر الأوامر للترميز** (10) — Claude Code و Codex و GitHub Copilot CLI و Cursor و OpenCode و Pi و Factory Droid و Devin CLI و Antigravity CLI و Goose
+- **بوابات الدردشة والمساعدين** (2) — Hermes (Slack و Telegram و cron) و OpenClaw (مساعد ذاتي الاستضافة)
-نفس السياسات وسجل الجلسة ذاته ينطبقان على أي خادم يعمل فيه الوكيل. طبقة محول واحدة تحول أسماء الأحداث الأصلية لكل خادم وأسماء الأدوات وحقول إدخال الأدوات إلى 29 حدثاً قياسياً قبل تطبيق أي سياسة.
+تنطبق نفس السياسات وتاريخ الجلسة ذاته بغض النظر عن أداة التشغيل التي يعمل فيها الوكيل. طبقة محول واحدة تربط أسماء الأحداث الأصلية لكل أداة تشغيل وأسماء الأدوات وحقول إدخال الأدوات على 29 حدثًا قانونيًا قبل تشغيل أي سياسة.
-وكيل يعمل في **لا أحد** من الاثني عشر خادم يتم توظيفه مباشرة باستخدام [Python SDK](/ar/reference/custom-agents). هذا عقد مختلف، ويستحق الإشارة بوضوح: SDK يوفر التتبع والجلسات والتقييمات والتدقيق — **إنه لا يفرض السياسات بمفرده.** منع الإجراء غير الآمن قبل تنفيذه يتطلب خطاف إنفاذ على حدود أداة وقتك؛ [اتصل بنا](mailto:support@befailproof.ai) وسنقوم بتعيينها.
+الوكيل الذي لا يعمل في **أيًا** من الاثني عشر يتم الآلية مباشرة باستخدام [Python SDK](/ar/reference/custom-agents). هذا عقد مختلف، ويستحق التصريح به بوضوح: يوفر SDK التتبع والجلسات والتقييمات والتدقيق — **لا يفرض السياسات بمفرده.** منع الإجراء غير الآمن قبل تنفيذه يتطلب خطاف إنفاذ على حدود أداة وقتك؛ [تواصل معنا](mailto:support@befailproof.ai) وسنقوم بربطها.
-| الخادم | نطاقات الخطاف المدعومة |
+| أداة التشغيل | نطاقات الخطاف المدعومة |
| --- | --- |
-| Claude Code | المستخدم، المشروع، محلي |
-| Codex, GitHub Copilot CLI, Cursor, OpenCode, Pi | المستخدم، المشروع |
-| Factory Droid, Devin CLI, Antigravity CLI, Goose | المستخدم، المشروع |
-| Hermes, OpenClaw | المستخدم |
+| Claude Code | المستخدم والمشروع والمحلي |
+| Codex و GitHub Copilot CLI و Cursor و OpenCode و Pi | المستخدم والمشروع |
+| Factory Droid و Devin CLI و Antigravity CLI و Goose | المستخدم والمشروع |
+| Hermes و OpenClaw | المستخدم |
-تقوم كل عملية دمج بتطبيع أسماء أحداث الخطاف الأصلية وأسماء الأدوات وحقول إدخال الأدوات قبل تطبيق السياسات. لا يمكن لأي سياسة التصرف إلا على الأحداث التي يكشفها الخادم؛ اختبر السلوك في نهاية الدور والتعليمات على الخادم والإصدار بالضبط الذي تنشره.
+يقوم كل تكامل بتطبيع أسماء أحداث الخطاف الأصلية وأسماء الأدوات وحقول إدخال الأدوات قبل تشغيل السياسات. يمكن للسياسة التصرف فقط على الأحداث التي تكشفها أداة التشغيل؛ اختبر السلوك في نهاية الدور والتعليمات على أداة التشغيل والإصدار المحددة بالضبط التي تنشرها.
-## قدرة الإنفاذ
+## القدرة على الإنفاذ
-"البلوك" يعني أن الحكم المرتجع من المحول الحالي يتم استهلاكه بواسطة الخادم المسمى. قد يستبدل الحجب بعد الأداة النتيجة المعروضة للنموذج ولكن لا يمكنه الرجوع في تأثير جانبي للأداة حدث بالفعل.
+"حجب" يعني أن الحكم المُعاد من محول التكيف الحالي يتم استهلاكه بواسطة أداة التشغيل المسماة. قد يحل الحجب بعد الأداة محل النتيجة المعروضة على النموذج لكنه لا يمكنه التراجع عن تأثير جانبي للأداة حدث بالفعل.
-| الخادم | أحداث الحجب المتحقق منها | تحذيرات الملاحظة فقط أو عدم الحجب |
+| أداة التشغيل | أحداث الحجب المتحقق منها | تحذيرات الملاحظة فقط أو عدم الحجب |
| --- | --- | --- |
-| Claude Code | `PreToolUse`, `UserPromptSubmit`, `PermissionRequest`, `Stop`, `SubagentStop`, `PreCompact`, وعدة أحداث مهمة/إعدادات | `PostToolUse`, دورة حياة الجلسة، الإخطارات، وأحداث ما بعد الفشل قابلة للملاحظة. |
-| Codex | `PreToolUse`, `PermissionRequest`, `UserPromptSubmit`, `Stop`, `SubagentStop`, `PostToolUse` | الحجب بعد الأداة يستبدل النتيجة بعد التنفيذ؛ أحداث بداية الجلسة والضغط قابلة للملاحظة في المحول الحالي. |
-| GitHub Copilot CLI | `PreToolUse`, `UserPromptSubmit`, `PermissionRequest`, `Stop`, `SubagentStop`, `PostToolUse` | الحجب بعد الأداة يستبدل النتيجة بعد التنفيذ؛ أحداث الجلسة والإخطار قابلة للملاحظة. |
-| Cursor | `PreToolUse`, `UserPromptSubmit`, `Stop` | `PostToolUse` وأحداث الجلسة قابلة للملاحظة. |
-| OpenCode | `PreToolUse` | أحداث ما بعد الأداة ودورة الحياة قابلة للملاحظة؛ معالجة التوقف الحالية عبارة عن إرشاد لدور لاحق وليس بوابة موثوقة. |
-| Pi | `PreToolUse`, `UserPromptSubmit` | أحداث ما بعد الأداة ودورة الحياة قابلة للملاحظة؛ إرشاد التوقف ينطبق على دور لاحق. |
-| Hermes | `PreToolUse` | أحكام ما بعد الأداة والجلسة وتوقف الوكيل الفرعي ليست بوابات. |
-| OpenClaw | `PreToolUse`, `UserPromptSubmit`, `Stop` | أحداث ما بعد الأداة والجلسة وتوقف الوكيل الفرعي والضغط قابلة للملاحظة. |
-| Factory Droid | `PreToolUse`, `UserPromptSubmit`, `Stop`, `PreCompact` | أحكام ما بعد الأداة وتوقف الوكيل الفرعي قابلة للملاحظة. |
-| Devin CLI | `PreToolUse`, `UserPromptSubmit`, `Stop`, `PermissionRequest` مشروط | لا تعمل خطافات الإذن في كل وضع إذن؛ أحداث ما بعد الأداة والجلسة قابلة للملاحظة. |
-| Antigravity CLI | `PreToolUse`, `Stop` | أحكام مطالبة المستخدم وما بعد الأداة قابلة للملاحظة؛ يمكن بالتزامن تعليمات الموجه. |
-| Goose | `PreToolUse` | أحداث مطالبة المستخدم وما بعد الأداة والجلسة قابلة للملاحظة. خطاف توقف حجب أصلي موجود في الأعلى لكن لا يتم تثبيته بواسطة المحول الحالي. |
-
-القدرات حساسة للإصدار. أعد الاختبار بعد ترقية CLI وكيل، خاصة عندما تعتمد سياسة على سلوك الموجه أو التوقف أو الإذن أو ما بعد الأداة بدلاً من بوابة ما قبل الأداة الشائعة.
+| Claude Code | `PreToolUse` و `UserPromptSubmit` و `PermissionRequest` و `Stop` و `SubagentStop` و `PreCompact` وعدة أحداث مهام/إعدادات | `PostToolUse` ودورة حياة الجلسة والإخطارات وأحداث ما بعد الفشل قابلة للملاحظة. |
+| Codex | `PreToolUse` و `PermissionRequest` و `UserPromptSubmit` و `Stop` و `SubagentStop` و `PostToolUse` | يحل الحجب بعد الأداة محل النتيجة بعد التنفيذ؛ أحداث بدء الجلسة والضغط قابلة للملاحظة في المحول الحالي. |
+| GitHub Copilot CLI | `PreToolUse` و `UserPromptSubmit` و `PermissionRequest` و `Stop` و `SubagentStop` و `PostToolUse` | يحل الحجب بعد الأداة محل النتيجة بعد التنفيذ؛ أحداث الجلسة والإخطار قابلة للملاحظة. |
+| Cursor | `PreToolUse` و `UserPromptSubmit` و `Stop` | `PostToolUse` وأحداث الجلسة قابلة للملاحظة. |
+| OpenCode | `PreToolUse` | أحداث ما بعد الأداة ودورة الحياة قابلة للملاحظة؛ معالجة الإيقاف الحالية هي توجيه لدور لاحق وليست بوابة متحققة. |
+| Pi | `PreToolUse` و `UserPromptSubmit` | أحداث ما بعد الأداة ودورة الحياة قابلة للملاحظة؛ يسري توجيه الإيقاف على دور لاحق. |
+| Hermes | `PreToolUse` | أحكام ما بعد الأداة والجلسة وإيقاف الوكيل الفرعي ليست بوابات. |
+| OpenClaw | `PreToolUse` و `UserPromptSubmit` و `Stop` | أحداث ما بعد الأداة والجلسة وإيقاف الوكيل الفرعي والضغط قابلة للملاحظة. |
+| Factory Droid | `PreToolUse` و `UserPromptSubmit` و `Stop` و `PreCompact` | أحكام ما بعد الأداة وإيقاف الوكيل الفرعي قابلة للملاحظة. |
+| Devin CLI | `PreToolUse` و `UserPromptSubmit` و `Stop` و `PermissionRequest` المشروط | لا تعمل خطافات الإذن في كل وضع إذن؛ أحداث ما بعد الأداة والجلسة قابلة للملاحظة. |
+| Antigravity CLI | `PreToolUse` و `Stop` | تحذيرات موجه المستخدم وما بعد الأداة قابلة للملاحظة؛ يمكن لا تزال حقن تعليمات المطالبة. |
+| Goose | `PreToolUse` | أحداث موجه المستخدم وما بعد الأداة والجلسة قابلة للملاحظة. يوجد خطاف إيقاف حجب أصلي في المنبع لكنه لم يتم تثبيته بواسطة المحول الحالي. |
+
+القدرات حساسة للإصدار. أعد الاختبار بعد ترقية CLI لوكيل معين، خاصة عندما تعتمد السياسة على سلوك الموجه أو الإيقاف أو الإذن أو ما بعد الأداة بدلاً من بوابة ما قبل الأداة الشائعة.
## تثبيت خطافات الالتقاط والسياسة
- 1. افتح **الإدارة → المفاتيح** وأنشئ مفتاحاً مع `events:add` و `policies:pull`، مسمى للجهاز أو البيئة.
- 2. على الجهاز المستهدف، اربط CLI المحلي بالمفتاح المعروض وثبت خطافات الخادم.
- 3. ابدأ جلسة وكيل جديدة، ثم أكد أحداث الخطاف والجلسة تحت **مراقبة → الأحداث**.
- 4. افتح **مراقبة → السياسة** لنفس نطاق الوقت وأكد أن قرار السياسة يُنسب للجهاز.
+ 1. افتح **الإدارة → المفاتيح** وأنشئ مفتاحًا بـ `events:add` و `policies:pull`، مسمى للجهاز أو البيئة.
+ 2. على الجهاز المستهدف، قم بتوصيل CLI المحلي بالمفتاح المعروض وتثبيت خطافات أداة التشغيل.
+ 3. ابدأ جلسة وكيل جديدة، ثم أكد أحداث الخطاف والجلسة الخاصة بها تحت **ملاحظة → الأحداث**.
+ 4. افتح **ملاحظة → السياسة** لنفس نطاق الوقت وأكد أن قرار السياسة يُعزى إلى الجهاز.
- يبدأ الاتصال بمفتاح آلة. تأكد من أنه يتضمن أذونات الهضم وتسليم السياسة قبل نسخ سره.
+ يبدأ الاتصال بمفتاح الجهاز. أكد أنه يتضمن أذونات البث والتسليم السياسي قبل نسخ سره.
- 
+ 
- بعد تثبيت الخطافات، يجب أن يعرض دفق الأحداث أحداثاً جديدة من الجهاز والبيئة التي اتصلت بها.
+ بعد تثبيت الخطافات، يجب أن يعرض تدفق الأحداث أحداثًا جديدة من الجهاز والبيئة التي قمت بتوصيلها.
- 
+ 
- أخيراً، تحقق من أن قرارات السياسة تُنسب للجهاز ذاته. هذا يؤكد أن الخادم يقدم تقارير عن نشاط السياسة وكذلك أحداث التتبع.
+ أخيرًا، تحقق من أن قرارات السياسة تُعزى إلى نفس الجهاز. هذا يؤكد أن أداة التشغيل تقدم تقارير عن نشاط السياسة وكذلك أحداث التتبع.
- 
+ 
- ثبت الخطافات لكل خادم مكتشف:
+ تثبيت الخطافات لكل أداة تشغيل تم اكتشافها:
```bash
failproofai config \
@@ -75,7 +75,7 @@ icon: "plug-zap"
failproofai policies --install
```
- أو استهدف خوادم بأسماء ونطاق إعدادات:
+ أو استهدف أدوات تشغيل مسماة ونطاق إعدادات:
```bash
failproofai policies --install \
@@ -83,7 +83,7 @@ icon: "plug-zap"
--scope user
```
- يحتفظ نطاق المشروع بتكوين الخطاف مع مستودع. يغطي النطاق ذو المستخدم العمل عبر المستودعات. Claude Code يدعم أيضاً النطاق المحلي؛ يختلف الدعم حسب الخادم ويرفض CLI المجموعات غير المدعومة.
+ يحتفظ نطاق المشروع بتكوين الخطاف مع مستودع. يغطي نطاق المستخدم العمل عبر المستودعات. Claude Code يدعم أيضًا نطاق محلي؛ يختلف الدعم حسب أداة التشغيل و CLI يرفض المجموعات غير المدعومة.
تحقق من الجهاز وأحداثه:
@@ -95,16 +95,16 @@ icon: "plug-zap"
-## أضف مسار جلسة غير افتراضي
+## إضافة مسار جلسة غير افتراضي
- يتم تسجيل المسارات الإضافية على الجهاز، وليس في السحابة. بعد إضافة واحد، افتح **مراقبة → الجلسات**، وصفّي بيئة الجهاز، وأكد ظهور الجلسات من المسار الجديد. افتح جلسة وتحقق من الوكيل والخادم وطوابع زمن الحدث قبل الاعتماد عليها في تدقيق.
+ يتم تسجيل المسارات الإضافية على الجهاز وليس في السحابة. بعد إضافة واحد، افتح **ملاحظة → الجلسات**، صفي حسب بيئة الجهاز، وأكد أن الجلسات من المسار الجديد تظهر. افتح جلسة وتحقق من الوكيل ويتم أداة التشغيل وطوابع زمن الأحداث قبل الاعتماد عليها في التدقيق.
- 
+ 
- أضف مساراً مع تسمية اختيارية، ثم فتش المسارات المكونة:
+ أضف مسارًا بعلامة اختيارية ثم افحص المسارات المكونة:
```bash
failproofai harness add-path claude checkout=/srv/checkout/.claude
@@ -113,10 +113,10 @@ icon: "plug-zap"
failproofai backfill --since 7d
```
- أزل مساراً باستخدام `failproofai harness remove-path claude checkout`.
+ أزل مسارًا بـ `failproofai harness remove-path claude checkout`.
- قم بتشغيل جلسة واحدة جديدة بعد التثبيت. تحقق من دفق الأحداث المباشر وقرار سياسة فعلي قبل توسيع الطرح.
+ قم بتشغيل جلسة جديدة واحدة بعد التثبيت. تحقق من كل من تدفق الأحداث المباشر وقرار السياسة الفعلي قبل توسيع الطرح.
\ No newline at end of file
diff --git a/docs/ar/reference/overview.mdx b/docs/ar/reference/overview.mdx
index ecefd2f6a..aa9b5f2ab 100644
--- a/docs/ar/reference/overview.mdx
+++ b/docs/ar/reference/overview.mdx
@@ -1,61 +1,65 @@
---
+---
title: "التكاملات والمراجع"
-description: "قم بتوصيل أجهزة التشغيل المدعومة والمكتبات البرمجية وواجهات سطر الأوامر وواجهة HTTP API."
+description: "توصيل أجهزة عمل الوكلاء المدعومة و SDK و CLI و HTTP API."
icon: "braces"
---
اختر التكامل الأقرب إلى المكان الذي يعمل فيه وكيلك بالفعل.
-
- قم بتثبيت الخطافات لأجهزة التشغيل المدعومة لوكلاء الترميز والوكلاء المستقلين.
+
+ ثبّت الخطافات لأدوات سطر أوامر وكلاء الترميز والوكلاء المستقلين المدعومة.
+
+
+ أداة LangGraph و CrewAI و LlamaIndex و Pydantic AI أو وكيل مخصص.
-
- قم بتتبع الآثار لاكتشاف الأعطال في الوكلاء المخصصة، ثم اتصل بنا لإضافة الوقاية إلى وقت التشغيل الخاص بك.
+
+ التكوين وكتالوج الأحداث وقواعد الارتباط والتسليم.
- راجع المشاريع المحلية والجلسات ونشاط السياسة والتدقيق دون اتصال.
+ راجع المشاريع المحلية والجلسات ونشاط السياسة والتدقيق غير المتصل.
- قم بتكوين الالتقاط المحلي والخطافات والسياسات والتدقيق والتسليم وحالة الآلة.
+ كوّن الالتقاط المحلي والخطافات والسياسات والتدقيق والتسليم وحالة الجهاز.
- الاستعلام عن جلسات Cloud وإدارتها والتدقيق والمشاكل والتنبيهات والمفاتيح والمستخدمين والإعدادات.
+ الاستعلام عن جلسات Cloud والتدقيق والمشاكل والتنبيهات والمفاتيح والمستخدمين والإعدادات والإدارة.
- قيّم الجلسات المكتملة أو غير النشطة باستخدام خدمة FastAPI.
+ تقدير الجلسات المكتملة أو غير النشطة باستخدام خدمة FastAPI.
- قم بتأليف واختبار قرارات allow و instruct و deny خاصة بسير العمل.
+ قم بتأليف واختبار قرارات allow و instruct و deny خاصة بسير عمل محدد.
- نشر لوحة التحكم في Cloud على مجموعة Kubernetes التي يديرها العميل.
+ انشر مستوى التحكم في Cloud على مجموعة Kubernetes مدارة من قبل العميل.
-يغطي [مرجع HTTP API](/ar/reference/http-api) المُنشأ السطح العام `/v1`. تشرح الصفحات المكتوبة يدويًا سير العمل الذي يمتد عبر نقاط نهاية متعددة أو يستخدم واجهات إدارية خارج ذلك السطح العام.
+يغطي مرجع [HTTP API](/ar/reference/http-api) المُنتج سطح `/v1` العام. تشرح الصفحات المكتوبة يدويًا سير العمل الذي يمتد عبر عدة نقاط نهاية أو يستخدم واجهات إدارية خارج هذا السطح العام.
## توصيل وكيل والتحقق من البيانات
- 1. افتح **Administration → Keys**، وأنشئ مفتاحًا باستخدام `events:add` و `policies:pull`، وانسخ السر.
- 2. قم بتكوين التكامل باستخدام الصفحة المطابقة أعلاه.
- 3. افتح **Observe → Events** للتأكد من وصول الأحداث، ثم **Observe → Sessions** للتأكد من تشكيل عمليات تشغيل كاملة.
- 4. قم بالتصفية بناءً على بيئة التكامل وتفتيش جلسة واحدة للحصول على نموذج وأداة وخطأ وحقول السياسة التي يحتاجها التدقيق.
+ 1. افتح **الإدارة → المفاتيح**، أنشئ مفتاحًا باستخدام `events:add` و `policies:pull`، وانسخ السر.
+ 2. كوّن التكامل باستخدام الصفحة المطابقة أعلاه.
+ 3. افتح **المراقبة → الأحداث** للتأكد من وصول الأحداث، ثم **المراقبة → الجلسات** للتأكد من تكوينها لتشغيلات كاملة.
+ 4. صفّي حسب بيئة التكامل وفحّص جلسة واحدة للحصول على حقول النموذج والأداة والخطأ والسياسة اللازمة للتدقيق.
- ابدأ بدرج المفاتيح. تحدد المنح المحددة ما إذا كانت الآلة يمكنها إرسال الأحداث وتلقي السياسات التي تديرها Cloud.
+ ابدأ برج المفاتيح. تحدد المنح المحددة ما إذا كان بإمكان الجهاز إرسال الأحداث واستقبال السياسات المدارة من قبل Cloud.
- 
+ 
- بعد توصيل التكامل، استخدم قائمة الجلسات للتأكد من تجميع أحداثه في عمليات تشغيل كاملة في البيئة المتوقعة.
+ بعد توصيل التكامل، استخدم قائمة الجلسات للتأكد من أن أحداثها يتم تجميعها في عمليات تشغيل كاملة في البيئة المتوقعة.
- 
+ 
- افتح إحدى هذه الجلسات قبل اعتبار التكامل مكتملًا؛ يجب أن يحتوي الأثر على نموذج وأداة وخطأ وأدلة السياسة التي يحتاجها التدقيق الخاص بك.
+ افتح إحدى هذه الجلسات قبل اعتبار التكامل مكتملاً؛ يجب أن يحتوي التتبع على دليل النموذج والأداة والخطأ والسياسة الذي يحتاجه التدقيق.
- قم بإنشاء مفتاح آلة، وقم بتوصيل خادم Failproof، والتحقق من الجلسة الأولى.
+ أنشئ مفتاح جهاز، وصّل Failproof daemon، والتحقق من الجلسة الأولى.
```bash
fp keys create agent-production \
@@ -73,6 +77,6 @@ icon: "braces"
استخدم `fp --json sessions ...` عندما تستهلك أداة أخرى النتيجة. يجب أن تأتي الأعلام العامة مثل `--json` و `--org` و `--base-url` قبل الأمر.
- راجع [مرجع Failproof AI CLI](/ar/reference/failproof-cli) للأوامر المحلية و [مرجع Failproof Cloud CLI](/ar/reference/cloud-cli#cli-commands) لأوامر `fp`.
+ اطّلع على [مرجع Failproof AI CLI](/ar/reference/failproof-cli) للأوامر المحلية و [مرجع Failproof Cloud CLI](/ar/reference/cloud-cli#cli-commands) لأوامر `fp`.
\ No newline at end of file
diff --git a/docs/ar/reference/troubleshooting.mdx b/docs/ar/reference/troubleshooting.mdx
index 4c1a710c5..198bcf17b 100644
--- a/docs/ar/reference/troubleshooting.mdx
+++ b/docs/ar/reference/troubleshooting.mdx
@@ -1,17 +1,16 @@
---
----
title: "استكشاف الأخطاء"
-description: "تشخيص الجلسات المفقودة والسياسات المفقودة وفشل التسليم والإجراءات المحظورة للوكيل."
+description: "تشخيص الجلسات المفقودة والسياسات المفقودة والتسليم الفاشل والإجراءات المحجوبة للوكيل."
icon: "wrench"
---
-
+
- افتح **الإدارة → المفاتيح** وتأكد من أن مفتاح الجهاز نشط وعليه صلاحية `events:add`. ثم افتح **مراقبة → الأحداث**، وسّع نطاق الوقت، وامسح عوامل التصفية للبيئة والوكيل. إذا كانت هناك أحداث، ابحث عن معرّف الجلسة ثم تحقق من **مراقبة → الجلسات** للتجميع. إذا لم تكن هناك أحداث، قم بتشخيص daemon Failproof من سطر الأوامر.
+ افتح **Administration → Keys** وتأكد من أن مفتاح الجهاز نشط وله صلاحية `events:add`. ثم افتح **Observe → Events**، وسّع نطاق الوقت، وامسح عوامل تصفية البيئة والوكيل. إذا كانت هناك أحداث، ابحث عن معرّف الجلسة ثم تحقق من **Observe → Sessions** لتجميع البيانات. إذا لم تكن هناك أحداث، قم بتشخيص مستقبِل Failproof من سطر الأوامر.
- 
+ 
```bash
@@ -22,14 +21,14 @@ icon: "wrench"
fp sessions --since 24h --limit 20
```
- تأكد من تفعيل الالتقاط والمفتاح المُعد له صلاحية `events:add` وأن عامل التصفية في لوحة التحكم يطابق البيئة المُرسلة.
+ تأكد من تفعيل الالتقاط، وأن المفتاح المكوَّن له صلاحية `events:add`، وأن عامل تصفية لوحة التحكم يطابق البيئة المُرسلة.
- امسح عوامل التصفية في **مراقبة → الأحداث** وابحث عن معرّف جلسة SDK الدقيق. إذا لم يظهر شيء، افحص سبول SDK و daemon Failproof على جهاز المصدر.
+ امسح عوامل التصفية في **Observe → Events** وابحث عن معرّف جلسة SDK الدقيق. إذا لم يظهر شيء، افحص ملف الطبقة والمستقبِل Failproof على الجهاز المصدر.
```bash
@@ -37,14 +36,14 @@ icon: "wrench"
failproofai flush --wait
```
- تأكد من أن عملية الوكيل تضبط `AGENTEYE_SPOOL_TO_FAILPROOFAI=1` وأن `$FAILPROOFAI_HOME/custom-agents` أو `~/.failproofai/custom-agents` موجودة قبل بدء SDK.
+ تأكد من أن المستقبِل يعمل ومتصل — يقوم SDK بتخزين البيانات سواء كان متصلاً أم لا. لا يلزم أن يكون دليل الطبقة موجوداً مسبقاً (الكاتب ينشئه)، ولا يوجد متغير بيئة يختاره: `$FAILPROOFAI_HOME/custom-agents`، وإلا فهو `~/.failproofai/custom-agents`، هو الجذر الوحيد، و`configure(base_dir=...)` هو التجاوز الوحيد. إذا تم إيقاف العملية قسراً بـ `SIGKILL` أو قتلها بسبب نقص الذاكرة، فقد فُقد كل ما كان مصطفاً — تعامل مع `SIGTERM` لتحديد ذلك.
-
+
- افتح **الإدارة → الإنفاذ**، حدد الجهاز، وقارن إصداراته المعينة والمُبلغ عنها والسابقة. تأكد من أن نطاق النشر يشمل الجهاز وأن مفتاحه له صلاحية `policies:pull`. يمكن أن يعمل الالتقاط حتى عند عدم تسليم السياسة.
+ افتح **Admin → enforcement**، حدّد الجهاز، وقارن بين إصداراته المخصصة والمُبلغ عنها والسابقة. تأكد من أن نطاق النشر يتضمن الجهاز وأن مفتاحه له صلاحية `policies:pull`. يمكن أن يعمل الاستيعاب حتى عندما لا يعمل تسليم السياسة.
@@ -54,14 +53,14 @@ icon: "wrench"
failproofai config --status
```
- تأكد من تطابق معرّف الجهاز والعلامة مع هدف لوحة التحكم. أعد الاتصال باستخدام مفتاح قادر على السياسات إذا كان بيان الاعتماد الحالي يمنح الالتقاط فقط.
+ تأكد من أن معرّف الجهاز والعلامة يطابقان هدف لوحة التحكم. أعد الاتصال باستخدام مفتاح قادر على السياسة إذا كانت بيانات الاعتماد الموجودة تمنح فقط استيعاب الأحداث.
-
+
- افتح **الإدارة → الإنفاذ** وافحص آخر وقت ظهور الجهاز والإصدار المُبلغ عنه. إذا كان الجهاز قديماً، عامله كمشكلة daemon محلية. لا تضعف السياسة المنشورة فقط لتجاوز daemon غير متاح.
+ افتح **Admin → enforcement** وافحص آخر وقت رآه الجهاز والإصدار المُبلغ عنه. إذا كان الجهاز قديماً، تعامل مع هذا باعتباره مشكلة مستقبِل محلية. لا تُضعّف السياسة المنشورة فقط لتجاوز مستقبِل غير متاح.
@@ -72,18 +71,18 @@ icon: "wrench"
failproofai config --status
```
- أعد تشغيل أو حدّث `failproofaid`؛ أعد تشغيل التكوين عند اختلاف إصدارات بروتوكول CLI و daemon. مسار daemon المُعد يفشل بشكل مقفول بالتصميم.
+ أعد تشغيل أو حدّث `failproofaid`؛ أعد تشغيل التكوين عندما تختلف إصدارات بروتوكول CLI والمستقبِل. مسار المستقبِل المُكوَّن يفشل بالتصميم بشكل آمن.
- للسياسة المُنشأة في السحابة، افتح **الإدارة → محرر السياسات**، حدد المسودة، واستعرض أخطاء التحقق قبل النشر. للسياسة المحلية، استخدم CLI للتحقق منها، ثم افتح **مراقبة → السياسة** بعد إجراء اختبار لتأكيد وصول القرارات.
+ بالنسبة إلى السياسة المُنشأة في Cloud، افتح **Admin → policy editor**، حدّد المسودة، واستعرض أخطاء التحقق قبل النشر. بالنسبة إلى السياسة المحلية، استخدم CLI للتحقق منها، ثم افتح **Observe → policy** بعد إجراء اختبار لتأكيد وصول القرارات.
- تأكد من أن اسم الملف ينتهي بـ `policies.js` أو `policies.mjs` أو `policies.ts`، وأن الوحدة تستدعي `customPolicies.add(...)`، والـ imports تُحل من ملف السياسة.
+ تأكد من أن اسم الملف ينتهي بـ `policies.js` أو `policies.mjs` أو `policies.ts`، وأن الوحدة تستدعي `customPolicies.add(...)`، وأن الاستيرادات تُحل من ملف السياسة.
```bash
failproofai policies --install --custom ./checkout.policies.ts
@@ -92,14 +91,14 @@ icon: "wrench"
-
+
- افتح **تحليل → التدقيقات**، حدد التشغيل، وتحقق مما إذا تم تشغيل تحليل النموذج. ثم قارن نطاقه وإطاره الزمني مع **مراقبة → الجلسات** وافتح آثاراً تمثيلية من تلك المجموعة.
+ افتح **Analyze → audits**، حدّد المسار، وتحقق مما إذا كان تحليل النموذج قد تم تشغيله. ثم قارن نطاقه والنافذة الزمنية مع **Observe → sessions** وافتح الآثار الممثلة من تلك المجموعة.
- النتيجة الصفر ذات معنى فقط عند نجاح التحليل. إذا تم تخطي التحليل أو فشل، ينتج التشغيل بلا نتائج ويُبقي النافذة غير المحللة مفتوحة للتشغيل الناجح المستقبلي. إذا تم تعطيل تحليل النموذج، ينتج التدقيق أيضاً بلا نتائج لأن المسح الحتمي للبيانات الاعتماديّة والشخصية يسجل الإحصائيات فقط لكن لا يرفع بعد الآن النتائج.
+ النتيجة الصفرية لها معنى فقط عندما يتم تشغيل التحليل بنجاح. إذا تم تخطي التحليل أو فشل، ينتج المسار بدون نتائج ويُبقي النافذة التي لم يتم تحليلها مفتوحة لمسار ناجح في المستقبل. إذا تم تعطيل تحليل النموذج، ينتج التدقيق أيضاً بدون نتائج لأن مسح بيانات الاعتماد والمعلومات الشخصية المحدد يسجل الإحصائيات ولم يعد يرفع نتائج.
- 
+ 
```bash
@@ -111,31 +110,31 @@ icon: "wrench"
fp audits findings --audit
```
- إذا بقي التشغيل في طابور الانتظار، انتظر قدرة audit-agent أو اطلب من مشغل النشر فحص أسطول التدقيق. التدقيق في الطابور يُعاد محاولته؛ لا يتم تخطيه فوراً.
+ إذا بقي المسار في الانتظار، انتظر سعة وكيل التدقيق أو اطلب من مشغّل النشر فحص أسطول التدقيق. يُعيد محاولة التدقيق المصطف؛ لا يتم تخطيه على الفور.
-
+
- افتح جلسة مكتملة وتحقق مما إذا كان التقييم اليدوي ناجحاً. السحابة المستضافة حالياً لا تحتوي على تحكم في نقطة نهاية المُقيّم في لوحة التحكم؛ يجب على مشغل الخادم تكوينها.
+ افتح جلسة مكتملة وتحقق مما إذا كان التقييم اليدوي ناجحاً. الـ Cloud الموجه حالياً لا يحتوي على تحكم نقطة نهاية المُقيّم في لوحة التحكم؛ يجب على مشغّل الخادم تكوينها.
- تحقق من المُقيّم نفسه، ثم افحص حالات التقييم الحديثة:
+ تحقق من المُقيّم نفسه، ثم افحص حالات التقييم الأخيرة:
```bash
curl https://evaluator.example.com/health
fp evals --since 1h
```
- على السحابة ذاتية الاستضافة، تأكد من وجود `EVALUATOR_ENDPOINT` على الخادم و`EVALUATOR_TOKEN` يطابق المُقيّم. يتم تعطيل التقييم التلقائي عند عدم وجود نقطة النهاية.
+ على Cloud ذاتي الاستضافة، تأكد من وجود `EVALUATOR_ENDPOINT` على الخادم وتطابق `EVALUATOR_TOKEN` للمُقيّم. يتم تعطيل التقييم التلقائي عندما تكون النقطة النهائية غائبة.
- استخدم مبدّل المنظمة وتأكد من الاختصار والصلاحيات المتوقعة قبل مقارنة النتائج مع CLI.
+ استخدم محول المنظمة وأكد على الاسم المختصر والصلاحيات المتوقعة قبل مقارنة النتائج مع CLI.
```bash
@@ -144,18 +143,18 @@ icon: "wrench"
fp orgs perms
```
- في وضع مفتاح API، حدد `fp --org --api-key ...` أو اضبط `AGENTEYE_ORG`. حالة منظمة جلسة الإنسان المحفوظة يتم تجاهلها بشكل مقصود لطلبات مفتاح API.
+ في وضع مفتاح API، حدّد `fp --org --api-key ...` أو اضبط `AGENTEYE_ORG`. حالة منظمة جلسة الإنسان المحفوظة يتم تجاهلها عن قصد لطلبات مفتاح API.
-
+
- افتح **مراقبة → السياسة**، احفظ القرار والجلسة المرتبطة، وحدد حالة الموجب الخاطئ. ثم افتح **الإدارة → الإنفاذ** وأرجع الأجهزة المتضررة إلى الإصدار السابق. أنشئ إصداراً أضيق في **محرر السياسات**، اختبره على نطاق صغير، وتوسع فقط بعد نجاح العمل الصحيح.
+ افتح **Observe → policy**، احفظ القرار والجلسة المرتبطة، وحدّد شرط الإيجابية الكاذبة. ثم افتح **Admin → enforcement** وأرجع الأجهزة المتأثرة إلى الإصدار السابق. أنشئ نسخة أكثر دقة في **Policy editor**، اختبرها على نطاق صغير، وسّع فقط بعد نجاح العمل الصحيح.
- استرجاع نشر السحابة للإصدار السابق هو dashboard فقط. إيقاف جلسة محلية لا يعطل السياسات المُدارة بالسحابة. إذا كانت لوحة التحكم غير متاحة، التقط حالة الجهاز والنشر واستعد وصول لوحة التحكم بدلاً من إعادة محاولة الإجراء المحظور بشكل متكرر.
+ استرجاع نشر Cloud متاح فقط من لوحة التحكم. إيقاف جلسة محلية لا يعطّل السياسات المُدارة من Cloud. إذا كانت لوحة التحكم غير متاحة، احفظ حالة الجهاز والنشر وأعِد الوصول إلى لوحة التحكم بدلاً من إعادة محاولة الإجراء المحجوب بشكل متكرر.
```bash
failproofai config --status
@@ -165,4 +164,4 @@ icon: "wrench"
-عند الاتصال بالدعم، أرفق إصدار CLI والأداة والبيئة ومعرّف الجلسة أو النشر ذي الصلة ومخرجات `failproofai config --status` مع حذف الأسرار.
\ No newline at end of file
+عند الاتصال بالدعم، أدرج إصدار CLI والأداة والبيئة ومعرّف الجلسة أو النشر ذي الصلة وناتج `failproofai config --status` مع إزالة الأسرار.
\ No newline at end of file
diff --git a/docs/ar/sessions/live-events.mdx b/docs/ar/sessions/live-events.mdx
index 807f8ea44..28e467d9a 100644
--- a/docs/ar/sessions/live-events.mdx
+++ b/docs/ar/sessions/live-events.mdx
@@ -1,11 +1,11 @@
---
---
title: "الأحداث المباشرة"
-description: "شاهد نشاط الوكيل يصل أثناء تشغيل الجلسة."
+description: "راقب نشاط الوكيل وهو يصل أثناء تشغيل الجلسة."
icon: "radio"
---
-تساعدك الأحداث المباشرة على تأكيد الأداة المساعدة ومراقبة عملية محفوفة بالمخاطر دون انتظار انتهاء الجلسة.
+تساعدك الأحداث المباشرة على تأكيد التنسيق ومراقبة التشغيل المحفوف بالمخاطر دون انتظار انتهاء الجلسة.
## مراقبة النشاط
@@ -13,10 +13,10 @@ icon: "radio"
1. انتقل إلى **Observe → Events**.
2. ابدأ بنطاق الوقت الحالي وبدون مرشحات لتأكيد وصول البيانات.
- 3. صفّي حسب البيئة أو نوع الحدث أو الوكيل أو الجلسة. استخدم البحث لنص الحمولة.
- 4. اختر حدثاً لفحص ملخصه والتفاصيل. اتبع رابط الجلسة للحصول على التتبع الكامل.
+ 3. قم بتصفية حسب البيئة أو نوع الحدث أو الوكيل أو الجلسة. استخدم البحث لنصوص الحمول.
+ 4. حدد حدثاً لفحص ملخصه والتفاصيل. اتبع رابط الجلسة للحصول على التتبع الكامل.
- 
+ 
```bash
@@ -25,22 +25,22 @@ icon: "radio"
fp --json events --full --session-id --all
```
- يحذف العرض الافتراضي الحمولات الخام. استخدم `--full` فقط للتحقيق في جلسة محدودة.
+ يتجاهل الخلاصة الافتراضية الحمول الخام. استخدم `--full` فقط للتحقيق في جلسة محدودة.
-استخدم تيار الأحداث للإجابة على ثلاثة أسئلة فورية:
+استخدم دفق الأحداث للإجابة على ثلاثة أسئلة فورية:
-- هل الوكيل المتوقع يبلّغ عن البيئة الصحيحة؟
-- هل تصل استدعاءات النموذج واستدعاءات الأداة وقرارات السياسة بالترتيب الصحيح؟
-- هل توقفت الجلسة عن إحراز تقدم أم بدأت في تكرار إجراء ما؟
+- هل يقدم الوكيل المتوقع التقارير إلى البيئة الصحيحة؟
+- هل وصلت استدعاءات النموذج واستدعاءات الأداة وقرارات السياسة بالترتيب؟
+- هل توقفت الجلسة عن إحراز تقدم أم بدأت تكرار إجراء؟
-تتضمن أنواع الأحداث أحداث دورة حياة الوكيل وطلبات واستجابات النموذج واستخدام الأداة والنتائج وتنفيذ الخطاف والانتظارات البشرية والمقاطعات والأخطاء الصريحة. تجمع معرّفات الارتباط بين الأحداث المقترنة مثل استدعاء الأداة ونتيجتها.
+تشمل أنواع الأحداث أحداث دورة حياة الوكيل وطلبات واستجابات النموذج واستخدام الأداة والنتائج وتنفيذ الخطاف والانتظار البشري والمقاطعات والأخطاء الصريحة. تربط معرفات الارتباط الأحداث المقترنة مثل استدعاء الأداة ونتيجتها.
- احتفظ بالعرض المباشر واسعاً أثناء التحقق من تكامل جديد. أضف مرشحات فقط بعد رؤية الحدث الأول؛ يمكن لمرشح غير صحيح أن يبدو وكأنه فشل في الاستقبال.
+ حافظ على العرض المباشر واسعاً أثناء التحقق من تكامل جديد. أضف المرشحات فقط بعد رؤية الحدث الأول؛ يمكن أن يبدو المرشح غير الصحيح وكأنه فشل في البث.
-إذا لم تظهر أحداث، قم بتشغيل `failproofai config --status`، ثم [استكشف أخطاء الاستقبال](/ar/reference/troubleshooting).
+إذا لم تظهر أي أحداث، قم بتشغيل `failproofai config --status`، ثم [استكشف أخطاء البث](/ar/reference/troubleshooting).
-الوكلاء الذين لا يعملون في أحد الـ 12 [الأطر العمل](/ar/reference/harnesses) المدعومة يبلّغون عن نفس أنواع الأحداث من خلال [Python SDK](/ar/reference/custom-agents)، بما في ذلك أحداث التفاعل البشري (`human_wait` و `human_input` و `human_interrupt`) التي تعتمد عليها وكلاء البوابة والإنتاج.
\ No newline at end of file
+الوكلاء الذين لا يعملون في أحد [الأطر](/ar/reference/harnesses) الـ 12 المدعومة يقدمون نفس أنواع الأحداث من خلال [Python SDK](/ar/reference/custom-agents)، بما في ذلك أحداث التفاعل البشري (`human_wait`، `human_input`، `human_interrupt`) التي تعتمد عليها الوكلاء الموجودون في البوابة والإنتاج.
\ No newline at end of file
diff --git a/docs/ar/start/first-policy.mdx b/docs/ar/start/first-policy.mdx
index 867e24d60..b3eb9bca4 100644
--- a/docs/ar/start/first-policy.mdx
+++ b/docs/ar/start/first-policy.mdx
@@ -1,34 +1,34 @@
---
---
title: "منع فشلك الأول باستخدام سياسة"
-description: "أنشئ نسخة سياسة، ونشرها في وضع المراقبة، ثم فعّلها."
+description: "قم بتأليف نسخة من السياسة، ونشرها في وضع المراقبة، ثم فرضها."
icon: "shield-check"
---
استخدم السياسة فقط بعد أن تتمكن من وصف الإجراء غير الآمن والإجراءات المشروعة التي يجب أن تبقى مسموحة.
-
+
-
- انتقل إلى **المسؤول → محرر السياسة**. ابدأ بسياسة العرض التوضيحي، واستعرض أو عدّل مصدرها، ثم اختر **نشر النسخة**. يُنشئ النشر النسخة الثابتة التي يمكنك نشرها على الأجهزة.
+
+ انتقل إلى **Admin → policy editor**. ابدأ بسياسة العرض التوضيحي، وراجع أو عدّل المصدر الخاص بها، ثم حدد **publish version**. ينشئ النشر النسخة غير القابلة للتغيير التي يمكنك نشرها على الأجهزة.
- 
+ 
- انتقل إلى **المسؤول → الإنفاذ**، وقم بتوسيع الجهاز المستهدف، واختر **تعديل هذا الجهاز**. أضف سياسة العرض التوضيحي المنشورة، وثبّت نسختها، واختر **مراقبة**، ثم طبّق النشر.
+ انتقل إلى **Admin → enforcement**، وقم بتوسيع الجهاز المستهدف، وحدد **edit this machine**. أضف سياسة العرض التوضيحي المنشورة، وثبّت نسختها، واختر **observe**، ثم طبّق النشر.

-
- قم بتشغيل جلسة وكيل جديدة على هذا الجهاز، ثم افتح **المراقبة → السياسة**. حدد الجهاز وأكّد أن سياسة العرض التوضيحي تظهر في تعيين السياسة وجدول القرارات. يسجّل وضع المراقبة ما ستفعله السياسة دون حجب الإجراء.
+
+ قم بتشغيل جلسة وكيل جديدة على هذا الجهاز، ثم افتح **Observe → policy**. حدد الجهاز وتأكد من ظهور سياسة العرض التوضيحي في تعيين السياسة وجدول أحداث القرار. يسجل وضع المراقبة ما ستفعله السياسة دون حجب الإجراء.
- 
+ 
-
- تأليف السياسة السحابية ونشر الأسطول هما سير عمل إدارية. استخدم واجهة سطر الأوامر المحلية للتحقق من صحة نفس السياسة قبل نشرها:
+
+ تأليف سياسات السحابة ونشر الأسطول هي سير عمل إدارية. استخدم واجهة سطر الأوامر المحلية للتحقق من نفس السياسة قبل نشرها:
```bash
failproofai policies --install --custom ./payment-retry.policies.ts \
@@ -36,13 +36,13 @@ icon: "shield-check"
failproofai config --status
```
- استخدم `fp` للتفتيش عن قرارات السياسة المرئية للسحابة:
+ استخدم `fp` للتحقق من قرارات السياسة المرئية من السحابة:
```bash
fp events --event-type hook_completed --env production --since 24h
fp sessions --env production --since 24h
```
- لا تكشف واجهة سطر أوامر السحابة عن مسارات نشر الإنفاذ التي يقتصر الوصول إليها على المسؤول. انشر النسخ من **المسؤول → محرر السياسة** وانشرها من **المسؤول → الإنفاذ**.
+ كلتا الخطوتين متاحتان أيضًا من واجهة سطر الأوامر: `fp policies publish ` تنشئ نسخة و `fp fleet deploy --add ` توضعها على جهاز. المعادلات على لوحة التحكم هي **Admin → policy editor** و **Admin → enforcement**.
\ No newline at end of file
diff --git a/docs/ar/start/integrations.mdx b/docs/ar/start/integrations.mdx
new file mode 100644
index 000000000..b789e01c5
--- /dev/null
+++ b/docs/ar/start/integrations.mdx
@@ -0,0 +1,120 @@
+---
+title: "الاستخدام الكامل لعاملك"
+sidebarTitle: "الأطر"
+description: "قم بتوصيل أي إطار عمل مدعوم للعامل مع Failproof AI باستدعاء واحد."
+icon: "plug"
+---
+
+عاملك ينتج بالفعل كل ما يستحق التسجيل — استدعاءات النموذج، استدعاءات الأدوات، حدود العقد، انتظارات العاملين، الأخطاء. الإطار يتخلص منها. SDK يحتفظ بها.
+
+
+
+ عامل كتبته بنفسك، أو واحد غير مدرج هنا.
+
+
+ الرسوم البيانية، العقد، الأدوات، أدوات المسترجعات، النماذج.
+
+
+ الطواقم، التدفقات، العوامل حسب الدور، الأدوات.
+
+
+ سير العمل، الخطوات، عوامل الدوال، أدوات المسترجعات.
+
+
+ عوامل مكتوبة، القدرات، الأدوات، المحاولات الجديدة.
+
+
+
+## ثلاثة أسطر، أي إطار عمل كان
+
+
+```bash LangGraph
+pip install 'failproofai-sdk[langgraph]'
+```
+
+```bash CrewAI
+pip install 'failproofai-sdk[crewai]'
+```
+
+```bash LlamaIndex
+pip install 'failproofai-sdk[llamaindex]'
+```
+
+```bash Pydantic AI
+pip install 'failproofai-sdk[pydantic-ai]'
+```
+
+```bash Custom agents
+pip install failproofai-sdk
+```
+
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument() # detects the frameworks you imported
+
+with failproofai_sdk.session():
+ ... # your existing agent call, unchanged
+```
+
+لا توجد مزخرفات على وظائفك، لا رد نداء يتم تمريره لاستدعاءاتك، لا معرفات يتم خيطها عبر الكود. فقط الاستدعاء داخل الجلسة يختلف:
+
+
+
+ ```python
+ graph.invoke({"messages": [HumanMessage("...")]})
+ ```
+
+
+ ```python
+ Crew(agents=[analyst, writer], tasks=[gather, summarise]).kickoff()
+ ```
+
+
+ ```python
+ await agent.run("...") # under `async with failproofai_sdk.session():`
+ ```
+
+
+ ```python
+ agent.run_sync("...")
+ ```
+
+
+ ```python
+ with failproofai_sdk.agent("planner"):
+ with failproofai_sdk.tool_call("search", input={"q": q}) as t:
+ t.output = search(q)
+ ```
+
+
+
+التثبيت الإضافي يثبت **الإطار**. كل محول يأتي في عجلة النقل الأساسية، لذلك المشروع الذي يمتلك بالفعل إطار العمل لا يحتاج إلى أي شيء إضافي على الإطلاق.
+
+## تحقق من وصوله
+
+قم بتشغيل جلسة واحدة مزودة بالأدوات، ثم افتح **Observe → Sessions** وحدد بيئتك. يظهر التشغيل كتتبع معاد الإنشاء.
+
+إذا لم يصل شيء، تأكد من اتصال الجهاز باستخدام `failproofai config --status`. انظر [إعداد المراقبة](/ar/start/setup).
+
+
+ لا تتحقق من دليل الاسطوانة لتأكيد التسليم. يجمع مجند Failproof كل دفعة ويحذفها في غضون ميلي ثانية، لذا يسبق القارئ الجامع ويظهر أحداثًا أقل بكثير من تلك المنبعثة.
+
+
+## التالي
+
+كل سريع بدء أعلاه يرتبط بدليله الكامل — ما يتم تسجيله، والخيارات، والبث، وتسمية النطاق، والمشاكل التي يواجهها الناس بالفعل. يعيشون تحت **Trace Agents → Plug in your agent**.
+
+
+
+ نموذج البيانات، المعرفات، أنواع الأحداث، وكيف تصل الأحداث إلى السحابة.
+
+
+ اتبع السببية عبر جلسة بدلاً من السجلات المنفصلة.
+
+
+ قم بمراجعة الجلسات التي التقطتها للتو.
+
+
\ No newline at end of file
diff --git a/docs/ar/start/integrations/crewai.mdx b/docs/ar/start/integrations/crewai.mdx
new file mode 100644
index 000000000..16861f7bf
--- /dev/null
+++ b/docs/ar/start/integrations/crewai.mdx
@@ -0,0 +1,225 @@
+---
+---
+title: "CrewAI"
+sidebarTitle: "CrewAI"
+description: "تجهيز الفرق والتدفقات والوكلاء حسب الدور والأدوات والذاكرة وردود الفعل البشرية."
+icon: "/images/frameworks/crewai.svg"
+---
+
+## التثبيت
+
+```bash
+pip install 'failproofai-sdk[crewai]'
+```
+
+الإصدارات المدعومة: `crewai` من 1.13 إلى 2.0. الإصدار 1.13 هو الذي أضاف `started_event_id` وعادّ استخدام الرموز، وكلاهما يعتمد عليه المحول لربط الأحداث والإبلاغ عن الرموز.
+
+## التجهيز
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+with failproofai_sdk.session():
+ Crew(agents=[analyst, writer], tasks=[gather, summarise]).kickoff()
+```
+
+يسجل `instrument()` مستمعًا على ناقل الأحداث على مستوى الوحدة في CrewAI ويشترك في معالج واحد لكل فئة حدث. لا يتغير شيء حول فريقك أو الوكلاء أو المهام أو الأدوات.
+
+## ما يتم تسجيله
+
+| CrewAI | حدث Failproof |
+| --- | --- |
+| بدء Crew | `agent_start`, `agent_end` |
+| `Agent.kickoff()` (وكيل خفيف بدون فريق) | `agent_start`, `agent_end`، مع `agent_id` من الدور |
+| بدء وإنهاء التدفق | `agent_start`, `agent_end`؛ يتم تداخل فريق تم بدؤه داخل طريقة التدفق تحته |
+| تنفيذ الوكيل | `agent_start`, `agent_end` متداخل، مع `agent_id` من الدور. تحت عملية هرمية يتم تداخل الزميل المفوّض تحت المدير وليس بجانبه |
+| المهمة | لا شيء؛ يتم تسجيله كرابط بحيث تنحل الأطفال للفريق |
+| طريقة التدفق والحماية | `hook_triggered`, `hook_completed` |
+| استخدام الأداة | `tool_use`, `tool_result` |
+| عمليات الذاكرة والمعرفة | `tool_use`, `tool_result`، مسمى للسطح المصاب |
+| استدعاء LLM | `model_request`, `model_response`، مع استخدام الرموز |
+| جزء البث | مدمج في الاستجابة كعدد الأجزاء والوقت للرمز الأول |
+| طلب ردود فعل بشرية | `human_wait`, `agent_pause` |
+| استقبال ردود فعل بشرية | `agent_resume`, `human_input` |
+| خطأ تنفيذ الوكيل | `error`، ثم `agent_end` مع نتيجة `failed` |
+
+المهمة لا تصدر شيئًا بقصد. مهمة CrewAI هي مجموعة فرعية من تنفيذ الوكيل الذي يشغلها، لذا فإن إصدار كليهما سيضاعف كل صف ويجعلها تبدو كأخوات. بدلاً من ذلك، يتم نقل معرف المهمة واسمها على أحداث الوكيل نفسه.
+
+يتم تسجيل عمليات الذاكرة والمعرفة كأدوات، مسماة للسطح الذي يصيبونه، بحيث تظهر بجانب أدواتك الحقيقية حيث يمكنك مقارنة زمن استجابتها.
+
+في الفريق الهرمي، التداخل هو الذي يجعل التتبع قابلاً للقراءة:
+
+```text
+crew
+└─ manager
+ ├─ researcher delegated
+ └─ writer delegated
+```
+
+يربط CrewAI التنفيذ المفوّض على حدث أداة **`delegate_work_to_coworker`** وليس على المدير مباشرة، لذا يتبع المحول هذا الرابط. بدونه، كل وكيل يخرج كأخ لكل وكيل آخر وتضيع هيكل التفويض.
+
+## مثال
+
+```python
+import failproofai_sdk
+from crewai import Agent, Crew, Process, Task
+from crewai.tools import tool
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+MODEL = "openai/gpt-4o-mini"
+METRICS = {"revenue": "$4.2M ARR, up 12% QoQ", "churn": "3.1% monthly, up from 2.4%"}
+
+
+@tool("lookup_metric")
+def lookup_metric(name: str) -> str:
+ """Look up a business metric by name. Valid: revenue, churn."""
+ return METRICS.get(name.lower().strip(), "unknown metric")
+
+
+analyst = Agent(
+ role="analyst", # becomes agent_id
+ goal="pull the numbers that matter and state them plainly",
+ backstory="You read dashboards for a living.",
+ tools=[lookup_metric],
+ llm=MODEL,
+)
+writer = Agent(
+ role="writer",
+ goal="turn numbers into three lines an exec will read",
+ backstory="You write board updates. You never pad.",
+ llm=MODEL,
+)
+
+gather = Task(
+ description="Look up 'revenue' and 'churn' with the tool.",
+ expected_output="Two lines, one metric each.",
+ agent=analyst,
+)
+summarise = Task(
+ description="Using the metrics above, write a three-line exec summary.",
+ expected_output="Exactly three lines.",
+ agent=writer,
+ context=[gather],
+)
+
+with failproofai_sdk.session():
+ result = Crew(
+ agents=[analyst, writer],
+ tasks=[gather, summarise],
+ process=Process.sequential,
+ ).kickoff()
+```
+
+المرحلة الانتقالية مرئية في التتبع: يغلق امتداد `analyst`، ويفتح امتداد `writer`، وكلاهما يقع داخل امتداد `crew` واحد.
+
+## قم بتسمية امتدادات الشبكة الخاصة بك
+
+يأتي `agent_id` من `Agent(role=...)`، وهذا هو ما يجعله وجهة نظر لوحة معلومات قابلة للقراءة.
+
+```python
+Agent(role="analyst", ...) # agent_id = "analyst"
+Agent(role="analyst-7f3a2b", ...) # one facet entry per run
+```
+
+`agent_id` هي عمود منخفض الأساسية. الدور الذي يحتوي على معرف التشغيل أو الطابع الزمني يقلل منه لكل استعلام يشغله أي شخص. إذا بدا الدور كمعرف، فإن المحول يرفضه ويضع القيمة الحقيقية في حقل الحمولة بدلاً من ذلك.
+
+## التحكم في الجلسة
+
+تم حلها بهذا الترتيب، أول تطابق يفوز:
+
+1. `instrument("crewai", session_id=...)`
+2. نطاق `failproofai_sdk.session()` المغلف
+3. معرف `uuid4().hex` تم إنشاؤه، مرة واحدة لكل فريق أو تدفق
+
+لف البدء للتحكم فيه لكل تشغيل:
+
+```python
+with failproofai_sdk.session(f"support-{ticket_id}"):
+ Crew(agents=[...], tasks=[...]).kickoff()
+```
+
+## الخيارات
+
+```python
+failproofai_sdk.instrument(
+ "crewai",
+ session_id=None, # pin every run to one session id
+)
+```
+
+`session_id` هو الخيار الوحيد الذي يقرأه هذا المحول. يتم تسجيل الطلبات والإكمالات دائمًا، مع القطع إلى ميزانية الحمولة.
+
+## البشر في الحلقة
+
+يحتوي CrewAI على **سطحين** من أسطح البشر في الحلقة، وكلاهما يتم تسجيله نفس الأحداث الأربعة.
+
+يمر `@human_feedback` على طريقة التدفق عبر ناقل أحداث CrewAI: يصدر وقت التشغيل حدثًا قبل انسداده على شخص وآخر بعد الإجابة.
+
+لا يفعل `Task(human_input=True)`. يستدعي `input()` داخل مزود الإدخال الخاص بـ CrewAI ولا يصدر أي حدث من أي نوع، لذا يلف المحول مزود الإدخال هذا مباشرة — بدونه كانت انتظار الإنسان بأكمله غير مرئي وتم محاسبته كوقت وكيل نشط.
+
+بأي طريقة تحصل على:
+
+```text
+human_wait the prompt and its options
+agent_pause starts the paused-time clock
+agent_resume stops it
+human_input the answer, with the wait measured
+```
+
+`agent_pause` إلى `agent_resume` هو الزوج الوحيد الذي يطعم الوقت المتوقف. بدونه، ينتظر الإنسان لمدة عشر دقائق يتم محاسبته كعشر دقائق من وقت الوكيل النشط.
+
+
+ لا يقوم CrewAI بتعيين معرف ارتباط على حدث ردود الفعل البشرية، لذا يقرن المحول بينهما على اسم التدفق والطريقة، مع العودة إلى آخر توقف تم فتحه. هذا صحيح لأن موجه وحدة التحكم ينسد. إذا قمت ببناء مزود ردود فعل متزامن، فقم بتعيين `request_id` على كلا الحدثين.
+
+
+
+ نظرًا لأن مسار `Task(human_input=True)` هو غلاف حول مزود إدخال CrewAI بدلاً من اشتراك في الأحداث، يتم استعادته على `uninstrument()` وإعادة رفع ما يرفعه `input()`، بما في ذلك `KeyboardInterrupt` بدون تغيير.
+
+
+## المشاكل الشائعة
+
+
+
+ يحتوي `role` على معرف UUID أو طابع زمني أو لاحقة لكل تشغيل. استخدم دورًا بشريًا مستقرًا وضع معرف التشغيل المحدد في وصف المهمة بدلاً من ذلك.
+
+
+
+ ناقل الأحداث غير متزامن، و `kickoff()` يعود قبل تشغيل آخر المعالجات. استنزف أولاً:
+
+ ```python
+ from crewai.events.event_bus import crewai_event_bus
+
+ crew.kickoff()
+ crewai_event_bus.flush(timeout=30)
+ ```
+
+ هذه خاصية CrewAI وليست خاصية SDK.
+
+
+
+ يفرض `agent_end` إغلاق التوقفات المفتوحة ولكن ليس الأدوات أو النماذج، لذا فإن التشغيل الذي يموت داخل استدعاء أداة يترك هذا الامتداد مفتوحًا. يغلق الهدم الطبيعي أي شيء لا يزال مفتوحًا ويضع علامة عليه كناقص. فقط `SIGKILL` يتركها معلقة، لأنه لا يمكن لأحد أن يركض.
+
+
+
+ تحقق بهذا الترتيب: `instrument()` يركض قبل `kickoff()`؛ هناك `with failproofai_sdk.session():` حوله؛ `crewai` هو 1.13 أو أحدث؛ تم تعيين `FAILPROOFAI_SDK_STRICT=1`، بحيث يرفع Hook المتدهور بدلاً من الابتلاع.
+
+
+
+## التالي
+
+
+
+ الأزواج والمعرفات ودورة حياة الجلسة والتسليم.
+
+
+ اتبع السببية عبر الجلسة التي التقطتها للتو.
+
+
+ LangGraph و LlamaIndex و Pydantic AI والوكلاء المخصصين.
+
+
\ No newline at end of file
diff --git a/docs/ar/start/integrations/custom-agents.mdx b/docs/ar/start/integrations/custom-agents.mdx
new file mode 100644
index 000000000..6e5db3c23
--- /dev/null
+++ b/docs/ar/start/integrations/custom-agents.mdx
@@ -0,0 +1,737 @@
+---
+title: "الوكلاء المخصصون"
+sidebarTitle: "الوكلاء المخصصون"
+description: "أدرج وكيلاً كتبته بنفسك، أو إطار عمل لا يوجد له محول في Failproof AI."
+icon: "code"
+---
+
+لوكيل كتبته بنفسك، أو إطار عمل لا يوجد له محول في Failproof AI. لا شيء يجب إدراجه: أنت تصدر الأحداث.
+
+هذا هو نفس API الذي يستدعيه محولات الأطر الأربعة. وهي جداول ترجمة فوقه.
+
+## التثبيت
+
+```bash
+pip install failproofai-sdk
+```
+
+بدون إضافات، وبدون تبعيات.
+
+## الإدراج
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+
+with failproofai_sdk.session(): # one run
+ with failproofai_sdk.agent("planner"): # one unit of work
+ with failproofai_sdk.tool_call("search", input={"q": q}) as t:
+ t.output = search(q) # one tool call
+```
+
+اقرأه من الأعلى إلى الأسفل وسيخبرك بما يعنيه:
+
+| غلف فيه | للقول |
+| --- | --- |
+| `session()` | هذه الأحداث تنتمي إلى نفس التشغيل |
+| `agent()` | شيء ما يقوم بالعمل — أعطه اسماً ستتعرف عليه في القائمة |
+| `tool_call()` | هذه أداة واحدة، وإليك ما أرجعته |
+
+وما يصدره كل واحد فعلياً:
+
+| النطاق | يصدر | الغرض |
+| --- | --- | --- |
+| `session()` | لا شيء | يربط معرف الجلسة، مجموعة تشغيل واحدة |
+| `agent()` | `agent_start`, `agent_end` | يحيط بوحدة عمل واحدة |
+| `tool_call()` | `tool_use`, `tool_result` | يحيط بأداة واحدة ويقيسها |
+
+كل شيء بالداخل يمكن أن يحذف `session_id` و `agent_id`. تربط النطاقات الهوية على متغيرات السياق وكل نداء حدث يقرأها مرة أخرى، لذلك لا تمرر أبداً المعرفات من خلال وظائفك.
+
+تعمل الثلاثة جميعاً مع `async with` وكذلك مع `with`.
+
+يبني التداخل للوكلاء الشجرة. يتم حساب `parent_id` والعمق من المكدس:
+
+```python
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("supervisor"):
+ with failproofai_sdk.agent("researcher"): # parent_id = "supervisor"
+ ...
+```
+
+## كيف يغلق النطاق
+
+`agent()` يتعامل مع الاستثناءات لك:
+
+| ما حدث | الأحداث | النتيجة |
+| --- | --- | --- |
+| لم يحدث شيء | `agent_end` | `success` |
+| `Exception` | `error`، ثم `agent_end` | `failed` |
+| `KeyboardInterrupt`, `SystemExit` | `error`، ثم `agent_end` | `failed` |
+| `CancelledError`, `GeneratorExit` | `agent_end` فقط | `cancelled` |
+
+يتم إصدار الخطأ قبل `agent_end`، لأن لوحة التحكم تغلق الامتداد في `agent_end` وأي شيء بعده يُنسب إلى لا شيء. الإلغاء ليس فشلاً، لذلك لا تلوث التشغيلات الملغاة سطح الأخطاء. يتم إعادة رفع الاستثناء دائماً: النطاق لا يبتلعه أبداً.
+
+## طرق الحدث
+
+خمسة عشر طريقة في ست عائلات. معظمها يأتي في أزواج — تصدر الفاتحة، ثم الأغلق، و SDK يقيس الامتداد بينهما.
+
+| العائلة | فتح | إغلاق | مستقل |
+| --- | --- | --- | --- |
+| **الوكلاء** | `agent_start` | `agent_end` | — |
+| | `agent_pause` | `agent_resume` | — |
+| **النماذج** | `model_request` | `model_response` | — |
+| **الأدوات** | `tool_use` | `tool_result` | — |
+| **الخطافات** | `hook_triggered` | `hook_completed` | — |
+| **البشر** | `human_wait` | `human_input` | `human_pause`, `human_interrupt` |
+| **الأعطال** | — | — | `error` |
+
+
+ فضّل النطاقات — `agent()` و `tool_call()` — أينما كانت مناسبة. إنها تضمن حدث الإغلاق حتى عندما يرفع الجسم. تصل إلى هذه الطرق مباشرة عندما لا يتداخل تدفق التحكم، مثل نداء نموذج داخل مساعد.
+
+
+
+```python الوكلاء
+failproofai_sdk.event.agent_start(agent_id="planner", goal="find the cheapest flight")
+failproofai_sdk.event.agent_end(agent_id="planner", outcome="success", summary="...")
+failproofai_sdk.event.agent_pause(pause_id="p1", reason="awaiting approval")
+failproofai_sdk.event.agent_resume(pause_id="p1")
+```
+
+```python النماذج
+failproofai_sdk.event.model_request(
+ model="gpt-4o-mini",
+ messages=[{"role": "user", "content": "..."}],
+ request_id="req-1",
+)
+failproofai_sdk.event.model_response(
+ model="gpt-4o-mini",
+ content="...",
+ input_tokens=139,
+ output_tokens=21,
+ request_id="req-1",
+ duration_ms=5202,
+)
+```
+
+```python الأدوات
+failproofai_sdk.event.tool_use(tool_name="search", tool_call_id="c1", input={"q": "..."})
+failproofai_sdk.event.tool_result(tool_name="search", tool_call_id="c1", output="...")
+```
+
+```python الخطافات
+failproofai_sdk.event.hook_triggered(hook_name="retrieve", hook_id="h1", trigger_event="node")
+failproofai_sdk.event.hook_completed(hook_name="retrieve", hook_id="h1", outcome="success")
+```
+
+```python البشر
+failproofai_sdk.event.human_wait(input_id="i1", prompt="Approve?", options=["yes", "no"])
+failproofai_sdk.event.human_input(input_id="i1", response="yes")
+failproofai_sdk.event.human_pause(reason="operator paused the run", user_id="dana")
+failproofai_sdk.event.human_interrupt(reason="operator stopped the run", at_step="step_3")
+```
+
+```python الأعطال
+failproofai_sdk.event.error(
+ error_type="TimeoutError",
+ message="provider timed out after 30s",
+ traceback="...",
+)
+```
+
+
+
+ **العائلتان البشريتان تشير في اتجاهين متعاكسين.**
+
+ | الطرق | المعنى |
+ | --- | --- |
+ | `human_wait` / `human_input` | **الوكيل طلب من شخص** — بوابة موافقة، سؤال توضيحي |
+ | `human_pause` / `human_interrupt` | **شخص تصرف على الوكيل** — زر إيقاف، توقف المشغل |
+
+ لا يشير أي إطار عمل إلى الزوج الثاني، لذا فهو دائماً لك لإصداره.
+
+
+
+ **مرر `request_id` عندما تعمل نداءات النموذج بالتزامن.** بدونه، تتزاوج طلبات الاستجابات بترتيب الوصول لكل وكيل — والنداءات المتزامنة تتزاوج بشكل خاطئ، مرفقة كل استجابة بالطلب الخاطئ.
+
+
+## مثال
+
+حلقة استدعاء الأداة مقابل OpenAI API، بدون إطار عمل وكيل:
+
+```python
+import json
+
+import failproofai_sdk
+from openai import OpenAI
+
+failproofai_sdk.configure(environment="production")
+client = OpenAI()
+MODEL = "gpt-4o-mini"
+
+
+def turn(messages: list):
+ """One model call, bracketed by the pair."""
+ failproofai_sdk.event.model_request(model=MODEL, messages=messages)
+ reply = client.chat.completions.create(model=MODEL, messages=messages, tools=TOOLS)
+ usage = reply.usage
+ failproofai_sdk.event.model_response(
+ model=MODEL,
+ content=reply.choices[0].message.content or "",
+ input_tokens=usage.prompt_tokens,
+ output_tokens=usage.completion_tokens,
+ )
+ return reply.choices[0].message
+
+
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("inventory", goal="price report"):
+ for _ in range(4): # bounded; an unbounded agent loop is its own bug
+ message = turn(messages)
+ if not message.tool_calls:
+ break
+ messages.append(message.model_dump(exclude_none=True))
+ for call in message.tool_calls:
+ args = json.loads(call.function.arguments or "{}")
+ with failproofai_sdk.tool_call(
+ call.function.name, tool_call_id=call.id, input=args
+ ) as handle:
+ handle.output = run_tool(call.function.name, args)
+ messages.append({
+ "role": "tool",
+ "tool_call_id": call.id,
+ "content": str(handle.output),
+ })
+```
+
+ينتج عن هذا نفس أنواع الأحداث الستة التي سيعطيك المحول. الإصدار الكامل القابل للتشغيل، مع تعريفات الأداة، يأتي في مستودع SDK تحت `docs/manual/examples/`.
+
+## الخيوط و async
+
+تنتشر متغيرات السياق في مهام asyncio تلقائياً. لا تنتشر في خيوط جديدة، لأن الخيط يبدأ بسياق فارغ.
+
+```python
+# asyncio: nothing to do
+async with failproofai_sdk.session():
+ await asyncio.gather(worker(1), worker(2))
+
+# threads: wrap the callable
+pool.submit(failproofai_sdk.propagate(work), x)
+threading.Thread(target=failproofai_sdk.propagate(work)).start()
+loop.run_in_executor(None, failproofai_sdk.propagate(work), x)
+```
+
+بدون `propagate()`، تثير أحداث العامل `TypeError` تسمي الإصلاح بدلاً من الهبوط على جلسة لا شيء. هذا متعمد: حدث بدون جلسة يتم تخطيه بواسطة ingest والإجابة `200`، وهو الفشل الصامت الذي توجد طبقة الهوية لمنعه.
+
+## أدرج إطار عمل بدون محول
+
+كل إطار عمل وكيل يعطيك نفس الفتحات الثلاثة. اربطها وسيكون لديك تتبع كامل — المحولات الأربعة المشحونة لا تفعل أكثر من هذا.
+
+| الفتحة | ما تكتبه | ما يهبط |
+| --- | --- | --- |
+| التشغيل | `session()` + `agent()` | `agent_start`, `agent_end` |
+| كل أداة | `tool_call()` | `tool_use`, `tool_result` |
+| كل نداء نموذج | زوج `model_*` | `model_request`, `model_response` |
+
+
+
+ ```python
+ with failproofai_sdk.session():
+ with failproofai_sdk.agent(agent_name, goal=task):
+ result = framework.run(task)
+ ```
+
+
+ في أي مكان يستدعيه الإطار غلاف أداة أو برنامج وسيط.
+
+ ```python
+ with failproofai_sdk.tool_call(name, input=args) as call:
+ call.output = original(**args)
+ ```
+
+
+ ```python
+ failproofai_sdk.event.model_request(model=model, messages=messages)
+ reply = provider.complete(...)
+ failproofai_sdk.event.model_response(
+ model=model,
+ content=text,
+ input_tokens=usage.prompt_tokens,
+ output_tokens=usage.completion_tokens,
+ )
+ ```
+
+
+
+
+ **لديك عقدة أو خطوة أو حدود برنامج وسيط تستحق الرؤية؟** غلفها في زوج خطاف — `hook_triggered` / `hook_completed` — وليس `agent()` متداخل. `agent_id` هو جانب cardinality منخفض، وإدخال واحد لكل عقدة يغرقه. تُعرض امتدادات الخطاف بنفس الطريقة وتمنحك زمن الكمون لكل عقدة.
+
+
+
+ **اليدوي والتلقائي يتكونان.** يدخل محول يعمل داخل نطاق مكتوب يدوياً تلك الجلسة والآباء إلى ذلك الوكيل، حتى تحصل على شجرة واحدة بدلاً من شجرتين — مفيد عندما تدرج إطار عمل بنفسك إلى جانب واحد مدعوم.
+
+
+
+ سببان، والفتحات الثلاثة أعلاه هي الإجابة على كليهما:
+
+ - `autogen-core` لم يتم صيانته منذ سبتمبر 2025.
+ - AG2 لا يعرض نقطة تسجيل على مستوى العملية تعادل خطافات أطر العمل الأخرى، لذا فإن إدراجها يعني تغليف كل وكيل في كل موقع البناء.
+
+ يسجل رسم الفتحات يدوياً نفس الأحداث، بنفس الدقة، كما سيفعل محول مشحون.
+
+
+## الذهاب أعمق
+
+كيف يعمل التسجيل فعلياً. لا شيء من هذا مطلوب للبدء.
+
+
+
+
+
+كل تسجيل له نفس الشكل: يفتح امتداد، يتداخل العمل بداخله، وكل حدث افتتاحي يحصل على حدث إغلاق.
+
+```mermaid
+flowchart LR
+ S(["agent_start"]) --> H["hook_triggered"]
+ H --> M["model_request model_response"]
+ H --> T["tool_use tool_result"]
+ M --> C["hook_completed"]
+ T --> C
+ C --> E(["agent_end"])
+```
+
+**الزوج** هو الوحدة. كل حدث إغلاق يحمل مدة يقيسها SDK من الحدث الافتتاحي الخاص به.
+
+فيما يلي تشغيل واحد حقيقي لكل إطار عمل — مأخوذ من الأمثلة المشحونة مع SDK، اسم النموذج معياري. لاحظ كم يعود من نداء واحد.
+
+
+
+ ```text 14 events
+ 1 +0.000s agent_start LangGraph
+ 2 +0.001s hook_triggered agent
+ 3 +0.002s model_request gpt-4o-mini
+ 4 +3.023s model_response gpt-4o-mini · 21 out-tok
+ 5 +3.024s hook_completed agent
+ 6 +3.024s hook_triggered tools
+ 7 +3.025s tool_use word_count
+ 8 +3.025s tool_result word_count · ok
+ 9 +3.025s hook_completed tools
+ 10 +3.026s hook_triggered agent
+ 11 +3.027s model_request gpt-4o-mini
+ 12 +5.717s model_response gpt-4o-mini · 5 out-tok
+ 13 +5.720s hook_completed agent
+ 14 +5.721s agent_end LangGraph · success
+ ```
+
+ تصبح العقد أزواج خطاف، لذا تحصل على زمن الكمون لكل عقدة بدون أن تزحمها قائمة الوكيل.
+
+
+
+ ```text 10 events
+ 1 +0.000s agent_start crew
+ 2 +0.050s agent_start analyst · under crew
+ 3 +0.057s model_request gpt-4o-mini
+ 4 +3.475s model_response gpt-4o-mini · 19 out-tok
+ 5 +3.478s tool_use lookup_metric
+ 6 +3.478s tool_result lookup_metric · ok
+ 7 +3.486s model_request gpt-4o-mini
+ 8 +5.694s model_response gpt-4o-mini · 9 out-tok
+ 9 +5.727s agent_end analyst · success
+ 10 +5.739s agent_end crew · success
+ ```
+
+ يصبح `role` لكل وكيل اسم امتداده، لذا ينقسم زمن الكمون ومصروف الرمز حسب الدور.
+
+
+
+ ```text 26 events
+ 1 +0.000s agent_start Agent
+ 2 +0.001s hook_triggered init_run
+ 4 +0.501s hook_triggered setup_agent
+ 6 +0.503s hook_triggered run_agent_step
+ 7 +0.505s model_request gpt-4o-mini
+ 8 +3.083s model_response gpt-4o-mini · 18 out-tok
+ 10 +3.197s hook_triggered parse_agent_output
+ 12 +3.355s hook_triggered call_tool
+ 13 +3.355s tool_use city_population
+ 14 +3.355s tool_result city_population · ok
+ 16 +3.356s hook_triggered aggregate_tool_results
+ ... second iteration
+ 26 +7.038s agent_end Agent · success
+ ```
+
+ حلقة الوكيل نفسها مرئية، ليس فقط نداءاته النموذجية.
+
+
+
+ ```text 8 events
+ 1 +0.000s agent_start agent
+ 2 +0.001s model_request gpt-4o-mini
+ 3 +4.413s model_response gpt-4o-mini · 17 out-tok
+ 4 +4.415s tool_use population
+ 5 +4.415s tool_result population · ok
+ 6 +4.416s model_request gpt-4o-mini
+ 7 +8.118s model_response gpt-4o-mini · 6 out-tok
+ 8 +8.119s agent_end agent · success
+ ```
+
+ لا توجد أزواج خطاف: Pydantic AI لا يملك حد عقدة أو خطوة للإحاطة به.
+
+
+
+ ```text 6 events
+ 1 +0.000s agent_start main
+ 2 +0.000s tool_use population
+ 3 +0.000s tool_result population · ok
+ 4 +0.000s model_request gpt-4o-mini
+ 5 +0.000s model_response gpt-4o-mini · 3 out-tok
+ 6 +0.000s agent_end main · success
+ ```
+
+ أنت تصدر هذه بنفسك. نفس أنواع الأحداث، نفس الدقة — إنه يكلفك مواقع الاستدعاء.
+
+
+
+
+
+
+
+**لا توجد حدث نهاية الجلسة.** الجلسة ليست شيء تغلقه — إنها مجموعة من الأحداث تشترك في `session_id`.
+
+يتم استخلاص الحالة من شكل التتبع:
+
+| الحالة | متى |
+| --- | --- |
+| `ongoing` | لا يزال امتداد واحد على الأقل مفتوحاً |
+| `paused` | `agent_pause` بدون `agent_resume` مطابقة |
+| `error` | لا شيء مفتوح، وحدث واحد على الأقل فشل |
+| `done` | لا شيء مفتوح، وشيء فشل |
+
+لذلك تنتهي الجلسة عندما يتم إغلاق كل زوج. يصدر المحولات `agent_end` لك، وعند الهدم يغلقون أي شيء لا يزال مفتوحاً ويوقعونه كغير كامل — يستقر التشغيل المتعطل كـ `done` بفجوة مرئية بدلاً من التعليق.
+
+
+ هذا هو السبب في أن الجلسة يمكن أن تمتد على نداءين. يوقف `interrupt()` في LangGraph التشغيل، يبقى الامتداد الجذري مفتوحاً عن قصد، والنداء المستأنف يغلقه. كلا النداءين جلسة واحدة.
+
+
+
+
+
+
+`session_id` و `agent_id` اختياريان في كل طريقة حدث. محذوفاً، يحلان من النطاق المرفق:
+
+```python
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("planner"):
+ failproofai_sdk.event.tool_use(tool_name="search", tool_call_id="c1")
+```
+
+تمريرهما بشكل صريح يعمل بعد ذلك ويأخذ الأسبقية. بدون شيء مرتبط وبدون شيء تم تمريره، يرفع الاستدعاء `TypeError` تسمية الإصلاح بدلاً من إصدار حدث بدون جلسة، والتي ستقفزها ingest مع الإجابة `200`.
+
+تربط النطاقات الهوية على متغيرات السياق. تلك تنتشر في مهام asyncio تلقائياً لكن ليس في خيوط جديدة — غلف عامل في `failproofai_sdk.propagate()`.
+
+#### من يضرب أي معرف
+
+| المعرف | تم ضربه بواسطة | ملاحظات |
+| --- | --- | --- |
+| `session_id` | أنت، أو SDK | `session("chat-42")` يُستخدم حرفياً؛ محذوفاً، ينشئ SDK `uuid4().hex` |
+| `agent_id` | أنت، أو الإطار | من `agent("analyst")`، `role` في CrewAI، `FunctionAgent.name`. يتم رفض قيمة تبدو مثل UUID واستبدالها |
+| `tool_call_id`, `hook_id`, `request_id` | أنت، أو الإطار | تعيد المحولات استخدام معرفات التشغيل الخاصة بالإطار، وهذا هو السبب في أن الأزواج تبقى نقافز الخيط |
+| **معرف الحدث** | **السحابة، عند الاستقبال** | SDK لا ينبعث أي |
+| **`dedup_key`** | **السحابة، عند الاستقبال** | تجزئة org و session و timestamp و type و payload. هذه هي الهوية الحقيقية — إنها تجعل دفعة أعيد محاولتها تنهار بدلاً من التكرار |
+
+#### كيف تحل المحولات `session_id`
+
+أول تطابق يفوز:
+
+1. `session_id` خيار صريح
+2. البيانات الوصفية لكل نداء
+3. نطاق `session()` المرفق
+4. بيانات إطار العمل الوصفية
+5. معرف التشغيل الخاص بإطار العمل
+
+لا يتم اختراعه أبداً مع وجود أحد تلك — معرف مركب سيقسم تشغيل واحد عبر عدة جلسات.
+
+#### حافظ على `agent_id` على cardinality منخفضة
+
+إنه الجانب الأساسي على كل سطح لوحة تحكم، وعمود `LowCardinality(String)`. تقلل القيمة لكل تشغيل العمود وتملأ قائمة القائمة المنسدلة بإدخال واحد لكل تشغيل.
+
+تحافظ المحولات على هذا العمود لك:
+
+| يسلم الإطار | مسجل باسم | لماذا |
+| --- | --- | --- |
+| `3f9a1c2b-…` (معرف فريد) | `main` | لا شيء يمكن قراءته للاحتفاظ به |
+| سلسلة سادسة عشرية طويلة عارية | `main` | نفس |
+| `agent-3f9a1c2b-…` | `agent` | تم تجريد معرف لكل تشغيل، تم الاحتفاظ بالجزء القابل للقراءة |
+| `agent-v2` | `agent-v2` | تُترك الأجزاء القصيرة وحدها |
+| `step-3` | `step-3` | نفس |
+
+المعرف الحقيقي يبقى على `fw_agent_id` / `fw_run_id`، حيث يبقى قابلاً للاستعلام بدون أن يكون جانباً.
+
+
+ **هذا الحراس يلمس فقط التسميات التي اختارها *الإطار*.** `agent_id` تمرره بنفسك — إلى `event.*`، أو إلى `failproofai_sdk.agent(...)` — مسجل تماماً كما هو محدد. إعادة كتابة صريحة لحجة صريحة ستكون أسوأ من cardinality التي تمنعها، لذا سمِّ امتدادات خاصة بك وفقاً لذلك.
+
+
+
+
+
+
+| المجموعة | الأحداث |
+| --- | --- |
+| الوكلاء | `agent_start`, `agent_end`, `agent_pause`, `agent_resume` |
+| النماذج | `model_request`, `model_response` |
+| الأدوات | `tool_use`, `tool_result` |
+| الخطافات | `hook_triggered`, `hook_completed` |
+| البشر | `human_wait`, `human_input`, `human_pause`, `human_interrupt` |
+| الأعطال | `error` |
+
+أي إطار عمل يسجل ماذا، مقاس من التشغيلات أعلاه:
+
+| الحدث | LangGraph | CrewAI | LlamaIndex | Pydantic AI | مخصص |
+| --- | :--: | :--: | :--: | :--: | :--: |
+| بداية الوكيل والنهاية | نعم | نعم | نعم | نعم | أنت |
+| نموذج الطلب والاستجابة | نعم | نعم | نعم | نعم | أنت |
+| استخدام الأداة والنتيجة | نعم | نعم | نعم | نعم | أنت |
+| تم تشغيل الخطاف واكتمل | عقدة | مهمة | خطوة | — | أنت |
+| خطأ | نعم | نعم | نعم | نعم | تلقائي |
+| الانتظار البشري والمدخلات | نعم | نعم | نعم | — | أنت |
+| الوكيل يوقف ويستأنف | نعم | نعم | نعم | — | أنت |
+
+الشرطة تعني أن الإطار ليس لديه مثل هذا المفهوم. `human_pause` و `human_interrupt` تصف *شخص* يتصرف على الوكيل، الذي لا يشير إليه أي إطار — انبعث بنفسك.
+
+
+
+
+
+حدث لا يصل وحده أبداً. يفتح أحدهما امتداد، يغلقه الآخر، والحدث الإغلاق يحمل مدة يقيسها SDK من الحدث الافتتاحي.
+
+| يفتح | يغلق | الحدث الإغلاق يحمل |
+| --- | --- | --- |
+| `agent_start` | `agent_end` | `outcome`, `summary` |
+| `model_request` | `model_response` | الرموز، `stop_reason`، زمن الكمون |
+| `tool_use` | `tool_result` | `output` أو `error`، المدة |
+| `hook_triggered` | `hook_completed` | `outcome`، المدة |
+| `agent_pause` | `agent_resume` | كم دامت الوقفة |
+| `human_wait` | `human_input` | الإجابة، وكم استغرق الشخص |
+
+
+ حدث افتتاحي بدون حدث إغلاق هو امتداد لا ينتهي أبداً. تُرسّم الجلسة كما لا تزال قيد التشغيل، إلى الأبد، ومدتها النشطة تستمر في النمو. هذا هو فشل العرض الذي يجب مراقبته عند الإدراج يدوياً.
+
+
+#### قواعد الارتباط
+
+- أعد استخدام نفس `tool_call_id` أو `hook_id` أو `pause_id` أو `input_id` لحدث الإكمال المطابق.
+- حسابات SDK `duration_ms` لـ `tool_result` و `hook_completed` و `agent_resume` و `human_input`. تمريره إلى تلك الطرق يرفع `ValueError`.
+- `duration_ms` **يُقبل** على `model_response`، لأن فقط المتصل يعرف زمن المزود الحقيقي. يجب أن يكون عدداً صحيحاً — عدد عشري يرفع `ValueError` في موقع الاستدعاء، لأن الخادم يقرأ العمود كعدد صحيح بدون إشارة 32 بت ويخزن NULL لأي شيء آخر.
+- مفاتيح الارتباط مجالها حسب النوع والجلسة، لذا يمكن لاستدعاء أداة وخطاف مشاركة معرف بأمان، ويمكن لجلستين متزامنتين إعادة استخدام نفس المعرفات بدون تصادم. لا تكون مجالاً بواسطة وكيل: زوج مفتوح تحت وكيل واحد ومغلق تحت آخر لا يزال يرتبط، وهي الحالة العادية في الأطر متعددة الوكلاء.
+- `request_id` يزاوج `model_request` مع `model_response`. بدونه، أحداث النموذج تتزاوج بالترتيب لكل وكيل، لذا تتزاوج النداءات المتزامنة بشكل خاطئ.
+- زوج مقسم عبر العمليات لا يزال يرتبط في المصب، لكن SDK لا يمكنه حساب مدته في العملية.
+- تمسك الخريطة المعلقة بـ 10,000 ابدأ كحد أقصى وتطرد الإدخال الأقدم عندما تكون ممتلئة.
+
+
+
+
+
+تثبيت `failproofai-sdk` يثبت كل شيء، كل المحولات الأربعة مضمونة. تسحب الإضافات **الإطار**، وليس المحول.
+
+```python
+import failproofai_sdk # loads nothing outside the standard library
+failproofai_sdk.instrument() # imports only the adapters you actually need
+```
+
+`import failproofai_sdk` هو بدون تبعيات بموجب العقد، مفروض بواسطة اختبار يثبت العجلة المدمجة بـ `--no-deps` وآخر يثبت عدم وصول أي إطار إلى `sys.modules`.
+
+
+ لا يوجد `failproofai_sdk.crewai` تصريح. المحولات مقصودة عن قصد ألا تُعرّض على حزمة المستوى الأعلى: لمس أحدها سيستورد الإطار كتأثير جانبي لوصول السمة، مما يكسر وعد عدم التبعيات. استخدم `instrument()`.
+
+
+```python
+failproofai_sdk.instrument() # every framework already imported
+failproofai_sdk.instrument("crewai") # exactly one, by name
+failproofai_sdk.uninstrument("crewai") # put it back
+```
+
+| الاسم | يقبل أيضاً |
+| --- | --- |
+| `langchain` | `langgraph`, `langchain_core` |
+| `crewai` | — |
+| `llama_index` | `llamaindex`, `llama-index` |
+| `pydantic_ai` | `pydantic-ai`, `pydanticai` |
+
+قراءة الكشف التلقائي `sys.modules`، وليس قائمة الحزمة المثبتة، لذا فإن إطار عمل لديك مثبت لكن لم تستورده أبداً لا يتم إدراجه ولا يتم استيراده نيابة عنك. لرؤية ما هو موصول:
+
+```python
+from failproofai_sdk.integrations import active, available
+
+available() # ('crewai', 'langchain', 'llama_index', 'pydantic_ai')
+active() # ('langchain',)
+```
+
+
+ **`instrument("crewai")` على جهاز بدون CrewAI لا يرفع.** يسجل تحذيراً ويرجع `()`، حتى أحد إطر العمل المفقودة لا تأخذ عملية تدرج أيضاً آخرين.
+
+ التحذير يحمل `ImportError` الأساسي، وتلك الرسالة تسمي أمر التثبيت الدقيق — لذا الإصلاح يكون في سجلاتك، ليس مختبئاً.
+
+ ```text
+ ImportError: failproofai_sdk: cannot instrument 'crewai' because 'crewai.events'
+ is not importable. Install it with: pip install 'failproofai_sdk[crewai]'
+ ```
+
+ اضبط `FAILPROOFAI_SDK_STRICT=1` لإرفاعه بدلاً من ذلك. تُقرأ تلك العلم **مرة واحدة وتُخزن مؤقتاً**، لذا يصدرها قبل بدء العملية بدلاً من تعيينها في منتصف التشغيل.
+
+
+
+ **`instrument()` يجب أن يأتي *بعد* استيراد إطار العمل الخاص بك.** قراءة الكشف التلقائي `sys.modules`، لذا نداء عارٍ فوق الاستيراد يجد لا شيء، يثبت لا شيء، ويرجع `()`.
+
+
+
+```python خطأ
+import failproofai_sdk
+failproofai_sdk.instrument() # sys.modules has no langchain yet -> ()
+
+import langchain # too late, nothing is wired
+```
+
+```python صحيح
+import langchain # import the framework first
+import failproofai_sdk
+
+failproofai_sdk.instrument() # finds it -> ('langchain',)
+```
+
+```python صحيح، مستقل الترتيب
+import failproofai_sdk
+
+# Naming it imports the adapter on request, so this works from anywhere.
+failproofai_sdk.instrument("langchain")
+```
+
+
+احصل على هذا خطأ والعملية تعمل مع SDK مستوردة، المحول يبدو مثبتاً، و **حدث واحد لم يُصدر**. يسجل تحذيراً يقول بالضبط ذلك — لذا تحقق من السجلات أولاً عندما لا يسجل التشغيل شيئاً.
+
+
+
+
+
+```mermaid
+flowchart LR
+ A["وكيلك"] --> B["محول"]
+ B --> C["كاتب قائمة الذاكرة"]
+ C -->|"كل 0.5s"| D["ملف JSONL على القرص"]
+ D --> E["مراقب Failproof"]
+ E -->|"HTTPS"| F["السحابة"]
+```
+
+| المرحلة | الوظيفة | يعمل في |
+| --- | --- | --- |
+| محول | ترجمة رد اتصال الإطار إلى أحد أنواع الأحداث 15 | عمليتك |
+| كاتب | طوابير، دفعات، كتابة JSONL ذرية | عمليتك، خيط الخلفية |
+| ملف | نقل دائم، ينجو من خروج عملية | القرص المحلي |
+| مراقب | يراقب الملف، سفن دفعات، حذف ما ينقله | آلتك |
+| استقبال | يعين معرف صف و dedup key، يرقي أعمدة قابلة للاستعلام | السحابة |
+
+الملف هو ما يجعل هذا آمناً: وكيلك لا يسد أبداً على الشبكة، وانقطاع السحابة يعني دليل ينمو بدلاً من فقدان الأحداث.
+
+كل تنظيف يكتب ملف دفعة واحدة، `.tmp` أولاً، ثم `fsync`، ثم إعادة تسمية ذرية:
+
+```text
+~/.failproofai/custom-agents/events/
+ event-2026-08-20T10-15-00-123Z-48213-0.jsonl
+```
+
+يختار المراقب فقط `.jsonl`، لذا لا يمكن أبداً قراءة ملف نصف مكتوب. الجذع يحمل طابع زمني، معرف العملية ورقم التسلسل، لذا لا يمكن لعمليتين تنظيف في نفس الميلي ثانية أن تصطدما. تُغطى القائمة بـ 10,000 حدث؛ بعد ذلك تسقط الأقدم وتسجل.
+
+
+ **`collector.redact` لا ينطبق على أحداث SDK الخاصة بك.** لا يراها أبداً.
+
+
+المراقب **ينقل** دفعاتك. إنه لا يفتحها أو يعيد كتابتها.
+
+| الأحداث | مكتوب بواسطة | معاد بواسطة `collector.redact`؟ |
+| --- | --- | --- |
+| نصوص جلسة CLI | المراقب | نعم |
+| نشاط الخطاف | المراقب | نعم |
+| **كل ما يصدره SDK** | **عمليتك** | **لا** |
+
+التعديل يعمل حيث **يكتب** المراقب أحداثه الخاصة — وليس حيث تُنقل الدفعات. لذا طلب أو حجة أداة تحمل مفتاح API لا تزال تحمله عند الوصول.
+
+هذا مقصود. هذه هي نداءات الإدراج الخاصة بك، وإعادة الكتابة في الحركة ستعني أن الأحداث التي تستقبلها ليست الأحداث التي أصدرتها.
+
+
+ **أنت تتحكم في الحمولات من المصدر، في مكانين:**
+
+ - أوقف التقاط المحتوى على المحول. **اسم الخيار يختلف، ومحول واحد لا يملك أي** — هذا ليس مفتاح عام واحد:
+ - LangChain / LangGraph, Pydantic AI — `capture_content=False`
+ - LlamaIndex — `capture_messages=False`
+ - CrewAI — **لا مفتاح محتوى على الإطلاق**؛ `session_id` هو الخيار الوحيد الذي يقرأه، لذا يتم تسجيل الطلبات والإكمالات دائماً.
+
+ `instrument()` يسقط الخيارات التي لا يقرأها محول، لذا تمرير الاسم الخاطئ لا يرفع شيء ولا يغير شيء.
+ - لا تسلم السر إلى `input=` في المقام الأول.
+
+ `collector.redact` ليس بديلاً عن أي منهما.
+
+
+
+ **دليل ملف فارغ هو الحالة الصحية.** لا تستخدمه للتحقق من التسليم.
+
+
+يحذف المراقب كل دفعة في غضون ميلي ثانية من نقلها، لذا فإن `ls` يتسابق المجمع ويظهر جزء من ما أصدرته — لا يمكن تمييزه عن SDK لم يسجل شيء.
+
+للتأكد من أن الأحداث هبطت فعلاً، تحقق من لوحة التحكم. لمراقبة امتلاء الملف، توقف المراقب أولاً.
+
+
+
+
+
+كل رد اتصال يعمل داخل غلاف وظيفته الوحيدة هي إعادة الرفع، لذا استدعاؤك يجلس في `try` واحدة بالضبط وكل شيء SDK يحدث خارجها.
+
+| ما يحدث | النتيجة |
+| --- | --- |
+| خطاف يرفع | مسجل مرة واحدة مع traceback الخاص به. استدعاؤك غير متأثر |
+| نفس الخطاف يرفع ثلاث مرات | يتم تعطيل ذاك الخطاف للعملية المتبقية، مع سطر خطأ واحد |
+| `FAILPROOFAI_SDK_STRICT=1` معين | يتم إعادة رفع الاستثناء بدلاً من ذلك |
+| إصدار إطار عمل خارج النطاق المختبر | يحذر مرة واحدة، يدرج على أي حال |
+| قدرة واحدة مفقودة | يتم تعطيل ذاك الخطاف فقط، لا أبداً محول كامل |
+
+الافتراضي صحيح في الإنتاج وخاطئ أثناء التصحيح، لأنه لا يمكن أبداً إثبات أنه لم يتعطل. اضبط `FAILPROOFAI_SDK_STRICT=1` لإسكات الفشل المبتلع.
+
+
+
+
+
+## مشاكل شائعة
+
+
+
+ حدث افتتاحي بدون حدث إغلاق: `model_request` بدون `model_response`، أو `tool_use` بدون `tool_result`. استخدم النطاقات، التي تضمن الزوج حتى عندما يرفع الجسم. إذا استدعيت طرق الحدث مباشرة، استخدم `try` و `finally`.
+
+
+
+ يتم قياسه من حدث الافتتاح المطابق، لذا يتم رفضه على `tool_result` و `hook_completed` و `agent_resume` و `human_input`. يتم قبوله على `model_response`، لأن فقط أنت تعرف زمن المزود الحقيقي، ويجب أن يكون عدداً صحيحاً.
+
+
+
+ الخيط لم يرث السياق أبداً. غلف الدالة في `failproofai_sdk.propagate()`. انظر [الخيوط و async](#threads-and-async).
+
+
+
+ الحقول الإضافية تدمج آخراً، لذا أحد باسم مثل حقل حقيقي مثل `model` أو `outcome` سيكتب فوقه ويغير عمود مخزن. مساحة أسماء لك؛ المحولات تستخدم بادئة `fw_`.
+
+
+
+ `agent_id` هو جانب cardinality منخفض وأنت وضعت معرف تشغيل فيه. استخدم دوراً أو اسم عقدة وضع المعرف الحقيقي في حقل الحمولة.
+
+
+
+## التالي
+
+
+
+ الأزواج والمعرفات ودورة حياة الجلسة والتسليم.
+
+
+ اتبع السببية عبر الجلسة التي التقطتها للتو.
+
+
+ LangGraph و CrewAI و LlamaIndex و Pydantic AI.
+
+
\ No newline at end of file
diff --git a/docs/ar/start/integrations/langchain.mdx b/docs/ar/start/integrations/langchain.mdx
new file mode 100644
index 000000000..c6f9eee46
--- /dev/null
+++ b/docs/ar/start/integrations/langchain.mdx
@@ -0,0 +1,245 @@
+---
+---
+title: "LangChain و LangGraph"
+sidebarTitle: "LangChain و LangGraph"
+description: "قم بتتبع الرسوم البيانية والعقد والأدوات والمسترجعات واستدعاءات النموذج برمز واحد."
+icon: "/images/frameworks/langchain.svg"
+---
+
+محول واحد يخدم كليهما. يعمل LangGraph على مدير الاستدعاءات (callback manager) الخاص بـ `langchain-core`، لذا فإن تتبع أحدهما يتابع الآخر.
+
+## التثبيت
+
+```bash
+pip install 'failproofai-sdk[langgraph]'
+```
+
+للحصول على LangChain بدون LangGraph، استخدم `failproofai-sdk[langchain]`.
+
+المدعوم: `langchain-core` 1.4.7 إلى 2.0، `langgraph` 1.2 إلى 2.0. خارج هذا النطاق، يتم تثبيت المحول وإصدار تحذير مرة واحدة.
+
+## التتبع
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+with failproofai_sdk.session():
+ graph.invoke({"messages": [HumanMessage("...")]})
+```
+
+يسجل `instrument()` محلل التتبع عبر `langchain_core.tracers.context.register_configure_hook`. يقوم LangChain بحقنه في كل مدير استدعاءات يقوم ببنائه، بحيث يتم التقاط الرسوم البيانية والأدوات والنماذج دون تغيير موقع الاستدعاء — بما في ذلك تلك الموجودة داخل المكتبات التي لم تكتبها.
+
+## ما يتم تسجيله
+
+| LangChain أو LangGraph | حدث Failproof |
+| --- | --- |
+| التشغيل الجذري | `agent_start`، `agent_end` |
+| عقدة LangGraph | `hook_triggered`، `hook_completed` |
+| رسم بياني فرعي مترجم | `agent_start` و `agent_end` متداخلة |
+| تشغيل الأداة | `tool_use`، `tool_result` |
+| تشغيل المسترجع | `tool_use`، `tool_result`، الإخراج مختصر |
+| تشغيل نموذج الدردشة أو LLM | `model_request`، `model_response`، مع استخدام الرموز |
+| الرموز المرسلة | مطوية في الاستجابة كعدد القطع والوقت للرمز الأول. تحتاج عدادات الرموز إلى `ChatOpenAI(stream_usage=True)` — انظر أدناه |
+| `interrupt()` | `human_wait`، `agent_pause` |
+| `Command(resume=...)` | `agent_resume`، `human_input`، مرتبطة على `Interrupt.id` — بما في ذلك عند حدوث الاستئناف في عملية مختلفة ضد نفس checkpointer |
+| استثناء غير معالج | `error`، ثم `agent_end` مع نتيجة `failed` |
+
+**تصبح العقدة hook وليس وكيلاً متداخلاً.** `agent_id` هي الجانب الأساسي عبر كل سطح لوحة التحكم — تعزيز `retrieve` و `grade_documents` و `should_continue` إلى وكلاء سيغرقها، ويعنون الجلسة بعد أي عقدة تحدث لتعمل أولاً.
+
+تعرض رسوم Hook بنفس الطريقة وتعطيك عرض الكمون لكل عقدة.
+
+
+ **سمّ عقدك كما تريد.** يتم تحديد تشغيل العقدة من خلال *شكلها* — تشغيل غير ورقة يحمل LangGraph الخاص بـ step tag — لا من خلال اسمها أبداً.
+
+
+| ما تكتبه | ما يتم تسجيله |
+| --- | --- |
+| `add_node("lookup_population", ToolNode([...]))` | الأداة |
+| `add_node("ChatOpenAI", ...)` | استدعاء النموذج |
+
+استخدام اسم العقدة بعد الشيء الذي يعمل عليه قد يؤدي إلى اختفاء أحداث الشيء. لم يعد الحال كذلك.
+
+### البث
+
+لا تصدر `.stream()` و `.astream()` أحداث لكل رمز. يتم طيها في `model_response` الختامي:
+
+| الحقل | يحمل |
+| --- | --- |
+| `fw_chunks` | عدد القطع التي وصلت |
+| `fw_ttft_ms` | الوقت للرمز الأول |
+
+### عدادات الرموز على استجابة مرسلة
+
+مسألة منفصلة، وسهلة الإغفال: يرسل OpenAI الاستخدام على استجابة مرسلة **عند طلبها فقط**.
+
+```python
+ChatOpenAI(model="gpt-4o-mini", stream_usage=True) # بدون هذا، لا توجد رموز
+```
+
+يسجل المحول ما يسلمه الإطار له. بدون هذا الخيار لا يوجد شيء للتسجيل، و `model_response` يصل بدون عدادات الرموز.
+
+## مثال
+
+```python
+import failproofai_sdk
+from langchain_core.messages import HumanMessage
+from langchain_core.tools import tool
+from langchain_openai import ChatOpenAI
+from langgraph.prebuilt import ToolNode, create_react_agent
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+
+@tool
+def price_of(item: str) -> float:
+ """Return the unit price of an item in USD."""
+ return {"widget": 42.0, "gadget": 17.5}[item.lower().strip()]
+
+
+@tool
+def stock_of(item: str) -> int:
+ """Return the units of an item currently in stock."""
+ return {"widget": 120, "gadget": 0}[item.lower().strip()]
+
+
+tools = ToolNode([price_of, stock_of], handle_tool_errors=True)
+graph = create_react_agent(ChatOpenAI(model="gpt-4o-mini"), tools)
+
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("analyst", goal="price and stock report"):
+ result = graph.invoke({
+ "messages": [HumanMessage("Price and stock for widget and gadget?")]
+ })
+```
+
+## سمّ رسومك البيانية
+
+بشكل افتراضي، تأخذ رسالة الجذر اسم الرسم البياني الخاص به. قم بلفها للحصول على تسمية اخترتها:
+
+```python
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("analyst", goal="price and stock report"):
+ graph.invoke(...)
+```
+
+للإعدادات متعددة الوكلاء، أدرج النطاقات. يصبح كل عامل رسمة فرعية تحمل `parent_id`:
+
+```python
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("supervisor"):
+ with failproofai_sdk.agent("researcher"):
+ research_graph.invoke(...)
+ with failproofai_sdk.agent("writer"):
+ writer_graph.invoke(...)
+```
+
+حافظ على `agent_id` بقليل من الاختلاف. استخدم دوراً أو اسم عقدة، أبداً UUID أو سلسلة نصية لكل تشغيل.
+
+## التحكم في الجلسة
+
+معرّف الجلسة يتم حله بهذا الترتيب، المطابقة الأولى تفوز:
+
+1. `instrument("langchain", session_id=...)`
+2. `config={"metadata": {"failproofai_sdk_session_id": ...}}`
+3. نطاق `failproofai_sdk.session()` المحيط
+4. `metadata["session_id"]` أو `metadata["conversation_id"]` أو `metadata["thread_id"]`
+5. معرّف التشغيل الجذري
+
+لا يتم إنشاؤها من الصفر أبداً، لأن معرّف صناعي يقسم تشغيل واحد عبر عدة جلسات.
+
+```python
+graph.invoke(
+ {"messages": [...]},
+ config={"metadata": {"failproofai_sdk_session_id": f"chat-{user_id}"}},
+)
+```
+
+## الخيارات
+
+```python
+failproofai_sdk.instrument(
+ "langchain",
+ session_id=None, # ثبّت كل تشغيل إلى معرّف جلسة واحد
+ include_chains=set(), # قائمة بيضاء للسلاسل الوسيطة كأزواج hooks
+ capture_content=True, # False يسقط الأوامر والإكمالات من الحمولات
+ graph_callbacks=True, # مقاطعة واستئناف من الدرجة الأولى، تحتاج langgraph 1.2+
+)
+```
+
+عيّن `capture_content=False` للبيانات المنظمة. الهيكل والتوقيتات وعدادات الرموز وأسماء الأدوات والنتائج لا تزال مسجلة؛ أجسام الرسائل لا.
+
+`include_chains` ينطبق على التشغيلات **المتداخلة** فقط. runnable الذي تستدعيه على المستوى الأعلى هو جذر الجلسة، بحيث يصبح رسمة الوكيل بدلاً من زوج hook، والتسمية هنا ليس لها تأثير.
+
+## الإنسان في الحلقة
+
+`interrupt()` ينتج أربعة أحداث، وليس أي زوج مكرراً:
+
+```python
+from langgraph.types import Command, interrupt
+
+def approve(state):
+ decision = interrupt({"prompt": "Ship it?", "options": ["yes", "no"]})
+ return {"approved": decision == "yes"}
+
+with failproofai_sdk.session():
+ graph.invoke(state, config) # human_wait, agent_pause
+ graph.invoke(Command(resume="yes"), config) # agent_resume, human_input
+```
+
+يحمل `human_wait` إلى `human_input` الأمر والإجابة (كلاهما مُسقط تحت `capture_content=False`، جنباً إلى جنب مع مصادر وثائق الاسترجاع — ينجو عدد الوثائق). `agent_pause` إلى `agent_resume` هو الزوج الوحيد الذي يعطي الوقت المتوقف، لذا بدونه فإن انتظار إنساني لمدة عشر دقائق يتم تحديده كوقت وكيل نشط. تبقى الرسالة الجذرية مفتوحة عبر الفجوة، مما يبقي كلا الاستدعاءات في جلسة واحدة.
+
+## المشاكل الشائعة
+
+
+
+ `create_react_agent` تنشر الاستثناء. للسماح للنموذج برؤية الفشل والمتابعة، قم بإنشاء عقدة الأداة بشكل صريح:
+
+ ```python
+ from langgraph.prebuilt import ToolNode, create_react_agent
+
+ tools = ToolNode([price_of, stock_of], handle_tool_errors=True)
+ graph = create_react_agent(model, tools)
+ ```
+
+ يتم تسجيل الفشل كـ `tool_result` يحمل خطأ في كلا الحالتين. هذا يقرر فقط ما إذا كان التشغيل ينجو منه.
+
+
+
+ `llm.invoke()` مباشر خارج أي رسم بياني ليس له تشغيل أب، لذا فإنه يفتح رسمة جذرية ويصدر زوج النموذج الخاص به داخلها. لوحة التحكم تربط الأوراق بوكيل مفتوح، بحيث تكون الرسمة مقصودة. سمّها:
+
+ ```python
+ with failproofai_sdk.agent("summariser"):
+ summary = ChatOpenAI(model="gpt-4o-mini").invoke([HumanMessage(text)])
+ ```
+
+
+
+ لقد مررت معالج Failproof في `config={"callbacks": [...]}` بالإضافة إلى استدعاء `instrument()`. قم بإزالته. يغطي خطاف التكوين بالفعل كل مدير استدعاءات في العملية.
+
+
+
+ لا تفعل. يرفع LangGraph `GraphInterrupt` عبر نفس المسار مثل استثناء حقيقي، لذا كل توقف يصل إلى المتتبع كرد استدعاء خطأ. يتم التعامل مع أي فئة فرعية من `GraphBubbleUp` كتدفق تحكم بدلاً من ذلك، لذا فإن موافقة لا تطلي خطأ أحمر.
+
+
+
+ تحقق بهذا الترتيب: `instrument()` تشغل قبل تنفيذ الرسم البياني؛ هناك `with failproofai_sdk.session():` حول الاستدعاء؛ تم ضبط `FAILPROOFAI_SDK_STRICT=1`، لذا يرفع خطاف منخفض بدلاً من امتصاصه.
+
+
+
+## التالي
+
+
+
+ الأزواج والمعرّفات ودورة حياة الجلسة والتسليم.
+
+
+ اتبع السببية عبر الجلسة التي التقطتها للتو.
+
+
+ CrewAI وLlamaIndex وPydantic AI والوكلاء المخصصون.
+
+
\ No newline at end of file
diff --git a/docs/ar/start/integrations/llamaindex.mdx b/docs/ar/start/integrations/llamaindex.mdx
new file mode 100644
index 000000000..76bd857d4
--- /dev/null
+++ b/docs/ar/start/integrations/llamaindex.mdx
@@ -0,0 +1,249 @@
+---
+title: "LlamaIndex"
+sidebarTitle: "LlamaIndex"
+description: "ضبط سير العمل والخطوات والوكلاء الوظيفيين والمسترجعات."
+icon: "/images/frameworks/llamaindex.svg"
+---
+
+## التثبيت
+
+```bash
+pip install 'failproofai-sdk[llamaindex]'
+```
+
+مدعوم: `llama-index-core` 0.14.23 إلى 0.15. 0.14.23 هو الإصدار حيث بدأ تدفق سير العمل بنقل أحداث الوكيل المكتوبة بشكل صريح التي يقرأها هذا المحول. تحته، تختفي أسماء النموذج وهيكل الوكيل معاً.
+
+## الضبط
+
+```python
+import asyncio
+
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+
+async def main():
+ async with failproofai_sdk.session():
+ await agent.run("...")
+
+
+asyncio.run(main())
+```
+
+واجهة برمجة التطبيقات للوكيل في LlamaIndex غير متزامنة. كل نطاق يعمل تحت `async with` وكذلك `with` وينتج أحداثاً متطابقة.
+
+`instrument()` تربط معالج حدث ومعالج امتداد لموزع LlamaIndex العام. معاً يجعلان حلقة الوكيل مرئية، وليس فقط استدعاءات نموذجه.
+
+
+ بدون وسيطة إضافية على نموذجك، كل عدد رموز في تتبعك قيمته null. انظر [عدد الرموز](#token-counts) أدناه.
+
+
+## عدد الرموز
+
+`FunctionAgent` يستدعي `astream_chat`، و`llama-index-llms-openai` لا يرسل `stream_options={"include_usage": True}` عند البث. المزود بالتالي لا يرسل أبداً مقطع الاستخدام، ولا شيء لأي أداة ضبط لقراءته.
+
+هذا سلوك LlamaIndex الأساسي. قم بالاشتراك في نموذجك:
+
+```python
+from llama_index.llms.openai import OpenAI
+
+llm = OpenAI(
+ model="gpt-4o-mini",
+ additional_kwargs={"stream_options": {"include_usage": True}},
+)
+```
+
+تم القياس في نفس التشغيل والنموذج:
+
+| | رموز الإدخال | رموز الإخراج |
+| --- | --- | --- |
+| بدون | `null` | `null` |
+| مع | 148 | 17 |
+
+استدعاءات البث غير المتزامن (`llm.chat`, `llm.achat`) تقرر الاستخدام بدون تكوين. فقط مسار البث، وهو المسار الافتراضي للوكيل، يحتاج إلى هذا.
+
+## ما يتم تسجيله
+
+| LlamaIndex | حدث Failproof |
+| --- | --- |
+| `Workflow.run` امتداد الجذر | جلسة، `agent_start`، `agent_end` |
+| امتداد `Workflow.run` المتداخل | `agent_start` متداخل، `agent_end` |
+| امتداد خطوة سير العمل | `hook_triggered`، `hook_completed` |
+| بداية ونهاية دردشة LLM | `model_request`، `model_response` |
+| امتداد `FunctionTool.call` | `tool_use`، `tool_result` |
+| بداية ونهاية الاسترجاع | `tool_use`، `tool_result`، الناتج المختصر |
+| التضمينات | لا شيء، إلا إذا كان `embeddings=True` |
+| أداة تنتظر شخصاً | `human_wait`، `agent_pause`، ثم `agent_resume`، `human_input` |
+| مسلمة `AgentWorkflow` | `agent_start` متداخل، `agent_end` لكل وكيل، مرتبط بسير العمل |
+| الاستثناء | `error`، ثم `agent_end` مع النتيجة `failed`، و`agent_end.summary` يسميها |
+| `handler.cancel_run()` | `agent_end` مع النتيجة `cancelled` وبدون `error` — زر الإيقاف ليس فشلاً |
+
+`agent_id` هو `FunctionAgent.name` عندما تحدده، واسم فئة سير العمل وإلا. تحت `AgentWorkflow`، كل وكيل يأخذ دوره يحصل على امتداده الخاص المتداخل تحت سير العمل، لذا تُقرأ المسلمة كوكيلين بدلاً من واحد.
+
+الناتج من الاسترجاع مختصر بدلاً من أن يُرمى. يعيد المسترجع المستندات، وتخزينها في الحمل سيضع مجموعة النصوص الخاصة بك في مخزن الأحداث مرة واحدة لكل استعلام. يتم الاحتفاظ بالعدد، نطاق النقاط، والمقاطع المختصرة بدلاً من ذلك.
+
+## مثال
+
+```python
+import asyncio
+
+import failproofai_sdk
+from llama_index.core.agent.workflow import FunctionAgent
+from llama_index.core.tools import FunctionTool
+from llama_index.llms.openai import OpenAI
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+POP = {"tokyo": "37M", "delhi": "33M"}
+AREA = {"tokyo": "2,194 km2", "delhi": "1,484 km2"}
+
+
+def population(city: str) -> str:
+ """Population of a city. Valid: tokyo, delhi."""
+ return POP.get(city.lower().strip(), "unknown")
+
+
+def area(city: str) -> str:
+ """Land area of a city. Valid: tokyo, delhi."""
+ return AREA.get(city.lower().strip(), "unknown")
+
+
+async def main():
+ agent = FunctionAgent(
+ name="city_analyst",
+ tools=[
+ FunctionTool.from_defaults(fn=population),
+ FunctionTool.from_defaults(fn=area),
+ ],
+ llm=OpenAI(
+ model="gpt-4o-mini",
+ additional_kwargs={"stream_options": {"include_usage": True}},
+ ),
+ system_prompt="Use the tools. Be terse.",
+ )
+
+ async with failproofai_sdk.session():
+ async with failproofai_sdk.agent("city_analyst", goal="compare two cities"):
+ print(await agent.run("Compare Tokyo and Delhi on population and area."))
+
+
+asyncio.run(main())
+```
+
+تظهر حلقة الوكيل في التتبع كأزواج hook: `init_run`، `setup_agent`، `run_agent_step`، `parse_agent_output`، `call_tool`، و`aggregate_tool_results`. إنها حلقة الإطار نفسه، لذا فهي hooks بدلاً من وكلاء، مما يحافظ على معنى `agent_id`.
+
+## سمِّ امتدادك
+
+`agent_id` هو `FunctionAgent.name` عندما تحدده، واسم فئة سير العمل وإلا.
+
+```python
+FunctionAgent(name="city_analyst", tools=[...], llm=llm) # agent_id = "city_analyst"
+```
+
+في `AgentWorkflow`، هذا الاسم هو أيضاً ما يتم تسجيل كل مسلمة تحته:
+
+```text
+AgentWorkflow امتداد الأب
+├─ city_analyst الدور 1
+├─ cost_analyst الدور 2
+└─ city_analyst الدور 3 — دور جديد، وليس دور معاد فتحه
+```
+
+إذاً `agent_id` يخبرك **أي وكيل** قام بالعمل و`parent_id` يخبرك **أي سير عمل** انتمى إليه. يفتح الوكيل الذي يسلم التحكم لاحقاً دوره الثاني بدلاً من إعادة فتح الأول.
+
+لف التشغيل لتجاوزه، أو لتجميع عدة وكلاء تحت أب واحد:
+
+```python
+async with failproofai_sdk.agent("research", goal="compare two cities"):
+ await agent.run(...)
+```
+
+أبق `agent_id` ذو كاردينالية منخفضة. إنها الجانب الأساسي على كل سطح لوحة معلومات، لذا استخدم دوراً أو اسم سير عمل، لا تستخدم UUID أو سلسلة لكل تشغيل.
+
+## تحكم في الجلسة
+
+هذا المحول **لا يأخذ خيار `session_id`**. تأتي الجلسة من النطاق المحيط، وإلا `uuid4().hex` مُولدة لكل تشغيل سير عمل:
+
+```python
+async with failproofai_sdk.session(f"chat-{user_id}"):
+ await agent.run(...)
+```
+
+## الخيارات
+
+```python
+failproofai_sdk.instrument(
+ "llama_index",
+ embeddings=False, # True يسجل استدعاءات التضمين كأزواج أدوات
+ steps=True, # False يسقط أزواج hook خطوة سير العمل
+ capture_messages=True, # False يسقط EVERY الحمل: المحفزات، الإكمالات،
+ # وسائط الأداة والناتج، إدخال وإخراج الخطوة، استعلامات
+ # الاسترجاع، الهدف والإجابة النهائية
+ capture_limit=8192, # الأحرف المحتفظ بها لكل قيمة مقبوضة
+ stale_after=600.0, # ثواني قبل إغلاق أوراق الشجر المهجورة بقوة
+ reaper_interval=30.0, # عدد مرات كنس الحاصد؛ 0 يعطله
+)
+```
+
+| الخيار | لماذا قد تغيره |
+| --- | --- |
+| `embeddings` | قم بالتشغيل فقط عند تصحيح كمون أو تكلفة التضمين. بناء فهرس مجموعي هو آلاف الاستدعاءات وسيدفن المخطط الزمني. |
+| `steps` | أطفئه إذا كنت تريد فقط أحداث النموذج والأداة وتجد حلقة الوكيل مزعجة. |
+| `capture_messages` | أطفئه للبيانات المنظمة. كل حمل يتوقف عن التسجيل — المحفزات، إكمال النموذج، وسائط الأداة وقيم الإرجاع، إدخال وإخراج خطوة سير العمل، استعلامات الاسترجاع، هدف الوكيل وإجابته النهائية. الهيكل والتوقيتات والرموز والنتائج لا تزال مسجلة. |
+| `capture_limit` | الأحرف المحتفظ بها لكل قيمة مقبوضة قبل الاقتطاع. ارفعه عندما يصل محفز RAG أو السياق المسترجع مقطوعاً. |
+| `stale_after` | الثواني قبل إغلاق ورقة شجر مهجورة بقوة — استجابة بث لم يستهلكها أحد، امتداد نموذج أو أداة لم يصل إغلاقه — بحيث تستقر الجلسة بدلاً من قراءة `ongoing` للأبد. هذا **لا** يغلق التشغيل المهجور نفسه: سير عمل تم إلغاء مهمته دون أن يرى الموزع مخرجاً يحتفظ بـ `agent_start` مفتوح حتى `uninstrument()`. |
+| `reaper_interval` | تكرار المسح. اضبطه على `0` لتعطيل الحاصد كلياً. |
+
+## الإنسان في الحلقة
+
+يتم الالتقاط عند حدوث الانتظار داخل أداة:
+
+```python
+async def ask_human(question: str) -> str:
+ """Ask a person and wait for their answer."""
+ response = await ctx.wait_for_event(HumanResponseEvent)
+ return response.answer
+```
+
+`ctx.wait_for_event` في خطوة سير عمل عادية لا يتم التقاطها. يمسك وقت التشغيل بالقطرة قبل وصولها للموزع، لذا تخرج الخطوة وتعاد لاحقاً بدون إشارة لمفتاح الإيقاف عليها. نمط FunctionAgent، الذي توثقه LlamaIndex، ينتظر داخل أداة ويتم التقاطه بالكامل.
+
+## مشاكل شائعة
+
+
+
+ أضف `additional_kwargs={"stream_options": {"include_usage": True}}` إلى نموذجك. انظر [عدد الرموز](#token-counts).
+
+
+
+ LlamaIndex لا يملك حقل استخدام قياسي. يحاول المحول عدة أشكال معروفة، والتكامل الذي يسمي العدادات الخاصة به بشيء جديد لن يطابق أي منها.
+
+ يشحن القاموس الخام دائماً، لذا تحقق من `usage` في الحمل لترى ما سماه مزودك.
+
+ `usage` مملوء بجانب أعمدة رموز فارغة مقصود — يفوق عدداً خاطئاً واثقاً.
+
+
+
+ هذه حلقة FunctionAgent، مجموعة واحدة لكل تكرار. صفِّ حسب اسم hook على لوحة المعلومات. توقيتات الخطوة هذه عادة ما تكون السبب لاستخدام هذا المحول بدلاً من محول نموذج فقط.
+
+
+
+ تحقق بهذا الترتيب: `instrument()` تم تشغيله قبل التشغيل؛ هناك `async with failproofai_sdk.session():` حول `await`؛ `llama-index-core` هو 0.14.23 أو أحدث؛ `FAILPROOFAI_SDK_STRICT=1` مضبوط، لذا يرفع hook متدهور بدلاً من أن يبتلع.
+
+
+
+## التالي
+
+
+
+ الأزواج والمعرفات ودورة حياة الجلسة والتسليم.
+
+
+ اتبع السببية عبر الجلسة التي استقطتها للتو.
+
+
+ LangGraph، CrewAI، Pydantic AI، والوكلاء المخصصين.
+
+
\ No newline at end of file
diff --git a/docs/ar/start/integrations/pydantic-ai.mdx b/docs/ar/start/integrations/pydantic-ai.mdx
new file mode 100644
index 000000000..1474a95be
--- /dev/null
+++ b/docs/ar/start/integrations/pydantic-ai.mdx
@@ -0,0 +1,208 @@
+---
+title: "Pydantic AI"
+sidebarTitle: "Pydantic AI"
+description: "أدوات تجسيد العملاء المكتوبة والأدوات واستدعاءات النموذج والمحاولات المتكررة."
+icon: "/images/frameworks/pydantic-ai.svg"
+---
+
+## التثبيت
+
+```bash
+pip install 'failproofai-sdk[pydantic-ai]'
+```
+
+مدعوم: `pydantic-ai-slim` 2.0 إلى 3.0. أزال الإصدار 2.0 `Agent(instrument=...)` وأدخل بروتوكول الإمكانيات الذي يُبنى عليه هذا المحول، لذلك لا يمكن تجسيد 1.x بهذه الطريقة.
+
+## التجسيد
+
+```python
+import failproofai_sdk
+from pydantic_ai import Agent
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument() # قبل بناء أي Agent
+
+agent = Agent("openai:gpt-4o-mini", system_prompt="Be terse.")
+
+with failproofai_sdk.session():
+ result = agent.run_sync("...")
+```
+
+
+ يجب أن يتم تشغيل `instrument()` قبل بناء `Agent`. تُضاف الإمكانية عند البناء، لذا فإن وكيل مبني مسبقاً لا يحمل أي إمكانية ولا يسجل شيئاً، بدون خطأ لأنه لم يحدث شيء خاطئ. هذا هو السبب الأكثر شيوعاً للحصول على تتبع فارغ مع هذا المحول.
+
+
+الوكلاء في نطاق الوحدة هم حيث يحدث المشكلة:
+
+```python
+# agents.py
+agent = Agent("openai:gpt-4o-mini") # مبني في وقت الاستيراد
+
+# main.py
+import failproofai_sdk
+failproofai_sdk.instrument() # شغل هذا أولاً
+import agents # الآن يحصل الوكيل على الإمكانية
+```
+
+تأكد من أنه نجح:
+
+```python
+print([type(c).__name__ for c in agent.root_capability.capabilities])
+# ['FailproofAI', 'ToolSearch', 'PendingMessageDrainCapability']
+```
+
+يدمج Pydantic AI القائمة التي تمررها في `root_capability` واحد، لذا لا توجد خاصية `agent.capabilities` للقراءة.
+
+الوكلاء المبنيون أثناء التجسيد يحافظون على الإمكانية، لذا يمكنك `uninstrument()` وإعادة التجسيد دون إعادة بناء.
+
+## ما يتم تسجيله
+
+| Pydantic AI | حدث Failproof |
+| --- | --- |
+| تشغيل الوكيل | `agent_start`, `agent_end` |
+| طلب النموذج | `model_request`, `model_response`، مع استخدام الرموز |
+| استدعاء الأداة | `tool_use`, `tool_result`، مع المعاملات التي أرسلها النموذج |
+| `ModelRetry` من أداة | `tool_result` يحمل خطأ |
+| استثناء غير معالج | `error`، ثم `agent_end` بنتيجة `failed` |
+
+لا توجد زوج خطاف ولا زوج موارد بشرية هنا. Pydantic AI لا يحتوي على حد عقدة أو خطوة ليتم وضع قوس حوله ولا توقف بشري مدمج، لذا لا يوجد شيء للتعيين. إذا بنيت أياً منهما، أطلق الأحداث بنفسك — انظر [Custom agents](/ar/reference/custom-agents).
+
+`output_type` لا يختلف عن التتبع. تشغيل مكتوب وتشغيل سلسلة ينتجان نفس الأحداث.
+
+## مثال
+
+```python
+import failproofai_sdk
+from pydantic import BaseModel
+from pydantic_ai import Agent, ModelRetry
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+PRICE = {"widget": 42.0, "gadget": 17.5}
+STOCK = {"widget": 120, "gadget": 0}
+
+
+class Report(BaseModel):
+ headline: str
+ out_of_stock: list[str]
+
+
+agent = Agent(
+ "openai:gpt-4o-mini",
+ output_type=Report,
+ system_prompt="Use the tools for every number. If a tool fails, note it and continue.",
+)
+
+
+@agent.tool_plain
+def price_of(item: str) -> float:
+ """Unit price of an item. Valid: widget, gadget."""
+ return PRICE[item.lower().strip()]
+
+
+@agent.tool_plain
+def stock_of(item: str) -> int:
+ """Units in stock. Valid: widget, gadget."""
+ return STOCK[item.lower().strip()]
+
+
+@agent.tool_plain
+def restock_eta(item: str) -> str:
+ """Restock ETA. Not available."""
+ raise ModelRetry(f"no restock schedule for {item!r} — answer without it")
+
+
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("inventory", goal="stock report"):
+ result = agent.run_sync(
+ "For widget and gadget, get price and stock. "
+ "For anything out of stock, try the restock ETA. Then produce the report."
+ )
+```
+
+في التتبع، تظهر `restock_eta` كـ `tool_result` تحمل خطأ، متبوعة باستدعاء نموذج آخر حيث يعمل الوكيل حوله، والتشغيل ينتهي بـ `success`. يتم الاحتفاظ بالحقائق.
+
+## الأخطاء والمحاولات المتكررة والتحكم في التدفق
+
+يرفع Pydantic AI استثناءات لثلاثة أشياء مختلفة، والمحول يفصل بينها:
+
+| الاستثناء | يُعتبر | النتيجة |
+| --- | --- | --- |
+| `ModelRetry`, `ToolRetryError`, `ToolFailedError` | فشل أداة حقيقي | `tool_result` مع خطأ؛ التشغيل قد ينتهي بـ `success` |
+| `SkipToolExecution`, `SkipToolValidation`, `SkipModelRequest`, `CallDeferred`, `ApprovalRequired` | تحكم في التدفق | ليس خطأ؛ يتم توجيه التشغيل |
+| أي شيء آخر | فشل | `error`، ثم `agent_end` بنتيجة `failed` |
+
+`ModelRetry` في المجموعة الأولى عن قصد. يعني أن محاولة فشلت بحقيقة وطُلب من النموذج المحاولة مجدداً، وهذا هو المقصود من حقل خطأ نطاق الأداة. تصنيفها كتحكم في التدفق سيخفي أخطاء الأداة الحقيقية خلف تشغيل أخضر.
+
+## سمّ امتدادات الأحداث الخاصة بك
+
+امتداد التشغيل الخاص بـ Pydantic AI نفسه باسم `agent`. قم بالتفاف الاستدعاء لإعطاؤه تسمية اخترتها:
+
+```python
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("inventory", goal="stock report"):
+ agent.run_sync("...")
+```
+
+امتداد الإطار ثم يتداخل تحت `inventory`، وهذا هو المكان الذي يتعلق به أحداث النموذج والأداة.
+
+احتفظ بـ `agent_id` بتنوع منخفض. إنه الجانب الأساسي على كل سطح لوحة معلومات، لذا استخدم اسم دور، لا تستخدم UUID أو سلسلة لكل تشغيل.
+
+## التحكم في الجلسة
+
+تم حلها بهذا الترتيب، أولى المطابقات تفوز:
+
+1. `instrument("pydantic_ai", session_id=...)`
+2. نطاق `failproofai_sdk.session()` المضمن
+3. `conversation_id` للتشغيل، ثم `run_id` الخاص به
+4. معرف UUID مولّد `uuid4().hex`
+
+```python
+with failproofai_sdk.session(f"chat-{user_id}"):
+ agent.run_sync("...")
+```
+
+## الخيارات
+
+```python
+failproofai_sdk.instrument(
+ "pydantic_ai",
+ session_id=None, # ثبّت كل تشغيل على معرف جلسة واحد
+ capture_content=True, # False يسقط المطالبات والإكمالات من الحمولات
+)
+```
+
+## المشاكل الشائعة
+
+
+
+ تم بناء `Agent` قبل تشغيل `instrument()`. انظر التحذير أعلاه، وتحقق من `agent.root_capability.capabilities`.
+
+
+
+ تنتشر `raise` العارية؛ هذا هو تصميم Pydantic AI. للسماح للنموذج بالعمل حوله، ارفع `ModelRetry` برسالة يمكنه التصرف بناءً عليها. يتم تسجيل الفشل بأي حال.
+
+
+
+ هذا الطفل هو امتداد التشغيل الخاص بـ Pydantic AI، وهذا هو المكان الذي يتعلق به أحداث النموذج والأداة. أسقط نطاقك الخاص إذا كنت تريد امتداداً واحداً، على حساب الاسم المخصص.
+
+
+
+ رسم بياني غير المتزامن من Pydantic AI أطول من حد حقل الحمولة، والسطر الأخير من التتبع هو الاستثناء نفسه. يتم قص هذا الحقل من الأمام وليس من الخلف، لذا يبقى السطر الذي تحتاجه.
+
+
+
+## التالي
+
+
+
+ الأزواج والمعرفات ودورة حياة الجلسة والتسليم.
+
+
+ اتبع السببية من خلال الجلسة التي التقطتها للتو.
+
+
+ LangGraph و CrewAI و LlamaIndex والوكلاء المخصصين.
+
+
\ No newline at end of file
diff --git a/docs/ar/start/quickstart.mdx b/docs/ar/start/quickstart.mdx
index b6b9c2a15..0932384ee 100644
--- a/docs/ar/start/quickstart.mdx
+++ b/docs/ar/start/quickstart.mdx
@@ -1,15 +1,16 @@
---
+---
title: "البدء السريع"
-description: "التقط جلسة وكيل، وجد عطلاً، وابدأ في منعه."
+description: "التقط جلسة وكيل، ابحث عن عطل، وابدأ بمنع حدوثه."
icon: "zap"
---
-يوفر هذا البدء السريع تشغيل جهاز واحد لإرسال الجلسات، وتشغيل تدقيق، ونشر سياسة. استخدم المهارة لإعداد Failproof AI، أو اتبع الخطوات اليدوية.
+يوفر هذا البدء السريع تقريراً من جهاز واحد عن الجلسات، وتشغيل عملية تدقيق، ونشر سياسة. استخدم المهارة لإعداد Failproof AI، أو اتبع الخطوات اليدوية.
-**أي المسارات تناسبك؟** إذا كان وكيلك يعمل في أحد [الأطر المدعومة](/ar/reference/harnesses) الـ 12 — واجهة سطر أوامر برمجية أو بوابة مثل Hermes أو OpenClaw — اتبع الخطوات أدناه؛ تحتاج إلى Node.js 20.9 أو إصدار أحدث. إذا لم يكن لدى وكيلك إطار عمل، فقم بتجهيزه باستخدام [Python SDK](/ar/reference/custom-agents) للتتبع والتدقيق، ثم عد إلى [تشغيل فحص الفشل الأول](/ar/start/first-audit)؛ الإنفاذ في هذا المسار يحتاج إلى hook في وقت التشغيل.
+**أي المسار يناسبك؟** إذا كان وكيلك يعمل في أحد الأدوات 12 المدعومة [harnesses](/ar/reference/harnesses) — واجهة أوامر للبرمجة أو بوابة مثل Hermes أو OpenClaw — اتبع الخطوات أدناه؛ تحتاج إلى Node.js 20.9 أو أحدث. إذا كان وكيلك لا يملك أداة، قم بتجهيزه باستخدام [Python SDK](/ar/reference/custom-agents) للتتبع والتدقيق، ثم عد إلى [تشغيل فحص الفشل الأول](/ar/start/first-audit)؛ يتطلب التنفيذ في هذا المسار خطاف في وقت التشغيل الخاص بك.
-
+
```bash
@@ -21,16 +22,16 @@ icon: "zap"
Set up Failproof AI for this project, connect this machine, install the right hooks and policies, and verify that a session arrives.
```
- يتفحص وكيلك المشروع، ويختار التكامل ذا الصلة، ويجري الإعداد، ويتحقق منه. راجع [مستودع مهارات FailproofAI](https://github.com/FailproofAI/skills) للحصول على المهارات الفردية وخيارات التثبيت المتقدمة.
+ يفحص وكيلك المشروع، ويختار التكامل ذا الصلة، ويقوم بالإعداد، والتحقق منه. انظر إلى [مستودع مهارات FailproofAI](https://github.com/FailproofAI/skills) للمهارات الفردية وخيارات التثبيت المتقدمة.
- ## قبل أن تبدأ
+ ## قبل البدء
-1. افتح [لوحة تحكم Failproof AI](https://app.befailproof.ai) وأنشئ حساباً أو سجل الدخول باستخدام بريدك الإلكتروني للعمل.
+1. افتح [لوحة تحكم Failproof AI](https://app.befailproof.ai) وأنشئ حساباً أو سجل الدخول ببريدك الإلكتروني للعمل.
2. انتقل إلى **Administration → Keys** وأنشئ مفتاحاً باستخدام `events:add` و `policies:pull`.
-3. انسخ السر لمرة واحدة وقم بتخزينه على الجهاز المستهدف:
+3. انسخ السر لمرة واحدة واحفظه على الجهاز المستهدف:
```bash
export FAILPROOFAI_KEY=""
@@ -39,15 +40,15 @@ export FAILPROOFAI_KEY=""
## التثبيت
-
+
```bash
npm install -g failproofai
failproofai config --connect https://app.befailproof.ai --token "$FAILPROOFAI_KEY"
```
- يتم إرسال نصوص الجلسات بشكل افتراضي. أضف `--no-transcripts` للإبلاغ عن نشاط hook وقرارات السياسة دون محتوى النص.
+ يتم إرسال نصوص الجلسة بشكل افتراضي. أضف `--no-transcripts` للإبلاغ عن نشاط الخطاف وقرارات السياسة دون محتوى النصوص.
- إذا كان لدى هذا الجهاز بالفعل سجل وكيل، معاينة واستيراد آخر سبعة أيام، ثم انتظر انتهاء التسليم. تخطَّ هذه الخطوة على جهاز جديد.
+ إذا كان هذا الجهاز يحتوي بالفعل على سجل وكيل، معاينة واستيراد آخر سبعة أيام، ثم انتظر انتهاء التسليم. تخطى هذه الخطوة على جهاز جديد.
```bash
failproofai backfill --since 7d --dry-run
@@ -55,30 +56,30 @@ export FAILPROOFAI_KEY=""
failproofai flush --wait
```
- افتح **Sessions** في Failproof AI واختر جلسة مستوردة.
+ افتح **Sessions** في Failproof AI وحدد جلسة مستوردة.
-
- يربط Failproof AI بإطار العمل الخاص بك وينصب السياسات المدمجة الـ 40. استخدمها لرؤية قرارات السياسة المحلية وجرب الإنفاذ قبل أن يقوم Failproof AI بتدقيق جلساتك وكتابة السياسات لوكلائك.
+
+ يقوم هذا بربط Failproof AI بأداتك وتثبيت 40 سياسة مدمجة. استخدمها لرؤية قرارات السياسة المحلية وتجربة التنفيذ قبل أن يقوم Failproof AI بتدقيق جلساتك وكتابة السياسات لوكلائك.
- دع المثبت يكتشف إطار العمل الخاص بك، أو قم بتسمية واحد صراحةً. كل واحد من الـ 12 هو قيمة `--cli` صحيحة — `claude`، `codex`، `copilot`، `cursor`، `opencode`، `pi`، `hermes`، `openclaw`، `factory`، `devin`، `antigravity`، `goose`.
+ دع برنامج التثبيت يكتشف أداتك، أو قم بتسمية واحدة صراحة. كل واحد من الـ 12 هو قيمة `--cli` صحيحة — `claude`و`codex`و`copilot`و`cursor`و`opencode`و`pi`و`hermes`و`openclaw`و`factory`و`devin`و`antigravity`و`goose`.
```bash
failproofai policies --install --cli claude --scope user # a coding CLI
failproofai policies --install --cli hermes --scope user # a Slack/Telegram gateway
```
- يتم التحقق من حظر استدعاء أداة قبل تشغيله في جميع الـ 12. يتم التحقق من بوابات نهاية الدور في 8 — راجع [قدرة الإنفاذ](/ar/reference/harnesses#enforcement-capability) للحصول على مصفوفة لكل إطار عمل.
+ يتم التحقق من حجب استدعاء أداة قبل تشغيله على الأدوات الـ 12 جميعها. يتم التحقق من بوابات نهاية الدور على 8 — انظر [القدرة على التنفيذ](/ar/reference/harnesses#enforcement-capability) للمصفوفة لكل أداة.
-
- اتبع [تشغيل فحص الفشل الأول](/ar/start/first-audit). استخدم هدفاً ملموساً مثل "ابحث عن الجلسات حيث أعاد الوكيل محاولة أداة فاشلة دون تغيير نهجه."
+
+ اتبع [تشغيل فحص الفشل الأول](/ar/start/first-audit). استخدم هدفاً محدداً مثل "ابحث عن الجلسات حيث أعاد الوكيل محاولة أداة فاشلة دون تغيير نهجه."
- اتبع [منع فشلك الأول بسياسة](/ar/start/first-policy). ابدأ بوضع المراقبة، افحص المطابقات، ثم طبق الإصدار المراجع.
+ اتبع [منع الفشل الأول باستخدام سياسة](/ar/start/first-policy). ابدأ في وضع المراقبة، افحص المطابقات، ثم نفذ الإصدار المراجع.
- قم بتشغيل `failproofai config --status`. يبلغ الإعداد الصحي عن اتصال السحابة وحالة daemon وما إذا كان الإنفاذ معلقاً.
+ شغّل `failproofai config --status`. يقدم الإعداد الصحي تقرير الاتصال بالسحابة وحالة الخادم والقوى العاملة وما إذا كان التنفيذ موقوفاً.
\ No newline at end of file
diff --git a/docs/ar/start/quickstarts/crewai.mdx b/docs/ar/start/quickstarts/crewai.mdx
new file mode 100644
index 000000000..d948814b2
--- /dev/null
+++ b/docs/ar/start/quickstarts/crewai.mdx
@@ -0,0 +1,38 @@
+---
+---
+title: "CrewAI"
+description: "قم بالتثبيت والمراقبة وشاهد أول تتبع لك."
+icon: "/images/frameworks/crewai.svg"
+---
+
+ثلاث خطوات للوصول إلى أول تتبع CrewAI الخاص بك. لمعرفة ما يحمله كل حدث والتدفقات واستكشاف الأخطاء، اطلع على [الدليل الكامل](/ar/start/integrations/crewai).
+
+## التثبيت
+
+```bash
+pip install 'failproofai-sdk[crewai]'
+```
+
+## المراقبة
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+with failproofai_sdk.session():
+ Crew(agents=[analyst, writer], tasks=[gather, summarise]).kickoff()
+```
+
+لا يتغير شيء في فريقك أو الوكلاء أو المهام أو الأدوات. تقوم `instrument()` بالاشتراك في حافلة الأحداث على مستوى الوحدة في CrewAI.
+
+## تحقق من وصوله
+
+قم بتشغيله مرة واحدة، ثم افتح **Observe → Sessions** وحدد بيئتك. ستظهر عملية التشغيل الخاصة بك كتتبع معاد بناؤه.
+
+إذا لم يصل شيء، تأكد من اتصال الجهاز باستخدام `failproofai config --status`.
+
+
+ ما يتم تسجيله والتدفقات واستخدام الرموز وتسمية الامتدادات والخيارات والمشاكل الشائعة.
+
\ No newline at end of file
diff --git a/docs/ar/start/quickstarts/custom-agents.mdx b/docs/ar/start/quickstarts/custom-agents.mdx
new file mode 100644
index 000000000..e5b6d2347
--- /dev/null
+++ b/docs/ar/start/quickstarts/custom-agents.mdx
@@ -0,0 +1,51 @@
+---
+---
+title: "وكلاء مخصصون"
+description: "غلّف وكيلك في ثلاث كتل `with` وسيبدأ التسجيل."
+icon: "code"
+---
+
+لوكيل كتبته بنفسك، أو إطار عمل لا يملك Failproof AI محول له.
+
+تغلّف العمل الذي تقوم به بالفعل في كتل `with`. كل واحد منها يسجل متى بدأ، ومتى انتهى، والوقت المستغرق — لا تستدعي أي شيء آخر.
+
+## التثبيت
+
+```bash
+pip install failproofai-sdk
+```
+
+لا توجد إضافات، وبدون متطلبات.
+
+## الأداة
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+
+with failproofai_sdk.session(): # one run
+ with failproofai_sdk.agent("planner"): # one unit of work
+ with failproofai_sdk.tool_call("search", input={"q": q}) as t:
+ t.output = search(q) # one tool call
+```
+
+اقرأه من الأعلى للأسفل وسيخبرك بما يعنيه:
+
+| غلّفه في | للقول |
+| --- | --- |
+| `session()` | هذه الأحداث تنتمي إلى نفس التشغيل |
+| `agent()` | شيء ما يقوم بعمل — أعطه اسماً ستتعرف عليه في القائمة |
+| `tool_call()` | هذا هو أداة واحدة، وإليك ما أرجعته |
+
+غلّفها بأي طريقة يتداخل بها الكود. لا تمرر المعرفات حول: كل كتلة تتذكر ما بداخلها، لذا أي شيء تسجله يلتقط التشغيل الصحيح والوكيل الصحيح تلقائياً. `async with` يعمل بنفس الطريقة تماماً.
+
+## تحقق من وصوله
+
+شغّله مرة واحدة، ثم افتح **Observe → Sessions** واختر بيئتك. سيظهر تشغيلك كأثر مُعاد بناؤه.
+
+إذا لم يصل شيء، تأكد من اتصال الجهاز باستخدام `failproofai config --status`.
+
+
+ كل طريقة حدث، ما يحدث عندما يرفع الكود استثناء، مثال عملي، الخيوط والعمليات غير المتزامنة، وأداة إطار عمل بدون محول.
+
\ No newline at end of file
diff --git a/docs/ar/start/quickstarts/langchain.mdx b/docs/ar/start/quickstarts/langchain.mdx
new file mode 100644
index 000000000..b16ccee4b
--- /dev/null
+++ b/docs/ar/start/quickstarts/langchain.mdx
@@ -0,0 +1,40 @@
+---
+---
+title: "LangChain و LangGraph"
+description: "التثبيت والأداة والحصول على أول تتبع لديك."
+icon: "/images/frameworks/langchain.svg"
+---
+
+ثلاث خطوات للحصول على أول تتبع LangChain أو LangGraph لديك. لمعرفة المزيد عن البث والتدخل البشري وتسمية الامتدادات والخيارات، اطّلع على [الدليل الكامل](/ar/start/integrations/langchain).
+
+## التثبيت
+
+```bash
+pip install 'failproofai-sdk[langgraph]'
+```
+
+لـ LangChain بدون LangGraph، استخدم `failproofai-sdk[langchain]`.
+
+## الأداة
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+with failproofai_sdk.session():
+ graph.invoke({"messages": [HumanMessage("...")]})
+```
+
+لا توجد تغييرات في موقع الاستدعاء. تسجل `instrument()` أداة تتبع يحقنها LangChain في كل مدير استدعاء ينشئه، لذلك يتم التقاط الرسوم البيانية والأدوات والنماذج — بما في ذلك تلك الموجودة داخل المكتبات التي لم تكتبها.
+
+## تحقق من وصولها
+
+قم بتشغيله مرة واحدة، ثم افتح **Observe → Sessions** واختر بيئتك. يظهر التشغيل لديك كأثر معاد بناؤه.
+
+إذا لم يصل شيء، تأكد من أن الجهاز متصل باستخدام `failproofai config --status`.
+
+
+ ما يتم تسجيله والبث وعدد الرموز وتسمية الامتدادات والتحكم في الجلسة والخيارات والتدخل البشري.
+
\ No newline at end of file
diff --git a/docs/ar/start/quickstarts/llamaindex.mdx b/docs/ar/start/quickstarts/llamaindex.mdx
new file mode 100644
index 000000000..ebe8a41cc
--- /dev/null
+++ b/docs/ar/start/quickstarts/llamaindex.mdx
@@ -0,0 +1,48 @@
+---
+title: "LlamaIndex"
+description: "ثبّت وأدرج وشاهد أول تتبع لك."
+icon: "/images/frameworks/llamaindex.svg"
+---
+
+ثلاث خطوات للوصول إلى أول تتبع LlamaIndex لديك. للاطلاع على خطوات سير العمل والاسترجاع والخيارات، راجع [الدليل الكامل](/ar/start/integrations/llamaindex).
+
+## التثبيت
+
+```bash
+pip install 'failproofai-sdk[llamaindex]'
+```
+
+## الإدراج
+
+واجهة برمجة تطبيقات عامل LlamaIndex غير متزامنة. كل نطاق يعمل تحت `async with` وكذلك `with`.
+
+```python
+import asyncio
+
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+
+async def main():
+ async with failproofai_sdk.session():
+ await agent.run("...")
+
+
+asyncio.run(main())
+```
+
+
+ بدون حجة إضافية واحدة على نموذجك اللغوي، كل عدد رموز في تتبعك يكون فارغًا — `llama-index-llms-openai` لا يطلب الاستخدام عند البث. انظر [عدد الرموز](/ar/start/integrations/llamaindex#token-counts).
+
+
+## تحقق من وصوله
+
+قم بتشغيله مرة واحدة، ثم افتح **Observe → Sessions** واختر بيئتك. يظهر تشغيلك كتتبع معاد بناؤه.
+
+إذا لم يصل شيء، أكد أن الآلة متصلة باستخدام `failproofai config --status`.
+
+
+ عدد الرموز وما يتم تسجيله وخطوات سير العمل والاسترجاع والخيارات والمشاكل الشائعة.
+
\ No newline at end of file
diff --git a/docs/ar/start/quickstarts/pydantic-ai.mdx b/docs/ar/start/quickstarts/pydantic-ai.mdx
new file mode 100644
index 000000000..3028f5003
--- /dev/null
+++ b/docs/ar/start/quickstarts/pydantic-ai.mdx
@@ -0,0 +1,42 @@
+---
+title: "Pydantic AI"
+description: "ثبّت وأدرج وشاهد أول تتبع لك."
+icon: "/images/frameworks/pydantic-ai.svg"
+---
+
+ثلاث خطوات للوصول إلى أول تتبع Pydantic AI. للأدوات والمحاولات الجديدة والبث والخيارات، انظر [الدليل الكامل](/ar/start/integrations/pydantic-ai).
+
+## التثبيت
+
+```bash
+pip install 'failproofai-sdk[pydantic-ai]'
+```
+
+## الإدراج
+
+```python
+import failproofai_sdk
+from pydantic_ai import Agent
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument() # before constructing any Agent
+
+agent = Agent("openai:gpt-4o-mini", system_prompt="Be terse.")
+
+with failproofai_sdk.session():
+ result = agent.run_sync("...")
+```
+
+
+ يجب أن يعمل `instrument()` **قبل** أن تقوم بإنشاء `Agent`. تُضاف الإمكانية عند الإنشاء، لذلك الوكيل المبني مسبقاً لن يسجل أي شيء — بدون أخطاء، لأن لا شيء حدث بشكل خاطئ. هذا هو السبب الأكثر شيوعاً لتتبع فارغ مع هذا المحول، والوكلاء في نطاق الوحدة هم حيث يحدث المشكلة: استورد failproofai_sdk واستدعِ `instrument()` قبل استيراد الوحدة التي تبنيهم.
+
+
+## تحقق من وصوله
+
+شغّله مرة واحدة، ثم افتح **Observe → Sessions** واختر بيئتك. يظهر تشغيلك كتتبع معاد بناؤه.
+
+إذا لم يصل شيء، تأكد من اتصال الجهاز بـ `failproofai config --status`.
+
+
+ ما يتم تسجيله والأدوات والمحاولات الجديدة والبث وتسمية الامتدادات والخيارات والمشاكل الشائعة.
+
\ No newline at end of file
diff --git a/docs/de/index.mdx b/docs/de/index.mdx
index ea94372ad..341f2856d 100644
--- a/docs/de/index.mdx
+++ b/docs/de/index.mdx
@@ -1,41 +1,41 @@
---
-title: "Mach deinen Agenten ausfallsicher"
-description: "Observability und Durchsetzung für jede Umgebung, in der deine Agenten laufen — Coding-CLIs, Chat-Gateways, selbstgehostete Assistenten und eigene instrumentierte Agenten."
+title: "Machen Sie Ihren Agenten fehlersicher"
+description: "Observability und Durchsetzung für jede Harness, in der Ihre Agenten laufen — Coding-CLIs, Chat-Gateways, selbst gehostete Assistenten und Ihre eigenen instrumentierten Agenten."
icon: "shield-check"
---
-Failproof AI hilft Teams dabei zu verstehen, was Agenten getan haben, herauszufinden, wo sie gescheitert sind, und Schutzmaßnahmen einzurichten, bevor dasselbe Verhalten erneut auftritt.
+Failproof AI hilft Teams dabei zu verstehen, was Agenten getan haben, wo sie gescheitert sind, und Sicherheitsmechanismen zu implementieren, bevor dasselbe Verhalten erneut auftritt.
-Ein **Harness** ist die Umgebung, in der dein Agent tatsächlich ausgeführt wird. Failproof AI unterstützt 12 davon — Coding-CLIs wie Claude Code und Codex, Chat-Gateways wie Hermes, selbstgehostete Assistenten wie OpenClaw — und dieselben Ereignisse, dieselben Richtlinien und dieselbe Sitzungshistorie gelten für alle. Agenten ohne Harness melden sich über das [Python SDK](/de/reference/custom-agents) an, das sie verfolgt und prüft; die Durchsetzung einer Richtlinie dort erfordert einen Hook in deiner eigenen Laufzeitumgebung.
+Eine **Harness** ist das, in dem Ihr Agent tatsächlich ausgeführt wird. Failproof AI bindet 12 davon ein — Coding-CLIs wie Claude Code und Codex, Chat-Gateways wie Hermes, selbst gehostete Assistenten wie OpenClaw — und dieselben Events, dieselben Policies und dieselbe Session-Historie gelten für alle. Agenten ohne Harness berichten über das [Python SDK](/de/reference/custom-agents), das sie trackt und auditiert; um dort eine Policy durchzusetzen, wird ein Hook in Ihrer eigenen Runtime benötigt.
- Nutze die Skill-Funktion, um dein Projekt zu instrumentieren, es zu verbinden und zu überprüfen, dass Agenten-Logs ankommen.
+ Nutzen Sie die Skill, um Ihr Projekt zu instrumentieren, es zu verbinden und zu überprüfen, ob Agent-Logs ankommen.
- Analysiere, frage ab, erstelle Dashboards und führe Audits in natürlicher Sprache auf deinen Agenten-Logs durch.
+ Analysieren, abfragen, Dashboards erstellen und Audits in natürlicher Sprache auf Ihren Agent-Logs durchführen.
- Verfolge Modellaufrufe, Tools, Fehler, menschliche Eingaben, Latenz und Richtlinienentscheidungen in einer einzigen Sitzung.
+ Modellaufrufe, Tools, Fehler, Benutzereingaben, Latenz und Policy-Entscheidungen in einer einzigen Session nachverfolgen.
- Prüfe eine definierte Menge von Sitzungen, überprüfe evidenzbasierte Befunde und verfolge die Behebung als Issues.
+ Eine definierte Menge von Sessions auditieren, beleggestützte Findings prüfen und die Behebung als Issues verfolgen.
- Wandle einen bekannten Fehlerfall in eine Richtlinie um, beobachte ihre Wirkung und setze sie in deiner gesamten Flotte ein.
+ Einen bekannten Fehlerfall in eine Policy umwandeln, deren Auswirkung beobachten und sie in Ihrer gesamten Fleet deployen.
-> **Sitzung → Audit → Befund → Issue → Richtlinie**
-> Verfolge, was passiert ist, finde den Fehler, steuere die Reaktion und verhindere dasselbe Verhalten in zukünftigen Ausführungen.
+> **Session → Audit → Finding → Issue → Policy**
+> Nachvollziehen, was passiert ist, den Fehler finden, die Reaktion steuern und dasselbe Verhalten in zukünftigen Läufen verhindern.
-## Hier starten
+## Hier beginnen
-Wenn du deinen ersten instrumentierten Agenten bereitstellst, beginne mit dem [Quickstart](/de/start/quickstart). Wenn bereits Daten eingehen, öffne [Sessions](/de/sessions/overview) und untersuche einen echten Durchlauf, bevor du Audits oder Richtlinien konfigurierst.
+Wenn Sie Ihren ersten instrumentierten Agenten deployen, starten Sie mit dem [Quickstart](/de/start/quickstart). Wenn bereits Daten eintreffen, öffnen Sie [Sessions](/de/sessions/overview) und untersuchen Sie einen echten Lauf, bevor Sie Audits oder Policies konfigurieren.
- Durchlaufe den End-to-End-Workflow von der Erfassung bis zur sicher eingesetzten Richtlinie.
+ Den End-to-End-Workflow von der Erfassung bis zu einer sicher deployten Policy durchführen.
\ No newline at end of file
diff --git a/docs/de/policies/deploy.mdx b/docs/de/policies/deploy.mdx
index 9ec02976a..cde4384ab 100644
--- a/docs/de/policies/deploy.mdx
+++ b/docs/de/policies/deploy.mdx
@@ -1,47 +1,51 @@
---
-title: "Richtlinien deployen"
-description: "Eine geprüfte Richtlinienversion auf die vorgesehenen Maschinen ausrollen."
+title: "Richtlinien bereitstellen"
+description: "Eine geprüfte Richtlinienversion auf den vorgesehenen Maschinen ausrollen."
icon: "cloud-upload"
---
-Ein Deployment verbindet eine oder mehrere Richtlinienversionen mit einer Zielgruppe eingetragener Maschinen.
+Eine Bereitstellung verbindet eine oder mehrere Richtlinienversionen mit einer Zielgruppe eingetragener Maschinen.
-## Ein Deployment anwenden
+## Eine Bereitstellung anwenden
- 1. Gehe zu **Admin → Durchsetzung**, suche die Maschine und klappe ihre Zeile auf.
+ 1. Gehe zu **Admin → Durchsetzung**, finde die Maschine und klappe ihre Zeile aus.
2. Wähle **Bearbeiten**, füge die geprüfte Richtlinienversion hinzu und wähle **Beobachten** oder den durchsetzenden Effekt.
- 3. Wende die Änderung an, warte dann auf das nächste Check-in der Maschine und bestätige ihren Deployment- und Coverage-Status.
- 4. Gehe zu **Beobachten → Richtlinie**, um Live-Entscheidungen einzusehen.
+ 3. Wende die Änderung an, warte dann auf den nächsten Check-in der Maschine und bestätige ihren Bereitstellungs- und Abdeckungsstatus.
+ 4. Gehe zu **Beobachten → Richtlinie**, um Live-Entscheidungen zu prüfen.
- 
+ 
- Cloud-Deployment-Endpunkte sind bewusst nicht als gewöhnliche `fp`-Befehle verfügbar. Überprüfe die Maschine lokal und deploye dann über das Dashboard:
+ Bereitstellen über die CLI mit `fp fleet`. Überprüfe die resultierende Konfiguration, bevor du sie anwendest – `deploy` gibt den vollständigen Plan aus und fragt **nur in einem interaktiven Terminal ohne `--json`** nach. Mit `--json`, mit `--yes` oder bei umgeleitetem stdin (ein CI-Schritt, ein Skript, ein Agent) wird die Konfiguration sofort ohne Plan und ohne Bestätigung angewendet – führe daher zuerst `fp fleet show ` aus, wenn du prüfen möchtest:
```bash
- failproofai config --status
+ fp fleet list
+ fp fleet show
+ fp fleet deploy --add no-force-push
```
- Verwende nach dem Deployment `fp sessions --env production --since 24h` und `fp events --event-type hook_completed`, um zu überprüfen, ob Aktivität die Cloud erreicht.
+ `fp fleet diff ` zeigt Soll-/Ist-Zustand (eine Maschine gilt als `behind`, bis sie das nächste Mal abfragt), `fp fleet history ` listet die Generationen auf, und `fp fleet rollback ` stellt eine davon wieder her – dies schlägt fehl, wenn die betreffende Generation eine inzwischen deaktivierte oder gelöschte Richtlinie referenziert.
+
+ Überprüfe die Maschine selbst mit `failproofai config --status` und nutze nach der Bereitstellung `fp sessions --env production --since 24h` sowie `fp events --event-type hook_completed`, um sicherzustellen, dass Aktivitäten die Cloud erreichen.
-
- Deploye eine geprüfte Version – keinen veränderbaren Entwurf – und beginne mit einer Nicht-Produktionsmaschine oder einer kleinen Gruppe, deren Sitzungen du einsehen kannst.
+
+ Stelle eine geprüfte Version bereit, keinen veränderlichen Entwurf. Beginne mit einer Maschine außerhalb der Produktion oder einer kleinen Gruppe, deren Sitzungen du einsehen kannst.
- Überprüfe Treffer, Begründungen, betroffene Tools und Falsch-Positive, ohne die Arbeit zu blockieren.
+ Prüfe Treffer, Begründungen, betroffene Tools und Fehlerkennungen, ohne die Arbeit zu blockieren.
-
- Stufe hoch, sobald beobachtete Treffer unsichere Aktionen von gültigen trennen, und bestätige dann, dass jede vorgesehene Maschine das Deployment abgerufen hat und Entscheidungen meldet.
+
+ Stufe die Richtlinie hoch, nachdem beobachtete Treffer unsichere Aktionen von gültigen getrennt haben. Bestätige dann, dass jede vorgesehene Maschine die Bereitstellung abgerufen hat und Entscheidungen meldet.
-Maschinen benötigen die Berechtigung `policies:pull`. Das Ereignis-Reporting wird separat durch `events:add` gesteuert; überprüfe beides, wenn du Cloud-Analyse und Durchsetzung erwartest.
+Maschinen benötigen die Berechtigung `policies:pull`. Die Ereignisberichterstattung wird separat durch `events:add` gesteuert; überprüfe beides, wenn du Cloud-Analyse und -Durchsetzung erwartest.
- Die Verwaltung der Durchsetzung ist ein administrativer Cloud-Workflow. Behandle Root-Only-Durchsetzungsrouten nicht als gewöhnliche Kunden-Endpunkte unter `/v1`.
+ Das Enforcement-Management ist ein administrativer Cloud-Workflow. Behandle rein administrative Durchsetzungsrouten nicht wie gewöhnliche Kunden-Endpunkte unter `/v1`.
\ No newline at end of file
diff --git a/docs/de/policies/editor.mdx b/docs/de/policies/editor.mdx
index 146e8a99d..77ab4898a 100644
--- a/docs/de/policies/editor.mdx
+++ b/docs/de/policies/editor.mdx
@@ -1,47 +1,49 @@
---
title: "Policy-Editor"
-description: "Erstellen und überarbeiten Sie versionierte Policies aus einem bestätigten Fehlerfall."
+description: "Erstelle und überarbeite versionierte Richtlinien auf Basis eines bestätigten Fehlermusters."
icon: "file-pen-line"
---
-Verwenden Sie den Policy-Editor, um einen Fund oder ein Problem in eine einsatzfähige Regel umzuwandeln. Halten Sie das Erstellen und das Ausrollen voneinander getrennt, damit ein Entwurf das Live-Verhalten nicht unbemerkt verändern kann.
+Verwende den Policy-Editor, um einen Fund oder ein Problem in eine einsetzbare Regel umzuwandeln. Halte Erstellung und Deployment getrennt, damit ein Entwurf das Live-Verhalten nicht stillschweigend verändern kann.
-Wenn ein Problem ein wiederholbares Aktionsmuster aufweist, öffnen Sie es unter **Analyze → issues** und wählen Sie **generate policy**. Failproof AI erläutert zunächst, ob sich das Problem als Policy ausdrücken lässt, und überträgt dann den geprüften Anlass sowie den Kontext des Funds in den Editor. Der generierte Quellcode bleibt ein Entwurf, bis Sie ihn veröffentlichen.
+Wenn ein Problem ein wiederholbares Aktionsmuster aufweist, öffne es unter **Analyze → issues** und wähle **generate policy**. Failproof AI erklärt zunächst, ob eine Richtlinie das Problem abbilden kann, und überführt dann den geprüften Intent sowie den Fundkontext in den Editor. Die generierte Quelle bleibt so lange ein Entwurf, bis du sie veröffentlichst.
-## Eine Policy-Version veröffentlichen
+## Eine Richtlinienversion veröffentlichen
- 1. Gehen Sie zu **Admin → policy editor** und beschreiben Sie unter **compose** den Fehlerfall, oder fügen Sie den JavaScript-Policy-Quellcode ein.
- 2. Validieren Sie den Quellcode und beheben Sie alle gemeldeten Fehler.
- 3. Geben Sie die Policy-Identität ein und veröffentlichen Sie sie. Verwenden Sie anschließend **library**, um Versionen zu vergleichen oder zu deaktivieren.
- 4. Wählen Sie **enforcement**, wenn die Version für ein maschinelles Rollout bereit ist.
+ 1. Gehe zu **Admin → policy editor** und beschreibe im Bereich **compose** das Fehlermuster, oder füge den JavaScript-Richtlinienquellcode ein.
+ 2. Validiere den Quellcode und behebe alle gemeldeten Fehler.
+ 3. Trage die Richtlinienidentität ein und veröffentliche sie. Nutze anschließend **library**, um Versionen zu vergleichen oder zu deaktivieren.
+ 4. Wähle **enforcement**, sobald die Version für ein maschinelles Rollout bereit ist.
- 
+ 
- Die Cloud CLI veröffentlicht keine Policy-Versionen. Validieren Sie den Quellcode lokal, bevor Sie ihn in den Editor kopieren:
+ Veröffentliche über die CLI mit `fp policies publish`. Dieser Befehl erstellt eine **neue Version** und bearbeitet keine bestehende in-place. Außerdem prüft er den Quellcode syntaktisch mit node, bevor er ihn überträgt – da nachgelagerte Schritte dies nicht tun, würde ein Syntaxfehler sonst erst zur Enforcement-Zeit auf dem Zielsystem auftreten:
```bash
- failproofai policies --install --custom ./checkout.policies.ts \
- --cli claude --scope project
+ fp policies test ./checkout.policy.mjs --command "git push --force" --expect deny
+ fp policies publish checkout-guard ./checkout.policy.mjs --description "Block force-push"
```
- Veröffentlichen Sie die geprüfte Version über **Admin → policy editor**.
+ Das Veröffentlichen deployt nichts – eine neue Version liegt ungenutzt vor, bis `fp fleet deploy` sie auf einem Gerät aktiviert. `fp policies compose ""` entwirft Quellcode mithilfe des Cloud-Assistenten und gibt ihn zur Überprüfung aus, anstatt ihn direkt zu veröffentlichen.
+
+ Um eine Richtlinie stattdessen in eine lokale Agenten-CLI (nicht Cloud) zu installieren, verwende `failproofai policies --install --custom ./checkout.policies.ts --cli claude --scope project`.
## Checkliste für die Erstellung
-1. Benennen Sie den Fehlerfall in operativer Sprache.
-2. Wählen Sie die Hook-Events und Tools aus, die ausreichend Kontext für eine Entscheidung liefern.
-3. Formulieren Sie die engstmögliche Bedingung, die unsicheres Verhalten erkennt.
-4. Geben Sie eine Begründung zurück, die dem Agent oder Operator mitteilt, wie er als Nächstes vorgehen soll.
-5. Fügen Sie Beispiele hinzu, die übereinstimmen sollen, sowie Beispiele, die weiterhin erlaubt bleiben müssen.
-6. Speichern Sie eine neue Version und fordern Sie eine Überprüfung an.
+1. Benenne das Fehlermuster in operativer Sprache.
+2. Wähle die Hook-Events und Tools aus, die ausreichend Kontext für eine Entscheidung liefern.
+3. Formuliere die engstmögliche Bedingung, die unsicheres Verhalten trifft.
+4. Gib eine Begründung zurück, die dem Agenten oder Operator mitteilt, wie weiter vorzugehen ist.
+5. Füge Beispiele hinzu, die übereinstimmen sollen, sowie Beispiele, die weiterhin erlaubt bleiben müssen.
+6. Speichere eine neue Version und fordere eine Überprüfung an.
-Verwenden Sie `instruct`, wenn der Agent sicher korrigieren kann. Verwenden Sie `deny`, wenn das Zulassen der Aktion ein inakzeptables oder unumkehrbares Risiko darstellen würde.
+Verwende `instruct`, wenn der Agent den Kurs sicher korrigieren kann. Verwende `deny`, wenn das Zulassen der Aktion ein inakzeptables oder irreversibles Risiko darstellen würde.
- Policy-Versionen sind unveränderliche Deployment-Eingaben. Das Bearbeiten eines Entwurfs erstellt eine neue Version; dabei sollte die bereits Maschinen zugewiesene Version nicht überschrieben werden.
+ Richtlinienversionen sind unveränderliche Deployment-Eingaben. Das Bearbeiten eines Entwurfs erstellt eine neue Version; bestehende Versionen, die bereits Maschinen zugewiesen sind, sollten nicht überschrieben werden.
\ No newline at end of file
diff --git a/docs/de/reference/cloud-cli.mdx b/docs/de/reference/cloud-cli.mdx
index bea0d6deb..a8ad37f39 100644
--- a/docs/de/reference/cloud-cli.mdx
+++ b/docs/de/reference/cloud-cli.mdx
@@ -1,12 +1,12 @@
---
title: "Failproof Cloud CLI"
-description: "Vollständige Referenz zum Abfragen und Verwalten von Failproof AI Cloud mit fp."
+description: "Vollständige Referenz zur Abfrage und Verwaltung von Failproof AI Cloud mit fp."
icon: "cloud-cog"
---
-Verwende `fp`, um Cloud-Telemetrie zu untersuchen sowie Audits, Findings, Issues, Alerts, Schlüssel, Benutzer, Abfragen und Einstellungen zu verwalten. Nutze [`failproofai`](/de/reference/failproof-cli) für lokale Hooks, Richtlinien, Capture und die Geräteregistrierung.
+Verwende `fp`, um Cloud-Telemetrie einzusehen, cloudseitig verwaltete Durchsetzung (Richtlinien, Fleet-Deployments, Guardrail-Entscheidungen) zu verwalten sowie Audits, Befunde, Issues, Alerts, Schlüssel, Benutzer, Abfragen und Einstellungen zu administrieren. Nutze [`failproofai`](/de/reference/failproof-cli) für lokale Hooks, Richtlinien, Aufzeichnung und Machine-Enrollment.
-Installiere die veröffentlichte Cloud CLI als isoliertes Tool:
+Installiere das veröffentlichte Cloud CLI als isoliertes Tool:
```bash
uv tool install fp-cloud-cli
@@ -26,13 +26,13 @@ fp whoami
fp [GLOBAL_OPTIONS] COMMAND [SUBCOMMAND] [ARGUMENTS] [OPTIONS]
```
-Globale Optionen müssen vor dem Befehl stehen:
+Globale Optionen müssen vor dem Befehl angegeben werden:
```bash
fp --json sessions --since 24h
```
-Führe `fp COMMAND --help` oder `fp COMMAND SUBCOMMAND --help` aus, um die Terminal-Hilfe anzuzeigen.
+Führe `fp COMMAND --help` oder `fp COMMAND SUBCOMMAND --help` aus, um die Terminalhilfe anzuzeigen.
## CLI-Befehle
@@ -40,11 +40,11 @@ Führe `fp COMMAND --help` oder `fp COMMAND SUBCOMMAND --help` aus, um die Termi
| Befehl | Zweck | Optionen |
| --- | --- | --- |
-| `fp login` | Anmelden mit einem per E-Mail zugesandten Einmalcode und Auswählen einer Organisation. | `--email`, `-e`; `--org`; `--force` |
+| `fp login` | Anmelden mit einem per E-Mail zugesandten Einmalcode und Auswahl einer Organisation. | `--email`, `-e`; `--org`; `--force` |
| `fp logout` | Gespeicherte Benutzersitzung widerrufen und entfernen. | — |
| `fp whoami` | Aktuelle Identität, Authentifizierungsmodus, Organisation und Berechtigungen anzeigen. | — |
| `fp version` | Installierte CLI-Version anzeigen. | — |
-| `fp help` | Hilfe auf oberster Befehlsebene anzeigen. | — |
+| `fp help` | Hilfe zu Befehlen auf oberster Ebene anzeigen. | — |
```bash
fp login --email you@example.com --org reliability-team
@@ -57,30 +57,34 @@ fp whoami
fp events [OPTIONS]
```
-Listet einzelne Agenten-Ereignisse auf. Der standardmäßige Light-Feed schließt rohe Payloads aus; verwende `--full` nur für eine begrenzte Untersuchung.
+Listet einzelne Agent-Ereignisse auf. Der standardmäßige einfache Feed schließt Raw-Payloads aus; verwende `--full` nur für eine begrenzte Untersuchung.
| Option | Beschreibung |
| --- | --- |
| `--limit`, `-n ` | Maximale Gesamtzahl der Zeilen. Standard: `50`. |
| `--since ` | `all`, `15m`, `1h`, `6h`, `24h` oder `7d`. |
| `--from ` / `--to ` | ISO 8601 UTC-Bereich; überschreibt `--since`. |
-| `--env ` | Umgebungsfilter; Werte wiederholen oder kommagetrennt angeben. |
-| `--event-type ` | Ereignistypfilter; Werte wiederholen oder kommagetrennt angeben. |
-| `--agent-id ` | Agentenfilter; Werte wiederholen oder kommagetrennt angeben. |
-| `--session-id ` | Sitzungsfilter; Werte wiederholen oder kommagetrennt angeben. |
-| `--search ` | Payload-Textsuche; wiederholbar, ein beliebiger Begriff muss übereinstimmen. |
-| `--order asc\|desc` | Zeitliche Reihenfolge. Standard: neueste zuerst. |
-| `--all` | Automatisch bis zu `--limit` paginieren. |
-| `--cursor ` | Ab einem undurchsichtigen Cursor fortsetzen. |
-| `--page-size ` | Zeilen pro Anfrage mit `--all`; Maximum `200`. |
-| `--full` | Rohe Payloads über den aufwändigeren Ereignis-Endpunkt einschließen. |
-| `--fields ` | Nur ausgewählte Felder zurückgeben; die Anforderung von `payload` aktiviert den vollständigen Modus. |
+| `--env ` | Umgebungsfilter; wiederholbar oder kommagetrennte Werte. |
+| `--event-type ` | Ereignistypfilter; wiederholbar oder kommagetrennte Werte. |
+| `--agent-id ` | Agent-Filter; wiederholbar oder kommagetrennte Werte. |
+| `--session-id ` | Sitzungsfilter; wiederholbar oder kommagetrennte Werte. |
+| `--search ` | Volltextsuche im Payload; wiederholbar, ein beliebiger Begriff reicht. |
+| `--order asc\|desc` | Zeitreihenfolge. Standard: neueste zuerst. |
+| `--all` | Automatische Paginierung bis zu `--limit`. |
+| `--cursor ` | Fortsetzen ab einem undurchsichtigen Cursor. |
+| `--page-size ` | Zeilen pro Anfrage bei `--all`; maximal `200`. |
+| `--full` | Raw-Payloads über den umfangreicheren Ereignis-Endpunkt einschließen. |
+| `--fields ` | Nur ausgewählte Felder zurückgeben; durch Angabe von `payload` wird der Full-Modus aktiviert. |
```bash
-fp events --session-id --order asc --all
-fp --json events --full --session-id --all
+fp events --session-id --order asc --all --limit 10000
+fp --json events --full --session-id --all --limit 10000
```
+
+ `--all` paginiert **bis zu `--limit`**, was standardmäßig **50** ist — daher stoppt `--all` allein bei 50 Zeilen. Wenn es vorzeitig stoppt, enthält die Antwort einen `next_cursor` zum Fortsetzen; `"next_cursor": null` bedeutet, dass der Feed tatsächlich erschöpft ist.
+
+
### Sitzungen
```text
@@ -92,16 +96,16 @@ fp sessions [OPTIONS]
| `--limit`, `-n ` | Maximale Gesamtzahl der Zeilen. Standard: `50`. |
| `--since ` | `all`, `15m`, `1h`, `6h`, `24h` oder `7d`. |
| `--from ` / `--to ` | ISO 8601 UTC-Bereich; überschreibt `--since`. |
-| `--env ` | Umgebungsfilter; Werte wiederholen oder kommagetrennt angeben. |
-| `--status ` | `done`, `error` oder `timeout`; Werte wiederholen oder kommagetrennt angeben. |
-| `--agent-id ` | Sitzungen mit einem der ausgewählten Agenten abgleichen. |
-| `--session-id ` | Sitzungsfilter; Werte wiederholen oder kommagetrennt angeben. |
-| `--all` | Automatisch bis zu `--limit` paginieren. |
-| `--cursor ` | Ab einem undurchsichtigen Cursor fortsetzen. |
-| `--page-size ` | Zeilen pro Anfrage mit `--all`; Maximum `200`. |
+| `--env ` | Umgebungsfilter; wiederholbar oder kommagetrennte Werte. |
+| `--status ` | `done`, `error` oder `timeout`; wiederholbar oder kommagetrennte Werte. |
+| `--agent-id ` | Sitzungen einschließen, an denen ein ausgewählter Agent beteiligt ist. |
+| `--session-id ` | Sitzungsfilter; wiederholbar oder kommagetrennte Werte. |
+| `--all` | Automatische Paginierung bis zu `--limit`. |
+| `--cursor ` | Fortsetzen ab einem undurchsichtigen Cursor. |
+| `--page-size ` | Zeilen pro Anfrage bei `--all`; maximal `200`. |
| `--fields ` | Nur ausgewählte Felder zurückgeben. |
-| `--full-ids` | Sitzungs-IDs in der Terminal-Ausgabe nicht kürzen. |
-| `--agents` | Den Agenten-Kader für Multi-Agenten-Sitzungen ausklappen. |
+| `--full-ids` | Sitzungs-IDs in der Terminalausgabe nicht kürzen. |
+| `--agents` | Die Agent-Liste für Multi-Agent-Sitzungen aufklappen. |
### Auswertungen
@@ -114,12 +118,12 @@ fp evals [OPTIONS]
| `--aggregate` | Gesamtwerte und Statistiken pro Score anstelle einzelner Auswertungen anzeigen. |
| `--limit`, `-n ` | Maximale Listenzeilen. Standard: `50`. |
| `--since`, `--from`, `--to` | Zeitbereich auswählen. |
-| `--env`, `--status`, `--agent-id`, `--session-id` | Auf genau einen Wert pro Filter einschränken. |
+| `--env`, `--status`, `--agent-id`, `--session-id` | Auf einen exakten Wert pro Filter einschränken. |
| `--score KEY:MIN..MAX` | Score-Bereich; wiederholbar, alle Bereiche müssen übereinstimmen. |
| `--all`, `--cursor`, `--page-size` | Listenpaginierung steuern. |
| `--fields ` | Nur ausgewählte Felder zurückgeben. |
| `--full-ids` | Vollständige Sitzungs-IDs anzeigen. |
-| `--scores-full` | Alle Scores in der Terminal-Ausgabe anzeigen. |
+| `--scores-full` | Alle Scores in der Terminalausgabe anzeigen. |
### Fehler
@@ -132,9 +136,9 @@ fp errors [OPTIONS]
| `--aggregate` | Übereinstimmende Fehler zusammenfassen anstatt Zeilen aufzulisten. |
| `--limit`, `-n ` | Maximale Listenzeilen. Standard: `50`. |
| `--since`, `--from`, `--to` | Zeitbereich auswählen. |
-| `--env`, `--error-type`, `--event-type`, `--agent-id`, `--session-id` | Fehlermenge einschränken. |
+| `--env`, `--error-type`, `--event-type`, `--agent-id`, `--session-id` | Fehlerpopulation einschränken. |
| `--search ` | Payload-Text durchsuchen; wiederholbar. |
-| `--order asc\|desc` | Zeitliche Reihenfolge. |
+| `--order asc\|desc` | Zeitreihenfolge. |
| `--all`, `--cursor`, `--page-size` | Listenpaginierung steuern. |
| `--fields ` | Nur ausgewählte Felder zurückgeben. |
| `--full-ids` | Vollständige Sitzungs-IDs anzeigen. |
@@ -144,8 +148,8 @@ fp errors [OPTIONS]
| Befehl | Zweck |
| --- | --- |
| `fp usage` | Nutzung für das aktuelle Abrechnungsfenster anzeigen. |
-| `fp list envs` | Beobachtete Umgebungen auflisten. |
-| `fp list agents` | Beobachtete Agenten-IDs auflisten. |
+| `fp list envs` | Erkannte Umgebungen auflisten. |
+| `fp list agents` | Erkannte Agent-IDs auflisten. |
| `fp list event_types` | Ereignistypen auflisten. |
| `fp list score_filters` | Score-Schlüssel für Auswertungen auflisten. |
| `fp list models` | Modellnamen auflisten. |
@@ -158,8 +162,8 @@ fp errors [OPTIONS]
| Befehl | Zweck |
| --- | --- |
| `fp orgs list` | Zugängliche Organisationen auflisten. |
-| `fp orgs switch [SLUG]` | Eine aktive Organisation speichern; wird bei Auslassung abgefragt. |
-| `fp orgs current` | Die aktive Organisation anzeigen. |
+| `fp orgs switch [SLUG]` | Eine aktive Organisation speichern; bei Auslassung wird nachgefragt. |
+| `fp orgs current` | Aktive Organisation anzeigen. |
| `fp orgs perms` | Eigene Berechtigungen in der aktiven Organisation anzeigen. |
### API-Schlüssel
@@ -173,7 +177,7 @@ fp errors [OPTIONS]
| `fp keys regenerate NAME` | Das Geheimnis rotieren und den Ersatz einmalig anzeigen. | `--yes`, `-y` |
| `fp keys disable NAME` | Einen Schlüssel dauerhaft widerrufen. | `--yes`, `-y` |
-Berechtigungs-Tokens verwenden das Format `resource:action`, z. B. `events:add`. Wiederhole `--add`, trenne Tokens durch Kommas oder verwende Punkt-Notation wie `events:read.add`.
+Berechtigungs-Tokens verwenden das Format `resource:action`, z. B. `events:add`. `--add` kann wiederholt, Tokens kommagetrennt oder mit gepunkteten Aktionen wie `events:read.add` angegeben werden.
### Abfragen
@@ -185,7 +189,7 @@ Berechtigungs-Tokens verwenden das Format `resource:action`, z. B. `events:add`.
| `fp query update NAME` | Eine Abfrage aktualisieren oder umbenennen. | `--name`; `--sql`; `--description`; `--yes`, `-y` |
| `fp query delete NAME` | Eine gespeicherte Abfrage löschen. | `--yes`, `-y` |
| `fp query run [NAME]` | Eine gespeicherte Abfrage oder Ad-hoc-SQL ausführen. | `--sql`; `--limit`; `--all`; `--arg`, `--param` |
-| `fp query schema [TABLE]` | Abfragbare Tabellen auflisten oder eine Tabelle untersuchen. | — |
+| `fp query schema [TABLE]` | Abfragbare Tabellen auflisten oder eine Tabelle inspizieren. | — |
### Benutzer
@@ -204,7 +208,7 @@ Berechtigungs-Tokens verwenden das Format `resource:action`, z. B. `events:add`.
| --- | --- | --- |
| `fp settings list` | Organisationseinstellungen und aktuelle Werte auflisten. | — |
| `fp settings schema` | Zulässige Werte und Beschreibungen anzeigen. | — |
-| `fp settings set KEY` | Eine vorhandene Einstellung ändern. | genau eine von `--value`, `--json-value`, `--file`; optional `--yes`, `-y` |
+| `fp settings set KEY` | Eine bestehende Einstellung ändern. | genau eines von `--value`, `--json-value`, `--file`; optional `--yes`, `-y` |
### Alerts
@@ -213,7 +217,7 @@ Berechtigungs-Tokens verwenden das Format `resource:action`, z. B. `events:add`.
| `fp alerts list` | Alert-Regeln auflisten. | `--show-id` |
| `fp alerts show NAME` | Einen Alert anzeigen. | — |
| `fp alerts create NAME` | Einen Alert erstellen. | `--file`; `--description`; `--severity`; `--trigger-kind`; `--trigger-spec`; `--channels`; `--eval-interval-secs`; `--min-breaches`; `--eval-window` |
-| `fp alerts update NAME` | Einen Alert aktualisieren oder umbenennen. | Erstellungsoptionen plus `--name`; `--yes`, `-y` |
+| `fp alerts update NAME` | Einen Alert aktualisieren oder umbenennen. | Create-Optionen plus `--name`; `--yes`, `-y` |
| `fp alerts delete NAME` | Einen Alert löschen. | `--yes`, `-y` |
| `fp alerts test NAME` | Eine Testbenachrichtigung senden. | `--channels`; `--yes`, `-y` |
@@ -224,25 +228,25 @@ Alert-Schweregrade sind `info`, `warning` und `critical`. Trigger-Arten sind `me
| Befehl | Zweck | Optionen |
| --- | --- | --- |
| `fp audits list` | Audits auflisten. | `--enabled-only`; `--show-id` |
-| `fp audits show NAME` | Eine Audit-Definition und ihren Status anzeigen. | — |
-| `fp audits create NAME` | Ein Audit erstellen und sofort die erste Ausführung in die Warteschlange stellen. | Siehe [Erstellungsoptionen](#audit-create-options). |
-| `fp audits edit NAME` | Audit-Einstellungen ersetzen, ohne nicht angegebene Werte zu verändern. | Definitionsoptionen für die Erstellung; `--name`; `--yes`, `-y` |
-| `fp audits delete NAME` | Ein Audit, seine Findings und den Ausführungsverlauf löschen. | `--yes`, `-y` |
-| `fp audits run NAME` | Eine manuelle Ausführung in die Warteschlange stellen. | — |
+| `fp audits show NAME` | Eine Audit-Definition und ihren Zustand anzeigen. | — |
+| `fp audits create NAME` | Ein Audit erstellen und sofort den ersten Durchlauf in die Warteschlange stellen. | Siehe [Create-Optionen](#audit-create-options). |
+| `fp audits edit NAME` | Audit-Einstellungen ersetzen, ohne nicht angegebene Werte zu verändern. | Definitions-Optionen für Create; `--name`; `--yes`, `-y` |
+| `fp audits delete NAME` | Ein Audit, seine Befunde und den Ausführungsverlauf löschen. | `--yes`, `-y` |
+| `fp audits run NAME` | Einen manuellen Durchlauf in die Warteschlange stellen. | — |
| `fp audits runs NAME` | Ausführungsverlauf auflisten. | `--limit`, `-n`; `--show-id` |
-| `fp audits context-show NAME` | Den Kurztext und den Abrufstatus der Referenz-URLs anzeigen. | — |
-| `fp audits context-set NAME` | Den Kurztext oder Referenz-URLs ändern. | `--text`; `--text-file`; `--url`; `--clear-urls` |
+| `fp audits context-show NAME` | Das Briefing und den Abrufstatus der Referenz-URLs anzeigen. | — |
+| `fp audits context-set NAME` | Das Briefing oder Referenz-URLs ändern. | `--text`; `--text-file`; `--url`; `--clear-urls` |
| `fp audits context-refresh NAME` | Referenz-URLs erneut abrufen. | — |
-| `fp audits findings` | Findings auflisten. | `--audit`; `--run-id`; `--status`; `--limit`, `-n`; `--offset`; `--show-id` |
-| `fp audits finding FINDING_ID` | Ein Finding und seine Belege anzeigen. | — |
-| `fp audits ack FINDING_ID` | Ein Finding bestätigen. | `--reason` |
+| `fp audits findings` | Befunde auflisten. | `--audit`; `--run-id`; `--status`; `--limit`, `-n`; `--offset`; `--show-id` |
+| `fp audits finding FINDING_ID` | Einen Befund und seine Beweise anzeigen. | — |
+| `fp audits ack FINDING_ID` | Einen Befund bestätigen. | `--reason` |
| `fp audits mute FINDING_ID` | Ein wiederkehrendes Muster unterdrücken. | `--reason`; `--yes`, `-y` |
| `fp audits dismiss FINDING_ID` | Ein Muster als nicht handlungsrelevant markieren und unterdrücken. | `--reason`; `--yes`, `-y` |
-| `fp audits resolve FINDING_ID` | Ein Finding als behoben markieren, ohne künftige Unterdrückung. | `--yes`, `-y` |
-| `fp audits reopen FINDING_ID` | Ein Finding in die aktive Warteschlange zurückgeben und die Unterdrückung aufheben. | — |
-| `fp audits assign FINDING_ID` | Den Verantwortlichen für ein Finding festlegen. | erforderlich: `--to ` |
+| `fp audits resolve FINDING_ID` | Einen Befund als behoben markieren, ohne zukünftige Unterdrückung. | `--yes`, `-y` |
+| `fp audits reopen FINDING_ID` | Einen Befund in die aktive Warteschlange zurückführen und Unterdrückung aufheben. | — |
+| `fp audits assign FINDING_ID` | Den Verantwortlichen für einen Befund festlegen. | Pflichtangabe `--to ` |
-#### Audit-Erstellungsoptionen
+#### Audit-Create-Optionen
```bash
fp audits create checkout-reliability \
@@ -257,27 +261,27 @@ fp audits create checkout-reliability \
| Option | Beschreibung |
| --- | --- |
-| `--file ` | Definition auf JSON basieren oder `-` für stdin verwenden. Explizite Flags überschreiben Dateiwerte. |
-| `--description ` | Die Fehlerfrage oder den Zweck angeben. |
-| `--enabled` / `--disabled` | Planung aktiviert oder deaktiviert starten. Standard: aktiviert. |
+| `--file ` | Definition auf JSON basieren, oder `-` für stdin verwenden. Explizite Flags überschreiben Dateiwerte. |
+| `--description ` | Die Fehlerfrage oder den Zweck beschreiben. |
+| `--enabled` / `--disabled` | Zeitplanung aktivieren oder deaktivieren. Standard: aktiviert. |
| `--schedule-interval-secs ` | `3600`–`604800`. Standard: `86400`. |
-| `--schedule-anchor ` | Feste UTC-Phase im ISO 8601-Format. Standard: nächstes 09:00 UTC. |
+| `--schedule-anchor ` | Feste UTC-Phase im ISO 8601-Format. Standard: nächste 09:00 UTC. |
| `--window-mode since_last\|fixed` | Nach dem letzten vollständig analysierten Fenster fortfahren oder ein rollendes Fenster wiederholt untersuchen. Standard: `since_last`. |
| `--lookback-window-secs ` | `3600`–`7776000`. Standard: `604800`. |
| `--scope ''` | Nach `environments`, `agent_ids` oder anderen unterstützten Scope-Feldern filtern. |
-| `--ignore-error-type ` | Fehlertypen ausschließen; wiederholen oder kommagetrennt angeben. |
+| `--ignore-error-type ` | Fehlertypen ausschließen; wiederholbar oder kommagetrennt. |
| `--llm` / `--no-llm` | Agentische Analyse aktivieren oder deaktivieren. Standard: aktiviert. |
-| `--top-k ` | `1`–`500` Findings behalten. Standard: `50`. |
-| `--sensitivity low\|medium\|high` | Meldeempfindlichkeit festlegen. Standard: `medium`. |
+| `--top-k ` | `1`–`500` Befunde behalten. Standard: `50`. |
+| `--sensitivity low\|medium\|high` | Berichtssensitivität festlegen. Standard: `medium`. |
| `--channels ''` | Array der Benachrichtigungskanäle. |
-| `--text ` | Inline-Kurztext, maximal 8.192 Zeichen. |
-| `--text-file ` | Kurztext aus einer Datei lesen; schließt sich mit `--text` gegenseitig aus. |
+| `--text ` | Inlines Briefing, maximal 8.192 Zeichen. |
+| `--text-file ` | Briefing aus einer Datei lesen; schließt sich gegenseitig mit `--text` aus. |
| `--url ` | Eine öffentliche HTTPS-Referenz hinzufügen; bis zu fünfmal wiederholbar. |
-Kontext bei der Erstellung angeben, wenn die erste Ausführung ihn benötigt. Die Erstellung schreibt Definition und Kontext gemeinsam fest, bevor die geplante Ausführung beginnt.
+Füge Kontext während der Erstellung hinzu, wenn der erste Durchlauf ihn benötigt. Die Erstellung schreibt die Definition und den Kontext gemeinsam fest, bevor der eingereihte Durchlauf beginnt.
- `fp audits run` ist asynchron. Überprüfe `fp audits runs NAME` so lange, bis die neueste Ausführung erfolgreich war oder fehlgeschlagen ist, bevor du die Findings liest.
+ `fp audits run` ist asynchron. Warte mit `fp audits runs NAME`, bis der letzte Durchlauf erfolgreich abgeschlossen ist oder fehlschlägt, bevor du die Befunde liest.
### Issues
@@ -287,15 +291,15 @@ Kontext bei der Erstellung angeben, wenn die erste Ausführung ihn benötigt. Di
| `fp issues list` | Issues auflisten. | `--state`; `--alert-id`; `--limit`, `-n`; `--show-id` |
| `fp issues count` | Offene oder ausgewählte Issue-Zustände zählen. | `--state` |
| `fp issues show INCIDENT_ID` | Issue-Details, Kommentare, Abonnenten und Aktivitäten anzeigen. | — |
-| `fp issues open` | Ein manuelles oder alert-verknüpftes Issue öffnen. | erforderlich: `--summary`; optional: `--title`, `--alert-id`, `--severity` |
+| `fp issues open` | Ein manuelles oder alert-verknüpftes Issue öffnen. | Pflichtangabe `--summary`; optional `--title`, `--alert-id`, `--severity` |
| `fp issues ack INCIDENT_ID` | Ein Issue bestätigen. | — |
-| `fp issues assign INCIDENT_ID` | Zugewiesene Personen ersetzen; Option weglassen, um sie zu entfernen. | wiederholbar: `--assignee` |
+| `fp issues assign INCIDENT_ID` | Zugewiesene Personen ersetzen; Option weglassen, um sie zu entfernen. | wiederholbares `--assignee` |
| `fp issues resolve INCIDENT_ID` | Ein Issue auflösen. | `--yes`, `-y` |
| `fp issues comment-list INCIDENT_ID` | Kommentare auflisten. | — |
-| `fp issues comment-add INCIDENT_ID` | Einen Kommentar hinzufügen. | genau eine von `--body`, `--file` |
+| `fp issues comment-add INCIDENT_ID` | Einen Kommentar hinzufügen. | genau eines von `--body`, `--file` |
| `fp issues comment-delete INCIDENT_ID COMMENT_ID` | Einen Kommentar löschen. | `--yes`, `-y` |
| `fp issues subscribers INCIDENT_ID` | Abonnenten auflisten. | — |
-| `fp issues subscribe INCIDENT_ID` | Sich selbst oder einen anderen Operator abonnieren. | `--email` |
+| `fp issues subscribe INCIDENT_ID` | Dich selbst oder einen anderen Operator abonnieren. | `--email` |
| `fp issues unsubscribe INCIDENT_ID` | Ein Abonnement entfernen. | `--email` |
Gültige Issue-Zustände sind `firing`, `acknowledged` und `resolved`. Schweregrade für eigenständige Issues sind `info`, `warning` und `critical`.
@@ -307,11 +311,49 @@ Gültige Issue-Zustände sind `firing`, `acknowledged` und `resolved`. Schweregr
| `fp agent health` | Verfügbarkeit und Konfiguration des Assistenten prüfen. | — |
| `fp agent models` | Verfügbare Assistentenmodelle auflisten. | — |
| `fp agent chats` | Gespeicherte Chats auflisten. | — |
-| `fp agent ask [MESSAGE]` | Einen Chat starten oder fortsetzen; liest stdin, wenn die Nachricht fehlt. | `--chat`; `--model`; `--page-context` |
+| `fp agent ask [MESSAGE]` | Einen Chat starten oder fortsetzen; liest stdin, wenn die Nachricht weggelassen wird. | `--chat`; `--model`; `--page-context` |
| `fp agent show CHAT_ID` | Ein gespeichertes Gespräch anzeigen. | — |
-| `fp agent rename CHAT_ID` | Ein Gespräch umbenennen. | erforderlich: `--title` |
+| `fp agent rename CHAT_ID` | Ein Gespräch umbenennen. | Pflichtangabe `--title` |
| `fp agent delete CHAT_ID` | Ein Gespräch löschen. | `--yes`, `-y` |
+### Policies
+
+Cloudseitig verwaltete Richtlinienversionen. **Nur für Sitzungen** — jeder Befehl hier beendet sich mit `2` unter einem API-Schlüssel, noch vor jeder Anfrage, da es sich um reine Root-Schreibrouten handelt, die absichtlich nicht in `/v1` vorhanden sind.
+
+| Befehl | Zweck | Optionen |
+| --- | --- | --- |
+| `fp policies list` | Richtlinienversionen auflisten. | `--json` |
+| `fp policies show POLICY_ID` | Eine Richtlinie mit ihrem Quellcode anzeigen. | — |
+| `fp policies publish NAME PATH` | Eine Version aus einer lokalen `.mjs`-Datei erstellen. | `--description`; `--no-verify` |
+| `fp policies enable POLICY_ID` | Sie jedem Deployment hinzufügen, aus dem sie entfernt wurde, und dabei in jedem eine neue Generation prägen. | `--yes`, `-y` |
+| `fp policies disable POLICY_ID` | Sie aus jedem Deployment entfernen, das sie enthält, und dabei in jedem eine neue Generation prägen. | `--yes`, `-y` |
+| `fp policies delete POLICY_ID` | Eine Richtlinienversion löschen. | `--yes`, `-y` |
+| `fp policies test PATH` | Eine Richtlinie lokal gegen einen synthetischen Kontext testen. Wendet den `match`-Filter jeder Richtlinie an; eine Richtlinie, die das gegebene Ereignis/Tool nicht abdeckt, wird als `skipped` gemeldet statt ausgeführt. | `--event`; `--tool`; `--command`; `--file-path`; `--expect` |
+| `fp policies compose PROMPT` | Eine Richtlinie mit dem Assistenten entwerfen. Benötigt `policies:write`. | — |
+
+### Fleet
+
+Welche Machines welche Richtlinien ausführen. **Nur für Sitzungen**, aus demselben Grund wie oben.
+
+| Befehl | Zweck | Optionen |
+| --- | --- | --- |
+| `fp fleet list` | Eingeschriebene Machines und ihre Deployment-Generation auflisten. | — |
+| `fp fleet show MACHINE_ID` | Den aktuell von einer Machine ausgeführten Richtliniensatz anzeigen. | — |
+| `fp fleet deploy MACHINE_ID` | **Ersetzt den gesamten Richtliniensatz der Machine.** Gibt den Plan aus und fragt nur auf einem interaktiven Terminal ohne `--json` nach. | `--add`; `--remove`; `--set`; `--create`; `--yes`, `-y` |
+| `fp fleet diff MACHINE_ID` | Eine Machine mit einem anderen Deployment vergleichen. | — |
+| `fp fleet history MACHINE_ID` | Vergangene Deployments für eine Machine anzeigen. | — |
+| `fp fleet rollback MACHINE_ID` | Ein vorheriges Deployment wiederherstellen. | `--yes`, `-y` |
+| `fp fleet rename MACHINE_ID` | Einer Machine einen lesbaren Namen geben. | Pflichtangabe `--name` |
+
+### Guardrails
+
+Was die Durchsetzung tatsächlich getan hat. **Nur für Sitzungen**, aus demselben Grund wie oben.
+
+| Befehl | Zweck | Optionen |
+| --- | --- | --- |
+| `fp guardrails summary` | Abdeckung, blockierte/ausgewertete Gesamtwerte, eine Deny-Sparkline und die Tabelle pro Richtlinie. | `--since` (`1h`, `6h`, `24h`, `7d`); `--machine` |
+| `fp guardrails timeline` | Entscheidungen im Zeitfenster zusammengefasst, summiert über alle Richtlinienquellen. | `--since` (`1h`, `6h`, `24h`, `7d`); `--machine` |
+
## Globale Flags
| Flag | Beschreibung |
@@ -319,13 +361,13 @@ Gültige Issue-Zustände sind `firing`, `acknowledged` und `resolved`. Schweregr
| `--json` | Maschinenlesbares JSON ausgeben. |
| `--base-url ` | Ein selbst gehostetes oder Entwicklungs-Dashboard verwenden. |
| `--org ` | Eine Organisation für diesen Aufruf auswählen. |
-| `--token ` | Das gespeicherte Benutzersitzungs-Token überschreiben. |
+| `--token ` | Das gespeicherte Benutzersitzungstoken überschreiben. |
| `--api-key ` | Automatisierung mit einem API-Schlüssel authentifizieren; wird nie gespeichert. |
| `--timeout ` | HTTP-Timeout; muss positiv sein. Standard: `30`. |
| `--quiet`, `-q` | Statusausgabe auf stderr unterdrücken. |
| `--no-color` | Farbige Ausgabe deaktivieren. |
| `--insecure` / `--secure` | TLS-Zertifikatsprüfung deaktivieren oder wiederherstellen. |
-| `--version` | Version ausgeben und beenden. |
+| `--version` | Die Version ausgeben und beenden. |
| `--help`, `-h` | Hilfe anzeigen. |
`--api-key` ist für die Automatisierung vorgesehen. Anmeldung, Organisationswechsel und Assistentenbefehle erfordern eine Benutzersitzung.
@@ -334,18 +376,24 @@ Gültige Issue-Zustände sind `firing`, `acknowledged` und `resolved`. Schweregr
| Variable | Entsprechung oder Zweck |
| --- | --- |
-| `AGENTEYE_DASHBOARD_URL` | `--base-url` |
-| `AGENTEYE_ORG` | `--org` |
-| `AGENTEYE_CLI_TOKEN` | `--token` |
-| `AGENTEYE_CLI_API_KEY` | `--api-key` |
-| `AGENTEYE_CLI_JSON` | `--json` |
-| `AGENTEYE_INSECURE` | `--insecure` |
-| `AGENTEYE_HOME` | Das aktuelle CLI-Konfigurationsverzeichnis verschieben. |
-| `AGENTEYE_ANALYTICS_DISABLED` oder `DO_NOT_TRACK` | Anonyme CLI-Analysen deaktivieren. |
+| `FP_DASHBOARD_URL` | `--base-url` |
+| `FP_ORG` | `--org` |
+| `FP_TOKEN` | `--token` |
+| `FP_API_KEY` | `--api-key` |
+| `FP_JSON` | `--json` |
+| `FP_INSECURE` | `--insecure` |
+| `FP_HOME` | Konfigurationsverzeichnis des CLI verschieben (Standard: `~/.failproofai/fpcli`). |
+| `FP_ANALYTICS_DISABLED` oder `DO_NOT_TRACK` | Anonyme CLI-Analysen deaktivieren. |
| `NO_COLOR` | Farbige Ausgabe deaktivieren. |
-Explizite Flags überschreiben Umgebungsvariablen, die wiederum die gespeicherte Konfiguration überschreiben. Im API-Schlüssel-Modus den Mandanten explizit mit `--org` oder `AGENTEYE_ORG` auswählen.
+Explizite Flags überschreiben Umgebungsvariablen, die wiederum die gespeicherte Konfiguration überschreiben. Im API-Schlüssel-Modus den Mandanten explizit mit `--org` oder `FP_ORG` auswählen.
+
+
+ Die `AGENTEYE_*`-Schreibweisen dieser Variablen werden von `fp` **nicht gelesen** und wurden es nie — das CLI deklariert `FP_*` (`fp_cli/app.py`), und eine unbekannte Variable ist kein Fehler. Das Setzen von `AGENTEYE_DASHBOARD_URL` richtet das CLI nicht neu aus; es wird ignoriert und der Befehl läuft stillschweigend gegen das gespeicherte Dashboard.
+
+ `AGENTEYE_HOME` und `AGENTEYE_ENVIRONMENT` existieren weiterhin, gehören aber zum **Collector und dem Telemetrie-SDK**, nicht zu diesem CLI.
+
- Befehle, die Konfigurationen löschen, widerrufen, unterdrücken, auflösen oder ersetzen, fordern standardmäßig zur Bestätigung auf. Verwende `--yes` erst nach Überprüfung der aktiven Organisation und des Ziels.
+ Befehle, die Konfigurationen löschen, widerrufen, unterdrücken, auflösen oder ersetzen, fragen standardmäßig nach. Verwende `--yes` erst nach Überprüfung der aktiven Organisation und des Ziels.
\ No newline at end of file
diff --git a/docs/de/reference/custom-agents.mdx b/docs/de/reference/custom-agents.mdx
index 27164accf..88bb99902 100644
--- a/docs/de/reference/custom-agents.mdx
+++ b/docs/de/reference/custom-agents.mdx
@@ -1,45 +1,40 @@
---
-title: "Benutzerdefinierte Agenten"
-description: "Instrumentiere Traces von benutzerdefinierten Agenten, damit Failproof AI Ausführungen rekonstruieren und Fehler finden kann."
+title: "Eigene Agenten"
+description: "Konfiguration, der Event-Katalog, Korrelationsregeln und Zustellung für failproofai-sdk."
icon: "python"
---
-Instrumentiere Traces eines benutzerdefinierten Agenten mit `failproofai-sdk`, damit Failproof AI jeden Lauf rekonstruieren, sein Verhalten prüfen und belegbare Fehler finden kann. Das SDK schreibt strukturierte Ereignisse, die der Failproof-Daemon an Cloud weiterleitet. Es setzt Python 3.10 oder neuer voraus.
+Was jede Einstellung, Methode und jedes Feld bewirkt. Wenn Sie zum ersten Mal instrumentieren, beginnen Sie mit der Anleitung — diese Seite dient zum Nachschlagen.
-Tracing macht benutzerdefinierte Agenten beobachtbar und auditierbar. Um eine unsichere Aktion vor ihrer Ausführung zu verhindern, ist zusätzlich ein Enforcement-Hook in deiner Laufzeitumgebung erforderlich.
+
+
+ Installation, Instrumentierung, die Event-Methoden, ein ausgearbeitetes Beispiel und häufige Probleme.
+
+
+ LangChain, CrewAI, LlamaIndex und Pydantic AI instrumentieren sich selbst mit einem einzigen Aufruf.
+
+
-
- Um Richtlinien in einer benutzerdefinierten Agenten-Umgebung durchzusetzen, [kontaktiere Failproof AI](mailto:support@befailproof.ai). Wir helfen dabei, die Modell-, Tool- und Lifecycle-Grenzen deiner Laufzeitumgebung auf Policy-Hooks abzubilden.
-
+Python 3.10 oder neuer. Keine Laufzeit-Abhängigkeiten.
-
-
-
-
-## `failproofai-sdk` installieren
-
-Das SDK wird derzeit als privates Wheel vertrieben. Wende dich an deinen Failproof AI-Ansprechpartner, um die aktuelle Version und Zugang zum Download zu erhalten.
+## Installation
```bash
-VERSION=
-pip install "./failproofai_sdk-${VERSION}-py3-none-any.whl"
-python -c "import failproofai; print(failproofai.__version__)"
+pip install failproofai-sdk
```
-Mit `uv` lade das Wheel zunächst herunter und führe `uv add ./failproofai_sdk-${VERSION}-py3-none-any.whl` aus. Fixiere das Wheel in einem privaten Artefakt-Repository oder einer Dependency-Lock-Datei.
-
-Das Paket wird als `failproofai-sdk` installiert und in Python als `failproofai` importiert.
+Das Paket wird als `failproofai-sdk` installiert und in Python als `failproofai_sdk` importiert. Framework-Extras wie `failproofai-sdk[langgraph]` installieren das Framework selbst; die Adapter werden immer im Basis-Wheel mitgeliefert.
## Failproof-Daemon verbinden
- 1. Gehe zu **Admin → Keys** und erstelle einen Schlüssel mit `events:add`.
- 2. [Verbinde den Failproof-Daemon mit Cloud](/de/start/setup#connect-a-machine-to-cloud) auf der Agenten-Maschine.
- 3. Führe eine instrumentierte Sitzung aus und suche dann deren genaue ID unter **Observe → Events**.
- 4. Gehe zu **Observe → Sessions**, wähle dieselbe Umgebung und öffne den rekonstruierten Trace.
+ 1. Gehen Sie zu **Admin → Keys** und erstellen Sie einen Schlüssel mit `events:add`.
+ 2. [Verbinden Sie den Failproof-Daemon mit Cloud](/de/start/setup#connect-a-machine-to-cloud) auf dem Agenten-Rechner.
+ 3. Führen Sie eine instrumentierte Sitzung aus und suchen Sie deren genaue ID unter **Observe → Events**.
+ 4. Gehen Sie zu **Observe → Sessions**, wählen Sie dieselbe Umgebung und öffnen Sie den rekonstruierten Trace.
- 
+ 
```bash
@@ -51,102 +46,84 @@ Das Paket wird als `failproofai-sdk` installiert und in Python als `failproofai`
-## Einen vollständigen Lauf instrumentieren
-
-Rufe `configure()` einmal beim Prozessstart auf. Jeder Ereignisaufruf ist keyword-only und erfordert eine stabile `session_id` und `agent_id`.
+## Konfiguration
```python
-import traceback
-import uuid
+import failproofai_sdk
+
+failproofai_sdk.configure(
+ base_dir=None,
+ flush_interval=0.5,
+ environment="production",
+)
+```
-import failproofai
+| Argument | Bedeutung |
+| --- | --- |
+| `environment` | Die Bezeichnung auf jedem Event — `production`, `staging`, `prod-eu`. Standard: `dev`. |
+| `flush_interval` | Wie oft der Hintergrund-Thread auf die Festplatte schreibt, in Sekunden. Standard: `0.5`. |
+| `base_dir` | Schreibziel. Standard ist der Spool des Daemons, was in der Regel das Richtige ist. |
-failproofai.configure(environment="production")
+Alternativ per Umgebungsvariable setzen:
-session_id = uuid.uuid4().hex
-agent_id = "checkout-agent"
+| Variable | Bedeutung |
+| --- | --- |
+| `AGENTEYE_ENVIRONMENT` | Setzt `environment` ohne Code-Änderung — für den Fall, dass die Bezeichnung zur Deployment-Umgebung und nicht zur App gehört. Ein `configure()`-Argument hat Vorrang. |
+| `FAILPROOFAI_HOME` | Verschiebt das Failproof AI-Stammverzeichnis, das den Spool enthält. |
+| `FAILPROOFAI_SDK_STRICT` | `1` lässt Instrumentierungsfehler als Ausnahme auslösen statt sie nur zu protokollieren. |
+| `FAILPROOFAI_SDK_STRICT_INTEGRATIONS` | `1` lässt ein Framework-Kompatibilitätsproblem als Ausnahme auslösen statt nur eine Warnung auszugeben. |
-failproofai.event.agent_start(
- session_id=session_id,
- agent_id=agent_id,
- goal="Resolve a failed checkout",
-)
+
+ **Kein Komma in `environment`.** Die Ingest-Komponente teilt dieses Feld an Kommas auf, um Filter zu erstellen, und überspringt jeden Event, dessen Bezeichnung ein Komma enthält — ein ganzer Lauf verschwindet dann lautlos. Schreiben Sie `prod-eu`, nicht `prod,eu`.
-try:
- tool_call_id = uuid.uuid4().hex
- failproofai.event.tool_use(
- session_id=session_id,
- agent_id=agent_id,
- tool_name="lookup_order",
- tool_call_id=tool_call_id,
- input={"order_id": "ord_8421"},
- )
- result = {"status": "payment_failed"}
- failproofai.event.tool_result(
- session_id=session_id,
- agent_id=agent_id,
- tool_name="lookup_order",
- tool_call_id=tool_call_id,
- output=result,
- )
-except Exception as exc:
- failproofai.event.error(
- session_id=session_id,
- agent_id=agent_id,
- error_type=type(exc).__name__,
- message=str(exc),
- traceback=traceback.format_exc(),
- )
- failproofai.event.agent_end(
- session_id=session_id,
- agent_id=agent_id,
- outcome="failed",
- )
- raise
-else:
- failproofai.event.agent_end(
- session_id=session_id,
- agent_id=agent_id,
- outcome="success",
- summary="Escalated the failed payment",
- )
-```
+ `configure(environment="prod,eu")` löst sofort eine Ausnahme aus. `AGENTEYE_ENVIRONMENT` kann das nicht — niemand ruft Sie zurück — daher wird einmalig eine Warnung ausgegeben und auf `dev` zurückgefallen.
+
+
+Events werden im Speicher gepuffert und alle `flush_interval` Sekunden im Hintergrund geschrieben, mit einem abschließenden Flush beim Beenden des Interpreters. Ein abrupt beendeter Prozess verliert alles, was noch nicht geschrieben wurde.
-Sende `agent_start` einmal pro Akteur. Für Sub-Agenten verwende die `session_id` des Elternagenten erneut, weise jedem Akteur eine eigene `agent_id` zu und setze `parent_id` auf die **Agent-ID** des Elternagenten – nicht auf die Session-ID.
+## Identität
-## Konfigurationsreferenz
+Jeder Event gehört zu einer Sitzung und einem Agenten. **Die Scopes füllen beides aus**, daher müssen sie selten übergeben werden:
```python
-failproofai.configure(
- base_dir=None,
- flush_interval=0.5,
- environment="production",
-)
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("planner"):
+ failproofai_sdk.event.tool_use(tool_name="search", tool_call_id="c1")
```
-| Einstellung | Verhalten |
-| --- | --- |
-| `base_dir` | Explizites Spool-Verzeichnis. Hat Vorrang vor allen Umgebungsvariablen. |
-| `flush_interval` | Sekunden zwischen Hintergrundschreibvorgängen aus dem Speicher in JSONL. Standard: `0.5`. |
-| `environment` | Deployment-Label für jedes Ereignis. Standard: `dev`. |
-| `FAILPROOFAI_HOME` | Ändert das Failproof AI-Stammverzeichnis, das den `custom-agents`-Spool enthält. |
+`session_id` oder `agent_id` explizit zu übergeben funktioniert nach wie vor und hat Vorrang. Wenn weder ein Scope gebunden noch ein Wert übergeben wurde, löst der Aufruf einen `TypeError` aus, anstatt einen Event zu emittieren, den Cloud stillschweigend verwerfen würde.
-Das SDK schreibt in das explizite `base_dir`, falls gesetzt. Andernfalls verwendet es den `custom-agents`-Spool des Failproof-Daemons unter `FAILPROOFAI_HOME` oder `~/.failproofai`.
+
+ Die Identität wird über Kontextvariablen übertragen. Sie folgt `asyncio`-Tasks automatisch, aber **nicht** neuen Threads — umhüllen Sie einen Worker mit `failproofai_sdk.propagate()`, sonst landen seine Events ohne Zuordnung.
+
-Das SDK reiht Aufrufe im Speicher ein und schreibt Batches in einem Hintergrund-Thread. Es versucht außerdem einen abschließenden Flush über Pythons `atexit`-Mechanismus. Für kurzlebige Worker sollte ein normales Interpreter-Shutdown ermöglicht werden; ein harter Prozessabbruch kann Ereignisse verlieren, die sich noch im Speicher befinden.
+## Event-Katalog
-## Ereigniskatalog
+Fünfzehn Methoden. Die meisten kommen in **Paaren** — Sie rufen den Öffner auf, dann den Schließer, und das SDK misst die Zeitspanne dazwischen.
-Alle Methoden geben `None` zurück. Felder, die als `None` belassen werden, werden weggelassen statt als JSON `null` geschrieben.
+| | Öffnet | Schließt |
+| --- | --- | --- |
+| **Agenten** | `agent_start` | `agent_end` |
+| | `agent_pause` | `agent_resume` |
+| **Modelle** | `model_request` | `model_response` |
+| **Tools** | `tool_use` | `tool_result` |
+| **Hooks** | `hook_triggered` | `hook_completed` |
+| **Menschen** | `human_wait` | `human_input` |
+
+Drei stehen für sich allein: `error`, `human_pause`, `human_interrupt`.
+
+
-| Methode | Pflichtfelder (über Identität hinaus) | Optionale Felder |
+Jede Methode akzeptiert außerdem `session_id` und `agent_id`, die die Scopes automatisch ausfüllen. Alles, was als `None` übergeben wird, wird weggelassen statt als JSON `null` gesendet, und jede Methode gibt `None` zurück.
+
+| Methode | Pflichtfelder | Optionale Felder |
| --- | --- | --- |
| `agent_start` | — | `goal`, `parent_id` |
| `agent_end` | — | `outcome`, `summary` |
| `agent_pause` | `pause_id` | `reason`, `user_id` |
| `agent_resume` | `pause_id` | `reason`, `user_id` |
-| `model_request` | — | `model`, `messages`, `system`, `tools` |
-| `model_response` | — | `model`, `stop_reason`, `input_tokens`, `output_tokens`, `content`, `role` |
+| `model_request` | — | `model`, `messages`, `system`, `tools`, `request_id` |
+| `model_response` | — | `model`, `stop_reason`, `input_tokens`, `output_tokens`, `content`, `role`, `request_id`, `duration_ms` |
| `tool_use` | `tool_name`, `tool_call_id` | `input` |
| `tool_result` | `tool_name`, `tool_call_id` | `output`, `error` |
| `hook_triggered` | `hook_name`, `hook_id` | `trigger_event`, `input` |
@@ -157,27 +134,64 @@ Alle Methoden geben `None` zurück. Felder, die als `None` belassen werden, werd
| `human_pause` | — | `reason`, `user_id` |
| `human_interrupt` | — | `reason`, `user_id`, `at_step` |
-Verwende `outcome="failed"`, `"error"`, `"timeout"` oder `"rejected"`, wenn eine Ausführung als Fehler gewertet werden soll. Andere Werte, einschließlich `"failure"`, werden vom aktuellen Backend nicht als Fehler klassifiziert.
+
+
+
+ Um einen Lauf als fehlgeschlagen zu markieren, muss `outcome` einen der folgenden Werte haben: `failed`, `error`, `timeout` oder `rejected`. Alles andere — einschließlich des nahezu übereinstimmenden `"failure"` — wird als Erfolg gewertet.
+
+
+## Paarbildung und Dauer
+
+**Eine Regel: Geben Sie dem schließenden Event dieselbe ID wie dem öffnenden.** Das ist es, was sie verknüpft, und was dem SDK ermöglicht, die Zeitspanne zu messen.
+
+| Paar | Verknüpft über |
+| --- | --- |
+| `tool_use` → `tool_result` | `tool_call_id` |
+| `hook_triggered` → `hook_completed` | `hook_id` |
+| `agent_pause` → `agent_resume` | `pause_id` |
+| `human_wait` → `human_input` | `input_id` |
+| `model_request` → `model_response` | `request_id` |
+
+**Übergeben Sie `duration_ms` nicht selbst.** Das SDK misst es, und eine Übergabe löst einen `ValueError` aus.
-## Korrelations- und Dauerregeln
+Die einzige Ausnahme ist `model_response`, wo nur Sie die tatsächliche Provider-Latenz kennen. Übergeben Sie eine ganze Anzahl Millisekunden — ein Float löst eine Ausnahme aus, da die Spalte ein 32-Bit-Integer ist und sonst leer bliebe.
-- Verwende dieselbe `tool_call_id`, `hook_id`, `pause_id` oder `input_id` für das zugehörige Abschlussereignis.
-- Das SDK berechnet `duration_ms` für `tool_result`, `hook_completed`, `agent_resume` und `human_input`. Wenn du diesen Wert selbst an diese Methoden übergibst, wird ein `ValueError` ausgelöst.
-- Tool- und Hook-IDs teilen sich eine prozessweite Pending-Map. Mache sie global eindeutig – über gleichzeitige Sitzungen hinweg und über beide Namespaces; Provider-IDs oder UUIDs sind die sicherste Wahl.
-- Ein Paar, das über Prozesse hinweg aufgeteilt ist, korreliert trotzdem nachgelagert, aber das SDK kann seine prozessinterne Dauer nicht berechnen.
-- Die Pending-Map hält maximal 10.000 Einträge und verdrängt den ältesten Eintrag, wenn sie voll ist.
+
-## Benutzerdefinierte Felder und Nutzdaten
+- **IDs müssen nur pro Typ und pro Sitzung eindeutig sein.** Ein Tool-Aufruf und ein Hook können dieselbe ID teilen; zwei gleichzeitig laufende Sitzungen können dieselben IDs wiederverwenden, ohne zu kollidieren.
+- **Sie sind nicht auf einen Agenten beschränkt.** Ein Paar, das unter einem Agenten geöffnet und unter einem anderen geschlossen wurde, wird trotzdem verknüpft — was bei Multi-Agenten-Code der Normalfall ist.
+- **`request_id` ist optional, aber empfohlen.** Ohne sie werden Modell-Events in der Reihenfolge ihres Eingangs gepaart, sodass zwei gleichzeitige Aufrufe im selben Agenten falsch zugeordnet werden können.
+- **Ein Paar, das über Prozesse aufgeteilt ist**, wird in Cloud trotzdem verknüpft, aber das SDK kann es nicht zeitlich messen — kein Prozess hat beide Hälften gesehen.
+- **Maximal 10.000 Öffner warten gleichzeitig auf einen Schließer.** Darüber hinaus wird der älteste verworfen, sodass ein Leak nicht unbegrenzt wachsen kann.
-Jedes Ereignis akzeptiert zusätzliche Keyword-Felder. Verwende JSON-kompatible Werte, wenn nachgelagerte Abfragen Struktur benötigen. Nicht unterstützte Typen wie UUIDs, Datetimes, Decimals, Sets, Bytes und Modellobjekte werden vom Writer in Strings umgewandelt.
+
-Reservierte benutzerdefinierte Namen sind `timestamp`, `session_id`, `agent_id`, `type` und `environment`. Tippfehler bei optionalen Feldern werden als neue benutzerdefinierte Felder akzeptiert – überprüfe daher das ausgegebene JSON, wenn ein Standardfeld nicht in Cloud erscheint.
+## Eigene Felder
-## Zustellen und überprüfen
+Jedes zusätzliche Schlüsselwortargument wird mit dem Event gespeichert:
+
+```python
+failproofai_sdk.event.tool_use(
+ tool_name="search", tool_call_id="c1",
+ fw_tenant="acme", fw_region="eu-west-1", # eigene Felder
+)
+```
+
+Bevorzugen Sie JSON-Typen, wenn Sie die Werte später abfragen möchten. Alles andere — eine UUID, ein Datetime, ein `Decimal`, ein Set, Bytes, ein Modell-Objekt — wird als Zeichenkette gespeichert.
+
+
+ **Versehen Sie Ihre Feldnamen mit einem Präfix.** Extras werden zuletzt angewendet, sodass ein Feld namens `model`, `tool_name` oder `outcome` das echte Feld stillschweigend überschreibt. Die Framework-Adapter verwenden `fw_`; tun Sie dasselbe und es kann keine Kollision auftreten.
+
+ Das ist auch der Grund, warum ein falsch geschriebenes optionales Feld keinen Fehler erzeugt — es wird einfach zu einem neuen benutzerdefinierten Feld. Wenn ein Standardfeld in Cloud fehlt, prüfen Sie zuerst die Schreibweise.
+
+
+Diese fünf Namen sind reserviert und werden grundsätzlich abgelehnt: `timestamp`, `session_id`, `agent_id`, `type`, `environment`.
+
+## Zustellung und Überprüfung
- Überprüfe unter **Observe → Events**, ob `agent_start` als erstes und `agent_end` als letztes Ereignis vorhanden ist. Öffne dann **Observe → Sessions** und bestätige, dass Modell-, Tool-, Human-, Hook- und Fehlerereignisse in der vorgesehenen Reihenfolge erscheinen. Verwende die Session-ID als primären Schlüssel bei der Fehlersuche.
+ Überprüfen Sie unter **Observe → Events**, ob `agent_start` als erstes und `agent_end` als letztes vorhanden ist. Öffnen Sie dann **Observe → Sessions** und bestätigen Sie, dass Modell-, Tool-, Human-, Hook- und Error-Events in der vorgesehenen Reihenfolge erscheinen. Verwenden Sie die Sitzungs-ID als primären Schlüssel zur Fehlersuche.
```bash
@@ -189,10 +203,14 @@ Reservierte benutzerdefinierte Namen sind `timestamp`, `session_id`, `agent_id`,
-Wenn Cloud leer ist, überprüfe `$FAILPROOFAI_HOME/custom-agents/events`, andernfalls `~/.failproofai/custom-agents/events`. JSONL-Dateien belegen die SDK-Ausgabe; ein wachsender Spool deutet auf ein Problem mit der Daemon-Konfiguration oder Zustellung hin, während ein leerer Spool auf ein Problem mit der Instrumentierung oder der Prozesslebensdauer hindeutet.
+Wenn Cloud leer ist, prüfen Sie `$FAILPROOFAI_HOME/custom-agents/events`, andernfalls `~/.failproofai/custom-agents/events`. JSONL-Dateien belegen die Emission durch das SDK; ein wachsender Spool deutet auf ein Problem mit der Daemon-Konfiguration oder Zustellung hin, während ein leerer Spool auf die Instrumentierung oder die Prozesslebensdauer hindeutet.
+
+
+ Untersuchen Sie den Spool nur, wenn der Daemon gestoppt ist. Während er läuft, sammelt und löscht er jeden Batch innerhalb von Millisekunden, sodass eine Verzeichnisauflistung mit dem Collector in einem Race Condition steht und weit weniger Events zeigt als tatsächlich emittiert wurden.
+
-## Fehler in einer benutzerdefinierten Laufzeitumgebung verhindern
+## Fehler in einer eigenen Laufzeitumgebung verhindern
-Nutze Audit-Ergebnisse und verknüpfte Traces, um die unsichere Aktion, die erforderlichen Belege und die beabsichtigte Reaktion zu definieren. Eine benutzerdefinierte Enforcement-Integration muss die Aktion vor ihrer Ausführung offenlegen, ihre strukturierten Eingaben an die Policy-Engine übergeben und die resultierende allow-, instruct- oder deny-Entscheidung anwenden.
+Nutzen Sie Audit-Befunde und verknüpfte Traces, um die unsichere Aktion, den erforderlichen Nachweis und die beabsichtigte Reaktion zu definieren. Eine benutzerdefinierte Enforcement-Integration muss die Aktion vor der Ausführung offenlegen, ihre strukturierte Eingabe an die Policy-Engine übergeben und die daraus resultierende allow-, instruct- oder deny-Entscheidung anwenden.
-Schreibe an [support@befailproof.ai](mailto:support@befailproof.ai), um diese Integration für deine Laufzeitumgebung zu entwerfen und zu validieren.
\ No newline at end of file
+[Kontaktieren Sie Failproof AI](mailto:support@befailproof.ai) und wir helfen Ihnen dabei, die Modell-, Tool- und Lebenszyklus-Grenzen Ihrer Laufzeitumgebung auf Policy-Hooks abzubilden und die Integration anschließend gemeinsam mit Ihnen zu validieren.
\ No newline at end of file
diff --git a/docs/de/reference/events-and-configuration.mdx b/docs/de/reference/events-and-configuration.mdx
index 62dea5cef..963d36253 100644
--- a/docs/de/reference/events-and-configuration.mdx
+++ b/docs/de/reference/events-and-configuration.mdx
@@ -1,41 +1,41 @@
---
title: "Events und Konfiguration"
-description: "Referenz für das Ereignismodell, Umgebungen, lokalen Speicher und Konfigurationsgrenzen."
+description: "Referenz zum Event-Modell, Umgebungen, lokalem Speicher und Konfigurationsgrenzen."
icon: "list-tree"
---
-## Ereignisfamilien
+## Event-Familien
-- Agent start, end, pause und resume
+- Agent-Start, -Ende, -Pause und -Fortsetzung
- Modellanfrage und -antwort
-- Tool-Verwendung und -Ergebnis
+- Tool-Nutzung und -Ergebnis
- Hook ausgelöst und abgeschlossen
- Menschliches Warten, Eingabe, Pause und Unterbrechung
- Explizite Fehler
-Jedes Ereignis enthält einen Zeitstempel, eine Sitzungs-ID, eine Agenten-ID, einen Ereignistyp und eine Umgebung. Ereignisspezifische Felder enthalten Modell-, Tool-, Korrelations-, Ergebnis-, Inhalts-, Dauer- oder Fehlerdaten.
+Jedes Event enthält einen Zeitstempel, eine Session-ID, eine Agent-ID, einen Event-Typ und eine Umgebung. Event-spezifische Felder enthalten Modell-, Tool-, Korrelations-, Ergebnis-, Inhalts-, Dauer- oder Fehlerdaten.
-## Einen Ereignisvertrag untersuchen
+## Einen Event-Vertrag inspizieren
- 1. Öffnen Sie **Observe → Events**.
- 2. Legen Sie ein kurzes Zeitfenster fest und filtern Sie nach Umgebung, Agent und Ereignistyp.
- 3. Wählen Sie ein Ereignis aus, um seine normalisierten Felder und die Roh-Payload zu untersuchen, und öffnen Sie dann die zugehörige Sitzung, um den Ausführungskontext zu sehen.
- 4. Wenn eine zugehörige Dauer fehlt, vergewissern Sie sich, dass Start- und Abschlussereignisse dieselbe Korrelations-ID verwenden.
+ 1. Öffne **Observe → Events**.
+ 2. Setze ein kurzes Zeitfenster und filtere nach Umgebung, Agent und Event-Typ.
+ 3. Wähle ein Event aus, um seine normalisierten Felder und die Rohdaten zu prüfen, und öffne dann die zugehörige Session, um den Ausführungskontext zu sehen.
+ 4. Wenn eine zugehörige Dauer fehlt, prüfe, ob Start- und Abschluss-Event dieselbe Korrelations-ID verwenden.
- Verwenden Sie den Events-Stream, um die Daten auf einen einzelnen Agentendurchlauf einzugrenzen und die normalisierten Ereignisfelder zu untersuchen.
+ Verwende den Events-Stream, um die Daten auf einen einzigen Agent-Lauf einzugrenzen und die normalisierten Event-Felder zu inspizieren.
- 
+ 
- Folgen Sie dann dem Ereignis in seine Sitzung. Der Trace zeigt, was unmittelbar davor und danach passiert ist – dies ist notwendig, wenn die Payload allein mehrdeutig ist.
+ Folge dem Event dann in seine Session. Der Trace zeigt, was unmittelbar davor und danach passiert ist – das ist notwendig, wenn das Payload allein mehrdeutig ist.
- 
+ 
- Vergleichen Sie Korrelations-IDs und Zeitstempel in beiden Ansichten, wenn ein gekoppeltes Ereignis oder eine Dauer fehlt.
+ Vergleiche Korrelations-IDs und Zeitstempel in beiden Ansichten, wenn ein zugehöriges Event oder eine Dauer fehlt.
- Gültige Filterwerte ermitteln und dann vollständige Ereignis-Payloads für eine Sitzung abrufen:
+ Gültige Filterwerte ermitteln, dann vollständige Event-Payloads für eine Session abrufen:
```bash
fp list event_types
@@ -47,32 +47,32 @@ Jedes Ereignis enthält einen Zeitstempel, eine Sitzungs-ID, eine Agenten-ID, ei
--full
```
- Verwenden Sie `fp --json events ... --fields ts,event_type,session_id,payload` für maschinenlesbare Inspektion.
+ Verwende `fp --json events ... --fields ts,event_type,session_id,payload` für maschinenlesbare Inspektion.
## Reservierte SDK-Felder
-Verwenden Sie `timestamp`, `session_id`, `agent_id`, `type` oder `environment` nicht als benutzerdefinierte Python-SDK-Felder. Gekoppelte Ereignisdauern wie die Tool-Ergebnis-Dauer werden vom SDK berechnet und können nicht manuell angegeben werden.
+Verwende `timestamp`, `session_id`, `agent_id`, `type` oder `environment` nicht als benutzerdefinierte Python-SDK-Felder. Gepaarte Event-Dauern wie die Dauer eines Tool-Ergebnisses werden vom SDK berechnet und können nicht manuell angegeben werden.
## Lokale Grenzen
- Der Failproof AI-Zustand liegt unter `~/.failproofai`, sofern nicht explizit anders konfiguriert.
-- `failproofai-sdk` verwendet `AGENTEYE_HOME` für die Legacy-Überschreibung des Basisverzeichnisses.
-- Umgebungsbezeichnungen können über die SDK-Konfiguration oder `AGENTEYE_ENVIRONMENT` gesetzt werden.
-- Daemon-Anmeldeinformationen werden getrennt von nicht geheimen Einstellungen gespeichert.
+- `failproofai-sdk` speichert stets unter `~/.failproofai/custom-agents`. `FAILPROOFAI_HOME` verlagert dieses Verzeichnis; das Segment `custom-agents` wird immer angehängt, sodass der Spool-Bereich nicht außerhalb davon platziert werden kann. Nur das eigene `configure(base_dir=...)` des SDK schreibt an einen anderen Ort. `AGENTEYE_HOME` wird vom älteren `agenteye-collector` gelesen, um den Beobachtungsbereich festzulegen, und hat keinen Einfluss mehr darauf, wohin das SDK schreibt.
+- Umgebungs-Labels können über die SDK-Konfiguration oder `AGENTEYE_ENVIRONMENT` gesetzt werden.
+- Daemon-Zugangsdaten werden getrennt von nicht geheimen Einstellungen gespeichert.
-Verwenden Sie stabile Umgebungsnamen mit niedriger Kardinalität. Kommas werden in Daemon-Umgebungsbezeichnungen nicht unterstützt.
+Verwende stabile Umgebungsnamen mit geringer Kardinalität. Kommas werden in Daemon-Umgebungs-Labels nicht unterstützt.
-## Eine Umgebungsbezeichnung ändern
+## Ein Umgebungs-Label ändern
- Umgebungsbezeichnungen werden vom ausgebenden SDK oder Failproof-Daemon zugewiesen. Öffnen Sie nach einer Änderung **Observe → Sessions** und verwenden Sie den Umgebungsfilter, um zu bestätigen, dass neue Sitzungen den neuen Wert tragen. Bestehende Sitzungen behalten ihre ursprüngliche Umgebung.
+ Umgebungs-Labels werden vom sendenden SDK oder Failproof-Daemon vergeben. Öffne nach einer Änderung **Observe → Sessions** und verwende den Umgebungsfilter, um zu bestätigen, dass neue Sessions den neuen Wert tragen. Bestehende Sessions behalten ihre ursprüngliche Umgebung.
- Für `failproofai-sdk` konfigurieren Sie die Umgebung im Code oder mit der zugehörigen Legacy-Umgebungsvariablen. Führen Sie die Daemon-Konfiguration erneut aus, wenn Sie Einstellungen auf Maschinenebene ändern.
+ Konfiguriere bei `failproofai-sdk` die Umgebung im Code oder über die veraltete Umgebungsvariable. Führe die Daemon-Konfiguration erneut aus, wenn du Einstellungen auf Maschinenebene änderst.
```bash
export AGENTEYE_ENVIRONMENT=production-us-east
diff --git a/docs/de/reference/harnesses.mdx b/docs/de/reference/harnesses.mdx
index 8f8c281b1..382903137 100644
--- a/docs/de/reference/harnesses.mdx
+++ b/docs/de/reference/harnesses.mdx
@@ -6,12 +6,12 @@ icon: "plug-zap"
Ein Harness ist die Umgebung, in der Ihr Agent tatsächlich ausgeführt wird. Failproof AI unterstützt zwölf davon, in zwei Klassen:
-- **Coding-CLIs** (10) — Claude Code, Codex, GitHub Copilot CLI, Cursor, OpenCode, Pi, Factory Droid, Devin CLI, Antigravity CLI, Goose
-- **Chat- und Assistant-Gateways** (2) — Hermes (Slack, Telegram, Cron), OpenClaw (selbst gehosteter Assistent)
+- **Coding CLIs** (10) — Claude Code, Codex, GitHub Copilot CLI, Cursor, OpenCode, Pi, Factory Droid, Devin CLI, Antigravity CLI, Goose
+- **Chat- und Assistent-Gateways** (2) — Hermes (Slack, Telegram, Cron), OpenClaw (selbstgehosteter Assistent)
-Dieselben Richtlinien und dieselbe Sitzungshistorie gelten unabhängig davon, in welchem Harness ein Agent ausgeführt wird. Eine Adapterschicht bildet die nativen Ereignisnamen, Tool-Namen und Tool-Eingabefelder jedes Harnesses auf 29 kanonische Ereignisse ab, bevor eine Richtlinie ausgeführt wird.
+Dieselben Richtlinien und dieselbe Sitzungshistorie gelten unabhängig davon, in welchem Harness ein Agent läuft. Eine Adapter-Schicht überführt die nativen Ereignisnamen, Tool-Namen und Tool-Eingabefelder jedes Harness in 29 kanonische Ereignisse, bevor eine Richtlinie ausgeführt wird.
-Ein Agent, der in **keinem** der zwölf Harnesses läuft, wird direkt mit dem [Python SDK](/de/reference/custom-agents) instrumentiert. Das ist ein anderer Vertrag, und es lohnt sich, dies klar zu benennen: Das SDK liefert Tracing, Sitzungen, Evaluierungen und Audits — **es setzt Richtlinien nicht eigenständig durch.** Um eine unsichere Aktion zu blockieren, bevor sie ausgeführt wird, ist ein Enforcement-Hook an der Tool-Grenze Ihrer Laufzeitumgebung erforderlich. [Kontaktieren Sie uns](mailto:support@befailproof.ai), und wir werden die Zuordnung vornehmen.
+Ein Agent, der in **keinem** der zwölf Harnesses läuft, wird direkt über das [Python SDK](/de/reference/custom-agents) instrumentiert. Das ist ein anderer Vertrag, und er sollte klar benannt werden: Das SDK liefert Tracing, Sitzungen, Evaluierungen und Audits — **es setzt Richtlinien jedoch nicht eigenständig durch.** Das Blockieren einer unsicheren Aktion, bevor sie ausgeführt wird, erfordert einen Durchsetzungs-Hook an der Tool-Grenze Ihrer Laufzeitumgebung; [kontaktieren Sie uns](mailto:support@befailproof.ai) und wir werden es einrichten.
| Harness | Unterstützte Hook-Scopes |
| --- | --- |
@@ -20,49 +20,49 @@ Ein Agent, der in **keinem** der zwölf Harnesses läuft, wird direkt mit dem [P
| Factory Droid, Devin CLI, Antigravity CLI, Goose | User, project |
| Hermes, OpenClaw | User |
-Jede Integration normalisiert ihre nativen Hook-Ereignisnamen, Tool-Namen und Tool-Eingabefelder, bevor Richtlinien ausgeführt werden. Eine Richtlinie kann nur auf Ereignisse reagieren, die der Harness bereitstellt. Testen Sie das Verhalten am Ende eines Turns und das Verhalten bei Anweisungen auf dem genauen Harness und der genauen Version, die Sie einsetzen.
+Jede Integration normalisiert ihre nativen Hook-Ereignisnamen, Tool-Namen und Tool-Eingabefelder, bevor Richtlinien ausgeführt werden. Eine Richtlinie kann nur auf Ereignisse reagieren, die der Harness exponiert; testen Sie das End-of-Turn- und Instruction-Verhalten auf dem genauen Harness und der Version, die Sie deployen.
-## Durchsetzungsfähigkeit
+## Durchsetzungsfähigkeiten
-„Blockieren" bedeutet, dass das vom aktuellen Adapter zurückgegebene Urteil vom genannten Harness verarbeitet wird. Post-Tool-Blockierung kann das dem Modell angezeigte Ergebnis ersetzen, aber keine Tool-Nebenwirkung rückgängig machen, die bereits eingetreten ist.
+„Blockieren" bedeutet, dass das zurückgegebene Urteil des aktuellen Adapters vom angegebenen Harness verarbeitet wird. Post-Tool-Blocking kann das dem Modell angezeigte Ergebnis ersetzen, aber einen bereits eingetretenen Tool-Nebeneffekt nicht rückgängig machen.
-| Harness | Verifizierte Blockierungsereignisse | Nur-Beobachtungs- oder nicht-blockierende Hinweise |
+| Harness | Verifizierte Blockierungsereignisse | Nur-Beobachtungs- oder Nicht-Blockierungs-Hinweise |
| --- | --- | --- |
-| Claude Code | `PreToolUse`, `UserPromptSubmit`, `PermissionRequest`, `Stop`, `SubagentStop`, `PreCompact` und mehrere Task-/Konfigurationsereignisse | `PostToolUse`, Sitzungslebenszyklus, Benachrichtigungen und Post-Fehler-Ereignisse sind beobachtend. |
-| Codex | `PreToolUse`, `PermissionRequest`, `UserPromptSubmit`, `Stop`, `SubagentStop`, `PostToolUse` | Post-Tool-Blockierung ersetzt das Ergebnis nach der Ausführung; Sitzungsstart- und Compact-Ereignisse sind im aktuellen Adapter beobachtend. |
-| GitHub Copilot CLI | `PreToolUse`, `UserPromptSubmit`, `PermissionRequest`, `Stop`, `SubagentStop`, `PostToolUse` | Post-Tool-Blockierung ersetzt das Ergebnis nach der Ausführung; Sitzungs- und Benachrichtigungsereignisse sind beobachtend. |
-| Cursor | `PreToolUse`, `UserPromptSubmit`, `Stop` | `PostToolUse` und Sitzungsereignisse sind beobachtend. |
-| OpenCode | `PreToolUse` | Post-Tool- und Lebenszyklusereignisse sind beobachtend; die aktuelle Stop-Behandlung ist eine Empfehlung für einen späteren Turn, kein verifiziertes Gate. |
-| Pi | `PreToolUse`, `UserPromptSubmit` | Post-Tool- und Lebenszyklusereignisse sind beobachtend; Stop-Empfehlungen gelten für einen späteren Turn. |
+| Claude Code | `PreToolUse`, `UserPromptSubmit`, `PermissionRequest`, `Stop`, `SubagentStop`, `PreCompact` sowie mehrere Task-/Konfigurationsereignisse | `PostToolUse`, Sitzungslebenszyklus, Benachrichtigungen und Post-Failure-Ereignisse sind nur beobachtend. |
+| Codex | `PreToolUse`, `PermissionRequest`, `UserPromptSubmit`, `Stop`, `SubagentStop`, `PostToolUse` | Post-Tool-Blocking ersetzt das Ergebnis nach der Ausführung; Sitzungsstart- und Compact-Ereignisse sind im aktuellen Adapter nur beobachtend. |
+| GitHub Copilot CLI | `PreToolUse`, `UserPromptSubmit`, `PermissionRequest`, `Stop`, `SubagentStop`, `PostToolUse` | Post-Tool-Blocking ersetzt das Ergebnis nach der Ausführung; Sitzungs- und Benachrichtigungsereignisse sind nur beobachtend. |
+| Cursor | `PreToolUse`, `UserPromptSubmit`, `Stop` | `PostToolUse` und Sitzungsereignisse sind nur beobachtend. |
+| OpenCode | `PreToolUse` | Post-Tool- und Lifecycle-Ereignisse sind nur beobachtend; die aktuelle Stop-Behandlung ist eine Anleitung für einen späteren Turn, kein verifiziertes Gate. |
+| Pi | `PreToolUse`, `UserPromptSubmit` | Post-Tool- und Lifecycle-Ereignisse sind nur beobachtend; Stop-Anleitung gilt für einen späteren Turn. |
| Hermes | `PreToolUse` | Post-Tool-, Sitzungs- und Subagent-Stop-Urteile sind keine Gates. |
-| OpenClaw | `PreToolUse`, `UserPromptSubmit`, `Stop` | Post-Tool-, Sitzungs-, Subagent-Stop- und Compaction-Ereignisse sind beobachtend. |
-| Factory Droid | `PreToolUse`, `UserPromptSubmit`, `Stop`, `PreCompact` | Post-Tool- und Subagent-Stop-Urteile sind beobachtend. |
-| Devin CLI | `PreToolUse`, `UserPromptSubmit`, `Stop`, bedingtes `PermissionRequest` | Permission-Hooks laufen nicht in jedem Permission-Modus; Post-Tool- und Sitzungsereignisse sind beobachtend. |
-| Antigravity CLI | `PreToolUse`, `Stop` | User-Prompt- und Post-Tool-Urteile sind beobachtend; Prompt-Anweisungen können weiterhin injiziert werden. |
-| Goose | `PreToolUse` | User-Prompt-, Post-Tool- und Sitzungsereignisse sind beobachtend. Ein nativer blockierender Stop-Hook existiert im Upstream, wird aber vom aktuellen Adapter nicht installiert. |
+| OpenClaw | `PreToolUse`, `UserPromptSubmit`, `Stop` | Post-Tool-, Sitzungs-, Subagent-Stop- und Kompaktierungsereignisse sind nur beobachtend. |
+| Factory Droid | `PreToolUse`, `UserPromptSubmit`, `Stop`, `PreCompact` | Post-Tool- und Subagent-Stop-Urteile sind nur beobachtend. |
+| Devin CLI | `PreToolUse`, `UserPromptSubmit`, `Stop`, bedingtes `PermissionRequest` | Permission-Hooks laufen nicht in jedem Permission-Modus; Post-Tool- und Sitzungsereignisse sind nur beobachtend. |
+| Antigravity CLI | `PreToolUse`, `Stop` | User-Prompt- und Post-Tool-Urteile sind nur beobachtend; Prompt-Anweisungen können trotzdem injiziert werden. |
+| Goose | `PreToolUse` | User-Prompt-, Post-Tool- und Sitzungsereignisse sind nur beobachtend. Ein nativer blockierender Stop-Hook existiert vorgelagert, wird aber vom aktuellen Adapter nicht installiert. |
-Die Fähigkeiten sind versionsabhängig. Führen Sie nach dem Upgrade einer Agent-CLI erneut Tests durch, insbesondere wenn eine Richtlinie auf Prompt-, Stop-, Permission- oder Post-Tool-Verhalten statt auf das übliche Pre-Tool-Gate angewiesen ist.
+Die Fähigkeiten sind versionsabhängig. Führen Sie nach einem Upgrade eines Agent-CLI erneute Tests durch, insbesondere wenn eine Richtlinie auf Prompt-, Stop-, Permission- oder Post-Tool-Verhalten anstatt auf das übliche Pre-Tool-Gate angewiesen ist.
## Capture- und Policy-Hooks installieren
- 1. Öffnen Sie **Verwaltung → Schlüssel** und erstellen Sie einen Schlüssel mit `events:add` und `policies:pull`, benannt nach der Maschine oder Umgebung.
+ 1. Öffnen Sie **Administration → Keys** und erstellen Sie einen Schlüssel mit `events:add` und `policies:pull`, benannt nach der Maschine oder Umgebung.
2. Verbinden Sie auf der Zielmaschine die lokale CLI mit dem angezeigten Schlüssel und installieren Sie die Harness-Hooks.
- 3. Starten Sie eine neue Agent-Sitzung und bestätigen Sie deren Hook- und Sitzungsereignisse unter **Beobachten → Ereignisse**.
- 4. Öffnen Sie **Beobachten → Richtlinie** für dasselbe Zeitfenster und bestätigen Sie, dass eine Richtlinienentscheidung der Maschine zugeordnet wird.
+ 3. Starten Sie eine neue Agent-Sitzung und bestätigen Sie dann deren Hook- und Sitzungsereignisse unter **Observe → Events**.
+ 4. Öffnen Sie **Observe → policy** für dasselbe Zeitfenster und bestätigen Sie, dass eine Richtlinienentscheidung der Maschine zugeordnet ist.
- Die Verbindung beginnt mit einem Maschinenschlüssel. Vergewissern Sie sich, dass er sowohl Ingestion- als auch Policy-Delivery-Berechtigungen enthält, bevor Sie sein Secret kopieren.
+ Die Verbindung beginnt mit einem Maschinenschlüssel. Stellen Sie sicher, dass er sowohl Ingestion- als auch Policy-Delivery-Berechtigungen enthält, bevor Sie das Secret kopieren.
- 
+ 
Nach der Installation der Hooks sollte der Ereignis-Stream neue Ereignisse von der verbundenen Maschine und Umgebung anzeigen.
- 
+ 
Überprüfen Sie abschließend, ob Richtlinienentscheidungen derselben Maschine zugeordnet werden. Dies bestätigt, dass der Harness sowohl Richtlinienaktivitäten als auch Trace-Ereignisse meldet.
- 
+ 
Hooks für alle erkannten Harnesses installieren:
@@ -74,7 +74,7 @@ Die Fähigkeiten sind versionsabhängig. Führen Sie nach dem Upgrade einer Agen
failproofai policies --install
```
- Oder gezielt benannte Harnesses und einen Konfigurationsscope angeben:
+ Oder gezielt benannte Harnesses und einen Konfigurationsscope ansprechen:
```bash
failproofai policies --install \
@@ -82,9 +82,9 @@ Die Fähigkeiten sind versionsabhängig. Führen Sie nach dem Upgrade einer Agen
--scope user
```
- Der Project-Scope hält die Hook-Konfiguration bei einem Repository. Der User-Scope deckt die Arbeit über mehrere Repositories hinweg ab. Claude Code unterstützt zusätzlich den Local-Scope; die Unterstützung variiert je nach Harness, und die CLI lehnt nicht unterstützte Kombinationen ab.
+ Der Project-Scope hält die Hook-Konfiguration bei einem Repository. Der User-Scope deckt die Arbeit über Repositories hinweg ab. Claude Code unterstützt außerdem den Local-Scope; die Unterstützung variiert je nach Harness, und die CLI lehnt nicht unterstützte Kombinationen ab.
- Maschine und ihre Ereignisse überprüfen:
+ Die Maschine und ihre Ereignisse überprüfen:
```bash
failproofai config --status
@@ -94,16 +94,16 @@ Die Fähigkeiten sind versionsabhängig. Führen Sie nach dem Upgrade einer Agen
-## Einen nicht standardmäßigen Sitzungspfad hinzufügen
+## Einen nicht-standardmäßigen Sitzungspfad hinzufügen
- Zusätzliche Pfade werden auf der Maschine registriert, nicht in der Cloud. Nachdem Sie einen hinzugefügt haben, öffnen Sie **Beobachten → Sitzungen**, filtern Sie nach der Umgebung der Maschine und bestätigen Sie, dass Sitzungen aus dem neuen Pfad erscheinen. Öffnen Sie eine Sitzung und überprüfen Sie Agent, Harness und Ereigniszeitstempel, bevor Sie ihn in einem Audit verwenden.
+ Zusätzliche Pfade werden auf der Maschine registriert, nicht in der Cloud. Nach dem Hinzufügen öffnen Sie **Observe → Sessions**, filtern Sie nach der Umgebung der Maschine und bestätigen Sie, dass Sitzungen aus dem neuen Pfad erscheinen. Öffnen Sie eine Sitzung und überprüfen Sie Agent, Harness und Ereignis-Timestamps, bevor Sie sie in einem Audit verwenden.
- 
+ 
- Einen Pfad mit optionalem Label hinzufügen und die konfigurierten Pfade anzeigen:
+ Einen Pfad mit optionalem Label hinzufügen und dann die konfigurierten Pfade prüfen:
```bash
failproofai harness add-path claude checkout=/srv/checkout/.claude
@@ -117,5 +117,5 @@ Die Fähigkeiten sind versionsabhängig. Führen Sie nach dem Upgrade einer Agen
- Führen Sie nach der Installation eine neue Sitzung aus. Überprüfen Sie sowohl den Live-Ereignis-Stream als auch eine tatsächliche Richtlinienentscheidung, bevor Sie den Rollout ausweiten.
+ Führen Sie nach der Installation eine neue Sitzung durch. Überprüfen Sie sowohl den Live-Ereignis-Stream als auch eine tatsächliche Richtlinienentscheidung, bevor Sie den Rollout ausweiten.
\ No newline at end of file
diff --git a/docs/de/reference/overview.mdx b/docs/de/reference/overview.mdx
index 84911bf93..a045ba491 100644
--- a/docs/de/reference/overview.mdx
+++ b/docs/de/reference/overview.mdx
@@ -1,61 +1,64 @@
---
title: "Integrationen und Referenz"
-description: "Unterstützte Agent-Harnesses, SDKs, CLIs und die HTTP API verbinden."
+description: "Unterstützte Agent-Harnesses, SDKs, CLIs und die HTTP-API verbinden."
icon: "braces"
---
-Wählen Sie die Integration, die am nächsten an der Umgebung liegt, in der Ihr Agent bereits läuft.
+Wählen Sie die Integration, die am besten zu Ihrer bestehenden Agent-Umgebung passt.
Hooks für unterstützte Coding- und autonome Agent-CLIs installieren.
-
- Traces instrumentieren, um Fehler in eigenen Agenten zu finden, und uns anschließend kontaktieren, um Prävention in Ihre Runtime einzubinden.
+
+ LangGraph, CrewAI, LlamaIndex, Pydantic AI oder einen benutzerdefinierten Agenten instrumentieren.
+
+
+ Konfiguration, der Event-Katalog, Korrelationsregeln und Zustellung.
- Lokale Projekte, Sitzungen, Policy-Aktivitäten und Offline-Audits einsehen.
+ Lokale Projekte, Sitzungen, Policy-Aktivität und Offline-Audits einsehen.
- Lokale Erfassung, Hooks, Policies, Audits, Delivery und Maschinenstatus konfigurieren.
+ Lokale Erfassung, Hooks, Policies, Audits, Zustellung und Maschinenstatus konfigurieren.
- Cloud-Sitzungen, Audits, Issues, Alerts, Keys, Benutzer und Einstellungen abfragen und verwalten.
+ Cloud-Sitzungen, Audits, Issues, Alerts, Schlüssel, Benutzer und Einstellungen abfragen und verwalten.
Abgeschlossene oder inaktive Sitzungen mit einem FastAPI-Dienst bewerten.
-
+
Workflow-spezifische allow-, instruct- und deny-Entscheidungen erstellen und testen.
- Die Cloud-Control-Plane auf einem kundenverwalteten Kubernetes-Cluster betreiben.
+ Die Cloud-Steuerungsebene auf einem kundenverwalteten Kubernetes-Cluster bereitstellen.
-Die generierte [HTTP-API-Referenz](/de/reference/http-api) deckt die öffentliche `/v1`-Oberfläche ab. Manuell verfasste Seiten erläutern Workflows, die mehrere Endpunkte umfassen oder administrative Schnittstellen außerhalb dieser öffentlichen Oberfläche nutzen.
+Die generierte [HTTP-API-Referenz](/de/reference/http-api) deckt die öffentliche `/v1`-Oberfläche ab. Manuell verfasste Seiten erläutern Workflows, die mehrere Endpunkte umfassen oder administrative Schnittstellen außerhalb dieser öffentlichen Oberfläche verwenden.
-## Agenten verbinden und Daten verifizieren
+## Einen Agenten verbinden und Daten überprüfen
- 1. Öffnen Sie **Administration → Keys**, erstellen Sie einen Key mit `events:add` und `policies:pull`, und kopieren Sie das Secret.
- 2. Konfigurieren Sie die Integration anhand der passenden Seite oben.
- 3. Öffnen Sie **Observe → Events**, um zu bestätigen, dass Events ankommen, und dann **Observe → Sessions**, um zu prüfen, ob sie vollständige Runs bilden.
- 4. Filtern Sie nach der Umgebung der Integration und prüfen Sie eine Sitzung auf die Felder für Modell, Tool, Fehler und Policy, die für Audits benötigt werden.
+ 1. Öffnen Sie **Administration → Keys**, erstellen Sie einen Schlüssel mit `events:add` und `policies:pull`, und kopieren Sie das Secret.
+ 2. Konfigurieren Sie die Integration über die entsprechende Seite oben.
+ 3. Öffnen Sie **Observe → Events**, um den Eingang von Events zu bestätigen, dann **Observe → Sessions**, um zu bestätigen, dass diese vollständige Ausführungen bilden.
+ 4. Filtern Sie nach der Umgebung der Integration und prüfen Sie eine Sitzung auf die für Audits benötigten Felder: Modell, Tool, Fehler und Policy.
- Beginnen Sie mit dem Key-Drawer. Die ausgewählten Berechtigungen bestimmen, ob die Maschine Events senden und Cloud-verwaltete Policies empfangen kann.
+ Beginnen Sie mit dem Schlüssel-Drawer. Die ausgewählten Berechtigungen bestimmen, ob die Maschine Events senden und Cloud-verwaltete Policies empfangen kann.
- 
+ 
- Nach dem Verbinden der Integration können Sie die Sitzungsliste verwenden, um zu bestätigen, dass die Events in der erwarteten Umgebung zu vollständigen Runs zusammengefasst werden.
+ Verwenden Sie nach dem Verbinden der Integration die Sitzungsliste, um zu bestätigen, dass die Events in der erwarteten Umgebung zu vollständigen Ausführungen gruppiert werden.
- 
+ 
- Öffnen Sie eine dieser Sitzungen, bevor Sie die Integration als abgeschlossen betrachten; der Trace sollte das Modell, das Tool, den Fehler sowie die Policy-Nachweise enthalten, die Ihre Audits benötigen.
+ Öffnen Sie eine dieser Sitzungen, bevor Sie die Integration als abgeschlossen betrachten. Der Trace sollte das Modell, Tool, den Fehler und die Policy-Nachweise enthalten, die Ihre Audits benötigen.
- Erstellen Sie einen Machine-Key, verbinden Sie den Failproof-Daemon und verifizieren Sie die erste Sitzung.
+ Erstellen Sie einen Maschinenschlüssel, verbinden Sie den Failproof-Daemon und überprüfen Sie die erste Sitzung.
```bash
fp keys create agent-production \
@@ -71,8 +74,8 @@ Die generierte [HTTP-API-Referenz](/de/reference/http-api) deckt die öffentlich
fp events --since 1h --env production --limit 20
```
- Verwenden Sie `fp --json sessions ...`, wenn das Ergebnis von einem anderen Tool weiterverarbeitet wird. Globale Flags wie `--json`, `--org` und `--base-url` müssen vor dem Befehl angegeben werden.
+ Verwenden Sie `fp --json sessions ...`, wenn das Ergebnis von einem anderen Tool verarbeitet werden soll. Globale Flags wie `--json`, `--org` und `--base-url` müssen vor dem Befehl angegeben werden.
- Weitere Informationen zu lokalen Befehlen finden Sie in der [Failproof AI CLI-Referenz](/de/reference/failproof-cli) und zu `fp`-Befehlen in der [Failproof Cloud CLI-Referenz](/de/reference/cloud-cli#cli-commands).
+ Weitere Informationen finden Sie in der [Failproof AI CLI-Referenz](/de/reference/failproof-cli) für lokale Befehle und in der [Failproof Cloud CLI-Referenz](/de/reference/cloud-cli#cli-commands) für `fp`-Befehle.
\ No newline at end of file
diff --git a/docs/de/reference/troubleshooting.mdx b/docs/de/reference/troubleshooting.mdx
index c0a4acfe8..f4eb3a0d0 100644
--- a/docs/de/reference/troubleshooting.mdx
+++ b/docs/de/reference/troubleshooting.mdx
@@ -1,6 +1,6 @@
---
title: "Fehlerbehebung"
-description: "Diagnose fehlender Sitzungen, fehlender Richtlinien, fehlgeschlagener Übertragungen und blockierter Agenten-Aktionen."
+description: "Diagnose von fehlenden Sitzungen, fehlenden Richtlinien, fehlgeschlagener Zustellung und blockierten Agent-Aktionen."
icon: "wrench"
---
@@ -8,9 +8,9 @@ icon: "wrench"
- Öffne **Verwaltung → Schlüssel** und bestätige, dass der Maschinenschlüssel aktiv ist und die Berechtigung `events:add` besitzt. Öffne dann **Beobachten → Ereignisse**, erweitere den Zeitraum und entferne Umgebungs- und Agenten-Filter. Falls Ereignisse vorhanden sind, suche nach der Sitzungs-ID und prüfe anschließend **Beobachten → Sitzungen** auf Gruppierungen. Falls keine Ereignisse vorhanden sind, diagnostiziere den Failproof-Daemon über die CLI.
+ Öffne **Administration → Schlüssel** und prüfe, ob der Maschinenschlüssel aktiv ist und `events:add` besitzt. Öffne dann **Beobachten → Ereignisse**, erweitere den Zeitraum und entferne Umgebungs- und Agent-Filter. Wenn Ereignisse vorhanden sind, suche nach der Sitzungs-ID und prüfe dann **Beobachten → Sitzungen** auf Gruppierungen. Wenn keine Ereignisse vorhanden sind, diagnostiziere den Failproof-Daemon über die CLI.
- 
+ 
```bash
@@ -21,14 +21,14 @@ icon: "wrench"
fp sessions --since 24h --limit 20
```
- Bestätige, dass die Erfassung aktiviert ist, der konfigurierte Schlüssel `events:add` besitzt und der Dashboard-Filter mit der ausgesendeten Umgebung übereinstimmt.
+ Bestätige, dass die Erfassung aktiviert ist, der konfigurierte Schlüssel `events:add` besitzt und der Dashboard-Filter zur emittierten Umgebung passt.
-
+
- Entferne Filter unter **Beobachten → Ereignisse** und suche nach der genauen SDK-Sitzungs-ID. Falls nichts erscheint, untersuche den SDK-Spool und den Failproof-Daemon auf dem Quellrechner.
+ Entferne Filter unter **Beobachten → Ereignisse** und suche nach der exakten SDK-Sitzungs-ID. Wenn nichts erscheint, untersuche den SDK-Spool und den Failproof-Daemon auf dem Quellrechner.
```bash
@@ -36,14 +36,14 @@ icon: "wrench"
failproofai flush --wait
```
- Bestätige, dass der Agenten-Prozess `AGENTEYE_SPOOL_TO_FAILPROOFAI=1` setzt und dass `$FAILPROOFAI_HOME/custom-agents` – andernfalls `~/.failproofai/custom-agents` – vorhanden ist, bevor das SDK startet.
+ Bestätige, dass ein Daemon läuft und verbunden ist – das SDK spult unabhängig davon, ob einer vorhanden ist. Das Spool-Verzeichnis muss **nicht** vorab existieren (der Schreiber erstellt es), und keine Umgebungsvariable wählt es aus: `$FAILPROOFAI_HOME/custom-agents`, andernfalls `~/.failproofai/custom-agents`, ist der einzige Wurzelpfad, und `configure(base_dir=...)` ist die einzige Überschreibungsmöglichkeit. Wenn der Prozess per `SIGKILL` oder durch OOM beendet wurde, gehen noch in der Warteschlange befindliche Daten verloren – verarbeite `SIGTERM`, um das zu begrenzen.
- Öffne **Admin → Durchsetzung**, wähle den Rechner aus und vergleiche dessen zugewiesene, gemeldete und vorherige Versionen. Bestätige, dass der Deployment-Geltungsbereich den Rechner einschließt und sein Schlüssel `policies:pull` besitzt. Die Erfassung kann funktionieren, auch wenn die Richtlinienübertragung fehlschlägt.
+ Öffne **Admin → Durchsetzung**, wähle den Rechner aus und vergleiche dessen zugewiesene, gemeldete und frühere Versionen. Prüfe, ob der Deployment-Scope den Rechner einschließt und sein Schlüssel `policies:pull` besitzt. Die Ereignisaufnahme kann funktionieren, auch wenn die Richtlinienlieferung nicht funktioniert.
@@ -53,14 +53,14 @@ icon: "wrench"
failproofai config --status
```
- Bestätige, dass Rechner-ID und -Bezeichnung mit dem Dashboard-Ziel übereinstimmen. Stelle die Verbindung mit einem richtlinienfähigen Schlüssel wieder her, falls der vorhandene Schlüssel nur die Ereigniserfassung erlaubt.
+ Prüfe, ob Maschinen-ID und Bezeichnung mit dem Dashboard-Ziel übereinstimmen. Stelle bei Bedarf die Verbindung mit einem richtlinienfähigen Schlüssel her, wenn die vorhandenen Anmeldedaten nur die Ereignisaufnahme erlauben.
- Öffne **Admin → Durchsetzung** und prüfe den Zeitpunkt der letzten Aktivität und die gemeldete Version des Rechners. Falls der Rechner veraltet ist, handelt es sich um ein lokales Daemon-Problem. Schwäche die bereitgestellte Richtlinie nicht allein deshalb ab, um einen nicht verfügbaren Daemon zu umgehen.
+ Öffne **Admin → Durchsetzung** und überprüfe den Zeitpunkt der letzten Verbindung des Rechners sowie die gemeldete Version. Wenn der Rechner veraltet ist, handelt es sich um ein lokales Daemon-Problem. Schwäche die bereitgestellte Richtlinie nicht allein aus, um einen nicht verfügbaren Daemon zu umgehen.
@@ -71,18 +71,18 @@ icon: "wrench"
failproofai config --status
```
- Starte `failproofaid` neu oder aktualisiere es; führe die Konfiguration erneut aus, wenn sich die Protokollversionen von CLI und Daemon unterscheiden. Der konfigurierte Daemon-Pfad schlägt planmäßig auf sichere Weise fehl.
+ Starte `failproofaid` neu oder aktualisiere es; führe die Konfiguration erneut aus, wenn sich die Protokollversionen von CLI und Daemon unterscheiden. Der konfigurierte Daemon-Pfad schlägt by design auf Sperrung fehl.
- Für eine Cloud-erstellte Richtlinie: Öffne **Admin → Richtlinien-Editor**, wähle den Entwurf aus und prüfe Validierungsfehler vor der Veröffentlichung. Für eine lokale Richtlinie: Validiere sie über die CLI und öffne anschließend **Beobachten → Richtlinie** nach einer Testaktion, um zu bestätigen, dass Entscheidungen ankommen.
+ Öffne bei einer Cloud-erstellten Richtlinie den **Admin → Richtlinien-Editor**, wähle den Entwurf aus und überprüfe Validierungsfehler vor der Veröffentlichung. Validiere bei einer lokalen Richtlinie diese über die CLI und öffne dann nach einer Testüberprüfung **Beobachten → Richtlinien**, um zu bestätigen, dass Entscheidungen ankommen.
- Stelle sicher, dass der Dateiname auf `policies.js`, `policies.mjs` oder `policies.ts` endet, das Modul `customPolicies.add(...)` aufruft und Importe aus der Richtliniendatei auflösbar sind.
+ Stelle sicher, dass der Dateiname auf `policies.js`, `policies.mjs` oder `policies.ts` endet, das Modul `customPolicies.add(...)` aufruft und Imports aus der Richtliniendatei auflösbar sind.
```bash
failproofai policies --install --custom ./checkout.policies.ts
@@ -94,11 +94,11 @@ icon: "wrench"
- Öffne **Analysieren → Audits**, wähle den Lauf aus und prüfe, ob die Modellanalyse ausgeführt wurde. Vergleiche anschließend Geltungsbereich und Zeitfenster mit **Beobachten → Sitzungen** und öffne repräsentative Traces aus dieser Population.
+ Öffne **Analysieren → Audits**, wähle den Durchlauf aus und prüfe, ob die Modellanalyse ausgeführt wurde. Vergleiche dann Scope und Zeitfenster mit **Beobachten → Sitzungen** und öffne repräsentative Traces aus dieser Population.
- Ein Nullergebnis ist nur dann aussagekräftig, wenn die Analyse erfolgreich durchgeführt wurde. Falls die Analyse übersprungen oder fehlgeschlagen ist, liefert der Lauf keine Ergebnisse und hält das nicht analysierte Zeitfenster für einen künftigen erfolgreichen Lauf offen. Falls die Modellanalyse deaktiviert ist, liefert das Audit ebenfalls keine Ergebnisse, da der deterministische Anmeldedaten- und PII-Scan nur Statistiken erfasst, aber keine Befunde mehr meldet.
+ Ein Null-Ergebnis ist nur dann aussagekräftig, wenn die Analyse erfolgreich durchgeführt wurde. Wenn die Analyse übersprungen wurde oder fehlgeschlagen ist, produziert der Durchlauf keine Ergebnisse und hält das nicht analysierte Fenster für einen zukünftigen erfolgreichen Durchlauf offen. Wenn die Modellanalyse deaktiviert ist, produziert das Audit ebenfalls keine Ergebnisse, da der deterministische Credential- und PII-Scan nur Statistiken aufzeichnet, aber keine Befunde mehr meldet.
- 
+ 
```bash
@@ -110,31 +110,31 @@ icon: "wrench"
fp audits findings --audit
```
- Falls der Lauf in der Warteschlange verblieben ist, warte auf freie Audit-Agenten-Kapazität oder bitte den Deployment-Operator, die Audit-Flotte zu prüfen. Ein in der Warteschlange befindliches Audit wird wiederholt; es wird nicht sofort übersprungen.
+ Wenn der Durchlauf in der Warteschlange verblieben ist, warte auf Audit-Agent-Kapazität oder bitte den Deployment-Betreiber, die Audit-Flotte zu überprüfen. Ein Audit in der Warteschlange wird erneut versucht; es wird nicht sofort übersprungen.
-
+
- Öffne eine abgeschlossene Sitzung und prüfe, ob eine manuelle Evaluierung erfolgreich ist. Im gehosteten Cloud-Betrieb gibt es derzeit keine Steuerung des Evaluator-Endpunkts im Dashboard; der Server-Operator muss dies konfigurieren.
+ Öffne eine abgeschlossene Sitzung und prüfe, ob eine manuelle Auswertung erfolgreich ist. Hosted Cloud bietet derzeit keine Kontrolle über den Evaluator-Endpunkt im Dashboard; der Server-Betreiber muss dies konfigurieren.
- Überprüfe den Evaluator selbst und untersuche dann aktuelle Evaluierungszustände:
+ Überprüfe zunächst den Evaluator selbst und untersuche dann die aktuellen Auswertungszustände:
```bash
curl https://evaluator.example.com/health
fp evals --since 1h
```
- Bei selbst gehosteter Cloud: Bestätige, dass `EVALUATOR_ENDPOINT` auf dem Server vorhanden ist und `EVALUATOR_TOKEN` mit dem Evaluator übereinstimmt. Die automatische Evaluierung ist deaktiviert, wenn der Endpunkt fehlt.
+ Stelle bei selbst gehostetem Cloud sicher, dass `EVALUATOR_ENDPOINT` auf dem Server vorhanden ist und `EVALUATOR_TOKEN` mit dem Evaluator übereinstimmt. Die automatische Auswertung ist deaktiviert, wenn der Endpunkt fehlt.
- Nutze den Organisations-Umschalter und bestätige den erwarteten Slug sowie die Berechtigungen, bevor du die Ergebnisse mit der CLI vergleichst.
+ Verwende den Organisationswechsler und bestätige den erwarteten Slug und die Berechtigungen, bevor du die Ergebnisse mit der CLI vergleichst.
```bash
@@ -143,18 +143,18 @@ icon: "wrench"
fp orgs perms
```
- Im API-Schlüssel-Modus: Gib `fp --org --api-key ...` an oder setze `AGENTEYE_ORG`. Der gespeicherte Organisationszustand einer Human-Session wird für API-Schlüssel-Anfragen absichtlich ignoriert.
+ Gib im API-Schlüsselmodus `fp --org --api-key ...` an oder setze `AGENTEYE_ORG`. Der gespeicherte Organisationsstatus einer menschlichen Sitzung wird bei API-Schlüssel-Anfragen absichtlich ignoriert.
- Öffne **Beobachten → Richtlinie**, bewahre die Entscheidung und die verknüpfte Sitzung und identifiziere die False-Positive-Bedingung. Öffne dann **Admin → Durchsetzung** und setze die betroffenen Rechner auf die vorherige Version zurück. Erstelle eine engere Version im **Richtlinien-Editor**, teste sie auf einem kleinen Geltungsbereich und erweitere ihn erst, wenn legitime Arbeit erfolgreich ausgeführt wird.
+ Öffne **Beobachten → Richtlinien**, sichere die Entscheidung und die verknüpfte Sitzung und identifiziere die False-Positive-Bedingung. Öffne dann **Admin → Durchsetzung** und setze die betroffenen Rechner auf die vorherige Version zurück. Erstelle eine engere Version im **Richtlinien-Editor**, teste sie auf einem kleinen Scope und erweitere ihn erst, wenn legitime Arbeit erfolgreich ist.
- Ein Rollback der Cloud-Bereitstellung ist ausschließlich über das Dashboard möglich. Eine lokale Sitzungspause deaktiviert Cloud-verwaltete Richtlinien nicht. Falls das Dashboard nicht verfügbar ist, erfasse den Rechner- und Deployment-Zustand und stelle den Dashboard-Zugang wieder her, anstatt die blockierte Aktion wiederholt zu versuchen.
+ Das Zurücksetzen von Cloud-Deployments ist nur über das Dashboard möglich. Eine lokale Sitzungspause deaktiviert Cloud-verwaltete Richtlinien nicht. Wenn das Dashboard nicht verfügbar ist, erfasse den Rechner- und Deployment-Status und stelle den Dashboard-Zugang wieder her, anstatt die blockierte Aktion wiederholt zu versuchen.
```bash
failproofai config --status
@@ -164,4 +164,4 @@ icon: "wrench"
-Wenn du den Support kontaktierst, gib die CLI-Version, das Harness, die Umgebung, die relevante Sitzungs- oder Deployment-ID sowie die Ausgabe von `failproofai config --status` (ohne vertrauliche Informationen) an.
\ No newline at end of file
+Wenn du den Support kontaktierst, gib die CLI-Version, den Harness, die Umgebung, die relevante Sitzungs- oder Deployment-ID sowie die Ausgabe von `failproofai config --status` mit entfernten Geheimnissen an.
\ No newline at end of file
diff --git a/docs/de/sessions/live-events.mdx b/docs/de/sessions/live-events.mdx
index 1111f15ab..555191564 100644
--- a/docs/de/sessions/live-events.mdx
+++ b/docs/de/sessions/live-events.mdx
@@ -1,21 +1,21 @@
---
title: "Live-Events"
-description: "Beobachte Agenten-Aktivität in Echtzeit, während eine Sitzung läuft."
+description: "Beobachte Agenten-Aktivitäten in Echtzeit während einer laufenden Session."
icon: "radio"
---
-Live-Events helfen dir, die Instrumentierung zu bestätigen und einen riskanten Lauf zu beobachten, ohne auf das Ende der Sitzung warten zu müssen.
+Live-Events helfen dir, die Instrumentierung zu bestätigen und einen riskanten Durchlauf zu beobachten, ohne auf das Ende der Session warten zu müssen.
## Aktivität beobachten
1. Gehe zu **Observe → Events**.
- 2. Beginne mit dem aktuellen Zeitfenster und ohne Filter, um zu bestätigen, dass Daten ankommen.
- 3. Filtere nach Umgebung, Event-Typ, Agent oder Sitzung. Nutze die Suche für Payload-Text.
- 4. Wähle ein Event aus, um dessen Zusammenfassung und Details einzusehen. Folge dem Sitzungslink für den vollständigen Trace.
+ 2. Starte mit dem aktuellen Zeitfenster und ohne Filter, um zu bestätigen, dass Daten ankommen.
+ 3. Filtere nach Umgebung, Event-Typ, Agent oder Session. Verwende die Suche für Payload-Text.
+ 4. Wähle ein Event aus, um seine Zusammenfassung und Details einzusehen. Folge dem Session-Link für den vollständigen Trace.
- 
+ 
```bash
@@ -24,22 +24,22 @@ Live-Events helfen dir, die Instrumentierung zu bestätigen und einen riskanten
fp --json events --full --session-id --all
```
- Der Standard-Feed lässt rohe Payloads aus. Verwende `--full` nur für eine zeitlich begrenzte Sitzungsuntersuchung.
+ Der Standard-Feed lässt rohe Payloads weg. Verwende `--full` nur für eine eingegrenzte Session-Untersuchung.
Nutze den Event-Stream, um drei unmittelbare Fragen zu beantworten:
-- Meldet sich der erwartete Agent in der richtigen Umgebung?
+- Meldet sich der erwartete Agent an die richtige Umgebung?
- Kommen Modellaufrufe, Tool-Aufrufe und Policy-Entscheidungen in der richtigen Reihenfolge an?
-- Hat die Sitzung aufgehört, Fortschritte zu machen, oder beginnt sie, eine Aktion zu wiederholen?
+- Hat die Session aufgehört, Fortschritte zu machen, oder wiederholt sie eine Aktion?
-Event-Typen umfassen Agent-Lifecycle-Events, Modellanfragen und -antworten, Tool-Nutzung und -Ergebnisse, Hook-Ausführung, Human-Waits und Interrupts sowie explizite Fehler. Korrelations-IDs verbinden zusammengehörige Events, wie etwa einen Tool-Aufruf und sein Ergebnis.
+Event-Typen umfassen Agent-Lifecycle-Events, Modellanfragen und -antworten, Tool-Nutzung und -Ergebnisse, Hook-Ausführung, menschliche Wartezeiten und Unterbrechungen sowie explizite Fehler. Korrelations-IDs verbinden zusammengehörige Events, wie etwa einen Tool-Aufruf und sein Ergebnis.
- Halte die Live-Ansicht zunächst breit gefächert, wenn du eine neue Integration überprüfst. Füge Filter erst hinzu, nachdem du das erste Event gesehen hast – ein falscher Filter kann wie eine fehlgeschlagene Datenaufnahme aussehen.
+ Lass die Live-Ansicht zunächst breit, während du eine neue Integration verifizierst. Füge Filter erst hinzu, nachdem du das erste Event gesehen hast – ein falscher Filter kann wie eine fehlgeschlagene Ingestion aussehen.
-Falls keine Events erscheinen, führe `failproofai config --status` aus und [behebe Ingestion-Probleme](/de/reference/troubleshooting).
+Wenn keine Events erscheinen, führe `failproofai config --status` aus und [behebe Ingestion-Probleme](/de/reference/troubleshooting).
-Agenten, die nicht in einem der 12 unterstützten [Harnesses](/de/reference/harnesses) laufen, melden dieselben Event-Typen über das [Python SDK](/de/reference/custom-agents), einschließlich der Human-in-the-Loop-Events (`human_wait`, `human_input`, `human_interrupt`), auf die Gateway- und Produktionsagenten angewiesen sind.
\ No newline at end of file
+Agents, die nicht in einem der 12 unterstützten [Harnesses](/de/reference/harnesses) laufen, melden dieselben Event-Typen über das [Python SDK](/de/reference/custom-agents), einschließlich der Human-in-the-Loop-Events (`human_wait`, `human_input`, `human_interrupt`), auf die Gateway- und Produktions-Agents angewiesen sind.
\ No newline at end of file
diff --git a/docs/de/start/first-policy.mdx b/docs/de/start/first-policy.mdx
index 1b36e7445..656025812 100644
--- a/docs/de/start/first-policy.mdx
+++ b/docs/de/start/first-policy.mdx
@@ -1,33 +1,33 @@
---
title: "Verhindern Sie Ihren ersten Fehler mit einer Policy"
-description: "Erstellen Sie eine Policy-Version, stellen Sie sie im Beobachtungsmodus bereit und setzen Sie sie anschließend durch."
+description: "Erstellen Sie eine Policy-Version, stellen Sie sie im Beobachtungsmodus bereit und setzen Sie sie dann durch."
icon: "shield-check"
---
-Verwenden Sie eine Policy erst dann, wenn Sie die unsichere Aktion und die legitimen Aktionen, die weiterhin erlaubt bleiben müssen, klar beschreiben können.
+Verwenden Sie eine Policy erst, wenn Sie die unsichere Aktion und die legitimen Aktionen, die weiterhin erlaubt bleiben müssen, beschreiben können.
-
- Gehen Sie zu **Admin → Policy-Editor**. Beginnen Sie mit der Demo-Policy, überprüfen oder bearbeiten Sie deren Quellcode und wählen Sie dann **Version veröffentlichen**. Durch die Veröffentlichung wird die unveränderliche Version erstellt, die Sie auf Maschinen bereitstellen können.
+
+ Gehen Sie zu **Admin → Policy-Editor**. Starten Sie mit der Demo-Policy, prüfen oder bearbeiten Sie den Quellcode und wählen Sie dann **Version veröffentlichen**. Das Veröffentlichen erstellt die unveränderliche Version, die Sie auf Maschinen bereitstellen können.
- 
+ 
-
- Gehen Sie zu **Admin → Durchsetzung**, erweitern Sie die Zielmaschine und wählen Sie **Diese Maschine bearbeiten**. Fügen Sie die veröffentlichte Demo-Policy hinzu, fixieren Sie deren Version, wählen Sie **Beobachten** und wenden Sie die Bereitstellung an.
+
+ Gehen Sie zu **Admin → Durchsetzung**, erweitern Sie die Zielmaschine und wählen Sie **diese Maschine bearbeiten**. Fügen Sie die veröffentlichte Demo-Policy hinzu, fixieren Sie deren Version, wählen Sie **Beobachten** und wenden Sie die Bereitstellung an.
- 
+ 
-
- Führen Sie eine neue Agent-Sitzung auf dieser Maschine aus und öffnen Sie dann **Beobachten → Policy**. Wählen Sie die Maschine aus und bestätigen Sie, dass die Demo-Policy in der Policy-Zuordnung und der Entscheidungszeitlinie angezeigt wird. Der Beobachtungsmodus zeichnet auf, was die Policy tun würde, ohne die Aktion zu blockieren.
+
+ Starten Sie eine neue Agent-Sitzung auf dieser Maschine und öffnen Sie dann **Beobachten → Policy**. Wählen Sie die Maschine aus und bestätigen Sie, dass die Demo-Policy in der Policy-Zuordnung und der Entscheidungszeitachse erscheint. Der Beobachtungsmodus zeichnet auf, was die Policy tun würde, ohne die Aktion zu blockieren.

- Die Erstellung von Cloud-Policies und die Fleet-Bereitstellung sind administrative Workflows. Verwenden Sie die lokale CLI, um dieselbe Policy vor der Veröffentlichung zu validieren:
+ Das Erstellen von Cloud-Policies und die Fleet-Bereitstellung sind administrative Workflows. Verwenden Sie die lokale CLI, um dieselbe Policy vor der Veröffentlichung zu validieren:
```bash
failproofai policies --install --custom ./payment-retry.policies.ts \
@@ -35,13 +35,13 @@ Verwenden Sie eine Policy erst dann, wenn Sie die unsichere Aktion und die legit
failproofai config --status
```
- Verwenden Sie `fp`, um Cloud-sichtbare Policy-Entscheidungen zu prüfen:
+ Verwenden Sie `fp`, um in der Cloud sichtbare Policy-Entscheidungen zu prüfen:
```bash
fp events --event-type hook_completed --env production --since 24h
fp sessions --env production --since 24h
```
- Die Cloud CLI stellt keine Routen für die ausschließlich durch Administratoren verwaltete Durchsetzungsbereitstellung bereit. Veröffentlichen Sie Versionen über **Admin → Policy-Editor** und stellen Sie sie über **Admin → Durchsetzung** bereit.
+ Beide Schritte sind auch über die CLI verfügbar: `fp policies publish ` erstellt eine Version und `fp fleet deploy --add ` stellt sie auf einer Maschine bereit. Die entsprechenden Dashboard-Funktionen sind **Admin → Policy-Editor** und **Admin → Durchsetzung**.
\ No newline at end of file
diff --git a/docs/de/start/integrations.mdx b/docs/de/start/integrations.mdx
new file mode 100644
index 000000000..ce249e457
--- /dev/null
+++ b/docs/de/start/integrations.mdx
@@ -0,0 +1,120 @@
+---
+title: "Agent instrumentieren"
+sidebarTitle: "Frameworks"
+description: "Jedes unterstützte Agent-Framework mit einem einzigen Aufruf mit Failproof AI verbinden."
+icon: "plug"
+---
+
+Dein Agent erzeugt bereits alles, was es wert ist, aufgezeichnet zu werden — Modellaufrufe, Tool-Aufrufe, Node-Grenzen, menschliche Wartezeiten, Fehler. Das Framework wirft es weg. Das SDK behält es.
+
+
+
+ Ein selbst geschriebener Agent oder einer, der hier nicht aufgelistet ist.
+
+
+ Graphs, Nodes, Tools, Retriever, Modelle.
+
+
+ Crews, Flows, Agenten nach Rolle, Tools.
+
+
+ Workflows, Steps, Funktionsagenten, Retriever.
+
+
+ Typisierte Agenten, Fähigkeiten, Tools, Wiederholungsversuche.
+
+
+
+## Drei Zeilen, egal welches Framework
+
+
+```bash LangGraph
+pip install 'failproofai-sdk[langgraph]'
+```
+
+```bash CrewAI
+pip install 'failproofai-sdk[crewai]'
+```
+
+```bash LlamaIndex
+pip install 'failproofai-sdk[llamaindex]'
+```
+
+```bash Pydantic AI
+pip install 'failproofai-sdk[pydantic-ai]'
+```
+
+```bash Custom agents
+pip install failproofai-sdk
+```
+
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument() # erkennt die importierten Frameworks automatisch
+
+with failproofai_sdk.session():
+ ... # dein bestehender Agent-Aufruf, unverändert
+```
+
+Keine Dekoratoren auf deinen Funktionen, kein Callback-Parameter, keine IDs, die durch deinen Code gefädelt werden. Nur der Aufruf innerhalb der Session unterscheidet sich:
+
+
+
+ ```python
+ graph.invoke({"messages": [HumanMessage("...")]})
+ ```
+
+
+ ```python
+ Crew(agents=[analyst, writer], tasks=[gather, summarise]).kickoff()
+ ```
+
+
+ ```python
+ await agent.run("...") # unter `async with failproofai_sdk.session():`
+ ```
+
+
+ ```python
+ agent.run_sync("...")
+ ```
+
+
+ ```python
+ with failproofai_sdk.agent("planner"):
+ with failproofai_sdk.tool_call("search", input={"q": q}) as t:
+ t.output = search(q)
+ ```
+
+
+
+Das Extra-Paket installiert das **Framework**. Jeder Adapter ist im Basis-Wheel enthalten, sodass ein Projekt, das sein Framework bereits hat, kein zusätzliches Paket benötigt.
+
+## Prüfen, ob Daten angekommen sind
+
+Führe eine instrumentierte Session aus und öffne dann **Observe → Sessions**, um deine Umgebung auszuwählen. Der Lauf erscheint als rekonstruierter Trace.
+
+Wenn nichts ankommt, prüfe die Verbindung des Rechners mit `failproofai config --status`. Siehe [Capture einrichten](/de/start/setup).
+
+
+ Prüfe nicht das Spool-Verzeichnis, um die Zustellung zu bestätigen. Der Failproof-Daemon erfasst und löscht jeden Batch innerhalb von Millisekunden — beim Lesen konkurrierst du daher mit dem Collector und siehst weit weniger Events, als tatsächlich gesendet wurden.
+
+
+## Nächste Schritte
+
+Jeder oben verlinkte Quickstart führt zum vollständigen Guide — was aufgezeichnet wird, Optionen, Streaming, Span-Benennung und typische Probleme, auf die man stößt. Diese Guides befinden sich unter **Trace Agents → Plug in your agent**.
+
+
+
+ Das Datenmodell, die IDs, die Event-Typen und wie Events die Cloud erreichen.
+
+
+ Kausalität durch eine Session verfolgen statt durch unzusammenhängende Logs.
+
+
+ Die gerade erfassten Sessions auditieren.
+
+
\ No newline at end of file
diff --git a/docs/de/start/integrations/crewai.mdx b/docs/de/start/integrations/crewai.mdx
new file mode 100644
index 000000000..4c5ffde81
--- /dev/null
+++ b/docs/de/start/integrations/crewai.mdx
@@ -0,0 +1,224 @@
+---
+title: "CrewAI"
+sidebarTitle: "CrewAI"
+description: "Instrumentiere Crews, Flows, Agents nach Rolle, Tools, Speicher und menschlichem Feedback."
+icon: "/images/frameworks/crewai.svg"
+---
+
+## Installation
+
+```bash
+pip install 'failproofai-sdk[crewai]'
+```
+
+Unterstützt: `crewai` 1.13 bis 2.0. Version 1.13 ist das Release, das `started_event_id` und normalisierte Token-Nutzung eingeführt hat – beides wird vom Adapter benötigt, um Ereignisse zuzuordnen und Tokens zu erfassen.
+
+## Instrumentierung
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+with failproofai_sdk.session():
+ Crew(agents=[analyst, writer], tasks=[gather, summarise]).kickoff()
+```
+
+`instrument()` registriert einen Listener auf dem modulweiten Ereignis-Bus von CrewAI und abonniert je einen Handler pro Ereignisklasse. An deiner Crew, den Agents, Tasks oder Tools ändert sich nichts.
+
+## Was aufgezeichnet wird
+
+| CrewAI | Failproof-Ereignis |
+| --- | --- |
+| Crew-Kickoff | `agent_start`, `agent_end` |
+| `Agent.kickoff()` (Lite-Agent ohne Crew) | `agent_start`, `agent_end`, mit `agent_id` aus der Rolle |
+| Flow-Start und -Ende | `agent_start`, `agent_end`; eine innerhalb einer Flow-Methode gestartete Crew wird darunter verschachtelt |
+| Agent-Ausführung | Verschachteltes `agent_start`, `agent_end`, mit `agent_id` aus der Rolle. Bei einem hierarchischen Prozess wird ein delegierter Mitarbeiter unter dem Manager verschachtelt, nicht neben ihm |
+| Task | Nichts; als Link aufgezeichnet, sodass Kinder auf die Crew aufgelöst werden |
+| Flow-Methode, Guardrail | `hook_triggered`, `hook_completed` |
+| Tool-Nutzung | `tool_use`, `tool_result` |
+| Speicher- und Wissensoperationen | `tool_use`, `tool_result`, benannt nach der betroffenen Oberfläche |
+| LLM-Aufruf | `model_request`, `model_response`, mit Token-Nutzung |
+| Stream-Chunk | Im Response zusammengefasst als Chunk-Anzahl und Zeit bis zum ersten Token |
+| Menschliches Feedback angefordert | `human_wait`, `agent_pause` |
+| Menschliches Feedback erhalten | `agent_resume`, `human_input` |
+| Agent-Ausführungsfehler | `error`, dann `agent_end` mit Ergebnis `failed` |
+
+Ein Task erzeugt bewusst keine Ereignisse. Ein CrewAI-Task ist ein Teilbereich der Agent-Ausführung, die ihn ausführt – würde man beides erfassen, würde jede Zeile doppelt erscheinen und als Geschwister dargestellt. Die Task-ID und der Name werden stattdessen in den eigenen Ereignissen des Agents mitgeführt.
+
+Speicher- und Wissensoperationen werden als Tools aufgezeichnet, benannt nach der betroffenen Oberfläche, damit sie neben deinen echten Tools erscheinen und deren Latenz verglichen werden kann.
+
+Bei einer hierarchischen Crew macht die Verschachtelung den Trace lesbar:
+
+```text
+crew
+└─ manager
+ ├─ researcher delegiert
+ └─ writer delegiert
+```
+
+CrewAI ordnet eine delegierte Ausführung dem `delegate_work_to_coworker`-**Tool-Ereignis** zu, nicht direkt dem Manager – der Adapter folgt diesem Link entsprechend. Ohne ihn würde jeder Agent als Geschwister jedes anderen erscheinen und die Delegierungsstruktur ginge verloren.
+
+## Beispiel
+
+```python
+import failproofai_sdk
+from crewai import Agent, Crew, Process, Task
+from crewai.tools import tool
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+MODEL = "openai/gpt-4o-mini"
+METRICS = {"revenue": "$4.2M ARR, up 12% QoQ", "churn": "3.1% monthly, up from 2.4%"}
+
+
+@tool("lookup_metric")
+def lookup_metric(name: str) -> str:
+ """Look up a business metric by name. Valid: revenue, churn."""
+ return METRICS.get(name.lower().strip(), "unknown metric")
+
+
+analyst = Agent(
+ role="analyst", # wird zu agent_id
+ goal="pull the numbers that matter and state them plainly",
+ backstory="You read dashboards for a living.",
+ tools=[lookup_metric],
+ llm=MODEL,
+)
+writer = Agent(
+ role="writer",
+ goal="turn numbers into three lines an exec will read",
+ backstory="You write board updates. You never pad.",
+ llm=MODEL,
+)
+
+gather = Task(
+ description="Look up 'revenue' and 'churn' with the tool.",
+ expected_output="Two lines, one metric each.",
+ agent=analyst,
+)
+summarise = Task(
+ description="Using the metrics above, write a three-line exec summary.",
+ expected_output="Exactly three lines.",
+ agent=writer,
+ context=[gather],
+)
+
+with failproofai_sdk.session():
+ result = Crew(
+ agents=[analyst, writer],
+ tasks=[gather, summarise],
+ process=Process.sequential,
+ ).kickoff()
+```
+
+Die Übergabe ist im Trace sichtbar: Der `analyst`-Span schließt sich, der `writer`-Span öffnet sich, und beide liegen innerhalb eines einzigen `crew`-Spans.
+
+## Spans benennen
+
+`agent_id` stammt aus `Agent(role=...)`, was ihn zu einer lesbaren Dashboard-Facette macht.
+
+```python
+Agent(role="analyst", ...) # agent_id = "analyst"
+Agent(role="analyst-7f3a2b", ...) # ein Facetten-Eintrag pro Run
+```
+
+`agent_id` ist eine Spalte mit geringer Kardinalität. Eine Rolle, die eine Run-ID oder einen Zeitstempel enthält, verschlechtert sie für jede Abfrage. Sieht eine Rolle wie eine ID aus, lehnt der Adapter sie ab und legt den tatsächlichen Wert stattdessen in einem Payload-Feld ab.
+
+## Session steuern
+
+Wird in dieser Reihenfolge aufgelöst, erster Treffer gewinnt:
+
+1. `instrument("crewai", session_id=...)`
+2. Der umschließende `failproofai_sdk.session()`-Scope
+3. Eine generierte `uuid4().hex`, einmal pro Crew oder Flow
+
+Umhülle den Kickoff, um ihn pro Run zu steuern:
+
+```python
+with failproofai_sdk.session(f"support-{ticket_id}"):
+ Crew(agents=[...], tasks=[...]).kickoff()
+```
+
+## Optionen
+
+```python
+failproofai_sdk.instrument(
+ "crewai",
+ session_id=None, # jeden Run an eine feste Session-ID binden
+)
+```
+
+`session_id` ist die einzige Option, die dieser Adapter liest. Prompts und Completions werden immer aufgezeichnet, auf das Payload-Budget gekürzt.
+
+## Human in the Loop
+
+CrewAI hat **zwei** Human-in-the-Loop-Oberflächen, und beide werden als dieselben vier Ereignisse aufgezeichnet.
+
+`@human_feedback` auf einer Flow-Methode läuft über den Ereignis-Bus von CrewAI: Die Laufzeit sendet ein Ereignis, bevor sie auf eine Person wartet, und ein weiteres nach der Antwort.
+
+`Task(human_input=True)` hingegen nicht. Es ruft `input()` im eigenen Input-Provider von CrewAI auf und sendet keinerlei Ereignis – daher umhüllt der Adapter diesen Provider direkt. Ohne diese Maßnahme wäre das gesamte menschliche Warten unsichtbar und würde als aktive Agent-Zeit abgerechnet.
+
+In beiden Fällen erhältst du:
+
+```text
+human_wait der Prompt und seine Optionen
+agent_pause startet die Pausenzeitr uhr
+agent_resume stoppt sie
+human_input die Antwort, mit gemessener Wartezeit
+```
+
+`agent_pause` bis `agent_resume` ist das einzige Paar, das Pausenzeit erfasst. Ohne es wird ein zehnminütiges menschliches Warten als zehn Minuten aktive Agent-Zeit abgerechnet.
+
+
+ CrewAI setzt keine Korrelations-ID auf einem der beiden Human-Feedback-Ereignisse, sodass der Adapter sie anhand des Flow- und Methodennamens zuordnet und auf die zuletzt geöffnete Pause zurückfällt. Das ist korrekt, da eine Konsoleneingabe blockiert. Wenn du einen nebenläufigen Feedback-Provider baust, setze `request_id` auf beiden Ereignissen.
+
+
+
+ Da der `Task(human_input=True)`-Pfad den Input-Provider von CrewAI umhüllt statt ein Ereignis zu abonnieren, wird er bei `uninstrument()` wiederhergestellt und gibt jede Ausnahme von `input()` unverändert weiter – einschließlich `KeyboardInterrupt`.
+
+
+## Häufige Probleme
+
+
+
+ Eine `role` enthält eine UUID, einen Zeitstempel oder ein lauf-spezifisches Suffix. Verwende eine stabile, menschenlesbare Rolle und lege die lauf-spezifische ID stattdessen in der Task-Beschreibung ab.
+
+
+
+ Der Ereignis-Bus ist asynchron, und `kickoff()` kehrt zurück, bevor die letzten Handler durchgelaufen sind. Leere ihn zuerst:
+
+ ```python
+ from crewai.events.event_bus import crewai_event_bus
+
+ crew.kickoff()
+ crewai_event_bus.flush(timeout=30)
+ ```
+
+ Dies ist eine Eigenschaft von CrewAI, nicht des SDK.
+
+
+
+ `agent_end` schließt offene Pausen zwangsweise, aber nicht Tools oder Modelle – ein Run, der innerhalb eines Tool-Aufrufs abbricht, lässt diesen Span offen. Ein normaler Teardown schließt alles noch Offene und markiert es als unvollständig. Nur ein `SIGKILL` lässt es hängen, da dann kein Code mehr ausgeführt werden kann.
+
+
+
+ Prüfe in dieser Reihenfolge: `instrument()` wurde vor `kickoff()` aufgerufen; es gibt ein `with failproofai_sdk.session():` darum; `crewai` ist Version 1.13 oder neuer; `FAILPROOFAI_SDK_STRICT=1` ist gesetzt, damit ein fehlerhafter Hook eine Ausnahme auslöst statt stillschweigend ignoriert zu werden.
+
+
+
+## Weiter
+
+
+
+ Paare, IDs, Session-Lebenszyklus und Übermittlung.
+
+
+ Verfolge die Kausalität durch die soeben aufgezeichnete Session.
+
+
+ LangGraph, LlamaIndex, Pydantic AI und individuelle Agents.
+
+
\ No newline at end of file
diff --git a/docs/de/start/integrations/custom-agents.mdx b/docs/de/start/integrations/custom-agents.mdx
new file mode 100644
index 000000000..824fb42f3
--- /dev/null
+++ b/docs/de/start/integrations/custom-agents.mdx
@@ -0,0 +1,739 @@
+---
+title: "Eigene Agenten"
+sidebarTitle: "Eigene Agenten"
+description: "Instrumentiere einen selbst geschriebenen Agenten oder ein Framework ohne Adapter."
+icon: "code"
+---
+
+Für einen selbst geschriebenen Agenten oder ein Framework, für das Failproof AI keinen Adapter hat. Es ist nichts zu instrumentieren: Du sendest die Events selbst.
+
+Das ist dieselbe API, die die vier Framework-Adapter im Hintergrund nutzen. Sie sind lediglich Übersetzungsschichten darüber.
+
+## Installation
+
+```bash
+pip install failproofai-sdk
+```
+
+Keine Extras, keine Abhängigkeiten.
+
+## Instrumentierung
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+
+with failproofai_sdk.session(): # ein Durchlauf
+ with failproofai_sdk.agent("planner"): # eine Arbeitseinheit
+ with failproofai_sdk.tool_call("search", input={"q": q}) as t:
+ t.output = search(q) # ein Tool-Aufruf
+```
+
+Von oben nach unten gelesen, sagt es genau das, was es bedeutet:
+
+| Umschließen mit | Bedeutet |
+| --- | --- |
+| `session()` | Diese Events gehören zum selben Durchlauf |
+| `agent()` | Etwas erledigt Arbeit – gib ihm einen Namen, den du in einer Liste erkennen würdest |
+| `tool_call()` | Das ist ein Tool, und hier ist sein Rückgabewert |
+
+Und was jeder Scope tatsächlich sendet:
+
+| Scope | Sendet | Zweck |
+| --- | --- | --- |
+| `session()` | Nichts | Bindet eine Session-ID, gruppiert einen Durchlauf |
+| `agent()` | `agent_start`, `agent_end` | Klammert eine Arbeitseinheit ein |
+| `tool_call()` | `tool_use`, `tool_result` | Klammert ein Tool ein und misst es |
+
+Alles darin kann `session_id` und `agent_id` weglassen. Die Scopes binden die Identität auf Kontextvariablen, und jeder Event-Aufruf liest sie zurück – du musst IDs nie durch deine Funktionen durchreichen.
+
+Alle drei funktionieren sowohl mit `async with` als auch mit `with`.
+
+Verschachtelte Agenten bilden den Baum. `parent_id` und Tiefe werden aus dem Stack berechnet:
+
+```python
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("supervisor"):
+ with failproofai_sdk.agent("researcher"): # parent_id = "supervisor"
+ ...
+```
+
+## Wie ein Scope schließt
+
+`agent()` behandelt Exceptions für dich:
+
+| Was passiert ist | Events | Ergebnis |
+| --- | --- | --- |
+| Keine Exception | `agent_end` | `success` |
+| `Exception` | `error`, dann `agent_end` | `failed` |
+| `KeyboardInterrupt`, `SystemExit` | `error`, dann `agent_end` | `failed` |
+| `CancelledError`, `GeneratorExit` | nur `agent_end` | `cancelled` |
+
+Der Fehler wird vor `agent_end` gesendet, weil das Dashboard den Span bei `agent_end` schließt und alles danach keinem Span mehr zugeordnet wird. Eine Stornierung ist kein Fehler, daher verschmutzen abgebrochene Durchläufe die Fehlerübersicht nicht. Die Exception wird immer erneut ausgelöst: Ein Scope verschluckt sie nie.
+
+## Die Event-Methoden
+
+Fünfzehn Methoden in sechs Familien. Die meisten kommen paarweise – du sendest den Öffner, dann den Schließer, und das SDK misst den Span dazwischen.
+
+| Familie | Öffnet | Schließt | Eigenständig |
+| --- | --- | --- | --- |
+| **Agenten** | `agent_start` | `agent_end` | — |
+| | `agent_pause` | `agent_resume` | — |
+| **Modelle** | `model_request` | `model_response` | — |
+| **Tools** | `tool_use` | `tool_result` | — |
+| **Hooks** | `hook_triggered` | `hook_completed` | — |
+| **Menschen** | `human_wait` | `human_input` | `human_pause`, `human_interrupt` |
+| **Fehler** | — | — | `error` |
+
+
+ Bevorzuge die Scopes – `agent()` und `tool_call()` – wo immer sie passen. Sie garantieren das schließende Event, auch wenn der Body eine Exception wirft. Greife direkt auf diese Methoden zurück, wenn dein Kontrollfluss nicht verschachtelt ist, z. B. bei einem Modellaufruf innerhalb eines Hilfsfunktions.
+
+
+
+```python Agents
+failproofai_sdk.event.agent_start(agent_id="planner", goal="find the cheapest flight")
+failproofai_sdk.event.agent_end(agent_id="planner", outcome="success", summary="...")
+failproofai_sdk.event.agent_pause(pause_id="p1", reason="awaiting approval")
+failproofai_sdk.event.agent_resume(pause_id="p1")
+```
+
+```python Models
+failproofai_sdk.event.model_request(
+ model="gpt-4o-mini",
+ messages=[{"role": "user", "content": "..."}],
+ request_id="req-1",
+)
+failproofai_sdk.event.model_response(
+ model="gpt-4o-mini",
+ content="...",
+ input_tokens=139,
+ output_tokens=21,
+ request_id="req-1",
+ duration_ms=5202,
+)
+```
+
+```python Tools
+failproofai_sdk.event.tool_use(tool_name="search", tool_call_id="c1", input={"q": "..."})
+failproofai_sdk.event.tool_result(tool_name="search", tool_call_id="c1", output="...")
+```
+
+```python Hooks
+failproofai_sdk.event.hook_triggered(hook_name="retrieve", hook_id="h1", trigger_event="node")
+failproofai_sdk.event.hook_completed(hook_name="retrieve", hook_id="h1", outcome="success")
+```
+
+```python Humans
+failproofai_sdk.event.human_wait(input_id="i1", prompt="Approve?", options=["yes", "no"])
+failproofai_sdk.event.human_input(input_id="i1", response="yes")
+failproofai_sdk.event.human_pause(reason="operator paused the run", user_id="dana")
+failproofai_sdk.event.human_interrupt(reason="operator stopped the run", at_step="step_3")
+```
+
+```python Failures
+failproofai_sdk.event.error(
+ error_type="TimeoutError",
+ message="provider timed out after 30s",
+ traceback="...",
+)
+```
+
+
+
+ **Die beiden Human-Familien zeigen in entgegengesetzte Richtungen.**
+
+ | Methoden | Bedeutung |
+ | --- | --- |
+ | `human_wait` / `human_input` | Der **Agent hat eine Person gefragt** – ein Freigabe-Gate, eine Rückfrage |
+ | `human_pause` / `human_interrupt` | Eine **Person hat auf den Agenten eingewirkt** – ein Stopp-Button, eine Operator-Pause |
+
+ Kein Framework signalisiert das zweite Paar – das musst du immer selbst senden.
+
+
+
+ **Übergib `request_id`, wenn Modellaufrufe parallel laufen.** Ohne sie werden Anfragen und Antworten in Eingangsreihenfolge pro Agent gepaart – und parallele Aufrufe werden falsch gepaart, sodass jede Antwort der falschen Anfrage zugeordnet wird.
+
+
+## Beispiel
+
+Eine Tool-Calling-Schleife gegen die OpenAI API, ohne Agent-Framework:
+
+```python
+import json
+
+import failproofai_sdk
+from openai import OpenAI
+
+failproofai_sdk.configure(environment="production")
+client = OpenAI()
+MODEL = "gpt-4o-mini"
+
+
+def turn(messages: list):
+ """Ein Modellaufruf, eingerahmt durch das Paar."""
+ failproofai_sdk.event.model_request(model=MODEL, messages=messages)
+ reply = client.chat.completions.create(model=MODEL, messages=messages, tools=TOOLS)
+ usage = reply.usage
+ failproofai_sdk.event.model_response(
+ model=MODEL,
+ content=reply.choices[0].message.content or "",
+ input_tokens=usage.prompt_tokens,
+ output_tokens=usage.completion_tokens,
+ )
+ return reply.choices[0].message
+
+
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("inventory", goal="price report"):
+ for _ in range(4): # begrenzt; eine unbegrenzte Agent-Schleife ist ein eigener Fehler
+ message = turn(messages)
+ if not message.tool_calls:
+ break
+ messages.append(message.model_dump(exclude_none=True))
+ for call in message.tool_calls:
+ args = json.loads(call.function.arguments or "{}")
+ with failproofai_sdk.tool_call(
+ call.function.name, tool_call_id=call.id, input=args
+ ) as handle:
+ handle.output = run_tool(call.function.name, args)
+ messages.append({
+ "role": "tool",
+ "tool_call_id": call.id,
+ "content": str(handle.output),
+ })
+```
+
+Das erzeugt dieselben sechs Event-Typen, die ein Adapter liefern würde. Die vollständige
+ausführbare Version inklusive Tool-Definitionen liegt im SDK-Repository unter
+`docs/manual/examples/`.
+
+## Threads und Async
+
+Kontextvariablen werden automatisch in asyncio-Tasks übertragen. In neue Threads werden sie nicht übertragen, da ein Thread mit einem leeren Kontext startet.
+
+```python
+# asyncio: nichts zu tun
+async with failproofai_sdk.session():
+ await asyncio.gather(worker(1), worker(2))
+
+# Threads: Callable einwickeln
+pool.submit(failproofai_sdk.propagate(work), x)
+threading.Thread(target=failproofai_sdk.propagate(work)).start()
+loop.run_in_executor(None, failproofai_sdk.propagate(work), x)
+```
+
+Ohne `propagate()` wirft das Worker-Event einen `TypeError`, der den Fix benennt, anstatt auf keiner Session zu landen. Das ist beabsichtigt: Ein Event ohne Session wird beim Ingest übersprungen und mit `200` beantwortet – das ist genau der stille Fehler, den die Identitätsschicht verhindern soll.
+
+## Ein Framework ohne Adapter instrumentieren
+
+Jedes Agent-Framework gibt dir dieselben drei Nahtpunkte. Mappe sie und du hast eine vollständige Trace – die vier mitgelieferten Adapter tun nichts anderes.
+
+| Der Nahtpunkt | Was du schreibst | Was landet |
+| --- | --- | --- |
+| Der Durchlauf | `session()` + `agent()` | `agent_start`, `agent_end` |
+| Jedes Tool | `tool_call()` | `tool_use`, `tool_result` |
+| Jeder Modellaufruf | Das `model_*`-Paar | `model_request`, `model_response` |
+
+
+
+ ```python
+ with failproofai_sdk.session():
+ with failproofai_sdk.agent(agent_name, goal=task):
+ result = framework.run(task)
+ ```
+
+
+ In was auch immer das Framework als Tool-Wrapper oder Middleware bezeichnet.
+
+ ```python
+ with failproofai_sdk.tool_call(name, input=args) as call:
+ call.output = original(**args)
+ ```
+
+
+ ```python
+ failproofai_sdk.event.model_request(model=model, messages=messages)
+ reply = provider.complete(...)
+ failproofai_sdk.event.model_response(
+ model=model,
+ content=text,
+ input_tokens=usage.prompt_tokens,
+ output_tokens=usage.completion_tokens,
+ )
+ ```
+
+
+
+
+ **Hast du eine Node-, Step- oder Middleware-Grenze, die es wert ist, sichtbar zu sein?** Wickle sie in ein Hook-Paar – `hook_triggered` / `hook_completed` – und nicht in ein verschachteltes `agent()`. `agent_id` ist eine Facette mit niedriger Kardinalität, und ein Eintrag pro Node überfüllt sie. Hook-Spans werden genauso dargestellt und geben dir Latenz pro Node.
+
+
+
+ **Manuell und automatisch komponieren.** Ein Adapter, der innerhalb eines manuell erstellten Scopes läuft, schließt sich dieser Session an und wird dem Agenten als übergeordnet zugeordnet – du bekommst einen Baum statt zwei. Das ist nützlich, wenn du ein Framework selbst instrumentierst, das neben einem unterstützten läuft.
+
+
+
+ Zwei Gründe, und die drei Nahtpunkte oben sind die Antwort auf beide:
+
+ - `autogen-core` wird seit September 2025 nicht mehr gepflegt.
+ - AG2 bietet keinen prozessweiten Registrierungspunkt, der dem Hook-System der anderen Frameworks entspricht – die Instrumentierung erfordert daher das Einwickeln jedes Agenten an jeder Konstruktionsstelle.
+
+ Das manuelle Mappen der Nahtpunkte zeichnet dieselben Events mit derselben Genauigkeit auf wie ein mitgelieferter Adapter.
+
+
+## Tiefer eintauchen
+
+Wie die Aufzeichnung tatsächlich funktioniert. Nichts davon ist nötig, um loszulegen.
+
+
+
+
+
+Jede Aufzeichnung hat dieselbe Form: Ein Span öffnet sich, Arbeit wird darin verschachtelt, und jedes öffnende Event bekommt ein schließendes.
+
+```mermaid
+flowchart LR
+ S(["agent_start"]) --> H["hook_triggered"]
+ H --> M["model_request model_response"]
+ H --> T["tool_use tool_result"]
+ M --> C["hook_completed"]
+ T --> C
+ C --> E(["agent_end"])
+```
+
+Das **Paar** ist die Einheit. Jedes schließende Event trägt eine Dauer, die das SDK vom öffnenden Event an misst.
+
+Unten ist ein realer Durchlauf pro Framework – aufgenommen aus den Beispielen, die mit dem SDK mitgeliefert werden, Modellname normalisiert. Beachte, wie viel von einem einzigen Aufruf zurückkommt.
+
+
+
+ ```text 14 events
+ 1 +0.000s agent_start LangGraph
+ 2 +0.001s hook_triggered agent
+ 3 +0.002s model_request gpt-4o-mini
+ 4 +3.023s model_response gpt-4o-mini · 21 out-tok
+ 5 +3.024s hook_completed agent
+ 6 +3.024s hook_triggered tools
+ 7 +3.025s tool_use word_count
+ 8 +3.025s tool_result word_count · ok
+ 9 +3.025s hook_completed tools
+ 10 +3.026s hook_triggered agent
+ 11 +3.027s model_request gpt-4o-mini
+ 12 +5.717s model_response gpt-4o-mini · 5 out-tok
+ 13 +5.720s hook_completed agent
+ 14 +5.721s agent_end LangGraph · success
+ ```
+
+ Nodes werden zu Hook-Paaren, sodass du Latenz pro Node erhältst, ohne die Agentenliste zu überfüllen.
+
+
+
+ ```text 10 events
+ 1 +0.000s agent_start crew
+ 2 +0.050s agent_start analyst · under crew
+ 3 +0.057s model_request gpt-4o-mini
+ 4 +3.475s model_response gpt-4o-mini · 19 out-tok
+ 5 +3.478s tool_use lookup_metric
+ 6 +3.478s tool_result lookup_metric · ok
+ 7 +3.486s model_request gpt-4o-mini
+ 8 +5.694s model_response gpt-4o-mini · 9 out-tok
+ 9 +5.727s agent_end analyst · success
+ 10 +5.739s agent_end crew · success
+ ```
+
+ Die `role` jedes Agenten wird zu seinem Span-Namen, sodass Latenz und Token-Verbrauch pro Rolle aufgeschlüsselt werden.
+
+
+
+ ```text 26 events
+ 1 +0.000s agent_start Agent
+ 2 +0.001s hook_triggered init_run
+ 4 +0.501s hook_triggered setup_agent
+ 6 +0.503s hook_triggered run_agent_step
+ 7 +0.505s model_request gpt-4o-mini
+ 8 +3.083s model_response gpt-4o-mini · 18 out-tok
+ 10 +3.197s hook_triggered parse_agent_output
+ 12 +3.355s hook_triggered call_tool
+ 13 +3.355s tool_use city_population
+ 14 +3.355s tool_result city_population · ok
+ 16 +3.356s hook_triggered aggregate_tool_results
+ ... zweite Iteration
+ 26 +7.038s agent_end Agent · success
+ ```
+
+ Die Agent-Schleife selbst ist sichtbar, nicht nur ihre Modellaufrufe.
+
+
+
+ ```text 8 events
+ 1 +0.000s agent_start agent
+ 2 +0.001s model_request gpt-4o-mini
+ 3 +4.413s model_response gpt-4o-mini · 17 out-tok
+ 4 +4.415s tool_use population
+ 5 +4.415s tool_result population · ok
+ 6 +4.416s model_request gpt-4o-mini
+ 7 +8.118s model_response gpt-4o-mini · 6 out-tok
+ 8 +8.119s agent_end agent · success
+ ```
+
+ Keine Hook-Paare: Pydantic AI hat keine Node- oder Step-Grenzen zum Einrahmen.
+
+
+
+ ```text 6 events
+ 1 +0.000s agent_start main
+ 2 +0.000s tool_use population
+ 3 +0.000s tool_result population · ok
+ 4 +0.000s model_request gpt-4o-mini
+ 5 +0.000s model_response gpt-4o-mini · 3 out-tok
+ 6 +0.000s agent_end main · success
+ ```
+
+ Du sendest diese selbst. Dieselben Event-Typen, dieselbe Genauigkeit – es kostet dich die Aufrufstellen.
+
+
+
+
+
+
+
+**Es gibt kein Session-End-Event.** Eine Session ist nichts, das du schließt – sie ist eine Gruppe von Events, die eine `session_id` teilen.
+
+Der Status wird aus der Form der Trace abgeleitet:
+
+| Status | Wann |
+| --- | --- |
+| `ongoing` | Mindestens ein Span ist noch offen |
+| `paused` | Ein `agent_pause` hat kein passendes `agent_resume` |
+| `error` | Nichts ist offen, und mindestens ein Event ist fehlgeschlagen |
+| `done` | Nichts ist offen, und nichts ist fehlgeschlagen |
+
+Eine Session endet also, wenn jedes Paar geschlossen ist. Die Adapter senden `agent_end` für dich, und beim Teardown schließen sie alles noch Offene und markieren es als unvollständig – ein abgestürzter Durchlauf wird als `done` mit einer sichtbaren Lücke abgeschlossen, statt hängen zu bleiben.
+
+
+ Deshalb kann eine Session zwei Aufrufe umspannen. Ein LangGraph `interrupt()` pausiert den Durchlauf, der Root-Span bleibt absichtlich offen, und der fortsetzende Aufruf schließt ihn. Beide Aufrufe gehören zu einer Session.
+
+
+
+
+
+
+`session_id` und `agent_id` sind bei jeder Event-Methode optional. Werden sie weggelassen, werden sie aus dem umschließenden Scope aufgelöst:
+
+```python
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("planner"):
+ failproofai_sdk.event.tool_use(tool_name="search", tool_call_id="c1")
+```
+
+Sie explizit zu übergeben funktioniert weiterhin und hat Vorrang. Wenn nichts gebunden und nichts übergeben wurde, wirft der Aufruf einen `TypeError`, der den Fix benennt, anstatt ein Event ohne Session zu senden, das beim Ingest übersprungen und mit `200` beantwortet werden würde.
+
+Scopes binden die Identität auf Kontextvariablen. Diese werden automatisch in asyncio-Tasks übertragen, aber nicht in neue Threads – wickle einen Worker in `failproofai_sdk.propagate()` ein.
+
+#### Wer welche ID vergibt
+
+| ID | Vergeben von | Hinweise |
+| --- | --- | --- |
+| `session_id` | Dir oder dem SDK | `session("chat-42")` wird direkt verwendet; weggelassen generiert das SDK ein `uuid4().hex` |
+| `agent_id` | Dir oder dem Framework | Aus `agent("analyst")`, einer CrewAI-`role`, einem `FunctionAgent.name`. Ein UUID-ähnlicher Wert wird abgelehnt und ersetzt |
+| `tool_call_id`, `hook_id`, `request_id` | Dir oder dem Framework | Adapter verwenden die eigenen Run-IDs des Frameworks wieder, weshalb Paare Thread-Wechsel überleben |
+| **Event-ID** | **Cloud beim Ingest** | Das SDK sendet keine |
+| **`dedup_key`** | **Cloud beim Ingest** | Ein Hash aus Org, Session, Timestamp, Typ und Payload. Das ist die echte Identität – sie sorgt dafür, dass ein wiederholter Batch zusammengefasst statt dupliziert wird |
+
+#### Wie Adapter `session_id` auflösen
+
+Der erste Treffer gewinnt:
+
+1. Eine explizite `session_id`-Option
+2. Metadaten pro Aufruf
+3. Der umschließende `session()`-Scope
+4. Framework-Metadaten
+5. Die eigene Run-ID des Frameworks
+
+Sie wird nie erfunden, solange eines davon existiert – eine synthetisierte ID würde einen Durchlauf auf mehrere Sessions aufteilen.
+
+#### `agent_id` niedrig halten
+
+Sie ist die primäre Facette auf jeder Dashboard-Ansicht und eine `LowCardinality(String)`-Spalte. Ein Wert pro Durchlauf degradiert die Spalte und füllt das Filter-Dropdown mit einem Eintrag pro Durchlauf.
+
+Adapter schützen diese Spalte für dich:
+
+| Was das Framework liefert | Aufgezeichnet als | Warum |
+| --- | --- | --- |
+| `3f9a1c2b-…` (eine UUID) | `main` | Nichts Lesbares zu behalten |
+| Ein langer reiner Hex-String | `main` | Dasselbe |
+| `agent-3f9a1c2b-…` | `agent` | Pro-Durchlauf-ID entfernt, lesbarer Teil behalten |
+| `agent-v2` | `agent-v2` | Kurze Segmente werden unverändert gelassen |
+| `step-3` | `step-3` | Dasselbe |
+
+Die echte ID wird auf `fw_agent_id` / `fw_run_id` behalten, wo sie abfragbar bleibt, ohne eine Facette zu sein.
+
+
+ **Diese Schutzmaßnahme betrifft nur Labels, die das *Framework* gewählt hat.** Eine `agent_id`, die du selbst übergibst – an `event.*` oder an `failproofai_sdk.agent(...)` – wird genau so aufgezeichnet. Ein explizites Argument stillschweigend umzuschreiben wäre schlimmer als die Kardinalität, die es verhindert – benenne deine eigenen Spans entsprechend.
+
+
+
+
+
+
+| Gruppe | Events |
+| --- | --- |
+| Agenten | `agent_start`, `agent_end`, `agent_pause`, `agent_resume` |
+| Modelle | `model_request`, `model_response` |
+| Tools | `tool_use`, `tool_result` |
+| Hooks | `hook_triggered`, `hook_completed` |
+| Menschen | `human_wait`, `human_input`, `human_pause`, `human_interrupt` |
+| Fehler | `error` |
+
+Welches Framework was aufzeichnet, gemessen aus den obigen Durchläufen:
+
+| Event | LangGraph | CrewAI | LlamaIndex | Pydantic AI | Custom |
+| --- | :--: | :--: | :--: | :--: | :--: |
+| Agent Start und End | Ja | Ja | Ja | Ja | Du |
+| Model Request und Response | Ja | Ja | Ja | Ja | Du |
+| Tool Use und Result | Ja | Ja | Ja | Ja | Du |
+| Hook Triggered und Completed | Node | Task | Step | — | Du |
+| Error | Ja | Ja | Ja | Ja | Automatisch |
+| Human Wait und Input | Ja | Ja | Ja | — | Du |
+| Agent Pause und Resume | Ja | Ja | Ja | — | Du |
+
+Ein Strich bedeutet, das Framework kennt dieses Konzept nicht. `human_pause` und `human_interrupt` beschreiben eine *Person*, die auf den Agenten einwirkt – das signalisiert kein Framework. Diese musst du selbst senden.
+
+
+
+
+
+Ein Event kommt nie allein. Eines öffnet einen Span, eines schließt ihn, und das schließende Event trägt eine Dauer, die das SDK vom öffnenden Event an misst.
+
+| Öffnet | Schließt | Das schließende Event trägt |
+| --- | --- | --- |
+| `agent_start` | `agent_end` | `outcome`, `summary` |
+| `model_request` | `model_response` | Tokens, `stop_reason`, Latenz |
+| `tool_use` | `tool_result` | `output` oder `error`, Dauer |
+| `hook_triggered` | `hook_completed` | `outcome`, Dauer |
+| `agent_pause` | `agent_resume` | Wie lange die Pause gedauert hat |
+| `human_wait` | `human_input` | Die Antwort und wie lange die Person gebraucht hat |
+
+
+ Ein öffnendes Event ohne schließendes ist ein Span, der nie endet. Die Session wird als noch laufend angezeigt, für immer, und ihre aktive Dauer wächst weiter. Das ist der Fehlerfall, auf den du achten musst, wenn du manuell instrumentierst.
+
+
+#### Korrelationsregeln
+
+- Verwende dieselbe `tool_call_id`, `hook_id`, `pause_id` oder `input_id` für das passende Abschlussevent.
+- Das SDK berechnet `duration_ms` für `tool_result`, `hook_completed`, `agent_resume` und `human_input`. Es an diese Methoden zu übergeben wirft einen `ValueError`.
+- `duration_ms` **wird** bei `model_response` akzeptiert, weil nur der Aufrufer die echte Provider-Latenz kennt. Es muss ein Integer sein – ein Float wirft am Aufrufpunkt einen `ValueError`, da der Server die Spalte als vorzeichenlosen 32-Bit-Integer liest und sonst NULL speichern würde.
+- Korrelationsschlüssel sind nach Art und Session begrenzt, sodass ein Tool-Aufruf und ein Hook sicher dieselbe ID teilen dürfen, und zwei parallele Sessions dieselben IDs wiederverwenden können, ohne zu kollidieren. Sie sind nicht nach Agent begrenzt: Ein Paar, das unter einem Agenten geöffnet und unter einem anderen geschlossen wird, korreliert trotzdem – das ist der Normalfall in Multi-Agent-Frameworks.
+- `request_id` paart `model_request` mit `model_response`. Ohne sie werden Model-Events in Reihenfolge pro Agent gepaart, sodass parallele Aufrufe falsch gepaart werden.
+- Ein über Prozesse hinweg aufgeteiltes Paar korreliert noch auf der Serverseite, aber das SDK kann seine In-Process-Dauer nicht berechnen.
+- Die Pending-Map hält maximal 10.000 Starts und entfernt den ältesten Eintrag, wenn sie voll ist.
+
+
+
+
+
+Die Installation von `failproofai-sdk` installiert alles, alle vier Adapter inklusive. Die Extras ziehen das **Framework** nach, nicht den Adapter.
+
+```python
+import failproofai_sdk # lädt nichts außerhalb der Standardbibliothek
+failproofai_sdk.instrument() # importiert nur die Adapter, die du tatsächlich brauchst
+```
+
+`import failproofai_sdk` ist vertraglich abhängigkeitsfrei, erzwungen durch einen Test, der das gebaute Wheel mit `--no-deps` installiert, und einen weiteren, der beweist, dass kein Framework `sys.modules` erreicht.
+
+
+ Es gibt kein `failproofai_sdk.crewai`-Attribut. Adapter werden absichtlich nicht am Top-Level-Paket exponiert: Darauf zuzugreifen würde das Framework als Nebeneffekt des Attributzugriffs importieren und das Null-Abhängigkeits-Versprechen brechen. Verwende `instrument()`.
+
+
+```python
+failproofai_sdk.instrument() # jedes bereits importierte Framework
+failproofai_sdk.instrument("crewai") # genau eines, nach Name
+failproofai_sdk.uninstrument("crewai") # rückgängig machen
+```
+
+| Name | Akzeptiert auch |
+| --- | --- |
+| `langchain` | `langgraph`, `langchain_core` |
+| `crewai` | — |
+| `llama_index` | `llamaindex`, `llama-index` |
+| `pydantic_ai` | `pydantic-ai`, `pydanticai` |
+
+Die Auto-Erkennung liest `sys.modules`, nicht die Liste installierter Pakete – ein installiertes, aber nie importiertes Framework wird nicht instrumentiert und nie in deinem Namen importiert. Um zu sehen, was verdrahtet ist:
+
+```python
+from failproofai_sdk.integrations import active, available
+
+available() # ('crewai', 'langchain', 'llama_index', 'pydantic_ai')
+active() # ('langchain',)
+```
+
+
+ **`instrument("crewai")` auf einer Maschine ohne CrewAI wirft keine Exception.** Es loggt eine Warnung und gibt `()` zurück, sodass ein fehlendes Framework nie einen Prozess zum Absturz bringt, der auch andere instrumentiert.
+
+ Die Warnung enthält den zugrunde liegenden `ImportError`, und diese Meldung nennt den genauen Installationsbefehl – die Lösung steht also in deinen Logs, nicht versteckt.
+
+ ```text
+ ImportError: failproofai_sdk: cannot instrument 'crewai' because 'crewai.events'
+ is not importable. Install it with: pip install 'failproofai_sdk[crewai]'
+ ```
+
+ Setze `FAILPROOFAI_SDK_STRICT=1`, damit stattdessen eine Exception ausgelöst wird. Dieses Flag wird **einmal gelesen und gecacht**, also exportiere es vor dem Start deines Prozesses, statt es mittendrin zu setzen.
+
+
+
+ **`instrument()` muss *nach* deinem Framework-Import kommen.** Die Auto-Erkennung liest `sys.modules`, also findet ein bloßer Aufruf vor dem Import nichts, installiert nichts und gibt `()` zurück.
+
+
+
+```python Wrong
+import failproofai_sdk
+failproofai_sdk.instrument() # sys.modules hat noch kein langchain -> ()
+
+import langchain # zu spät, nichts ist verdrahtet
+```
+
+```python Right
+import langchain # Framework zuerst importieren
+import failproofai_sdk
+
+failproofai_sdk.instrument() # findet es -> ('langchain',)
+```
+
+```python Right, order-proof
+import failproofai_sdk
+
+# Den Namen anzugeben importiert den Adapter auf Anfrage, also funktioniert das überall.
+failproofai_sdk.instrument("langchain")
+```
+
+
+Machst du das falsch, läuft der Prozess mit importiertem SDK, scheinbar installiertem Adapter und **keinem einzigen gesendeten Event**. Es loggt eine Warnung, die genau das sagt – also prüfe zuerst deine Logs, wenn ein Durchlauf nichts aufzeichnet.
+
+
+
+
+
+```mermaid
+flowchart LR
+ A["Dein Agent"] --> B["Adapter"]
+ B --> C["Writer In-Memory-Queue"]
+ C -->|"alle 0,5s"| D["Spool JSONL auf Disk"]
+ D --> E["Failproof Daemon"]
+ E -->|"HTTPS"| F["Cloud"]
+```
+
+| Stufe | Aufgabe | Läuft in |
+| --- | --- | --- |
+| Adapter | Übersetzt einen Framework-Callback in einen von 15 Event-Typen | Dein Prozess |
+| Writer | Reiht in Warteschlange, bündelt, schreibt JSONL atomar | Dein Prozess, Hintergrund-Thread |
+| Spool | Dauerhafter Übergabepunkt, überlebt den Prozessabbruch | Lokale Disk |
+| Daemon | Beobachtet den Spool, verschickt Batches, löscht Versendetes | Deine Maschine |
+| Ingest | Weist Row-ID und Dedup-Key zu, befördert abfragbare Spalten | Cloud |
+
+Der Spool macht das Ganze sicher: Dein Agent blockiert nie auf das Netzwerk, und ein Cloud-Ausfall bedeutet ein wachsendes Verzeichnis statt verlorener Events.
+
+Jeder Flush schreibt eine Batch-Datei: zuerst `.tmp`, dann `fsync`, dann ein atomares Umbenennen:
+
+```text
+~/.failproofai/custom-agents/events/
+ event-2026-08-20T10-15-00-123Z-48213-0.jsonl
+```
+
+Der Daemon liest nur `.jsonl`, kann also nie eine halb geschriebene Datei lesen. Der Dateiname trägt Timestamp, Prozess-ID und Sequenznummer, sodass zwei Prozesse, die in derselben Millisekunde flushen, nicht kollidieren können. Die Queue ist auf 10.000 Events begrenzt; darüber hinaus werden die ältesten gelöscht und geloggt.
+
+
+ **`collector.redact` gilt nicht für deine SDK-Events.** Es sieht sie nie.
+
+
+Der Daemon **versendet** deine Batches. Er öffnet oder überschreibt sie nicht.
+
+| Events | Geschrieben von | Durch `collector.redact` bereinigt? |
+| --- | --- | --- |
+| CLI-Session-Transkripte | Dem Daemon | Ja |
+| Hook-Aktivität | Dem Daemon | Ja |
+| **Alles, was das SDK sendet** | **Deinem Prozess** | **Nein** |
+
+Bereinigung läuft dort, wo der Daemon seine *eigenen* Events schreibt – nicht wo Batches *versendet* werden. Ein Prompt oder ein Tool-Argument mit einem API-Key enthält ihn also noch beim Ankommen.
+
+Das ist beabsichtigt. Das sind deine eigenen Instrumentierungsaufrufe, und sie im Transit umzuschreiben würde bedeuten, dass die Events, die du empfängst, nicht die Events sind, die du gesendet hast.
+
+
+ **Du kontrollierst Payloads an der Quelle, an zwei Stellen:**
+
+ - Schalte Content-Capture am Adapter aus. **Der Optionsname unterscheidet sich, und ein Adapter hat keinen** – das ist kein universeller Schalter:
+ - LangChain / LangGraph, Pydantic AI — `capture_content=False`
+ - LlamaIndex — `capture_messages=False`
+ - CrewAI — **kein Content-Schalter**; `session_id` ist die einzige Option, die es liest – Prompts und Completions werden also immer aufgezeichnet.
+
+ `instrument()` ignoriert Optionen, die ein Adapter nicht liest, sodass das Übergeben des falschen Namens nichts auslöst und nichts ändert.
+ - Gib das Geheimnis von vornherein nicht an `input=` weiter.
+
+ `collector.redact` ist kein Ersatz für beides.
+
+
+
+ **Ein leeres Spool-Verzeichnis ist der gesunde Zustand.** Verwende es nicht zur Lieferungsüberprüfung.
+
+
+Der Daemon löscht jeden Batch innerhalb von Millisekunden nach dem Versenden, sodass ein `ls` mit dem Collector um die Wette läuft und nur einen Bruchteil der gesendeten Events zeigt – nicht zu unterscheiden von einem SDK, das nichts aufgezeichnet hat.
+
+Um zu bestätigen, dass Events tatsächlich angekommen sind, prüfe das Dashboard. Um den Spool beim Füllen zu beobachten, stoppe den Daemon zuerst.
+
+
+
+
+
+Jeder Callback läuft innerhalb eines Wrappers, dessen einzige Aufgabe es ist, weiterzuwerfen – dein Aufruf sitzt also in genau einem `try`, und alles, was das SDK tut, geschieht außerhalb davon.
+
+| Was passiert | Ergebnis |
+| --- | --- |
+| Ein Hook wirft | Einmalig mit Traceback geloggt. Dein Aufruf ist nicht betroffen |
+| Derselbe Hook wirft dreimal | Dieser eine Hook ist für den Rest des Prozesses deaktiviert, mit einer Fehlerzeile |
+| `FAILPROOFAI_SDK_STRICT=1` ist gesetzt | Die Exception wird stattdessen weitergegeben |
+| Eine Framework-Version liegt außerhalb des getesteten Bereichs | Einmalige Warnung, Instrumentierung trotzdem |
+| Eine einzelne Fähigkeit fehlt | Nur dieser eine Hook ist deaktiviert, nie der gesamte Adapter |
+
+Der Standard ist in Produktion richtig und beim Debuggen falsch, weil er nur beweisen kann „es ist nicht abgestürzt". Setze `FAILPROOFAI_SDK_STRICT=1`, um einen verschluckten Fehler laut zu machen.
+
+
+
+
+
+## Häufige Probleme
+
+
+
+ Ein öffnendes Event hat kein schließendes: ein `model_request` ohne `model_response` oder ein `tool_use` ohne `tool_result`. Verwende die Scopes, die das Paar auch dann garantieren, wenn der Body eine Exception wirft. Wenn du die Event-Methoden direkt aufrufst, verwende `try` und `finally`.
+
+
+
+ Es wird vom passenden öffnenden Event an gemessen und wird daher bei `tool_result`, `hook_completed`, `agent_resume` und `human_input` abgelehnt. Bei `model_response` wird es akzeptiert, weil nur du die echte Provider-Latenz kennst, und es muss ein Integer sein.
+
+
+
+ Der Thread hat den Kontext nie geerbt. Wickle das Callable in `failproofai_sdk.propagate()` ein. Siehe [Threads und Async](#threads-und-async).
+
+
+
+ Zusätzliche Felder werden zuletzt zusammengeführt, sodass eines mit dem Namen eines echten Feldes wie `model` oder `outcome` dieses überschreiben und eine gespeicherte Spalte verändern würde. Verwende einen Namespace; die Adapter nutzen das Präfix `fw_`.
+
+
+
+ `agent_id` ist eine Facette mit niedriger Kardinalität, und du hast eine Run-ID hineingespeichert. Verwende eine Rolle oder einen Node-Namen und leg die echte ID in ein Payload-Feld.
+
+
+
+## Weiter
+
+
+
+ Paare, IDs, Session-Lebenszyklus und Zustellung.
+
+
+ Folge der Kausalität durch die soeben aufgezeichnete Session.
+
+
+ LangGraph, CrewAI, LlamaIndex und Pydantic AI.
+
+
\ No newline at end of file
diff --git a/docs/de/start/integrations/langchain.mdx b/docs/de/start/integrations/langchain.mdx
new file mode 100644
index 000000000..ccf8901b0
--- /dev/null
+++ b/docs/de/start/integrations/langchain.mdx
@@ -0,0 +1,244 @@
+---
+title: "LangChain and LangGraph"
+sidebarTitle: "LangChain and LangGraph"
+description: "Graphs, Nodes, Tools, Retriever und Modellaufrufe mit einem einzigen Aufruf instrumentieren."
+icon: "/images/frameworks/langchain.svg"
+---
+
+Ein Adapter für beide. LangGraph läuft auf dem Callback-Manager von `langchain-core`, daher instrumentiert das Einbinden des einen automatisch auch das andere.
+
+## Installation
+
+```bash
+pip install 'failproofai-sdk[langgraph]'
+```
+
+Für LangChain ohne LangGraph: `failproofai-sdk[langchain]`.
+
+Unterstützt: `langchain-core` 1.4.7 bis 2.0, `langgraph` 1.2 bis 2.0. Außerhalb dieses Bereichs wird der Adapter trotzdem installiert und gibt einmalig eine Warnung aus.
+
+## Instrumentierung
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+with failproofai_sdk.session():
+ graph.invoke({"messages": [HumanMessage("...")]})
+```
+
+`instrument()` registriert einen Tracer über `langchain_core.tracers.context.register_configure_hook`. LangChain fügt ihn in jeden Callback-Manager ein, den es erstellt – Graphs, Tools und Modelle werden also aufgezeichnet, ohne dass eine Aufrufstelle geändert werden muss, auch nicht in Bibliotheken, die man selbst nicht geschrieben hat.
+
+## Was aufgezeichnet wird
+
+| LangChain oder LangGraph | Failproof-Ereignis |
+| --- | --- |
+| Root-Run | `agent_start`, `agent_end` |
+| LangGraph-Node | `hook_triggered`, `hook_completed` |
+| Kompilierter Subgraph | Verschachteltes `agent_start`, `agent_end` |
+| Tool-Run | `tool_use`, `tool_result` |
+| Retriever-Run | `tool_use`, `tool_result`, Ausgabe zusammengefasst |
+| Chat-Modell oder LLM-Run | `model_request`, `model_response`, mit Token-Nutzung |
+| Gestreamte Tokens | Als Chunk-Anzahl und Zeit bis zum ersten Token in die Antwort eingefaltet. Token-Counts benötigen `ChatOpenAI(stream_usage=True)` – siehe unten |
+| `interrupt()` | `human_wait`, `agent_pause` |
+| `Command(resume=...)` | `agent_resume`, `human_input`, korreliert über die `Interrupt.id` – auch wenn das Resume in einem anderen Prozess gegen denselben Checkpointer erfolgt |
+| Unbehandelte Ausnahme | `error`, dann `agent_end` mit Ergebnis `failed` |
+
+**Ein Node wird zu einem Hook, nicht zu einem verschachtelten Agent.** `agent_id` ist das primäre Merkmal auf jeder Dashboard-Oberfläche – `retrieve`, `grade_documents` und `should_continue` zu Agents zu befördern würde die Ansicht überladen und die Session nach dem Node benennen, der zufällig als Erstes ausgeführt wurde.
+
+Hook-Spans werden gleich dargestellt und bieten dennoch eine knotenspezifische Latenzsicht.
+
+
+ **Nodes können beliebig benannt werden.** Ein Node-Run wird anhand seiner *Form* identifiziert – ein Nicht-Blatt-Run mit LangGraphs eigenem Step-Tag – niemals anhand seines Namens.
+
+
+| Eigener Code | Was aufgezeichnet wird |
+| --- | --- |
+| `add_node("lookup_population", ToolNode([...]))` | Das Tool |
+| `add_node("ChatOpenAI", ...)` | Der Modellaufruf |
+
+Einen Node nach dem darin ausgeführten Objekt zu benennen ließ dessen Ereignisse früher verschwinden. Das ist nicht mehr der Fall.
+
+### Streaming
+
+`.stream()` und `.astream()` erzeugen keine Token-Ereignisse. Sie werden in das abschließende `model_response` eingefaltet:
+
+| Feld | Inhalt |
+| --- | --- |
+| `fw_chunks` | Anzahl der eingegangenen Chunks |
+| `fw_ttft_ms` | Zeit bis zum ersten Token |
+
+### Token-Counts bei gestreamten Antworten
+
+Ein separates Thema, das leicht übersehen wird: OpenAI sendet die Nutzung bei einer gestreamten Antwort **nur auf Anfrage**.
+
+```python
+ChatOpenAI(model="gpt-4o-mini", stream_usage=True) # ohne dies keine Tokens
+```
+
+Der Adapter zeichnet auf, was das Framework liefert. Ohne dieses Flag gibt es nichts aufzuzeichnen, und `model_response` kommt ohne Token-Counts an.
+
+## Beispiel
+
+```python
+import failproofai_sdk
+from langchain_core.messages import HumanMessage
+from langchain_core.tools import tool
+from langchain_openai import ChatOpenAI
+from langgraph.prebuilt import ToolNode, create_react_agent
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+
+@tool
+def price_of(item: str) -> float:
+ """Return the unit price of an item in USD."""
+ return {"widget": 42.0, "gadget": 17.5}[item.lower().strip()]
+
+
+@tool
+def stock_of(item: str) -> int:
+ """Return the units of an item currently in stock."""
+ return {"widget": 120, "gadget": 0}[item.lower().strip()]
+
+
+tools = ToolNode([price_of, stock_of], handle_tool_errors=True)
+graph = create_react_agent(ChatOpenAI(model="gpt-4o-mini"), tools)
+
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("analyst", goal="price and stock report"):
+ result = graph.invoke({
+ "messages": [HumanMessage("Price and stock for widget and gadget?")]
+ })
+```
+
+## Spans benennen
+
+Standardmäßig übernimmt der Root-Span den eigenen Namen des Graphs. Durch ein Wrapping lässt sich ein selbst gewähltes Label vergeben:
+
+```python
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("analyst", goal="price and stock report"):
+ graph.invoke(...)
+```
+
+Bei Multi-Agent-Setups werden die Scopes verschachtelt. Jeder Worker wird zu einem Child-Span mit `parent_id`:
+
+```python
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("supervisor"):
+ with failproofai_sdk.agent("researcher"):
+ research_graph.invoke(...)
+ with failproofai_sdk.agent("writer"):
+ writer_graph.invoke(...)
+```
+
+`agent_id` sollte eine niedrige Kardinalität haben. Rolle oder Node-Name verwenden, niemals eine UUID oder einen run-spezifischen String.
+
+## Session steuern
+
+Die Session-ID wird in folgender Reihenfolge aufgelöst, wobei der erste Treffer gewinnt:
+
+1. `instrument("langchain", session_id=...)`
+2. `config={"metadata": {"failproofai_sdk_session_id": ...}}`
+3. Der umschließende `failproofai_sdk.session()`-Scope
+4. `metadata["session_id"]`, `metadata["conversation_id"]` oder `metadata["thread_id"]`
+5. Die Root-Run-ID
+
+Sie wird niemals von Grund auf neu generiert, da eine synthetisierte ID einen Run auf mehrere Sessions aufteilt.
+
+```python
+graph.invoke(
+ {"messages": [...]},
+ config={"metadata": {"failproofai_sdk_session_id": f"chat-{user_id}"}},
+)
+```
+
+## Optionen
+
+```python
+failproofai_sdk.instrument(
+ "langchain",
+ session_id=None, # jeden Run an eine Session-ID pinnen
+ include_chains=set(), # Allowlist für intermediäre Chains als Hook-Paare
+ capture_content=True, # False entfernt Prompts und Completions aus den Payloads
+ graph_callbacks=True, # erstklassige Interrupt- und Resume-Unterstützung, benötigt langgraph 1.2+
+)
+```
+
+`capture_content=False` für regulierte Daten verwenden. Struktur, Timings, Token-Counts, Tool-Namen und Ergebnisse werden weiterhin aufgezeichnet; Nachrichteninhalte nicht.
+
+`include_chains` gilt nur für **verschachtelte** Runs. Ein Runnable, das auf der obersten Ebene aufgerufen wird, ist die Root der Session und wird daher zum Agent-Span statt zum Hook-Paar – eine Benennung hier hat keinen Effekt.
+
+## Human in the Loop
+
+`interrupt()` erzeugt vier Ereignisse, und keines der Paare ist redundant:
+
+```python
+from langgraph.types import Command, interrupt
+
+def approve(state):
+ decision = interrupt({"prompt": "Ship it?", "options": ["yes", "no"]})
+ return {"approved": decision == "yes"}
+
+with failproofai_sdk.session():
+ graph.invoke(state, config) # human_wait, agent_pause
+ graph.invoke(Command(resume="yes"), config) # agent_resume, human_input
+```
+
+`human_wait` bis `human_input` enthält den Prompt und die Antwort (beides wird bei `capture_content=False` weggelassen, ebenso wie Retrieval-Dokumentquellen – die Dokumentanzahl bleibt erhalten). `agent_pause` bis `agent_resume` ist das einzige Paar, das die Pause-Zeit erfasst; ohne es wird eine zehnminütige menschliche Wartezeit als aktive Agent-Zeit gewertet. Der Root-Span bleibt über die Pause hinweg offen und hält beide Aufrufe in einer Session.
+
+## Häufige Probleme
+
+
+
+ `create_react_agent` propagiert die Ausnahme. Um dem Modell zu ermöglichen, den Fehler zu sehen und fortzufahren, den Tool-Node explizit aufbauen:
+
+ ```python
+ from langgraph.prebuilt import ToolNode, create_react_agent
+
+ tools = ToolNode([price_of, stock_of], handle_tool_errors=True)
+ graph = create_react_agent(model, tools)
+ ```
+
+ Der Fehler wird in jedem Fall als `tool_result` mit einem Fehler aufgezeichnet. Das entscheidet nur, ob der Run ihn überlebt.
+
+
+
+ Ein direktes `llm.invoke()` außerhalb eines Graphs hat keinen übergeordneten Run und öffnet daher einen Root-Span, in dem das Modellpaar ausgegeben wird. Das Dashboard ordnet Blätter einem offenen Agent zu, daher ist der Span beabsichtigt. Benennen:
+
+ ```python
+ with failproofai_sdk.agent("summariser"):
+ summary = ChatOpenAI(model="gpt-4o-mini").invoke([HumanMessage(text)])
+ ```
+
+
+
+ Es wurde ein Failproof-Handler in `config={"callbacks": [...]}` übergeben und zusätzlich `instrument()` aufgerufen. Den Handler entfernen. Der Configure-Hook deckt bereits jeden Callback-Manager im Prozess ab.
+
+
+
+ Das ist nicht der Fall. LangGraph löst `GraphInterrupt` über denselben Pfad wie eine echte Ausnahme aus, weshalb jede Pause den Tracer als Fehler-Callback erreicht. Jede `GraphBubbleUp`-Unterklasse wird stattdessen als Kontrollfluss behandelt, sodass eine Genehmigung keinen roten Fehler erzeugt.
+
+
+
+ In dieser Reihenfolge prüfen: `instrument()` wurde vor der Graph-Ausführung aufgerufen; ein `with failproofai_sdk.session():` umschließt den Aufruf; `FAILPROOFAI_SDK_STRICT=1` ist gesetzt, sodass ein fehlerhafter Hook eine Ausnahme auslöst statt unterdrückt zu werden.
+
+
+
+## Weiter
+
+
+
+ Paare, IDs, Session-Lebenszyklus und Zustellung.
+
+
+ Kausalität durch die gerade aufgezeichnete Session verfolgen.
+
+
+ CrewAI, LlamaIndex, Pydantic AI und benutzerdefinierte Agents.
+
+
\ No newline at end of file
diff --git a/docs/de/start/integrations/llamaindex.mdx b/docs/de/start/integrations/llamaindex.mdx
new file mode 100644
index 000000000..1c6ed1ff3
--- /dev/null
+++ b/docs/de/start/integrations/llamaindex.mdx
@@ -0,0 +1,249 @@
+---
+title: "LlamaIndex"
+sidebarTitle: "LlamaIndex"
+description: "Workflows, Steps, Function-Agents und Retriever instrumentieren."
+icon: "/images/frameworks/llamaindex.svg"
+---
+
+## Installation
+
+```bash
+pip install 'failproofai-sdk[llamaindex]'
+```
+
+Unterstützt: `llama-index-core` 0.14.23 bis 0.15. Ab 0.14.23 überträgt der Workflow-Stream die typisierten Agent-Events, die dieser Adapter liest. Darunter fehlen sowohl Modellnamen als auch die Agent-Struktur.
+
+## Instrumentierung
+
+```python
+import asyncio
+
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+
+async def main():
+ async with failproofai_sdk.session():
+ await agent.run("...")
+
+
+asyncio.run(main())
+```
+
+Die Agent-API von LlamaIndex ist asynchron. Jeder Scope funktioniert sowohl mit `async with` als auch mit `with` und erzeugt identische Events.
+
+`instrument()` hängt einen Event-Handler und einen Span-Handler an den globalen Dispatcher von LlamaIndex. Gemeinsam machen sie die Agent-Schleife sichtbar – nicht nur deren Modellaufrufe.
+
+
+ Ohne ein zusätzliches Argument an Ihrem LLM ist jede Token-Anzahl im Trace null. Siehe [Token-Anzahlen](#token-counts) weiter unten.
+
+
+## Token-Anzahlen
+
+`FunctionAgent` ruft `astream_chat` auf, und `llama-index-llms-openai` sendet beim Streamen kein `stream_options={"include_usage": True}`. Der Provider sendet daher niemals den Usage-Chunk, und es gibt nichts, das eine Instrumentierung lesen könnte.
+
+Dies ist ein vorgelagertes LlamaIndex-Verhalten. Aktivieren Sie es an Ihrem LLM:
+
+```python
+from llama_index.llms.openai import OpenAI
+
+llm = OpenAI(
+ model="gpt-4o-mini",
+ additional_kwargs={"stream_options": {"include_usage": True}},
+)
+```
+
+Gemessen am selben Run und Modell:
+
+| | Eingabe-Token | Ausgabe-Token |
+| --- | --- | --- |
+| Ohne | `null` | `null` |
+| Mit | 148 | 17 |
+
+Nicht-Streaming-Aufrufe (`llm.chat`, `llm.achat`) melden die Nutzung ohne Konfiguration. Nur der Streaming-Pfad – der Standard-Agent-Pfad – benötigt dies.
+
+## Was aufgezeichnet wird
+
+| LlamaIndex | Failproof-Event |
+| --- | --- |
+| `Workflow.run`-Root-Span | Session, `agent_start`, `agent_end` |
+| Verschachtelter `Workflow.run`-Span | Verschachteltes `agent_start`, `agent_end` |
+| Workflow-Step-Span | `hook_triggered`, `hook_completed` |
+| LLM-Chat-Start und -Ende | `model_request`, `model_response` |
+| `FunctionTool.call`-Span | `tool_use`, `tool_result` |
+| Retrieval-Start und -Ende | `tool_use`, `tool_result`, Ausgabe zusammengefasst |
+| Embeddings | Nichts, außer `embeddings=True` |
+| Ein Tool wartet auf eine Person | `human_wait`, `agent_pause`, dann `agent_resume`, `human_input` |
+| `AgentWorkflow`-Handoff | Ein verschachteltes `agent_start`, `agent_end` pro Agent, dem Workflow zugeordnet |
+| Exception | `error`, dann `agent_end` mit Ergebnis `failed` und `agent_end.summary` mit dessen Namen |
+| `handler.cancel_run()` | `agent_end` mit Ergebnis `cancelled` ohne `error` – ein Stopp-Button ist kein Fehler |
+
+`agent_id` ist der `FunctionAgent.name`, wenn Sie einen gesetzt haben, andernfalls der Workflow-Klassenname. Unter einem `AgentWorkflow` erhält jeder Agent, der an die Reihe kommt, seinen eigenen verschachtelten Span unter dem Workflow – ein Handoff erscheint daher als zwei Agenten statt als einer.
+
+Die Retrieval-Ausgabe wird zusammengefasst statt vollständig ausgegeben. Ein Retriever gibt Dokumente zurück, und deren vollständige Speicherung im Payload würde Ihr Korpus bei jeder Anfrage einmal im Event-Store ablegen. Stattdessen werden Anzahl, Score-Bereich und gekürzte Ausschnitte gespeichert.
+
+## Beispiel
+
+```python
+import asyncio
+
+import failproofai_sdk
+from llama_index.core.agent.workflow import FunctionAgent
+from llama_index.core.tools import FunctionTool
+from llama_index.llms.openai import OpenAI
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+POP = {"tokyo": "37M", "delhi": "33M"}
+AREA = {"tokyo": "2,194 km2", "delhi": "1,484 km2"}
+
+
+def population(city: str) -> str:
+ """Population of a city. Valid: tokyo, delhi."""
+ return POP.get(city.lower().strip(), "unknown")
+
+
+def area(city: str) -> str:
+ """Land area of a city. Valid: tokyo, delhi."""
+ return AREA.get(city.lower().strip(), "unknown")
+
+
+async def main():
+ agent = FunctionAgent(
+ name="city_analyst",
+ tools=[
+ FunctionTool.from_defaults(fn=population),
+ FunctionTool.from_defaults(fn=area),
+ ],
+ llm=OpenAI(
+ model="gpt-4o-mini",
+ additional_kwargs={"stream_options": {"include_usage": True}},
+ ),
+ system_prompt="Use the tools. Be terse.",
+ )
+
+ async with failproofai_sdk.session():
+ async with failproofai_sdk.agent("city_analyst", goal="compare two cities"):
+ print(await agent.run("Compare Tokyo and Delhi on population and area."))
+
+
+asyncio.run(main())
+```
+
+Die Agent-Schleife erscheint im Trace als Hook-Paare: `init_run`, `setup_agent`, `run_agent_step`, `parse_agent_output`, `call_tool` und `aggregate_tool_results`. Da es sich um die eigene Schleife des Frameworks handelt, sind sie Hooks statt Agents – das hält `agent_id` aussagekräftig.
+
+## Spans benennen
+
+`agent_id` ist der `FunctionAgent.name`, wenn Sie einen gesetzt haben, andernfalls der Workflow-Klassenname.
+
+```python
+FunctionAgent(name="city_analyst", tools=[...], llm=llm) # agent_id = "city_analyst"
+```
+
+In einem `AgentWorkflow` ist dieser Name auch der, unter dem jeder Handoff aufgezeichnet wird:
+
+```text
+AgentWorkflow parent span
+├─ city_analyst turn 1
+├─ cost_analyst turn 2
+└─ city_analyst turn 3 — a new turn, not a reopened one
+```
+
+`agent_id` zeigt also **welcher Agent** die Arbeit erledigt hat, und `parent_id` zeigt **welchem Workflow** er angehörte. Ein Agent, der die Kontrolle später zurückgibt, öffnet einen zweiten Turn statt seinen ersten wieder aufzunehmen.
+
+Umschließen Sie den Run, um dies zu überschreiben oder mehrere Agenten unter einem gemeinsamen Parent zu gruppieren:
+
+```python
+async with failproofai_sdk.agent("research", goal="compare two cities"):
+ await agent.run(...)
+```
+
+Halten Sie `agent_id` mit niedriger Kardinalität. Es ist die primäre Facette auf jeder Dashboard-Oberfläche – verwenden Sie also einen Rollen- oder Workflow-Namen, niemals eine UUID oder einen pro-Run-generierten String.
+
+## Session steuern
+
+Dieser Adapter hat **keine `session_id`-Option**. Die Session kommt aus dem umschließenden Scope, andernfalls wird pro Workflow-Run ein `uuid4().hex` generiert:
+
+```python
+async with failproofai_sdk.session(f"chat-{user_id}"):
+ await agent.run(...)
+```
+
+## Optionen
+
+```python
+failproofai_sdk.instrument(
+ "llama_index",
+ embeddings=False, # True zeichnet Embedding-Aufrufe als Tool-Paare auf
+ steps=True, # False verwirft Workflow-Step-Hook-Paare
+ capture_messages=True, # False verwirft JEDEN Payload: Prompts, Completions,
+ # Tool-Argumente und -Ausgaben, Step-I/O, Retrieval-
+ # Anfragen, Ziel und finale Antwort
+ capture_limit=8192, # Zeichen pro erfasstem Wert
+ stale_after=600.0, # Sekunden, bevor ein verlassenes LEAF zwangsweise geschlossen wird
+ reaper_interval=30.0, # wie oft der Reaper durchläuft; 0 deaktiviert ihn
+)
+```
+
+| Option | Wann Sie sie ändern würden |
+| --- | --- |
+| `embeddings` | Nur beim Debuggen von Embedding-Latenz oder -Kosten einschalten. Ein Bulk-Index-Build umfasst Tausende von Aufrufen und begräbt die Timeline. |
+| `steps` | Ausschalten, wenn Sie nur Modell- und Tool-Events wünschen und die Agent-Schleife als störend empfinden. |
+| `capture_messages` | Für regulierte Daten ausschalten. Jeder Payload wird nicht mehr aufgezeichnet – Prompts, die Completion des Modells, Tool-Argumente und Rückgabewerte, Workflow-Step-Ein- und -Ausgabe, Retrieval-Anfragen, das Ziel des Agenten und seine finale Antwort. Struktur, Timings, Token und Ergebnisse werden weiterhin aufgezeichnet. |
+| `capture_limit` | Zeichen pro erfasstem Wert vor dem Kürzen. Erhöhen Sie diesen Wert, wenn ein RAG-Prompt oder ein abgerufener Kontext abgeschnitten ankommt. |
+| `stale_after` | Sekunden, bevor ein verlassenes **Leaf** – eine gestreamte Antwort, die niemand konsumiert hat, ein Modell- oder Tool-Span, dessen Schließung nie ankam – zwangsweise geschlossen wird, damit die Session sich auflöst statt dauerhaft `ongoing` zu bleiben. Dies schließt **nicht** einen verlassenen Run selbst: Ein Workflow, dessen Task ohne einen Exit-Signal des Dispatchers abgebrochen wird, lässt seinen `agent_start` offen bis `uninstrument()`. |
+| `reaper_interval` | Sweep-Frequenz. Auf `0` setzen, um den Reaper vollständig zu deaktivieren. |
+
+## Human in the Loop
+
+Wird erfasst, wenn das Warten innerhalb eines Tools stattfindet:
+
+```python
+async def ask_human(question: str) -> str:
+ """Ask a person and wait for their answer."""
+ response = await ctx.wait_for_event(HumanResponseEvent)
+ return response.answer
+```
+
+`ctx.wait_for_event` in einem gewöhnlichen Workflow-Step wird nicht erfasst. Die Runtime fängt den Drop ab, bevor er den Dispatcher erreicht – der Step beendet sich und läuft später erneut, ohne ein Signal, auf das eine Pause gestützt werden könnte. Das FunctionAgent-Muster, das LlamaIndex dokumentiert, wartet innerhalb eines Tools und wird vollständig erfasst.
+
+## Häufige Probleme
+
+
+
+ Fügen Sie `additional_kwargs={"stream_options": {"include_usage": True}}` zu Ihrem LLM hinzu. Siehe [Token-Anzahlen](#token-counts).
+
+
+
+ LlamaIndex hat kein standardisiertes Usage-Feld. Der Adapter versucht mehrere bekannte Strukturen, und eine Integration, die ihre Zähler anders benennt, passt zu keiner davon.
+
+ Das rohe Dict wird immer mitgeschickt – prüfen Sie `usage` im Payload, um zu sehen, wie Ihr Provider sie nennt.
+
+ Ein befülltes `usage` bei gleichzeitig leeren Token-Spalten ist beabsichtigt – das ist besser als eine sichere, aber falsche Zahl.
+
+
+
+ Das ist die FunctionAgent-Schleife, ein Satz pro Iteration. Filtern Sie nach Hook-Namen im Dashboard. Diese Step-Timings sind meist der Grund, diesen Adapter statt eines reinen Modell-Adapters zu verwenden.
+
+
+
+ Prüfen Sie in dieser Reihenfolge: `instrument()` wurde vor dem Run aufgerufen; ein `async with failproofai_sdk.session():` umschließt das `await`; `llama-index-core` ist 0.14.23 oder neuer; `FAILPROOFAI_SDK_STRICT=1` ist gesetzt, damit ein fehlerhafter Hook eine Exception wirft statt verschluckt zu werden.
+
+
+
+## Weiter
+
+
+
+ Paare, IDs, Session-Lebenszyklus und Zustellung.
+
+
+ Die Kausalität durch die soeben erfasste Session verfolgen.
+
+
+ LangGraph, CrewAI, Pydantic AI und eigene Agenten.
+
+
\ No newline at end of file
diff --git a/docs/de/start/integrations/pydantic-ai.mdx b/docs/de/start/integrations/pydantic-ai.mdx
new file mode 100644
index 000000000..43ee97f52
--- /dev/null
+++ b/docs/de/start/integrations/pydantic-ai.mdx
@@ -0,0 +1,208 @@
+---
+title: "Pydantic AI"
+sidebarTitle: "Pydantic AI"
+description: "Typisierte Agenten, Tools, Modellaufrufe und Wiederholungsversuche instrumentieren."
+icon: "/images/frameworks/pydantic-ai.svg"
+---
+
+## Installation
+
+```bash
+pip install 'failproofai-sdk[pydantic-ai]'
+```
+
+Unterstützt: `pydantic-ai-slim` 2.0 bis 3.0. Version 2.0 hat `Agent(instrument=...)` entfernt und das Capability-Protokoll eingeführt, auf dem dieser Adapter aufbaut. Version 1.x kann daher auf diese Weise nicht instrumentiert werden.
+
+## Instrumentierung
+
+```python
+import failproofai_sdk
+from pydantic_ai import Agent
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument() # before constructing any Agent
+
+agent = Agent("openai:gpt-4o-mini", system_prompt="Be terse.")
+
+with failproofai_sdk.session():
+ result = agent.run_sync("...")
+```
+
+
+ `instrument()` muss ausgeführt werden, bevor ein `Agent` erstellt wird. Die Capability wird beim Erstellen angehängt – ein vorher erstellter Agent enthält keine und zeichnet nichts auf, ohne dass ein Fehler ausgegeben wird, da technisch nichts schiefgelaufen ist. Dies ist die häufigste Ursache für einen leeren Trace mit diesem Adapter.
+
+
+Agenten auf Modulebene sind dabei besonders tückisch:
+
+```python
+# agents.py
+agent = Agent("openai:gpt-4o-mini") # constructed at import time
+
+# main.py
+import failproofai_sdk
+failproofai_sdk.instrument() # run this FIRST
+import agents # now the agent gets the capability
+```
+
+Zur Überprüfung:
+
+```python
+print([type(c).__name__ for c in agent.root_capability.capabilities])
+# ['FailproofAI', 'ToolSearch', 'PendingMessageDrainCapability']
+```
+
+Pydantic AI fasst die übergebene Liste zu einer einzelnen `root_capability` zusammen, daher gibt es kein `agent.capabilities`-Attribut zum Auslesen.
+
+Agenten, die während der Instrumentierung erstellt wurden, behalten die Capability – `uninstrument()` und erneutes Instrumentieren sind ohne Neuerstellung möglich.
+
+## Was aufgezeichnet wird
+
+| Pydantic AI | Failproof-Ereignis |
+| --- | --- |
+| Agent-Ausführung | `agent_start`, `agent_end` |
+| Modellanfrage | `model_request`, `model_response`, mit Token-Nutzung |
+| Tool-Aufruf | `tool_use`, `tool_result`, mit den vom Modell gesendeten Argumenten |
+| `ModelRetry` aus einem Tool | `tool_result` mit einem Fehler |
+| Unbehandelte Ausnahme | `error`, dann `agent_end` mit Ergebnis `failed` |
+
+Es gibt hier kein Hook-Paar und kein Human-in-the-Loop-Paar. Pydantic AI hat keine Node- oder Schrittgrenze zum Einklammern und keine eingebaute menschliche Pause – daher gibt es nichts zuzuordnen. Falls Sie beides implementieren, senden Sie die Ereignisse selbst – siehe [Benutzerdefinierte Agenten](/de/reference/custom-agents).
+
+`output_type` hat keinen Einfluss auf den Trace. Ein typisierter Lauf und ein String-Lauf erzeugen dieselben Ereignisse.
+
+## Beispiel
+
+```python
+import failproofai_sdk
+from pydantic import BaseModel
+from pydantic_ai import Agent, ModelRetry
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+PRICE = {"widget": 42.0, "gadget": 17.5}
+STOCK = {"widget": 120, "gadget": 0}
+
+
+class Report(BaseModel):
+ headline: str
+ out_of_stock: list[str]
+
+
+agent = Agent(
+ "openai:gpt-4o-mini",
+ output_type=Report,
+ system_prompt="Use the tools for every number. If a tool fails, note it and continue.",
+)
+
+
+@agent.tool_plain
+def price_of(item: str) -> float:
+ """Unit price of an item. Valid: widget, gadget."""
+ return PRICE[item.lower().strip()]
+
+
+@agent.tool_plain
+def stock_of(item: str) -> int:
+ """Units in stock. Valid: widget, gadget."""
+ return STOCK[item.lower().strip()]
+
+
+@agent.tool_plain
+def restock_eta(item: str) -> str:
+ """Restock ETA. Not available."""
+ raise ModelRetry(f"no restock schedule for {item!r} — answer without it")
+
+
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("inventory", goal="stock report"):
+ result = agent.run_sync(
+ "For widget and gadget, get price and stock. "
+ "For anything out of stock, try the restock ETA. Then produce the report."
+ )
+```
+
+Im Trace erscheint `restock_eta` als `tool_result` mit einem Fehler, gefolgt von einem weiteren Modellaufruf, bei dem der Agent damit umgeht – der Lauf endet dennoch mit `success`. Beide Informationen werden festgehalten.
+
+## Fehler, Wiederholungsversuche und Kontrollfluss
+
+Pydantic AI wirft Ausnahmen für drei verschiedene Fälle, und der Adapter unterscheidet zwischen ihnen:
+
+| Ausnahme | Behandlung | Ergebnis |
+| --- | --- | --- |
+| `ModelRetry`, `ToolRetryError`, `ToolFailedError` | Echter Tool-Fehler | `tool_result` mit einem Fehler; der Lauf kann dennoch mit `success` enden |
+| `SkipToolExecution`, `SkipToolValidation`, `SkipModelRequest`, `CallDeferred`, `ApprovalRequired` | Kontrollfluss | Kein Fehler; der Lauf wird gesteuert |
+| Alles andere | Ein Fehler | `error`, dann `agent_end` mit Ergebnis `failed` |
+
+`ModelRetry` gehört bewusst zur ersten Gruppe. Es bedeutet, dass ein Versuch tatsächlich fehlgeschlagen ist und das Modell aufgefordert wurde, es erneut zu versuchen – genau dafür ist das Fehlerfeld eines Tool-Spans gedacht. Eine Einordnung als Kontrollfluss würde echte Tool-Fehler hinter einem grünen Lauf verbergen.
+
+## Spans benennen
+
+Pydantic AIs eigener Run-Span heißt `agent`. Umschließen Sie den Aufruf, um ihm einen selbst gewählten Namen zu geben:
+
+```python
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("inventory", goal="stock report"):
+ agent.run_sync("...")
+```
+
+Der Framework-Span wird dann unter `inventory` eingebettet, und dort hängen die Modell- und Tool-Ereignisse.
+
+Halten Sie `agent_id` mit geringer Kardinalität. Es ist die primäre Facette auf jeder Dashboard-Oberfläche – verwenden Sie daher einen Rollennamen, niemals eine UUID oder einen laufspezifischen String.
+
+## Session steuern
+
+Wird in dieser Reihenfolge aufgelöst, der erste Treffer gewinnt:
+
+1. `instrument("pydantic_ai", session_id=...)`
+2. Der umschließende `failproofai_sdk.session()`-Scope
+3. Die `conversation_id` des Laufs, dann dessen `run_id`
+4. Eine generierte `uuid4().hex`
+
+```python
+with failproofai_sdk.session(f"chat-{user_id}"):
+ agent.run_sync("...")
+```
+
+## Optionen
+
+```python
+failproofai_sdk.instrument(
+ "pydantic_ai",
+ session_id=None, # pin every run to one session id
+ capture_content=True, # False drops prompts and completions from payloads
+)
+```
+
+## Häufige Probleme
+
+
+
+ Der `Agent` wurde erstellt, bevor `instrument()` ausgeführt wurde. Siehe den Hinweis oben und prüfen Sie `agent.root_capability.capabilities`.
+
+
+
+ Ein bloßes `raise` wird weitergegeben – das ist das Design von Pydantic AI. Damit das Modell damit umgehen kann, verwenden Sie `ModelRetry` mit einer Nachricht, auf die es reagieren kann. Der Fehler wird in jedem Fall aufgezeichnet.
+
+
+
+ Dieser untergeordnete Span ist Pydantic AIs eigener Run-Span, und dort hängen die Modell- und Tool-Ereignisse. Entfernen Sie Ihren eigenen Scope, wenn Sie einen einzelnen Span möchten – auf Kosten des benutzerdefinierten Namens.
+
+
+
+ Pydantic AIs asynchroner Graph-Stack ist länger als das Feldlimit der Nutzlast, und die letzte Zeile eines Tracebacks ist die Ausnahme selbst. Dieses Feld wird von vorne statt von hinten gekürzt, sodass die benötigte Zeile erhalten bleibt.
+
+
+
+## Weiter
+
+
+
+ Paare, IDs, Session-Lebenszyklus und Übertragung.
+
+
+ Kausalität durch die gerade aufgezeichnete Session verfolgen.
+
+
+ LangGraph, CrewAI, LlamaIndex und benutzerdefinierte Agenten.
+
+
\ No newline at end of file
diff --git a/docs/de/start/quickstart.mdx b/docs/de/start/quickstart.mdx
index 80a72bdcf..515080a89 100644
--- a/docs/de/start/quickstart.mdx
+++ b/docs/de/start/quickstart.mdx
@@ -1,27 +1,27 @@
---
-title: "Schnellstart"
-description: "Zeichne eine Agent-Session auf, finde einen Fehler und beginne, ihn zu verhindern."
+title: "Quickstart"
+description: "Erfasse eine Agent-Session, finde einen Fehler und verhindere ihn."
icon: "zap"
---
-Dieser Schnellstart bringt eine Maschine dazu, Sessions zu melden, führt ein Audit durch und stellt eine Policy bereit. Nutze die Skill-Methode oder folge den manuellen Schritten.
+Dieser Quickstart richtet eine Maschine zum Melden von Sessions ein, führt ein Audit durch und stellt eine Policy bereit. Nutze die Skill-Option oder folge den manuellen Schritten.
-**Welchen Weg nimmst du?** Wenn dein Agent in einem der 12 unterstützten [Harnesses](/de/reference/harnesses) läuft — einer Coding-CLI oder einem Gateway wie Hermes oder OpenClaw — folge den Schritten unten; du benötigst Node.js 20.9 oder höher. Wenn dein Agent kein Harness hat, instrumentiere ihn mit dem [Python SDK](/de/reference/custom-agents) für Tracing und Audits und steige dann bei [Führe deine erste Fehlerprüfung durch](/de/start/first-audit) wieder ein; Enforcement auf diesem Pfad erfordert einen Hook in deiner Laufzeitumgebung.
+**Welcher Weg ist deiner?** Wenn dein Agent in einem der 12 unterstützten [Harnesses](/de/reference/harnesses) läuft — einer Coding-CLI oder einem Gateway wie Hermes oder OpenClaw — folge den Schritten unten; du benötigst Node.js 20.9 oder neuer. Wenn dein Agent kein Harness hat, instrumentiere ihn mit dem [Python SDK](/de/reference/custom-agents) für Tracing und Audits und steig dann bei [Ersten Fehlercheck ausführen](/de/start/first-audit) wieder ein; für Durchsetzung auf diesem Weg ist ein Hook in deiner Runtime erforderlich.
-
+
```bash
npx skills add FailproofAI/skills
```
-
+
```text
Set up Failproof AI for this project, connect this machine, install the right hooks and policies, and verify that a session arrives.
```
- Dein Agent untersucht das Projekt, wählt die passende Integration, führt das Setup durch und verifiziert es. Im [FailproofAI Skills-Repository](https://github.com/FailproofAI/skills) findest du einzelne Skills und erweiterte Installationsoptionen.
+ Dein Agent analysiert das Projekt, wählt die passende Integration, führt das Setup durch und überprüft es. Siehe das [FailproofAI Skills-Repository](https://github.com/FailproofAI/skills) für einzelne Skills und erweiterte Installationsoptionen.
@@ -30,13 +30,13 @@ Dieser Schnellstart bringt eine Maschine dazu, Sessions zu melden, führt ein Au
1. Öffne das [Failproof AI Dashboard](https://app.befailproof.ai) und erstelle ein Konto oder melde dich mit deiner Arbeits-E-Mail an.
2. Gehe zu **Administration → Keys** und erstelle einen Key mit `events:add` und `policies:pull`.
-3. Kopiere das einmalige Secret und speichere es auf der Zielmaschine:
+3. Kopiere das Einmal-Secret und speichere es auf der Zielmaschine:
```bash
export FAILPROOFAI_KEY=""
```
- ## Installation
+ ## Installieren
@@ -45,9 +45,9 @@ export FAILPROOFAI_KEY=""
failproofai config --connect https://app.befailproof.ai --token "$FAILPROOFAI_KEY"
```
- Session-Transkripte werden standardmäßig gesendet. Füge `--no-transcripts` hinzu, um Hook-Aktivitäten und Policy-Entscheidungen ohne Transkriptinhalt zu melden.
+ Session-Transkripte werden standardmäßig übertragen. Füge `--no-transcripts` hinzu, um Hook-Aktivitäten und Policy-Entscheidungen ohne Transkriptinhalte zu melden.
- Wenn diese Maschine bereits Agent-Verlauf hat, kannst du die letzten sieben Tage vorab ansehen und importieren — warte dann, bis die Übertragung abgeschlossen ist. Überspringe diesen Schritt auf einer neuen Maschine.
+ Falls diese Maschine bereits Agent-Verlaufsdaten hat, zeige die letzten sieben Tage in der Vorschau an und importiere sie, dann warte bis die Übertragung abgeschlossen ist. Überspringe diesen Schritt auf einer neuen Maschine.
```bash
failproofai backfill --since 7d --dry-run
@@ -58,27 +58,27 @@ export FAILPROOFAI_KEY=""
Öffne **Sessions** in Failproof AI und wähle eine importierte Session aus.
- Damit wird Failproof AI an dein Harness angebunden und die 40 integrierten Policies werden installiert. Nutze sie, um lokale Policy-Entscheidungen zu sehen und Enforcement auszuprobieren, bevor Failproof AI deine Sessions auditiert und Policies für deine Agents schreibt.
+ Dadurch wird Failproof AI mit deinem Harness verbunden und die 40 integrierten Policies werden installiert. Nutze sie, um lokale Policy-Entscheidungen zu sehen und Durchsetzung auszuprobieren, bevor Failproof AI deine Sessions auditiert und Policies für deine Agents schreibt.
- Lass den Installer dein Harness erkennen oder gib eines explizit an. Alle 12 sind gültige `--cli`-Werte — `claude`, `codex`, `copilot`, `cursor`, `opencode`, `pi`, `hermes`, `openclaw`, `factory`, `devin`, `antigravity`, `goose`.
+ Lass den Installer dein Harness erkennen oder gib eines explizit an. Jedes der 12 ist ein gültiger `--cli`-Wert — `claude`, `codex`, `copilot`, `cursor`, `opencode`, `pi`, `hermes`, `openclaw`, `factory`, `devin`, `antigravity`, `goose`.
```bash
failproofai policies --install --cli claude --scope user # eine Coding-CLI
failproofai policies --install --cli hermes --scope user # ein Slack/Telegram-Gateway
```
- Das Blockieren eines Tool-Calls vor der Ausführung ist auf allen 12 verifiziert. Turn-End-Gates sind auf 8 verifiziert — siehe [Enforcement-Fähigkeiten](/de/reference/harnesses#enforcement-capability) für die harness-spezifische Matrix.
+ Das Blockieren eines Tool-Calls vor der Ausführung wird auf allen 12 unterstützt. Turn-End-Gates werden auf 8 unterstützt — siehe [Durchsetzungsfähigkeit](/de/reference/harnesses#enforcement-capability) für die Harness-spezifische Matrix.
- Folge [Führe deine erste Fehlerprüfung durch](/de/start/first-audit). Verwende ein konkretes Ziel, z. B. „Finde Sessions, in denen der Agent ein fehlgeschlagenes Tool wiederholt hat, ohne seine Vorgehensweise zu ändern."
+ Folge [Ersten Fehlercheck ausführen](/de/start/first-audit). Nutze ein konkretes Ziel, zum Beispiel: „Sessions finden, in denen der Agent einen fehlschlagenden Tool-Call erneut versucht hat, ohne seinen Ansatz zu ändern."
- Folge [Verhindere deinen ersten Fehler mit einer Policy](/de/start/first-policy). Beginne im Beobachtungsmodus, prüfe die Treffer und erzwinge dann die überprüfte Version.
+ Folge [Ersten Fehler mit einer Policy verhindern](/de/start/first-policy). Starte im Beobachtungsmodus, prüfe Treffer und setze dann die überprüfte Version durch.
- Führe `failproofai config --status` aus. Ein gesundes Setup meldet die Cloud-Verbindung, den Daemon-Status und ob Enforcement pausiert ist.
+ Führe `failproofai config --status` aus. Ein gesundes Setup meldet die Cloud-Verbindung, den Daemon-Status und ob die Durchsetzung pausiert ist.
\ No newline at end of file
diff --git a/docs/de/start/quickstarts/crewai.mdx b/docs/de/start/quickstarts/crewai.mdx
new file mode 100644
index 000000000..8bb4c2479
--- /dev/null
+++ b/docs/de/start/quickstarts/crewai.mdx
@@ -0,0 +1,37 @@
+---
+title: "CrewAI"
+description: "Installieren, instrumentieren und Ihren ersten Trace sehen."
+icon: "/images/frameworks/crewai.svg"
+---
+
+Drei Schritte zu Ihrem ersten CrewAI-Trace. Informationen zu den Inhalten der einzelnen Events, Flows und zur Fehlerbehebung finden Sie in der [vollständigen Anleitung](/de/start/integrations/crewai).
+
+## Installation
+
+```bash
+pip install 'failproofai-sdk[crewai]'
+```
+
+## Instrumentierung
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+with failproofai_sdk.session():
+ Crew(agents=[analyst, writer], tasks=[gather, summarise]).kickoff()
+```
+
+An Ihrer Crew, Ihren Agents, Tasks oder Tools ändert sich nichts. `instrument()` abonniert den modulweiten Event-Bus von CrewAI.
+
+## Überprüfung des Eingangs
+
+Führen Sie es einmal aus und öffnen Sie dann **Observe → Sessions**, und wählen Sie Ihre Umgebung aus. Ihr Durchlauf erscheint als rekonstruierter Trace.
+
+Falls nichts ankommt, überprüfen Sie mit `failproofai config --status`, ob die Maschine verbunden ist.
+
+
+ Was aufgezeichnet wird, Flows, Token-Nutzung, Span-Benennung, Optionen und häufige Probleme.
+
\ No newline at end of file
diff --git a/docs/de/start/quickstarts/custom-agents.mdx b/docs/de/start/quickstarts/custom-agents.mdx
new file mode 100644
index 000000000..7f85b72e1
--- /dev/null
+++ b/docs/de/start/quickstarts/custom-agents.mdx
@@ -0,0 +1,50 @@
+---
+title: "Eigene Agenten"
+description: "Füge deinem Agenten drei `with`-Blöcke hinzu und er beginnt mit der Aufzeichnung."
+icon: "code"
+---
+
+Für Agenten, die du selbst entwickelt hast, oder Frameworks, für die Failproof AI keinen Adapter anbietet.
+
+Du wrappst die bestehende Arbeit in `with`-Blöcke. Jeder Block zeichnet auf, wann er gestartet und beendet wurde und wie lange er gedauert hat — du musst sonst nichts aufrufen.
+
+## Installation
+
+```bash
+pip install failproofai-sdk
+```
+
+Keine Extras, keine Abhängigkeiten.
+
+## Instrumentierung
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+
+with failproofai_sdk.session(): # ein Durchlauf
+ with failproofai_sdk.agent("planner"): # eine Arbeitseinheit
+ with failproofai_sdk.tool_call("search", input={"q": q}) as t:
+ t.output = search(q) # ein Tool-Aufruf
+```
+
+Von oben nach unten gelesen erklärt sich der Code von selbst:
+
+| Wrapping-Block | Bedeutung |
+| --- | --- |
+| `session()` | Diese Events gehören zum selben Durchlauf |
+| `agent()` | Eine Komponente erledigt Arbeit — gib ihr einen Namen, den du in einer Liste wiedererkennen würdest |
+| `tool_call()` | Das ist ein Tool-Aufruf, und das ist sein Rückgabewert |
+
+Verschachtele die Blöcke so, wie dein Code es erfordert. IDs musst du nicht weitergeben: Jeder Block merkt sich, in welchem Kontext er sich befindet, sodass alles, was du aufzeichnest, automatisch dem richtigen Durchlauf und dem richtigen Agenten zugeordnet wird. `async with` funktioniert auf dieselbe Weise.
+
+## Überprüfung des Eingangs
+
+Führe den Code einmal aus, öffne dann **Observe → Sessions** und wähle deine Umgebung aus. Dein Durchlauf erscheint als rekonstruierter Trace.
+
+Wenn nichts ankommt, prüfe mit `failproofai config --status`, ob die Maschine verbunden ist.
+
+
+ Alle Event-Methoden, Verhalten bei Ausnahmen im Code, ein ausgearbeitetes Beispiel, Threads und Async sowie die Instrumentierung von Frameworks ohne Adapter.
+
\ No newline at end of file
diff --git a/docs/de/start/quickstarts/langchain.mdx b/docs/de/start/quickstarts/langchain.mdx
new file mode 100644
index 000000000..216cbccb4
--- /dev/null
+++ b/docs/de/start/quickstarts/langchain.mdx
@@ -0,0 +1,39 @@
+---
+title: "LangChain und LangGraph"
+description: "Installieren, instrumentieren und den ersten Trace ansehen."
+icon: "/images/frameworks/langchain.svg"
+---
+
+Drei Schritte zu Ihrem ersten LangChain- oder LangGraph-Trace. Informationen zu Streaming, Human-in-the-Loop, Span-Benennung und weiteren Optionen finden Sie im [vollständigen Leitfaden](/de/start/integrations/langchain).
+
+## Installieren
+
+```bash
+pip install 'failproofai-sdk[langgraph]'
+```
+
+Für LangChain ohne LangGraph verwenden Sie `failproofai-sdk[langchain]`.
+
+## Instrumentieren
+
+```python
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+with failproofai_sdk.session():
+ graph.invoke({"messages": [HumanMessage("...")]})
+```
+
+Keine Änderungen an den Aufrufstellen. `instrument()` registriert einen Tracer, den LangChain in jeden Callback-Manager injiziert, den es erstellt – so werden Graphs, Tools und Modelle erfasst, einschließlich solcher, die sich in Bibliotheken befinden, die Sie nicht selbst geschrieben haben.
+
+## Prüfen, ob alles angekommen ist
+
+Führen Sie die Anwendung einmal aus und öffnen Sie anschließend **Observe → Sessions**, um Ihre Umgebung auszuwählen. Ihr Durchlauf erscheint als rekonstruierter Trace.
+
+Falls nichts ankommt, überprüfen Sie die Verbindung des Rechners mit `failproofai config --status`.
+
+
+ Was aufgezeichnet wird, Streaming, Token-Zählungen, Span-Benennung, Session-Steuerung, Optionen und Human-in-the-Loop.
+
\ No newline at end of file
diff --git a/docs/de/start/quickstarts/llamaindex.mdx b/docs/de/start/quickstarts/llamaindex.mdx
new file mode 100644
index 000000000..2b329ec43
--- /dev/null
+++ b/docs/de/start/quickstarts/llamaindex.mdx
@@ -0,0 +1,48 @@
+---
+title: "LlamaIndex"
+description: "Installieren, instrumentieren und Ihren ersten Trace anzeigen."
+icon: "/images/frameworks/llamaindex.svg"
+---
+
+Drei Schritte zu Ihrem ersten LlamaIndex-Trace. Informationen zu Workflow-Schritten, Retrieval, dem Reaper und weiteren Optionen finden Sie in [der vollständigen Anleitung](/de/start/integrations/llamaindex).
+
+## Installation
+
+```bash
+pip install 'failproofai-sdk[llamaindex]'
+```
+
+## Instrumentierung
+
+Die Agent-API von LlamaIndex ist asynchron. Jeder Scope funktioniert sowohl mit `async with` als auch mit `with`.
+
+```python
+import asyncio
+
+import failproofai_sdk
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument()
+
+
+async def main():
+ async with failproofai_sdk.session():
+ await agent.run("...")
+
+
+asyncio.run(main())
+```
+
+
+ Ohne ein zusätzliches Argument an Ihrem LLM ist jede Token-Anzahl in Ihrem Trace null — `llama-index-llms-openai` fordert bei Streaming keine Nutzungsdaten an. Siehe [Token-Anzahlen](/de/start/integrations/llamaindex#token-counts).
+
+
+## Überprüfen, ob die Daten angekommen sind
+
+Führen Sie es einmal aus und öffnen Sie dann **Observe → Sessions**, um Ihre Umgebung auszuwählen. Ihr Durchlauf erscheint als rekonstruierter Trace.
+
+Falls nichts ankommt, überprüfen Sie die Verbindung des Rechners mit `failproofai config --status`.
+
+
+ Token-Anzahlen, was aufgezeichnet wird, Workflow-Schritte, Retrieval, Optionen und häufige Probleme.
+
\ No newline at end of file
diff --git a/docs/de/start/quickstarts/pydantic-ai.mdx b/docs/de/start/quickstarts/pydantic-ai.mdx
new file mode 100644
index 000000000..303f588b3
--- /dev/null
+++ b/docs/de/start/quickstarts/pydantic-ai.mdx
@@ -0,0 +1,42 @@
+---
+title: "Pydantic AI"
+description: "Installieren, instrumentieren und den ersten Trace anzeigen."
+icon: "/images/frameworks/pydantic-ai.svg"
+---
+
+Drei Schritte bis zu Ihrem ersten Pydantic AI Trace. Für Tools, Wiederholungsversuche, Streaming und Optionen siehe [die vollständige Anleitung](/de/start/integrations/pydantic-ai).
+
+## Installieren
+
+```bash
+pip install 'failproofai-sdk[pydantic-ai]'
+```
+
+## Instrumentieren
+
+```python
+import failproofai_sdk
+from pydantic_ai import Agent
+
+failproofai_sdk.configure(environment="production")
+failproofai_sdk.instrument() # before constructing any Agent
+
+agent = Agent("openai:gpt-4o-mini", system_prompt="Be terse.")
+
+with failproofai_sdk.session():
+ result = agent.run_sync("...")
+```
+
+
+ `instrument()` muss ausgeführt werden, **bevor** Sie einen `Agent` erstellen. Die Fähigkeit wird bei der Konstruktion angehängt, sodass ein zuvor erstellter Agent nichts aufzeichnet – ohne Fehlermeldung, da technisch nichts schiefgelaufen ist. Dies ist die häufigste Ursache für einen leeren Trace mit diesem Adapter. Besonders betroffen sind Agents auf Modulebene: Importieren Sie `failproofai_sdk` und rufen Sie `instrument()` auf, bevor Sie das Modul importieren, das die Agents erstellt.
+
+
+## Überprüfen, ob die Daten ankamen
+
+Führen Sie die Anwendung einmal aus und öffnen Sie dann **Observe → Sessions**, um Ihre Umgebung auszuwählen. Ihr Durchlauf erscheint als rekonstruierter Trace.
+
+Falls keine Daten ankommen, überprüfen Sie die Verbindung des Rechners mit `failproofai config --status`.
+
+
+ Was aufgezeichnet wird, Tools und Wiederholungsversuche, Streaming, Span-Benennung, Optionen und häufige Probleme.
+
\ No newline at end of file
diff --git a/docs/docs.json b/docs/docs.json
index 2f94a0d7a..37d3a58a8 100644
--- a/docs/docs.json
+++ b/docs/docs.json
@@ -241,7 +241,18 @@
"zh/start/first-audit",
"zh/start/first-policy",
"zh/start/setup",
- "zh/start/concepts"
+ "zh/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "zh/start/quickstarts/custom-agents",
+ "zh/start/quickstarts/langchain",
+ "zh/start/quickstarts/crewai",
+ "zh/start/quickstarts/llamaindex",
+ "zh/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -266,6 +277,16 @@
"zh/sessions/dashboards",
"zh/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "zh/start/integrations/custom-agents",
+ "zh/start/integrations/langchain",
+ "zh/start/integrations/crewai",
+ "zh/start/integrations/llamaindex",
+ "zh/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -352,11 +373,6 @@
"zh/reference/events-and-configuration",
"zh/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -379,7 +395,18 @@
"ja/start/first-audit",
"ja/start/first-policy",
"ja/start/setup",
- "ja/start/concepts"
+ "ja/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "ja/start/quickstarts/custom-agents",
+ "ja/start/quickstarts/langchain",
+ "ja/start/quickstarts/crewai",
+ "ja/start/quickstarts/llamaindex",
+ "ja/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -404,6 +431,16 @@
"ja/sessions/dashboards",
"ja/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "ja/start/integrations/custom-agents",
+ "ja/start/integrations/langchain",
+ "ja/start/integrations/crewai",
+ "ja/start/integrations/llamaindex",
+ "ja/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -490,11 +527,6 @@
"ja/reference/events-and-configuration",
"ja/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -517,7 +549,18 @@
"ko/start/first-audit",
"ko/start/first-policy",
"ko/start/setup",
- "ko/start/concepts"
+ "ko/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "ko/start/quickstarts/custom-agents",
+ "ko/start/quickstarts/langchain",
+ "ko/start/quickstarts/crewai",
+ "ko/start/quickstarts/llamaindex",
+ "ko/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -542,6 +585,16 @@
"ko/sessions/dashboards",
"ko/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "ko/start/integrations/custom-agents",
+ "ko/start/integrations/langchain",
+ "ko/start/integrations/crewai",
+ "ko/start/integrations/llamaindex",
+ "ko/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -628,11 +681,6 @@
"ko/reference/events-and-configuration",
"ko/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -655,7 +703,18 @@
"es/start/first-audit",
"es/start/first-policy",
"es/start/setup",
- "es/start/concepts"
+ "es/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "es/start/quickstarts/custom-agents",
+ "es/start/quickstarts/langchain",
+ "es/start/quickstarts/crewai",
+ "es/start/quickstarts/llamaindex",
+ "es/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -680,6 +739,16 @@
"es/sessions/dashboards",
"es/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "es/start/integrations/custom-agents",
+ "es/start/integrations/langchain",
+ "es/start/integrations/crewai",
+ "es/start/integrations/llamaindex",
+ "es/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -766,11 +835,6 @@
"es/reference/events-and-configuration",
"es/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -793,7 +857,18 @@
"pt-br/start/first-audit",
"pt-br/start/first-policy",
"pt-br/start/setup",
- "pt-br/start/concepts"
+ "pt-br/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "pt-br/start/quickstarts/custom-agents",
+ "pt-br/start/quickstarts/langchain",
+ "pt-br/start/quickstarts/crewai",
+ "pt-br/start/quickstarts/llamaindex",
+ "pt-br/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -818,6 +893,16 @@
"pt-br/sessions/dashboards",
"pt-br/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "pt-br/start/integrations/custom-agents",
+ "pt-br/start/integrations/langchain",
+ "pt-br/start/integrations/crewai",
+ "pt-br/start/integrations/llamaindex",
+ "pt-br/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -904,11 +989,6 @@
"pt-br/reference/events-and-configuration",
"pt-br/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -931,7 +1011,18 @@
"de/start/first-audit",
"de/start/first-policy",
"de/start/setup",
- "de/start/concepts"
+ "de/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "de/start/quickstarts/custom-agents",
+ "de/start/quickstarts/langchain",
+ "de/start/quickstarts/crewai",
+ "de/start/quickstarts/llamaindex",
+ "de/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -956,6 +1047,16 @@
"de/sessions/dashboards",
"de/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "de/start/integrations/custom-agents",
+ "de/start/integrations/langchain",
+ "de/start/integrations/crewai",
+ "de/start/integrations/llamaindex",
+ "de/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -1042,11 +1143,6 @@
"de/reference/events-and-configuration",
"de/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -1069,7 +1165,18 @@
"fr/start/first-audit",
"fr/start/first-policy",
"fr/start/setup",
- "fr/start/concepts"
+ "fr/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "fr/start/quickstarts/custom-agents",
+ "fr/start/quickstarts/langchain",
+ "fr/start/quickstarts/crewai",
+ "fr/start/quickstarts/llamaindex",
+ "fr/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -1094,6 +1201,16 @@
"fr/sessions/dashboards",
"fr/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "fr/start/integrations/custom-agents",
+ "fr/start/integrations/langchain",
+ "fr/start/integrations/crewai",
+ "fr/start/integrations/llamaindex",
+ "fr/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -1180,11 +1297,6 @@
"fr/reference/events-and-configuration",
"fr/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -1207,7 +1319,18 @@
"ru/start/first-audit",
"ru/start/first-policy",
"ru/start/setup",
- "ru/start/concepts"
+ "ru/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "ru/start/quickstarts/custom-agents",
+ "ru/start/quickstarts/langchain",
+ "ru/start/quickstarts/crewai",
+ "ru/start/quickstarts/llamaindex",
+ "ru/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -1232,6 +1355,16 @@
"ru/sessions/dashboards",
"ru/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "ru/start/integrations/custom-agents",
+ "ru/start/integrations/langchain",
+ "ru/start/integrations/crewai",
+ "ru/start/integrations/llamaindex",
+ "ru/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -1318,11 +1451,6 @@
"ru/reference/events-and-configuration",
"ru/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -1345,7 +1473,18 @@
"hi/start/first-audit",
"hi/start/first-policy",
"hi/start/setup",
- "hi/start/concepts"
+ "hi/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "hi/start/quickstarts/custom-agents",
+ "hi/start/quickstarts/langchain",
+ "hi/start/quickstarts/crewai",
+ "hi/start/quickstarts/llamaindex",
+ "hi/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -1370,6 +1509,16 @@
"hi/sessions/dashboards",
"hi/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "hi/start/integrations/custom-agents",
+ "hi/start/integrations/langchain",
+ "hi/start/integrations/crewai",
+ "hi/start/integrations/llamaindex",
+ "hi/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -1456,11 +1605,6 @@
"hi/reference/events-and-configuration",
"hi/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -1483,7 +1627,18 @@
"tr/start/first-audit",
"tr/start/first-policy",
"tr/start/setup",
- "tr/start/concepts"
+ "tr/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "tr/start/quickstarts/custom-agents",
+ "tr/start/quickstarts/langchain",
+ "tr/start/quickstarts/crewai",
+ "tr/start/quickstarts/llamaindex",
+ "tr/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -1508,6 +1663,16 @@
"tr/sessions/dashboards",
"tr/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "tr/start/integrations/custom-agents",
+ "tr/start/integrations/langchain",
+ "tr/start/integrations/crewai",
+ "tr/start/integrations/llamaindex",
+ "tr/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -1594,11 +1759,6 @@
"tr/reference/events-and-configuration",
"tr/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -1621,7 +1781,18 @@
"vi/start/first-audit",
"vi/start/first-policy",
"vi/start/setup",
- "vi/start/concepts"
+ "vi/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "vi/start/quickstarts/custom-agents",
+ "vi/start/quickstarts/langchain",
+ "vi/start/quickstarts/crewai",
+ "vi/start/quickstarts/llamaindex",
+ "vi/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -1646,6 +1817,16 @@
"vi/sessions/dashboards",
"vi/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "vi/start/integrations/custom-agents",
+ "vi/start/integrations/langchain",
+ "vi/start/integrations/crewai",
+ "vi/start/integrations/llamaindex",
+ "vi/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -1732,11 +1913,6 @@
"vi/reference/events-and-configuration",
"vi/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -1759,7 +1935,18 @@
"it/start/first-audit",
"it/start/first-policy",
"it/start/setup",
- "it/start/concepts"
+ "it/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "it/start/quickstarts/custom-agents",
+ "it/start/quickstarts/langchain",
+ "it/start/quickstarts/crewai",
+ "it/start/quickstarts/llamaindex",
+ "it/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -1784,6 +1971,16 @@
"it/sessions/dashboards",
"it/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "it/start/integrations/custom-agents",
+ "it/start/integrations/langchain",
+ "it/start/integrations/crewai",
+ "it/start/integrations/llamaindex",
+ "it/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -1870,11 +2067,6 @@
"it/reference/events-and-configuration",
"it/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -1897,7 +2089,18 @@
"ar/start/first-audit",
"ar/start/first-policy",
"ar/start/setup",
- "ar/start/concepts"
+ "ar/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "ar/start/quickstarts/custom-agents",
+ "ar/start/quickstarts/langchain",
+ "ar/start/quickstarts/crewai",
+ "ar/start/quickstarts/llamaindex",
+ "ar/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -1922,6 +2125,16 @@
"ar/sessions/dashboards",
"ar/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "ar/start/integrations/custom-agents",
+ "ar/start/integrations/langchain",
+ "ar/start/integrations/crewai",
+ "ar/start/integrations/llamaindex",
+ "ar/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -2008,11 +2221,6 @@
"ar/reference/events-and-configuration",
"ar/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
@@ -2035,7 +2243,18 @@
"he/start/first-audit",
"he/start/first-policy",
"he/start/setup",
- "he/start/concepts"
+ "he/start/concepts",
+ {
+ "group": "Starter templates",
+ "expanded": false,
+ "pages": [
+ "he/start/quickstarts/custom-agents",
+ "he/start/quickstarts/langchain",
+ "he/start/quickstarts/crewai",
+ "he/start/quickstarts/llamaindex",
+ "he/start/quickstarts/pydantic-ai"
+ ]
+ }
]
}
]
@@ -2060,6 +2279,16 @@
"he/sessions/dashboards",
"he/sessions/queries"
]
+ },
+ {
+ "group": "Plug in your agent",
+ "pages": [
+ "he/start/integrations/custom-agents",
+ "he/start/integrations/langchain",
+ "he/start/integrations/crewai",
+ "he/start/integrations/llamaindex",
+ "he/start/integrations/pydantic-ai"
+ ]
}
]
},
@@ -2146,11 +2375,6 @@
"he/reference/events-and-configuration",
"he/reference/troubleshooting"
]
- },
- {
- "group": "HTTP API",
- "expanded": false,
- "openapi": "reference/openapi.json"
}
]
}
diff --git a/docs/es/index.mdx b/docs/es/index.mdx
index cc99067a9..72b24fa4f 100644
--- a/docs/es/index.mdx
+++ b/docs/es/index.mdx
@@ -1,16 +1,16 @@
---
title: "Haz que tu agente sea infalible"
-description: "Observabilidad y control de cumplimiento para cada entorno en que se ejecutan tus agentes — CLIs de codificación, gateways de chat, asistentes autoalojados y tus propios agentes instrumentados."
+description: "Observabilidad y control para cada entorno en que se ejecutan tus agentes — CLIs de programación, gateways de chat, asistentes autoalojados y tus propios agentes instrumentados."
icon: "shield-check"
---
Failproof AI ayuda a los equipos a entender qué hicieron los agentes, encontrar dónde fallaron y desplegar salvaguardas antes de que el mismo comportamiento vuelva a ocurrir.
-Un **entorno de ejecución** (harness) es el contexto donde tu agente corre realmente. Failproof AI se conecta a 12 de ellos — CLIs de codificación como Claude Code y Codex, gateways de chat como Hermes, asistentes autoalojados como OpenClaw — y los mismos eventos, las mismas políticas y el mismo historial de sesiones se aplican a todos. Los agentes sin harness reportan a través del [SDK de Python](/es/reference/custom-agents), que los rastrea y audita; aplicar una política en ese caso requiere un hook en tu propio entorno de ejecución.
+Un **entorno de ejecución** (harness) es lo que contiene y ejecuta tu agente. Failproof AI se integra con 12 de ellos — CLIs de programación como Claude Code y Codex, gateways de chat como Hermes, asistentes autoalojados como OpenClaw — y los mismos eventos, las mismas políticas y el mismo historial de sesiones aplican a todos. Los agentes sin entorno de ejecución se comunican a través del [SDK de Python](/es/reference/custom-agents), que los rastrea y audita; aplicar una política en ese caso requiere un hook en tu propio runtime.
- Usa la skill para instrumentar tu proyecto, conectarlo y verificar que los registros del agente lleguen correctamente.
+ Usa la habilidad para instrumentar tu proyecto, conectarlo y verificar que los registros del agente lleguen correctamente.
Analiza, consulta, crea dashboards y ejecuta auditorías en lenguaje natural sobre los registros de tu agente.
@@ -18,24 +18,24 @@ Un **entorno de ejecución** (harness) es el contexto donde tu agente corre real
-
- Sigue las llamadas al modelo, herramientas, errores, entrada humana, latencia y decisiones de política en una sola sesión.
+
+ Sigue las llamadas al modelo, herramientas, errores, entradas del usuario, latencia y decisiones de política en una sola sesión.
-
- Audita un conjunto definido de sesiones, revisa hallazgos respaldados por evidencia y haz seguimiento de la corrección como issues.
+
+ Audita un conjunto definido de sesiones, revisa hallazgos respaldados por evidencia y realiza seguimiento de la remediación como incidencias.
- Convierte un fallo conocido en una política, observa su impacto y despliégala en toda tu flota.
+ Convierte un modo de fallo conocido en una política, observa su impacto y despliégala en toda tu flota.
-> **Sesión → Auditoría → Hallazgo → Issue → Política**
+> **Sesión → Auditoría → Hallazgo → Incidencia → Política**
> Rastrea lo que ocurrió, encuentra el fallo, gestiona la respuesta y previene el mismo comportamiento en ejecuciones futuras.
## Empieza aquí
-Si estás desplegando tu primer agente instrumentado, comienza con el [inicio rápido](/es/start/quickstart). Si los datos ya están llegando, abre [Sesiones](/es/sessions/overview) e inspecciona una ejecución real antes de configurar auditorías o políticas.
+Si estás desplegando tu primer agente instrumentado, comienza con la [guía de inicio rápido](/es/start/quickstart). Si los datos ya están llegando, abre [Sesiones](/es/sessions/overview) e inspecciona una ejecución real antes de configurar auditorías o políticas.
- Completa el flujo de trabajo de extremo a extremo desde la captura hasta una política desplegada de forma segura.
+ Completa el flujo de trabajo de extremo a extremo, desde la captura hasta el despliegue seguro de una política.
\ No newline at end of file
diff --git a/docs/es/policies/deploy.mdx b/docs/es/policies/deploy.mdx
index 96cdbbad8..d3df4df49 100644
--- a/docs/es/policies/deploy.mdx
+++ b/docs/es/policies/deploy.mdx
@@ -1,30 +1,34 @@
---
title: "Desplegar políticas"
-description: "Publica una versión de política revisada en las máquinas objetivo."
+description: "Distribuye una versión de política revisada a las máquinas previstas."
icon: "cloud-upload"
---
-Un despliegue conecta una o más versiones de política con un conjunto objetivo de máquinas registradas.
+Un despliegue conecta una o más versiones de política a un conjunto de máquinas enroladas.
## Aplicar un despliegue
- 1. Ve a **Admin → enforcement**, localiza la máquina y despliega su fila.
- 2. Selecciona **edit**, añade la versión de política revisada y elige el efecto **observe** o uno de aplicación forzosa.
- 3. Aplica el cambio, espera al próximo check-in de la máquina y confirma su estado de despliegue y cobertura.
+ 1. Ve a **Admin → enforcement**, busca la máquina y expande su fila.
+ 2. Selecciona **edit**, añade la versión de política revisada y elige el efecto **observe** o de aplicación forzada.
+ 3. Aplica el cambio, luego espera al próximo check-in de la máquina y confirma su estado de despliegue y cobertura.
4. Ve a **Observe → policy** para inspeccionar las decisiones en tiempo real.
- 
+ 
- Los endpoints de despliegue en la nube no están expuestos deliberadamente como comandos ordinarios de `fp`. Verifica la máquina localmente y luego despliega a través del panel de control:
+ Despliega desde la CLI con `fp fleet`. Revisa el conjunto resultante antes de aplicarlo — `deploy` imprime el plan completo y solicita confirmación **únicamente en una terminal interactiva sin `--json`**. Con `--json`, con `--yes`, o con stdin redirigido (un paso de CI, un script, un agente que ejecuta comandos) se aplica de inmediato sin plan ni confirmación, por lo que ejecuta `fp fleet show ` primero si deseas revisarlo:
```bash
- failproofai config --status
+ fp fleet list
+ fp fleet show
+ fp fleet deploy --add no-force-push
```
- Usa `fp sessions --env production --since 24h` y `fp events --event-type hook_completed` tras el despliegue para verificar que la actividad llega a Cloud.
+ `fp fleet diff ` muestra la intención frente a la entrega (una máquina aparece como `behind` hasta su próximo sondeo), `fp fleet history ` lista las generaciones, y `fp fleet rollback ` restaura una de ellas — rechaza la operación si esa generación hace referencia a una política que ha sido deshabilitada o eliminada.
+
+ Comprueba la propia máquina con `failproofai config --status`, y usa `fp sessions --env production --since 24h` y `fp events --event-type hook_completed` tras el despliegue para verificar que la actividad llega a Cloud.
@@ -33,15 +37,15 @@ Un despliegue conecta una o más versiones de política con un conjunto objetivo
Despliega una versión revisada, no un borrador mutable, comenzando con una máquina fuera de producción o un grupo pequeño cuyas sesiones puedas inspeccionar.
- Revisa las coincidencias, razones, herramientas afectadas y falsos positivos sin bloquear el trabajo.
+ Revisa coincidencias, motivos, herramientas afectadas y falsos positivos sin bloquear el trabajo.
-
- Promociona tras comprobar que las coincidencias observadas separan las acciones inseguras de las válidas, y confirma que cada máquina prevista ha recibido el despliegue y está registrando decisiones.
+
+ Promueve tras confirmar que las coincidencias observadas distinguen acciones inseguras de las válidas; luego verifica que cada máquina prevista ha obtenido el despliegue y está reportando decisiones.
-Las máquinas necesitan la capacidad `policies:pull`. El reporte de eventos está controlado de forma independiente por `events:add`; verifica ambos cuando esperes análisis y aplicación de políticas en Cloud.
+Las máquinas necesitan la capacidad `policies:pull`. El reporte de eventos está controlado por separado mediante `events:add`; verifica ambos cuando esperes análisis y aplicación forzada en Cloud.
- La gestión de la aplicación de políticas es un flujo de trabajo administrativo de Cloud. No trates las rutas de aplicación exclusivas de root como endpoints ordinarios de la API `/v1` para clientes.
+ La gestión de enforcement es un flujo de trabajo administrativo de Cloud. No trates las rutas de enforcement exclusivas de root como endpoints de API `/v1` ordinarios para clientes.
\ No newline at end of file
diff --git a/docs/es/policies/editor.mdx b/docs/es/policies/editor.mdx
index 647321d27..750c16530 100644
--- a/docs/es/policies/editor.mdx
+++ b/docs/es/policies/editor.mdx
@@ -4,44 +4,46 @@ description: "Crea y revisa políticas versionadas a partir de un modo de fallo
icon: "file-pen-line"
---
-Usa el editor de políticas para convertir un hallazgo o problema en una regla desplegable. Mantén la autoría separada del despliegue para que un borrador no pueda modificar silenciosamente el comportamiento en producción.
+Usa el editor de políticas para convertir un hallazgo o incidencia en una regla desplegable. Mantén la autoría separada del despliegue para que un borrador no pueda modificar silenciosamente el comportamiento en producción.
-Cuando un problema tiene un patrón de acción repetible, ábrelo en **Analyze → issues** y selecciona **generate policy**. Failproof AI primero explica si una política puede expresar el problema y luego traslada la intención revisada y el contexto del hallazgo al editor. El código fuente generado permanece como borrador hasta que lo publiques.
+Cuando una incidencia tiene un patrón de acción repetible, ábrela en **Analyze → issues** y selecciona **generate policy**. Failproof AI primero explica si una política puede expresar el problema y luego traslada la intención revisada y el contexto del hallazgo al editor. El código fuente generado permanece como borrador hasta que lo publiques.
## Publicar una versión de política
1. Ve a **Admin → policy editor** y, en **compose**, describe el modo de fallo o pega el código fuente de la política en JavaScript.
- 2. Valida el código fuente y corrige todos los errores reportados.
+ 2. Valida el código fuente y corrige cada error reportado.
3. Introduce la identidad de la política y publícala; luego usa **library** para comparar o deshabilitar versiones.
- 4. Selecciona **enforcement** cuando la versión esté lista para un despliegue automático.
+ 4. Selecciona **enforcement** cuando la versión esté lista para un despliegue en máquinas.

- La CLI en la nube no publica versiones de políticas. Valida el código fuente localmente antes de copiarlo en el editor:
+ Publica desde la CLI con `fp policies publish`. Esto genera una **nueva versión** y nunca edita una existente en su lugar, además comprueba la sintaxis del código con node antes de enviarlo — los pasos posteriores no lo hacen, por lo que un error de sintaxis se manifestaría en la máquina en el momento de la aplicación:
```bash
- failproofai policies --install --custom ./checkout.policies.ts \
- --cli claude --scope project
+ fp policies test ./checkout.policy.mjs --command "git push --force" --expect deny
+ fp policies publish checkout-guard ./checkout.policy.mjs --description "Block force-push"
```
- Publica la versión revisada desde **Admin → policy editor**.
+ Publicar no despliega nada: una nueva versión queda sin usar hasta que `fp fleet deploy` la instala en una máquina. `fp policies compose ""` redacta el código con el asistente Cloud y lo imprime para revisión en lugar de publicarlo.
+
+ Para instalar una política directamente en una CLI de agente local (no en Cloud), usa `failproofai policies --install --custom ./checkout.policies.ts --cli claude --scope project`.
## Lista de verificación para la autoría
1. Nombra el modo de fallo en lenguaje operacional.
-2. Selecciona los eventos de hook y las herramientas que contengan evidencia suficiente para decidir.
-3. Escribe la condición más restrictiva que coincida con el comportamiento inseguro.
-4. Devuelve una razón que indique al agente o al operador qué hacer a continuación.
-5. Añade ejemplos que deban coincidir y ejemplos que deban permanecer permitidos.
+2. Selecciona los eventos de hook y las herramientas que contengan suficiente evidencia para decidir.
+3. Escribe la condición más específica posible que identifique el comportamiento inseguro.
+4. Devuelve un motivo que indique al agente u operador qué hacer a continuación.
+5. Añade ejemplos que deben coincidir y ejemplos que deben seguir siendo permitidos.
6. Guarda una nueva versión y solicita revisión.
-Usa `instruct` cuando el agente pueda corregir su curso de forma segura. Usa `deny` cuando permitir la acción supondría un riesgo inaceptable o irreversible.
+Usa `instruct` cuando el agente pueda corregir el rumbo de forma segura. Usa `deny` cuando permitir la acción suponga un riesgo inaceptable o irreversible.
- Las versiones de políticas son entradas de despliegue inmutables. Editar un borrador crea una nueva versión; no debe reescribir la versión ya asignada a las máquinas.
+ Las versiones de política son entradas de despliegue inmutables. Editar un borrador crea una nueva versión; no debe reescribir la versión ya asignada a las máquinas.
\ No newline at end of file
diff --git a/docs/es/reference/cloud-cli.mdx b/docs/es/reference/cloud-cli.mdx
index 56642cb40..ec6b3d115 100644
--- a/docs/es/reference/cloud-cli.mdx
+++ b/docs/es/reference/cloud-cli.mdx
@@ -4,7 +4,7 @@ description: "Referencia completa para consultar y administrar Failproof AI Clou
icon: "cloud-cog"
---
-Usa `fp` para inspeccionar la telemetría de Cloud y gestionar auditorías, hallazgos, incidencias, alertas, claves, usuarios, consultas y configuración. Usa [`failproofai`](/es/reference/failproof-cli) para hooks locales, políticas, captura e inscripción de máquinas.
+Usa `fp` para inspeccionar la telemetría de Cloud, gestionar la aplicación de políticas gestionada en la nube (políticas, despliegues de flota, decisiones de guardrail), así como auditorías, hallazgos, incidencias, alertas, claves, usuarios, consultas y configuración. Utiliza [`failproofai`](/es/reference/failproof-cli) para hooks locales, políticas, captura e inscripción de máquinas.
Instala el Cloud CLI publicado como herramienta aislada:
@@ -34,7 +34,7 @@ fp --json sessions --since 24h
Ejecuta `fp COMMAND --help` o `fp COMMAND SUBCOMMAND --help` para obtener ayuda en la terminal.
-## Comandos del CLI
+## Comandos de la CLI
### Autenticación
@@ -43,11 +43,11 @@ Ejecuta `fp COMMAND --help` o `fp COMMAND SUBCOMMAND --help` para obtener ayuda
| `fp login` | Inicia sesión con un código de un solo uso enviado por correo y selecciona una organización. | `--email`, `-e`; `--org`; `--force` |
| `fp logout` | Revoca y elimina la sesión de usuario guardada. | — |
| `fp whoami` | Muestra la identidad actual, el modo de autenticación, la organización y los permisos. | — |
-| `fp version` | Muestra la versión instalada del CLI. | — |
-| `fp help` | Muestra la ayuda de comandos de nivel superior. | — |
+| `fp version` | Muestra la versión instalada de la CLI. | — |
+| `fp help` | Muestra la ayuda de los comandos de nivel superior. | — |
```bash
-fp login --email tu@ejemplo.com --org equipo-de-fiabilidad
+fp login --email tu@ejemplo.com --org reliability-team
fp whoami
```
@@ -61,26 +61,30 @@ Lista eventos individuales de agentes. El feed ligero predeterminado excluye los
| Opción | Descripción |
| --- | --- |
-| `--limit`, `-n ` | Máximo total de filas. Predeterminado: `50`. |
+| `--limit`, `-n ` | Máximo de filas totales. Por defecto: `50`. |
| `--since ` | `all`, `15m`, `1h`, `6h`, `24h` o `7d`. |
-| `--from ` / `--to ` | Rango UTC ISO 8601; reemplaza `--since`. |
-| `--env ` | Filtro de entorno; repite o separa valores con comas. |
-| `--event-type ` | Filtro de tipo de evento; repite o separa valores con comas. |
-| `--agent-id ` | Filtro de agente; repite o separa valores con comas. |
-| `--session-id ` | Filtro de sesión; repite o separa valores con comas. |
+| `--from ` / `--to ` | Rango UTC en ISO 8601; reemplaza `--since`. |
+| `--env ` | Filtro de entorno; repite o separa por comas. |
+| `--event-type ` | Filtro de tipo de evento; repite o separa por comas. |
+| `--agent-id ` | Filtro de agente; repite o separa por comas. |
+| `--session-id ` | Filtro de sesión; repite o separa por comas. |
| `--search ` | Búsqueda de texto en el payload; repetible, coincide con cualquier término. |
-| `--order asc\|desc` | Orden temporal. Predeterminado: más reciente primero. |
-| `--all` | Paginación automática hasta `--limit`. |
+| `--order asc\|desc` | Orden temporal. Por defecto: más reciente primero. |
+| `--all` | Pagina automáticamente hasta `--limit`. |
| `--cursor ` | Reanuda desde un cursor opaco. |
| `--page-size ` | Filas por solicitud con `--all`; máximo `200`. |
-| `--full` | Incluye payloads sin procesar a través del endpoint de eventos más pesado. |
+| `--full` | Incluye payloads sin procesar a través del endpoint de eventos más completo. |
| `--fields ` | Devuelve solo los campos seleccionados; solicitar `payload` activa el modo completo. |
```bash
-fp events --session-id --order asc --all
-fp --json events --full --session-id --all
+fp events --session-id --order asc --all --limit 10000
+fp --json events --full --session-id --all --limit 10000
```
+
+ `--all` pagina **hasta `--limit`**, que por defecto es **50** — así que `--all` por sí solo se detiene en 50 filas. Cuando se detiene antes, la respuesta incluye un `next_cursor` para reanudar; `"next_cursor": null` indica que el feed realmente se ha agotado.
+
+
### Sesiones
```text
@@ -89,19 +93,19 @@ fp sessions [OPTIONS]
| Opción | Descripción |
| --- | --- |
-| `--limit`, `-n ` | Máximo total de filas. Predeterminado: `50`. |
+| `--limit`, `-n ` | Máximo de filas totales. Por defecto: `50`. |
| `--since ` | `all`, `15m`, `1h`, `6h`, `24h` o `7d`. |
-| `--from ` / `--to ` | Rango UTC ISO 8601; reemplaza `--since`. |
-| `--env ` | Filtro de entorno; repite o separa valores con comas. |
-| `--status ` | `done`, `error` o `timeout`; repite o separa valores con comas. |
-| `--agent-id ` | Coincide con sesiones que involucran cualquier agente seleccionado. |
-| `--session-id ` | Filtro de sesión; repite o separa valores con comas. |
-| `--all` | Paginación automática hasta `--limit`. |
+| `--from ` / `--to ` | Rango UTC en ISO 8601; reemplaza `--since`. |
+| `--env ` | Filtro de entorno; repite o separa por comas. |
+| `--status ` | `done`, `error` o `timeout`; repite o separa por comas. |
+| `--agent-id ` | Coincide con sesiones que involucran al agente seleccionado. |
+| `--session-id ` | Filtro de sesión; repite o separa por comas. |
+| `--all` | Pagina automáticamente hasta `--limit`. |
| `--cursor ` | Reanuda desde un cursor opaco. |
| `--page-size ` | Filas por solicitud con `--all`; máximo `200`. |
| `--fields ` | Devuelve solo los campos seleccionados. |
| `--full-ids` | No acorta los IDs de sesión en la salida de la terminal. |
-| `--agents` | Expande el listado de agentes para sesiones multiagente. |
+| `--agents` | Expande el registro de agentes para sesiones multiagente. |
### Evaluaciones
@@ -112,11 +116,11 @@ fp evals [OPTIONS]
| Opción | Descripción |
| --- | --- |
| `--aggregate` | Muestra totales y estadísticas por puntuación en lugar de evaluaciones individuales. |
-| `--limit`, `-n ` | Máximo de filas en el listado. Predeterminado: `50`. |
+| `--limit`, `-n ` | Máximo de filas en la lista. Por defecto: `50`. |
| `--since`, `--from`, `--to` | Selecciona el rango de tiempo. |
-| `--env`, `--status`, `--agent-id`, `--session-id` | Restringe a un valor exacto por filtro. |
-| `--score KEY:MIN..MAX` | Rango de puntuación; repetible y todos los rangos deben coincidir. |
-| `--all`, `--cursor`, `--page-size` | Controla la paginación del listado. |
+| `--env`, `--status`, `--agent-id`, `--session-id` | Filtra a un único valor exacto por filtro. |
+| `--score KEY:MIN..MAX` | Rango de puntuación; repetible, todos los rangos deben coincidir. |
+| `--all`, `--cursor`, `--page-size` | Controla la paginación de la lista. |
| `--fields ` | Devuelve solo los campos seleccionados. |
| `--full-ids` | Muestra los IDs de sesión completos. |
| `--scores-full` | Muestra todas las puntuaciones en la salida de la terminal. |
@@ -130,12 +134,12 @@ fp errors [OPTIONS]
| Opción | Descripción |
| --- | --- |
| `--aggregate` | Resume los errores coincidentes en lugar de listar filas. |
-| `--limit`, `-n ` | Máximo de filas en el listado. Predeterminado: `50`. |
+| `--limit`, `-n ` | Máximo de filas en la lista. Por defecto: `50`. |
| `--since`, `--from`, `--to` | Selecciona el rango de tiempo. |
-| `--env`, `--error-type`, `--event-type`, `--agent-id`, `--session-id` | Restringe la población de errores. |
+| `--env`, `--error-type`, `--event-type`, `--agent-id`, `--session-id` | Filtra la población de errores. |
| `--search ` | Busca texto en el payload; repetible. |
| `--order asc\|desc` | Orden temporal. |
-| `--all`, `--cursor`, `--page-size` | Controla la paginación del listado. |
+| `--all`, `--cursor`, `--page-size` | Controla la paginación de la lista. |
| `--fields ` | Devuelve solo los campos seleccionados. |
| `--full-ids` | Muestra los IDs de sesión completos. |
@@ -151,7 +155,7 @@ fp errors [OPTIONS]
| `fp list models` | Lista los nombres de modelos. |
| `fp list hooks` | Lista los nombres de hooks. |
| `fp list tools` | Lista los nombres de herramientas. |
-| `fp list error_types` | Lista los tipos de errores. |
+| `fp list error_types` | Lista los tipos de error. |
### Organizaciones
@@ -170,10 +174,10 @@ fp errors [OPTIONS]
| `fp keys show NAME` | Muestra una clave y sus permisos. | — |
| `fp keys create NAME` | Crea una clave y revela su secreto una sola vez. | `--permission-set`; `--add`; `--remove` |
| `fp keys update NAME` | Reemplaza el conjunto de permisos o ajusta los permisos. | `--permission-set`; `--add`; `--remove`; `--yes`, `-y` |
-| `fp keys regenerate NAME` | Rota el secreto y revela el reemplazo una sola vez. | `--yes`, `-y` |
-| `fp keys disable NAME` | Revoca una clave de forma permanente. | `--yes`, `-y` |
+| `fp keys regenerate NAME` | Rota el secreto y revela el de reemplazo una sola vez. | `--yes`, `-y` |
+| `fp keys disable NAME` | Revoca permanentemente una clave. | `--yes`, `-y` |
-Los tokens de permiso usan el formato `recurso:acción`, por ejemplo `events:add`. Repite `--add`, separa los tokens con comas, o usa acciones con punto como `events:read.add`.
+Los tokens de permiso usan el formato `resource:action`, por ejemplo `events:add`. Repite `--add`, separa los tokens por comas, o usa acciones con punto como `events:read.add`.
### Consultas
@@ -184,7 +188,7 @@ Los tokens de permiso usan el formato `recurso:acción`, por ejemplo `events:add
| `fp query create NAME` | Guarda una consulta. | `--sql `; `--description` |
| `fp query update NAME` | Actualiza o renombra una consulta. | `--name`; `--sql`; `--description`; `--yes`, `-y` |
| `fp query delete NAME` | Elimina una consulta guardada. | `--yes`, `-y` |
-| `fp query run [NAME]` | Ejecuta una consulta guardada o SQL ad-hoc. | `--sql`; `--limit`; `--all`; `--arg`, `--param` |
+| `fp query run [NAME]` | Ejecuta una consulta guardada o SQL ad hoc. | `--sql`; `--limit`; `--all`; `--arg`, `--param` |
| `fp query schema [TABLE]` | Lista las tablas consultables o inspecciona una tabla. | — |
### Usuarios
@@ -193,18 +197,18 @@ Los tokens de permiso usan el formato `recurso:acción`, por ejemplo `events:add
| --- | --- | --- |
| `fp users list` | Lista los miembros de la organización. | `--active-only`; `--show-id` |
| `fp users show EMAIL` | Muestra un miembro y sus permisos. | — |
-| `fp users create EMAIL` | Agrega un miembro. | `--permission-set`; `--add`; `--remove` |
+| `fp users create EMAIL` | Añade un miembro. | `--permission-set`; `--add`; `--remove` |
| `fp users update EMAIL` | Modifica los permisos de un miembro. | `--permission-set`; `--add`; `--remove`; `--yes`, `-y` |
| `fp users disable EMAIL` | Deshabilita el inicio de sesión. | `--yes`, `-y` |
-| `fp users enable EMAIL` | Rehabilita el inicio de sesión. | `--yes`, `-y` |
+| `fp users enable EMAIL` | Vuelve a habilitar el inicio de sesión. | `--yes`, `-y` |
### Configuración
| Comando | Propósito | Opciones |
| --- | --- | --- |
-| `fp settings list` | Lista los ajustes de la organización y sus valores actuales. | — |
+| `fp settings list` | Lista la configuración de la organización y los valores actuales. | — |
| `fp settings schema` | Muestra los valores aceptados y sus descripciones. | — |
-| `fp settings set KEY` | Modifica un ajuste existente. | exactamente uno de `--value`, `--json-value`, `--file`; `--yes`, `-y` opcional |
+| `fp settings set KEY` | Modifica una configuración existente. | exactamente una de `--value`, `--json-value`, `--file`; opcional `--yes`, `-y` |
### Alertas
@@ -217,7 +221,7 @@ Los tokens de permiso usan el formato `recurso:acción`, por ejemplo `events:add
| `fp alerts delete NAME` | Elimina una alerta. | `--yes`, `-y` |
| `fp alerts test NAME` | Envía una notificación de prueba. | `--channels`; `--yes`, `-y` |
-Las severidades de alerta son `info`, `warning` y `critical`. Los tipos de disparador son `metric_threshold`, `custom_sql`, `evaluation_score`, `eval_compound` y `per_event`. Los intervalos de evaluación deben estar entre 30 y 86.400 segundos.
+Las severidades de alerta son `info`, `warning` y `critical`. Los tipos de trigger son `metric_threshold`, `custom_sql`, `evaluation_score`, `eval_compound` y `per_event`. Los intervalos de evaluación deben estar entre 30 y 86 400 segundos.
### Auditorías
@@ -225,24 +229,24 @@ Las severidades de alerta son `info`, `warning` y `critical`. Los tipos de dispa
| --- | --- | --- |
| `fp audits list` | Lista las auditorías. | `--enabled-only`; `--show-id` |
| `fp audits show NAME` | Muestra una definición de auditoría y su estado. | — |
-| `fp audits create NAME` | Crea una auditoría y encola inmediatamente su primera ejecución. | Ver [opciones de creación](#audit-create-options). |
-| `fp audits edit NAME` | Reemplaza los ajustes de la auditoría conservando los valores no especificados. | opciones de definición de creación; `--name`; `--yes`, `-y` |
+| `fp audits create NAME` | Crea una auditoría y pone en cola su primera ejecución de inmediato. | Consulta las [opciones de creación](#audit-create-options). |
+| `fp audits edit NAME` | Reemplaza la configuración de auditoría manteniendo los valores no especificados. | opciones de definición de creación; `--name`; `--yes`, `-y` |
| `fp audits delete NAME` | Elimina una auditoría, sus hallazgos y el historial de ejecuciones. | `--yes`, `-y` |
-| `fp audits run NAME` | Encola una ejecución manual. | — |
+| `fp audits run NAME` | Pone en cola una ejecución manual. | — |
| `fp audits runs NAME` | Lista el historial de ejecuciones. | `--limit`, `-n`; `--show-id` |
-| `fp audits context-show NAME` | Muestra el resumen y el estado de obtención de las URLs de referencia. | — |
-| `fp audits context-set NAME` | Cambia el resumen o las URLs de referencia. | `--text`; `--text-file`; `--url`; `--clear-urls` |
+| `fp audits context-show NAME` | Muestra el resumen y el estado de obtención de la URL de referencia. | — |
+| `fp audits context-set NAME` | Modifica el resumen o las URLs de referencia. | `--text`; `--text-file`; `--url`; `--clear-urls` |
| `fp audits context-refresh NAME` | Vuelve a obtener las URLs de referencia. | — |
| `fp audits findings` | Lista los hallazgos. | `--audit`; `--run-id`; `--status`; `--limit`, `-n`; `--offset`; `--show-id` |
| `fp audits finding FINDING_ID` | Muestra un hallazgo y su evidencia. | — |
-| `fp audits ack FINDING_ID` | Confirma la recepción de un hallazgo. | `--reason` |
+| `fp audits ack FINDING_ID` | Confirma un hallazgo. | `--reason` |
| `fp audits mute FINDING_ID` | Suprime un patrón recurrente. | `--reason`; `--yes`, `-y` |
| `fp audits dismiss FINDING_ID` | Marca un patrón como no accionable y lo suprime. | `--reason`; `--yes`, `-y` |
| `fp audits resolve FINDING_ID` | Marca un hallazgo como corregido sin supresión futura. | `--yes`, `-y` |
| `fp audits reopen FINDING_ID` | Devuelve un hallazgo a la cola activa y elimina la supresión. | — |
-| `fp audits assign FINDING_ID` | Asigna el propietario del hallazgo. | `--to ` requerido |
+| `fp audits assign FINDING_ID` | Establece el propietario del hallazgo. | `--to ` requerido |
-#### Opciones de creación de auditoría
+#### Opciones de creación de auditorías
```bash
fp audits create checkout-reliability \
@@ -258,26 +262,26 @@ fp audits create checkout-reliability \
| Opción | Descripción |
| --- | --- |
| `--file ` | Basa la definición en JSON, o usa `-` para stdin. Las flags explícitas reemplazan los valores del archivo. |
-| `--description ` | Indica la pregunta de fallo o el propósito. |
-| `--enabled` / `--disabled` | Inicia la programación activada o desactivada. Predeterminado: habilitado. |
-| `--schedule-interval-secs ` | `3600`–`604800`. Predeterminado: `86400`. |
-| `--schedule-anchor ` | Fase UTC fija en formato ISO 8601. Predeterminado: próximas 09:00 UTC. |
-| `--window-mode since_last\|fixed` | Continúa después de la última ventana completamente analizada o inspecciona repetidamente una ventana deslizante. Predeterminado: `since_last`. |
-| `--lookback-window-secs ` | `3600`–`7776000`. Predeterminado: `604800`. |
-| `--scope ''` | Filtra por `environments`, `agent_ids` u otros campos de alcance compatibles. |
-| `--ignore-error-type ` | Excluye tipos de errores; repite o separa con comas. |
-| `--llm` / `--no-llm` | Activa o desactiva el análisis agéntico. Predeterminado: habilitado. |
-| `--top-k ` | Conserva entre `1` y `500` hallazgos. Predeterminado: `50`. |
-| `--sensitivity low\|medium\|high` | Establece la sensibilidad de reporte. Predeterminado: `medium`. |
+| `--description ` | Describe la pregunta de fallo o el propósito. |
+| `--enabled` / `--disabled` | Inicia la programación activada o desactivada. Por defecto: activada. |
+| `--schedule-interval-secs ` | `3600`–`604800`. Por defecto: `86400`. |
+| `--schedule-anchor ` | Fase UTC fija en formato ISO 8601. Por defecto: próximas 09:00 UTC. |
+| `--window-mode since_last\|fixed` | Continúa tras la última ventana completamente analizada o inspecciona repetidamente una ventana variable. Por defecto: `since_last`. |
+| `--lookback-window-secs ` | `3600`–`7776000`. Por defecto: `604800`. |
+| `--scope ''` | Filtra por `environments`, `agent_ids` u otros campos de alcance admitidos. |
+| `--ignore-error-type ` | Excluye tipos de error; repite o separa por comas. |
+| `--llm` / `--no-llm` | Activa o desactiva el análisis agéntico. Por defecto: activado. |
+| `--top-k ` | Retiene `1`–`500` hallazgos. Por defecto: `50`. |
+| `--sensitivity low\|medium\|high` | Establece la sensibilidad de reporte. Por defecto: `medium`. |
| `--channels ''` | Array de canales de notificación. |
-| `--text ` | Resumen en línea, máximo 8.192 caracteres. |
+| `--text ` | Resumen en línea, máximo 8 192 caracteres. |
| `--text-file ` | Lee el resumen desde un archivo; mutuamente exclusivo con `--text`. |
-| `--url ` | Agrega una referencia HTTPS pública; repite hasta cinco veces. |
+| `--url ` | Añade una referencia HTTPS pública; repite hasta cinco veces. |
-Incluye el contexto durante la creación cuando la primera ejecución lo necesite. La creación confirma la definición y el contexto juntos antes de que comience la ejecución en cola.
+Incluye el contexto durante la creación cuando la primera ejecución lo necesita. La creación confirma la definición y el contexto juntos antes de que comience la ejecución en cola.
- `fp audits run` es asíncrono. Sondea `fp audits runs NAME` hasta que la última ejecución tenga éxito o falle antes de leer sus hallazgos.
+ `fp audits run` es asíncrono. Consulta `fp audits runs NAME` hasta que la última ejecución tenga éxito o falle antes de leer sus hallazgos.
### Incidencias
@@ -285,67 +289,111 @@ Incluye el contexto durante la creación cuando la primera ejecución lo necesit
| Comando | Propósito | Opciones |
| --- | --- | --- |
| `fp issues list` | Lista las incidencias. | `--state`; `--alert-id`; `--limit`, `-n`; `--show-id` |
-| `fp issues count` | Cuenta las incidencias abiertas o los estados de incidencia seleccionados. | `--state` |
+| `fp issues count` | Cuenta las incidencias abiertas o en los estados seleccionados. | `--state` |
| `fp issues show INCIDENT_ID` | Muestra los detalles, comentarios, suscriptores y actividad de una incidencia. | — |
| `fp issues open` | Abre una incidencia manual o vinculada a una alerta. | `--summary` requerido; `--title`, `--alert-id`, `--severity` opcionales |
-| `fp issues ack INCIDENT_ID` | Confirma la recepción de una incidencia. | — |
+| `fp issues ack INCIDENT_ID` | Confirma una incidencia. | — |
| `fp issues assign INCIDENT_ID` | Reemplaza los asignados; omite la opción para eliminarlos. | `--assignee` repetible |
| `fp issues resolve INCIDENT_ID` | Resuelve una incidencia. | `--yes`, `-y` |
| `fp issues comment-list INCIDENT_ID` | Lista los comentarios. | — |
-| `fp issues comment-add INCIDENT_ID` | Agrega un comentario. | exactamente uno de `--body`, `--file` |
+| `fp issues comment-add INCIDENT_ID` | Añade un comentario. | exactamente una de `--body`, `--file` |
| `fp issues comment-delete INCIDENT_ID COMMENT_ID` | Elimina un comentario. | `--yes`, `-y` |
| `fp issues subscribers INCIDENT_ID` | Lista los suscriptores. | — |
-| `fp issues subscribe INCIDENT_ID` | Te suscribe a ti o a otro operador. | `--email` |
+| `fp issues subscribe INCIDENT_ID` | Te suscribe a ti u otro operador. | `--email` |
| `fp issues unsubscribe INCIDENT_ID` | Elimina una suscripción. | `--email` |
-Los estados válidos de incidencia son `firing`, `acknowledged` y `resolved`. Las severidades de incidencias independientes son `info`, `warning` y `critical`.
+Los estados de incidencia válidos son `firing`, `acknowledged` y `resolved`. Las severidades de incidencia independiente son `info`, `warning` y `critical`.
-### Asistente en la nube
+### Asistente cloud
| Comando | Propósito | Opciones |
| --- | --- | --- |
-| `fp agent health` | Verifica la disponibilidad y configuración del asistente. | — |
+| `fp agent health` | Comprueba la disponibilidad y la configuración del asistente. | — |
| `fp agent models` | Lista los modelos de asistente disponibles. | — |
| `fp agent chats` | Lista los chats guardados. | — |
-| `fp agent ask [MESSAGE]` | Inicia o continúa un chat; lee stdin cuando se omite el mensaje. | `--chat`; `--model`; `--page-context` |
+| `fp agent ask [MESSAGE]` | Inicia o continúa un chat; lee stdin si se omite el mensaje. | `--chat`; `--model`; `--page-context` |
| `fp agent show CHAT_ID` | Muestra una conversación guardada. | — |
| `fp agent rename CHAT_ID` | Renombra una conversación. | `--title` requerido |
| `fp agent delete CHAT_ID` | Elimina una conversación. | `--yes`, `-y` |
+### Políticas
+
+Versiones de políticas gestionadas en la nube. **Solo para sesión** — todos los comandos aquí salen con código `2` bajo una clave de API, antes de cualquier solicitud, porque estas son rutas de escritura exclusivas de root deliberadamente ausentes de `/v1`.
+
+| Comando | Propósito | Opciones |
+| --- | --- | --- |
+| `fp policies list` | Lista las versiones de políticas. | `--json` |
+| `fp policies show POLICY_ID` | Muestra una política con su código fuente. | — |
+| `fp policies publish NAME PATH` | Crea una versión a partir de un archivo `.mjs` local. | `--description`; `--no-verify` |
+| `fp policies enable POLICY_ID` | La añade de nuevo a cada despliegue del que fue eliminada, creando una nueva generación en cada uno. | `--yes`, `-y` |
+| `fp policies disable POLICY_ID` | La elimina de cada despliegue que la lleva, creando una nueva generación en cada uno. | `--yes`, `-y` |
+| `fp policies delete POLICY_ID` | Elimina una versión de política. | `--yes`, `-y` |
+| `fp policies test PATH` | Ejecuta una política localmente contra un contexto sintético. Aplica el filtro `match` de cada política, por lo que una que no cubre el evento/herramienta dado se reporta como `skipped` en lugar de ejecutarse. | `--event`; `--tool`; `--command`; `--file-path`; `--expect` |
+| `fp policies compose PROMPT` | Redacta una política con el asistente. Requiere `policies:write`. | — |
+
+### Flota
+
+Qué máquinas ejecutan qué políticas. **Solo para sesión**, por la misma razón que las anteriores.
+
+| Comando | Propósito | Opciones |
+| --- | --- | --- |
+| `fp fleet list` | Lista las máquinas inscritas y su generación de despliegue. | — |
+| `fp fleet show MACHINE_ID` | El conjunto de políticas que ejecuta actualmente una máquina. | — |
+| `fp fleet deploy MACHINE_ID` | **Reemplaza el conjunto completo de políticas de la máquina.** Muestra el plan y solicita confirmación solo en una terminal interactiva sin `--json`. | `--add`; `--remove`; `--set`; `--create`; `--yes`, `-y` |
+| `fp fleet diff MACHINE_ID` | Compara una máquina con otro despliegue. | — |
+| `fp fleet history MACHINE_ID` | Despliegues anteriores de una máquina. | — |
+| `fp fleet rollback MACHINE_ID` | Restaura un despliegue anterior. | `--yes`, `-y` |
+| `fp fleet rename MACHINE_ID` | Asigna un nombre legible a una máquina. | `--name` requerido |
+
+### Guardrails
+
+Lo que realmente hizo la aplicación. **Solo para sesión**, por la misma razón que las anteriores.
+
+| Comando | Propósito | Opciones |
+| --- | --- | --- |
+| `fp guardrails summary` | Cobertura, totales bloqueados/evaluados, una gráfica de denegaciones y la tabla por política. | `--since` (`1h`, `6h`, `24h`, `7d`); `--machine` |
+| `fp guardrails timeline` | Decisiones agrupadas en la ventana temporal, sumadas por cada fuente de política. | `--since` (`1h`, `6h`, `24h`, `7d`); `--machine` |
+
## Flags globales
| Flag | Descripción |
| --- | --- |
| `--json` | Emite JSON legible por máquina. |
-| `--base-url ` | Usa un dashboard autoalojado o de desarrollo. |
+| `--base-url ` | Usa un dashboard alojado localmente o de desarrollo. |
| `--org ` | Selecciona una organización para esta invocación. |
| `--token ` | Reemplaza el token de sesión de usuario guardado. |
-| `--api-key ` | Autentica la automatización con una clave de API; nunca se guarda. |
-| `--timeout ` | Tiempo de espera HTTP; debe ser positivo. Predeterminado: `30`. |
+| `--api-key ` | Autentica automatización con una clave de API; nunca se guarda. |
+| `--timeout ` | Tiempo de espera HTTP; debe ser positivo. Por defecto: `30`. |
| `--quiet`, `-q` | Suprime la salida de estado en stderr. |
-| `--no-color` | Deshabilita la salida con color. |
-| `--insecure` / `--secure` | Deshabilita o restaura la verificación del certificado TLS. |
+| `--no-color` | Deshabilita la salida en color. |
+| `--insecure` / `--secure` | Deshabilita o restaura la verificación de certificados TLS. |
| `--version` | Imprime la versión y sale. |
| `--help`, `-h` | Muestra la ayuda. |
-`--api-key` está destinado a la automatización. Los comandos de inicio de sesión, cambio de organización y asistente requieren una sesión de usuario.
+`--api-key` está pensado para automatización. El inicio de sesión, el cambio de organización y los comandos del asistente requieren una sesión de usuario.
## Variables de entorno
| Variable | Equivalente o propósito |
| --- | --- |
-| `AGENTEYE_DASHBOARD_URL` | `--base-url` |
-| `AGENTEYE_ORG` | `--org` |
-| `AGENTEYE_CLI_TOKEN` | `--token` |
-| `AGENTEYE_CLI_API_KEY` | `--api-key` |
-| `AGENTEYE_CLI_JSON` | `--json` |
-| `AGENTEYE_INSECURE` | `--insecure` |
-| `AGENTEYE_HOME` | Reubica el directorio de configuración actual del CLI. |
-| `AGENTEYE_ANALYTICS_DISABLED` o `DO_NOT_TRACK` | Deshabilita las analíticas anónimas del CLI. |
-| `NO_COLOR` | Deshabilita la salida con color. |
-
-Las flags explícitas reemplazan las variables de entorno, que a su vez reemplazan la configuración guardada. En el modo de clave de API, selecciona el tenant explícitamente con `--org` o `AGENTEYE_ORG`.
+| `FP_DASHBOARD_URL` | `--base-url` |
+| `FP_ORG` | `--org` |
+| `FP_TOKEN` | `--token` |
+| `FP_API_KEY` | `--api-key` |
+| `FP_JSON` | `--json` |
+| `FP_INSECURE` | `--insecure` |
+| `FP_HOME` | Reubica el directorio de configuración de la CLI (por defecto `~/.failproofai/fpcli`). |
+| `FP_ANALYTICS_DISABLED` o `DO_NOT_TRACK` | Deshabilita las analíticas anónimas de la CLI. |
+| `NO_COLOR` | Deshabilita la salida en color. |
+
+Las flags explícitas reemplazan las variables de entorno, que a su vez reemplazan la configuración guardada. En modo de clave de API, selecciona el tenant explícitamente con `--org` o `FP_ORG`.
+
+
+ Las versiones `AGENTEYE_*` de estas variables **no son leídas por `fp`** y nunca lo fueron — la CLI declara `FP_*` (`fp_cli/app.py`), y una variable desconocida no genera un error. Establecer `AGENTEYE_DASHBOARD_URL` no redirige la CLI; se ignora y el comando se ejecuta silenciosamente contra el dashboard guardado.
+
+ `AGENTEYE_HOME` y `AGENTEYE_ENVIRONMENT` todavía existen, pero pertenecen al **colector y al SDK de telemetría**, no a esta CLI.
+
- Los comandos que eliminan, revocan, suprimen, resuelven o reemplazan configuración solicitan confirmación de forma predeterminada. Usa `--yes` solo después de verificar la organización activa y el objetivo.
+ Los comandos que eliminan, revocan, suprimen, resuelven o reemplazan configuración solicitan confirmación por defecto. Usa `--yes` solo después de verificar la organización activa y el objetivo.
\ No newline at end of file
diff --git a/docs/es/reference/custom-agents.mdx b/docs/es/reference/custom-agents.mdx
index b99a2591a..2afefeb9b 100644
--- a/docs/es/reference/custom-agents.mdx
+++ b/docs/es/reference/custom-agents.mdx
@@ -1,45 +1,40 @@
---
title: "Agentes personalizados"
-description: "Instrumenta trazas de agentes personalizados para que Failproof AI pueda reconstruir ejecuciones y detectar fallos."
+description: "Configuración, el catálogo de eventos, reglas de correlación y entrega para failproofai-sdk."
icon: "python"
---
-Instrumenta trazas de un agente personalizado con `failproofai-sdk` para que Failproof AI pueda reconstruir cada ejecución, auditar su comportamiento y encontrar fallos respaldados por evidencia. El SDK escribe eventos estructurados para que el daemon de Failproof los envíe a Cloud. Requiere Python 3.10 o superior.
+Qué hace cada parámetro, método y campo. Si es la primera vez que instrumentas, comienza con la guía — esta página es para consultar referencias.
-El rastreo hace que los agentes personalizados sean observables y auditables. Para bloquear una acción insegura antes de que se ejecute también se necesita un hook de aplicación en tu runtime.
+
+
+ Instalación, instrumentación, los métodos de eventos, un ejemplo completo y problemas frecuentes.
+
+
+ LangChain, CrewAI, LlamaIndex y Pydantic AI se instrumentan solos con una sola llamada.
+
+
-
- Para aplicar políticas en un entorno con agentes personalizados, [contacta con Failproof AI](mailto:support@befailproof.ai). Te ayudaremos a mapear los límites de modelo, herramienta y ciclo de vida de tu runtime a hooks de política.
-
+Python 3.10 o superior. Sin dependencias en tiempo de ejecución.
-
-
-
-
-## Instalar `failproofai-sdk`
-
-El SDK se distribuye actualmente como un wheel privado. Contacta con tu representante de Failproof AI para obtener la versión actual y acceso de descarga.
+## Instalación
```bash
-VERSION=
-pip install "./failproofai_sdk-${VERSION}-py3-none-any.whl"
-python -c "import failproofai; print(failproofai.__version__)"
+pip install failproofai-sdk
```
-Con `uv`, descarga primero el wheel y ejecuta `uv add ./failproofai_sdk-${VERSION}-py3-none-any.whl`. Fija el wheel en un repositorio privado de artefactos o en el archivo de bloqueo de dependencias.
-
-El paquete se instala como `failproofai-sdk` y se importa en Python como `failproofai`.
+El paquete se instala como `failproofai-sdk` y se importa en Python como `failproofai_sdk`. Los extras de framework como `failproofai-sdk[langgraph]` instalan el propio framework; los adaptadores siempre se incluyen en el wheel base.
## Conectar el daemon de Failproof
-
+
1. Ve a **Admin → Keys** y crea una clave con `events:add`.
2. [Conecta el daemon de Failproof a Cloud](/es/start/setup#connect-a-machine-to-cloud) en la máquina del agente.
- 3. Ejecuta una sesión instrumentada y luego busca su ID exacto en **Observe → Events**.
- 4. Ve a **Observe → Sessions**, selecciona el mismo entorno y abre la traza reconstruida.
+ 3. Ejecuta una sesión instrumentada y luego encuentra su ID exacto en **Observe → Events**.
+ 4. Ve a **Observe → Sessions**, selecciona el mismo entorno y abre el trace reconstruido.
- 
+ 
```bash
@@ -51,102 +46,84 @@ El paquete se instala como `failproofai-sdk` y se importa en Python como `failpr
-## Instrumentar una ejecución completa
-
-Llama a `configure()` una sola vez durante el inicio del proceso. Todas las llamadas a eventos son solo por nombre de parámetro y requieren un `session_id` y un `agent_id` estables.
+## Configuración
```python
-import traceback
-import uuid
+import failproofai_sdk
-import failproofai
+failproofai_sdk.configure(
+ base_dir=None,
+ flush_interval=0.5,
+ environment="production",
+)
+```
-failproofai.configure(environment="production")
+| Argumento | Qué hace |
+| --- | --- |
+| `environment` | La etiqueta en cada evento — `production`, `staging`, `prod-eu`. Por defecto es `dev`. |
+| `flush_interval` | Con qué frecuencia el hilo en segundo plano escribe en disco, en segundos. Por defecto es `0.5`. |
+| `base_dir` | Dónde escribir. Por defecto usa el spool del daemon, que es lo que quieres salvo que sepas lo que estás haciendo. |
-session_id = uuid.uuid4().hex
-agent_id = "checkout-agent"
+También se puede configurar mediante variables de entorno:
-failproofai.event.agent_start(
- session_id=session_id,
- agent_id=agent_id,
- goal="Resolve a failed checkout",
-)
+| Variable | Qué hace |
+| --- | --- |
+| `AGENTEYE_ENVIRONMENT` | Define `environment` sin modificar el código, para cuando la etiqueta pertenece al despliegue y no a la aplicación. Un argumento de `configure()` tiene prioridad sobre ella. |
+| `FAILPROOFAI_HOME` | Mueve la raíz de Failproof AI que contiene el spool. |
+| `FAILPROOFAI_SDK_STRICT` | `1` hace que los errores de instrumentación lancen excepciones en lugar de solo registrarse. |
+| `FAILPROOFAI_SDK_STRICT_INTEGRATIONS` | `1` hace que un problema de compatibilidad con un framework lance una excepción en lugar de advertir y continuar. |
-try:
- tool_call_id = uuid.uuid4().hex
- failproofai.event.tool_use(
- session_id=session_id,
- agent_id=agent_id,
- tool_name="lookup_order",
- tool_call_id=tool_call_id,
- input={"order_id": "ord_8421"},
- )
- result = {"status": "payment_failed"}
- failproofai.event.tool_result(
- session_id=session_id,
- agent_id=agent_id,
- tool_name="lookup_order",
- tool_call_id=tool_call_id,
- output=result,
- )
-except Exception as exc:
- failproofai.event.error(
- session_id=session_id,
- agent_id=agent_id,
- error_type=type(exc).__name__,
- message=str(exc),
- traceback=traceback.format_exc(),
- )
- failproofai.event.agent_end(
- session_id=session_id,
- agent_id=agent_id,
- outcome="failed",
- )
- raise
-else:
- failproofai.event.agent_end(
- session_id=session_id,
- agent_id=agent_id,
- outcome="success",
- summary="Escalated the failed payment",
- )
-```
+
+ **No uses comas en `environment`.** El sistema de ingesta divide ese campo por comas para construir sus filtros, y descarta cualquier evento cuya etiqueta contenga una — con lo que toda una ejecución desaparece silenciosamente. Escribe `prod-eu`, no `prod,eu`.
+
+ `configure(environment="prod,eu")` lanza una excepción para que lo descubras de inmediato. `AGENTEYE_ENVIRONMENT` no puede lanzar — nadie te está llamando — así que advierte una vez y vuelve a `dev`.
+
-Emite `agent_start` una vez por actor. Para sub-agentes, reutiliza el `session_id` del padre, asigna a cada actor un `agent_id` distinto y establece `parent_id` como el **ID del agente** padre, no el ID de sesión.
+Los eventos se encolan en memoria y se escriben en segundo plano cada `flush_interval` segundos, con un flush final al salir del intérprete. Un proceso terminado abruptamente pierde lo que aún no se había escrito.
-## Referencia de configuración
+## Identidad
+
+Cada evento pertenece a una sesión y a un agente. **Los scopes rellenan ambos**, por lo que rara vez necesitas pasarlos explícitamente:
```python
-failproofai.configure(
- base_dir=None,
- flush_interval=0.5,
- environment="production",
-)
+with failproofai_sdk.session():
+ with failproofai_sdk.agent("planner"):
+ failproofai_sdk.event.tool_use(tool_name="search", tool_call_id="c1")
```
-| Parámetro | Comportamiento |
-| --- | --- |
-| `base_dir` | Directorio raíz de spool explícito. Tiene precedencia sobre todas las variables de entorno. |
-| `flush_interval` | Segundos entre escrituras en segundo plano desde memoria a JSONL. Valor predeterminado: `0.5`. |
-| `environment` | Etiqueta de despliegue en cada evento. Por defecto es `dev`. |
-| `FAILPROOFAI_HOME` | Cambia la raíz de Failproof AI que contiene el spool `custom-agents`. |
-
-El SDK escribe en el `base_dir` explícito cuando está definido. De lo contrario, utiliza el spool `custom-agents` del daemon de Failproof bajo `FAILPROOFAI_HOME` o `~/.failproofai`.
+Pasar `session_id` o `agent_id` explícitamente sigue funcionando y tiene prioridad. Si no hay ninguno vinculado ni pasado, la llamada lanza `TypeError` en lugar de emitir un evento que Cloud descartaría silenciosamente.
-El SDK encola llamadas en memoria y escribe lotes en un hilo en segundo plano. También realiza un flush final a través del mecanismo `atexit` de Python. Para workers de vida corta, permite un cierre normal del intérprete; la terminación forzada del proceso puede provocar la pérdida de eventos que aún estén en memoria.
+
+ La identidad viaja en variables de contexto. Sigue las tareas de `asyncio` automáticamente, pero **no** los nuevos hilos — envuelve un worker con `failproofai_sdk.propagate()` o sus eventos quedarán sin asociar.
+
## Catálogo de eventos
-Todos los métodos devuelven `None`. Los campos con valor `None` se omiten en lugar de escribirse como `null` en JSON.
+Quince métodos. La mayoría vienen en **pares** — llamas al de apertura, luego al de cierre, y el SDK mide el intervalo.
-| Método | Campos requeridos además de la identidad | Campos opcionales |
+| | Abre | Cierra |
+| --- | --- | --- |
+| **Agentes** | `agent_start` | `agent_end` |
+| | `agent_pause` | `agent_resume` |
+| **Modelos** | `model_request` | `model_response` |
+| **Herramientas** | `tool_use` | `tool_result` |
+| **Hooks** | `hook_triggered` | `hook_completed` |
+| **Humanos** | `human_wait` | `human_input` |
+
+Tres son independientes: `error`, `human_pause`, `human_interrupt`.
+
+
+
+Cada método también acepta `session_id` y `agent_id`, que los scopes rellenan por ti. Cualquier campo que quede como `None` se omite en lugar de enviarse como JSON `null`, y todos los métodos devuelven `None`.
+
+| Método | Obligatorio | Opcional |
| --- | --- | --- |
| `agent_start` | — | `goal`, `parent_id` |
| `agent_end` | — | `outcome`, `summary` |
| `agent_pause` | `pause_id` | `reason`, `user_id` |
| `agent_resume` | `pause_id` | `reason`, `user_id` |
-| `model_request` | — | `model`, `messages`, `system`, `tools` |
-| `model_response` | — | `model`, `stop_reason`, `input_tokens`, `output_tokens`, `content`, `role` |
+| `model_request` | — | `model`, `messages`, `system`, `tools`, `request_id` |
+| `model_response` | — | `model`, `stop_reason`, `input_tokens`, `output_tokens`, `content`, `role`, `request_id`, `duration_ms` |
| `tool_use` | `tool_name`, `tool_call_id` | `input` |
| `tool_result` | `tool_name`, `tool_call_id` | `output`, `error` |
| `hook_triggered` | `hook_name`, `hook_id` | `trigger_event`, `input` |
@@ -157,27 +134,64 @@ Todos los métodos devuelven `None`. Los campos con valor `None` se omiten en lu
| `human_pause` | — | `reason`, `user_id` |
| `human_interrupt` | — | `reason`, `user_id`, `at_step` |
-Usa `outcome="failed"`, `"error"`, `"timeout"` o `"rejected"` cuando una finalización deba contabilizarse como un fallo. Otros valores, incluido `"failure"`, no son clasificados como fallos por el backend actual.
+
+
+
+ Para marcar una ejecución como fallida, `outcome` debe ser uno de `failed`, `error`, `timeout` o `rejected`. Cualquier otro valor — incluido el casi correcto `"failure"` — se considera un éxito.
+
+
+## Emparejamiento y duración
+
+**Una regla: dale al evento de cierre el mismo id que a su apertura.** Eso es lo que los empareja y lo que permite al SDK medir el intervalo.
+
+| Par | Se empareja por |
+| --- | --- |
+| `tool_use` → `tool_result` | `tool_call_id` |
+| `hook_triggered` → `hook_completed` | `hook_id` |
+| `agent_pause` → `agent_resume` | `pause_id` |
+| `human_wait` → `human_input` | `input_id` |
+| `model_request` → `model_response` | `request_id` |
+
+**No pases `duration_ms` manualmente.** El SDK lo mide, y pasarlo lanza `ValueError`.
-## Reglas de correlación y duración
+La única excepción es `model_response`, donde solo tú conoces la latencia real del proveedor. Pasa un número entero de milisegundos — un float lanza una excepción, porque la columna es un entero de 32 bits y de otro modo quedaría vacía.
-- Reutiliza el mismo `tool_call_id`, `hook_id`, `pause_id` o `input_id` para el evento de finalización correspondiente.
-- El SDK calcula `duration_ms` para `tool_result`, `hook_completed`, `agent_resume` y `human_input`. Pasarlo manualmente a esos métodos lanza `ValueError`.
-- Los IDs de herramientas y hooks comparten un mapa de pendientes a nivel de proceso. Hazlos globalmente únicos en sesiones concurrentes y entre ambos espacios de nombres; los IDs de proveedor o UUIDs son la opción más segura.
-- Un par dividido entre procesos sigue correlacionándose en el backend, pero el SDK no puede calcular su duración dentro del proceso.
-- El mapa de pendientes admite un máximo de 10.000 entradas y elimina la más antigua cuando se llena.
+
-## Campos personalizados y payloads
+- **Los ids solo necesitan ser únicos por tipo y por sesión.** Una llamada a una herramienta y un hook pueden compartir uno; dos sesiones ejecutándose a la vez pueden reutilizar los mismos ids sin colisionar.
+- **No están limitados al ámbito de un agente.** Un par abierto bajo un agente y cerrado bajo otro sigue emparejándose — que es el caso normal en código multi-agente.
+- **`request_id` es opcional pero recomendado.** Sin él, los eventos de modelo se emparejan en el orden en que llegan, por lo que dos llamadas concurrentes en el mismo agente pueden emparejarse incorrectamente.
+- **Un par dividido entre procesos** sigue emparejándose en Cloud, pero el SDK no puede medirlo — ninguno de los dos procesos vio ambas mitades.
+- **Como máximo 10 000 aperturas esperan un cierre a la vez.** A partir de ahí se descarta la más antigua, para que una fuga no crezca sin límite.
-Todos los eventos aceptan campos adicionales por nombre de parámetro. Usa valores compatibles con JSON cuando las consultas downstream necesiten estructura. Los tipos no compatibles como UUIDs, datetimes, decimales, conjuntos, bytes y objetos de modelo se convierten a cadena de texto por el escritor.
+
-Los nombres personalizados reservados son `timestamp`, `session_id`, `agent_id`, `type` y `environment`. Los errores tipográficos en campos opcionales se aceptan como nuevos campos personalizados, así que revisa el JSON emitido si un campo estándar no aparece en Cloud.
+## Tus propios campos
-## Entregar y verificar
+Cualquier palabra clave adicional que pases se almacena con el evento:
+
+```python
+failproofai_sdk.event.tool_use(
+ tool_name="search", tool_call_id="c1",
+ fw_tenant="acme", fw_region="eu-west-1", # los tuyos
+)
+```
+
+Usa tipos JSON si quieres consultarlos más adelante. Cualquier otra cosa — un UUID, un datetime, un `Decimal`, un set, bytes, un objeto de modelo — se almacena como cadena de texto.
+
+
+ **Pon prefijo a los nombres de tus campos.** Los extras se aplican al final, por lo que un campo llamado `model`, `tool_name` o `outcome` sobreescribirá silenciosamente el real. Los adaptadores de framework usan `fw_`; haz lo mismo y nada podrá colisionar.
+
+ Esta es también la razón por la que un campo opcional mal escrito nunca genera un error — simplemente se convierte en un nuevo campo personalizado. Si falta un campo estándar en Cloud, comprueba primero la ortografía.
+
+
+Estos cinco nombres están reservados y se rechazan directamente: `timestamp`, `session_id`, `agent_id`, `type`, `environment`.
+
+## Entrega y verificación
-
- En **Observe → Events**, verifica que `agent_start` exista primero y `agent_end` al final. Luego abre **Observe → Sessions** y confirma que los eventos de modelo, herramienta, persona, hook y error aparecen en el orden previsto. Usa el ID de sesión como clave principal para la resolución de problemas.
+
+ En **Observe → Events**, verifica que `agent_start` exista primero y `agent_end` exista al final. Luego abre **Observe → Sessions** y confirma que los eventos de modelo, herramienta, humano, hook y error aparecen en el orden previsto. Usa el ID de sesión como clave principal de resolución de problemas.
```bash
@@ -189,10 +203,14 @@ Los nombres personalizados reservados son `timestamp`, `session_id`, `agent_id`,
-Si Cloud está vacío, inspecciona `$FAILPROOFAI_HOME/custom-agents/events`; de lo contrario, revisa `~/.failproofai/custom-agents/events`. Los archivos JSONL confirman la emisión del SDK; un spool en crecimiento apunta a un problema de configuración o entrega del daemon, mientras que un spool vacío apunta a la instrumentación o al ciclo de vida del proceso.
+Si Cloud está vacío, inspecciona `$FAILPROOFAI_HOME/custom-agents/events`; en caso contrario, `~/.failproofai/custom-agents/events`. Los archivos JSONL confirman la emisión del SDK; un spool creciente apunta a configuración del daemon o entrega, mientras que un spool vacío apunta a instrumentación o ciclo de vida del proceso.
+
+
+ Inspecciona el spool solo cuando el daemon esté detenido. Mientras se ejecuta, recoge y elimina cada lote en cuestión de milisegundos, por lo que un listado de directorio compite con el colector y mostrará muchos menos eventos de los que se emitieron.
+
## Prevenir fallos en un runtime personalizado
-Usa los hallazgos de auditoría y las trazas vinculadas para definir la acción insegura, la evidencia requerida y la respuesta esperada. Una integración de aplicación personalizada debe exponer la acción antes de su ejecución, pasar su entrada estructurada al motor de políticas y aplicar la decisión resultante: allow, instruct o deny.
+Usa los hallazgos de auditoría y los traces vinculados para definir la acción no segura, la evidencia requerida y la respuesta esperada. Una integración de enforcement personalizada debe exponer la acción antes de su ejecución, pasar su entrada estructurada al motor de políticas y aplicar la decisión resultante: allow, instruct o deny.
-Escribe a [support@befailproof.ai](mailto:support@befailproof.ai) para diseñar y validar esta integración en tu runtime.
\ No newline at end of file
+[Contacta con Failproof AI](mailto:support@befailproof.ai) y te ayudaremos a mapear los límites de modelo, herramienta y ciclo de vida de tu runtime a los hooks de política, y luego a validar la integración contigo.
\ No newline at end of file
diff --git a/docs/es/reference/events-and-configuration.mdx b/docs/es/reference/events-and-configuration.mdx
index 6652d4faa..653065124 100644
--- a/docs/es/reference/events-and-configuration.mdx
+++ b/docs/es/reference/events-and-configuration.mdx
@@ -6,36 +6,36 @@ icon: "list-tree"
## Familias de eventos
-- Inicio, fin, pausa y reanudación de agente
+- Inicio, fin, pausa y reanudación del agente
- Solicitud y respuesta del modelo
- Uso de herramienta y resultado
- Hook activado y completado
-- Espera humana, entrada, pausa e interrupción
+- Espera, entrada, pausa e interrupción humana
- Errores explícitos
-Cada evento incluye una marca de tiempo, ID de sesión, ID de agente, tipo de evento y entorno. Los campos específicos de cada evento contienen datos de modelo, herramienta, correlación, resultado, contenido, duración o error.
+Cada evento incluye una marca de tiempo, ID de sesión, ID de agente, tipo de evento y entorno. Los campos específicos del evento contienen datos sobre el modelo, la herramienta, la correlación, el resultado, el contenido, la duración o el error.
## Inspeccionar un contrato de evento
1. Abre **Observe → Events**.
- 2. Define una ventana de tiempo corta y filtra por entorno, agente y tipo de evento.
- 3. Selecciona un evento para inspeccionar sus campos normalizados y el payload en bruto, luego abre su sesión para ver el contexto de ejecución.
- 4. Si falta la duración de un par, verifica que los eventos de inicio y finalización usen el mismo ID de correlación.
+ 2. Establece una ventana de tiempo reducida y filtra por entorno, agente y tipo de evento.
+ 3. Selecciona un evento para inspeccionar sus campos normalizados y el payload sin procesar; luego abre su sesión para ver el contexto de ejecución.
+ 4. Si falta una duración emparejada, verifica que los eventos de inicio y finalización usen el mismo ID de correlación.
- Usa el flujo de Events para reducir los datos a una sola ejecución de agente e inspeccionar los campos de evento normalizados.
+ Usa el flujo de Events para acotar los datos a una ejecución de agente e inspeccionar los campos de evento normalizados.
- 
+ 
- Luego sigue el evento hasta su sesión. El trazado muestra qué ocurrió inmediatamente antes y después, lo cual es necesario cuando el payload por sí solo resulta ambiguo.
+ Luego sigue el evento hasta su sesión. El trazado muestra qué ocurrió inmediatamente antes y después, lo cual es necesario cuando el payload por sí solo es ambiguo.

- Compara los IDs de correlación y las marcas de tiempo en ambas vistas cuando falte un evento par o una duración.
+ Compara los IDs de correlación y las marcas de tiempo en ambas vistas cuando falte un evento emparejado o una duración.
- Descubre los valores de filtro válidos y luego obtén los payloads completos de los eventos para una sesión:
+ Descubre los valores de filtro válidos y luego obtén los payloads completos de los eventos de una sesión:
```bash
fp list event_types
@@ -53,26 +53,26 @@ Cada evento incluye una marca de tiempo, ID de sesión, ID de agente, tipo de ev
## Campos reservados del SDK
-No uses `timestamp`, `session_id`, `agent_id`, `type` ni `environment` como campos personalizados del SDK de Python. Las duraciones de eventos pareados, como la duración del resultado de una herramienta, son calculadas por el SDK y no pueden proporcionarse manualmente.
+No uses `timestamp`, `session_id`, `agent_id`, `type` ni `environment` como campos personalizados del SDK de Python. Las duraciones de eventos emparejados, como la duración del resultado de una herramienta, son calculadas por el SDK y no pueden proporcionarse manualmente.
## Límites locales
-- El estado de Failproof AI reside en `~/.failproofai` a menos que se configure explícitamente de otro modo.
-- `failproofai-sdk` usa `AGENTEYE_HOME` para su variable de anulación del directorio base heredada.
-- Las etiquetas de entorno pueden definirse mediante la configuración del SDK o con `AGENTEYE_ENVIRONMENT`.
-- Las credenciales del daemon se almacenan de forma separada de los ajustes no confidenciales.
+- El estado de Failproof AI reside en `~/.failproofai` a menos que se configure explícitamente de otra manera.
+- `failproofai-sdk` siempre escribe en el spool bajo `~/.failproofai/custom-agents`. `FAILPROOFAI_HOME` reubica ese directorio raíz; el segmento `custom-agents` siempre se añade, por lo que el spool no puede colocarse fuera de él. Solo el propio `configure(base_dir=...)` del SDK escribe en otro lugar. `AGENTEYE_HOME` es leído por el antiguo `agenteye-collector` para determinar qué observar, y ya no afecta dónde escribe el SDK.
+- Las etiquetas de entorno pueden establecerse mediante la configuración del SDK o con `AGENTEYE_ENVIRONMENT`.
+- Las credenciales del daemon se almacenan de forma separada de la configuración no secreta.
-Usa nombres de entorno estables y de baja cardinalidad. No se admiten comas en las etiquetas de entorno del daemon.
+Usa nombres de entorno estables y de baja cardinalidad. Las comas no están admitidas en las etiquetas de entorno del daemon.
## Cambiar una etiqueta de entorno