Skip to content

Commit 0b05113

Browse files
authored
Merge branch 'main' into fix/native-tool-call-responses-api-shape
2 parents 32f0393 + 7642e61 commit 0b05113

42 files changed

Lines changed: 2493 additions & 355 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/vulnerability-scan.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,11 @@ jobs:
8686
--skip-editable
8787
--format json
8888
--output pip-audit-report.json
89-
--ignore-vuln GHSA-rrmf-rvhw-rf47 # torch 2.12.0 (CVE-2025-3000): local-only memory corruption in torch.jit.script; no fix available.
90-
--ignore-vuln GHSA-f4j7-r4q5-qw2c # chromadb 1.1.1 (CVE-2026-45829): pre-auth RCE in the HTTP server; no fix available.
89+
# chromadb <=1.5.9 (CVE-2026-45829 / GHSA-f4j7-r4q5-qw2c): pre-auth RCE in
90+
# the Python HTTP server. Fix merged upstream in chroma-core/chroma#7237
91+
# but no PyPI release beyond 1.5.9 yet. CrewAI only uses PersistentClient
92+
# (embedded), not the HTTP server.
93+
--ignore-vuln GHSA-f4j7-r4q5-qw2c
9194
)
9295
uv run pip-audit "${pip_audit_args[@]}"
9396
continue-on-error: true

.pre-commit-config.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ repos:
4848
--ignore-vuln PYSEC-2025-197
4949
--ignore-vuln PYSEC-2025-210
5050
--ignore-vuln PYSEC-2026-139
51-
--ignore-vuln GHSA-rrmf-rvhw-rf47
5251
--ignore-vuln PYSEC-2025-211
5352
--ignore-vuln PYSEC-2025-212
5453
--ignore-vuln PYSEC-2025-213

docs/docs.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12394,7 +12394,8 @@
1239412394
"edge/pt-BR/learn/using-annotations",
1239512395
"edge/pt-BR/learn/execution-hooks",
1239612396
"edge/pt-BR/learn/llm-hooks",
12397-
"edge/pt-BR/learn/tool-hooks"
12397+
"edge/pt-BR/learn/tool-hooks",
12398+
"edge/pt-BR/learn/execution-boundary-hooks"
1239812399
]
1239912400
},
1240012401
{
@@ -23684,7 +23685,8 @@
2368423685
"edge/ko/learn/using-annotations",
2368523686
"edge/ko/learn/execution-hooks",
2368623687
"edge/ko/learn/llm-hooks",
23687-
"edge/ko/learn/tool-hooks"
23688+
"edge/ko/learn/tool-hooks",
23689+
"edge/ko/learn/execution-boundary-hooks"
2368823690
]
2368923691
},
2369023692
{
@@ -35346,7 +35348,8 @@
3534635348
"edge/ar/learn/using-annotations",
3534735349
"edge/ar/learn/execution-hooks",
3534835350
"edge/ar/learn/llm-hooks",
35349-
"edge/ar/learn/tool-hooks"
35351+
"edge/ar/learn/tool-hooks",
35352+
"edge/ar/learn/execution-boundary-hooks"
3535035353
]
3535135354
},
3535235355
{

docs/edge/ar/concepts/agents.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ mode: "wide"
6060
| **احترام نافذة السياق** _(اختياري)_ | `respect_context_window` | `bool` | إبقاء الرسائل تحت حجم نافذة السياق عبر التلخيص. الافتراضي True. |
6161
| **وضع تنفيذ الكود** _(اختياري)_ | `code_execution_mode` | `Literal["safe", "unsafe"]` | وضع تنفيذ الكود: 'safe' (باستخدام Docker) أو 'unsafe' (مباشر). الافتراضي 'safe'. |
6262
| **متعدد الوسائط** _(اختياري)_ | `multimodal` | `bool` | ما إذا كان الوكيل يدعم القدرات متعددة الوسائط. الافتراضي False. |
63-
| **حقن التاريخ** _(اختياري)_ | `inject_date` | `bool` | ما إذا كان يتم حقن التاريخ الحالي تلقائيًا في المهام. الافتراضي False. |
63+
| **حقن التاريخ** _(اختياري)_ | `inject_date` | `bool` | ما إذا كان يتم حقن التاريخ الحالي تلقائيًا في أمر الوكيل. الافتراضي False. |
6464
| **تنسيق التاريخ** _(اختياري)_ | `date_format` | `str` | سلسلة تنسيق التاريخ عند تفعيل inject_date. الافتراضي "%Y-%m-%d" (تنسيق ISO). |
6565
| **الاستدلال** _(اختياري)_ | `reasoning` | `bool` | ما إذا كان يجب على الوكيل التأمل وإنشاء خطة قبل تنفيذ المهمة. الافتراضي False. |
6666
| **الحد الأقصى لمحاولات الاستدلال** _(اختياري)_ | `max_reasoning_attempts` | `Optional[int]` | الحد الأقصى لمحاولات الاستدلال قبل تنفيذ المهمة. إذا None، سيحاول حتى الاستعداد. |
@@ -287,7 +287,7 @@ analysis_agent = Agent(
287287

288288
- `multimodal`: تفعيل القدرات متعددة الوسائط لمعالجة النص والمحتوى المرئي
289289
- `reasoning`: تمكين الوكيل من التأمل وإنشاء خطط قبل تنفيذ المهام
290-
- `inject_date`: حقن التاريخ الحالي تلقائيًا في أوصاف المهام
290+
- `inject_date`: حقن التاريخ الحالي تلقائيًا في أمر الوكيل
291291

292292
#### القوالب
293293

docs/edge/ar/concepts/cli.mdx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ crewai create flow my_new_flow
5454

5555
افتراضيًا، ينشئ `crewai create crew` مشروعًا JSON-first يحتوي على `crew.jsonc` و `agents/*.jsonc`. استخدم `crewai create crew my_new_crew --classic` فقط إذا أردت البنية القديمة Python/YAML مع `crew.py` و `config/agents.yaml` و `config/tasks.yaml`.
5656

57+
#### أسماء مستعار قديمة للأعلام (مهملة)
58+
59+
لا تزال أعلام snake_case القديمة تعمل، لكنها مخفية من `--help`. يُفضّل استخدام صيغ kebab-case الموثّقة في أقسام الأوامر أدناه.
60+
61+
| مهمل | استخدم بدلاً منه |
62+
| :--- | :--- |
63+
| `--skip_provider` (في `crewai create crew`) | `--skip-provider` |
64+
| `--n_iterations` (في `crewai train`، `crewai test`) | `--n-iterations` |
65+
| `--task_id` (في `crewai replay`) | `--task-id` |
66+
5767
### 2. الإصدار
5868

5969
عرض الإصدار المثبت من CrewAI.
@@ -72,7 +82,7 @@ crewai version [OPTIONS]
7282
crewai train [OPTIONS]
7383
```
7484

75-
- `-n, --n_iterations INTEGER`: عدد تكرارات التدريب (افتراضي: 5)
85+
- `-n, --n-iterations INTEGER`: عدد تكرارات التدريب (افتراضي: 5)
7686
- `-f, --filename TEXT`: مسار ملف مخصص للتدريب (افتراضي: "trained_agents_data.pkl")
7787

7888
### 4. الإعادة
@@ -83,7 +93,7 @@ crewai train [OPTIONS]
8393
crewai replay [OPTIONS]
8494
```
8595

86-
- `-t, --task_id TEXT`: إعادة تنفيذ الطاقم من معرّف المهمة هذا، بما في ذلك جميع المهام اللاحقة
96+
- `-t, --task-id TEXT`: إعادة تنفيذ الطاقم من معرّف المهمة هذا، بما في ذلك جميع المهام اللاحقة
8797

8898
### 5. سجل مخرجات المهام
8999

@@ -117,7 +127,7 @@ crewai reset-memories [OPTIONS]
117127
crewai test [OPTIONS]
118128
```
119129

120-
- `-n, --n_iterations INTEGER`: عدد تكرارات الاختبار (افتراضي: 3)
130+
- `-n, --n-iterations INTEGER`: عدد تكرارات الاختبار (افتراضي: 3)
121131
- `-m, --model TEXT`: نموذج LLM لتشغيل الاختبارات (افتراضي: "gpt-4o-mini")
122132

123133
### 8. التشغيل

docs/edge/ar/concepts/testing.mdx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ crewai test
2020
إذا أردت تشغيل المزيد من التكرارات أو استخدام نموذج مختلف، يمكنك تحديد المعاملات هكذا:
2121

2222
```bash
23-
crewai test --n_iterations 5 --model gpt-4o
23+
crewai test --n-iterations 5 --model gpt-4o
2424
```
2525

2626
أو باستخدام الصيغة المختصرة:
@@ -29,6 +29,11 @@ crewai test --n_iterations 5 --model gpt-4o
2929
crewai test -n 5 -m gpt-4o
3030
```
3131

32+
<Note>
33+
العلم القديم `--n_iterations` لا يزال يعمل، لكنه مهمل ومخفي من `--help`.
34+
استخدم `--n-iterations` (أو `-n`) بدلاً من ذلك.
35+
</Note>
36+
3237
عند تشغيل أمر `crewai test`، سيتم تنفيذ الطاقم للعدد المحدد من التكرارات، وستُعرض مقاييس الأداء في نهاية التشغيل.
3338

3439
سيظهر جدول الدرجات في النهاية لعرض أداء الطاقم من حيث المقاييس التالية:
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
---
2+
title: خطافات حدود التنفيذ
3+
description: اعتراض بداية تنفيذ الـ Crew والـ Flow ومدخلاته ومخرجاته ونهايته باستخدام المزخرف @on
4+
mode: "wide"
5+
---
6+
7+
تعترض خطافات حدود التنفيذ الأطراف الخارجية للتشغيل — قبل بدء أي عمل، وعند
8+
حسم المدخلات، وعند جاهزية النتيجة النهائية، وعند انتهاء التنفيذ. وهي تعمل مع
9+
الـ Crew والـ Flow على حد سواء، وتُعد المكان المناسب لفحوصات السياسة على
10+
مستوى التشغيل وإعادة كتابة المدخلات وتنقية المخرجات.
11+
12+
## نظرة عامة
13+
14+
أربع نقاط اعتراض تغطي الحدود:
15+
16+
| النقطة | التوقيت | `ctx.payload` |
17+
|--------|---------|---------------|
18+
| `EXECUTION_START` | Crew أو Flow على وشك البدء | `dict` المدخلات |
19+
| `INPUT` | المدخلات المحسومة للتنفيذ | `dict` المدخلات |
20+
| `OUTPUT` | النتيجة النهائية جاهزة | كائن المخرجات |
21+
| `EXECUTION_END` | انتهى التنفيذ (نجاحًا أو فشلًا) | كائن المخرجات، أو `None` عند الفشل |
22+
23+
بالنسبة إلى الـ Crew، يكون payload المخرجات `CrewOutput`. أما في الـ Flow فهو
24+
النتيجة النهائية لدالة الـ Flow.
25+
26+
## توقيع الخطاف
27+
28+
```python
29+
from crewai.hooks import on, HookAborted, InterceptionPoint
30+
31+
@on(InterceptionPoint.EXECUTION_START)
32+
def boundary_hook(ctx) -> Any | None:
33+
# Mutate ctx.payload in place, or
34+
# return a non-None value to replace it, or
35+
# raise HookAborted(reason, source) to stop the run
36+
return None
37+
```
38+
39+
تتبع خطافات الحدود العقد القياسي: المتابعة (`return None`)، أو التعديل في
40+
المكان، أو الاستبدال بإرجاع قيمة، أو الإجهاض برفع `HookAborted`. أي إجهاض
41+
عند أي حد ينتشر خارج `kickoff()` مع سببه.
42+
43+
## مخطط السياق
44+
45+
تتلقى كل نقطة سياقًا منمّطًا. تشترك جميع السياقات في الحقول الأساسية:
46+
47+
```python
48+
class InterceptionContext:
49+
payload: Any # The interceptable value (see table above)
50+
agent: Any = None # Not populated at execution boundaries
51+
agent_role: str | None # Not populated at execution boundaries
52+
task: Any = None # Not populated at execution boundaries
53+
crew: Any = None # The Crew instance (crew runs only)
54+
flow: Any = None # The Flow instance (flow runs only)
55+
```
56+
57+
تضيف سياقات كل نقطة اسمًا بديلًا للـ payload:
58+
59+
```python
60+
class ExecutionStartContext(InterceptionContext):
61+
inputs: dict # Same dict as payload
62+
63+
class InputContext(InterceptionContext):
64+
inputs: dict # Same dict as payload
65+
66+
class OutputContext(InterceptionContext):
67+
output: Any # The output object
68+
69+
class ExecutionEndContext(InterceptionContext):
70+
output: Any # The output object (None when status == "failed")
71+
status: str # "completed" or "failed"
72+
error: BaseException | None # The exception when status == "failed"
73+
```
74+
75+
<Note>
76+
`ctx.inputs` هو اسم بديل لقاموس المدخلات **الأصلي**، لذا فإن التعديلات في
77+
المكان عبر أي من الاسمين متكافئة. إذا *استبدل* خطاف سابق الـ payload بإرجاع
78+
dict جديد، فإن `ctx.payload` وحده يُعاد ربطه — اقرأ واكتب دائمًا عبر
79+
`ctx.payload` عندما يمكن أن تتسلسل الخطافات.
80+
</Note>
81+
82+
## تشغيلات الـ Crew مقابل تشغيلات الـ Flow
83+
84+
تعمل خطافات الحدود على كلا وقتي التشغيل، وتنفيذ الـ Crew يجري داخليًا فوق وقت
85+
تشغيل Flow. لذلك أثناء `crew.kickoff()` يُطلق الخطاف الحدودي العام لحدّ الـ
86+
Crew (‏`ctx.crew` مضبوط و`ctx.flow` يساوي `None`) **و** للـ Flow الداخلي
87+
(‏`ctx.flow` مضبوط و`ctx.crew` يساوي `None`). ميّز حسب وقت التشغيل:
88+
89+
```python
90+
@on(InterceptionPoint.OUTPUT)
91+
def crew_output_only(ctx):
92+
if ctx.crew is None:
93+
return None # Skip the internal flow (or a bare flow)
94+
ctx.payload.raw = ctx.payload.raw.strip()
95+
```
96+
97+
## حالات استخدام شائعة
98+
99+
### فحص السياسة عند البدء
100+
101+
```python
102+
@on(InterceptionPoint.EXECUTION_START)
103+
def enforce_policy(ctx):
104+
if ctx.crew is not None and not ctx.payload.get("authorized"):
105+
raise HookAborted(reason="unauthorized execution", source="access-control")
106+
```
107+
108+
### إعادة كتابة المدخلات
109+
110+
```python
111+
@on(InterceptionPoint.INPUT)
112+
def add_defaults(ctx):
113+
if ctx.crew is None:
114+
return None
115+
ctx.payload.setdefault("locale", "en-US")
116+
ctx.payload["topic"] = ctx.payload["topic"].strip().lower()
117+
```
118+
119+
تتدفق المدخلات المعاد كتابتها إلى استيفاء الـ Task، فيتصرف التشغيل كما لو
120+
بدأ بالقاموس المعدل.
121+
122+
فضّل `INPUT` لإعادة الكتابة وعامل `EXECUTION_START` كبوابة سماح/منع. إعادة
123+
الكتابة عند `EXECUTION_START` تظل مُحترمة — في الـ Crew تغذي أيضًا استدعاءات
124+
`before_kickoff`؛ وفي الـ Flow تُطبق تمامًا كإعادة كتابة `INPUT`.
125+
126+
### تنقية المخرجات
127+
128+
```python
129+
import re
130+
131+
@on(InterceptionPoint.OUTPUT)
132+
def redact_emails(ctx):
133+
if ctx.crew is None:
134+
return None
135+
ctx.payload.raw = re.sub(
136+
r"\b[\w.+-]+@[\w-]+\.[\w.]+\b", "[EMAIL-REDACTED]", ctx.payload.raw
137+
)
138+
```
139+
140+
يعمل `OUTPUT` قبل `EXECUTION_END`، وكلاهما يرى الـ payload (الذي ربما
141+
استُبدل) من الخطافات السابقة؛ والقيمة النهائية المعاد كتابتها هي ما يعيده
142+
`kickoff()`.
143+
144+
### مراقبة الإخفاقات
145+
146+
يُطلق `EXECUTION_END` مرة واحدة بالضبط لكل تنفيذ، عند النجاح والفشل على حد
147+
سواء. عندما يرفع التشغيل استثناءً — خطأ في Task، أو استثناء في دالة Flow، أو
148+
`HookAborted` من نقطة سابقة — يتلقى الخطاف `status="failed"` مع الاستثناء في
149+
`ctx.error`، ويظل الاستثناء الأصلي ينتشر خارج `kickoff()` دون تغيير:
150+
151+
```python
152+
@on(InterceptionPoint.EXECUTION_END)
153+
def report_outcome(ctx):
154+
if ctx.status == "failed":
155+
notify_policy_engine(status="failed", error=repr(ctx.error))
156+
else:
157+
notify_policy_engine(status="completed")
158+
```
159+
160+
تنبيهان: لا يُطلق `EXECUTION_END` عندما لا يكون `EXECUTION_START` قد أُرسل
161+
أصلًا (الإجهاض عند البدء يعني أن الحد لم يُفتح قط، فلا توجد نهاية تقابله)،
162+
ورفع `HookAborted` من إرسال `EXECUTION_END` في مسار الفشل يُتجاهل — لم يعد
163+
هناك ما يُجهض، والخطأ الأصلي هو الغالب.
164+
165+
## الترتيب
166+
167+
لتشغيل Crew يكون ترتيب الحدود:
168+
169+
```
170+
EXECUTION_START → before_kickoff callbacks → INPUT → tasks execute → OUTPUT → EXECUTION_END
171+
```
172+
173+
لتشغيل Flow، تحسم خطافات الحدود المدخلات قبل أن تبدأ أحداث دورة الحياة:
174+
175+
```
176+
EXECUTION_START → INPUT → FlowStartedEvent → flow methods execute → OUTPUT → EXECUTION_END → FlowFinishedEvent
177+
```
178+
179+
يحمل `FlowStartedEvent` المدخلات كما حسمتها الخطافات، وإعادة كتابة
180+
`inputs["id"]` داخل خطاف حدودي تعيد توجيه استعادة الحالة. يظهر الإجهاض عند
181+
`EXECUTION_START` مع ذلك كحدث `FlowStartedEvent` يتبعه `FlowFailedEvent`،
182+
ويُبثان عند الإجهاض مع الحمولة كما حسمتها الخطافات التي عملت قبله.
183+
184+
تعمل الخطافات في النقطة نفسها حسب ترتيب التسجيل، الخطافات العامة أولًا ثم
185+
الخطافات المحدودة بالـ Crew. تُبث القياسات (`HookDispatchedEvent`) مع كل
186+
إرسال.
187+
188+
## إدارة الخطافات في الاختبارات
189+
190+
```python
191+
from crewai.hooks import clear_all_hooks
192+
193+
clear_all_hooks() # Clears every point, including boundaries
194+
```
195+
196+
## وثائق ذات صلة
197+
198+
- [نظرة عامة على خطافات التنفيذ →](/edge/ar/learn/execution-hooks)
199+
- [خطافات استدعاء LLM →](/edge/ar/learn/llm-hooks)
200+
- [خطافات استدعاء الأدوات →](/edge/ar/learn/tool-hooks)

docs/edge/ar/telemetry.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ os.environ['OTEL_SDK_DISABLED'] = 'true'
6161
| نعم | سمات LLM | تشمل: الاسم، model_name، model، top_k، temperature، واسم فئة LLM. كلها بيانات تقنية غير شخصية. |
6262
| نعم | محاولة نشر الطاقم باستخدام CLI الخاص بـ CrewAI | تشمل: حقيقة إجراء النشر ومعرّف الطاقم، وما إذا كان يحاول سحب السجلات، لا بيانات أخرى. |
6363
| نعم | بيئة التنفيذ | تشمل: مساعد البرمجة بالذكاء الاصطناعي الذي يشغّل العملية إن وُجد (واحد من قائمة ثابتة مثل `claude_code` أو `codex` أو `cursor` أو `unknown`)، ومكان تشغيل العملية (واحد من قائمة ثابتة مثل `ci` أو `container` أو `serverless` أو `interactive`)، و`project_id` من ملف `pyproject.toml` عند ضبطه. يتحقق الاكتشاف فقط مما إذا كانت متغيرات البيئة المعروفة مضبوطة، ولا يقرأ قيمها أبدًا. لا بيانات شخصية. |
64+
| نعم | إشارات دورة حياة التدفق | تشمل: بدء التدفق، وما إذا اكتمل أو فشل، وما إذا فشلت إحدى دواله، وما إذا توقّف مؤقتًا لطلب إدخال أو ملاحظات بشرية، وما إذا كان البدء استئنافًا لتشغيل سابق، وما إذا فشلت دورة محادثة، ومدة تشغيل التدفق، وما إذا كان التدفق من التدفقات التي يشغّلها CrewAI داخليًا أم من كتابتك. يُسجَّل اسم التدفق، كما هو الحال بالفعل عند إنشاء التدفق وتنفيذه. لا تُسجَّل أبدًا أسماء الدوال أو رسائل الأخطاء أو حالة التدفق. لا بيانات شخصية. |
6465
| لا | بيانات الوكيل الموسّعة | تشمل: وصف الهدف، نص الخلفية، معرّف ملف موجهات i18n. يجب على المستخدمين التأكد من عدم تضمين معلومات شخصية في حقول النص. |
6566
| لا | معلومات المهمة التفصيلية | تشمل: وصف المهمة، وصف المخرجات المتوقعة، مراجع السياق. يجب على المستخدمين التأكد من عدم تضمين معلومات شخصية في هذه الحقول. |
6667
| لا | معلومات البيئة | تشمل: المنصة، الإصدار، النظام، الإصدار، وعدد وحدات المعالجة المركزية. مثال: 'Windows 10'، 'x86_64'. لا بيانات شخصية. |

0 commit comments

Comments
 (0)