Compare commits

..

2 Commits

Author SHA1 Message Date
Devin AI
84a9ecb86a style: apply ruff formatting to internal_instructor.py
Co-Authored-By: João <joao@crewai.com>
2026-04-01 10:55:42 +00:00
Devin AI
2ed6fa1b7d fix: forward base_url and api_key from LLM to instructor client
When using an OpenAI-compatible provider with a custom base_url (e.g.
vLLM, Ollama, or any self-hosted endpoint), the InternalInstructor was
silently discarding the base_url and sending structured output requests
to api.openai.com instead of the configured endpoint.

The fix adds a _get_llm_extra_kwargs() method that extracts base_url
and api_key from the LLM object and forwards them as kwargs to
instructor.from_provider(), which already supports these parameters.

Fixes #5204

Co-Authored-By: João <joao@crewai.com>
2026-04-01 10:53:07 +00:00
23 changed files with 271 additions and 729 deletions

View File

@@ -4,26 +4,6 @@ description: "تحديثات المنتج والتحسينات وإصلاحات
icon: "clock"
mode: "wide"
---
<Update label="1 أبريل 2026">
## v1.13.0a6
[عرض الإصدار على GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.13.0a6)
## ما الذي تغير
### الوثائق
- إصلاح مستويات أذونات RBAC لتتوافق مع خيارات واجهة المستخدم الفعلية (#5210)
- تحديث سجل التغييرات والإصدار لـ v1.13.0a5 (#5200)
### الأداء
- تقليل عبء العمل على الإطار من خلال تنفيذ حافلة أحداث كسولة وتجاوز التتبع عند تعطيله (#5187)
## المساهمون
@alex-clawd, @joaomdmoura, @lucasgomide
</Update>
<Update label="31 مارس 2026">
## v1.13.0a5

View File

@@ -7,13 +7,11 @@ mode: "wide"
## نظرة عامة
يتيح RBAC في CrewAI AMP إدارة وصول آمنة وقابلة للتوسع من خلال طبقتين:
1. **صلاحيات الميزات** — تتحكم في ما يمكن لكل دور القيام به عبر المنصة (إدارة، قراءة، أو بدون وصول)
2. **صلاحيات على مستوى الكيان** — وصول دقيق للأتمتات الفردية ومتغيرات البيئة واتصالات LLM ومستودعات Git
يتيح RBAC في CrewAI AMP إدارة وصول آمنة وقابلة للتوسع من خلال مزيج من الأدوار على مستوى المؤسسة وعناصر التحكم في الرؤية على مستوى الأتمتة.
<Frame>
<img src="/images/enterprise/users_and_roles.png" alt="نظرة عامة على RBAC في CrewAI AMP" />
</Frame>
## المستخدمون والأدوار
@@ -41,13 +39,6 @@ mode: "wide"
</Step>
</Steps>
### الأدوار المحددة مسبقاً
| الدور | الوصف |
| :---------- | :-------------------------------------------------------------------- |
| **Owner** | وصول كامل لجميع الميزات والإعدادات. لا يمكن تقييده. |
| **Member** | وصول للقراءة لمعظم الميزات، وصول إدارة لمتغيرات البيئة واتصالات LLM ومشاريع Studio. لا يمكنه تعديل إعدادات المؤسسة أو الإعدادات الافتراضية. |
### ملخص التهيئة
| المجال | مكان التهيئة | الخيارات |
@@ -55,80 +46,23 @@ mode: "wide"
| المستخدمون والأدوار | Settings → Roles | محددة مسبقاً: Owner، Member؛ أدوار مخصصة |
| رؤية الأتمتة | Automation → Settings → Visibility | خاص؛ قائمة بيضاء للمستخدمين/الأدوار |
---
## التحكم في الوصول على مستوى الأتمتة
## مصفوفة صلاحيات الميزات
بالإضافة إلى الأدوار على مستوى المؤسسة، تدعم أتمتات CrewAI إعدادات رؤية دقيقة تتيح لك تقييد الوصول إلى أتمتات محددة حسب المستخدم أو الدور.
لكل دور مستوى صلاحية لكل منطقة ميزة. المستويات الثلاثة هي:
- **إدارة (Manage)** — وصول كامل للقراءة/الكتابة (إنشاء، تعديل، حذف)
- **قراءة (Read)** — وصول للعرض فقط
- **بدون وصول (No access)** — الميزة مخفية/غير قابلة للوصول
| الميزة | Owner | Member (افتراضي) | المستويات المتاحة | الوصف |
| :------------------------ | :------ | :--------------- | :--------------------------------- | :-------------------------------------------------------------- |
| `usage_dashboards` | Manage | Read | Manage / Read / No access | عرض مقاييس وتحليلات الاستخدام |
| `crews_dashboards` | Manage | Read | Manage / Read / No access | عرض لوحات النشر والوصول إلى تفاصيل الأتمتة |
| `invitations` | Manage | Read | Manage / Read / No access | دعوة أعضاء جدد إلى المؤسسة |
| `training_ui` | Manage | Read | Manage / Read / No access | الوصول إلى واجهات التدريب/الضبط الدقيق |
| `tools` | Manage | Read | Manage / Read / No access | إنشاء وإدارة الأدوات |
| `agents` | Manage | Read | Manage / Read / No access | إنشاء وإدارة الوكلاء |
| `environment_variables` | Manage | Manage | Manage / No access | إنشاء وإدارة متغيرات البيئة |
| `llm_connections` | Manage | Manage | Manage / No access | تهيئة اتصالات مزودي LLM |
| `default_settings` | Manage | No access | Manage / No access | تعديل الإعدادات الافتراضية على مستوى المؤسسة |
| `organization_settings` | Manage | No access | Manage / No access | إدارة الفوترة والخطط وتهيئة المؤسسة |
| `studio_projects` | Manage | Manage | Manage / No access | إنشاء وتعديل المشاريع في Studio |
<Tip>
عند إنشاء دور مخصص، يمكن ضبط معظم الميزات على **Manage** أو **Read** أو **No access**. ومع ذلك، فإن `environment_variables` و`llm_connections` و`default_settings` و`organization_settings` و`studio_projects` تدعم فقط **Manage** أو **No access** — لا يوجد خيار للقراءة فقط لهذه الميزات.
</Tip>
---
## النشر من GitHub أو Zip
من أكثر أسئلة RBAC شيوعاً: _"ما الصلاحيات التي يحتاجها عضو الفريق للنشر؟"_
### النشر من GitHub
لنشر أتمتة من مستودع GitHub، يحتاج المستخدم إلى:
1. **`crews_dashboards`**: على الأقل `Read` — مطلوب للوصول إلى لوحة الأتمتات حيث يتم إنشاء عمليات النشر
2. **الوصول إلى مستودع Git** (إذا كان RBAC على مستوى الكيان لمستودعات Git مفعلاً): يجب منح دور المستخدم الوصول إلى مستودع Git المحدد عبر صلاحيات مستوى الكيان
3. **`studio_projects`: `Manage`** — إذا كان يبني الطاقم في Studio قبل النشر
### النشر من Zip
لنشر أتمتة من ملف Zip، يحتاج المستخدم إلى:
1. **`crews_dashboards`**: على الأقل `Read` — مطلوب للوصول إلى لوحة الأتمتات
2. **تفعيل نشر Zip**: يجب ألا تكون المؤسسة قد عطلت نشر Zip في إعدادات المؤسسة
### مرجع سريع: الحد الأدنى من الصلاحيات للنشر
| الإجراء | صلاحيات الميزات المطلوبة | متطلبات إضافية |
| :------------------- | :----------------------------------- | :----------------------------------------------- |
| النشر من GitHub | `crews_dashboards: Read` | وصول كيان مستودع Git (إذا كان Git RBAC مفعلاً) |
| النشر من Zip | `crews_dashboards: Read` | يجب تفعيل نشر Zip على مستوى المؤسسة |
| البناء في Studio | `studio_projects: Manage` | — |
| تهيئة مفاتيح LLM | `llm_connections: Manage` | — |
| ضبط متغيرات البيئة | `environment_variables: Manage` | وصول مستوى الكيان (إذا كان RBAC الكيان مفعلاً) |
---
## التحكم في الوصول على مستوى الأتمتة (صلاحيات الكيان)
بالإضافة إلى الأدوار على مستوى المؤسسة، يدعم CrewAI صلاحيات دقيقة على مستوى الكيان تقيد الوصول إلى موارد فردية.
### رؤية الأتمتة
تدعم الأتمتات إعدادات رؤية تقيد الوصول حسب المستخدم أو الدور. هذا مفيد لـ:
هذا مفيد لـ:
- الحفاظ على خصوصية الأتمتات الحساسة أو التجريبية
- إدارة الرؤية عبر الفرق الكبيرة أو المتعاونين الخارجيين
- اختبار الأتمتات في سياقات معزولة
يمكن تهيئة عمليات النشر كخاصة، مما يعني أن المستخدمين والأدوار المدرجين في القائمة البيضاء فقط سيتمكنون من التفاعل معها.
يمكن تهيئة عمليات النشر كخاصة، مما يعني أن المستخدمين والأدوار المدرجين في القائمة البيضاء فقط سيتمكنون من:
- عرض عملية النشر
- تشغيلها أو التفاعل مع API الخاص بها
- الوصول إلى سجلاتها ومقاييسها وإعداداتها
يتمتع مالك المؤسسة دائماً بالوصول، بغض النظر عن إعدادات الرؤية.
يمكنك تهيئة التحكم في الوصول على مستوى الأتمتة في Automation → Settings → علامة تبويب Visibility.
@@ -165,92 +99,9 @@ mode: "wide"
<Frame>
<img src="/images/enterprise/visibility.png" alt="إعدادات رؤية الأتمتة في CrewAI AMP" />
</Frame>
### أنواع صلاحيات النشر
عند منح وصول على مستوى الكيان لأتمتة محددة، يمكنك تعيين أنواع الصلاحيات التالية:
| الصلاحية | ما تسمح به |
| :------------------- | :-------------------------------------------------- |
| `run` | تنفيذ الأتمتة واستخدام API الخاص بها |
| `traces` | عرض تتبعات التنفيذ والسجلات |
| `manage_settings` | تعديل، إعادة نشر، استرجاع، أو حذف الأتمتة |
| `human_in_the_loop` | الرد على طلبات الإنسان في الحلقة (HITL) |
| `full_access` | جميع ما سبق |
### RBAC على مستوى الكيان لموارد أخرى
عند تفعيل RBAC على مستوى الكيان، يمكن أيضاً التحكم في الوصول لهذه الموارد حسب المستخدم أو الدور:
| المورد | يتم التحكم فيه بواسطة | الوصف |
| :-------------------- | :--------------------------------- | :------------------------------------------------------------- |
| متغيرات البيئة | علامة ميزة RBAC الكيان | تقييد أي الأدوار/المستخدمين يمكنهم عرض أو إدارة متغيرات بيئة محددة |
| اتصالات LLM | علامة ميزة RBAC الكيان | تقييد الوصول لتهيئات مزودي LLM محددة |
| مستودعات Git | إعداد RBAC لمستودعات Git بالمؤسسة | تقييد أي الأدوار/المستخدمين يمكنهم الوصول لمستودعات متصلة محددة |
---
## أنماط الأدوار الشائعة
بينما يأتي CrewAI بدوري Owner وMember، تستفيد معظم الفرق من إنشاء أدوار مخصصة. إليك الأنماط الشائعة:
### دور المطور
دور لأعضاء الفريق الذين يبنون وينشرون الأتمتات لكن لا يديرون إعدادات المؤسسة.
| الميزة | الصلاحية |
| :------------------------ | :---------- |
| `usage_dashboards` | Read |
| `crews_dashboards` | Manage |
| `invitations` | Read |
| `training_ui` | Read |
| `tools` | Manage |
| `agents` | Manage |
| `environment_variables` | Manage |
| `llm_connections` | Manage |
| `default_settings` | No access |
| `organization_settings` | No access |
| `studio_projects` | Manage |
### دور المشاهد / أصحاب المصلحة
دور للمعنيين غير التقنيين الذين يحتاجون لمراقبة الأتمتات وعرض النتائج.
| الميزة | الصلاحية |
| :------------------------ | :---------- |
| `usage_dashboards` | Read |
| `crews_dashboards` | Read |
| `invitations` | No access |
| `training_ui` | Read |
| `tools` | Read |
| `agents` | Read |
| `environment_variables` | No access |
| `llm_connections` | No access |
| `default_settings` | No access |
| `organization_settings` | No access |
| `studio_projects` | No access |
### دور مسؤول العمليات / المنصة
دور لمشغلي المنصة الذين يديرون إعدادات البنية التحتية لكن قد لا يبنون الوكلاء.
| الميزة | الصلاحية |
| :------------------------ | :---------- |
| `usage_dashboards` | Manage |
| `crews_dashboards` | Manage |
| `invitations` | Manage |
| `training_ui` | Read |
| `tools` | Read |
| `agents` | Read |
| `environment_variables` | Manage |
| `llm_connections` | Manage |
| `default_settings` | Manage |
| `organization_settings` | Read |
| `studio_projects` | No access |
---
<Card title="تحتاج مساعدة؟" icon="headset" href="mailto:support@crewai.com">
تواصل مع فريق الدعم للمساعدة في أسئلة RBAC.
</Card>

View File

@@ -4,26 +4,6 @@ description: "Product updates, improvements, and bug fixes for CrewAI"
icon: "clock"
mode: "wide"
---
<Update label="Apr 01, 2026">
## v1.13.0a6
[View release on GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.13.0a6)
## What's Changed
### Documentation
- Fix RBAC permission levels to match actual UI options (#5210)
- Update changelog and version for v1.13.0a5 (#5200)
### Performance
- Reduce framework overhead by implementing a lazy event bus and skipping tracing when disabled (#5187)
## Contributors
@alex-clawd, @joaomdmoura, @lucasgomide
</Update>
<Update label="Mar 31, 2026">
## v1.13.0a5

View File

@@ -46,7 +46,7 @@ You can configure users and roles in Settings → Roles.
| Role | Description |
| :--------- | :-------------------------------------------------------------------------- |
| **Owner** | Full access to all features and settings. Cannot be restricted. |
| **Member** | Read access to most features, manage access to environment variables, LLM connections, and Studio projects. Cannot modify organization or default settings. |
| **Member** | Read access to most features, manage access to Studio projects. Cannot modify organization or default settings. |
### Configuration summary
@@ -65,22 +65,22 @@ Every role has a permission level for each feature area. The three levels are:
- **Read** — view-only access
- **No access** — feature is hidden/inaccessible
| Feature | Owner | Member (default) | Available levels | Description |
| :------------------------ | :------ | :--------------- | :------------------------ | :-------------------------------------------------------------- |
| `usage_dashboards` | Manage | Read | Manage / Read / No access | View usage metrics and analytics |
| `crews_dashboards` | Manage | Read | Manage / Read / No access | View deployment dashboards, access automation details |
| `invitations` | Manage | Read | Manage / Read / No access | Invite new members to the organization |
| `training_ui` | Manage | Read | Manage / Read / No access | Access training/fine-tuning interfaces |
| `tools` | Manage | Read | Manage / Read / No access | Create and manage tools |
| `agents` | Manage | Read | Manage / Read / No access | Create and manage agents |
| `environment_variables` | Manage | Manage | Manage / No access | Create and manage environment variables |
| `llm_connections` | Manage | Manage | Manage / No access | Configure LLM provider connections |
| `default_settings` | Manage | No access | Manage / No access | Modify organization-wide default settings |
| `organization_settings` | Manage | No access | Manage / No access | Manage billing, plans, and organization configuration |
| `studio_projects` | Manage | Manage | Manage / No access | Create and edit projects in Studio |
| Feature | Owner | Member (default) | Description |
| :------------------------ | :------ | :--------------- | :-------------------------------------------------------------- |
| `usage_dashboards` | Manage | Read | View usage metrics and analytics |
| `crews_dashboards` | Manage | Read | View deployment dashboards, access automation details |
| `invitations` | Manage | Read | Invite new members to the organization |
| `training_ui` | Manage | Read | Access training/fine-tuning interfaces |
| `tools` | Manage | Read | Create and manage tools |
| `agents` | Manage | Read | Create and manage agents |
| `environment_variables` | Manage | Read | Create and manage environment variables |
| `llm_connections` | Manage | Read | Configure LLM provider connections |
| `default_settings` | Manage | No access | Modify organization-wide default settings |
| `organization_settings` | Manage | No access | Manage billing, plans, and organization configuration |
| `studio_projects` | Manage | Manage | Create and edit projects in Studio |
<Tip>
When creating a custom role, most features can be set to **Manage**, **Read**, or **No access**. However, `environment_variables`, `llm_connections`, `default_settings`, `organization_settings`, and `studio_projects` only support **Manage** or **No access** — there is no read-only option for these features.
When creating a custom role, you can set each feature independently to **Manage**, **Read**, or **No access** to match your team's needs.
</Tip>
---
@@ -208,7 +208,7 @@ A role for team members who build and deploy automations but don't manage organi
| `tools` | Manage |
| `agents` | Manage |
| `environment_variables` | Manage |
| `llm_connections` | Manage |
| `llm_connections` | Read |
| `default_settings` | No access |
| `organization_settings` | No access |
| `studio_projects` | Manage |
@@ -229,7 +229,7 @@ A role for non-technical stakeholders who need to monitor automations and view r
| `llm_connections` | No access |
| `default_settings` | No access |
| `organization_settings` | No access |
| `studio_projects` | No access |
| `studio_projects` | Read |
### Ops / Platform Admin Role
@@ -247,7 +247,7 @@ A role for platform operators who manage infrastructure settings but may not bui
| `llm_connections` | Manage |
| `default_settings` | Manage |
| `organization_settings` | Read |
| `studio_projects` | No access |
| `studio_projects` | Read |
---

View File

@@ -4,26 +4,6 @@ description: "CrewAI의 제품 업데이트, 개선 사항 및 버그 수정"
icon: "clock"
mode: "wide"
---
<Update label="2026년 4월 1일">
## v1.13.0a6
[GitHub 릴리스 보기](https://github.com/crewAIInc/crewAI/releases/tag/1.13.0a6)
## 변경 사항
### 문서
- 실제 UI 옵션에 맞게 RBAC 권한 수준 수정 (#5210)
- v1.13.0a5에 대한 변경 로그 및 버전 업데이트 (#5200)
### 성능
- 지연 이벤트 버스를 구현하고 비활성화 시 추적을 건너뛰어 프레임워크 오버헤드 감소 (#5187)
## 기여자
@alex-clawd, @joaomdmoura, @lucasgomide
</Update>
<Update label="2026년 3월 31일">
## v1.13.0a5

View File

@@ -1,260 +1,108 @@
---
title: "역할 기반 접근 제어 (RBAC)"
description: "역할, 범위, 세분화된 권한으로 crews, 도구, 데이터 접근을 제어합니다."
description: "역할과 자동화별 가시성으로 crews, 도구, 데이터 접근을 제어합니다."
icon: "shield"
mode: "wide"
---
## 개요
CrewAI AMP의 RBAC는 두 가지 계층을 통해 안전하고 확장 가능한 접근 관리를 제공합니다:
1. **기능 권한** — 플랫폼 전반에서 각 역할이 수행할 수 있는 작업을 제어합니다 (관리, 읽기 또는 접근 불가)
2. **엔티티 수준 권한** — 개별 자동화, 환경 변수, LLM 연결, Git 저장소에 대한 세분화된 접근 제어
CrewAI AOP의 RBAC는 **조직 수준 역할**과 **자동화(Automation) 수준 가시성**을 결합하여 안전하고 확장 가능한 접근 제어를 제공합니다.
<Frame>
<img src="/images/enterprise/users_and_roles.png" alt="CrewAI AMP RBAC 개요" />
</Frame>
## 사용자와 역할
CrewAI 워크스페이스의 각 구성원에게는 역할이 할당되며, 이를 통해 다양한 기능에 대한 접근 범위 결정니다.
워크스페이스의 각 구성원 역할이 있으며, 이는 기능 접근 범위 결정니다.
가능한 작업:
- 사전 정의된 역할 사용 (Owner, Member)
- 특정 권한에 맞춘 커스텀 역할 생성
- 설정 패널에서 언제든 역할 할당
- 권한을 세분화한 커스텀 역할 생성
- 설정 화면에서 언제든 역할 할당/변경
설정 위치: Settings → Roles
<Steps>
<Step title="Roles 설정 열기">
CrewAI AMP에서 <b>Settings → Roles</b>로 이동합니다.
<Step title="Roles 열기">
<b>Settings → Roles</b>로 이동합니다.
</Step>
<Step title="역할 유형 선택">
사전 정의된 역할(<b>Owner</b>, <b>Member</b>)을 사용하거나{" "}
<b>Create role</b>을 클릭하여 커스텀 역할을 만듭니다.
<Step title="역할 선택">
<b>Owner</b> 또는 <b>Member</b> 사용하거나 <b>Create role</b>로 커스텀
역할을 만듭니다.
</Step>
<Step title="멤버에 할당">
사용자 선택하 역할을 할당합니다. 언제든 변경할 수 있습니다.
사용자들을 선택하 역할을 지정합니다. 언제든 변경할 수 있습니다.
</Step>
</Steps>
### 사전 정의된 역할
| 역할 | 설명 |
| :--------- | :------------------------------------------------------------------- |
| **Owner** | 모든 기능 및 설정에 대한 전체 접근 권한. 제한할 수 없습니다. |
| **Member** | 대부분의 기능에 대한 읽기 접근, 환경 변수, LLM 연결, Studio 프로젝트에 대한 관리 접근. 조직 설정이나 기본 설정은 수정할 수 없습니다. |
### 구성 요약
| 영역 | 설정 위치 | 옵션 |
| 영역 | 위치 | 옵션 |
| :------------ | :--------------------------------- | :-------------------------------- |
| 사용자 & 역할 | Settings → Roles | 사전 정의: Owner, Member; 커스텀 역할 |
| 사용자 & 역할 | Settings → Roles | Owner, Member; 커스텀 역할 |
| 자동화 가시성 | Automation → Settings → Visibility | Private; 사용자/역할 화이트리스트 |
---
## 자동화 수준 접근 제어
## 기능 권한 매트릭스
조직 역할과 별개로, **Automations**는 사용자/역할별로 특정 자동화 접근을 제한하는 가시성 설정을 제공합니다.
각 역할에는 기능 영역별 권한 수준이 있습니다. 세 가지 수준은 다음과 같습니다:
유용한 경우:
- **Manage** — 전체 읽기/쓰기 접근 (생성, 편집, 삭제)
- **Read** — 읽기 전용 접근
- **No access** — 기능이 숨겨지거나 접근 불가
| 기능 | Owner | Member (기본값) | 사용 가능한 수준 | 설명 |
| :-------------------------- | :------ | :--------------- | :------------------------- | :------------------------------------------------------------- |
| `usage_dashboards` | Manage | Read | Manage / Read / No access | 사용 메트릭 및 분석 보기 |
| `crews_dashboards` | Manage | Read | Manage / Read / No access | 배포 대시보드 보기, 자동화 세부 정보 접근 |
| `invitations` | Manage | Read | Manage / Read / No access | 조직에 새 멤버 초대 |
| `training_ui` | Manage | Read | Manage / Read / No access | 훈련/파인튜닝 인터페이스 접근 |
| `tools` | Manage | Read | Manage / Read / No access | 도구 생성 및 관리 |
| `agents` | Manage | Read | Manage / Read / No access | 에이전트 생성 및 관리 |
| `environment_variables` | Manage | Manage | Manage / No access | 환경 변수 생성 및 관리 |
| `llm_connections` | Manage | Manage | Manage / No access | LLM 제공자 연결 구성 |
| `default_settings` | Manage | No access | Manage / No access | 조직 전체 기본 설정 수정 |
| `organization_settings` | Manage | No access | Manage / No access | 결제, 플랜 및 조직 구성 관리 |
| `studio_projects` | Manage | Manage | Manage / No access | Studio에서 프로젝트 생성 및 편집 |
<Tip>
커스텀 역할을 만들 때 대부분의 기능은 **Manage**, **Read** 또는 **No access**로 설정할 수 있습니다. 그러나 `environment_variables`, `llm_connections`, `default_settings`, `organization_settings`, `studio_projects`는 **Manage** 또는 **No access**만 지원합니다 — 이 기능들에는 읽기 전용 옵션이 없습니다.
</Tip>
---
## GitHub 또는 Zip에서 배포
가장 흔한 RBAC 질문 중 하나: _"팀원이 배포하려면 어떤 권한이 필요한가요?"_
### GitHub에서 배포
GitHub 저장소에서 자동화를 배포하려면 사용자에게 다음이 필요합니다:
1. **`crews_dashboards`**: 최소 `Read` — 배포가 생성되는 자동화 대시보드에 접근하는 데 필요
2. **Git 저장소 접근** (Git 저장소에 대한 엔티티 수준 RBAC가 활성화된 경우): 사용자의 역할에 엔티티 수준 권한을 통해 특정 Git 저장소에 대한 접근이 부여되어야 함
3. **`studio_projects`: `Manage`** — 배포 전에 Studio에서 crew를 빌드하는 경우
### Zip에서 배포
Zip 파일 업로드로 자동화를 배포하려면 사용자에게 다음이 필요합니다:
1. **`crews_dashboards`**: 최소 `Read` — 자동화 대시보드에 접근하는 데 필요
2. **Zip 배포 활성화**: 조직이 조직 설정에서 Zip 배포를 비활성화하지 않아야 함
### 빠른 참조: 배포에 필요한 최소 권한
| 작업 | 필요한 기능 권한 | 추가 요구사항 |
| :------------------- | :----------------------------------- | :----------------------------------------------- |
| GitHub에서 배포 | `crews_dashboards: Read` | Git 저장소 엔티티 접근 (Git RBAC 활성화 시) |
| Zip에서 배포 | `crews_dashboards: Read` | 조직 수준에서 Zip 배포가 활성화되어야 함 |
| Studio에서 빌드 | `studio_projects: Manage` | — |
| LLM 키 구성 | `llm_connections: Manage` | — |
| 환경 변수 설정 | `environment_variables: Manage` | 엔티티 수준 접근 (엔티티 RBAC 활성화 시) |
---
## 자동화 수준 접근 제어 (엔티티 권한)
조직 전체 역할 외에도, CrewAI는 개별 리소스에 대한 접근을 제한하는 세분화된 엔티티 수준 권한을 지원합니다.
### 자동화 가시성
자동화는 사용자 또는 역할별로 접근을 제한하는 가시성 설정을 지원합니다. 다음과 같은 경우에 유용합니다:
- 민감하거나 실험적인 자동화를 비공개로 유지
- 대규모 팀이나 외부 협업자의 가시성 관리
- 민감/실험 자동화를 비공개로 유지
- 대규모 팀/외부 협업에서 가시성 관리
- 격리된 컨텍스트에서 자동화 테스트
배포를 비공개로 구성할 수 있으며, 이 경우 화이트리스트에 포함된 사용자역할만 상호작용할 수 있습니다.
Private 모드에서는 화이트리스트에 포함된 사용자/역할만 다음 작업이 가능합니다:
설정 위치: Automation → Settings → Visibility 탭
- 자동화 보기
- 실행/API 사용
- 로그, 메트릭, 설정 접근
조직 Owner는 항상 접근 가능하며, 가시성 설정에 영향을 받지 않습니다.
설정 위치: Automation → Settings → Visibility
<Steps>
<Step title="Visibility 탭 열기">
<b>Automation → Settings → Visibility</b>로 이동합니다.
</Step>
<Step title="가시성 설정">
접근을 제한하려면 <b>Private</b>를 선택합니다. 조직 Owner는 항상
접근 권한을 유지합니다.
<b>Private</b>를 선택합니다. Owner는 항상 접근 가능합니다.
</Step>
<Step title="접근 허용 대상 추가">
보기, 실행, 로그/메트릭/설정 접근이 허용된 특정 사용자역할을
추가합니다.
<Step title="허용 대상 추가">
보기/실행/로그·메트릭·설정 접근이 가능한 사용자/역할을 추가합니다.
</Step>
<Step title="저장 및 확인">
변경 사항을 저장 후, 화이트리스트에 없는 사용자가 자동화를 보거나 실행할 수
없는지 확인합니다.
저장 후, 목록에 없는 사용자가 보거나 실행할 수 없는지 확인합니다.
</Step>
</Steps>
### Private 가시성: 접근 결과
### Private 모드 접근 결과
| 동작 | Owner | 화이트리스트 사용자/역할 | 비포함 |
| :--------------------- | :---- | :----------------------- | :----- |
| 자동화 보기 | ✓ | ✓ | ✗ |
| 자동화/API 실행 | ✓ | ✓ | ✗ |
| 로그/메트릭/설정 접근 | ✓ | ✓ | ✗ |
| 동작 | Owner | 화이트리스트 사용자/역할 | 비포함 |
| :--------------- | :---- | :----------------------- | :----- |
| 자동화 보기 | ✓ | ✓ | ✗ |
| 실행/API | ✓ | ✓ | ✗ |
| 로그/메트릭/설정 | ✓ | ✓ | ✗ |
<Tip>
조직 Owner는 항상 접근 권한이 있습니다. Private 모드에서는 화이트리스트에 포함된
사용자/역할만 보기, 실행, 로그/메트릭/설정에 접근할 수 있습니다.
Owner는 항상 접근 가능하며, Private 모드에서는 화이트리스트에 포함된
사용자/역할만 권한이 부여됩니다.
</Tip>
<Frame>
<img src="/images/enterprise/visibility.png" alt="CrewAI AMP 자동화 가시성 설정" />
<img src="/images/enterprise/visibility.png" alt="CrewAI AMP 가시성 설정" />
</Frame>
### 배포 권한 유형
특정 자동화에 엔티티 수준 접근을 부여할 때 다음 권한 유형을 할당할 수 있습니다:
| 권한 | 허용 범위 |
| :------------------- | :-------------------------------------------------- |
| `run` | 자동화 실행 및 API 사용 |
| `traces` | 실행 트레이스 및 로그 보기 |
| `manage_settings` | 자동화 편집, 재배포, 롤백 또는 삭제 |
| `human_in_the_loop` | HITL(human-in-the-loop) 요청에 응답 |
| `full_access` | 위의 모든 권한 |
### 기타 리소스에 대한 엔티티 수준 RBAC
엔티티 수준 RBAC가 활성화되면 다음 리소스에 대한 접근도 사용자 또는 역할별로 제어할 수 있습니다:
| 리소스 | 제어 방식 | 설명 |
| :----------------- | :---------------------------------- | :------------------------------------------------------------ |
| 환경 변수 | 엔티티 RBAC 기능 플래그 | 특정 환경 변수를 보거나 관리할 수 있는 역할/사용자 제한 |
| LLM 연결 | 엔티티 RBAC 기능 플래그 | 특정 LLM 제공자 구성에 대한 접근 제한 |
| Git 저장소 | Git 저장소 RBAC 조직 설정 | 특정 연결된 저장소에 접근할 수 있는 역할/사용자 제한 |
---
## 일반적인 역할 패턴
CrewAI는 Owner와 Member 역할을 기본 제공하지만, 대부분의 팀은 커스텀 역할을 만들어 활용합니다. 일반적인 패턴은 다음과 같습니다:
### Developer 역할
자동화를 빌드하고 배포하지만 조직 설정을 관리하지 않는 팀원을 위한 역할입니다.
| 기능 | 권한 |
| :-------------------------- | :---------- |
| `usage_dashboards` | Read |
| `crews_dashboards` | Manage |
| `invitations` | Read |
| `training_ui` | Read |
| `tools` | Manage |
| `agents` | Manage |
| `environment_variables` | Manage |
| `llm_connections` | Manage |
| `default_settings` | No access |
| `organization_settings` | No access |
| `studio_projects` | Manage |
### Viewer / Stakeholder 역할
자동화를 모니터링하고 결과를 확인해야 하는 비기술 이해관계자를 위한 역할입니다.
| 기능 | 권한 |
| :-------------------------- | :---------- |
| `usage_dashboards` | Read |
| `crews_dashboards` | Read |
| `invitations` | No access |
| `training_ui` | Read |
| `tools` | Read |
| `agents` | Read |
| `environment_variables` | No access |
| `llm_connections` | No access |
| `default_settings` | No access |
| `organization_settings` | No access |
| `studio_projects` | No access |
### Ops / Platform Admin 역할
인프라 설정을 관리하지만 에이전트를 빌드하지 않을 수 있는 플랫폼 운영자를 위한 역할입니다.
| 기능 | 권한 |
| :-------------------------- | :---------- |
| `usage_dashboards` | Manage |
| `crews_dashboards` | Manage |
| `invitations` | Manage |
| `training_ui` | Read |
| `tools` | Read |
| `agents` | Read |
| `environment_variables` | Manage |
| `llm_connections` | Manage |
| `default_settings` | Manage |
| `organization_settings` | Read |
| `studio_projects` | No access |
---
<Card
title="도움이 필요하신가요?"
icon="headset"
href="mailto:support@crewai.com"
>
RBAC 관련 질문은 지원팀에 문의해 주세요.
RBAC 구성과 점검에 대한 지원이 필요하면 연락해 주세요.
</Card>

View File

@@ -4,26 +4,6 @@ description: "Atualizações de produto, melhorias e correções do CrewAI"
icon: "clock"
mode: "wide"
---
<Update label="01 abr 2026">
## v1.13.0a6
[Ver release no GitHub](https://github.com/crewAIInc/crewAI/releases/tag/1.13.0a6)
## O que Mudou
### Documentação
- Corrigir níveis de permissão RBAC para corresponder às opções reais da interface do usuário (#5210)
- Atualizar changelog e versão para v1.13.0a5 (#5200)
### Desempenho
- Reduzir a sobrecarga do framework implementando um barramento de eventos preguiçoso e pulando o rastreamento quando desativado (#5187)
## Contributors
@alex-clawd, @joaomdmoura, @lucasgomide
</Update>
<Update label="31 mar 2026">
## v1.13.0a5

View File

@@ -1,24 +1,22 @@
---
title: "Controle de Acesso Baseado em Funções (RBAC)"
description: "Controle o acesso a crews, ferramentas e dados com funções, escopos e permissões granulares."
description: "Controle o acesso a crews, ferramentas e dados com funções e visibilidade por automação."
icon: "shield"
mode: "wide"
---
## Visão Geral
O RBAC no CrewAI AMP permite gerenciamento de acesso seguro e escalável através de duas camadas:
1. **Permissões de funcionalidade** — controlam o que cada função pode fazer na plataforma (gerenciar, ler ou sem acesso)
2. **Permissões em nível de entidade** — acesso granular em automações individuais, variáveis de ambiente, conexões LLM e repositórios Git
O RBAC no CrewAI AMP permite gerenciar acesso de forma segura e escalável combinando **funções em nível de organização** com **controles de visibilidade em nível de automação**.
<Frame>
<img src="/images/enterprise/users_and_roles.png" alt="Visão geral de RBAC no CrewAI AMP" />
</Frame>
## Usuários e Funções
Cada membro da sua workspace CrewAI recebe uma função, que determina seu acesso aos diversos recursos.
Cada membro da sua workspace possui uma função, que determina o acesso aos recursos.
Você pode:
@@ -33,21 +31,14 @@ A configuração de usuários e funções é feita em Settings → Roles.
Vá em <b>Settings → Roles</b> no CrewAI AMP.
</Step>
<Step title="Escolher a função">
Use uma função pré-definida (<b>Owner</b>, <b>Member</b>) ou clique em{" "}
<b>Create role</b> para criar uma personalizada.
Use <b>Owner</b> ou <b>Member</b>, ou clique em <b>Create role</b> para
criar uma função personalizada.
</Step>
<Step title="Atribuir aos membros">
Selecione os usuários e atribua a função. Você pode alterar depois.
</Step>
</Steps>
### Funções Pré-definidas
| Função | Descrição |
| :--------- | :------------------------------------------------------------------------ |
| **Owner** | Acesso total a todas as funcionalidades e configurações. Não pode ser restrito. |
| **Member** | Acesso de leitura à maioria das funcionalidades, acesso de gerenciamento a variáveis de ambiente, conexões LLM e projetos Studio. Não pode modificar configurações da organização ou padrões. |
### Resumo de configuração
| Área | Onde configurar | Opções |
@@ -55,93 +46,35 @@ A configuração de usuários e funções é feita em Settings → Roles.
| Usuários & Funções | Settings → Roles | Pré-definidas: Owner, Member; Funções personalizadas |
| Visibilidade da automação | Automation → Settings → Visibility | Private; Lista de usuários/funções |
---
## Controle de Acesso em Nível de Automação
## Matriz de Permissões de Funcionalidades
Além das funções na organização, as **Automations** suportam visibilidade refinada para restringir acesso por usuário ou função.
Cada função possui um nível de permissão para cada área de funcionalidade. Os três níveis são:
Útil para:
- **Manage** — acesso total de leitura/escrita (criar, editar, excluir)
- **Read** — acesso somente leitura
- **No access** — funcionalidade oculta/inacessível
| Funcionalidade | Owner | Member (padrão) | Níveis disponíveis | Descrição |
| :------------------------ | :------ | :--------------- | :------------------------ | :-------------------------------------------------------------- |
| `usage_dashboards` | Manage | Read | Manage / Read / No access | Visualizar métricas e análises de uso |
| `crews_dashboards` | Manage | Read | Manage / Read / No access | Visualizar dashboards de deploy, acessar detalhes de automações |
| `invitations` | Manage | Read | Manage / Read / No access | Convidar novos membros para a organização |
| `training_ui` | Manage | Read | Manage / Read / No access | Acessar interfaces de treinamento/fine-tuning |
| `tools` | Manage | Read | Manage / Read / No access | Criar e gerenciar ferramentas |
| `agents` | Manage | Read | Manage / Read / No access | Criar e gerenciar agentes |
| `environment_variables` | Manage | Manage | Manage / No access | Criar e gerenciar variáveis de ambiente |
| `llm_connections` | Manage | Manage | Manage / No access | Configurar conexões de provedores LLM |
| `default_settings` | Manage | No access | Manage / No access | Modificar configurações padrão da organização |
| `organization_settings` | Manage | No access | Manage / No access | Gerenciar cobrança, planos e configuração da organização |
| `studio_projects` | Manage | Manage | Manage / No access | Criar e editar projetos no Studio |
<Tip>
Ao criar uma função personalizada, a maioria das funcionalidades pode ser definida como **Manage**, **Read** ou **No access**. No entanto, `environment_variables`, `llm_connections`, `default_settings`, `organization_settings` e `studio_projects` suportam apenas **Manage** ou **No access** — não há opção somente leitura para essas funcionalidades.
</Tip>
---
## Deploy via GitHub ou Zip
Uma das perguntas mais comuns sobre RBAC é: _"Quais permissões um membro da equipe precisa para fazer deploy?"_
### Deploy via GitHub
Para fazer deploy de uma automação a partir de um repositório GitHub, o usuário precisa de:
1. **`crews_dashboards`**: pelo menos `Read` — necessário para acessar o dashboard de automações onde os deploys são criados
2. **Acesso ao repositório Git** (se RBAC em nível de entidade para repositórios Git estiver habilitado): a função do usuário deve ter acesso ao repositório Git específico via permissões de entidade
3. **`studio_projects`: `Manage`** — se estiver construindo o crew no Studio antes do deploy
### Deploy via Zip
Para fazer deploy de uma automação via upload de arquivo Zip, o usuário precisa de:
1. **`crews_dashboards`**: pelo menos `Read` — necessário para acessar o dashboard de automações
2. **Deploys via Zip habilitados**: a organização não deve ter desabilitado deploys via Zip nas configurações da organização
### Referência Rápida: Permissões Mínimas para Deploy
| Ação | Permissões de funcionalidade necessárias | Requisitos adicionais |
| :------------------------- | :--------------------------------------- | :------------------------------------------------ |
| Deploy via GitHub | `crews_dashboards: Read` | Acesso à entidade do repositório Git (se habilitado) |
| Deploy via Zip | `crews_dashboards: Read` | Deploys via Zip devem estar habilitados na organização |
| Construir no Studio | `studio_projects: Manage` | — |
| Configurar chaves LLM | `llm_connections: Manage` | — |
| Definir variáveis de ambiente | `environment_variables: Manage` | Acesso em nível de entidade (se habilitado) |
---
## Controle de Acesso em Nível de Automação (Permissões de Entidade)
Além das funções em nível de organização, o CrewAI suporta permissões granulares em nível de entidade que restringem o acesso a recursos individuais.
### Visibilidade da Automação
Automações suportam configurações de visibilidade que restringem acesso por usuário ou função. Útil para:
- Manter automações sensíveis ou experimentais privadas
- Manter automações sensíveis/experimentais privadas
- Gerenciar visibilidade em equipes grandes ou colaboradores externos
- Testar automações em contexto isolado
Deploys podem ser configurados como privados, significando que apenas usuários e funções na whitelist poderão interagir com eles.
Em modo privado, somente usuários/funções na whitelist poderão:
Configure em Automation → Settings → aba Visibility.
- Ver a automação
- Executar/usar a API
- Acessar logs, métricas e configurações
O owner da organização sempre tem acesso, independente da visibilidade.
Configure em Automation → Settings → Visibility.
<Steps>
<Step title="Abrir a aba Visibility">
Acesse <b>Automation → Settings → Visibility</b>.
</Step>
<Step title="Definir visibilidade">
Selecione <b>Private</b> para restringir o acesso. O owner da organização
mantém acesso sempre.
Selecione <b>Private</b> para restringir o acesso. O owner mantém acesso.
</Step>
<Step title="Permitir acesso">
Adicione usuários e funções que poderão ver, executar e acessar
Adicione usuários e funções que poderão ver/executar e acessar
logs/métricas/configurações.
</Step>
<Step title="Salvar e verificar">
@@ -164,92 +97,9 @@ Configure em Automation → Settings → aba Visibility.
<Frame>
<img src="/images/enterprise/visibility.png" alt="Configuração de visibilidade no CrewAI AMP" />
</Frame>
### Tipos de Permissão de Deploy
Ao conceder acesso em nível de entidade a uma automação específica, você pode atribuir estes tipos de permissão:
| Permissão | O que permite |
| :------------------- | :-------------------------------------------------- |
| `run` | Executar a automação e usar sua API |
| `traces` | Visualizar traces de execução e logs |
| `manage_settings` | Editar, reimplantar, reverter ou excluir a automação |
| `human_in_the_loop` | Responder a solicitações human-in-the-loop (HITL) |
| `full_access` | Todos os anteriores |
### RBAC em Nível de Entidade para Outros Recursos
Quando o RBAC em nível de entidade está habilitado, o acesso a estes recursos também pode ser controlado por usuário ou função:
| Recurso | Controlado por | Descrição |
| :--------------------- | :------------------------------------- | :------------------------------------------------------------- |
| Variáveis de ambiente | Flag de funcionalidade RBAC de entidade | Restringir quais funções/usuários podem ver ou gerenciar variáveis específicas |
| Conexões LLM | Flag de funcionalidade RBAC de entidade | Restringir acesso a configurações de provedores LLM específicos |
| Repositórios Git | Configuração RBAC de repositórios Git | Restringir quais funções/usuários podem acessar repositórios conectados específicos |
---
## Padrões Comuns de Funções
Embora o CrewAI venha com as funções Owner e Member, a maioria das equipes se beneficia da criação de funções personalizadas. Aqui estão os padrões comuns:
### Função Developer
Uma função para membros da equipe que constroem e fazem deploy de automações, mas não gerenciam configurações da organização.
| Funcionalidade | Permissão |
| :------------------------ | :--------- |
| `usage_dashboards` | Read |
| `crews_dashboards` | Manage |
| `invitations` | Read |
| `training_ui` | Read |
| `tools` | Manage |
| `agents` | Manage |
| `environment_variables` | Manage |
| `llm_connections` | Manage |
| `default_settings` | No access |
| `organization_settings` | No access |
| `studio_projects` | Manage |
### Função Viewer / Stakeholder
Uma função para stakeholders não técnicos que precisam monitorar automações e visualizar resultados.
| Funcionalidade | Permissão |
| :------------------------ | :--------- |
| `usage_dashboards` | Read |
| `crews_dashboards` | Read |
| `invitations` | No access |
| `training_ui` | Read |
| `tools` | Read |
| `agents` | Read |
| `environment_variables` | No access |
| `llm_connections` | No access |
| `default_settings` | No access |
| `organization_settings` | No access |
| `studio_projects` | No access |
### Função Ops / Platform Admin
Uma função para operadores de plataforma que gerenciam configurações de infraestrutura, mas podem não construir agentes.
| Funcionalidade | Permissão |
| :------------------------ | :--------- |
| `usage_dashboards` | Manage |
| `crews_dashboards` | Manage |
| `invitations` | Manage |
| `training_ui` | Read |
| `tools` | Read |
| `agents` | Read |
| `environment_variables` | Manage |
| `llm_connections` | Manage |
| `default_settings` | Manage |
| `organization_settings` | Read |
| `studio_projects` | No access |
---
<Card title="Precisa de Ajuda?" icon="headset" href="mailto:support@crewai.com">
Fale com o nosso time para suporte em configuração de RBAC.
Fale com o nosso time para suporte em configuração e auditoria de RBAC.
</Card>

View File

@@ -152,4 +152,4 @@ __all__ = [
"wrap_file_source",
]
__version__ = "1.13.0a6"
__version__ = "1.13.0a5"

View File

@@ -11,7 +11,7 @@ dependencies = [
"pytube~=15.0.0",
"requests~=2.32.5",
"docker~=7.1.0",
"crewai==1.13.0a6",
"crewai==1.13.0a5",
"tiktoken~=0.8.0",
"beautifulsoup4~=4.13.4",
"python-docx~=1.2.0",

View File

@@ -309,4 +309,4 @@ __all__ = [
"ZapierActionTools",
]
__version__ = "1.13.0a6"
__version__ = "1.13.0a5"

View File

@@ -54,7 +54,7 @@ Repository = "https://github.com/crewAIInc/crewAI"
[project.optional-dependencies]
tools = [
"crewai-tools==1.13.0a6",
"crewai-tools==1.13.0a5",
]
embeddings = [
"tiktoken~=0.8.0"

View File

@@ -44,7 +44,7 @@ def _suppress_pydantic_deprecation_warnings() -> None:
_suppress_pydantic_deprecation_warnings()
__version__ = "1.13.0a6"
__version__ = "1.13.0a5"
_telemetry_submitted = False

View File

@@ -5,7 +5,7 @@ description = "{{name}} using crewAI"
authors = [{ name = "Your Name", email = "you@example.com" }]
requires-python = ">=3.10,<3.14"
dependencies = [
"crewai[tools]==1.13.0a6"
"crewai[tools]==1.13.0a5"
]
[project.scripts]

View File

@@ -5,7 +5,7 @@ description = "{{name}} using crewAI"
authors = [{ name = "Your Name", email = "you@example.com" }]
requires-python = ">=3.10,<3.14"
dependencies = [
"crewai[tools]==1.13.0a6"
"crewai[tools]==1.13.0a5"
]
[project.scripts]

View File

@@ -5,7 +5,7 @@ description = "Power up your crews with {{folder_name}}"
readme = "README.md"
requires-python = ">=3.10,<3.14"
dependencies = [
"crewai[tools]==1.13.0a6"
"crewai[tools]==1.13.0a5"
]
[tool.crewai]

View File

@@ -85,8 +85,6 @@ class CrewAIEventsBus:
_shutting_down: bool
_pending_futures: set[Future[Any]]
_futures_lock: threading.Lock
_executor_initialized: bool
_has_pending_events: bool
def __new__(cls) -> Self:
"""Create or return the singleton instance.
@@ -104,9 +102,8 @@ class CrewAIEventsBus:
def _initialize(self) -> None:
"""Initialize the event bus internal state.
Creates handler dictionaries. The thread pool executor and event loop
are lazily initialized on first emit() to avoid overhead when events
are never emitted.
Creates handler dictionaries and starts a dedicated background
event loop for async handler execution.
"""
self._shutting_down = False
self._rwlock = RWLock()
@@ -118,37 +115,19 @@ class CrewAIEventsBus:
type[BaseEvent], dict[Handler, list[Depends[Any]]]
] = {}
self._execution_plan_cache: dict[type[BaseEvent], ExecutionPlan] = {}
self._sync_executor = ThreadPoolExecutor(
max_workers=10,
thread_name_prefix="CrewAISyncHandler",
)
self._console = ConsoleFormatter()
# Lazy initialization flags - executor and loop created on first emit
self._executor_initialized = False
self._has_pending_events = False
def _ensure_executor_initialized(self) -> None:
"""Lazily initialize the thread pool executor and event loop.
Called on first emit() to avoid startup overhead when events are never used.
Thread-safe via double-checked locking.
"""
if self._executor_initialized:
return
with self._instance_lock:
if self._executor_initialized:
return
self._sync_executor = ThreadPoolExecutor(
max_workers=10,
thread_name_prefix="CrewAISyncHandler",
)
self._loop = asyncio.new_event_loop()
self._loop_thread = threading.Thread(
target=self._run_loop,
name="CrewAIEventsLoop",
daemon=True,
)
self._loop_thread.start()
self._executor_initialized = True
self._loop = asyncio.new_event_loop()
self._loop_thread = threading.Thread(
target=self._run_loop,
name="CrewAIEventsLoop",
daemon=True,
)
self._loop_thread.start()
def _track_future(self, future: Future[Any]) -> Future[Any]:
"""Track a future and set up automatic cleanup when it completes.
@@ -452,15 +431,6 @@ class CrewAIEventsBus:
sync_handlers = self._sync_handlers.get(event_type, frozenset())
async_handlers = self._async_handlers.get(event_type, frozenset())
# Skip executor initialization if no handlers exist for this event
if not sync_handlers and not async_handlers:
return None
# Lazily initialize executor and event loop only when handlers exist
self._ensure_executor_initialized()
# Track that we have pending events for flush optimization
self._has_pending_events = True
if has_dependencies:
return self._track_future(
asyncio.run_coroutine_threadsafe(
@@ -504,10 +474,6 @@ class CrewAIEventsBus:
Returns:
True if all handlers completed, False if timeout occurred.
"""
# Skip flush entirely if no events were ever emitted
if not self._has_pending_events:
return True
with self._futures_lock:
futures_to_wait = list(self._pending_futures)
@@ -663,9 +629,6 @@ class CrewAIEventsBus:
with self._rwlock.w_locked():
self._shutting_down = True
# Check if executor was ever initialized (lazy init optimization)
if not self._executor_initialized:
return
loop = getattr(self, "_loop", None)
if loop is None or loop.is_closed():

View File

@@ -17,10 +17,7 @@ from crewai.events.listeners.tracing.first_time_trace_handler import (
from crewai.events.listeners.tracing.trace_batch_manager import TraceBatchManager
from crewai.events.listeners.tracing.types import TraceEvent
from crewai.events.listeners.tracing.utils import (
is_tracing_enabled_in_context,
safe_serialize_to_dict,
should_auto_collect_first_time_traces,
should_enable_tracing,
)
from crewai.events.types.a2a_events import (
A2AAgentCardFetchedEvent,
@@ -201,17 +198,6 @@ class TraceCollectionListener(BaseEventListener):
if self._listeners_setup:
return
# Skip registration entirely if tracing is disabled and not first-time user
# This avoids overhead of 50+ handler registrations when tracing won't be used
# Also check is_tracing_enabled_in_context() so per-run overrides (Crew(tracing=True)) still work
if (
not should_enable_tracing()
and not is_tracing_enabled_in_context()
and not should_auto_collect_first_time_traces()
):
self._listeners_setup = True
return
self._register_env_event_handlers(crewai_event_bus)
self._register_flow_event_handlers(crewai_event_bus)
self._register_context_event_handlers(crewai_event_bus)

View File

@@ -481,26 +481,6 @@ def should_auto_collect_first_time_traces() -> bool:
return is_first_execution()
def _is_interactive_terminal() -> bool:
"""Check if stdin is an interactive terminal.
Returns False in non-interactive contexts (CI, API servers, Docker, etc.)
to avoid blocking on prompts that no one can respond to.
"""
import sys
try:
stdin = getattr(sys, "stdin", None)
if stdin is None:
return False
isatty = getattr(stdin, "isatty", None)
if not callable(isatty):
return False
return bool(isatty())
except Exception:
return False
def prompt_user_for_trace_viewing(timeout_seconds: int = 20) -> bool:
"""
Prompt user if they want to see their traces with timeout.
@@ -512,11 +492,6 @@ def prompt_user_for_trace_viewing(timeout_seconds: int = 20) -> bool:
if should_suppress_tracing_messages():
return False
# Skip prompt in non-interactive contexts (CI, API servers, Docker, etc.)
# This avoids blocking for 20 seconds when no one can respond
if not _is_interactive_terminal():
return False
try:
import threading

View File

@@ -98,7 +98,29 @@ class InternalInstructor(Generic[T]):
else:
provider = "openai" # Default fallback
return instructor.from_provider(f"{provider}/{model_string}")
extra_kwargs = self._get_llm_extra_kwargs()
return instructor.from_provider(f"{provider}/{model_string}", **extra_kwargs)
def _get_llm_extra_kwargs(self) -> dict[str, Any]:
"""Extract extra keyword arguments from the LLM to pass to the instructor client.
Forwards provider-specific configuration such as ``base_url`` and
``api_key`` so that the instructor client connects to the correct
endpoint rather than defaulting to the provider's public API.
Returns:
Dictionary of extra keyword arguments for ``instructor.from_provider``.
"""
if isinstance(self.llm, str) or self.llm is None:
return {}
extra: dict[str, Any] = {}
for attr in ("base_url", "api_key"):
value = getattr(self.llm, attr, None)
if value is not None:
extra[attr] = value
return extra
def _extract_provider(self) -> str:
"""Extract provider from LLM model name.

View File

@@ -793,10 +793,6 @@ class TestTraceListenerSetup:
"crewai.events.listeners.tracing.utils._is_test_environment",
return_value=False,
),
patch(
"crewai.events.listeners.tracing.utils._is_interactive_terminal",
return_value=True,
),
patch("threading.Thread") as mock_thread,
):
from crewai.events.listeners.tracing.utils import (

View File

@@ -952,3 +952,134 @@ def test_internal_instructor_real_unsupported_provider() -> None:
# Verify it's a configuration error about unsupported provider
assert "Unsupported provider" in str(exc_info.value) or "unsupported" in str(exc_info.value).lower()
def test_internal_instructor_forwards_base_url_to_from_provider() -> None:
"""Test that _create_instructor_client forwards base_url from LLM to instructor.from_provider.
Regression test for https://github.com/crewAIInc/crewAI/issues/5204
When using an OpenAI-compatible provider with a custom base_url (e.g. vLLM, Ollama),
the InternalInstructor must pass base_url through so that structured output requests
reach the correct endpoint instead of defaulting to api.openai.com.
"""
from crewai.utilities.internal_instructor import InternalInstructor
mock_llm = Mock()
mock_llm.is_litellm = False
mock_llm.model = "my-local-model"
mock_llm.provider = "openai"
mock_llm.base_url = "http://localhost:8000/v1"
mock_llm.api_key = "sk-custom-key"
with patch("instructor.from_provider") as mock_from_provider:
mock_client = Mock()
mock_from_provider.return_value = mock_client
InternalInstructor(
content="Test content",
model=SimpleModel,
llm=mock_llm,
)
mock_from_provider.assert_called_once_with(
"openai/my-local-model",
base_url="http://localhost:8000/v1",
api_key="sk-custom-key",
)
def test_internal_instructor_forwards_base_url_without_api_key() -> None:
"""Test that base_url is forwarded even when api_key is not set."""
from crewai.utilities.internal_instructor import InternalInstructor
mock_llm = Mock()
mock_llm.is_litellm = False
mock_llm.model = "my-local-model"
mock_llm.provider = "openai"
mock_llm.base_url = "http://localhost:11434/v1"
mock_llm.api_key = None
with patch("instructor.from_provider") as mock_from_provider:
mock_client = Mock()
mock_from_provider.return_value = mock_client
InternalInstructor(
content="Test content",
model=SimpleModel,
llm=mock_llm,
)
mock_from_provider.assert_called_once_with(
"openai/my-local-model",
base_url="http://localhost:11434/v1",
)
def test_internal_instructor_no_extra_kwargs_when_base_url_not_set() -> None:
"""Test that no extra kwargs are passed when base_url and api_key are not set."""
from crewai.utilities.internal_instructor import InternalInstructor
mock_llm = Mock()
mock_llm.is_litellm = False
mock_llm.model = "gpt-4o"
mock_llm.provider = "openai"
mock_llm.base_url = None
mock_llm.api_key = None
with patch("instructor.from_provider") as mock_from_provider:
mock_client = Mock()
mock_from_provider.return_value = mock_client
InternalInstructor(
content="Test content",
model=SimpleModel,
llm=mock_llm,
)
mock_from_provider.assert_called_once_with(
"openai/gpt-4o",
)
def test_internal_instructor_get_llm_extra_kwargs_with_string_llm() -> None:
"""Test that _get_llm_extra_kwargs returns empty dict for string LLM."""
from crewai.utilities.internal_instructor import InternalInstructor
with patch("instructor.from_provider") as mock_from_provider:
mock_client = Mock()
mock_from_provider.return_value = mock_client
inst = InternalInstructor(
content="Test content",
model=SimpleModel,
llm="openai/gpt-4o",
)
assert inst._get_llm_extra_kwargs() == {}
def test_internal_instructor_forwards_only_api_key() -> None:
"""Test that only api_key is forwarded when base_url is not set."""
from crewai.utilities.internal_instructor import InternalInstructor
mock_llm = Mock()
mock_llm.is_litellm = False
mock_llm.model = "gpt-4o"
mock_llm.provider = "openai"
mock_llm.base_url = None
mock_llm.api_key = "sk-my-key"
with patch("instructor.from_provider") as mock_from_provider:
mock_client = Mock()
mock_from_provider.return_value = mock_client
InternalInstructor(
content="Test content",
model=SimpleModel,
llm=mock_llm,
)
mock_from_provider.assert_called_once_with(
"openai/gpt-4o",
api_key="sk-my-key",
)

View File

@@ -1,3 +1,3 @@
"""CrewAI development tools."""
__version__ = "1.13.0a6"
__version__ = "1.13.0a5"