Skip to content

Commit 835b791

Browse files
committed
Merge remote-tracking branch 'upstream/main' into fix/llm-routing-improvements
2 parents bf1d95b + bb477f8 commit 835b791

251 files changed

Lines changed: 38343 additions & 11893 deletions

File tree

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: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,16 @@ jobs:
6464
--ignore-vuln PYSEC-2025-197 \
6565
--ignore-vuln PYSEC-2025-210 \
6666
--ignore-vuln PYSEC-2026-139 \
67+
--ignore-vuln GHSA-rrmf-rvhw-rf47 \
6768
--ignore-vuln PYSEC-2025-211 \
6869
--ignore-vuln PYSEC-2025-212 \
6970
--ignore-vuln PYSEC-2025-213 \
7071
--ignore-vuln PYSEC-2025-214 \
7172
--ignore-vuln PYSEC-2025-215 \
7273
--ignore-vuln PYSEC-2025-216 \
7374
--ignore-vuln PYSEC-2025-217 \
74-
--ignore-vuln PYSEC-2025-218
75+
--ignore-vuln PYSEC-2025-218 \
76+
--ignore-vuln GHSA-f4j7-r4q5-qw2c
7577
# Ignored CVEs:
7678
# PYSEC-2024-277 - joblib 1.5.3: disputed; NumpyArrayWrapper only used with trusted caches
7779
# PYSEC-2026-89 - markdown 3.10.2: DoS via malformed HTML; fix 3.8.1 — already past, advisory range is stale
@@ -80,7 +82,11 @@ jobs:
8082
# PYSEC-2025-183 - pyjwt 2.12.1: disputed weak-encryption claim; key length is application-chosen
8183
# PYSEC-2025-189..197 - torch 2.11.0: memory-corruption/DoS in functions only reachable via untrusted models; no fix available
8284
# PYSEC-2025-210, PYSEC-2026-139 - torch 2.11.0: profiler/deserialization issues; no fix available
85+
# GHSA-rrmf-rvhw-rf47 - torch 2.11.0 (CVE-2025-3000, alias of PYSEC-2025-194): memory corruption in torch.jit.script, CVSS 1.9, local-only; affected <=2.12.0, no fix available. pip-audit reports it under the GHSA id so the PYSEC ignore above does not catch it.
8386
# PYSEC-2025-211..218 - transformers 5.5.4: deserialization/code injection via malicious model checkpoints; no fix available
87+
# GHSA-f4j7-r4q5-qw2c - chromadb 1.1.1 (CVE-2026-45829): pre-auth RCE via /api/v2/tenants/{tenant}/databases/{db}/collections when trust_remote_code=true.
88+
# Advisory: vulnerable >=1.0.0,<=1.5.9, firstPatchedVersion=none. We only use chromadb.PersistentClient (lib/crewai/src/crewai/rag/chromadb/factory.py)
89+
# and chromadb.utils.embedding_functions; the chromadb HTTP server is never started, so the vulnerable route is not exposed.
8490
continue-on-error: true
8591

8692
- name: Display results

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,5 @@ chromadb-*.lock
3131
blogs/*
3232
secrets/*
3333
UNKNOWN.egg-info/
34+
demos/*
35+
.crewai/*

.pre-commit-config.yaml

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,35 @@ repos:
2828
hooks:
2929
- id: pip-audit
3030
name: pip-audit
31-
entry: bash -c 'source .venv/bin/activate && uv run pip-audit --skip-editable --ignore-vuln CVE-2026-3219' --
31+
# Keep this ignore list in sync with .github/workflows/vulnerability-scan.yml.
32+
entry: >-
33+
bash -c 'source .venv/bin/activate && uv run pip-audit --skip-editable
34+
--ignore-vuln PYSEC-2024-277
35+
--ignore-vuln PYSEC-2026-89
36+
--ignore-vuln PYSEC-2026-97
37+
--ignore-vuln PYSEC-2025-148
38+
--ignore-vuln PYSEC-2025-183
39+
--ignore-vuln PYSEC-2025-189
40+
--ignore-vuln PYSEC-2025-190
41+
--ignore-vuln PYSEC-2025-191
42+
--ignore-vuln PYSEC-2025-192
43+
--ignore-vuln PYSEC-2025-193
44+
--ignore-vuln PYSEC-2025-194
45+
--ignore-vuln PYSEC-2025-195
46+
--ignore-vuln PYSEC-2025-196
47+
--ignore-vuln PYSEC-2025-197
48+
--ignore-vuln PYSEC-2025-210
49+
--ignore-vuln PYSEC-2026-139
50+
--ignore-vuln GHSA-rrmf-rvhw-rf47
51+
--ignore-vuln PYSEC-2025-211
52+
--ignore-vuln PYSEC-2025-212
53+
--ignore-vuln PYSEC-2025-213
54+
--ignore-vuln PYSEC-2025-214
55+
--ignore-vuln PYSEC-2025-215
56+
--ignore-vuln PYSEC-2025-216
57+
--ignore-vuln PYSEC-2025-217
58+
--ignore-vuln PYSEC-2025-218
59+
--ignore-vuln GHSA-f4j7-r4q5-qw2c' --
3260
language: system
3361
pass_filenames: false
3462
stages: [pre-push, manual]

conftest.py

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,99 @@
1111

1212
from dotenv import load_dotenv
1313
import pytest
14-
from vcr.request import Request # type: ignore[import-untyped]
14+
15+
16+
def _patch_vcrpy_aiohttp_compat() -> None:
17+
"""Keep vcrpy's aiohttp stub working under aiohttp 3.14.0.
18+
19+
aiohttp 3.14.0 (pulled in to fix GHSA-jg22-mg44-37j8 and GHSA-hg6j-4rv6-33pg):
20+
* removed ``aiohttp.streams.AsyncStreamReaderMixin`` (folded into ``StreamReader``),
21+
which vcrpy's ``MockStream`` still subclasses -- vcr's patch machinery then raises
22+
``AttributeError`` at collection time; and
23+
* added a required ``stream_writer`` keyword-only arg to ``ClientResponse.__init__``,
24+
which vcrpy's ``MockClientResponse`` does not pass -- raising ``TypeError`` at
25+
cassette playback.
26+
27+
Restore the mixin, then rebuild ``MockClientResponse``'s ``super().__init__`` call from
28+
the live ``ClientResponse`` signature (defaulting every required keyword-only arg to
29+
``None``, mirroring vcrpy's original call) so it also survives future aiohttp additions.
30+
"""
31+
import asyncio
32+
import inspect
33+
34+
from aiohttp import streams
35+
from aiohttp.client_reqrep import ClientResponse
36+
37+
if not hasattr(streams, "AsyncStreamReaderMixin"):
38+
39+
class AsyncStreamReaderMixin:
40+
__slots__ = ()
41+
42+
def __aiter__(self) -> streams.AsyncStreamIterator[bytes]:
43+
return streams.AsyncStreamIterator(self.readline) # type: ignore[attr-defined]
44+
45+
def iter_chunked(self, n: int) -> streams.AsyncStreamIterator[bytes]:
46+
return streams.AsyncStreamIterator(lambda: self.read(n)) # type: ignore[attr-defined]
47+
48+
def iter_any(self) -> streams.AsyncStreamIterator[bytes]:
49+
return streams.AsyncStreamIterator(self.readany) # type: ignore[attr-defined]
50+
51+
def iter_chunks(self) -> streams.ChunkTupleAsyncStreamIterator:
52+
return streams.ChunkTupleAsyncStreamIterator(self) # type: ignore[arg-type]
53+
54+
streams.AsyncStreamReaderMixin = AsyncStreamReaderMixin # type: ignore[attr-defined]
55+
56+
# Importing the stub builds MockStream/MockClientResponse, so it must run after the
57+
# mixin is restored above.
58+
import vcr.stubs.aiohttp_stubs as aiohttp_stubs # type: ignore[import-untyped]
59+
60+
if getattr(aiohttp_stubs.MockClientResponse, "_crewai_aiohttp_patched", False):
61+
return
62+
63+
keyword_only = [
64+
name
65+
for name, param in inspect.signature(ClientResponse.__init__).parameters.items()
66+
if param.kind is inspect.Parameter.KEYWORD_ONLY
67+
]
68+
69+
class _NullStreamWriter:
70+
# aiohttp 3.14.0 reads stream_writer.output_size in the "request already
71+
# sent" branch (writer is None), so None is not enough -- supply a stub.
72+
output_size = 0
73+
74+
fallback_loop: list[asyncio.AbstractEventLoop] = []
75+
76+
def _resolve_loop() -> asyncio.AbstractEventLoop:
77+
# MockClientResponse is normally built inside aiohttp's running loop, so
78+
# prefer that. In a sync context there is no running loop; avoid
79+
# asyncio.get_event_loop(), which on 3.12+ emits a DeprecationWarning
80+
# (and can RuntimeError) when no current loop is set. Use one cached
81+
# loop instead -- the mock only stores it and calls loop.get_debug().
82+
try:
83+
return asyncio.get_running_loop()
84+
except RuntimeError:
85+
if not fallback_loop:
86+
fallback_loop.append(asyncio.new_event_loop())
87+
return fallback_loop[0]
88+
89+
def _mock_client_response_init(
90+
self: Any, method: str, url: Any, request_info: Any = None
91+
) -> None:
92+
kwargs: dict[str, Any] = dict.fromkeys(keyword_only)
93+
kwargs["request_info"] = request_info
94+
if "loop" in kwargs:
95+
kwargs["loop"] = _resolve_loop()
96+
if "stream_writer" in kwargs:
97+
kwargs["stream_writer"] = _NullStreamWriter()
98+
ClientResponse.__init__(self, method, url, **kwargs)
99+
100+
aiohttp_stubs.MockClientResponse.__init__ = _mock_client_response_init
101+
aiohttp_stubs.MockClientResponse._crewai_aiohttp_patched = True
102+
103+
104+
_patch_vcrpy_aiohttp_compat()
105+
106+
from vcr.request import Request # type: ignore[import-untyped] # noqa: E402
15107

16108

17109
try:

docs/ar/changelog.mdx

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,210 @@ description: "تحديثات المنتج والتحسينات وإصلاحات
44
icon: "clock"
55
mode: "wide"
66
---
7+
<Update label="11 يونيو 2026">
8+
## v1.14.7
9+
10+
[عرض الإصدار على GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.14.7)
11+
12+
## ما الذي تغير
13+
14+
### الميزات
15+
- إضافة واجهات خلفية افتراضية قابلة للتوصيل للذاكرة، والمعرفة، وrag، وflow.
16+
- عرض السبب الحقيقي للإنهاء، ومعلمات العينة، وresponse.id في أحداث LLM.
17+
- تصنيف مشغلات DSL كزخارف واعية للمسار.
18+
- إضافة واجهة برمجة تطبيقات الدردشة لتدفقات المحادثة.
19+
- جعل واجهة القفل قابلة للتجاوز.
20+
- بناء FlowDefinition من بيانات التعريف الخاصة بـ Flow DSL.
21+
- إضافة مزود LLM من Snowflake Cortex الأصلي.
22+
- إضافة دعم لملفات الوكلاء المدربين من crew.
23+
24+
### إصلاحات الأخطاء
25+
- إصلاح نقطة التحقق لإعادة بناء BaseLLM مخصص كـ LLM ملموس عند الاستعادة.
26+
- تقييد الاستعادة على علامة لمنع اللقطات الحية من إعادة التشغيل كاستئناف.
27+
- تحديد حالة وقت التشغيل لكل تشغيل للحد من النمو وعزل التشغيل المتزامن.
28+
- إصلاح إعدادات التتبع على crewai-login.
29+
- احترام suppress_flow_events لأحداث تنفيذ الطريقة.
30+
- استعادة [project.scripts] في حزمة crewai لتثبيت أداة uv.
31+
- حل مشكلات CVE الخاصة بـ pip-audit لـ aiohttp وdocling وdocling-core.
32+
- إصلاح إدخال الملفات الذي لا يعمل بشكل موثوق.
33+
- إصلاح تاريخ نتائج أدوات Snowflake Claude غير المكتملة.
34+
35+
### الوثائق
36+
- تحديث سجل التغييرات والإصدار لـ v1.14.7.
37+
- تحديث وثائق جامع OpenTelemetry.
38+
- تحديث دليل NVIDIA Nemotron LLM.
39+
- إضافة دليل تكامل Databricks.
40+
- إضافة دليل تكامل Snowflake.
41+
42+
### الأداء
43+
- تحسين سرعة استيراد crewai من خلال تحميل مستندات docling بشكل كسول.
44+
45+
### إعادة الهيكلة
46+
- تبسيط تقييم شروط التدفق ليكون بلا حالة لكل حدث.
47+
- فصل منطق المحادثة عن وقت التشغيل وإضافة تعريف المحادثة.
48+
- تقسيم `flow.py` إلى DSL، وتعريف، ووقت تشغيل.
49+
50+
## المساهمون
51+
52+
@Luzk, @alex-clawd, @devin-ai-integration[bot], @greysonlalonde, @gvieira, @jessemiller, @lorenzejay, @lucasgomide, @mattatcha, @vinibrsl
53+
54+
</Update>
55+
56+
<Update label="10 يونيو 2026">
57+
## v1.14.7rc2
58+
59+
[عرض الإصدار على GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.14.7rc2)
60+
61+
## ما الذي تغير
62+
63+
### إصلاحات الأخطاء
64+
- استعادة البوابة على علامة لمنع اللقطات الحية من إعادة التشغيل كاستئناف
65+
66+
### الوثائق
67+
- تحديث سجل التغييرات والإصدار لـ v1.14.7rc1
68+
69+
## المساهمون
70+
71+
@greysonlalonde
72+
73+
</Update>
74+
75+
<Update label="10 يونيو 2026">
76+
## v1.14.7rc1
77+
78+
[عرض الإصدار على GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.14.7rc1)
79+
80+
## ما الذي تغير
81+
82+
### الميزات
83+
- إضافة `reset_runtime_state` لإطلاق حالة الحافلة المتراكمة
84+
- التعامل مع دعم كل من الموجهات المخصصة
85+
- فصل منطق المحادثة عن وقت التشغيل وإضافة `conversational_definition`
86+
87+
### إصلاحات الأخطاء
88+
- إصلاح نطاق حالة وقت التشغيل لكل تشغيل للحد من النمو وعزل التشغيلات المتزامنة
89+
- إصلاح إعدادات القياس عن بُعد على `crewai-login`
90+
- إصلاح احترام `suppress_flow_events` لفعاليات تنفيذ الأساليب
91+
92+
### الوثائق
93+
- تحديث صور OpenTelemetry
94+
- تحديث الوثائق لتعكس الحالة الجديدة لجمع بيانات OpenTelemetry
95+
- تحديث سجل التغييرات والإصدار لـ v1.14.7a4
96+
97+
### إعادة الهيكلة
98+
- تبسيط تقييم شرط التدفق ليكون بلا حالة لكل حدث
99+
- تحسين دورة توجيه المحادثة مع تقليل مسار واحد
100+
101+
## المساهمون
102+
103+
@greysonlalonde, @lorenzejay, @lucasgomide, @vinibrsl
104+
105+
</Update>
106+
107+
<Update label="9 يونيو 2026">
108+
## v1.14.7a4
109+
110+
[عرض الإصدار على GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.14.7a4)
111+
112+
## ما الذي تغير
113+
114+
### الميزات
115+
- نقل وقت التشغيل @listen/@router لقراءة من FlowDefinition
116+
- إضافة واجهات خلفية افتراضية قابلة للتوصيل للذاكرة، والمعرفة، وrag، وflow
117+
118+
### الوثائق
119+
- تحديث سجل التغييرات والإصدار لـ v1.14.7a3
120+
121+
## المساهمون
122+
123+
@greysonlalonde, @mattatcha, @vinibrsl
124+
125+
</Update>
126+
127+
<Update label="8 يونيو 2026">
128+
## v1.14.7a3
129+
130+
[عرض الإصدار على GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.14.7a3)
131+
132+
## ما الذي تغير
133+
134+
### إصلاحات الأخطاء
135+
- إصلاح تعرض `ask_for_human_input` في `AgentExecutor` التجريبي
136+
- حل مشكلات CVEs الخاصة بـ pip-audit لـ `aiohttp`، `docling`، `docling-core`، و `pip`
137+
138+
### إعادة هيكلة
139+
- نقل `@start` لقراءة من `FlowDefinition`
140+
141+
### الوثائق
142+
- تحديث سجل التغييرات والإصدار لـ v1.14.7a2
143+
144+
## المساهمون
145+
146+
@greysonlalonde، @lorenzejay، @vinibrsl
147+
148+
</Update>
149+
150+
<Update label="5 يونيو 2026">
151+
## v1.14.7a2
152+
153+
[عرض الإصدار على GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.14.7a2)
154+
155+
## ما الذي تغير
156+
157+
### الميزات
158+
- إضافة دعم تتبع تدفقات المحادثة.
159+
- تحديث وثائق تدفق المحادثة لاستخدام `handle_turn`.
160+
- عرض السبب الحقيقي لإنهاء المحادثة، ومعلمات العينة، و`response.id` في أحداث LLM.
161+
- تصنيف مشغلات DSL كزخارف واعية بالمسار.
162+
- تنفيذ واجهة برمجة التطبيقات للدردشة لتدفقات المحادثة.
163+
- جعل قفل الخلفية قابلاً للتجاوز في متجر القفل.
164+
- تقسيم أحادي تدفق DSL إلى وحدات زخرفية مركزة.
165+
- تسطيح استخدام ذاكرة التخزين المؤقت LiteLLM/أعداد الأسباب الفرعية في `_usage_to_dict`.
166+
- بناء `FlowDefinition` من بيانات التعريف الخاصة بتدفق DSL.
167+
168+
### الوثائق
169+
- إضافة دليل NVIDIA Nemotron LLM.
170+
- توثيق عمليات نشر المونوريبو.
171+
- تحديث سجل التغييرات والإصدار لـ v1.14.7a1.
172+
173+
## المساهمون
174+
175+
@alex-clawd, @gvieira, @lorenzejay, @lucasgomide, @mattatcha, @vinibrsl
176+
177+
</Update>
178+
179+
<Update label="3 يونيو 2026">
180+
## v1.14.7a1
181+
182+
[عرض الإصدار على GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.14.7a1)
183+
184+
## ما الذي تغير
185+
186+
### الميزات
187+
- إضافة دعم ملفات الوكلاء المدربين
188+
- إضافة مزود LLM الأصلي لـ Snowflake Cortex
189+
- إضافة دليل تكامل Databricks
190+
- إضافة دليل تكامل Snowflake
191+
192+
### إصلاحات الأخطاء
193+
- إصلاح CLI عن طريق استعادة `[project.scripts]` في حزمة crewai لتثبيت أداة UV
194+
- حل مشكلات موثوقية إدخال الملفات
195+
- إصلاح تاريخ نتائج الأدوات غير المكتملة في Snowflake Claude
196+
- التعامل مع استدعاءات الأدوات الممثلة كسلاسل لـ Snowflake Claude
197+
- إعادة تفعيل مستمعي `or_` متعدد المصادر عبر دورات مدفوعة بالموجه
198+
199+
### الأداء
200+
- تحسين سرعة استيراد crewai عن طريق تحميل استيرادات docling بشكل كسول
201+
202+
### إعادة هيكلة
203+
- تقسيم `flow.py` إلى DSL، تعريف، وتشغيل
204+
205+
## المساهمون
206+
207+
@Luzk, @alex-clawd, @devin-ai-integration[bot], @greysonlalonde, @jessemiller, @lorenzejay, @vinibrsl
208+
209+
</Update>
210+
7211
<Update label="28 مايو 2026">
8212
## v1.14.6
9213

0 commit comments

Comments
 (0)