Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
13e5ec7
feat: add `apps` & `actions` attributes to Agent (#3504)
lucasgomide Sep 25, 2025
74b5c88
Merge branch 'main' into release/v1.0.0-alpha.1
greysonlalonde Sep 26, 2025
86f0dfc
feat: monorepo restructure and test/ci updates
greysonlalonde Sep 28, 2025
c591c1a
chore: update python version to 3.13 and package metadata
greysonlalonde Sep 28, 2025
289b90f
feat: add crewai-tools workspace and fix tests/dependencies
greysonlalonde Sep 28, 2025
68dce92
chore: update CI workflows and docs for monorepo structure
greysonlalonde Sep 28, 2025
417a4e3
chore: ci publish and pin versions
greysonlalonde Sep 28, 2025
548170e
fix: add permission to action
greysonlalonde Sep 28, 2025
0fe9352
chore: bump version to 1.0.0a1 across all packages
lorenzejay Sep 28, 2025
c793c82
WIP: v1 docs (#3626)
tonykipkemboi Oct 1, 2025
b5161c3
Merge branch 'main' into release/v1.0.0
tonykipkemboi Oct 1, 2025
9e1dae0
docs: parity for all translations
tonykipkemboi Oct 1, 2025
d7f6f07
docs: full name of acronym AMP
tonykipkemboi Oct 1, 2025
ade425a
docs: fix lingering unused code
tonykipkemboi Oct 1, 2025
e8356b7
docs: expand contextual options in docs.json
tonykipkemboi Oct 1, 2025
df754db
docs: add contextual action to request feature on GitHub (#3635)
tonykipkemboi Oct 2, 2025
5456c80
chore: apply linting fixes to crewai-tools
greysonlalonde Oct 2, 2025
c5ac5fa
feat: add required env var validation for brightdata
mplachta Oct 2, 2025
e73c588
fix: handle properly anyOf oneOf allOf schema's props
lucasgomide Oct 2, 2025
610bc4b
chore: merge main into release/v1.0.0
greysonlalonde Oct 2, 2025
428810b
feat: bump version to 1.0.0a2
greysonlalonde Oct 2, 2025
126b91e
Lorenze/native inference sdks (#3619)
lorenzejay Oct 3, 2025
e529ebf
feat: add base devtooling
greysonlalonde Oct 3, 2025
5865d39
fix: ensure dep refs are updated for devtools
greysonlalonde Oct 3, 2025
2a0018a
fix: allow pre-release
greysonlalonde Oct 3, 2025
ebeed0b
feat: allow release after tag
greysonlalonde Oct 3, 2025
0b305da
feat: bump versions to 1.0.0a3
lorenzejay Oct 3, 2025
38bc5a9
fix: match tag and release title, ignore devtools build for pypi
greysonlalonde Oct 3, 2025
29a0ac4
fix: allow failed pypi publish
greysonlalonde Oct 3, 2025
8b91863
feat: introduce trigger listing and execution commands for local deve…
lucasgomide Oct 6, 2025
79d4e42
chore: merge main into release/v1.0.0
greysonlalonde Oct 8, 2025
f9992d8
chore: exclude tests from ruff linting
greysonlalonde Oct 8, 2025
47b6bae
Merge branch 'main' into release/v1.0.0
greysonlalonde Oct 8, 2025
11f6b34
chore: exclude tests from GitHub Actions linter
greysonlalonde Oct 8, 2025
458f56f
fix: replace print statements with logger in agent and memory handling
greysonlalonde Oct 8, 2025
f094df6
chore: add noqa for intentional print in printer utility
greysonlalonde Oct 8, 2025
51e8fb1
fix: resolve linting errors across codebase
greysonlalonde Oct 9, 2025
28a8a7e
feat: update docs with new approach to consume Platform Actions (#3675)
lucasgomide Oct 9, 2025
2f4fdf9
Merge branch 'release/v1.0.0' of https://github.com/crewAIInc/crewAI …
greysonlalonde Oct 9, 2025
faddcd0
Merge branch 'main' of github.com:crewAIInc/crewAI into release/v1.0.0
lorenzejay Oct 9, 2025
06f7d22
fix: remove duplicate line and add explicit env var
greysonlalonde Oct 9, 2025
abe1f40
Merge branch 'main' into release/v1.0.0
greysonlalonde Oct 9, 2025
0648e88
feat: bump versions to 1.0.0a4 (#3686)
lorenzejay Oct 9, 2025
da331ce
Update triggers docs (#3678)
lucasgomide Oct 9, 2025
52b2f07
docs: ensure CREWAI_PLATFORM_INTEGRATION_TOKEN is mentioned on docs (…
lucasgomide Oct 9, 2025
7de7d6f
feat: make event bus thread safe, async support
greysonlalonde Oct 8, 2025
a4c3eea
feat: add read-write lock implementation
greysonlalonde Oct 8, 2025
3df4460
refactor: improve event bus thread safety with concurrent reads
greysonlalonde Oct 8, 2025
791eac5
test: add comprehensive event bus tests and fix async handler completion
greysonlalonde Oct 8, 2025
dd916f0
fix: add wait for event handlers in guardrail and memory tests
greysonlalonde Oct 8, 2025
c0aeceb
refactor: auto-wait for event handlers in all tests via conftest fixture
greysonlalonde Oct 8, 2025
965ab25
revert: remove auto-wait on emit, use explicit waits in tests
greysonlalonde Oct 8, 2025
206fae6
fix: simplify test fixture to only clear handlers after test
greysonlalonde Oct 8, 2025
3d3d53b
fix: replace thread-local storage with instance variable in AgentEval…
greysonlalonde Oct 8, 2025
0529384
test: improve event bus test synchronization and cleanup
greysonlalonde Oct 8, 2025
0a343ae
fix: use LiteAgentExecutionCompletedEvent for deterministic event syn…
greysonlalonde Oct 10, 2025
abf8013
refactor(events): improve event bus type safety and error handling
greysonlalonde Oct 10, 2025
9dac6d2
fix: inject tool repository credentials in crewai run command
greysonlalonde Oct 10, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ on:
push:
branches: [ "main" ]
paths-ignore:
- "src/crewai/cli/templates/**"
- "lib/crewai/src/crewai/cli/templates/**"
pull_request:
branches: [ "main" ]
paths-ignore:
- "src/crewai/cli/templates/**"
- "lib/crewai/src/crewai/cli/templates/**"

jobs:
analyze:
Expand Down
9 changes: 5 additions & 4 deletions .github/workflows/linter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,11 @@ jobs:
- name: Run Ruff on Changed Files
if: ${{ steps.changed-files.outputs.files != '' }}
run: |
echo "${{ steps.changed-files.outputs.files }}" \
| tr ' ' '\n' \
| grep -v 'src/crewai/cli/templates/' \
| xargs -I{} uv run ruff check "{}"
echo "${{ steps.changed-files.outputs.files }}" \
| tr ' ' '\n' \
| grep -v 'src/crewai/cli/templates/' \
| grep -v '/tests/' \
| xargs -I{} uv run ruff check "{}"

- name: Save uv caches
if: steps.cache-restore.outputs.cache-hit != 'true'
Expand Down
83 changes: 83 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
name: Publish to PyPI

on:
release:
types: [ published ]
workflow_dispatch:

jobs:
build:
if: github.event.release.prerelease == true
name: Build packages
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install uv
uses: astral-sh/setup-uv@v4

- name: Build packages
run: |
uv build --prerelease="allow" --all-packages
rm dist/.gitignore

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: dist
path: dist/

publish:
if: github.event.release.prerelease == true
name: Publish to PyPI
needs: build
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/p/crewai
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: "0.8.4"
python-version: "3.12"
enable-cache: false

- name: Download artifacts
uses: actions/download-artifact@v4
with:
name: dist
path: dist

- name: Publish to PyPI
env:
UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
run: |
failed=0
for package in dist/*; do
if [[ "$package" == *"crewai_devtools"* ]]; then
echo "Skipping private package: $package"
continue
fi
echo "Publishing $package"
if ! uv publish "$package"; then
echo "Failed to publish $package"
failed=1
fi
done
if [ $failed -eq 1 ]; then
echo "Some packages failed to publish"
exit 1
fi
31 changes: 26 additions & 5 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ permissions:
env:
OPENAI_API_KEY: fake-api-key
PYTHONUNBUFFERED: 1
BRAVE_API_KEY: fake-brave-key
SNOWFLAKE_USER: fake-snowflake-user
SNOWFLAKE_PASSWORD: fake-snowflake-password
SNOWFLAKE_ACCOUNT: fake-snowflake-account
SNOWFLAKE_WAREHOUSE: fake-snowflake-warehouse
SNOWFLAKE_DATABASE: fake-snowflake-database
SNOWFLAKE_SCHEMA: fake-snowflake-schema
EMBEDCHAIN_DB_URI: sqlite:///test.db

jobs:
tests:
Expand Down Expand Up @@ -56,13 +64,13 @@ jobs:
- name: Run tests (group ${{ matrix.group }} of 8)
run: |
PYTHON_VERSION_SAFE=$(echo "${{ matrix.python-version }}" | tr '.' '_')
DURATION_FILE=".test_durations_py${PYTHON_VERSION_SAFE}"
DURATION_FILE="../../.test_durations_py${PYTHON_VERSION_SAFE}"

# Temporarily always skip cached durations to fix test splitting
# When durations don't match, pytest-split runs duplicate tests instead of splitting
echo "Using even test splitting (duration cache disabled until fix merged)"
DURATIONS_ARG=""

# Original logic (disabled temporarily):
# if [ ! -f "$DURATION_FILE" ]; then
# echo "No cached durations found, tests will be split evenly"
Expand All @@ -74,8 +82,8 @@ jobs:
# echo "No test changes detected, using cached test durations for optimal splitting"
# DURATIONS_ARG="--durations-path=${DURATION_FILE}"
# fi
uv run pytest \

cd lib/crewai && uv run pytest \
--block-network \
--timeout=30 \
-vv \
Expand All @@ -86,6 +94,19 @@ jobs:
-n auto \
--maxfail=3

- name: Run tool tests (group ${{ matrix.group }} of 8)
run: |
cd lib/crewai-tools && uv run pytest \
--block-network \
--timeout=30 \
-vv \
--splits 8 \
--group ${{ matrix.group }} \
--durations=10 \
-n auto \
--maxfail=3


- name: Save uv caches
if: steps.cache-restore.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
Expand Down
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
.pytest_cache
__pycache__
dist/
lib/
.env
assets/*
.idea
Expand Down
4 changes: 3 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ repos:
entry: uv run ruff check
language: system
types: [python]
exclude: ^lib/crewai/
- id: ruff-format
name: ruff-format
entry: uv run ruff format
language: system
types: [python]
exclude: ^lib/crewai/
- id: mypy
name: mypy
entry: uv run mypy
language: system
types: [python]
exclude: ^tests/
exclude: ^lib/crewai/
42 changes: 42 additions & 0 deletions docs/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -361,10 +361,20 @@
"en/enterprise/integrations/github",
"en/enterprise/integrations/gmail",
"en/enterprise/integrations/google_calendar",
"en/enterprise/integrations/google_contacts",
"en/enterprise/integrations/google_docs",
"en/enterprise/integrations/google_drive",
"en/enterprise/integrations/google_sheets",
"en/enterprise/integrations/google_slides",
"en/enterprise/integrations/hubspot",
"en/enterprise/integrations/jira",
"en/enterprise/integrations/linear",
"en/enterprise/integrations/microsoft_excel",
"en/enterprise/integrations/microsoft_onedrive",
"en/enterprise/integrations/microsoft_outlook",
"en/enterprise/integrations/microsoft_sharepoint",
"en/enterprise/integrations/microsoft_teams",
"en/enterprise/integrations/microsoft_word",
"en/enterprise/integrations/notion",
"en/enterprise/integrations/salesforce",
"en/enterprise/integrations/shopify",
Expand Down Expand Up @@ -773,10 +783,20 @@
"pt-BR/enterprise/integrations/github",
"pt-BR/enterprise/integrations/gmail",
"pt-BR/enterprise/integrations/google_calendar",
"pt-BR/enterprise/integrations/google_contacts",
"pt-BR/enterprise/integrations/google_docs",
"pt-BR/enterprise/integrations/google_drive",
"pt-BR/enterprise/integrations/google_sheets",
"pt-BR/enterprise/integrations/google_slides",
"pt-BR/enterprise/integrations/hubspot",
"pt-BR/enterprise/integrations/jira",
"pt-BR/enterprise/integrations/linear",
"pt-BR/enterprise/integrations/microsoft_excel",
"pt-BR/enterprise/integrations/microsoft_onedrive",
"pt-BR/enterprise/integrations/microsoft_outlook",
"pt-BR/enterprise/integrations/microsoft_sharepoint",
"pt-BR/enterprise/integrations/microsoft_teams",
"pt-BR/enterprise/integrations/microsoft_word",
"pt-BR/enterprise/integrations/notion",
"pt-BR/enterprise/integrations/salesforce",
"pt-BR/enterprise/integrations/shopify",
Expand Down Expand Up @@ -805,6 +825,12 @@
"group": "Triggers",
"pages": [
"pt-BR/enterprise/guides/automation-triggers",
"pt-BR/enterprise/guides/gmail-trigger",
"pt-BR/enterprise/guides/google-calendar-trigger",
"pt-BR/enterprise/guides/google-drive-trigger",
"pt-BR/enterprise/guides/outlook-trigger",
"pt-BR/enterprise/guides/onedrive-trigger",
"pt-BR/enterprise/guides/microsoft-teams-trigger",
"pt-BR/enterprise/guides/slack-trigger",
"pt-BR/enterprise/guides/hubspot-trigger",
"pt-BR/enterprise/guides/salesforce-trigger",
Expand Down Expand Up @@ -1188,10 +1214,20 @@
"ko/enterprise/integrations/github",
"ko/enterprise/integrations/gmail",
"ko/enterprise/integrations/google_calendar",
"ko/enterprise/integrations/google_contacts",
"ko/enterprise/integrations/google_docs",
"ko/enterprise/integrations/google_drive",
"ko/enterprise/integrations/google_sheets",
"ko/enterprise/integrations/google_slides",
"ko/enterprise/integrations/hubspot",
"ko/enterprise/integrations/jira",
"ko/enterprise/integrations/linear",
"ko/enterprise/integrations/microsoft_excel",
"ko/enterprise/integrations/microsoft_onedrive",
"ko/enterprise/integrations/microsoft_outlook",
"ko/enterprise/integrations/microsoft_sharepoint",
"ko/enterprise/integrations/microsoft_teams",
"ko/enterprise/integrations/microsoft_word",
"ko/enterprise/integrations/notion",
"ko/enterprise/integrations/salesforce",
"ko/enterprise/integrations/shopify",
Expand Down Expand Up @@ -1220,6 +1256,12 @@
"group": "트리거",
"pages": [
"ko/enterprise/guides/automation-triggers",
"ko/enterprise/guides/gmail-trigger",
"ko/enterprise/guides/google-calendar-trigger",
"ko/enterprise/guides/google-drive-trigger",
"ko/enterprise/guides/outlook-trigger",
"ko/enterprise/guides/onedrive-trigger",
"ko/enterprise/guides/microsoft-teams-trigger",
"ko/enterprise/guides/slack-trigger",
"ko/enterprise/guides/hubspot-trigger",
"ko/enterprise/guides/salesforce-trigger",
Expand Down
43 changes: 22 additions & 21 deletions docs/en/enterprise/features/tools-and-integrations.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ Tools & Integrations is the central hub for connecting third‑party apps and ma
1. Go to <Link href="https://app.crewai.com/crewai_plus/connectors">Integrations</Link>
2. Click <b>Connect</b> on the desired service
3. Complete the OAuth flow and grant scopes
4. Copy your Enterprise Token from the <b>Integration</b> tab
4. Copy your Enterprise Token from <Link href="https://app.crewai.com/crewai_plus/settings/integrations">Integration Settings</Link>

<Frame>
![Enterprise Token](/images/enterprise/enterprise_action_auth_token.png)
Expand All @@ -57,29 +57,37 @@ Tools & Integrations is the central hub for connecting third‑party apps and ma
uv add crewai-tools
```

### Environment Variable Setup

<Note>
To use integrations with `Agent(apps=[])`, you must set the `CREWAI_PLATFORM_INTEGRATION_TOKEN` environment variable with your Enterprise Token.
</Note>

```bash
export CREWAI_PLATFORM_INTEGRATION_TOKEN="your_enterprise_token"
```

Or add it to your `.env` file:

```
CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```

### Usage Example

<Tip>
All services you have authenticated will be available as tools. Add `CrewaiEnterpriseTools` to your agent and you’re set.
Use the new streamlined approach to integrate enterprise apps. Simply specify the app and its actions directly in the Agent configuration.
</Tip>

```python
from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools

# Get enterprise tools (Gmail tool will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# print the tools
print(enterprise_tools)

# Create an agent with Gmail capabilities
email_agent = Agent(
role="Email Manager",
goal="Manage and organize email communications",
backstory="An AI assistant specialized in email management and communication.",
tools=enterprise_tools
apps=['gmail', 'gmail/send_email'] # Using canonical name 'gmail'
)

# Task to send an email
Expand All @@ -102,21 +110,14 @@ Tools & Integrations is the central hub for connecting third‑party apps and ma
### Filtering Tools

```python
from crewai_tools import CrewaiEnterpriseTools

enterprise_tools = CrewaiEnterpriseTools(
actions_list=["gmail_find_email"] # only gmail_find_email tool will be available
)


gmail_tool = enterprise_tools["gmail_find_email"]

from crewai import Agent, Task, Crew

# Create agent with specific Gmail actions only
gmail_agent = Agent(
role="Gmail Manager",
goal="Manage gmail communications and notifications",
backstory="An AI assistant that helps coordinate gmail communications.",
tools=[gmail_tool]
apps=['gmail/fetch_emails'] # Using canonical name with specific action
)

notification_task = Task(
Expand Down
Loading
Loading