Compare commits

..

2 Commits

Author SHA1 Message Date
Devin AI
1ae3a003b6 Fix lint errors in test_custom_llm.py
- Add noqa comment for hardcoded test JWT token
- Add return statement to satisfy ruff RET503 check

Co-Authored-By: João <joao@crewai.com>
2025-10-15 03:01:54 +00:00
Devin AI
fc4b0dd923 Fix function_calling_llm support for custom models
- Add supports_function_calling() method to BaseLLM class with default True
- Add supports_function_calling parameter to LLM class to allow override of litellm check
- Add tests for both BaseLLM default and LLM override functionality
- Fixes #3708: Custom models not in litellm's list can now use function calling

Co-Authored-By: João <joao@crewai.com>
2025-10-15 02:57:03 +00:00
1906 changed files with 96470 additions and 238659 deletions

161
.env.test
View File

@@ -1,161 +0,0 @@
# =============================================================================
# Test Environment Variables
# =============================================================================
# This file contains all environment variables needed to run tests locally
# in a way that mimics the GitHub Actions CI environment.
# =============================================================================
# -----------------------------------------------------------------------------
# LLM Provider API Keys
# -----------------------------------------------------------------------------
OPENAI_API_KEY=fake-api-key
ANTHROPIC_API_KEY=fake-anthropic-key
GEMINI_API_KEY=fake-gemini-key
AZURE_API_KEY=fake-azure-key
OPENROUTER_API_KEY=fake-openrouter-key
# -----------------------------------------------------------------------------
# AWS Credentials
# -----------------------------------------------------------------------------
AWS_ACCESS_KEY_ID=fake-aws-access-key
AWS_SECRET_ACCESS_KEY=fake-aws-secret-key
AWS_DEFAULT_REGION=us-east-1
AWS_REGION_NAME=us-east-1
# -----------------------------------------------------------------------------
# Azure OpenAI Configuration
# -----------------------------------------------------------------------------
AZURE_ENDPOINT=https://fake-azure-endpoint.openai.azure.com
AZURE_OPENAI_ENDPOINT=https://fake-azure-endpoint.openai.azure.com
AZURE_OPENAI_API_KEY=fake-azure-openai-key
AZURE_API_VERSION=2024-02-15-preview
OPENAI_API_VERSION=2024-02-15-preview
# -----------------------------------------------------------------------------
# Google Cloud Configuration
# -----------------------------------------------------------------------------
#GOOGLE_CLOUD_PROJECT=fake-gcp-project
#GOOGLE_CLOUD_LOCATION=us-central1
# -----------------------------------------------------------------------------
# OpenAI Configuration
# -----------------------------------------------------------------------------
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_API_BASE=https://api.openai.com/v1
# -----------------------------------------------------------------------------
# Search & Scraping Tool API Keys
# -----------------------------------------------------------------------------
SERPER_API_KEY=fake-serper-key
EXA_API_KEY=fake-exa-key
BRAVE_API_KEY=fake-brave-key
FIRECRAWL_API_KEY=fake-firecrawl-key
TAVILY_API_KEY=fake-tavily-key
SERPAPI_API_KEY=fake-serpapi-key
SERPLY_API_KEY=fake-serply-key
LINKUP_API_KEY=fake-linkup-key
PARALLEL_API_KEY=fake-parallel-key
# -----------------------------------------------------------------------------
# Exa Configuration
# -----------------------------------------------------------------------------
EXA_BASE_URL=https://api.exa.ai
# -----------------------------------------------------------------------------
# Web Scraping & Automation
# -----------------------------------------------------------------------------
BRIGHT_DATA_API_KEY=fake-brightdata-key
BRIGHT_DATA_ZONE=fake-zone
BRIGHTDATA_API_URL=https://api.brightdata.com
BRIGHTDATA_DEFAULT_TIMEOUT=600
BRIGHTDATA_DEFAULT_POLLING_INTERVAL=1
OXYLABS_USERNAME=fake-oxylabs-user
OXYLABS_PASSWORD=fake-oxylabs-pass
SCRAPFLY_API_KEY=fake-scrapfly-key
SCRAPEGRAPH_API_KEY=fake-scrapegraph-key
BROWSERBASE_API_KEY=fake-browserbase-key
BROWSERBASE_PROJECT_ID=fake-browserbase-project
HYPERBROWSER_API_KEY=fake-hyperbrowser-key
MULTION_API_KEY=fake-multion-key
APIFY_API_TOKEN=fake-apify-token
# -----------------------------------------------------------------------------
# Database & Vector Store Credentials
# -----------------------------------------------------------------------------
SINGLESTOREDB_URL=mysql://fake:fake@localhost:3306/fake
SINGLESTOREDB_HOST=localhost
SINGLESTOREDB_PORT=3306
SINGLESTOREDB_USER=fake-user
SINGLESTOREDB_PASSWORD=fake-password
SINGLESTOREDB_DATABASE=fake-database
SINGLESTOREDB_CONNECT_TIMEOUT=30
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
WEAVIATE_URL=http://localhost:8080
WEAVIATE_API_KEY=fake-weaviate-key
EMBEDCHAIN_DB_URI=sqlite:///test.db
# Databricks Credentials
DATABRICKS_HOST=https://fake-databricks.cloud.databricks.com
DATABRICKS_TOKEN=fake-databricks-token
DATABRICKS_CONFIG_PROFILE=fake-profile
# MongoDB Credentials
MONGODB_URI=mongodb://fake:fake@localhost:27017/fake
# -----------------------------------------------------------------------------
# CrewAI Platform & Enterprise
# -----------------------------------------------------------------------------
# setting CREWAI_PLATFORM_INTEGRATION_TOKEN causes these test to fail:
#=========================== short test summary info ============================
#FAILED tests/test_context.py::TestPlatformIntegrationToken::test_platform_context_manager_basic_usage - AssertionError: assert 'fake-platform-token' is None
# + where 'fake-platform-token' = get_platform_integration_token()
#FAILED tests/test_context.py::TestPlatformIntegrationToken::test_context_var_isolation_between_tests - AssertionError: assert 'fake-platform-token' is None
# + where 'fake-platform-token' = get_platform_integration_token()
#FAILED tests/test_context.py::TestPlatformIntegrationToken::test_multiple_sequential_context_managers - AssertionError: assert 'fake-platform-token' is None
# + where 'fake-platform-token' = get_platform_integration_token()
#CREWAI_PLATFORM_INTEGRATION_TOKEN=fake-platform-token
CREWAI_PERSONAL_ACCESS_TOKEN=fake-personal-token
CREWAI_PLUS_URL=https://fake.crewai.com
# -----------------------------------------------------------------------------
# Other Service API Keys
# -----------------------------------------------------------------------------
ZAPIER_API_KEY=fake-zapier-key
PATRONUS_API_KEY=fake-patronus-key
MINDS_API_KEY=fake-minds-key
HF_TOKEN=fake-hf-token
# -----------------------------------------------------------------------------
# Feature Flags/Testing Modes
# -----------------------------------------------------------------------------
CREWAI_DISABLE_TELEMETRY=true
OTEL_SDK_DISABLED=true
CREWAI_TESTING=true
CREWAI_TRACING_ENABLED=false
# -----------------------------------------------------------------------------
# Testing/CI Configuration
# -----------------------------------------------------------------------------
# VCR recording mode: "none" (default), "new_episodes", "all", "once"
PYTEST_VCR_RECORD_MODE=none
# Set to "true" by GitHub when running in GitHub Actions
# GITHUB_ACTIONS=false
# -----------------------------------------------------------------------------
# Python Configuration
# -----------------------------------------------------------------------------
PYTHONUNBUFFERED=1

View File

@@ -2,26 +2,19 @@ name: "CodeQL Config"
paths-ignore: paths-ignore:
# Ignore template files - these are boilerplate code that shouldn't be analyzed # Ignore template files - these are boilerplate code that shouldn't be analyzed
- "lib/crewai/src/crewai/cli/templates/**" - "src/crewai/cli/templates/**"
# Ignore test cassettes - these are test fixtures/recordings # Ignore test cassettes - these are test fixtures/recordings
- "lib/crewai/tests/cassettes/**" - "tests/cassettes/**"
- "lib/crewai-tools/tests/cassettes/**"
# Ignore cache and build artifacts # Ignore cache and build artifacts
- ".cache/**" - ".cache/**"
# Ignore documentation build artifacts # Ignore documentation build artifacts
- "docs/.cache/**" - "docs/.cache/**"
# Ignore experimental code
- "lib/crewai/src/crewai/experimental/a2a/**"
paths: paths:
# Include all Python source code from workspace packages # Include all Python source code
- "lib/crewai/src/**" - "src/**"
- "lib/crewai-tools/src/**" # Include tests (but exclude cassettes)
- "lib/devtools/src/**" - "tests/**"
# Include tests (but exclude cassettes via paths-ignore)
- "lib/crewai/tests/**"
- "lib/crewai-tools/tests/**"
- "lib/devtools/tests/**"
# Configure specific queries or packs if needed # Configure specific queries or packs if needed
# queries: # queries:

View File

@@ -1,11 +0,0 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
- package-ecosystem: uv # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"

View File

@@ -15,11 +15,11 @@ on:
push: push:
branches: [ "main" ] branches: [ "main" ]
paths-ignore: paths-ignore:
- "lib/crewai/src/crewai/cli/templates/**" - "src/crewai/cli/templates/**"
pull_request: pull_request:
branches: [ "main" ] branches: [ "main" ]
paths-ignore: paths-ignore:
- "lib/crewai/src/crewai/cli/templates/**" - "src/crewai/cli/templates/**"
jobs: jobs:
analyze: analyze:

View File

@@ -1,35 +0,0 @@
name: Check Documentation Broken Links
on:
pull_request:
paths:
- "docs/**"
- "docs.json"
push:
branches:
- main
paths:
- "docs/**"
- "docs.json"
workflow_dispatch:
jobs:
check-links:
name: Check broken links
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: "latest"
- name: Install Mintlify CLI
run: npm i -g mintlify
- name: Run broken link checker
run: |
# Auto-answer the prompt with yes command
yes "" | mintlify broken-links || test $? -eq 141
working-directory: ./docs

View File

@@ -52,11 +52,10 @@ jobs:
- name: Run Ruff on Changed Files - name: Run Ruff on Changed Files
if: ${{ steps.changed-files.outputs.files != '' }} if: ${{ steps.changed-files.outputs.files != '' }}
run: | run: |
echo "${{ steps.changed-files.outputs.files }}" \ echo "${{ steps.changed-files.outputs.files }}" \
| tr ' ' '\n' \ | tr ' ' '\n' \
| grep -v 'src/crewai/cli/templates/' \ | grep -v 'src/crewai/cli/templates/' \
| grep -v '/tests/' \ | xargs -I{} uv run ruff check "{}"
| xargs -I{} uv run ruff check "{}"
- name: Save uv caches - name: Save uv caches
if: steps.cache-restore.outputs.cache-hit != 'true' if: steps.cache-restore.outputs.cache-hit != 'true'

View File

@@ -1,100 +0,0 @@
name: Publish to PyPI
on:
repository_dispatch:
types: [deployment-tests-passed]
workflow_dispatch:
inputs:
release_tag:
description: 'Release tag to publish'
required: false
type: string
jobs:
build:
name: Build packages
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Determine release tag
id: release
run: |
# Priority: workflow_dispatch input > repository_dispatch payload > default branch
if [ -n "${{ inputs.release_tag }}" ]; then
echo "tag=${{ inputs.release_tag }}" >> $GITHUB_OUTPUT
elif [ -n "${{ github.event.client_payload.release_tag }}" ]; then
echo "tag=${{ github.event.client_payload.release_tag }}" >> $GITHUB_OUTPUT
else
echo "tag=" >> $GITHUB_OUTPUT
fi
- uses: actions/checkout@v4
with:
ref: ${{ steps.release.outputs.tag || github.ref }}
- 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 --all-packages
rm dist/.gitignore
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
publish:
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

View File

@@ -5,6 +5,10 @@ on: [pull_request]
permissions: permissions:
contents: read contents: read
env:
OPENAI_API_KEY: fake-api-key
PYTHONUNBUFFERED: 1
jobs: jobs:
tests: tests:
name: tests (${{ matrix.python-version }}) name: tests (${{ matrix.python-version }})
@@ -52,7 +56,7 @@ jobs:
- name: Run tests (group ${{ matrix.group }} of 8) - name: Run tests (group ${{ matrix.group }} of 8)
run: | run: |
PYTHON_VERSION_SAFE=$(echo "${{ matrix.python-version }}" | tr '.' '_') 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 # Temporarily always skip cached durations to fix test splitting
# When durations don't match, pytest-split runs duplicate tests instead of splitting # When durations don't match, pytest-split runs duplicate tests instead of splitting
@@ -71,24 +75,17 @@ jobs:
# DURATIONS_ARG="--durations-path=${DURATION_FILE}" # DURATIONS_ARG="--durations-path=${DURATION_FILE}"
# fi # fi
cd lib/crewai && uv run pytest \ uv run pytest \
--block-network \
--timeout=30 \
-vv \ -vv \
--splits 8 \ --splits 8 \
--group ${{ matrix.group }} \ --group ${{ matrix.group }} \
$DURATIONS_ARG \ $DURATIONS_ARG \
--durations=10 \ --durations=10 \
-n auto \
--maxfail=3 --maxfail=3
- name: Run tool tests (group ${{ matrix.group }} of 8)
run: |
cd lib/crewai-tools && uv run pytest \
-vv \
--splits 8 \
--group ${{ matrix.group }} \
--durations=10 \
--maxfail=3
- name: Save uv caches - name: Save uv caches
if: steps.cache-restore.outputs.cache-hit != 'true' if: steps.cache-restore.outputs.cache-hit != 'true'
uses: actions/cache/save@v4 uses: actions/cache/save@v4

View File

@@ -1,18 +0,0 @@
name: Trigger Deployment Tests
on:
release:
types: [published]
jobs:
trigger:
name: Trigger deployment tests
runs-on: ubuntu-latest
steps:
- name: Trigger deployment tests
uses: peter-evans/repository-dispatch@v3
with:
token: ${{ secrets.CREWAI_DEPLOYMENTS_PAT }}
repository: ${{ secrets.CREWAI_DEPLOYMENTS_REPOSITORY }}
event-type: crewai-release
client-payload: '{"release_tag": "${{ github.event.release.tag_name }}", "release_name": "${{ github.event.release.name }}"}'

1
.gitignore vendored
View File

@@ -2,6 +2,7 @@
.pytest_cache .pytest_cache
__pycache__ __pycache__
dist/ dist/
lib/
.env .env
assets/* assets/*
.idea .idea

View File

@@ -3,31 +3,17 @@ repos:
hooks: hooks:
- id: ruff - id: ruff
name: ruff name: ruff
entry: bash -c 'source .venv/bin/activate && uv run ruff check --config pyproject.toml "$@"' -- entry: uv run ruff check
language: system language: system
pass_filenames: true
types: [python] types: [python]
- id: ruff-format - id: ruff-format
name: ruff-format name: ruff-format
entry: bash -c 'source .venv/bin/activate && uv run ruff format --config pyproject.toml "$@"' -- entry: uv run ruff format
language: system language: system
pass_filenames: true
types: [python] types: [python]
- id: mypy - id: mypy
name: mypy name: mypy
entry: bash -c 'source .venv/bin/activate && uv run mypy --config-file pyproject.toml "$@"' -- entry: uv run mypy
language: system language: system
pass_filenames: true
types: [python] types: [python]
exclude: ^(lib/crewai/src/crewai/cli/templates/|lib/crewai/tests/|lib/crewai-tools/tests/) exclude: ^tests/
- repo: https://github.com/astral-sh/uv-pre-commit
rev: 0.9.3
hooks:
- id: uv-lock
- repo: https://github.com/commitizen-tools/commitizen
rev: v4.10.1
hooks:
- id: commitizen
- id: commitizen-branch
stages: [ pre-push ]

View File

@@ -57,7 +57,7 @@
> It empowers developers with both high-level simplicity and precise low-level control, ideal for creating autonomous AI agents tailored to any scenario. > It empowers developers with both high-level simplicity and precise low-level control, ideal for creating autonomous AI agents tailored to any scenario.
- **CrewAI Crews**: Optimize for autonomy and collaborative intelligence. - **CrewAI Crews**: Optimize for autonomy and collaborative intelligence.
- **CrewAI Flows**: The **enterprise and production architecture** for building and deploying multi-agent systems. Enable granular, event-driven control, single LLM calls for precise task orchestration and supports Crews natively - **CrewAI Flows**: Enable granular, event-driven control, single LLM calls for precise task orchestration and supports Crews natively
With over 100,000 developers certified through our community courses at [learn.crewai.com](https://learn.crewai.com), CrewAI is rapidly becoming the With over 100,000 developers certified through our community courses at [learn.crewai.com](https://learn.crewai.com), CrewAI is rapidly becoming the
standard for enterprise-ready AI automation. standard for enterprise-ready AI automation.
@@ -124,8 +124,7 @@ Setup and run your first CrewAI agents by following this tutorial.
[![CrewAI Getting Started Tutorial](https://img.youtube.com/vi/-kSOTtYzgEw/hqdefault.jpg)](https://www.youtube.com/watch?v=-kSOTtYzgEw "CrewAI Getting Started Tutorial") [![CrewAI Getting Started Tutorial](https://img.youtube.com/vi/-kSOTtYzgEw/hqdefault.jpg)](https://www.youtube.com/watch?v=-kSOTtYzgEw "CrewAI Getting Started Tutorial")
### ###
Learning Resources
Learning Resources
Learn CrewAI through our comprehensive courses: Learn CrewAI through our comprehensive courses:
@@ -142,7 +141,6 @@ CrewAI offers two powerful, complementary approaches that work seamlessly togeth
- Dynamic task delegation and collaboration - Dynamic task delegation and collaboration
- Specialized roles with defined goals and expertise - Specialized roles with defined goals and expertise
- Flexible problem-solving approaches - Flexible problem-solving approaches
2. **Flows**: Production-ready, event-driven workflows that deliver precise control over complex automations. Flows provide: 2. **Flows**: Production-ready, event-driven workflows that deliver precise control over complex automations. Flows provide:
- Fine-grained control over execution paths for real-world scenarios - Fine-grained control over execution paths for real-world scenarios
@@ -168,13 +166,13 @@ Ensure you have Python >=3.10 <3.14 installed on your system. CrewAI uses [UV](h
First, install CrewAI: First, install CrewAI:
```shell ```shell
uv pip install crewai pip install crewai
``` ```
If you want to install the 'crewai' package along with its optional features that include additional tools for agents, you can do so by using the following command: If you want to install the 'crewai' package along with its optional features that include additional tools for agents, you can do so by using the following command:
```shell ```shell
uv pip install 'crewai[tools]' pip install 'crewai[tools]'
``` ```
The command above installs the basic package and also adds extra components which require more dependencies to function. The command above installs the basic package and also adds extra components which require more dependencies to function.
@@ -187,15 +185,14 @@ If you encounter issues during installation or usage, here are some common solut
1. **ModuleNotFoundError: No module named 'tiktoken'** 1. **ModuleNotFoundError: No module named 'tiktoken'**
- Install tiktoken explicitly: `uv pip install 'crewai[embeddings]'` - Install tiktoken explicitly: `pip install 'crewai[embeddings]'`
- If using embedchain or other tools: `uv pip install 'crewai[tools]'` - If using embedchain or other tools: `pip install 'crewai[tools]'`
2. **Failed building wheel for tiktoken** 2. **Failed building wheel for tiktoken**
- Ensure Rust compiler is installed (see installation steps above) - Ensure Rust compiler is installed (see installation steps above)
- For Windows: Verify Visual C++ Build Tools are installed - For Windows: Verify Visual C++ Build Tools are installed
- Try upgrading pip: `uv pip install --upgrade pip` - Try upgrading pip: `pip install --upgrade pip`
- If issues persist, use a pre-built wheel: `uv pip install tiktoken --prefer-binary` - If issues persist, use a pre-built wheel: `pip install tiktoken --prefer-binary`
### 2. Setting Up Your Crew with the YAML Configuration ### 2. Setting Up Your Crew with the YAML Configuration
@@ -273,7 +270,7 @@ reporting_analyst:
**tasks.yaml** **tasks.yaml**
````yaml ```yaml
# src/my_project/config/tasks.yaml # src/my_project/config/tasks.yaml
research_task: research_task:
description: > description: >
@@ -293,7 +290,7 @@ reporting_task:
Formatted as markdown without '```' Formatted as markdown without '```'
agent: reporting_analyst agent: reporting_analyst
output_file: report.md output_file: report.md
```` ```
**crew.py** **crew.py**
@@ -559,7 +556,7 @@ Please refer to the [Connect CrewAI to LLMs](https://docs.crewai.com/how-to/LLM-
- **LangGraph**: While LangGraph provides a foundation for building agent workflows, its approach requires significant boilerplate code and complex state management patterns. The framework's tight coupling with LangChain can limit flexibility when implementing custom agent behaviors or integrating with external systems. - **LangGraph**: While LangGraph provides a foundation for building agent workflows, its approach requires significant boilerplate code and complex state management patterns. The framework's tight coupling with LangChain can limit flexibility when implementing custom agent behaviors or integrating with external systems.
_P.S. CrewAI demonstrates significant performance advantages over LangGraph, executing 5.76x faster in certain cases like this QA task example ([see comparison](https://github.com/crewAIInc/crewAI-examples/tree/main/Notebooks/CrewAI%20Flows%20%26%20Langgraph/QA%20Agent)) while achieving higher evaluation scores with faster completion times in certain coding tasks, like in this example ([detailed analysis](https://github.com/crewAIInc/crewAI-examples/blob/main/Notebooks/CrewAI%20Flows%20%26%20Langgraph/Coding%20Assistant/coding_assistant_eval.ipynb))._ *P.S. CrewAI demonstrates significant performance advantages over LangGraph, executing 5.76x faster in certain cases like this QA task example ([see comparison](https://github.com/crewAIInc/crewAI-examples/tree/main/Notebooks/CrewAI%20Flows%20%26%20Langgraph/QA%20Agent)) while achieving higher evaluation scores with faster completion times in certain coding tasks, like in this example ([detailed analysis](https://github.com/crewAIInc/crewAI-examples/blob/main/Notebooks/CrewAI%20Flows%20%26%20Langgraph/Coding%20Assistant/coding_assistant_eval.ipynb)).*
- **Autogen**: While Autogen excels at creating conversational agents capable of working together, it lacks an inherent concept of process. In Autogen, orchestrating agents' interactions requires additional programming, which can become complex and cumbersome as the scale of tasks grows. - **Autogen**: While Autogen excels at creating conversational agents capable of working together, it lacks an inherent concept of process. In Autogen, orchestrating agents' interactions requires additional programming, which can become complex and cumbersome as the scale of tasks grows.
- **ChatDev**: ChatDev introduced the idea of processes into the realm of AI agents, but its implementation is quite rigid. Customizations in ChatDev are limited and not geared towards production environments, which can hinder scalability and flexibility in real-world applications. - **ChatDev**: ChatDev introduced the idea of processes into the realm of AI agents, but its implementation is quite rigid. Customizations in ChatDev are limited and not geared towards production environments, which can hinder scalability and flexibility in real-world applications.
@@ -614,7 +611,7 @@ uv build
### Installing Locally ### Installing Locally
```bash ```bash
uv pip install dist/*.tar.gz pip install dist/*.tar.gz
``` ```
## Telemetry ## Telemetry
@@ -690,13 +687,13 @@ A: CrewAI is a standalone, lean, and fast Python framework built specifically fo
A: Install CrewAI using pip: A: Install CrewAI using pip:
```shell ```shell
uv pip install crewai pip install crewai
``` ```
For additional tools, use: For additional tools, use:
```shell ```shell
uv pip install 'crewai[tools]' pip install 'crewai[tools]'
``` ```
### Q: Does CrewAI depend on LangChain? ### Q: Does CrewAI depend on LangChain?

View File

@@ -1,199 +0,0 @@
"""Pytest configuration for crewAI workspace."""
from collections.abc import Generator
import os
from pathlib import Path
import tempfile
from typing import Any
from dotenv import load_dotenv
import pytest
from vcr.request import Request # type: ignore[import-untyped]
env_test_path = Path(__file__).parent / ".env.test"
load_dotenv(env_test_path, override=True)
load_dotenv(override=True)
@pytest.fixture(autouse=True, scope="function")
def cleanup_event_handlers() -> Generator[None, Any, None]:
"""Clean up event bus handlers after each test to prevent test pollution."""
yield
try:
from crewai.events.event_bus import crewai_event_bus
with crewai_event_bus._rwlock.w_locked():
crewai_event_bus._sync_handlers.clear()
crewai_event_bus._async_handlers.clear()
except Exception: # noqa: S110
pass
@pytest.fixture(autouse=True, scope="function")
def setup_test_environment() -> Generator[None, Any, None]:
"""Setup test environment for crewAI workspace."""
with tempfile.TemporaryDirectory() as temp_dir:
storage_dir = Path(temp_dir) / "crewai_test_storage"
storage_dir.mkdir(parents=True, exist_ok=True)
if not storage_dir.exists() or not storage_dir.is_dir():
raise RuntimeError(
f"Failed to create test storage directory: {storage_dir}"
)
try:
test_file = storage_dir / ".permissions_test"
test_file.touch()
test_file.unlink()
except (OSError, IOError) as e:
raise RuntimeError(
f"Test storage directory {storage_dir} is not writable: {e}"
) from e
os.environ["CREWAI_STORAGE_DIR"] = str(storage_dir)
os.environ["CREWAI_TESTING"] = "true"
try:
yield
finally:
os.environ.pop("CREWAI_TESTING", "true")
os.environ.pop("CREWAI_STORAGE_DIR", None)
os.environ.pop("CREWAI_DISABLE_TELEMETRY", "true")
os.environ.pop("OTEL_SDK_DISABLED", "true")
os.environ.pop("OPENAI_BASE_URL", "https://api.openai.com/v1")
os.environ.pop("OPENAI_API_BASE", "https://api.openai.com/v1")
HEADERS_TO_FILTER = {
"authorization": "AUTHORIZATION-XXX",
"content-security-policy": "CSP-FILTERED",
"cookie": "COOKIE-XXX",
"set-cookie": "SET-COOKIE-XXX",
"permissions-policy": "PERMISSIONS-POLICY-XXX",
"referrer-policy": "REFERRER-POLICY-XXX",
"strict-transport-security": "STS-XXX",
"x-content-type-options": "X-CONTENT-TYPE-XXX",
"x-frame-options": "X-FRAME-OPTIONS-XXX",
"x-permitted-cross-domain-policies": "X-PERMITTED-XXX",
"x-request-id": "X-REQUEST-ID-XXX",
"x-runtime": "X-RUNTIME-XXX",
"x-xss-protection": "X-XSS-PROTECTION-XXX",
"x-stainless-arch": "X-STAINLESS-ARCH-XXX",
"x-stainless-os": "X-STAINLESS-OS-XXX",
"x-stainless-read-timeout": "X-STAINLESS-READ-TIMEOUT-XXX",
"cf-ray": "CF-RAY-XXX",
"etag": "ETAG-XXX",
"Strict-Transport-Security": "STS-XXX",
"access-control-expose-headers": "ACCESS-CONTROL-XXX",
"openai-organization": "OPENAI-ORG-XXX",
"openai-project": "OPENAI-PROJECT-XXX",
"x-ratelimit-limit-requests": "X-RATELIMIT-LIMIT-REQUESTS-XXX",
"x-ratelimit-limit-tokens": "X-RATELIMIT-LIMIT-TOKENS-XXX",
"x-ratelimit-remaining-requests": "X-RATELIMIT-REMAINING-REQUESTS-XXX",
"x-ratelimit-remaining-tokens": "X-RATELIMIT-REMAINING-TOKENS-XXX",
"x-ratelimit-reset-requests": "X-RATELIMIT-RESET-REQUESTS-XXX",
"x-ratelimit-reset-tokens": "X-RATELIMIT-RESET-TOKENS-XXX",
"x-goog-api-key": "X-GOOG-API-KEY-XXX",
"api-key": "X-API-KEY-XXX",
"User-Agent": "X-USER-AGENT-XXX",
"apim-request-id:": "X-API-CLIENT-REQUEST-ID-XXX",
"azureml-model-session": "AZUREML-MODEL-SESSION-XXX",
"x-ms-client-request-id": "X-MS-CLIENT-REQUEST-ID-XXX",
"x-ms-region": "X-MS-REGION-XXX",
"apim-request-id": "APIM-REQUEST-ID-XXX",
"x-api-key": "X-API-KEY-XXX",
"anthropic-organization-id": "ANTHROPIC-ORGANIZATION-ID-XXX",
"request-id": "REQUEST-ID-XXX",
"anthropic-ratelimit-input-tokens-limit": "ANTHROPIC-RATELIMIT-INPUT-TOKENS-LIMIT-XXX",
"anthropic-ratelimit-input-tokens-remaining": "ANTHROPIC-RATELIMIT-INPUT-TOKENS-REMAINING-XXX",
"anthropic-ratelimit-input-tokens-reset": "ANTHROPIC-RATELIMIT-INPUT-TOKENS-RESET-XXX",
"anthropic-ratelimit-output-tokens-limit": "ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-LIMIT-XXX",
"anthropic-ratelimit-output-tokens-remaining": "ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-REMAINING-XXX",
"anthropic-ratelimit-output-tokens-reset": "ANTHROPIC-RATELIMIT-OUTPUT-TOKENS-RESET-XXX",
"anthropic-ratelimit-tokens-limit": "ANTHROPIC-RATELIMIT-TOKENS-LIMIT-XXX",
"anthropic-ratelimit-tokens-remaining": "ANTHROPIC-RATELIMIT-TOKENS-REMAINING-XXX",
"anthropic-ratelimit-tokens-reset": "ANTHROPIC-RATELIMIT-TOKENS-RESET-XXX",
"x-amz-date": "X-AMZ-DATE-XXX",
"amz-sdk-invocation-id": "AMZ-SDK-INVOCATION-ID-XXX",
"accept-encoding": "ACCEPT-ENCODING-XXX",
"x-amzn-requestid": "X-AMZN-REQUESTID-XXX",
"x-amzn-RequestId": "X-AMZN-REQUESTID-XXX",
"x-a2a-notification-token": "X-A2A-NOTIFICATION-TOKEN-XXX",
"x-a2a-version": "X-A2A-VERSION-XXX",
}
def _filter_request_headers(request: Request) -> Request: # type: ignore[no-any-unimported]
"""Filter sensitive headers from request before recording."""
for header_name, replacement in HEADERS_TO_FILTER.items():
for variant in [header_name, header_name.upper(), header_name.title()]:
if variant in request.headers:
request.headers[variant] = [replacement]
request.method = request.method.upper()
return request
def _filter_response_headers(response: dict[str, Any]) -> dict[str, Any]:
"""Filter sensitive headers from response before recording."""
# Remove Content-Encoding to prevent decompression issues on replay
for encoding_header in ["Content-Encoding", "content-encoding"]:
response["headers"].pop(encoding_header, None)
for header_name, replacement in HEADERS_TO_FILTER.items():
for variant in [header_name, header_name.upper(), header_name.title()]:
if variant in response["headers"]:
response["headers"][variant] = [replacement]
return response
@pytest.fixture(scope="module")
def vcr_cassette_dir(request: Any) -> str:
"""Generate cassette directory path based on test module location.
Organizes cassettes to mirror test directory structure within each package:
lib/crewai/tests/llms/google/test_google.py -> lib/crewai/tests/cassettes/llms/google/
lib/crewai-tools/tests/tools/test_search.py -> lib/crewai-tools/tests/cassettes/tools/
"""
test_file = Path(request.fspath)
for parent in test_file.parents:
if parent.name in ("crewai", "crewai-tools") and parent.parent.name == "lib":
package_root = parent
break
else:
package_root = test_file.parent
tests_root = package_root / "tests"
test_dir = test_file.parent
if test_dir != tests_root:
relative_path = test_dir.relative_to(tests_root)
cassette_dir = tests_root / "cassettes" / relative_path
else:
cassette_dir = tests_root / "cassettes"
cassette_dir.mkdir(parents=True, exist_ok=True)
return str(cassette_dir)
@pytest.fixture(scope="module")
def vcr_config(vcr_cassette_dir: str) -> dict[str, Any]:
"""Configure VCR with organized cassette storage."""
config = {
"cassette_library_dir": vcr_cassette_dir,
"record_mode": os.getenv("PYTEST_VCR_RECORD_MODE", "once"),
"filter_headers": [(k, v) for k, v in HEADERS_TO_FILTER.items()],
"before_record_request": _filter_request_headers,
"before_record_response": _filter_response_headers,
"filter_query_parameters": ["key"],
"match_on": ["method", "scheme", "host", "port", "path"],
}
if os.getenv("GITHUB_ACTIONS") == "true":
config["record_mode"] = "none"
return config

View File

@@ -116,7 +116,6 @@
"en/concepts/tasks", "en/concepts/tasks",
"en/concepts/crews", "en/concepts/crews",
"en/concepts/flows", "en/concepts/flows",
"en/concepts/production-architecture",
"en/concepts/knowledge", "en/concepts/knowledge",
"en/concepts/llms", "en/concepts/llms",
"en/concepts/processes", "en/concepts/processes",
@@ -135,7 +134,6 @@
"group": "MCP Integration", "group": "MCP Integration",
"pages": [ "pages": [
"en/mcp/overview", "en/mcp/overview",
"en/mcp/dsl-integration",
"en/mcp/stdio", "en/mcp/stdio",
"en/mcp/sse", "en/mcp/sse",
"en/mcp/streamable-http", "en/mcp/streamable-http",
@@ -254,8 +252,7 @@
"pages": [ "pages": [
"en/tools/integration/overview", "en/tools/integration/overview",
"en/tools/integration/bedrockinvokeagenttool", "en/tools/integration/bedrockinvokeagenttool",
"en/tools/integration/crewaiautomationtool", "en/tools/integration/crewaiautomationtool"
"en/tools/integration/mergeagenthandlertool"
] ]
}, },
{ {
@@ -278,7 +275,6 @@
"en/observability/overview", "en/observability/overview",
"en/observability/arize-phoenix", "en/observability/arize-phoenix",
"en/observability/braintrust", "en/observability/braintrust",
"en/observability/datadog",
"en/observability/langdb", "en/observability/langdb",
"en/observability/langfuse", "en/observability/langfuse",
"en/observability/langtrace", "en/observability/langtrace",
@@ -309,17 +305,13 @@
"en/learn/hierarchical-process", "en/learn/hierarchical-process",
"en/learn/human-input-on-execution", "en/learn/human-input-on-execution",
"en/learn/human-in-the-loop", "en/learn/human-in-the-loop",
"en/learn/human-feedback-in-flows",
"en/learn/kickoff-async", "en/learn/kickoff-async",
"en/learn/kickoff-for-each", "en/learn/kickoff-for-each",
"en/learn/llm-connections", "en/learn/llm-connections",
"en/learn/multimodal-agents", "en/learn/multimodal-agents",
"en/learn/replay-tasks-from-latest-crew-kickoff", "en/learn/replay-tasks-from-latest-crew-kickoff",
"en/learn/sequential-process", "en/learn/sequential-process",
"en/learn/using-annotations", "en/learn/using-annotations"
"en/learn/execution-hooks",
"en/learn/llm-hooks",
"en/learn/tool-hooks"
] ]
}, },
{ {
@@ -369,20 +361,10 @@
"en/enterprise/integrations/github", "en/enterprise/integrations/github",
"en/enterprise/integrations/gmail", "en/enterprise/integrations/gmail",
"en/enterprise/integrations/google_calendar", "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_sheets",
"en/enterprise/integrations/google_slides",
"en/enterprise/integrations/hubspot", "en/enterprise/integrations/hubspot",
"en/enterprise/integrations/jira", "en/enterprise/integrations/jira",
"en/enterprise/integrations/linear", "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/notion",
"en/enterprise/integrations/salesforce", "en/enterprise/integrations/salesforce",
"en/enterprise/integrations/shopify", "en/enterprise/integrations/shopify",
@@ -560,7 +542,6 @@
"pt-BR/concepts/tasks", "pt-BR/concepts/tasks",
"pt-BR/concepts/crews", "pt-BR/concepts/crews",
"pt-BR/concepts/flows", "pt-BR/concepts/flows",
"pt-BR/concepts/production-architecture",
"pt-BR/concepts/knowledge", "pt-BR/concepts/knowledge",
"pt-BR/concepts/llms", "pt-BR/concepts/llms",
"pt-BR/concepts/processes", "pt-BR/concepts/processes",
@@ -579,7 +560,6 @@
"group": "Integração MCP", "group": "Integração MCP",
"pages": [ "pages": [
"pt-BR/mcp/overview", "pt-BR/mcp/overview",
"pt-BR/mcp/dsl-integration",
"pt-BR/mcp/stdio", "pt-BR/mcp/stdio",
"pt-BR/mcp/sse", "pt-BR/mcp/sse",
"pt-BR/mcp/streamable-http", "pt-BR/mcp/streamable-http",
@@ -705,11 +685,9 @@
{ {
"group": "Observabilidade", "group": "Observabilidade",
"pages": [ "pages": [
"pt-BR/observability/tracing",
"pt-BR/observability/overview", "pt-BR/observability/overview",
"pt-BR/observability/arize-phoenix", "pt-BR/observability/arize-phoenix",
"pt-BR/observability/braintrust", "pt-BR/observability/braintrust",
"pt-BR/observability/datadog",
"pt-BR/observability/langdb", "pt-BR/observability/langdb",
"pt-BR/observability/langfuse", "pt-BR/observability/langfuse",
"pt-BR/observability/langtrace", "pt-BR/observability/langtrace",
@@ -739,17 +717,13 @@
"pt-BR/learn/hierarchical-process", "pt-BR/learn/hierarchical-process",
"pt-BR/learn/human-input-on-execution", "pt-BR/learn/human-input-on-execution",
"pt-BR/learn/human-in-the-loop", "pt-BR/learn/human-in-the-loop",
"pt-BR/learn/human-feedback-in-flows",
"pt-BR/learn/kickoff-async", "pt-BR/learn/kickoff-async",
"pt-BR/learn/kickoff-for-each", "pt-BR/learn/kickoff-for-each",
"pt-BR/learn/llm-connections", "pt-BR/learn/llm-connections",
"pt-BR/learn/multimodal-agents", "pt-BR/learn/multimodal-agents",
"pt-BR/learn/replay-tasks-from-latest-crew-kickoff", "pt-BR/learn/replay-tasks-from-latest-crew-kickoff",
"pt-BR/learn/sequential-process", "pt-BR/learn/sequential-process",
"pt-BR/learn/using-annotations", "pt-BR/learn/using-annotations"
"pt-BR/learn/execution-hooks",
"pt-BR/learn/llm-hooks",
"pt-BR/learn/tool-hooks"
] ]
}, },
{ {
@@ -799,20 +773,10 @@
"pt-BR/enterprise/integrations/github", "pt-BR/enterprise/integrations/github",
"pt-BR/enterprise/integrations/gmail", "pt-BR/enterprise/integrations/gmail",
"pt-BR/enterprise/integrations/google_calendar", "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_sheets",
"pt-BR/enterprise/integrations/google_slides",
"pt-BR/enterprise/integrations/hubspot", "pt-BR/enterprise/integrations/hubspot",
"pt-BR/enterprise/integrations/jira", "pt-BR/enterprise/integrations/jira",
"pt-BR/enterprise/integrations/linear", "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/notion",
"pt-BR/enterprise/integrations/salesforce", "pt-BR/enterprise/integrations/salesforce",
"pt-BR/enterprise/integrations/shopify", "pt-BR/enterprise/integrations/shopify",
@@ -841,12 +805,6 @@
"group": "Triggers", "group": "Triggers",
"pages": [ "pages": [
"pt-BR/enterprise/guides/automation-triggers", "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/slack-trigger",
"pt-BR/enterprise/guides/hubspot-trigger", "pt-BR/enterprise/guides/hubspot-trigger",
"pt-BR/enterprise/guides/salesforce-trigger", "pt-BR/enterprise/guides/salesforce-trigger",
@@ -987,7 +945,6 @@
"ko/concepts/tasks", "ko/concepts/tasks",
"ko/concepts/crews", "ko/concepts/crews",
"ko/concepts/flows", "ko/concepts/flows",
"ko/concepts/production-architecture",
"ko/concepts/knowledge", "ko/concepts/knowledge",
"ko/concepts/llms", "ko/concepts/llms",
"ko/concepts/processes", "ko/concepts/processes",
@@ -1006,7 +963,6 @@
"group": "MCP 통합", "group": "MCP 통합",
"pages": [ "pages": [
"ko/mcp/overview", "ko/mcp/overview",
"ko/mcp/dsl-integration",
"ko/mcp/stdio", "ko/mcp/stdio",
"ko/mcp/sse", "ko/mcp/sse",
"ko/mcp/streamable-http", "ko/mcp/streamable-http",
@@ -1144,11 +1100,9 @@
{ {
"group": "Observability", "group": "Observability",
"pages": [ "pages": [
"ko/observability/tracing",
"ko/observability/overview", "ko/observability/overview",
"ko/observability/arize-phoenix", "ko/observability/arize-phoenix",
"ko/observability/braintrust", "ko/observability/braintrust",
"ko/observability/datadog",
"ko/observability/langdb", "ko/observability/langdb",
"ko/observability/langfuse", "ko/observability/langfuse",
"ko/observability/langtrace", "ko/observability/langtrace",
@@ -1178,17 +1132,13 @@
"ko/learn/hierarchical-process", "ko/learn/hierarchical-process",
"ko/learn/human-input-on-execution", "ko/learn/human-input-on-execution",
"ko/learn/human-in-the-loop", "ko/learn/human-in-the-loop",
"ko/learn/human-feedback-in-flows",
"ko/learn/kickoff-async", "ko/learn/kickoff-async",
"ko/learn/kickoff-for-each", "ko/learn/kickoff-for-each",
"ko/learn/llm-connections", "ko/learn/llm-connections",
"ko/learn/multimodal-agents", "ko/learn/multimodal-agents",
"ko/learn/replay-tasks-from-latest-crew-kickoff", "ko/learn/replay-tasks-from-latest-crew-kickoff",
"ko/learn/sequential-process", "ko/learn/sequential-process",
"ko/learn/using-annotations", "ko/learn/using-annotations"
"ko/learn/execution-hooks",
"ko/learn/llm-hooks",
"ko/learn/tool-hooks"
] ]
}, },
{ {
@@ -1238,20 +1188,10 @@
"ko/enterprise/integrations/github", "ko/enterprise/integrations/github",
"ko/enterprise/integrations/gmail", "ko/enterprise/integrations/gmail",
"ko/enterprise/integrations/google_calendar", "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_sheets",
"ko/enterprise/integrations/google_slides",
"ko/enterprise/integrations/hubspot", "ko/enterprise/integrations/hubspot",
"ko/enterprise/integrations/jira", "ko/enterprise/integrations/jira",
"ko/enterprise/integrations/linear", "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/notion",
"ko/enterprise/integrations/salesforce", "ko/enterprise/integrations/salesforce",
"ko/enterprise/integrations/shopify", "ko/enterprise/integrations/shopify",
@@ -1280,12 +1220,6 @@
"group": "트리거", "group": "트리거",
"pages": [ "pages": [
"ko/enterprise/guides/automation-triggers", "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/slack-trigger",
"ko/enterprise/guides/hubspot-trigger", "ko/enterprise/guides/hubspot-trigger",
"ko/enterprise/guides/salesforce-trigger", "ko/enterprise/guides/salesforce-trigger",

View File

@@ -16,17 +16,16 @@ Welcome to the CrewAI AMP API reference. This API allows you to programmatically
Navigate to your crew's detail page in the CrewAI AMP dashboard and copy your Bearer Token from the Status tab. Navigate to your crew's detail page in the CrewAI AMP dashboard and copy your Bearer Token from the Status tab.
</Step> </Step>
<Step title="Discover Required Inputs"> <Step title="Discover Required Inputs">
Use the `GET /inputs` endpoint to see what parameters your crew expects. Use the `GET /inputs` endpoint to see what parameters your crew expects.
</Step> </Step>
<Step title="Start a Crew Execution"> <Step title="Start a Crew Execution">
Call `POST /kickoff` with your inputs to start the crew execution and receive Call `POST /kickoff` with your inputs to start the crew execution and receive a `kickoff_id`.
a `kickoff_id`. </Step>
</Step>
<Step title="Monitor Progress"> <Step title="Monitor Progress">
Use `GET /{kickoff_id}/status` to check execution status and retrieve results. Use `GET /status/{kickoff_id}` to check execution status and retrieve results.
</Step> </Step>
</Steps> </Steps>
@@ -41,14 +40,13 @@ curl -H "Authorization: Bearer YOUR_CREW_TOKEN" \
### Token Types ### Token Types
| Token Type | Scope | Use Case | | Token Type | Scope | Use Case |
| :-------------------- | :------------------------ | :----------------------------------------------------------- | |:-----------|:--------|:----------|
| **Bearer Token** | Organization-level access | Full crew operations, ideal for server-to-server integration | | **Bearer Token** | Organization-level access | Full crew operations, ideal for server-to-server integration |
| **User Bearer Token** | User-scoped access | Limited permissions, suitable for user-specific operations | | **User Bearer Token** | User-scoped access | Limited permissions, suitable for user-specific operations |
<Tip> <Tip>
You can find both token types in the Status tab of your crew's detail page in You can find both token types in the Status tab of your crew's detail page in the CrewAI AMP dashboard.
the CrewAI AMP dashboard.
</Tip> </Tip>
## Base URL ## Base URL
@@ -65,33 +63,29 @@ Replace `your-crew-name` with your actual crew's URL from the dashboard.
1. **Discovery**: Call `GET /inputs` to understand what your crew needs 1. **Discovery**: Call `GET /inputs` to understand what your crew needs
2. **Execution**: Submit inputs via `POST /kickoff` to start processing 2. **Execution**: Submit inputs via `POST /kickoff` to start processing
3. **Monitoring**: Poll `GET /{kickoff_id}/status` until completion 3. **Monitoring**: Poll `GET /status/{kickoff_id}` until completion
4. **Results**: Extract the final output from the completed response 4. **Results**: Extract the final output from the completed response
## Error Handling ## Error Handling
The API uses standard HTTP status codes: The API uses standard HTTP status codes:
| Code | Meaning | | Code | Meaning |
| ----- | :----------------------------------------- | |------|:--------|
| `200` | Success | | `200` | Success |
| `400` | Bad Request - Invalid input format | | `400` | Bad Request - Invalid input format |
| `401` | Unauthorized - Invalid bearer token | | `401` | Unauthorized - Invalid bearer token |
| `404` | Not Found - Resource doesn't exist | | `404` | Not Found - Resource doesn't exist |
| `422` | Validation Error - Missing required inputs | | `422` | Validation Error - Missing required inputs |
| `500` | Server Error - Contact support | | `500` | Server Error - Contact support |
## Interactive Testing ## Interactive Testing
<Info> <Info>
**Why no "Send" button?** Since each CrewAI AMP user has their own unique crew **Why no "Send" button?** Since each CrewAI AMP user has their own unique crew URL, we use **reference mode** instead of an interactive playground to avoid confusion. This shows you exactly what the requests should look like without non-functional send buttons.
URL, we use **reference mode** instead of an interactive playground to avoid
confusion. This shows you exactly what the requests should look like without
non-functional send buttons.
</Info> </Info>
Each endpoint page shows you: Each endpoint page shows you:
- ✅ **Exact request format** with all parameters - ✅ **Exact request format** with all parameters
- ✅ **Response examples** for success and error cases - ✅ **Response examples** for success and error cases
- ✅ **Code samples** in multiple languages (cURL, Python, JavaScript, etc.) - ✅ **Code samples** in multiple languages (cURL, Python, JavaScript, etc.)
@@ -109,7 +103,6 @@ Each endpoint page shows you:
</CardGroup> </CardGroup>
**Example workflow:** **Example workflow:**
1. **Copy this cURL example** from any endpoint page 1. **Copy this cURL example** from any endpoint page
2. **Replace `your-actual-crew-name.crewai.com`** with your real crew URL 2. **Replace `your-actual-crew-name.crewai.com`** with your real crew URL
3. **Replace the Bearer token** with your real token from the dashboard 3. **Replace the Bearer token** with your real token from the dashboard
@@ -118,18 +111,10 @@ Each endpoint page shows you:
## Need Help? ## Need Help?
<CardGroup cols={2}> <CardGroup cols={2}>
<Card <Card title="Enterprise Support" icon="headset" href="mailto:support@crewai.com">
title="Enterprise Support"
icon="headset"
href="mailto:support@crewai.com"
>
Get help with API integration and troubleshooting Get help with API integration and troubleshooting
</Card> </Card>
<Card <Card title="Enterprise Dashboard" icon="chart-line" href="https://app.crewai.com">
title="Enterprise Dashboard"
icon="chart-line"
href="https://app.crewai.com"
>
Manage your crews and view execution logs Manage your crews and view execution logs
</Card> </Card>
</CardGroup> </CardGroup>

View File

@@ -1,6 +1,8 @@
--- ---
title: "GET /{kickoff_id}/status" title: "GET /status/{kickoff_id}"
description: "Get execution status" description: "Get execution status"
openapi: "/enterprise-api.en.yaml GET /{kickoff_id}/status" openapi: "/enterprise-api.en.yaml GET /status/{kickoff_id}"
mode: "wide" mode: "wide"
--- ---

View File

@@ -8,7 +8,6 @@ mode: "wide"
## Overview of an Agent ## Overview of an Agent
In the CrewAI framework, an `Agent` is an autonomous unit that can: In the CrewAI framework, an `Agent` is an autonomous unit that can:
- Perform specific tasks - Perform specific tasks
- Make decisions based on its role and goal - Make decisions based on its role and goal
- Use tools to accomplish objectives - Use tools to accomplish objectives
@@ -17,10 +16,7 @@ In the CrewAI framework, an `Agent` is an autonomous unit that can:
- Delegate tasks when allowed - Delegate tasks when allowed
<Tip> <Tip>
Think of an agent as a specialized team member with specific skills, Think of an agent as a specialized team member with specific skills, expertise, and responsibilities. For example, a `Researcher` agent might excel at gathering and analyzing information, while a `Writer` agent might be better at creating content.
expertise, and responsibilities. For example, a `Researcher` agent might excel
at gathering and analyzing information, while a `Writer` agent might be better
at creating content.
</Tip> </Tip>
<Note type="info" title="Enterprise Enhancement: Visual Agent Builder"> <Note type="info" title="Enterprise Enhancement: Visual Agent Builder">
@@ -29,7 +25,6 @@ CrewAI AMP includes a Visual Agent Builder that simplifies agent creation and co
![Visual Agent Builder Screenshot](/images/enterprise/crew-studio-interface.png) ![Visual Agent Builder Screenshot](/images/enterprise/crew-studio-interface.png)
The Visual Agent Builder enables: The Visual Agent Builder enables:
- Intuitive agent configuration with form-based interfaces - Intuitive agent configuration with form-based interfaces
- Real-time testing and validation - Real-time testing and validation
- Template library with pre-configured agent types - Template library with pre-configured agent types
@@ -38,36 +33,36 @@ The Visual Agent Builder enables:
## Agent Attributes ## Agent Attributes
| Attribute | Parameter | Type | Description | | Attribute | Parameter | Type | Description |
| :-------------------------------------- | :----------------------- | :------------------------------------ | :------------------------------------------------------------------------------------------------------- | | :-------------------------------------- | :----------------------- | :---------------------------- | :------------------------------------------------------------------------------------------------------------------- |
| **Role** | `role` | `str` | Defines the agent's function and expertise within the crew. | | **Role** | `role` | `str` | Defines the agent's function and expertise within the crew. |
| **Goal** | `goal` | `str` | The individual objective that guides the agent's decision-making. | | **Goal** | `goal` | `str` | The individual objective that guides the agent's decision-making. |
| **Backstory** | `backstory` | `str` | Provides context and personality to the agent, enriching interactions. | | **Backstory** | `backstory` | `str` | Provides context and personality to the agent, enriching interactions. |
| **LLM** _(optional)_ | `llm` | `Union[str, LLM, Any]` | Language model that powers the agent. Defaults to the model specified in `OPENAI_MODEL_NAME` or "gpt-4". | | **LLM** _(optional)_ | `llm` | `Union[str, LLM, Any]` | Language model that powers the agent. Defaults to the model specified in `OPENAI_MODEL_NAME` or "gpt-4". |
| **Tools** _(optional)_ | `tools` | `List[BaseTool]` | Capabilities or functions available to the agent. Defaults to an empty list. | | **Tools** _(optional)_ | `tools` | `List[BaseTool]` | Capabilities or functions available to the agent. Defaults to an empty list. |
| **Function Calling LLM** _(optional)_ | `function_calling_llm` | `Optional[Any]` | Language model for tool calling, overrides crew's LLM if specified. | | **Function Calling LLM** _(optional)_ | `function_calling_llm` | `Optional[Any]` | Language model for tool calling, overrides crew's LLM if specified. |
| **Max Iterations** _(optional)_ | `max_iter` | `int` | Maximum iterations before the agent must provide its best answer. Default is 20. | | **Max Iterations** _(optional)_ | `max_iter` | `int` | Maximum iterations before the agent must provide its best answer. Default is 20. |
| **Max RPM** _(optional)_ | `max_rpm` | `Optional[int]` | Maximum requests per minute to avoid rate limits. | | **Max RPM** _(optional)_ | `max_rpm` | `Optional[int]` | Maximum requests per minute to avoid rate limits. |
| **Max Execution Time** _(optional)_ | `max_execution_time` | `Optional[int]` | Maximum time (in seconds) for task execution. | | **Max Execution Time** _(optional)_ | `max_execution_time` | `Optional[int]` | Maximum time (in seconds) for task execution. |
| **Verbose** _(optional)_ | `verbose` | `bool` | Enable detailed execution logs for debugging. Default is False. | | **Verbose** _(optional)_ | `verbose` | `bool` | Enable detailed execution logs for debugging. Default is False. |
| **Allow Delegation** _(optional)_ | `allow_delegation` | `bool` | Allow the agent to delegate tasks to other agents. Default is False. | | **Allow Delegation** _(optional)_ | `allow_delegation` | `bool` | Allow the agent to delegate tasks to other agents. Default is False. |
| **Step Callback** _(optional)_ | `step_callback` | `Optional[Any]` | Function called after each agent step, overrides crew callback. | | **Step Callback** _(optional)_ | `step_callback` | `Optional[Any]` | Function called after each agent step, overrides crew callback. |
| **Cache** _(optional)_ | `cache` | `bool` | Enable caching for tool usage. Default is True. | | **Cache** _(optional)_ | `cache` | `bool` | Enable caching for tool usage. Default is True. |
| **System Template** _(optional)_ | `system_template` | `Optional[str]` | Custom system prompt template for the agent. | | **System Template** _(optional)_ | `system_template` | `Optional[str]` | Custom system prompt template for the agent. |
| **Prompt Template** _(optional)_ | `prompt_template` | `Optional[str]` | Custom prompt template for the agent. | | **Prompt Template** _(optional)_ | `prompt_template` | `Optional[str]` | Custom prompt template for the agent. |
| **Response Template** _(optional)_ | `response_template` | `Optional[str]` | Custom response template for the agent. | | **Response Template** _(optional)_ | `response_template` | `Optional[str]` | Custom response template for the agent. |
| **Allow Code Execution** _(optional)_ | `allow_code_execution` | `Optional[bool]` | Enable code execution for the agent. Default is False. | | **Allow Code Execution** _(optional)_ | `allow_code_execution` | `Optional[bool]` | Enable code execution for the agent. Default is False. |
| **Max Retry Limit** _(optional)_ | `max_retry_limit` | `int` | Maximum number of retries when an error occurs. Default is 2. | | **Max Retry Limit** _(optional)_ | `max_retry_limit` | `int` | Maximum number of retries when an error occurs. Default is 2. |
| **Respect Context Window** _(optional)_ | `respect_context_window` | `bool` | Keep messages under context window size by summarizing. Default is True. | | **Respect Context Window** _(optional)_ | `respect_context_window` | `bool` | Keep messages under context window size by summarizing. Default is True. |
| **Code Execution Mode** _(optional)_ | `code_execution_mode` | `Literal["safe", "unsafe"]` | Mode for code execution: 'safe' (using Docker) or 'unsafe' (direct). Default is 'safe'. | | **Code Execution Mode** _(optional)_ | `code_execution_mode` | `Literal["safe", "unsafe"]` | Mode for code execution: 'safe' (using Docker) or 'unsafe' (direct). Default is 'safe'. |
| **Multimodal** _(optional)_ | `multimodal` | `bool` | Whether the agent supports multimodal capabilities. Default is False. | | **Multimodal** _(optional)_ | `multimodal` | `bool` | Whether the agent supports multimodal capabilities. Default is False. |
| **Inject Date** _(optional)_ | `inject_date` | `bool` | Whether to automatically inject the current date into tasks. Default is False. | | **Inject Date** _(optional)_ | `inject_date` | `bool` | Whether to automatically inject the current date into tasks. Default is False. |
| **Date Format** _(optional)_ | `date_format` | `str` | Format string for date when inject_date is enabled. Default is "%Y-%m-%d" (ISO format). | | **Date Format** _(optional)_ | `date_format` | `str` | Format string for date when inject_date is enabled. Default is "%Y-%m-%d" (ISO format). |
| **Reasoning** _(optional)_ | `reasoning` | `bool` | Whether the agent should reflect and create a plan before executing a task. Default is False. | | **Reasoning** _(optional)_ | `reasoning` | `bool` | Whether the agent should reflect and create a plan before executing a task. Default is False. |
| **Max Reasoning Attempts** _(optional)_ | `max_reasoning_attempts` | `Optional[int]` | Maximum number of reasoning attempts before executing the task. If None, will try until ready. | | **Max Reasoning Attempts** _(optional)_ | `max_reasoning_attempts` | `Optional[int]` | Maximum number of reasoning attempts before executing the task. If None, will try until ready. |
| **Embedder** _(optional)_ | `embedder` | `Optional[Dict[str, Any]]` | Configuration for the embedder used by the agent. | | **Embedder** _(optional)_ | `embedder` | `Optional[Dict[str, Any]]` | Configuration for the embedder used by the agent. |
| **Knowledge Sources** _(optional)_ | `knowledge_sources` | `Optional[List[BaseKnowledgeSource]]` | Knowledge sources available to the agent. | | **Knowledge Sources** _(optional)_ | `knowledge_sources` | `Optional[List[BaseKnowledgeSource]]` | Knowledge sources available to the agent. |
| **Use System Prompt** _(optional)_ | `use_system_prompt` | `Optional[bool]` | Whether to use system prompt (for o1 model support). Default is True. | | **Use System Prompt** _(optional)_ | `use_system_prompt` | `Optional[bool]` | Whether to use system prompt (for o1 model support). Default is True. |
## Creating Agents ## Creating Agents
@@ -142,8 +137,7 @@ class LatestAiDevelopmentCrew():
``` ```
<Note> <Note>
The names you use in your YAML files (`agents.yaml`) should match the method The names you use in your YAML files (`agents.yaml`) should match the method names in your Python code.
names in your Python code.
</Note> </Note>
### Direct Code Definition ### Direct Code Definition
@@ -190,7 +184,6 @@ agent = Agent(
Let's break down some key parameter combinations for common use cases: Let's break down some key parameter combinations for common use cases:
#### Basic Research Agent #### Basic Research Agent
```python Code ```python Code
research_agent = Agent( research_agent = Agent(
role="Research Analyst", role="Research Analyst",
@@ -202,7 +195,6 @@ research_agent = Agent(
``` ```
#### Code Development Agent #### Code Development Agent
```python Code ```python Code
dev_agent = Agent( dev_agent = Agent(
role="Senior Python Developer", role="Senior Python Developer",
@@ -216,7 +208,6 @@ dev_agent = Agent(
``` ```
#### Long-Running Analysis Agent #### Long-Running Analysis Agent
```python Code ```python Code
analysis_agent = Agent( analysis_agent = Agent(
role="Data Analyst", role="Data Analyst",
@@ -230,7 +221,6 @@ analysis_agent = Agent(
``` ```
#### Custom Template Agent #### Custom Template Agent
```python Code ```python Code
custom_agent = Agent( custom_agent = Agent(
role="Customer Service Representative", role="Customer Service Representative",
@@ -246,7 +236,6 @@ custom_agent = Agent(
``` ```
#### Date-Aware Agent with Reasoning #### Date-Aware Agent with Reasoning
```python Code ```python Code
strategic_agent = Agent( strategic_agent = Agent(
role="Market Analyst", role="Market Analyst",
@@ -261,7 +250,6 @@ strategic_agent = Agent(
``` ```
#### Reasoning Agent #### Reasoning Agent
```python Code ```python Code
reasoning_agent = Agent( reasoning_agent = Agent(
role="Strategic Planner", role="Strategic Planner",
@@ -275,7 +263,6 @@ reasoning_agent = Agent(
``` ```
#### Multimodal Agent #### Multimodal Agent
```python Code ```python Code
multimodal_agent = Agent( multimodal_agent = Agent(
role="Visual Content Analyst", role="Visual Content Analyst",
@@ -289,64 +276,52 @@ multimodal_agent = Agent(
### Parameter Details ### Parameter Details
#### Critical Parameters #### Critical Parameters
- `role`, `goal`, and `backstory` are required and shape the agent's behavior - `role`, `goal`, and `backstory` are required and shape the agent's behavior
- `llm` determines the language model used (default: OpenAI's GPT-4) - `llm` determines the language model used (default: OpenAI's GPT-4)
#### Memory and Context #### Memory and Context
- `memory`: Enable to maintain conversation history - `memory`: Enable to maintain conversation history
- `respect_context_window`: Prevents token limit issues - `respect_context_window`: Prevents token limit issues
- `knowledge_sources`: Add domain-specific knowledge bases - `knowledge_sources`: Add domain-specific knowledge bases
#### Execution Control #### Execution Control
- `max_iter`: Maximum attempts before giving best answer - `max_iter`: Maximum attempts before giving best answer
- `max_execution_time`: Timeout in seconds - `max_execution_time`: Timeout in seconds
- `max_rpm`: Rate limiting for API calls - `max_rpm`: Rate limiting for API calls
- `max_retry_limit`: Retries on error - `max_retry_limit`: Retries on error
#### Code Execution #### Code Execution
- `allow_code_execution`: Must be True to run code - `allow_code_execution`: Must be True to run code
- `code_execution_mode`: - `code_execution_mode`:
- `"safe"`: Uses Docker (recommended for production) - `"safe"`: Uses Docker (recommended for production)
- `"unsafe"`: Direct execution (use only in trusted environments) - `"unsafe"`: Direct execution (use only in trusted environments)
<Note> <Note>
This runs a default Docker image. If you want to configure the docker image, This runs a default Docker image. If you want to configure the docker image, the checkout the Code Interpreter Tool in the tools section.
the checkout the Code Interpreter Tool in the tools section. Add the code Add the code interpreter tool as a tool in the agent as a tool parameter.
interpreter tool as a tool in the agent as a tool parameter. </Note>
</Note>
#### Advanced Features #### Advanced Features
- `multimodal`: Enable multimodal capabilities for processing text and visual content - `multimodal`: Enable multimodal capabilities for processing text and visual content
- `reasoning`: Enable agent to reflect and create plans before executing tasks - `reasoning`: Enable agent to reflect and create plans before executing tasks
- `inject_date`: Automatically inject current date into task descriptions - `inject_date`: Automatically inject current date into task descriptions
#### Templates #### Templates
- `system_template`: Defines agent's core behavior - `system_template`: Defines agent's core behavior
- `prompt_template`: Structures input format - `prompt_template`: Structures input format
- `response_template`: Formats agent responses - `response_template`: Formats agent responses
<Note> <Note>
When using custom templates, ensure that both `system_template` and When using custom templates, ensure that both `system_template` and `prompt_template` are defined. The `response_template` is optional but recommended for consistent output formatting.
`prompt_template` are defined. The `response_template` is optional but
recommended for consistent output formatting.
</Note> </Note>
<Note> <Note>
When using custom templates, you can use variables like `{role}`, `{goal}`, When using custom templates, you can use variables like `{role}`, `{goal}`, and `{backstory}` in your templates. These will be automatically populated during execution.
and `{backstory}` in your templates. These will be automatically populated
during execution.
</Note> </Note>
## Agent Tools ## Agent Tools
Agents can be equipped with various tools to enhance their capabilities. CrewAI supports tools from: Agents can be equipped with various tools to enhance their capabilities. CrewAI supports tools from:
- [CrewAI Toolkit](https://github.com/joaomdmoura/crewai-tools) - [CrewAI Toolkit](https://github.com/joaomdmoura/crewai-tools)
- [LangChain Tools](https://python.langchain.com/docs/integrations/tools) - [LangChain Tools](https://python.langchain.com/docs/integrations/tools)
@@ -385,8 +360,7 @@ analyst = Agent(
``` ```
<Note> <Note>
When `memory` is enabled, the agent will maintain context across multiple When `memory` is enabled, the agent will maintain context across multiple interactions, improving its ability to handle complex, multi-step tasks.
interactions, improving its ability to handle complex, multi-step tasks.
</Note> </Note>
## Context Window Management ## Context Window Management
@@ -416,7 +390,6 @@ smart_agent = Agent(
``` ```
**What happens when context limits are exceeded:** **What happens when context limits are exceeded:**
- ⚠️ **Warning message**: `"Context length exceeded. Summarizing content to fit the model context window."` - ⚠️ **Warning message**: `"Context length exceeded. Summarizing content to fit the model context window."`
- 🔄 **Automatic summarization**: CrewAI intelligently summarizes the conversation history - 🔄 **Automatic summarization**: CrewAI intelligently summarizes the conversation history
- ✅ **Continued execution**: Task execution continues seamlessly with the summarized context - ✅ **Continued execution**: Task execution continues seamlessly with the summarized context
@@ -438,7 +411,6 @@ strict_agent = Agent(
``` ```
**What happens when context limits are exceeded:** **What happens when context limits are exceeded:**
- ❌ **Error message**: `"Context length exceeded. Consider using smaller text or RAG tools from crewai_tools."` - ❌ **Error message**: `"Context length exceeded. Consider using smaller text or RAG tools from crewai_tools."`
- 🛑 **Execution stops**: Task execution halts immediately - 🛑 **Execution stops**: Task execution halts immediately
- 🔧 **Manual intervention required**: You need to modify your approach - 🔧 **Manual intervention required**: You need to modify your approach
@@ -446,7 +418,6 @@ strict_agent = Agent(
### Choosing the Right Setting ### Choosing the Right Setting
#### Use `respect_context_window=True` (Default) when: #### Use `respect_context_window=True` (Default) when:
- **Processing large documents** that might exceed context limits - **Processing large documents** that might exceed context limits
- **Long-running conversations** where some summarization is acceptable - **Long-running conversations** where some summarization is acceptable
- **Research tasks** where general context is more important than exact details - **Research tasks** where general context is more important than exact details
@@ -465,7 +436,6 @@ document_processor = Agent(
``` ```
#### Use `respect_context_window=False` when: #### Use `respect_context_window=False` when:
- **Precision is critical** and information loss is unacceptable - **Precision is critical** and information loss is unacceptable
- **Legal or medical tasks** requiring complete context - **Legal or medical tasks** requiring complete context
- **Code review** where missing details could introduce bugs - **Code review** where missing details could introduce bugs
@@ -488,7 +458,6 @@ precision_agent = Agent(
When dealing with very large datasets, consider these strategies: When dealing with very large datasets, consider these strategies:
#### 1. Use RAG Tools #### 1. Use RAG Tools
```python Code ```python Code
from crewai_tools import RagTool from crewai_tools import RagTool
@@ -506,7 +475,6 @@ rag_agent = Agent(
``` ```
#### 2. Use Knowledge Sources #### 2. Use Knowledge Sources
```python Code ```python Code
# Use knowledge sources instead of large prompts # Use knowledge sources instead of large prompts
knowledge_agent = Agent( knowledge_agent = Agent(
@@ -530,7 +498,6 @@ knowledge_agent = Agent(
### Troubleshooting Context Issues ### Troubleshooting Context Issues
**If you're getting context limit errors:** **If you're getting context limit errors:**
```python Code ```python Code
# Quick fix: Enable automatic handling # Quick fix: Enable automatic handling
agent.respect_context_window = True agent.respect_context_window = True
@@ -544,7 +511,6 @@ agent.tools = [RagTool()]
``` ```
**If automatic summarization loses important information:** **If automatic summarization loses important information:**
```python Code ```python Code
# Disable auto-summarization and use RAG instead # Disable auto-summarization and use RAG instead
agent = Agent( agent = Agent(
@@ -558,10 +524,7 @@ agent = Agent(
``` ```
<Note> <Note>
The context window management feature works automatically in the background. The context window management feature works automatically in the background. You don't need to call any special functions - just set `respect_context_window` to your preferred behavior and CrewAI handles the rest!
You don't need to call any special functions - just set
`respect_context_window` to your preferred behavior and CrewAI handles the
rest!
</Note> </Note>
## Direct Agent Interaction with `kickoff()` ## Direct Agent Interaction with `kickoff()`
@@ -593,10 +556,10 @@ print(result.raw)
### Parameters and Return Values ### Parameters and Return Values
| Parameter | Type | Description | | Parameter | Type | Description |
| :---------------- | :--------------------------------- | :------------------------------------------------------------------------ | | :---------------- | :---------------------------------- | :------------------------------------------------------------------------ |
| `messages` | `Union[str, List[Dict[str, str]]]` | Either a string query or a list of message dictionaries with role/content | | `messages` | `Union[str, List[Dict[str, str]]]` | Either a string query or a list of message dictionaries with role/content |
| `response_format` | `Optional[Type[Any]]` | Optional Pydantic model for structured output | | `response_format` | `Optional[Type[Any]]` | Optional Pydantic model for structured output |
The method returns a `LiteAgentOutput` object with the following properties: The method returns a `LiteAgentOutput` object with the following properties:
@@ -658,34 +621,28 @@ asyncio.run(main())
``` ```
<Note> <Note>
The `kickoff()` method uses a `LiteAgent` internally, which provides a simpler The `kickoff()` method uses a `LiteAgent` internally, which provides a simpler execution flow while preserving all of the agent's configuration (role, goal, backstory, tools, etc.).
execution flow while preserving all of the agent's configuration (role, goal,
backstory, tools, etc.).
</Note> </Note>
## Important Considerations and Best Practices ## Important Considerations and Best Practices
### Security and Code Execution ### Security and Code Execution
- When using `allow_code_execution`, be cautious with user input and always validate it - When using `allow_code_execution`, be cautious with user input and always validate it
- Use `code_execution_mode: "safe"` (Docker) in production environments - Use `code_execution_mode: "safe"` (Docker) in production environments
- Consider setting appropriate `max_execution_time` limits to prevent infinite loops - Consider setting appropriate `max_execution_time` limits to prevent infinite loops
### Performance Optimization ### Performance Optimization
- Use `respect_context_window: true` to prevent token limit issues - Use `respect_context_window: true` to prevent token limit issues
- Set appropriate `max_rpm` to avoid rate limiting - Set appropriate `max_rpm` to avoid rate limiting
- Enable `cache: true` to improve performance for repetitive tasks - Enable `cache: true` to improve performance for repetitive tasks
- Adjust `max_iter` and `max_retry_limit` based on task complexity - Adjust `max_iter` and `max_retry_limit` based on task complexity
### Memory and Context Management ### Memory and Context Management
- Leverage `knowledge_sources` for domain-specific information - Leverage `knowledge_sources` for domain-specific information
- Configure `embedder` when using custom embedding models - Configure `embedder` when using custom embedding models
- Use custom templates (`system_template`, `prompt_template`, `response_template`) for fine-grained control over agent behavior - Use custom templates (`system_template`, `prompt_template`, `response_template`) for fine-grained control over agent behavior
### Advanced Features ### Advanced Features
- Enable `reasoning: true` for agents that need to plan and reflect before executing complex tasks - Enable `reasoning: true` for agents that need to plan and reflect before executing complex tasks
- Set appropriate `max_reasoning_attempts` to control planning iterations (None for unlimited attempts) - Set appropriate `max_reasoning_attempts` to control planning iterations (None for unlimited attempts)
- Use `inject_date: true` to provide agents with current date awareness for time-sensitive tasks - Use `inject_date: true` to provide agents with current date awareness for time-sensitive tasks
@@ -693,7 +650,6 @@ asyncio.run(main())
- Enable `multimodal: true` for agents that need to process both text and visual content - Enable `multimodal: true` for agents that need to process both text and visual content
### Agent Collaboration ### Agent Collaboration
- Enable `allow_delegation: true` when agents need to work together - Enable `allow_delegation: true` when agents need to work together
- Use `step_callback` to monitor and log agent interactions - Use `step_callback` to monitor and log agent interactions
- Consider using different LLMs for different purposes: - Consider using different LLMs for different purposes:
@@ -701,7 +657,6 @@ asyncio.run(main())
- `function_calling_llm` for efficient tool usage - `function_calling_llm` for efficient tool usage
### Date Awareness and Reasoning ### Date Awareness and Reasoning
- Use `inject_date: true` to provide agents with current date awareness for time-sensitive tasks - Use `inject_date: true` to provide agents with current date awareness for time-sensitive tasks
- Customize the date format with `date_format` using standard Python datetime format codes - Customize the date format with `date_format` using standard Python datetime format codes
- Valid format codes include: %Y (year), %m (month), %d (day), %B (full month name), etc. - Valid format codes include: %Y (year), %m (month), %d (day), %B (full month name), etc.
@@ -709,26 +664,22 @@ asyncio.run(main())
- Enable `reasoning: true` for complex tasks that benefit from upfront planning and reflection - Enable `reasoning: true` for complex tasks that benefit from upfront planning and reflection
### Model Compatibility ### Model Compatibility
- Set `use_system_prompt: false` for older models that don't support system messages - Set `use_system_prompt: false` for older models that don't support system messages
- Ensure your chosen `llm` supports the features you need (like function calling) - Ensure your chosen `llm` supports the features you need (like function calling)
## Troubleshooting Common Issues ## Troubleshooting Common Issues
1. **Rate Limiting**: If you're hitting API rate limits: 1. **Rate Limiting**: If you're hitting API rate limits:
- Implement appropriate `max_rpm` - Implement appropriate `max_rpm`
- Use caching for repetitive operations - Use caching for repetitive operations
- Consider batching requests - Consider batching requests
2. **Context Window Errors**: If you're exceeding context limits: 2. **Context Window Errors**: If you're exceeding context limits:
- Enable `respect_context_window` - Enable `respect_context_window`
- Use more efficient prompts - Use more efficient prompts
- Clear agent memory periodically - Clear agent memory periodically
3. **Code Execution Issues**: If code execution fails: 3. **Code Execution Issues**: If code execution fails:
- Verify Docker is installed for safe mode - Verify Docker is installed for safe mode
- Check execution permissions - Check execution permissions
- Review code sandbox settings - Review code sandbox settings

View File

@@ -5,12 +5,7 @@ icon: terminal
mode: "wide" mode: "wide"
--- ---
<Warning> <Warning>Since release 0.140.0, CrewAI AMP started a process of migrating their login provider. As such, the authentication flow via CLI was updated. Users that use Google to login, or that created their account after July 3rd, 2025 will be unable to log in with older versions of the `crewai` library.</Warning>
Since release 0.140.0, CrewAI AMP started a process of migrating their login
provider. As such, the authentication flow via CLI was updated. Users that use
Google to login, or that created their account after July 3rd, 2025 will be
unable to log in with older versions of the `crewai` library.
</Warning>
## Overview ## Overview
@@ -46,7 +41,6 @@ crewai create [OPTIONS] TYPE NAME
- `NAME`: Name of the crew or flow - `NAME`: Name of the crew or flow
Example: Example:
```shell Terminal ```shell Terminal
crewai create crew my_new_crew crewai create crew my_new_crew
crewai create flow my_new_flow crewai create flow my_new_flow
@@ -63,7 +57,6 @@ crewai version [OPTIONS]
- `--tools`: (Optional) Show the installed version of CrewAI tools - `--tools`: (Optional) Show the installed version of CrewAI tools
Example: Example:
```shell Terminal ```shell Terminal
crewai version crewai version
crewai version --tools crewai version --tools
@@ -81,7 +74,6 @@ crewai train [OPTIONS]
- `-f, --filename TEXT`: Path to a custom file for training (default: "trained_agents_data.pkl") - `-f, --filename TEXT`: Path to a custom file for training (default: "trained_agents_data.pkl")
Example: Example:
```shell Terminal ```shell Terminal
crewai train -n 10 -f my_training_data.pkl crewai train -n 10 -f my_training_data.pkl
``` ```
@@ -97,7 +89,6 @@ crewai replay [OPTIONS]
- `-t, --task_id TEXT`: Replay the crew from this task ID, including all subsequent tasks - `-t, --task_id TEXT`: Replay the crew from this task ID, including all subsequent tasks
Example: Example:
```shell Terminal ```shell Terminal
crewai replay -t task_123456 crewai replay -t task_123456
``` ```
@@ -127,7 +118,6 @@ crewai reset-memories [OPTIONS]
- `-a, --all`: Reset ALL memories - `-a, --all`: Reset ALL memories
Example: Example:
```shell Terminal ```shell Terminal
crewai reset-memories --long --short crewai reset-memories --long --short
crewai reset-memories --all crewai reset-memories --all
@@ -145,7 +135,6 @@ crewai test [OPTIONS]
- `-m, --model TEXT`: LLM Model to run the tests on the Crew (default: "gpt-4o-mini") - `-m, --model TEXT`: LLM Model to run the tests on the Crew (default: "gpt-4o-mini")
Example: Example:
```shell Terminal ```shell Terminal
crewai test -n 5 -m gpt-3.5-turbo crewai test -n 5 -m gpt-3.5-turbo
``` ```
@@ -159,16 +148,12 @@ crewai run
``` ```
<Note> <Note>
Starting from version 0.103.0, the `crewai run` command can be used to run Starting from version 0.103.0, the `crewai run` command can be used to run both standard crews and flows. For flows, it automatically detects the type from pyproject.toml and runs the appropriate command. This is now the recommended way to run both crews and flows.
both standard crews and flows. For flows, it automatically detects the type
from pyproject.toml and runs the appropriate command. This is now the
recommended way to run both crews and flows.
</Note> </Note>
<Note> <Note>
Make sure to run these commands from the directory where your CrewAI project Make sure to run these commands from the directory where your CrewAI project is set up.
is set up. Some commands may require additional configuration or setup within Some commands may require additional configuration or setup within your project structure.
your project structure.
</Note> </Note>
### 9. Chat ### 9. Chat
@@ -180,7 +165,6 @@ After receiving the results, you can continue interacting with the assistant for
```shell Terminal ```shell Terminal
crewai chat crewai chat
``` ```
<Note> <Note>
Ensure you execute these commands from your CrewAI project's root directory. Ensure you execute these commands from your CrewAI project's root directory.
</Note> </Note>
@@ -198,7 +182,6 @@ def crew(self) -> Crew:
chat_llm="gpt-4o", # LLM for chat orchestration chat_llm="gpt-4o", # LLM for chat orchestration
) )
``` ```
</Note> </Note>
### 10. Deploy ### 10. Deploy
@@ -206,18 +189,17 @@ def crew(self) -> Crew:
Deploy the crew or flow to [CrewAI AMP](https://app.crewai.com). Deploy the crew or flow to [CrewAI AMP](https://app.crewai.com).
- **Authentication**: You need to be authenticated to deploy to CrewAI AMP. - **Authentication**: You need to be authenticated to deploy to CrewAI AMP.
You can login or create an account with: You can login or create an account with:
```shell Terminal
```shell Terminal crewai login
crewai login ```
```
- **Create a deployment**: Once you are authenticated, you can create a deployment for your crew or flow from the root of your localproject. - **Create a deployment**: Once you are authenticated, you can create a deployment for your crew or flow from the root of your localproject.
```shell Terminal ```shell Terminal
crewai deploy create crewai deploy create
``` ```
- Reads your local project configuration. - Reads your local project configuration.
- Prompts you to confirm the environment variables (like `OPENAI_API_KEY`, `SERPER_API_KEY`) found locally. These will be securely stored with the deployment on the Enterprise platform. Ensure your sensitive keys are correctly configured locally (e.g., in a `.env` file) before running this. - Prompts you to confirm the environment variables (like `OPENAI_API_KEY`, `SERPER_API_KEY`) found locally. These will be securely stored with the deployment on the Enterprise platform. Ensure your sensitive keys are correctly configured locally (e.g., in a `.env` file) before running this.
### 11. Organization Management ### 11. Organization Management
@@ -230,78 +212,63 @@ crewai org [COMMAND] [OPTIONS]
#### Commands: #### Commands:
- `list`: List all organizations you belong to - `list`: List all organizations you belong to
```shell Terminal ```shell Terminal
crewai org list crewai org list
``` ```
- `current`: Display your currently active organization - `current`: Display your currently active organization
```shell Terminal ```shell Terminal
crewai org current crewai org current
``` ```
- `switch`: Switch to a specific organization - `switch`: Switch to a specific organization
```shell Terminal ```shell Terminal
crewai org switch <organization_id> crewai org switch <organization_id>
``` ```
<Note> <Note>
You must be authenticated to CrewAI AMP to use these organization management You must be authenticated to CrewAI AMP to use these organization management commands.
commands.
</Note> </Note>
- **Create a deployment** (continued): - **Create a deployment** (continued):
- Links the deployment to the corresponding remote GitHub repository (it usually detects this automatically).
- Links the deployment to the corresponding remote GitHub repository (it usually detects this automatically).
- **Deploy the Crew**: Once you are authenticated, you can deploy your crew or flow to CrewAI AMP. - **Deploy the Crew**: Once you are authenticated, you can deploy your crew or flow to CrewAI AMP.
```shell Terminal
```shell Terminal crewai deploy push
crewai deploy push ```
``` - Initiates the deployment process on the CrewAI AMP platform.
- Upon successful initiation, it will output the Deployment created successfully! message along with the Deployment Name and a unique Deployment ID (UUID).
- Initiates the deployment process on the CrewAI AMP platform.
- Upon successful initiation, it will output the Deployment created successfully! message along with the Deployment Name and a unique Deployment ID (UUID).
- **Deployment Status**: You can check the status of your deployment with: - **Deployment Status**: You can check the status of your deployment with:
```shell Terminal
```shell Terminal crewai deploy status
crewai deploy status ```
``` This fetches the latest deployment status of your most recent deployment attempt (e.g., `Building Images for Crew`, `Deploy Enqueued`, `Online`).
This fetches the latest deployment status of your most recent deployment attempt (e.g., `Building Images for Crew`, `Deploy Enqueued`, `Online`).
- **Deployment Logs**: You can check the logs of your deployment with: - **Deployment Logs**: You can check the logs of your deployment with:
```shell Terminal
```shell Terminal crewai deploy logs
crewai deploy logs ```
``` This streams the deployment logs to your terminal.
This streams the deployment logs to your terminal.
- **List deployments**: You can list all your deployments with: - **List deployments**: You can list all your deployments with:
```shell Terminal
```shell Terminal crewai deploy list
crewai deploy list ```
``` This lists all your deployments.
This lists all your deployments.
- **Delete a deployment**: You can delete a deployment with: - **Delete a deployment**: You can delete a deployment with:
```shell Terminal
```shell Terminal crewai deploy remove
crewai deploy remove ```
``` This deletes the deployment from the CrewAI AMP platform.
This deletes the deployment from the CrewAI AMP platform.
- **Help Command**: You can get help with the CLI with: - **Help Command**: You can get help with the CLI with:
```shell Terminal ```shell Terminal
crewai deploy --help crewai deploy --help
``` ```
This shows the help message for the CrewAI Deploy CLI. This shows the help message for the CrewAI Deploy CLI.
Watch this video tutorial for a step-by-step demonstration of deploying your crew to [CrewAI AMP](http://app.crewai.com) using the CLI. Watch this video tutorial for a step-by-step demonstration of deploying your crew to [CrewAI AMP](http://app.crewai.com) using the CLI.
@@ -323,20 +290,18 @@ crewai login
``` ```
What happens: What happens:
- A verification URL and short code are displayed in your terminal - A verification URL and short code are displayed in your terminal
- Your browser opens to the verification URL - Your browser opens to the verification URL
- Enter/confirm the code to complete authentication - Enter/confirm the code to complete authentication
Notes: Notes:
- The OAuth2 provider and domain are configured via `crewai config` (defaults use `login.crewai.com`) - The OAuth2 provider and domain are configured via `crewai config` (defaults use `login.crewai.com`)
- After successful login, the CLI also attempts to authenticate to the Tool Repository automatically - After successful login, the CLI also attempts to authenticate to the Tool Repository automatically
- If you reset your configuration, run `crewai login` again to re-authenticate - If you reset your configuration, run `crewai login` again to re-authenticate
### 12. API Keys ### 12. API Keys
When running `crewai create crew` command, the CLI will show you a list of available LLM providers to choose from, followed by model selection for your chosen provider. When running ```crewai create crew``` command, the CLI will show you a list of available LLM providers to choose from, followed by model selection for your chosen provider.
Once you've selected an LLM provider and model, you will be prompted for API keys. Once you've selected an LLM provider and model, you will be prompted for API keys.
@@ -344,11 +309,11 @@ Once you've selected an LLM provider and model, you will be prompted for API key
Here's a list of the most popular LLM providers suggested by the CLI: Here's a list of the most popular LLM providers suggested by the CLI:
- OpenAI * OpenAI
- Groq * Groq
- Anthropic * Anthropic
- Google Gemini * Google Gemini
- SambaNova * SambaNova
When you select a provider, the CLI will then show you available models for that provider and prompt you to enter your API key. When you select a provider, the CLI will then show you available models for that provider and prompt you to enter your API key.
@@ -360,7 +325,7 @@ When you select a provider, the CLI will prompt you to enter the Key name and th
See the following link for each provider's key name: See the following link for each provider's key name:
- [LiteLLM Providers](https://docs.litellm.ai/docs/providers) * [LiteLLM Providers](https://docs.litellm.ai/docs/providers)
### 13. Configuration Management ### 13. Configuration Management
@@ -373,19 +338,16 @@ crewai config [COMMAND] [OPTIONS]
#### Commands: #### Commands:
- `list`: Display all CLI configuration parameters - `list`: Display all CLI configuration parameters
```shell Terminal ```shell Terminal
crewai config list crewai config list
``` ```
- `set`: Set a CLI configuration parameter - `set`: Set a CLI configuration parameter
```shell Terminal ```shell Terminal
crewai config set <key> <value> crewai config set <key> <value>
``` ```
- `reset`: Reset all CLI configuration parameters to default values - `reset`: Reset all CLI configuration parameters to default values
```shell Terminal ```shell Terminal
crewai config reset crewai config reset
``` ```
@@ -401,141 +363,49 @@ crewai config reset
#### Examples #### Examples
Display current configuration: Display current configuration:
```shell Terminal ```shell Terminal
crewai config list crewai config list
``` ```
Example output: Example output:
| Setting | Value | Description | | Setting | Value | Description |
| :------------------ | :----------------------- | :---------------------------------------------------------- | | :------------------ | :----------------------- | :---------------------------------------------------------- |
| enterprise_base_url | https://app.crewai.com | Base URL of the CrewAI AMP instance | | enterprise_base_url | https://app.crewai.com | Base URL of the CrewAI AMP instance |
| org_name | Not set | Name of the currently active organization | | org_name | Not set | Name of the currently active organization |
| org_uuid | Not set | UUID of the currently active organization | | org_uuid | Not set | UUID of the currently active organization |
| oauth2_provider | workos | OAuth2 provider (e.g., workos, okta, auth0) | | oauth2_provider | workos | OAuth2 provider (e.g., workos, okta, auth0) |
| oauth2_audience | client_01YYY | Audience identifying the target API/resource | | oauth2_audience | client_01YYY | Audience identifying the target API/resource |
| oauth2_client_id | client_01XXX | OAuth2 client ID issued by the provider | | oauth2_client_id | client_01XXX | OAuth2 client ID issued by the provider |
| oauth2_domain | login.crewai.com | Provider domain (e.g., your-org.auth0.com) | | oauth2_domain | login.crewai.com | Provider domain (e.g., your-org.auth0.com) |
Set the enterprise base URL: Set the enterprise base URL:
```shell Terminal ```shell Terminal
crewai config set enterprise_base_url https://my-enterprise.crewai.com crewai config set enterprise_base_url https://my-enterprise.crewai.com
``` ```
Set OAuth2 provider: Set OAuth2 provider:
```shell Terminal ```shell Terminal
crewai config set oauth2_provider auth0 crewai config set oauth2_provider auth0
``` ```
Set OAuth2 domain: Set OAuth2 domain:
```shell Terminal ```shell Terminal
crewai config set oauth2_domain my-company.auth0.com crewai config set oauth2_domain my-company.auth0.com
``` ```
Reset all configuration to defaults: Reset all configuration to defaults:
```shell Terminal ```shell Terminal
crewai config reset crewai config reset
``` ```
<Tip> <Tip>
After resetting configuration, re-run `crewai login` to authenticate again. After resetting configuration, re-run `crewai login` to authenticate again.
</Tip>
### 14. Trace Management
Manage trace collection preferences for your Crew and Flow executions.
```shell Terminal
crewai traces [COMMAND]
```
#### Commands:
- `enable`: Enable trace collection for crew/flow executions
```shell Terminal
crewai traces enable
```
- `disable`: Disable trace collection for crew/flow executions
```shell Terminal
crewai traces disable
```
- `status`: Show current trace collection status
```shell Terminal
crewai traces status
```
#### How Tracing Works
Trace collection is controlled by checking three settings in priority order:
1. **Explicit flag in code** (highest priority - can enable OR disable):
```python
crew = Crew(agents=[...], tasks=[...], tracing=True) # Always enable
crew = Crew(agents=[...], tasks=[...], tracing=False) # Always disable
crew = Crew(agents=[...], tasks=[...]) # Check lower priorities (default)
```
- `tracing=True` will **always enable** tracing (overrides everything)
- `tracing=False` will **always disable** tracing (overrides everything)
- `tracing=None` or omitted will check lower priority settings
2. **Environment variable** (second priority):
```env
CREWAI_TRACING_ENABLED=true
```
- Checked only if `tracing` is not explicitly set to `True` or `False` in code
- Set to `true` or `1` to enable tracing
3. **User preference** (lowest priority):
```shell Terminal
crewai traces enable
```
- Checked only if `tracing` is not set in code and `CREWAI_TRACING_ENABLED` is not set to `true`
- Running `crewai traces enable` is sufficient to enable tracing by itself
<Note>
**To enable tracing**, use any one of these methods:
- Set `tracing=True` in your Crew/Flow code, OR
- Add `CREWAI_TRACING_ENABLED=true` to your `.env` file, OR
- Run `crewai traces enable`
**To disable tracing**, use any ONE of these methods:
- Set `tracing=False` in your Crew/Flow code (overrides everything), OR
- Remove or set to `false` the `CREWAI_TRACING_ENABLED` env var, OR
- Run `crewai traces disable`
Higher priority settings override lower ones.
</Note>
<Tip>
For more information about tracing, see the [Tracing
documentation](/observability/tracing).
</Tip> </Tip>
<Tip> <Tip>
CrewAI CLI handles authentication to the Tool Repository automatically when CrewAI CLI handles authentication to the Tool Repository automatically when adding packages to your project. Just append `crewai` before any `uv` command to use it. E.g. `crewai uv add requests`. For more information, see [Tool Repository](https://docs.crewai.com/enterprise/features/tool-repository) docs.
adding packages to your project. Just append `crewai` before any `uv` command
to use it. E.g. `crewai uv add requests`. For more information, see [Tool
Repository](https://docs.crewai.com/enterprise/features/tool-repository) docs.
</Tip> </Tip>
<Note> <Note>
Configuration settings are stored in `~/.config/crewai/settings.json`. Some Configuration settings are stored in `~/.config/crewai/settings.json`. Some settings like organization name and UUID are read-only and managed through authentication and organization commands. Tool repository related settings are hidden and cannot be set directly by users.
settings like organization name and UUID are read-only and managed through
authentication and organization commands. Tool repository related settings are
hidden and cannot be set directly by users.
</Note> </Note>

View File

@@ -33,7 +33,6 @@ A crew in crewAI represents a collaborative group of agents working together to
| **Planning** *(optional)* | `planning` | Adds planning ability to the Crew. When activated before each Crew iteration, all Crew data is sent to an AgentPlanner that will plan the tasks and this plan will be added to each task description. | | **Planning** *(optional)* | `planning` | Adds planning ability to the Crew. When activated before each Crew iteration, all Crew data is sent to an AgentPlanner that will plan the tasks and this plan will be added to each task description. |
| **Planning LLM** *(optional)* | `planning_llm` | The language model used by the AgentPlanner in a planning process. | | **Planning LLM** *(optional)* | `planning_llm` | The language model used by the AgentPlanner in a planning process. |
| **Knowledge Sources** _(optional)_ | `knowledge_sources` | Knowledge sources available at the crew level, accessible to all the agents. | | **Knowledge Sources** _(optional)_ | `knowledge_sources` | Knowledge sources available at the crew level, accessible to all the agents. |
| **Stream** _(optional)_ | `stream` | Enable streaming output to receive real-time updates during crew execution. Returns a `CrewStreamingOutput` object that can be iterated for chunks. Defaults to `False`. |
<Tip> <Tip>
**Crew Max RPM**: The `max_rpm` attribute sets the maximum number of requests per minute the crew can perform to avoid rate limits and will override individual agents' `max_rpm` settings if you set it. **Crew Max RPM**: The `max_rpm` attribute sets the maximum number of requests per minute the crew can perform to avoid rate limits and will override individual agents' `max_rpm` settings if you set it.
@@ -307,27 +306,12 @@ print(result)
### Different Ways to Kick Off a Crew ### Different Ways to Kick Off a Crew
Once your crew is assembled, initiate the workflow with the appropriate kickoff method. CrewAI provides several methods for better control over the kickoff process. Once your crew is assembled, initiate the workflow with the appropriate kickoff method. CrewAI provides several methods for better control over the kickoff process: `kickoff()`, `kickoff_for_each()`, `kickoff_async()`, and `kickoff_for_each_async()`.
#### Synchronous Methods
- `kickoff()`: Starts the execution process according to the defined process flow. - `kickoff()`: Starts the execution process according to the defined process flow.
- `kickoff_for_each()`: Executes tasks sequentially for each provided input event or item in the collection. - `kickoff_for_each()`: Executes tasks sequentially for each provided input event or item in the collection.
- `kickoff_async()`: Initiates the workflow asynchronously.
#### Asynchronous Methods - `kickoff_for_each_async()`: Executes tasks concurrently for each provided input event or item, leveraging asynchronous processing.
CrewAI offers two approaches for async execution:
| Method | Type | Description |
|--------|------|-------------|
| `akickoff()` | Native async | True async/await throughout the entire execution chain |
| `akickoff_for_each()` | Native async | Native async execution for each input in a list |
| `kickoff_async()` | Thread-based | Wraps synchronous execution in `asyncio.to_thread` |
| `kickoff_for_each_async()` | Thread-based | Thread-based async for each input in a list |
<Note>
For high-concurrency workloads, `akickoff()` and `akickoff_for_each()` are recommended as they use native async for task execution, memory operations, and knowledge retrieval.
</Note>
```python Code ```python Code
# Start the crew's task execution # Start the crew's task execution
@@ -340,53 +324,19 @@ results = my_crew.kickoff_for_each(inputs=inputs_array)
for result in results: for result in results:
print(result) print(result)
# Example of using native async with akickoff # Example of using kickoff_async
inputs = {'topic': 'AI in healthcare'}
async_result = await my_crew.akickoff(inputs=inputs)
print(async_result)
# Example of using native async with akickoff_for_each
inputs_array = [{'topic': 'AI in healthcare'}, {'topic': 'AI in finance'}]
async_results = await my_crew.akickoff_for_each(inputs=inputs_array)
for async_result in async_results:
print(async_result)
# Example of using thread-based kickoff_async
inputs = {'topic': 'AI in healthcare'} inputs = {'topic': 'AI in healthcare'}
async_result = await my_crew.kickoff_async(inputs=inputs) async_result = await my_crew.kickoff_async(inputs=inputs)
print(async_result) print(async_result)
# Example of using thread-based kickoff_for_each_async # Example of using kickoff_for_each_async
inputs_array = [{'topic': 'AI in healthcare'}, {'topic': 'AI in finance'}] inputs_array = [{'topic': 'AI in healthcare'}, {'topic': 'AI in finance'}]
async_results = await my_crew.kickoff_for_each_async(inputs=inputs_array) async_results = await my_crew.kickoff_for_each_async(inputs=inputs_array)
for async_result in async_results: for async_result in async_results:
print(async_result) print(async_result)
``` ```
These methods provide flexibility in how you manage and execute tasks within your crew, allowing for both synchronous and asynchronous workflows tailored to your needs. For detailed async examples, see the [Kickoff Crew Asynchronously](/en/learn/kickoff-async) guide. These methods provide flexibility in how you manage and execute tasks within your crew, allowing for both synchronous and asynchronous workflows tailored to your needs.
### Streaming Crew Execution
For real-time visibility into crew execution, you can enable streaming to receive output as it's generated:
```python Code
# Enable streaming
crew = Crew(
agents=[researcher],
tasks=[task],
stream=True
)
# Iterate over streaming output
streaming = crew.kickoff(inputs={"topic": "AI"})
for chunk in streaming:
print(chunk.content, end="", flush=True)
# Access final result
result = streaming.result
```
Learn more about streaming in the [Streaming Crew Execution](/en/learn/streaming-crew-execution) guide.
### Replaying from a Specific Task ### Replaying from a Specific Task

View File

@@ -1,6 +1,6 @@
--- ---
title: "Event Listeners" title: 'Event Listeners'
description: "Tap into CrewAI events to build custom integrations and monitoring" description: 'Tap into CrewAI events to build custom integrations and monitoring'
icon: spinner icon: spinner
mode: "wide" mode: "wide"
--- ---
@@ -25,7 +25,6 @@ CrewAI AMP provides a built-in Prompt Tracing feature that leverages the event s
![Prompt Tracing Dashboard](/images/enterprise/traces-overview.png) ![Prompt Tracing Dashboard](/images/enterprise/traces-overview.png)
With Prompt Tracing you can: With Prompt Tracing you can:
- View the complete history of all prompts sent to your LLM - View the complete history of all prompts sent to your LLM
- Track token usage and costs - Track token usage and costs
- Debug agent reasoning failures - Debug agent reasoning failures
@@ -275,6 +274,7 @@ The structure of the event object depends on the event type, but all events inhe
Additional fields vary by event type. For example, `CrewKickoffCompletedEvent` includes `crew_name` and `output` fields. Additional fields vary by event type. For example, `CrewKickoffCompletedEvent` includes `crew_name` and `output` fields.
## Advanced Usage: Scoped Handlers ## Advanced Usage: Scoped Handlers
For temporary event handling (useful for testing or specific operations), you can use the `scoped_handlers` context manager: For temporary event handling (useful for testing or specific operations), you can use the `scoped_handlers` context manager:

View File

@@ -572,55 +572,6 @@ The `third_method` and `fourth_method` listen to the output of the `second_metho
When you run this Flow, the output will change based on the random boolean value generated by the `start_method`. When you run this Flow, the output will change based on the random boolean value generated by the `start_method`.
### Human in the Loop (human feedback)
The `@human_feedback` decorator enables human-in-the-loop workflows by pausing flow execution to collect feedback from a human. This is useful for approval gates, quality review, and decision points that require human judgment.
```python Code
from crewai.flow.flow import Flow, start, listen
from crewai.flow.human_feedback import human_feedback, HumanFeedbackResult
class ReviewFlow(Flow):
@start()
@human_feedback(
message="Do you approve this content?",
emit=["approved", "rejected", "needs_revision"],
llm="gpt-4o-mini",
default_outcome="needs_revision",
)
def generate_content(self):
return "Content to be reviewed..."
@listen("approved")
def on_approval(self, result: HumanFeedbackResult):
print(f"Approved! Feedback: {result.feedback}")
@listen("rejected")
def on_rejection(self, result: HumanFeedbackResult):
print(f"Rejected. Reason: {result.feedback}")
```
When `emit` is specified, the human's free-form feedback is interpreted by an LLM and collapsed into one of the specified outcomes, which then triggers the corresponding `@listen` decorator.
You can also use `@human_feedback` without routing to simply collect feedback:
```python Code
@start()
@human_feedback(message="Any comments on this output?")
def my_method(self):
return "Output for review"
@listen(my_method)
def next_step(self, result: HumanFeedbackResult):
# Access feedback via result.feedback
# Access original output via result.output
pass
```
Access all feedback collected during a flow via `self.last_human_feedback` (most recent) or `self.human_feedback_history` (all feedback as a list).
For a complete guide on human feedback in flows, including **async/non-blocking feedback** with custom providers (Slack, webhooks, etc.), see [Human Feedback in Flows](/en/learn/human-feedback-in-flows).
## Adding Agents to Flows ## Adding Agents to Flows
Agents can be seamlessly integrated into your flows, providing a lightweight alternative to full Crews when you need simpler, focused task execution. Here's an example of how to use an Agent within a flow to perform market research: Agents can be seamlessly integrated into your flows, providing a lightweight alternative to full Crews when you need simpler, focused task execution. Here's an example of how to use an Agent within a flow to perform market research:
@@ -946,31 +897,6 @@ flow = ExampleFlow()
result = flow.kickoff() result = flow.kickoff()
``` ```
### Streaming Flow Execution
For real-time visibility into flow execution, you can enable streaming to receive output as it's generated:
```python
class StreamingFlow(Flow):
stream = True # Enable streaming
@start()
def research(self):
# Your flow implementation
pass
# Iterate over streaming output
flow = StreamingFlow()
streaming = flow.kickoff()
for chunk in streaming:
print(chunk.content, end="", flush=True)
# Access final result
result = streaming.result
```
Learn more about streaming in the [Streaming Flow Execution](/en/learn/streaming-flow-execution) guide.
### Using the CLI ### Using the CLI
Starting from version 0.103.0, you can run flows using the `crewai run` command: Starting from version 0.103.0, you can run flows using the `crewai run` command:

View File

@@ -388,8 +388,8 @@ crew = Crew(
agents=[sales_agent, tech_agent, support_agent], agents=[sales_agent, tech_agent, support_agent],
tasks=[...], tasks=[...],
embedder={ # Fallback embedder for agents without their own embedder={ # Fallback embedder for agents without their own
"provider": "google-generativeai", "provider": "google",
"config": {"model_name": "gemini-embedding-001"} "config": {"model": "text-embedding-004"}
} }
) )
@@ -629,9 +629,9 @@ agent = Agent(
backstory="Expert researcher", backstory="Expert researcher",
knowledge_sources=[knowledge_source], knowledge_sources=[knowledge_source],
embedder={ embedder={
"provider": "google-generativeai", "provider": "google",
"config": { "config": {
"model_name": "gemini-embedding-001", "model": "models/text-embedding-004",
"api_key": "your-google-key" "api_key": "your-google-key"
} }
} }
@@ -739,7 +739,7 @@ class KnowledgeMonitorListener(BaseEventListener):
knowledge_monitor = KnowledgeMonitorListener() knowledge_monitor = KnowledgeMonitorListener()
``` ```
For more information on using events, see the [Event Listeners](/en/concepts/event-listener) documentation. For more information on using events, see the [Event Listeners](https://docs.crewai.com/concepts/event-listener) documentation.
### Custom Knowledge Sources ### Custom Knowledge Sources

View File

@@ -7,7 +7,7 @@ mode: "wide"
## Overview ## Overview
CrewAI integrates with multiple LLM providers through providers native sdks, giving you the flexibility to choose the right model for your specific use case. This guide will help you understand how to configure and use different LLM providers in your CrewAI projects. CrewAI integrates with multiple LLM providers through LiteLLM, giving you the flexibility to choose the right model for your specific use case. This guide will help you understand how to configure and use different LLM providers in your CrewAI projects.
## What are LLMs? ## What are LLMs?
@@ -113,104 +113,44 @@ In this section, you'll find detailed examples that help you select, configure,
<AccordionGroup> <AccordionGroup>
<Accordion title="OpenAI"> <Accordion title="OpenAI">
CrewAI provides native integration with OpenAI through the OpenAI Python SDK. Set the following environment variables in your `.env` file:
```toml Code ```toml Code
# Required # Required
OPENAI_API_KEY=sk-... OPENAI_API_KEY=sk-...
# Optional # Optional
OPENAI_BASE_URL=<custom-base-url> OPENAI_API_BASE=<custom-base-url>
OPENAI_ORGANIZATION=<your-org-id>
``` ```
**Basic Usage:** Example usage in your CrewAI project:
```python Code ```python Code
from crewai import LLM from crewai import LLM
llm = LLM( llm = LLM(
model="openai/gpt-4o", model="openai/gpt-4", # call model by provider/model_name
api_key="your-api-key", # Or set OPENAI_API_KEY temperature=0.8,
temperature=0.7, max_tokens=150,
max_tokens=4000
)
```
**Advanced Configuration:**
```python Code
from crewai import LLM
llm = LLM(
model="openai/gpt-4o",
api_key="your-api-key",
base_url="https://api.openai.com/v1", # Optional custom endpoint
organization="org-...", # Optional organization ID
project="proj_...", # Optional project ID
temperature=0.7,
max_tokens=4000,
max_completion_tokens=4000, # For newer models
top_p=0.9, top_p=0.9,
frequency_penalty=0.1, frequency_penalty=0.1,
presence_penalty=0.1, presence_penalty=0.1,
stop=["END"], stop=["END"],
seed=42, # For reproducible outputs seed=42
stream=True, # Enable streaming
timeout=60.0, # Request timeout in seconds
max_retries=3, # Maximum retry attempts
logprobs=True, # Return log probabilities
top_logprobs=5, # Number of most likely tokens
reasoning_effort="medium" # For o1 models: low, medium, high
) )
``` ```
**Structured Outputs:** OpenAI is one of the leading providers of LLMs with a wide range of models and features.
```python Code
from pydantic import BaseModel
from crewai import LLM
class ResponseFormat(BaseModel):
name: str
age: int
summary: str
llm = LLM(
model="openai/gpt-4o",
)
```
**Supported Environment Variables:**
- `OPENAI_API_KEY`: Your OpenAI API key (required)
- `OPENAI_BASE_URL`: Custom base URL for OpenAI API (optional)
**Features:**
- Native function calling support (except o1 models)
- Structured outputs with JSON schema
- Streaming support for real-time responses
- Token usage tracking
- Stop sequences support (except o1 models)
- Log probabilities for token-level insights
- Reasoning effort control for o1 models
**Supported Models:**
| Model | Context Window | Best For | | Model | Context Window | Best For |
|---------------------|------------------|-----------------------------------------------| |---------------------|------------------|-----------------------------------------------|
| gpt-4.1 | 1M tokens | Latest model with enhanced capabilities | | GPT-4 | 8,192 tokens | High-accuracy tasks, complex reasoning |
| gpt-4.1-mini | 1M tokens | Efficient version with large context | | GPT-4 Turbo | 128,000 tokens | Long-form content, document analysis |
| gpt-4.1-nano | 1M tokens | Ultra-efficient variant | | GPT-4o & GPT-4o-mini | 128,000 tokens | Cost-effective large context processing |
| gpt-4o | 128,000 tokens | Optimized for speed and intelligence | | o3-mini | 200,000 tokens | Fast reasoning, complex reasoning |
| gpt-4o-mini | 200,000 tokens | Cost-effective with large context | | o1-mini | 128,000 tokens | Fast reasoning, complex reasoning |
| gpt-4-turbo | 128,000 tokens | Long-form content, document analysis | | o1-preview | 128,000 tokens | Fast reasoning, complex reasoning |
| gpt-4 | 8,192 tokens | High-accuracy tasks, complex reasoning | | o1 | 200,000 tokens | Fast reasoning, complex reasoning |
| o1 | 200,000 tokens | Advanced reasoning, complex problem-solving |
| o1-preview | 128,000 tokens | Preview of reasoning capabilities |
| o1-mini | 128,000 tokens | Efficient reasoning model |
| o3-mini | 200,000 tokens | Lightweight reasoning model |
| o4-mini | 200,000 tokens | Next-gen efficient reasoning |
**Note:** To use OpenAI, install the required dependencies:
```bash
uv add "crewai[openai]"
```
</Accordion> </Accordion>
<Accordion title="Meta-Llama"> <Accordion title="Meta-Llama">
@@ -247,230 +187,69 @@ In this section, you'll find detailed examples that help you select, configure,
</Accordion> </Accordion>
<Accordion title="Anthropic"> <Accordion title="Anthropic">
CrewAI provides native integration with Anthropic through the Anthropic Python SDK.
```toml Code ```toml Code
# Required # Required
ANTHROPIC_API_KEY=sk-ant-... ANTHROPIC_API_KEY=sk-ant-...
# Optional
ANTHROPIC_API_BASE=<custom-base-url>
``` ```
**Basic Usage:** Example usage in your CrewAI project:
```python Code ```python Code
from crewai import LLM
llm = LLM( llm = LLM(
model="anthropic/claude-3-5-sonnet-20241022", model="anthropic/claude-3-sonnet-20240229-v1:0",
api_key="your-api-key", # Or set ANTHROPIC_API_KEY temperature=0.7
max_tokens=4096 # Required for Anthropic
) )
``` ```
**Advanced Configuration:**
```python Code
from crewai import LLM
llm = LLM(
model="anthropic/claude-3-5-sonnet-20241022",
api_key="your-api-key",
base_url="https://api.anthropic.com", # Optional custom endpoint
temperature=0.7,
max_tokens=4096, # Required parameter
top_p=0.9,
stop_sequences=["END", "STOP"], # Anthropic uses stop_sequences
stream=True, # Enable streaming
timeout=60.0, # Request timeout in seconds
max_retries=3 # Maximum retry attempts
)
```
**Extended Thinking (Claude Sonnet 4 and Beyond):**
CrewAI supports Anthropic's Extended Thinking feature, which allows Claude to think through problems in a more human-like way before responding. This is particularly useful for complex reasoning, analysis, and problem-solving tasks.
```python Code
from crewai import LLM
# Enable extended thinking with default settings
llm = LLM(
model="anthropic/claude-sonnet-4",
thinking={"type": "enabled"},
max_tokens=10000
)
# Configure thinking with budget control
llm = LLM(
model="anthropic/claude-sonnet-4",
thinking={
"type": "enabled",
"budget_tokens": 5000 # Limit thinking tokens
},
max_tokens=10000
)
```
**Thinking Configuration Options:**
- `type`: Set to `"enabled"` to activate extended thinking mode
- `budget_tokens` (optional): Maximum tokens to use for thinking (helps control costs)
**Models Supporting Extended Thinking:**
- `claude-sonnet-4` and newer models
- `claude-3-7-sonnet` (with extended thinking capabilities)
**When to Use Extended Thinking:**
- Complex reasoning and multi-step problem solving
- Mathematical calculations and proofs
- Code analysis and debugging
- Strategic planning and decision making
- Research and analytical tasks
**Note:** Extended thinking consumes additional tokens but can significantly improve response quality for complex tasks.
**Supported Environment Variables:**
- `ANTHROPIC_API_KEY`: Your Anthropic API key (required)
**Features:**
- Native tool use support for Claude 3+ models
- Extended Thinking support for Claude Sonnet 4+
- Streaming support for real-time responses
- Automatic system message handling
- Stop sequences for controlled output
- Token usage tracking
- Multi-turn tool use conversations
**Important Notes:**
- `max_tokens` is a **required** parameter for all Anthropic models
- Claude uses `stop_sequences` instead of `stop`
- System messages are handled separately from conversation messages
- First message must be from the user (automatically handled)
- Messages must alternate between user and assistant
**Supported Models:**
| Model | Context Window | Best For |
|------------------------------|----------------|-----------------------------------------------|
| claude-sonnet-4 | 200,000 tokens | Latest with extended thinking capabilities |
| claude-3-7-sonnet | 200,000 tokens | Advanced reasoning and agentic tasks |
| claude-3-5-sonnet-20241022 | 200,000 tokens | Latest Sonnet with best performance |
| claude-3-5-haiku | 200,000 tokens | Fast, compact model for quick responses |
| claude-3-opus | 200,000 tokens | Most capable for complex tasks |
| claude-3-sonnet | 200,000 tokens | Balanced intelligence and speed |
| claude-3-haiku | 200,000 tokens | Fastest for simple tasks |
| claude-2.1 | 200,000 tokens | Extended context, reduced hallucinations |
| claude-2 | 100,000 tokens | Versatile model for various tasks |
| claude-instant | 100,000 tokens | Fast, cost-effective for everyday tasks |
**Note:** To use Anthropic, install the required dependencies:
```bash
uv add "crewai[anthropic]"
```
</Accordion> </Accordion>
<Accordion title="Google (Gemini API)"> <Accordion title="Google (Gemini API)">
CrewAI provides native integration with Google Gemini through the Google Gen AI Python SDK. Set your API key in your `.env` file. If you need a key, or need to find an
existing key, check [AI Studio](https://aistudio.google.com/apikey).
Set your API key in your `.env` file. If you need a key, check [AI Studio](https://aistudio.google.com/apikey).
```toml .env ```toml .env
# Required (one of the following) # https://ai.google.dev/gemini-api/docs/api-key
GOOGLE_API_KEY=<your-api-key>
GEMINI_API_KEY=<your-api-key> GEMINI_API_KEY=<your-api-key>
# Optional - for Vertex AI
GOOGLE_CLOUD_PROJECT=<your-project-id>
GOOGLE_CLOUD_LOCATION=<location> # Defaults to us-central1
GOOGLE_GENAI_USE_VERTEXAI=true # Set to use Vertex AI
``` ```
**Basic Usage:** Example usage in your CrewAI project:
```python Code ```python Code
from crewai import LLM from crewai import LLM
llm = LLM( llm = LLM(
model="gemini/gemini-2.0-flash", model="gemini/gemini-2.0-flash",
api_key="your-api-key", # Or set GOOGLE_API_KEY/GEMINI_API_KEY
temperature=0.7
)
```
**Advanced Configuration:**
```python Code
from crewai import LLM
llm = LLM(
model="gemini/gemini-2.5-flash",
api_key="your-api-key",
temperature=0.7, temperature=0.7,
top_p=0.9,
top_k=40, # Top-k sampling parameter
max_output_tokens=8192,
stop_sequences=["END", "STOP"],
stream=True, # Enable streaming
safety_settings={
"HARM_CATEGORY_HARASSMENT": "BLOCK_NONE",
"HARM_CATEGORY_HATE_SPEECH": "BLOCK_NONE"
}
) )
``` ```
**Vertex AI Configuration:** ### Gemini models
```python Code
from crewai import LLM
llm = LLM(
model="gemini/gemini-1.5-pro",
project="your-gcp-project-id",
location="us-central1" # GCP region
)
```
**Supported Environment Variables:**
- `GOOGLE_API_KEY` or `GEMINI_API_KEY`: Your Google API key (required for Gemini API)
- `GOOGLE_CLOUD_PROJECT`: Google Cloud project ID (for Vertex AI)
- `GOOGLE_CLOUD_LOCATION`: GCP location (defaults to `us-central1`)
- `GOOGLE_GENAI_USE_VERTEXAI`: Set to `true` to use Vertex AI
**Features:**
- Native function calling support for Gemini 1.5+ and 2.x models
- Streaming support for real-time responses
- Multimodal capabilities (text, images, video)
- Safety settings configuration
- Support for both Gemini API and Vertex AI
- Automatic system instruction handling
- Token usage tracking
**Gemini Models:**
Google offers a range of powerful models optimized for different use cases. Google offers a range of powerful models optimized for different use cases.
| Model | Context Window | Best For | | Model | Context Window | Best For |
|--------------------------------|----------------|-------------------------------------------------------------------| |--------------------------------|----------------|-------------------------------------------------------------------|
| gemini-2.5-flash | 1M tokens | Adaptive thinking, cost efficiency | | gemini-2.5-flash-preview-04-17 | 1M tokens | Adaptive thinking, cost efficiency |
| gemini-2.5-pro | 1M tokens | Enhanced thinking and reasoning, multimodal understanding | | gemini-2.5-pro-preview-05-06 | 1M tokens | Enhanced thinking and reasoning, multimodal understanding, advanced coding, and more |
| gemini-2.0-flash | 1M tokens | Next generation features, speed, thinking | | gemini-2.0-flash | 1M tokens | Next generation features, speed, thinking, and realtime streaming |
| gemini-2.0-flash-thinking | 32,768 tokens | Advanced reasoning with thinking process |
| gemini-2.0-flash-lite | 1M tokens | Cost efficiency and low latency | | gemini-2.0-flash-lite | 1M tokens | Cost efficiency and low latency |
| gemini-1.5-pro | 2M tokens | Best performing, logical reasoning, coding |
| gemini-1.5-flash | 1M tokens | Balanced multimodal model, good for most tasks | | gemini-1.5-flash | 1M tokens | Balanced multimodal model, good for most tasks |
| gemini-1.5-flash-8b | 1M tokens | Fastest, most cost-efficient | | gemini-1.5-flash-8B | 1M tokens | Fastest, most cost-efficient, good for high-frequency tasks |
| gemini-1.0-pro | 32,768 tokens | Earlier generation model | | gemini-1.5-pro | 2M tokens | Best performing, wide variety of reasoning tasks including logical reasoning, coding, and creative collaboration |
**Gemma Models:**
The Gemini API also supports [Gemma models](https://ai.google.dev/gemma/docs) hosted on Google infrastructure.
| Model | Context Window | Best For |
|----------------|----------------|------------------------------------|
| gemma-3-1b | 32,000 tokens | Ultra-lightweight tasks |
| gemma-3-4b | 128,000 tokens | Efficient general-purpose tasks |
| gemma-3-12b | 128,000 tokens | Balanced performance and efficiency|
| gemma-3-27b | 128,000 tokens | High-performance tasks |
**Note:** To use Google Gemini, install the required dependencies:
```bash
uv add "crewai[google-genai]"
```
The full list of models is available in the [Gemini model docs](https://ai.google.dev/gemini-api/docs/models). The full list of models is available in the [Gemini model docs](https://ai.google.dev/gemini-api/docs/models).
### Gemma
The Gemini API also allows you to use your API key to access [Gemma models](https://ai.google.dev/gemma/docs) hosted on Google infrastructure.
| Model | Context Window |
|----------------|----------------|
| gemma-3-1b-it | 32k tokens |
| gemma-3-4b-it | 32k tokens |
| gemma-3-12b-it | 32k tokens |
| gemma-3-27b-it | 128k tokens |
</Accordion> </Accordion>
<Accordion title="Google (Vertex AI)"> <Accordion title="Google (Vertex AI)">
Get credentials from your Google Cloud Console and save it to a JSON file, then load it with the following code: Get credentials from your Google Cloud Console and save it to a JSON file, then load it with the following code:
@@ -512,146 +291,43 @@ In this section, you'll find detailed examples that help you select, configure,
</Accordion> </Accordion>
<Accordion title="Azure"> <Accordion title="Azure">
CrewAI provides native integration with Azure AI Inference and Azure OpenAI through the Azure AI Inference Python SDK.
```toml Code ```toml Code
# Required # Required
AZURE_API_KEY=<your-api-key> AZURE_API_KEY=<your-api-key>
AZURE_ENDPOINT=<your-endpoint-url> AZURE_API_BASE=<your-resource-url>
AZURE_API_VERSION=<api-version>
# Optional # Optional
AZURE_API_VERSION=<api-version> # Defaults to 2024-06-01 AZURE_AD_TOKEN=<your-azure-ad-token>
AZURE_API_TYPE=<your-azure-api-type>
``` ```
**Endpoint URL Formats:** Example usage in your CrewAI project:
For Azure OpenAI deployments:
```
https://<resource-name>.openai.azure.com/openai/deployments/<deployment-name>
```
For Azure AI Inference endpoints:
```
https://<resource-name>.inference.azure.com
```
**Basic Usage:**
```python Code ```python Code
llm = LLM( llm = LLM(
model="azure/gpt-4", model="azure/gpt-4",
api_key="<your-api-key>", # Or set AZURE_API_KEY api_version="2023-05-15"
endpoint="<your-endpoint-url>",
api_version="2024-06-01"
) )
``` ```
**Advanced Configuration:**
```python Code
llm = LLM(
model="azure/gpt-4o",
temperature=0.7,
max_tokens=4000,
top_p=0.9,
frequency_penalty=0.0,
presence_penalty=0.0,
stop=["END"],
stream=True,
timeout=60.0,
max_retries=3
)
```
**Supported Environment Variables:**
- `AZURE_API_KEY`: Your Azure API key (required)
- `AZURE_ENDPOINT`: Your Azure endpoint URL (required, also checks `AZURE_OPENAI_ENDPOINT` and `AZURE_API_BASE`)
- `AZURE_API_VERSION`: API version (optional, defaults to `2024-06-01`)
**Features:**
- Native function calling support for Azure OpenAI models (gpt-4, gpt-4o, gpt-3.5-turbo, etc.)
- Streaming support for real-time responses
- Automatic endpoint URL validation and correction
- Comprehensive error handling with retry logic
- Token usage tracking
**Note:** To use Azure AI Inference, install the required dependencies:
```bash
uv add "crewai[azure-ai-inference]"
```
</Accordion> </Accordion>
<Accordion title="AWS Bedrock"> <Accordion title="AWS Bedrock">
CrewAI provides native integration with AWS Bedrock through the boto3 SDK using the Converse API.
```toml Code ```toml Code
# Required
AWS_ACCESS_KEY_ID=<your-access-key> AWS_ACCESS_KEY_ID=<your-access-key>
AWS_SECRET_ACCESS_KEY=<your-secret-key> AWS_SECRET_ACCESS_KEY=<your-secret-key>
AWS_DEFAULT_REGION=<your-region>
# Optional
AWS_SESSION_TOKEN=<your-session-token> # For temporary credentials
AWS_DEFAULT_REGION=<your-region> # Defaults to us-east-1
``` ```
**Basic Usage:** Example usage in your CrewAI project:
```python Code ```python Code
from crewai import LLM
llm = LLM( llm = LLM(
model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0"
region_name="us-east-1"
) )
``` ```
**Advanced Configuration:** Before using Amazon Bedrock, make sure you have boto3 installed in your environment
```python Code
from crewai import LLM
llm = LLM( [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/models-regions.html) is a managed service that provides access to multiple foundation models from top AI companies through a unified API, enabling secure and responsible AI application development.
model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0",
aws_access_key_id="your-access-key", # Or set AWS_ACCESS_KEY_ID
aws_secret_access_key="your-secret-key", # Or set AWS_SECRET_ACCESS_KEY
aws_session_token="your-session-token", # For temporary credentials
region_name="us-east-1",
temperature=0.7,
max_tokens=4096,
top_p=0.9,
top_k=250, # For Claude models
stop_sequences=["END", "STOP"],
stream=True, # Enable streaming
guardrail_config={ # Optional content filtering
"guardrailIdentifier": "your-guardrail-id",
"guardrailVersion": "1"
},
additional_model_request_fields={ # Model-specific parameters
"top_k": 250
}
)
```
**Supported Environment Variables:**
- `AWS_ACCESS_KEY_ID`: AWS access key (required)
- `AWS_SECRET_ACCESS_KEY`: AWS secret key (required)
- `AWS_SESSION_TOKEN`: AWS session token for temporary credentials (optional)
- `AWS_DEFAULT_REGION`: AWS region (defaults to `us-east-1`)
**Features:**
- Native tool calling support via Converse API
- Streaming and non-streaming responses
- Comprehensive error handling with retry logic
- Guardrail configuration for content filtering
- Model-specific parameters via `additional_model_request_fields`
- Token usage tracking and stop reason logging
- Support for all Bedrock foundation models
- Automatic conversation format handling
**Important Notes:**
- Uses the modern Converse API for unified model access
- Automatic handling of model-specific conversation requirements
- System messages are handled separately from conversation
- First message must be from user (automatically handled)
- Some models (like Cohere) require conversation to end with user message
[Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/models-regions.html) is a managed service that provides access to multiple foundation models from top AI companies through a unified API.
| Model | Context Window | Best For | | Model | Context Window | Best For |
|-------------------------|----------------------|-------------------------------------------------------------------| |-------------------------|----------------------|-------------------------------------------------------------------|
@@ -681,12 +357,7 @@ In this section, you'll find detailed examples that help you select, configure,
| Jamba-Instruct | Up to 256k tokens | Model with extended context window optimized for cost-effective text generation, summarization, and Q&A. | | Jamba-Instruct | Up to 256k tokens | Model with extended context window optimized for cost-effective text generation, summarization, and Q&A. |
| Mistral 7B Instruct | Up to 32k tokens | This LLM follows instructions, completes requests, and generates creative text. | | Mistral 7B Instruct | Up to 32k tokens | This LLM follows instructions, completes requests, and generates creative text. |
| Mistral 8x7B Instruct | Up to 32k tokens | An MOE LLM that follows instructions, completes requests, and generates creative text. | | Mistral 8x7B Instruct | Up to 32k tokens | An MOE LLM that follows instructions, completes requests, and generates creative text. |
| DeepSeek R1 | 32,768 tokens | Advanced reasoning model |
**Note:** To use AWS Bedrock, install the required dependencies:
```bash
uv add "crewai[bedrock]"
```
</Accordion> </Accordion>
<Accordion title="Amazon SageMaker"> <Accordion title="Amazon SageMaker">
@@ -1079,7 +750,7 @@ CrewAI supports streaming responses from LLMs, allowing your application to rece
``` ```
<Tip> <Tip>
[Click here](/en/concepts/event-listener#event-listeners) for more details [Click here](https://docs.crewai.com/concepts/event-listener#event-listeners) for more details
</Tip> </Tip>
</Tab> </Tab>
@@ -1133,50 +804,6 @@ CrewAI supports streaming responses from LLMs, allowing your application to rece
</Tab> </Tab>
</Tabs> </Tabs>
## Async LLM Calls
CrewAI supports asynchronous LLM calls for improved performance and concurrency in your AI workflows. Async calls allow you to run multiple LLM requests concurrently without blocking, making them ideal for high-throughput applications and parallel agent operations.
<Tabs>
<Tab title="Basic Usage">
Use the `acall` method for asynchronous LLM requests:
```python
import asyncio
from crewai import LLM
async def main():
llm = LLM(model="openai/gpt-4o")
# Single async call
response = await llm.acall("What is the capital of France?")
print(response)
asyncio.run(main())
```
The `acall` method supports all the same parameters as the synchronous `call` method, including messages, tools, and callbacks.
</Tab>
<Tab title="With Streaming">
Combine async calls with streaming for real-time concurrent responses:
```python
import asyncio
from crewai import LLM
async def stream_async():
llm = LLM(model="openai/gpt-4o", stream=True)
response = await llm.acall("Write a short story about AI")
print(response)
asyncio.run(stream_async())
```
</Tab>
</Tabs>
## Structured LLM Calls ## Structured LLM Calls
CrewAI supports structured responses from LLM calls by allowing you to define a `response_format` using a Pydantic model. This enables the framework to automatically parse and validate the output, making it easier to integrate the response into your application without manual post-processing. CrewAI supports structured responses from LLM calls by allowing you to define a `response_format` using a Pydantic model. This enables the framework to automatically parse and validate the output, making it easier to integrate the response into your application without manual post-processing.
@@ -1272,7 +899,7 @@ Learn how to get the most out of your LLM configuration:
</Accordion> </Accordion>
<Accordion title="Drop Additional Parameters"> <Accordion title="Drop Additional Parameters">
CrewAI internally uses native sdks for LLM calls, which allows you to drop additional parameters that are not needed for your specific use case. This can help simplify your code and reduce the complexity of your LLM configuration. CrewAI internally uses Litellm for LLM calls, which allows you to drop additional parameters that are not needed for your specific use case. This can help simplify your code and reduce the complexity of your LLM configuration.
For example, if you don't need to send the <code>stop</code> parameter, you can simply omit it from your LLM call: For example, if you don't need to send the <code>stop</code> parameter, you can simply omit it from your LLM call:
```python ```python
@@ -1288,52 +915,6 @@ Learn how to get the most out of your LLM configuration:
) )
``` ```
</Accordion> </Accordion>
<Accordion title="Transport Interceptors">
CrewAI provides message interceptors for several providers, allowing you to hook into request/response cycles at the transport layer.
**Supported Providers:**
- ✅ OpenAI
- ✅ Anthropic
**Basic Usage:**
```python
import httpx
from crewai import LLM
from crewai.llms.hooks import BaseInterceptor
class CustomInterceptor(BaseInterceptor[httpx.Request, httpx.Response]):
"""Custom interceptor to modify requests and responses."""
def on_outbound(self, request: httpx.Request) -> httpx.Request:
"""Print request before sending to the LLM provider."""
print(request)
return request
def on_inbound(self, response: httpx.Response) -> httpx.Response:
"""Process response after receiving from the LLM provider."""
print(f"Status: {response.status_code}")
print(f"Response time: {response.elapsed}")
return response
# Use the interceptor with an LLM
llm = LLM(
model="openai/gpt-4o",
interceptor=CustomInterceptor()
)
```
**Important Notes:**
- Both methods must return the received object or type of object.
- Modifying received objects may result in unexpected behavior or application crashes.
- Not all providers support interceptors - check the supported providers list above
<Info>
Interceptors operate at the transport layer. This is particularly useful for:
- Message transformation and filtering
- Debugging API interactions
</Info>
</Accordion>
</AccordionGroup> </AccordionGroup>
## Common Issues and Solutions ## Common Issues and Solutions

View File

@@ -341,7 +341,7 @@ crew = Crew(
embedder={ embedder={
"provider": "openai", "provider": "openai",
"config": { "config": {
"model_name": "text-embedding-3-small" # or "text-embedding-3-large" "model": "text-embedding-3-small" # or "text-embedding-3-large"
} }
} }
) )
@@ -353,7 +353,7 @@ crew = Crew(
"provider": "openai", "provider": "openai",
"config": { "config": {
"api_key": "your-openai-api-key", # Optional: override env var "api_key": "your-openai-api-key", # Optional: override env var
"model_name": "text-embedding-3-large", "model": "text-embedding-3-large",
"dimensions": 1536, # Optional: reduce dimensions for smaller storage "dimensions": 1536, # Optional: reduce dimensions for smaller storage
"organization_id": "your-org-id" # Optional: for organization accounts "organization_id": "your-org-id" # Optional: for organization accounts
} }
@@ -375,7 +375,7 @@ crew = Crew(
"api_base": "https://your-resource.openai.azure.com/", "api_base": "https://your-resource.openai.azure.com/",
"api_type": "azure", "api_type": "azure",
"api_version": "2023-05-15", "api_version": "2023-05-15",
"model_name": "text-embedding-3-small", "model": "text-embedding-3-small",
"deployment_id": "your-deployment-name" # Azure deployment name "deployment_id": "your-deployment-name" # Azure deployment name
} }
} }
@@ -390,10 +390,10 @@ Use Google's text embedding models for integration with Google Cloud services.
crew = Crew( crew = Crew(
memory=True, memory=True,
embedder={ embedder={
"provider": "google-generativeai", "provider": "google",
"config": { "config": {
"api_key": "your-google-api-key", "api_key": "your-google-api-key",
"model_name": "gemini-embedding-001" # or "text-embedding-005", "text-multilingual-embedding-002" "model": "text-embedding-004" # or "text-embedding-preview-0409"
} }
} }
) )
@@ -461,7 +461,7 @@ crew = Crew(
"provider": "cohere", "provider": "cohere",
"config": { "config": {
"api_key": "your-cohere-api-key", "api_key": "your-cohere-api-key",
"model_name": "embed-english-v3.0" # or "embed-multilingual-v3.0" "model": "embed-english-v3.0" # or "embed-multilingual-v3.0"
} }
} }
) )
@@ -478,7 +478,7 @@ crew = Crew(
"provider": "voyageai", "provider": "voyageai",
"config": { "config": {
"api_key": "your-voyage-api-key", "api_key": "your-voyage-api-key",
"model": "voyage-3", # or "voyage-3-lite", "voyage-code-3" "model": "voyage-large-2", # or "voyage-code-2" for code
"input_type": "document" # or "query" "input_type": "document" # or "query"
} }
} }
@@ -515,7 +515,8 @@ crew = Crew(
"provider": "huggingface", "provider": "huggingface",
"config": { "config": {
"api_key": "your-hf-token", # Optional for public models "api_key": "your-hf-token", # Optional for public models
"model": "sentence-transformers/all-MiniLM-L6-v2" "model": "sentence-transformers/all-MiniLM-L6-v2",
"api_url": "https://api-inference.huggingface.co" # or your custom endpoint
} }
} }
) )
@@ -911,10 +912,10 @@ crew = Crew(
crew = Crew( crew = Crew(
memory=True, memory=True,
embedder={ embedder={
"provider": "google-generativeai", "provider": "google",
"config": { "config": {
"api_key": "your-api-key", "api_key": "your-api-key",
"model_name": "gemini-embedding-001" "model": "text-embedding-004"
} }
} }
) )

View File

@@ -1,154 +0,0 @@
---
title: Production Architecture
description: Best practices for building production-ready AI applications with CrewAI
icon: server
mode: "wide"
---
# The Flow-First Mindset
When building production AI applications with CrewAI, **we recommend starting with a Flow**.
While it's possible to run individual Crews or Agents, wrapping them in a Flow provides the necessary structure for a robust, scalable application.
## Why Flows?
1. **State Management**: Flows provide a built-in way to manage state across different steps of your application. This is crucial for passing data between Crews, maintaining context, and handling user inputs.
2. **Control**: Flows allow you to define precise execution paths, including loops, conditionals, and branching logic. This is essential for handling edge cases and ensuring your application behaves predictably.
3. **Observability**: Flows provide a clear structure that makes it easier to trace execution, debug issues, and monitor performance. We recommend using [CrewAI Tracing](/en/observability/tracing) for detailed insights. Simply run `crewai login` to enable free observability features.
## The Architecture
A typical production CrewAI application looks like this:
```mermaid
graph TD
Start((Start)) --> Flow[Flow Orchestrator]
Flow --> State{State Management}
State --> Step1[Step 1: Data Gathering]
Step1 --> Crew1[Research Crew]
Crew1 --> State
State --> Step2{Condition Check}
Step2 -- "Valid" --> Step3[Step 3: Execution]
Step3 --> Crew2[Action Crew]
Step2 -- "Invalid" --> End((End))
Crew2 --> End
```
### 1. The Flow Class
Your `Flow` class is the entry point. It defines the state schema and the methods that execute your logic.
```python
from crewai.flow.flow import Flow, listen, start
from pydantic import BaseModel
class AppState(BaseModel):
user_input: str = ""
research_results: str = ""
final_report: str = ""
class ProductionFlow(Flow[AppState]):
@start()
def gather_input(self):
# ... logic to get input ...
pass
@listen(gather_input)
def run_research_crew(self):
# ... trigger a Crew ...
pass
```
### 2. State Management
Use Pydantic models to define your state. This ensures type safety and makes it clear what data is available at each step.
- **Keep it minimal**: Store only what you need to persist between steps.
- **Use structured data**: Avoid unstructured dictionaries when possible.
### 3. Crews as Units of Work
Delegate complex tasks to Crews. A Crew should be focused on a specific goal (e.g., "Research a topic", "Write a blog post").
- **Don't over-engineer Crews**: Keep them focused.
- **Pass state explicitly**: Pass the necessary data from the Flow state to the Crew inputs.
```python
@listen(gather_input)
def run_research_crew(self):
crew = ResearchCrew()
result = crew.kickoff(inputs={"topic": self.state.user_input})
self.state.research_results = result.raw
```
## Control Primitives
Leverage CrewAI's control primitives to add robustness and control to your Crews.
### 1. Task Guardrails
Use [Task Guardrails](/en/concepts/tasks#task-guardrails) to validate task outputs before they are accepted. This ensures that your agents produce high-quality results.
```python
def validate_content(result: TaskOutput) -> Tuple[bool, Any]:
if len(result.raw) < 100:
return (False, "Content is too short. Please expand.")
return (True, result.raw)
task = Task(
...,
guardrail=validate_content
)
```
### 2. Structured Outputs
Always use structured outputs (`output_pydantic` or `output_json`) when passing data between tasks or to your application. This prevents parsing errors and ensures type safety.
```python
class ResearchResult(BaseModel):
summary: str
sources: List[str]
task = Task(
...,
output_pydantic=ResearchResult
)
```
### 3. LLM Hooks
Use [LLM Hooks](/en/learn/llm-hooks) to inspect or modify messages before they are sent to the LLM, or to sanitize responses.
```python
@before_llm_call
def log_request(context):
print(f"Agent {context.agent.role} is calling the LLM...")
```
## Deployment Patterns
When deploying your Flow, consider the following:
### CrewAI Enterprise
The easiest way to deploy your Flow is using CrewAI Enterprise. It handles the infrastructure, authentication, and monitoring for you.
Check out the [Deployment Guide](/en/enterprise/guides/deploy-crew) to get started.
```bash
crewai deploy create
```
### Async Execution
For long-running tasks, use `kickoff_async` to avoid blocking your API.
### Persistence
Use the `@persist` decorator to save the state of your Flow to a database. This allows you to resume execution if the process crashes or if you need to wait for human input.
```python
@persist
class ProductionFlow(Flow[AppState]):
# ...
```
## Summary
- **Start with a Flow.**
- **Define a clear State.**
- **Use Crews for complex tasks.**
- **Deploy with an API and persistence.**

View File

@@ -19,7 +19,6 @@ CrewAI AMP includes a Visual Task Builder in Crew Studio that simplifies complex
![Task Builder Screenshot](/images/enterprise/crew-studio-interface.png) ![Task Builder Screenshot](/images/enterprise/crew-studio-interface.png)
The Visual Task Builder enables: The Visual Task Builder enables:
- Drag-and-drop task creation - Drag-and-drop task creation
- Visual task dependencies and flow - Visual task dependencies and flow
- Real-time testing and validation - Real-time testing and validation
@@ -29,12 +28,10 @@ The Visual Task Builder enables:
### Task Execution Flow ### Task Execution Flow
Tasks can be executed in two ways: Tasks can be executed in two ways:
- **Sequential**: Tasks are executed in the order they are defined - **Sequential**: Tasks are executed in the order they are defined
- **Hierarchical**: Tasks are assigned to agents based on their roles and expertise - **Hierarchical**: Tasks are assigned to agents based on their roles and expertise
The execution flow is defined when creating the crew: The execution flow is defined when creating the crew:
```python Code ```python Code
crew = Crew( crew = Crew(
agents=[agent1, agent2], agents=[agent1, agent2],
@@ -45,31 +42,29 @@ crew = Crew(
## Task Attributes ## Task Attributes
| Attribute | Parameters | Type | Description | | Attribute | Parameters | Type | Description |
| :------------------------------------- | :---------------------- | :-------------------------- | :-------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | | :------------------------------- | :---------------- | :---------------------------- | :------------------------------------------------------------------------------------------------------------------- |
| **Description** | `description` | `str` | A clear, concise statement of what the task entails. | | **Description** | `description` | `str` | A clear, concise statement of what the task entails. |
| **Expected Output** | `expected_output` | `str` | A detailed description of what the task's completion looks like. | | **Expected Output** | `expected_output` | `str` | A detailed description of what the task's completion looks like. |
| **Name** _(optional)_ | `name` | `Optional[str]` | A name identifier for the task. | | **Name** _(optional)_ | `name` | `Optional[str]` | A name identifier for the task. |
| **Agent** _(optional)_ | `agent` | `Optional[BaseAgent]` | The agent responsible for executing the task. | | **Agent** _(optional)_ | `agent` | `Optional[BaseAgent]` | The agent responsible for executing the task. |
| **Tools** _(optional)_ | `tools` | `List[BaseTool]` | The tools/resources the agent is limited to use for this task. | | **Tools** _(optional)_ | `tools` | `List[BaseTool]` | The tools/resources the agent is limited to use for this task. |
| **Context** _(optional)_ | `context` | `Optional[List["Task"]]` | Other tasks whose outputs will be used as context for this task. | | **Context** _(optional)_ | `context` | `Optional[List["Task"]]` | Other tasks whose outputs will be used as context for this task. |
| **Async Execution** _(optional)_ | `async_execution` | `Optional[bool]` | Whether the task should be executed asynchronously. Defaults to False. | | **Async Execution** _(optional)_ | `async_execution` | `Optional[bool]` | Whether the task should be executed asynchronously. Defaults to False. |
| **Human Input** _(optional)_ | `human_input` | `Optional[bool]` | Whether the task should have a human review the final answer of the agent. Defaults to False. | | **Human Input** _(optional)_ | `human_input` | `Optional[bool]` | Whether the task should have a human review the final answer of the agent. Defaults to False. |
| **Markdown** _(optional)_ | `markdown` | `Optional[bool]` | Whether the task should instruct the agent to return the final answer formatted in Markdown. Defaults to False. | | **Markdown** _(optional)_ | `markdown` | `Optional[bool]` | Whether the task should instruct the agent to return the final answer formatted in Markdown. Defaults to False. |
| **Config** _(optional)_ | `config` | `Optional[Dict[str, Any]]` | Task-specific configuration parameters. | | **Config** _(optional)_ | `config` | `Optional[Dict[str, Any]]` | Task-specific configuration parameters. |
| **Output File** _(optional)_ | `output_file` | `Optional[str]` | File path for storing the task output. | | **Output File** _(optional)_ | `output_file` | `Optional[str]` | File path for storing the task output. |
| **Create Directory** _(optional)_ | `create_directory` | `Optional[bool]` | Whether to create the directory for output_file if it doesn't exist. Defaults to True. | | **Create Directory** _(optional)_ | `create_directory` | `Optional[bool]` | Whether to create the directory for output_file if it doesn't exist. Defaults to True. |
| **Output JSON** _(optional)_ | `output_json` | `Optional[Type[BaseModel]]` | A Pydantic model to structure the JSON output. | | **Output JSON** _(optional)_ | `output_json` | `Optional[Type[BaseModel]]` | A Pydantic model to structure the JSON output. |
| **Output Pydantic** _(optional)_ | `output_pydantic` | `Optional[Type[BaseModel]]` | A Pydantic model for task output. | | **Output Pydantic** _(optional)_ | `output_pydantic` | `Optional[Type[BaseModel]]` | A Pydantic model for task output. |
| **Callback** _(optional)_ | `callback` | `Optional[Any]` | Function/object to be executed after task completion. | | **Callback** _(optional)_ | `callback` | `Optional[Any]` | Function/object to be executed after task completion. |
| **Guardrail** _(optional)_ | `guardrail` | `Optional[Callable]` | Function to validate task output before proceeding to next task. | | **Guardrail** _(optional)_ | `guardrail` | `Optional[Callable]` | Function to validate task output before proceeding to next task. |
| **Guardrails** _(optional)_ | `guardrails` | `Optional[List[Callable] | List[str]]` | List of guardrails to validate task output before proceeding to next task. | | **Guardrail Max Retries** _(optional)_ | `guardrail_max_retries` | `Optional[int]` | Maximum number of retries when guardrail validation fails. Defaults to 3. |
| **Guardrail Max Retries** _(optional)_ | `guardrail_max_retries` | `Optional[int]` | Maximum number of retries when guardrail validation fails. Defaults to 3. |
<Note type="warning" title="Deprecated: max_retries"> <Note type="warning" title="Deprecated: max_retries">
The task attribute `max_retries` is deprecated and will be removed in v1.0.0. The task attribute `max_retries` is deprecated and will be removed in v1.0.0.
Use `guardrail_max_retries` instead to control retry attempts when a guardrail Use `guardrail_max_retries` instead to control retry attempts when a guardrail fails.
fails.
</Note> </Note>
## Creating Tasks ## Creating Tasks
@@ -91,7 +86,7 @@ crew.kickoff(inputs={'topic': 'AI Agents'})
Here's an example of how to configure tasks using YAML: Here's an example of how to configure tasks using YAML:
````yaml tasks.yaml ```yaml tasks.yaml
research_task: research_task:
description: > description: >
Conduct a thorough research about {topic} Conduct a thorough research about {topic}
@@ -111,7 +106,7 @@ reporting_task:
agent: reporting_analyst agent: reporting_analyst
markdown: true markdown: true
output_file: report.md output_file: report.md
```` ```
To use this YAML configuration in your code, create a crew class that inherits from `CrewBase`: To use this YAML configuration in your code, create a crew class that inherits from `CrewBase`:
@@ -169,8 +164,7 @@ class LatestAiDevelopmentCrew():
``` ```
<Note> <Note>
The names you use in your YAML files (`agents.yaml` and `tasks.yaml`) should The names you use in your YAML files (`agents.yaml` and `tasks.yaml`) should match the method names in your Python code.
match the method names in your Python code.
</Note> </Note>
### Direct Code Definition (Alternative) ### Direct Code Definition (Alternative)
@@ -207,8 +201,7 @@ reporting_task = Task(
``` ```
<Tip> <Tip>
Directly specify an `agent` for assignment or let the `hierarchical` CrewAI's Directly specify an `agent` for assignment or let the `hierarchical` CrewAI's process decide based on roles, availability, etc.
process decide based on roles, availability, etc.
</Tip> </Tip>
## Task Output ## Task Output
@@ -230,7 +223,6 @@ By default, the `TaskOutput` will only include the `raw` output. A `TaskOutput`
| **JSON Dict** | `json_dict` | `Optional[Dict[str, Any]]` | A dictionary representing the JSON output of the task. | | **JSON Dict** | `json_dict` | `Optional[Dict[str, Any]]` | A dictionary representing the JSON output of the task. |
| **Agent** | `agent` | `str` | The agent that executed the task. | | **Agent** | `agent` | `str` | The agent that executed the task. |
| **Output Format** | `output_format` | `OutputFormat` | The format of the task output, with options including RAW, JSON, and Pydantic. The default is RAW. | | **Output Format** | `output_format` | `OutputFormat` | The format of the task output, with options including RAW, JSON, and Pydantic. The default is RAW. |
| **Messages** | `messages` | `list[LLMMessage]` | The messages from the last task execution. |
### Task Methods and Properties ### Task Methods and Properties
@@ -293,13 +285,12 @@ formatted_task = Task(
``` ```
When `markdown=True`, the agent will receive additional instructions to format the output using: When `markdown=True`, the agent will receive additional instructions to format the output using:
- `#` for headers - `#` for headers
- `**text**` for bold text - `**text**` for bold text
- `*text*` for italic text - `*text*` for italic text
- `-` or `*` for bullet points - `-` or `*` for bullet points
- `` `code` `` for inline code - `` `code` `` for inline code
- ` `language ``` for code blocks - ``` ```language ``` for code blocks
### YAML Configuration with Markdown ### YAML Configuration with Markdown
@@ -310,7 +301,7 @@ analysis_task:
expected_output: > expected_output: >
A comprehensive analysis with charts and key findings A comprehensive analysis with charts and key findings
agent: analyst agent: analyst
markdown: true # Enable markdown formatting markdown: true # Enable markdown formatting
output_file: analysis.md output_file: analysis.md
``` ```
@@ -322,9 +313,7 @@ analysis_task:
- **Cross-Platform Compatibility**: Markdown is universally supported - **Cross-Platform Compatibility**: Markdown is universally supported
<Note> <Note>
The markdown formatting instructions are automatically added to the task The markdown formatting instructions are automatically added to the task prompt when `markdown=True`, so you don't need to specify formatting requirements in your task description.
prompt when `markdown=True`, so you don't need to specify formatting
requirements in your task description.
</Note> </Note>
## Task Dependencies and Context ## Task Dependencies and Context
@@ -352,11 +341,7 @@ Task guardrails provide a way to validate and transform task outputs before they
are passed to the next task. This feature helps ensure data quality and provides are passed to the next task. This feature helps ensure data quality and provides
feedback to agents when their output doesn't meet specific criteria. feedback to agents when their output doesn't meet specific criteria.
CrewAI supports two types of guardrails: Guardrails are implemented as Python functions that contain custom validation logic, giving you complete control over the validation process and ensuring reliable, deterministic results.
1. **Function-based guardrails**: Python functions with custom validation logic, giving you complete control over the validation process and ensuring reliable, deterministic results.
2. **LLM-based guardrails**: String descriptions that use the agent's LLM to validate outputs based on natural language criteria. These are ideal for complex or subjective validation requirements.
### Function-Based Guardrails ### Function-Based Guardrails
@@ -370,12 +355,12 @@ def validate_blog_content(result: TaskOutput) -> Tuple[bool, Any]:
"""Validate blog content meets requirements.""" """Validate blog content meets requirements."""
try: try:
# Check word count # Check word count
word_count = len(result.raw.split()) word_count = len(result.split())
if word_count > 200: if word_count > 200:
return (False, "Blog content exceeds 200 words") return (False, "Blog content exceeds 200 words")
# Additional validation logic here # Additional validation logic here
return (True, result.raw.strip()) return (True, result.strip())
except Exception as e: except Exception as e:
return (False, "Unexpected error during validation") return (False, "Unexpected error during validation")
@@ -387,156 +372,9 @@ blog_task = Task(
) )
``` ```
### LLM-Based Guardrails (String Descriptions)
Instead of writing custom validation functions, you can use string descriptions that leverage LLM-based validation. When you provide a string to the `guardrail` or `guardrails` parameter, CrewAI automatically creates an `LLMGuardrail` that uses the agent's LLM to validate the output based on your description.
**Requirements**:
- The task must have an `agent` assigned (the guardrail uses the agent's LLM)
- Provide a clear, descriptive string explaining the validation criteria
```python Code
from crewai import Task
# Single LLM-based guardrail
blog_task = Task(
description="Write a blog post about AI",
expected_output="A blog post under 200 words",
agent=blog_agent,
guardrail="The blog post must be under 200 words and contain no technical jargon"
)
```
LLM-based guardrails are particularly useful for:
- **Complex validation logic** that's difficult to express programmatically
- **Subjective criteria** like tone, style, or quality assessments
- **Natural language requirements** that are easier to describe than code
The LLM guardrail will:
1. Analyze the task output against your description
2. Return `(True, output)` if the output complies with the criteria
3. Return `(False, feedback)` with specific feedback if validation fails
**Example with detailed validation criteria**:
```python Code
research_task = Task(
description="Research the latest developments in quantum computing",
expected_output="A comprehensive research report",
agent=researcher_agent,
guardrail="""
The research report must:
- Be at least 1000 words long
- Include at least 5 credible sources
- Cover both technical and practical applications
- Be written in a professional, academic tone
- Avoid speculation or unverified claims
"""
)
```
### Multiple Guardrails
You can apply multiple guardrails to a task using the `guardrails` parameter. Multiple guardrails are executed sequentially, with each guardrail receiving the output from the previous one. This allows you to chain validation and transformation steps.
The `guardrails` parameter accepts:
- A list of guardrail functions or string descriptions
- A single guardrail function or string (same as `guardrail`)
**Note**: If `guardrails` is provided, it takes precedence over `guardrail`. The `guardrail` parameter will be ignored when `guardrails` is set.
```python Code
from typing import Tuple, Any
from crewai import TaskOutput, Task
def validate_word_count(result: TaskOutput) -> Tuple[bool, Any]:
"""Validate word count is within limits."""
word_count = len(result.raw.split())
if word_count < 100:
return (False, f"Content too short: {word_count} words. Need at least 100 words.")
if word_count > 500:
return (False, f"Content too long: {word_count} words. Maximum is 500 words.")
return (True, result.raw)
def validate_no_profanity(result: TaskOutput) -> Tuple[bool, Any]:
"""Check for inappropriate language."""
profanity_words = ["badword1", "badword2"] # Example list
content_lower = result.raw.lower()
for word in profanity_words:
if word in content_lower:
return (False, f"Inappropriate language detected: {word}")
return (True, result.raw)
def format_output(result: TaskOutput) -> Tuple[bool, Any]:
"""Format and clean the output."""
formatted = result.raw.strip()
# Capitalize first letter
formatted = formatted[0].upper() + formatted[1:] if formatted else formatted
return (True, formatted)
# Apply multiple guardrails sequentially
blog_task = Task(
description="Write a blog post about AI",
expected_output="A well-formatted blog post between 100-500 words",
agent=blog_agent,
guardrails=[
validate_word_count, # First: validate length
validate_no_profanity, # Second: check content
format_output # Third: format the result
],
guardrail_max_retries=3
)
```
In this example, the guardrails execute in order:
1. `validate_word_count` checks the word count
2. `validate_no_profanity` checks for inappropriate language (using the output from step 1)
3. `format_output` formats the final result (using the output from step 2)
If any guardrail fails, the error is sent back to the agent, and the task is retried up to `guardrail_max_retries` times.
**Mixing function-based and LLM-based guardrails**:
You can combine both function-based and string-based guardrails in the same list:
```python Code
from typing import Tuple, Any
from crewai import TaskOutput, Task
def validate_word_count(result: TaskOutput) -> Tuple[bool, Any]:
"""Validate word count is within limits."""
word_count = len(result.raw.split())
if word_count < 100:
return (False, f"Content too short: {word_count} words. Need at least 100 words.")
if word_count > 500:
return (False, f"Content too long: {word_count} words. Maximum is 500 words.")
return (True, result.raw)
# Mix function-based and LLM-based guardrails
blog_task = Task(
description="Write a blog post about AI",
expected_output="A well-formatted blog post between 100-500 words",
agent=blog_agent,
guardrails=[
validate_word_count, # Function-based: precise word count check
"The content must be engaging and suitable for a general audience", # LLM-based: subjective quality check
"The writing style should be clear, concise, and free of technical jargon" # LLM-based: style validation
],
guardrail_max_retries=3
)
```
This approach combines the precision of programmatic validation with the flexibility of LLM-based assessment for subjective criteria.
### Guardrail Function Requirements ### Guardrail Function Requirements
1. **Function Signature**: 1. **Function Signature**:
- Must accept exactly one parameter (the task output) - Must accept exactly one parameter (the task output)
- Should return a tuple of `(bool, Any)` - Should return a tuple of `(bool, Any)`
- Type hints are recommended but optional - Type hints are recommended but optional
@@ -545,10 +383,11 @@ This approach combines the precision of programmatic validation with the flexibi
- On success: it returns a tuple of `(bool, Any)`. For example: `(True, validated_result)` - On success: it returns a tuple of `(bool, Any)`. For example: `(True, validated_result)`
- On Failure: it returns a tuple of `(bool, str)`. For example: `(False, "Error message explain the failure")` - On Failure: it returns a tuple of `(bool, str)`. For example: `(False, "Error message explain the failure")`
### Error Handling Best Practices ### Error Handling Best Practices
1. **Structured Error Responses**: 1. **Structured Error Responses**:
```python Code ```python Code
from crewai import TaskOutput, LLMGuardrail from crewai import TaskOutput, LLMGuardrail
@@ -564,13 +403,11 @@ def validate_with_context(result: TaskOutput) -> Tuple[bool, Any]:
``` ```
2. **Error Categories**: 2. **Error Categories**:
- Use specific error codes - Use specific error codes
- Include relevant context - Include relevant context
- Provide actionable feedback - Provide actionable feedback
3. **Validation Chain**: 3. **Validation Chain**:
```python Code ```python Code
from typing import Any, Dict, List, Tuple, Union from typing import Any, Dict, List, Tuple, Union
from crewai import TaskOutput from crewai import TaskOutput
@@ -597,7 +434,6 @@ def complex_validation(result: TaskOutput) -> Tuple[bool, Any]:
### Handling Guardrail Results ### Handling Guardrail Results
When a guardrail returns `(False, error)`: When a guardrail returns `(False, error)`:
1. The error is sent back to the agent 1. The error is sent back to the agent
2. The agent attempts to fix the issue 2. The agent attempts to fix the issue
3. The process repeats until: 3. The process repeats until:
@@ -605,7 +441,6 @@ When a guardrail returns `(False, error)`:
- Maximum retries are reached (`guardrail_max_retries`) - Maximum retries are reached (`guardrail_max_retries`)
Example with retry handling: Example with retry handling:
```python Code ```python Code
from typing import Optional, Tuple, Union from typing import Optional, Tuple, Union
from crewai import TaskOutput, Task from crewai import TaskOutput, Task
@@ -631,12 +466,10 @@ task = Task(
## Getting Structured Consistent Outputs from Tasks ## Getting Structured Consistent Outputs from Tasks
<Note> <Note>
It's also important to note that the output of the final task of a crew It's also important to note that the output of the final task of a crew becomes the final output of the actual crew itself.
becomes the final output of the actual crew itself.
</Note> </Note>
### Using `output_pydantic` ### Using `output_pydantic`
The `output_pydantic` property allows you to define a Pydantic model that the task output should conform to. This ensures that the output is not only structured but also validated according to the Pydantic model. The `output_pydantic` property allows you to define a Pydantic model that the task output should conform to. This ensures that the output is not only structured but also validated according to the Pydantic model.
Here's an example demonstrating how to use output_pydantic: Here's an example demonstrating how to use output_pydantic:
@@ -706,22 +539,18 @@ print("Accessing Properties - Option 5")
print("Blog:", result) print("Blog:", result)
``` ```
In this example: In this example:
* A Pydantic model Blog is defined with title and content fields.
- A Pydantic model Blog is defined with title and content fields. * The task task1 uses the output_pydantic property to specify that its output should conform to the Blog model.
- The task task1 uses the output_pydantic property to specify that its output should conform to the Blog model. * After executing the crew, you can access the structured output in multiple ways as shown.
- After executing the crew, you can access the structured output in multiple ways as shown.
#### Explanation of Accessing the Output #### Explanation of Accessing the Output
1. Dictionary-Style Indexing: You can directly access the fields using result["field_name"]. This works because the CrewOutput class implements the __getitem__ method.
1. Dictionary-Style Indexing: You can directly access the fields using result["field_name"]. This works because the CrewOutput class implements the **getitem** method.
2. Directly from Pydantic Model: Access the attributes directly from the result.pydantic object. 2. Directly from Pydantic Model: Access the attributes directly from the result.pydantic object.
3. Using to_dict() Method: Convert the output to a dictionary and access the fields. 3. Using to_dict() Method: Convert the output to a dictionary and access the fields.
4. Printing the Entire Object: Simply print the result object to see the structured output. 4. Printing the Entire Object: Simply print the result object to see the structured output.
### Using `output_json` ### Using `output_json`
The `output_json` property allows you to define the expected output in JSON format. This ensures that the task's output is a valid JSON structure that can be easily parsed and used in your application. The `output_json` property allows you to define the expected output in JSON format. This ensures that the task's output is a valid JSON structure that can be easily parsed and used in your application.
Here's an example demonstrating how to use `output_json`: Here's an example demonstrating how to use `output_json`:
@@ -781,15 +610,14 @@ print("Blog:", result)
``` ```
In this example: In this example:
* A Pydantic model Blog is defined with title and content fields, which is used to specify the structure of the JSON output.
- A Pydantic model Blog is defined with title and content fields, which is used to specify the structure of the JSON output. * The task task1 uses the output_json property to indicate that it expects a JSON output conforming to the Blog model.
- The task task1 uses the output_json property to indicate that it expects a JSON output conforming to the Blog model. * After executing the crew, you can access the structured JSON output in two ways as shown.
- After executing the crew, you can access the structured JSON output in two ways as shown.
#### Explanation of Accessing the Output #### Explanation of Accessing the Output
1. Accessing Properties Using Dictionary-Style Indexing: You can access the fields directly using result["field_name"]. This is possible because the CrewOutput class implements the **getitem** method, allowing you to treat the output like a dictionary. In this option, we're retrieving the title and content from the result. 1. Accessing Properties Using Dictionary-Style Indexing: You can access the fields directly using result["field_name"]. This is possible because the CrewOutput class implements the __getitem__ method, allowing you to treat the output like a dictionary. In this option, we're retrieving the title and content from the result.
2. Printing the Entire Blog Object: By printing result, you get the string representation of the CrewOutput object. Since the **str** method is implemented to return the JSON output, this will display the entire output as a formatted string representing the Blog object. 2. Printing the Entire Blog Object: By printing result, you get the string representation of the CrewOutput object. Since the __str__ method is implemented to return the JSON output, this will display the entire output as a formatted string representing the Blog object.
--- ---
@@ -979,6 +807,8 @@ While creating and executing tasks, certain validation mechanisms are in place t
These validations help in maintaining the consistency and reliability of task executions within the crewAI framework. These validations help in maintaining the consistency and reliability of task executions within the crewAI framework.
## Creating Directories when Saving Files ## Creating Directories when Saving Files
The `create_directory` parameter controls whether CrewAI should automatically create directories when saving task outputs to files. This feature is particularly useful for organizing outputs and ensuring that file paths are correctly structured, especially when working with complex project hierarchies. The `create_directory` parameter controls whether CrewAI should automatically create directories when saving task outputs to files. This feature is particularly useful for organizing outputs and ensuring that file paths are correctly structured, especially when working with complex project hierarchies.
@@ -1025,7 +855,7 @@ analysis_task:
A comprehensive financial report with quarterly insights A comprehensive financial report with quarterly insights
agent: financial_analyst agent: financial_analyst
output_file: reports/quarterly/q4_2024_analysis.pdf output_file: reports/quarterly/q4_2024_analysis.pdf
create_directory: true # Automatically create 'reports/quarterly/' directory create_directory: true # Automatically create 'reports/quarterly/' directory
audit_task: audit_task:
description: > description: >
@@ -1034,20 +864,18 @@ audit_task:
A compliance audit report A compliance audit report
agent: auditor agent: auditor
output_file: audit/compliance_report.md output_file: audit/compliance_report.md
create_directory: false # Directory must already exist create_directory: false # Directory must already exist
``` ```
### Use Cases ### Use Cases
**Automatic Directory Creation (`create_directory=True`):** **Automatic Directory Creation (`create_directory=True`):**
- Development and prototyping environments - Development and prototyping environments
- Dynamic report generation with date-based folders - Dynamic report generation with date-based folders
- Automated workflows where directory structure may vary - Automated workflows where directory structure may vary
- Multi-tenant applications with user-specific folders - Multi-tenant applications with user-specific folders
**Manual Directory Management (`create_directory=False`):** **Manual Directory Management (`create_directory=False`):**
- Production environments with strict file system controls - Production environments with strict file system controls
- Security-sensitive applications where directories must be pre-configured - Security-sensitive applications where directories must be pre-configured
- Systems with specific permission requirements - Systems with specific permission requirements

View File

@@ -20,7 +20,6 @@ enabling everything from simple searches to complex interactions and effective t
CrewAI AMP provides a comprehensive Tools Repository with pre-built integrations for common business systems and APIs. Deploy agents with enterprise tools in minutes instead of days. CrewAI AMP provides a comprehensive Tools Repository with pre-built integrations for common business systems and APIs. Deploy agents with enterprise tools in minutes instead of days.
The Enterprise Tools Repository includes: The Enterprise Tools Repository includes:
- Pre-built connectors for popular enterprise systems - Pre-built connectors for popular enterprise systems
- Custom tool creation interface - Custom tool creation interface
- Version control and sharing capabilities - Version control and sharing capabilities

View File

@@ -37,7 +37,7 @@ you can use them locally or refine them to your needs.
<Card title="Tools & Integrations" href="/en/enterprise/features/tools-and-integrations" icon="wrench"> <Card title="Tools & Integrations" href="/en/enterprise/features/tools-and-integrations" icon="wrench">
Connect external apps and manage internal tools your agents can use. Connect external apps and manage internal tools your agents can use.
</Card> </Card>
<Card title="Tool Repository" href="/en/enterprise/guides/tool-repository#tool-repository" icon="toolbox"> <Card title="Tool Repository" href="/en/enterprise/features/tool-repository" icon="toolbox">
Publish and install tools to enhance your crews' capabilities. Publish and install tools to enhance your crews' capabilities.
</Card> </Card>
<Card title="Agents Repository" href="/en/enterprise/features/agent-repositories" icon="people-group"> <Card title="Agents Repository" href="/en/enterprise/features/agent-repositories" icon="people-group">

View File

@@ -31,8 +31,7 @@ You can configure users and roles in Settings → Roles.
Go to <b>Settings → Roles</b> in CrewAI AMP. Go to <b>Settings → Roles</b> in CrewAI AMP.
</Step> </Step>
<Step title="Choose a role type"> <Step title="Choose a role type">
Use a predefined role (<b>Owner</b>, <b>Member</b>) or click{" "} Use a predefined role (<b>Owner</b>, <b>Member</b>) or click <b>Create role</b> to define a custom one.
<b>Create role</b> to define a custom one.
</Step> </Step>
<Step title="Assign to members"> <Step title="Assign to members">
Select users and assign the role. You can change this anytime. Select users and assign the role. You can change this anytime.
@@ -41,10 +40,10 @@ You can configure users and roles in Settings → Roles.
### Configuration summary ### Configuration summary
| Area | Where to configure | Options | | Area | Where to configure | Options |
| :-------------------- | :--------------------------------- | :-------------------------------------- | |:---|:---|:---|
| Users & Roles | Settings → Roles | Predefined: Owner, Member; Custom roles | | Users & Roles | Settings → Roles | Predefined: Owner, Member; Custom roles |
| Automation visibility | Automation → Settings → Visibility | Private; Whitelist users/roles | | Automation visibility | Automation → Settings → Visibility | Private; Whitelist users/roles |
## Automationlevel Access Control ## Automationlevel Access Control
@@ -71,30 +70,26 @@ You can configure automationlevel access control in Automation → Settings
Navigate to <b>Automation → Settings → Visibility</b>. Navigate to <b>Automation → Settings → Visibility</b>.
</Step> </Step>
<Step title="Set visibility"> <Step title="Set visibility">
Choose <b>Private</b> to restrict access. The organization owner always Choose <b>Private</b> to restrict access. The organization owner always retains access.
retains access.
</Step> </Step>
<Step title="Whitelist access"> <Step title="Whitelist access">
Add specific users and roles allowed to view, run, and access Add specific users and roles allowed to view, run, and access logs/metrics/settings.
logs/metrics/settings.
</Step> </Step>
<Step title="Save and verify"> <Step title="Save and verify">
Save changes, then confirm that nonwhitelisted users cannot view or run the Save changes, then confirm that nonwhitelisted users cannot view or run the automation.
automation.
</Step> </Step>
</Steps> </Steps>
### Private visibility: access outcomes ### Private visibility: access outcomes
| Action | Owner | Whitelisted user/role | Not whitelisted | | Action | Owner | Whitelisted user/role | Not whitelisted |
| :--------------------------- | :---- | :-------------------- | :-------------- | |:---|:---|:---|:---|
| View automation | ✓ | ✓ | ✗ | | View automation | ✓ | ✓ | ✗ |
| Run automation/API | ✓ | ✓ | ✗ | | Run automation/API | ✓ | ✓ | ✗ |
| Access logs/metrics/settings | ✓ | ✓ | ✗ | | Access logs/metrics/settings | ✓ | ✓ | ✗ |
<Tip> <Tip>
The organization owner always has access. In private mode, only whitelisted The organization owner always has access. In private mode, only whitelisted users and roles can view, run, and access logs/metrics/settings.
users and roles can view, run, and access logs/metrics/settings.
</Tip> </Tip>
<Frame> <Frame>

View File

@@ -18,226 +18,221 @@ Tools & Integrations is the central hub for connecting thirdparty apps and ma
<Tabs> <Tabs>
<Tab title="Integrations" icon="plug"> <Tab title="Integrations" icon="plug">
## Agent Apps (Integrations) ## Agent Apps (Integrations)
Connect enterprisegrade applications (e.g., Gmail, Google Drive, HubSpot, Slack) via OAuth to enable agent actions. Connect enterprisegrade applications (e.g., Gmail, Google Drive, HubSpot, Slack) via OAuth to enable agent actions.
{" "} <Steps>
<Steps> <Step title="Connect">
<Step title="Connect"> Click <b>Connect</b> on an app and complete OAuth.
Click <b>Connect</b> on an app and complete OAuth. </Step>
</Step> <Step title="Configure">
<Step title="Configure"> Optionally adjust scopes, triggers, and action availability.
Optionally adjust scopes, triggers, and action availability. </Step>
</Step> <Step title="Use in Agents">
<Step title="Use in Agents"> Connected services become available as tools for your agents.
Connected services become available as tools for your agents. </Step>
</Step> </Steps>
</Steps>
{" "} <Frame>
<Frame>![Integrations Grid](/images/enterprise/agent-apps.png)</Frame> ![Integrations Grid](/images/enterprise/agent-apps.png)
</Frame>
### Connect your Account ### Connect your Account
1. Go to <Link href="https://app.crewai.com/crewai_plus/connectors">Integrations</Link> 1. Go to <Link href="https://app.crewai.com/crewai_plus/connectors">Integrations</Link>
2. Click <b>Connect</b> on the desired service 2. Click <b>Connect</b> on the desired service
3. Complete the OAuth flow and grant scopes 3. Complete the OAuth flow and grant scopes
4. Copy your Enterprise Token from <Link href="https://app.crewai.com/crewai_plus/settings/integrations">Integration Settings</Link> 4. Copy your Enterprise Token from the <b>Integration</b> tab
{" "} <Frame>
<Frame> ![Enterprise Token](/images/enterprise/enterprise_action_auth_token.png)
![Enterprise Token](/images/enterprise/enterprise_action_auth_token.png) </Frame>
</Frame>
### Install Integration Tools ### Install Integration Tools
To use the integrations locally, you need to install the latest `crewai-tools` package. To use the integrations locally, you need to install the latest `crewai-tools` package.
```bash ```bash
uv add crewai-tools uv add crewai-tools
``` ```
### Environment Variable Setup ### Usage Example
{" "} <Tip>
<Note> All services you have authenticated will be available as tools. Add `CrewaiEnterpriseTools` to your agent and youre set.
To use integrations with `Agent(apps=[])`, you must set the </Tip>
`CREWAI_PLATFORM_INTEGRATION_TOKEN` environment variable with your Enterprise
Token.
</Note>
```bash ```python
export CREWAI_PLATFORM_INTEGRATION_TOKEN="your_enterprise_token" from crewai import Agent, Task, Crew
``` from crewai_tools import CrewaiEnterpriseTools
Or add it to your `.env` file: # 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
CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token 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
)
### Usage Example # Task to send an email
email_task = Task(
description="Draft and send a follow-up email to john@example.com about the project update",
agent=email_agent,
expected_output="Confirmation that email was sent successfully"
)
{" "} # Run the task
<Tip> crew = Crew(
Use the new streamlined approach to integrate enterprise apps. Simply specify agents=[email_agent],
the app and its actions directly in the Agent configuration. tasks=[email_task]
</Tip> )
```python # Run the crew
from crewai import Agent, Task, Crew crew.kickoff()
```
# Create an agent with Gmail capabilities ### Filtering Tools
email_agent = Agent(
role="Email Manager",
goal="Manage and organize email communications",
backstory="An AI assistant specialized in email management and communication.",
apps=['gmail', 'gmail/send_email'] # Using canonical name 'gmail'
)
# Task to send an email ```python
email_task = Task( from crewai_tools import CrewaiEnterpriseTools
description="Draft and send a follow-up email to john@example.com about the project update",
agent=email_agent,
expected_output="Confirmation that email was sent successfully"
)
# Run the task enterprise_tools = CrewaiEnterpriseTools(
crew = Crew( actions_list=["gmail_find_email"] # only gmail_find_email tool will be available
agents=[email_agent], )
tasks=[email_task]
)
# Run the crew
crew.kickoff()
```
### Filtering Tools gmail_tool = enterprise_tools["gmail_find_email"]
```python
from crewai import Agent, Task, Crew
# Create agent with specific Gmail actions only gmail_agent = Agent(
gmail_agent = Agent( role="Gmail Manager",
role="Gmail Manager", goal="Manage gmail communications and notifications",
goal="Manage gmail communications and notifications", backstory="An AI assistant that helps coordinate gmail communications.",
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( notification_task = Task(
description="Find the email from john@example.com", description="Find the email from john@example.com",
agent=gmail_agent, agent=gmail_agent,
expected_output="Email found from john@example.com" expected_output="Email found from john@example.com"
) )
crew = Crew( crew = Crew(
agents=[gmail_agent], agents=[gmail_agent],
tasks=[notification_task] tasks=[notification_task]
) )
``` ```
On a deployed crew, you can specify which actions are available for each integration from the service settings page. On a deployed crew, you can specify which actions are available for each integration from the service settings page.
{" "} <Frame>
<Frame> ![Filter Actions](/images/enterprise/filtering_enterprise_action_tools.png)
![Filter Actions](/images/enterprise/filtering_enterprise_action_tools.png) </Frame>
</Frame>
### Scoped Deployments (multiuser orgs) ### Scoped Deployments (multiuser orgs)
You can scope each integration to a specific user. For example, a crew that connects to Google can use a specific users Gmail account. You can scope each integration to a specific user. For example, a crew that connects to Google can use a specific users Gmail account.
{" "} <Tip>
<Tip>Useful when different teams/users must keep data access separated.</Tip> Useful when different teams/users must keep data access separated.
</Tip>
Use the `user_bearer_token` to scope authentication to the requesting user. If the user isnt logged in, the crew wont use connected integrations. Otherwise it falls back to the default bearer token configured for the deployment. Use the `user_bearer_token` to scope authentication to the requesting user. If the user isnt logged in, the crew wont use connected integrations. Otherwise it falls back to the default bearer token configured for the deployment.
{" "} <Frame>
<Frame>![User Bearer Token](/images/enterprise/user_bearer_token.png)</Frame> ![User Bearer Token](/images/enterprise/user_bearer_token.png)
</Frame>
{" "} <div id="catalog"></div>
<div id="catalog"></div> ### Catalog
### Catalog
#### Communication & Collaboration #### Communication & Collaboration
- Gmail — Manage emails and drafts
- Slack — Workspace notifications and alerts
- Microsoft — Office 365 and Teams integration
- Gmail — Manage emails and drafts #### Project Management
- Slack — Workspace notifications and alerts - Jira — Issue tracking and project management
- Microsoft — Office 365 and Teams integration - ClickUp — Task and productivity management
- Asana — Team task and project coordination
- Notion — Page and database management
- Linear — Software project and bug tracking
- GitHub — Repository and issue management
#### Project Management #### Customer Relationship Management
- Salesforce — CRM account and opportunity management
- HubSpot — Sales pipeline and contact management
- Zendesk — Customer support ticket management
- Jira — Issue tracking and project management #### Business & Finance
- ClickUp — Task and productivity management - Stripe — Payment processing and customer management
- Asana — Team task and project coordination - Shopify — Ecommerce store and product management
- Notion — Page and database management
- Linear — Software project and bug tracking
- GitHub — Repository and issue management
#### Customer Relationship Management #### Productivity & Storage
- Google Sheets — Spreadsheet data synchronization
- Google Calendar — Event and schedule management
- Box — File storage and document management
- Salesforce — CRM account and opportunity management …and more to come!
- HubSpot — Sales pipeline and contact management
- Zendesk — Customer support ticket management
#### Business & Finance
- Stripe — Payment processing and customer management
- Shopify — Ecommerce store and product management
#### Productivity & Storage
- Google Sheets — Spreadsheet data synchronization
- Google Calendar — Event and schedule management
- Box — File storage and document management
…and more to come!
</Tab> </Tab>
<Tab title="Internal Tools" icon="toolbox"> <Tab title="Internal Tools" icon="toolbox">
## Internal Tools ## Internal Tools
Create custom tools locally, publish them on CrewAI AMP Tool Repository and use them in your agents. Create custom tools locally, publish them on CrewAI AMP Tool Repository and use them in your agents.
{" "} <Tip>
<Tip> Before running the commands below, make sure you log in to your CrewAI AMP account by running this command:
Before running the commands below, make sure you log in to your CrewAI AMP ```bash
account by running this command: ```bash crewai login ``` crewai login
</Tip> ```
</Tip>
{" "} <Frame>
<Frame> ![Internal Tool Detail](/images/enterprise/tools-integrations-internal.png)
![Internal Tool Detail](/images/enterprise/tools-integrations-internal.png) </Frame>
</Frame>
{" "} <Steps>
<Steps> <Step title="Create">
<Step title="Create"> Create a new tool locally.
Create a new tool locally. ```bash crewai tool create your-tool ``` ```bash
</Step> crewai tool create your-tool
<Step title="Publish"> ```
Publish the tool to the CrewAI AMP Tool Repository. ```bash crewai tool </Step>
publish ``` <Step title="Publish">
</Step> Publish the tool to the CrewAI AMP Tool Repository.
<Step title="Install"> ```bash
Install the tool from the CrewAI AMP Tool Repository. ```bash crewai tool crewai tool publish
install your-tool ``` ```
</Step> </Step>
</Steps> <Step title="Install">
Install the tool from the CrewAI AMP Tool Repository.
```bash
crewai tool install your-tool
```
</Step>
</Steps>
Manage: Manage:
- Name and description - Name and description
- Visibility (Private / Public) - Visibility (Private / Public)
- Required environment variables - Required environment variables
- Version history and downloads - Version history and downloads
- Team and role access - Team and role access
{" "} <Frame>
<Frame>![Internal Tool Detail](/images/enterprise/tool-configs.png)</Frame> ![Internal Tool Detail](/images/enterprise/tool-configs.png)
</Frame>
</Tab> </Tab>
</Tabs> </Tabs>
@@ -245,18 +240,10 @@ Manage:
## Related ## Related
<CardGroup cols={2}> <CardGroup cols={2}>
<Card <Card title="Tool Repository" href="/en/enterprise/features/tool-repository" icon="toolbox">
title="Tool Repository"
href="/en/enterprise/guides/tool-repository#tool-repository"
icon="toolbox"
>
Create, publish, and version custom tools for your organization. Create, publish, and version custom tools for your organization.
</Card> </Card>
<Card <Card title="Webhook Automation" href="/en/enterprise/guides/webhook-automation" icon="bolt">
title="Webhook Automation"
href="/en/enterprise/guides/webhook-automation"
icon="bolt"
>
Automate workflows and integrate with external platforms and services. Automate workflows and integrate with external platforms and services.
</Card> </Card>
</CardGroup> </CardGroup>

View File

@@ -20,7 +20,9 @@ Traces in CrewAI AMP are detailed execution records that capture every aspect of
- Execution times - Execution times
- Cost estimates - Cost estimates
<Frame>![Traces Overview](/images/enterprise/traces-overview.png)</Frame> <Frame>
![Traces Overview](/images/enterprise/traces-overview.png)
</Frame>
## Accessing Traces ## Accessing Traces
@@ -49,7 +51,9 @@ The top section displays high-level metrics about the execution:
- **Execution Time**: Total duration of the crew run - **Execution Time**: Total duration of the crew run
- **Estimated Cost**: Approximate cost based on token usage - **Estimated Cost**: Approximate cost based on token usage
<Frame>![Execution Summary](/images/enterprise/trace-summary.png)</Frame> <Frame>
![Execution Summary](/images/enterprise/trace-summary.png)
</Frame>
### 2. Tasks & Agents ### 2. Tasks & Agents
@@ -60,25 +64,33 @@ This section shows all tasks and agents that were part of the crew execution:
- Status (completed/failed) - Status (completed/failed)
- Individual execution time of the task - Individual execution time of the task
<Frame>![Task List](/images/enterprise/trace-tasks.png)</Frame> <Frame>
![Task List](/images/enterprise/trace-tasks.png)
</Frame>
### 3. Final Output ### 3. Final Output
Displays the final result produced by the crew after all tasks are completed. Displays the final result produced by the crew after all tasks are completed.
<Frame>![Final Output](/images/enterprise/final-output.png)</Frame> <Frame>
![Final Output](/images/enterprise/final-output.png)
</Frame>
### 4. Execution Timeline ### 4. Execution Timeline
A visual representation of when each task started and ended, helping you identify bottlenecks or parallel execution patterns. A visual representation of when each task started and ended, helping you identify bottlenecks or parallel execution patterns.
<Frame>![Execution Timeline](/images/enterprise/trace-timeline.png)</Frame> <Frame>
![Execution Timeline](/images/enterprise/trace-timeline.png)
</Frame>
### 5. Detailed Task View ### 5. Detailed Task View
When you click on a specific task in the timeline or task list, you'll see: When you click on a specific task in the timeline or task list, you'll see:
<Frame>![Detailed Task View](/images/enterprise/trace-detailed-task.png)</Frame> <Frame>
![Detailed Task View](/images/enterprise/trace-detailed-task.png)
</Frame>
- **Task Key**: Unique identifier for the task - **Task Key**: Unique identifier for the task
- **Task ID**: Technical identifier in the system - **Task ID**: Technical identifier in the system
@@ -92,6 +104,7 @@ When you click on a specific task in the timeline or task list, you'll see:
- **Input**: Any input provided to this task from previous tasks - **Input**: Any input provided to this task from previous tasks
- **Output**: The actual result produced by the agent - **Output**: The actual result produced by the agent
## Using Traces for Debugging ## Using Traces for Debugging
Traces are invaluable for troubleshooting issues with your crews: Traces are invaluable for troubleshooting issues with your crews:
@@ -108,7 +121,6 @@ Traces are invaluable for troubleshooting issues with your crews:
<Frame> <Frame>
![Failure Points](/images/enterprise/failure.png) ![Failure Points](/images/enterprise/failure.png)
</Frame> </Frame>
</Step> </Step>
<Step title="Optimize Performance"> <Step title="Optimize Performance">
@@ -118,7 +130,6 @@ Traces are invaluable for troubleshooting issues with your crews:
- Excessive token usage - Excessive token usage
- Redundant tool operations - Redundant tool operations
- Unnecessary API calls - Unnecessary API calls
</Step> </Step>
<Step title="Improve Cost Efficiency"> <Step title="Improve Cost Efficiency">
@@ -128,7 +139,6 @@ Traces are invaluable for troubleshooting issues with your crews:
- Refine prompts to be more concise - Refine prompts to be more concise
- Cache frequently accessed information - Cache frequently accessed information
- Structure tasks to minimize redundant operations - Structure tasks to minimize redundant operations
</Step> </Step>
</Steps> </Steps>
@@ -143,6 +153,5 @@ CrewAI batches trace uploads to reduce overhead on high-volume runs:
This yields more stable tracing under load while preserving detailed task/agent telemetry. This yields more stable tracing under load while preserving detailed task/agent telemetry.
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with trace analysis or any other Contact our support team for assistance with trace analysis or any other CrewAI AMP features.
CrewAI AMP features.
</Card> </Card>

View File

@@ -16,7 +16,7 @@ When using the Kickoff API, include a `webhooks` object to your request, for exa
```json ```json
{ {
"inputs": { "foo": "bar" }, "inputs": {"foo": "bar"},
"webhooks": { "webhooks": {
"events": ["crew_kickoff_started", "llm_call_started"], "events": ["crew_kickoff_started", "llm_call_started"],
"url": "https://your.endpoint/webhook", "url": "https://your.endpoint/webhook",
@@ -46,8 +46,8 @@ Each webhook sends a list of events:
"data": { "data": {
"model": "gpt-4", "model": "gpt-4",
"messages": [ "messages": [
{ "role": "system", "content": "You are an assistant." }, {"role": "system", "content": "You are an assistant."},
{ "role": "user", "content": "Summarize this article." } {"role": "user", "content": "Summarize this article."}
] ]
} }
} }
@@ -55,7 +55,7 @@ Each webhook sends a list of events:
} }
``` ```
The `data` object structure varies by event type. Refer to the [event list](https://github.com/crewAIInc/crewAI/tree/main/lib/crewai/src/crewai/events/types) on GitHub. The `data` object structure varies by event type. Refer to the [event list](https://github.com/crewAIInc/crewAI/tree/main/src/crewai/utilities/events) on GitHub.
As requests are sent over HTTP, the order of events can't be guaranteed. If you need ordering, use the `timestamp` field. As requests are sent over HTTP, the order of events can't be guaranteed. If you need ordering, use the `timestamp` field.
@@ -65,109 +65,104 @@ CrewAI supports both system events and custom events in Enterprise Event Streami
### Flow Events: ### Flow Events:
- `flow_created` - `flow_created`
- `flow_started` - `flow_started`
- `flow_finished` - `flow_finished`
- `flow_plot` - `flow_plot`
- `method_execution_started` - `method_execution_started`
- `method_execution_finished` - `method_execution_finished`
- `method_execution_failed` - `method_execution_failed`
### Agent Events: ### Agent Events:
- `agent_execution_started` - `agent_execution_started`
- `agent_execution_completed` - `agent_execution_completed`
- `agent_execution_error` - `agent_execution_error`
- `lite_agent_execution_started` - `lite_agent_execution_started`
- `lite_agent_execution_completed` - `lite_agent_execution_completed`
- `lite_agent_execution_error` - `lite_agent_execution_error`
- `agent_logs_started` - `agent_logs_started`
- `agent_logs_execution` - `agent_logs_execution`
- `agent_evaluation_started` - `agent_evaluation_started`
- `agent_evaluation_completed` - `agent_evaluation_completed`
- `agent_evaluation_failed` - `agent_evaluation_failed`
### Crew Events: ### Crew Events:
- `crew_kickoff_started` - `crew_kickoff_started`
- `crew_kickoff_completed` - `crew_kickoff_completed`
- `crew_kickoff_failed` - `crew_kickoff_failed`
- `crew_train_started` - `crew_train_started`
- `crew_train_completed` - `crew_train_completed`
- `crew_train_failed` - `crew_train_failed`
- `crew_test_started` - `crew_test_started`
- `crew_test_completed` - `crew_test_completed`
- `crew_test_failed` - `crew_test_failed`
- `crew_test_result` - `crew_test_result`
### Task Events: ### Task Events:
- `task_started` - `task_started`
- `task_completed` - `task_completed`
- `task_failed` - `task_failed`
- `task_evaluation` - `task_evaluation`
### Tool Usage Events: ### Tool Usage Events:
- `tool_usage_started` - `tool_usage_started`
- `tool_usage_finished` - `tool_usage_finished`
- `tool_usage_error` - `tool_usage_error`
- `tool_validate_input_error` - `tool_validate_input_error`
- `tool_selection_error` - `tool_selection_error`
- `tool_execution_error` - `tool_execution_error`
### LLM Events: ### LLM Events:
- `llm_call_started` - `llm_call_started`
- `llm_call_completed` - `llm_call_completed`
- `llm_call_failed` - `llm_call_failed`
- `llm_stream_chunk` - `llm_stream_chunk`
### LLM Guardrail Events: ### LLM Guardrail Events:
- `llm_guardrail_started` - `llm_guardrail_started`
- `llm_guardrail_completed` - `llm_guardrail_completed`
### Memory Events: ### Memory Events:
- `memory_query_started` - `memory_query_started`
- `memory_query_completed` - `memory_query_completed`
- `memory_query_failed` - `memory_query_failed`
- `memory_save_started` - `memory_save_started`
- `memory_save_completed` - `memory_save_completed`
- `memory_save_failed` - `memory_save_failed`
- `memory_retrieval_started` - `memory_retrieval_started`
- `memory_retrieval_completed` - `memory_retrieval_completed`
### Knowledge Events: ### Knowledge Events:
- `knowledge_search_query_started` - `knowledge_search_query_started`
- `knowledge_search_query_completed` - `knowledge_search_query_completed`
- `knowledge_search_query_failed` - `knowledge_search_query_failed`
- `knowledge_query_started` - `knowledge_query_started`
- `knowledge_query_completed` - `knowledge_query_completed`
- `knowledge_query_failed` - `knowledge_query_failed`
### Reasoning Events: ### Reasoning Events:
- `agent_reasoning_started` - `agent_reasoning_started`
- `agent_reasoning_completed` - `agent_reasoning_completed`
- `agent_reasoning_failed` - `agent_reasoning_failed`
Event names match the internal event bus. See GitHub for the full list of events. Event names match the internal event bus. See GitHub for the full list of events.
You can emit your own custom events, and they will be delivered through the webhook stream alongside system events. You can emit your own custom events, and they will be delivered through the webhook stream alongside system events.
<CardGroup> <CardGroup>
<Card <Card title="GitHub" icon="github" href="https://github.com/crewAIInc/crewAI/tree/main/src/crewai/utilities/events">
title="GitHub" Full list of events
icon="github" </Card>
href="https://github.com/crewAIInc/crewAI/tree/main/src/crewai/utilities/events" <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
> Contact our support team for assistance with webhook integration or troubleshooting.
Full list of events </Card>
</Card>
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with webhook integration or
troubleshooting.
</Card>
</CardGroup> </CardGroup>

View File

@@ -20,61 +20,37 @@ Deep-dive guides walk through setup and sample workflows for each integration:
<a href="/en/enterprise/guides/gmail-trigger">Enable crews when emails arrive or threads update.</a> <a href="/en/enterprise/guides/gmail-trigger">Enable crews when emails arrive or threads update.</a>
</Card> </Card>
{" "} <Card title="Google Calendar Trigger" icon="calendar-days">
<Card title="Google Calendar Trigger" icon="calendar-days"> <a href="/en/enterprise/guides/google-calendar-trigger">React to calendar events as they are created, updated, or cancelled.</a>
<a href="/en/enterprise/guides/google-calendar-trigger"> </Card>
React to calendar events as they are created, updated, or cancelled.
</a>
</Card>
{" "} <Card title="Google Drive Trigger" icon="folder-open">
<Card title="Google Drive Trigger" icon="folder-open"> <a href="/en/enterprise/guides/google-drive-trigger">Handle Drive file uploads, edits, and deletions.</a>
<a href="/en/enterprise/guides/google-drive-trigger"> </Card>
Handle Drive file uploads, edits, and deletions.
</a>
</Card>
{" "} <Card title="Outlook Trigger" icon="envelope-open">
<Card title="Outlook Trigger" icon="envelope-open"> <a href="/en/enterprise/guides/outlook-trigger">Automate responses to new Outlook messages and calendar updates.</a>
<a href="/en/enterprise/guides/outlook-trigger"> </Card>
Automate responses to new Outlook messages and calendar updates.
</a>
</Card>
{" "} <Card title="OneDrive Trigger" icon="cloud">
<Card title="OneDrive Trigger" icon="cloud"> <a href="/en/enterprise/guides/onedrive-trigger">Audit file activity and sharing changes in OneDrive.</a>
<a href="/en/enterprise/guides/onedrive-trigger"> </Card>
Audit file activity and sharing changes in OneDrive.
</a>
</Card>
{" "} <Card title="Microsoft Teams Trigger" icon="comments">
<Card title="Microsoft Teams Trigger" icon="comments"> <a href="/en/enterprise/guides/microsoft-teams-trigger">Kick off workflows when new Teams chats start.</a>
<a href="/en/enterprise/guides/microsoft-teams-trigger"> </Card>
Kick off workflows when new Teams chats start.
</a>
</Card>
{" "} <Card title="HubSpot Trigger" icon="hubspot">
<Card title="HubSpot Trigger" icon="hubspot"> <a href="/en/enterprise/guides/hubspot-trigger">Launch automations from HubSpot workflows and lifecycle events.</a>
<a href="/en/enterprise/guides/hubspot-trigger"> </Card>
Launch automations from HubSpot workflows and lifecycle events.
</a>
</Card>
{" "} <Card title="Salesforce Trigger" icon="salesforce">
<Card title="Salesforce Trigger" icon="salesforce"> <a href="/en/enterprise/guides/salesforce-trigger">Connect Salesforce processes to CrewAI for CRM automation.</a>
<a href="/en/enterprise/guides/salesforce-trigger"> </Card>
Connect Salesforce processes to CrewAI for CRM automation.
</a>
</Card>
{" "} <Card title="Slack Trigger" icon="slack">
<Card title="Slack Trigger" icon="slack"> <a href="/en/enterprise/guides/slack-trigger">Start crews directly from Slack slash commands.</a>
<a href="/en/enterprise/guides/slack-trigger"> </Card>
Start crews directly from Slack slash commands.
</a>
</Card>
<Card title="Zapier Trigger" icon="bolt"> <Card title="Zapier Trigger" icon="bolt">
<a href="/en/enterprise/guides/zapier-trigger">Bridge CrewAI with thousands of Zapier-supported apps.</a> <a href="/en/enterprise/guides/zapier-trigger">Bridge CrewAI with thousands of Zapier-supported apps.</a>
@@ -100,10 +76,7 @@ To access and manage your automation triggers:
2. Click on the **Triggers** tab to view all available trigger integrations 2. Click on the **Triggers** tab to view all available trigger integrations
<Frame caption="Example of available automation triggers for a Gmail deployment"> <Frame caption="Example of available automation triggers for a Gmail deployment">
<img <img src="/images/enterprise/list-available-triggers.png" alt="List of available automation triggers" />
src="/images/enterprise/list-available-triggers.png"
alt="List of available automation triggers"
/>
</Frame> </Frame>
This view shows all the trigger integrations available for your deployment, along with their current connection status. This view shows all the trigger integrations available for your deployment, along with their current connection status.
@@ -113,10 +86,7 @@ This view shows all the trigger integrations available for your deployment, alon
Each trigger can be easily enabled or disabled using the toggle switch: Each trigger can be easily enabled or disabled using the toggle switch:
<Frame caption="Enable or disable triggers with toggle"> <Frame caption="Enable or disable triggers with toggle">
<img <img src="/images/enterprise/trigger-selected.png" alt="Enable or disable triggers with toggle" />
src="/images/enterprise/trigger-selected.png"
alt="Enable or disable triggers with toggle"
/>
</Frame> </Frame>
- **Enabled (blue toggle)**: The trigger is active and will automatically execute your deployment when the specified events occur - **Enabled (blue toggle)**: The trigger is active and will automatically execute your deployment when the specified events occur
@@ -129,10 +99,7 @@ Simply click the toggle to change the trigger state. Changes take effect immedia
Track the performance and history of your triggered executions: Track the performance and history of your triggered executions:
<Frame caption="List of executions triggered by automation"> <Frame caption="List of executions triggered by automation">
<img <img src="/images/enterprise/list-executions.png" alt="List of executions triggered by automation" />
src="/images/enterprise/list-executions.png"
alt="List of executions triggered by automation"
/>
</Frame> </Frame>
## Building Trigger-Driven Automations ## Building Trigger-Driven Automations
@@ -150,51 +117,27 @@ Before wiring a trigger into production, make sure you:
- Decide whether to pass trigger context automatically using `allow_crewai_trigger_context` - Decide whether to pass trigger context automatically using `allow_crewai_trigger_context`
- Set up monitoring—webhook logs, CrewAI execution history, and optional external alerting - Set up monitoring—webhook logs, CrewAI execution history, and optional external alerting
### Testing Triggers Locally with CLI ### Payload & Crew Examples Repository
The CrewAI CLI provides powerful commands to help you develop and test trigger-driven automations without deploying to production. We maintain a comprehensive repository with end-to-end trigger examples to help you build and test your automations:
#### List Available Triggers This repository contains:
View all available triggers for your connected integrations: - **Realistic payload samples** for every supported trigger integration
- **Ready-to-run crew implementations** that parse each payload and turn it into a business workflow
- **Multiple scenarios per integration** (e.g., new events, updates, deletions) so you can match the shape of your data
```bash | Integration | When it fires | Payload Samples | Crew Examples |
crewai triggers list | :-- | :-- | :-- | :-- |
``` | Gmail | New messages, thread updates | [New alerts, thread updates](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/gmail) | [`new-email-crew.py`, `gmail-alert-crew.py`](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/gmail) |
| Google Calendar | Event created / updated / started / ended / cancelled | [Event lifecycle payloads](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/google_calendar) | [`calendar-event-crew.py`, `calendar-meeting-crew.py`, `calendar-working-location-crew.py`](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/google_calendar) |
| Google Drive | File created / updated / deleted | [File lifecycle payloads](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/google_drive) | [`drive-file-crew.py`, `drive-file-deletion-crew.py`](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/google_drive) |
| Outlook | New email, calendar event removed | [Outlook payloads](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/outlook) | [`outlook-message-crew.py`, `outlook-event-removal-crew.py`](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/outlook) |
| OneDrive | File operations (create, update, share, delete) | [OneDrive payloads](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/onedrive) | [`onedrive-file-crew.py`](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/onedrive) |
| HubSpot | Record created / updated (contacts, companies, deals) | [HubSpot payloads](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/hubspot) | [`hubspot-company-crew.py`, `hubspot-contact-crew.py`, `hubspot-record-crew.py`](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/hubspot) |
| Microsoft Teams | Chat thread created | [Teams chat payload](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/microsoft-teams) | [`teams-chat-created-crew.py`](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/microsoft-teams) |
This command displays all triggers available based on your connected integrations, showing: Use these samples to understand payload shape, copy the matching crew, and then replace the test payload with your live trigger data.
- Integration name and connection status
- Available trigger types
- Trigger names and descriptions
#### Simulate Trigger Execution
Test your crew with realistic trigger payloads before deployment:
```bash
crewai triggers run <trigger_name>
```
For example:
```bash
crewai triggers run microsoft_onedrive/file_changed
```
This command:
- Executes your crew locally
- Passes a complete, realistic trigger payload
- Simulates exactly how your crew will be called in production
<Warning>
**Important Development Notes:**
- Use `crewai triggers run <trigger>` to simulate trigger execution during development
- Using `crewai run` will NOT simulate trigger calls and won't pass the trigger payload
- After deployment, your crew will be executed with the actual trigger payload
- If your crew expects parameters that aren't in the trigger payload, execution may fail
</Warning>
### Triggers with Crew ### Triggers with Crew
@@ -227,12 +170,10 @@ class MyAutomatedCrew:
The crew will automatically receive and can access the trigger payload through the standard CrewAI context mechanisms. The crew will automatically receive and can access the trigger payload through the standard CrewAI context mechanisms.
<Note> <Note>
Crew and Flow inputs can include `crewai_trigger_payload`. CrewAI Crew and Flow inputs can include `crewai_trigger_payload`. CrewAI automatically injects this payload:
automatically injects this payload: - Tasks: appended to the first task's - Tasks: appended to the first task's description by default ("Trigger Payload: {crewai_trigger_payload}")
description by default ("Trigger Payload: {crewai_trigger_payload}") - Control - Control via `allow_crewai_trigger_context`: set `True` to always inject, `False` to never inject
via `allow_crewai_trigger_context`: set `True` to always inject, `False` to - Flows: any `@start()` method that accepts a `crewai_trigger_payload` parameter will receive it
never inject - Flows: any `@start()` method that accepts a
`crewai_trigger_payload` parameter will receive it
</Note> </Note>
### Integration with Flows ### Integration with Flows
@@ -300,23 +241,15 @@ def delegate_to_crew(self, crewai_trigger_payload: dict = None):
## Troubleshooting ## Troubleshooting
**Trigger not firing:** **Trigger not firing:**
- Verify the trigger is enabled
- Verify the trigger is enabled in your deployment's Triggers tab - Check integration connection status
- Check integration connection status under Tools & Integrations
- Ensure all required environment variables are properly configured
**Execution failures:** **Execution failures:**
- Check the execution logs for error details - Check the execution logs for error details
- Use `crewai triggers run <trigger_name>` to test locally and see the exact payload structure - If you are developing, make sure the inputs include the `crewai_trigger_payload` parameter with the correct payload
- Verify your crew can handle the `crewai_trigger_payload` parameter
- Ensure your crew doesn't expect parameters that aren't included in the trigger payload
**Development issues:**
- Always test with `crewai triggers run <trigger>` before deploying to see the complete payload
- Remember that `crewai run` does NOT simulate trigger calls—use `crewai triggers run` instead
- Use `crewai triggers list` to verify which triggers are available for your connected integrations
- After deployment, your crew will receive the actual trigger payload, so test thoroughly locally first
Automation triggers transform your CrewAI deployments into responsive, event-driven systems that can seamlessly integrate with your existing business processes and tools. Automation triggers transform your CrewAI deployments into responsive, event-driven systems that can seamlessly integrate with your existing business processes and tools.
<Card title="CrewAI AMP Trigger Examples" href="https://github.com/crewAIInc/crewai-enterprise-trigger-examples" icon="github">
Check them out on GitHub!
</Card>

View File

@@ -37,7 +37,6 @@ This guide walks you through connecting Azure OpenAI with Crew Studio for seamle
- Navigate to `Resource Management > Networking`. - Navigate to `Resource Management > Networking`.
- Ensure that `Allow access from all networks` is enabled. If this setting is restricted, CrewAI may be blocked from accessing your Azure OpenAI endpoint. - Ensure that `Allow access from all networks` is enabled. If this setting is restricted, CrewAI may be blocked from accessing your Azure OpenAI endpoint.
</Step> </Step>
</Steps> </Steps>
## Verification ## Verification
@@ -47,7 +46,6 @@ You're all set! Crew Studio will now use your Azure OpenAI connection. Test the
## Troubleshooting ## Troubleshooting
If you encounter issues: If you encounter issues:
- Verify the Target URI format matches the expected pattern - Verify the Target URI format matches the expected pattern
- Check that the API key is correct and has proper permissions - Check that the API key is correct and has proper permissions
- Ensure network access is configured to allow CrewAI connections - Ensure network access is configured to allow CrewAI connections

View File

@@ -22,27 +22,21 @@ mode: "wide"
### Installation and Setup ### Installation and Setup
<Card <Card title="Follow Standard Installation" icon="wrench" href="/en/installation">
title="Follow Standard Installation" Follow our standard installation guide to set up CrewAI CLI and create your first project.
icon="wrench"
href="/en/installation"
>
Follow our standard installation guide to set up CrewAI CLI and create your
first project.
</Card> </Card>
### Building Your Crew ### Building Your Crew
<Card title="Quickstart Tutorial" icon="rocket" href="/en/quickstart"> <Card title="Quickstart Tutorial" icon="rocket" href="/en/quickstart">
Follow our quickstart guide to create your first agent crew using YAML Follow our quickstart guide to create your first agent crew using YAML configuration.
configuration.
</Card> </Card>
## Support and Resources ## Support and Resources
For Enterprise-specific support or questions, contact our dedicated support team at [support@crewai.com](mailto:support@crewai.com). For Enterprise-specific support or questions, contact our dedicated support team at [support@crewai.com](mailto:support@crewai.com).
<Card title="Schedule a Demo" icon="calendar" href="mailto:support@crewai.com"> <Card title="Schedule a Demo" icon="calendar" href="mailto:support@crewai.com">
Book time with our team to learn more about Enterprise features and how they Book time with our team to learn more about Enterprise features and how they can benefit your organization.
can benefit your organization.
</Card> </Card>

View File

@@ -14,17 +14,22 @@ CrewAI AMP provides a powerful way to capture telemetry logs from your deploymen
Your organization should have ENTERPRISE OTEL SETUP enabled Your organization should have ENTERPRISE OTEL SETUP enabled
</Card> </Card>
<Card title="OTEL collector setup" icon="server"> <Card title="OTEL collector setup" icon="server">
Your organization should have an OTEL collector setup or a provider like Your organization should have an OTEL collector setup or a provider like Datadog log intake setup
Datadog log intake setup
</Card> </Card>
</CardGroup> </CardGroup>
## How to capture telemetry logs ## How to capture telemetry logs
1. Go to settings/organization tab 1. Go to settings/organization tab
2. Configure your OTEL collector setup 2. Configure your OTEL collector setup
3. Save 3. Save
Example to setup OTEL log collection capture to Datadog. Example to setup OTEL log collection capture to Datadog.
<Frame>![Capture Telemetry Logs](/images/crewai-otel-export.png)</Frame>
<Frame>
![Capture Telemetry Logs](/images/crewai-otel-export.png)
</Frame>

View File

@@ -6,21 +6,17 @@ mode: "wide"
--- ---
<Note> <Note>
After creating a crew locally or through Crew Studio, the next step is After creating a crew locally or through Crew Studio, the next step is deploying it to the CrewAI AMP platform. This guide covers multiple deployment methods to help you choose the best approach for your workflow.
deploying it to the CrewAI AMP platform. This guide covers multiple deployment
methods to help you choose the best approach for your workflow.
</Note> </Note>
## Prerequisites ## Prerequisites
<CardGroup cols={2}> <CardGroup cols={2}>
<Card title="Crew Ready for Deployment" icon="users"> <Card title="Crew Ready for Deployment" icon="users">
You should have a working crew either built locally or created through Crew You should have a working crew either built locally or created through Crew Studio
Studio
</Card> </Card>
<Card title="GitHub Repository" icon="github"> <Card title="GitHub Repository" icon="github">
Your crew code should be in a GitHub repository (for GitHub integration Your crew code should be in a GitHub repository (for GitHub integration method)
method)
</Card> </Card>
</CardGroup> </CardGroup>
@@ -109,22 +105,22 @@ The CLI provides the fastest way to deploy locally developed crews to the Enterp
The CrewAI CLI offers several commands to manage your deployments: The CrewAI CLI offers several commands to manage your deployments:
```bash ```bash
# List all your deployments # List all your deployments
crewai deploy list crewai deploy list
# Get the status of your deployment # Get the status of your deployment
crewai deploy status crewai deploy status
# View the logs of your deployment # View the logs of your deployment
crewai deploy logs crewai deploy logs
# Push updates after code changes # Push updates after code changes
crewai deploy push crewai deploy push
# Remove a deployment # Remove a deployment
crewai deploy remove <deployment_id> crewai deploy remove <deployment_id>
``` ```
## Option 2: Deploy Directly via Web Interface ## Option 2: Deploy Directly via Web Interface
@@ -134,7 +130,7 @@ You can also deploy your crews directly through the CrewAI AMP web interface by
<Step title="Pushing to GitHub"> <Step title="Pushing to GitHub">
You need to push your crew to a GitHub repository. If you haven't created a crew yet, you can [follow this tutorial](/en/quickstart). You need to push your crew to a GitHub repository. If you haven't created a crew yet, you can [follow this tutorial](/en/quickstart).
</Step> </Step>
@@ -191,102 +187,10 @@ You need to push your crew to a GitHub repository. If you haven't created a crew
</Steps> </Steps>
## Option 3: Redeploy Using API (CI/CD Integration)
For automated deployments in CI/CD pipelines, you can use the CrewAI API to trigger redeployments of existing crews. This is particularly useful for GitHub Actions, Jenkins, or other automation workflows.
<Steps>
<Step title="Get Your Personal Access Token">
Navigate to your CrewAI AMP account settings to generate an API token:
1. Go to [app.crewai.com](https://app.crewai.com)
2. Click on **Settings** → **Account** → **Personal Access Token**
3. Generate a new token and copy it securely
4. Store this token as a secret in your CI/CD system
</Step>
<Step title="Find Your Automation UUID">
Locate the unique identifier for your deployed crew:
1. Go to **Automations** in your CrewAI AMP dashboard
2. Select your existing automation/crew
3. Click on **Additional Details**
4. Copy the **UUID** - this identifies your specific crew deployment
</Step>
<Step title="Trigger Redeployment via API">
Use the Deploy API endpoint to trigger a redeployment:
```bash
curl -i -X POST \
-H "Authorization: Bearer YOUR_PERSONAL_ACCESS_TOKEN" \
https://app.crewai.com/crewai_plus/api/v1/crews/YOUR-AUTOMATION-UUID/deploy
# HTTP/2 200
# content-type: application/json
#
# {
# "uuid": "your-automation-uuid",
# "status": "Deploy Enqueued",
# "public_url": "https://your-crew-deployment.crewai.com",
# "token": "your-bearer-token"
# }
```
<Info>
If your automation was first created connected to Git, the API will automatically pull the latest changes from your repository before redeploying.
</Info>
</Step>
<Step title="GitHub Actions Integration Example">
Here's a GitHub Actions workflow with more complex deployment triggers:
```yaml
name: Deploy CrewAI Automation
on:
push:
branches: [ main ]
pull_request:
types: [ labeled ]
release:
types: [ published ]
jobs:
deploy:
runs-on: ubuntu-latest
if: |
(github.event_name == 'push' && github.ref == 'refs/heads/main') ||
(github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'deploy')) ||
(github.event_name == 'release')
steps:
- name: Trigger CrewAI Redeployment
run: |
curl -X POST \
-H "Authorization: Bearer ${{ secrets.CREWAI_PAT }}" \
https://app.crewai.com/crewai_plus/api/v1/crews/${{ secrets.CREWAI_AUTOMATION_UUID }}/deploy
```
<Tip>
Add `CREWAI_PAT` and `CREWAI_AUTOMATION_UUID` as repository secrets. For PR deployments, add a "deploy" label to trigger the workflow.
</Tip>
</Step>
</Steps>
## ⚠️ Environment Variable Security Requirements ## ⚠️ Environment Variable Security Requirements
<Warning> <Warning>
**Important**: CrewAI AMP has security restrictions on environment variable **Important**: CrewAI AMP has security restrictions on environment variable names that can cause deployment failures if not followed.
names that can cause deployment failures if not followed.
</Warning> </Warning>
### Blocked Environment Variable Patterns ### Blocked Environment Variable Patterns
@@ -294,14 +198,12 @@ For automated deployments in CI/CD pipelines, you can use the CrewAI API to trig
For security reasons, the following environment variable naming patterns are **automatically filtered** and will cause deployment issues: For security reasons, the following environment variable naming patterns are **automatically filtered** and will cause deployment issues:
**Blocked Patterns:** **Blocked Patterns:**
- Variables ending with `_TOKEN` (e.g., `MY_API_TOKEN`) - Variables ending with `_TOKEN` (e.g., `MY_API_TOKEN`)
- Variables ending with `_PASSWORD` (e.g., `DB_PASSWORD`) - Variables ending with `_PASSWORD` (e.g., `DB_PASSWORD`)
- Variables ending with `_SECRET` (e.g., `API_SECRET`) - Variables ending with `_SECRET` (e.g., `API_SECRET`)
- Variables ending with `_KEY` in certain contexts - Variables ending with `_KEY` in certain contexts
**Specific Blocked Variables:** **Specific Blocked Variables:**
- `GITHUB_USER`, `GITHUB_TOKEN` - `GITHUB_USER`, `GITHUB_TOKEN`
- `AWS_REGION`, `AWS_DEFAULT_REGION` - `AWS_REGION`, `AWS_DEFAULT_REGION`
- Various internal CrewAI system variables - Various internal CrewAI system variables
@@ -309,7 +211,6 @@ For security reasons, the following environment variable naming patterns are **a
### Allowed Exceptions ### Allowed Exceptions
Some variables are explicitly allowed despite matching blocked patterns: Some variables are explicitly allowed despite matching blocked patterns:
- `AZURE_AD_TOKEN` - `AZURE_AD_TOKEN`
- `AZURE_OPENAI_AD_TOKEN` - `AZURE_OPENAI_AD_TOKEN`
- `ENTERPRISE_ACTION_TOKEN` - `ENTERPRISE_ACTION_TOKEN`
@@ -339,8 +240,7 @@ API_CONFIG=secret123
4. **Document changes**: Keep track of renamed variables for your team 4. **Document changes**: Keep track of renamed variables for your team
<Tip> <Tip>
If you encounter deployment failures with cryptic environment variable errors, If you encounter deployment failures with cryptic environment variable errors, check your variable names against these patterns first.
check your variable names against these patterns first.
</Tip> </Tip>
### Interact with Your Deployed Crew ### Interact with Your Deployed Crew
@@ -348,7 +248,6 @@ API_CONFIG=secret123
Once deployment is complete, you can access your crew through: Once deployment is complete, you can access your crew through:
1. **REST API**: The platform generates a unique HTTPS endpoint with these key routes: 1. **REST API**: The platform generates a unique HTTPS endpoint with these key routes:
- `/inputs`: Lists the required input parameters - `/inputs`: Lists the required input parameters
- `/kickoff`: Initiates an execution with provided inputs - `/kickoff`: Initiates an execution with provided inputs
- `/status/{kickoff_id}`: Checks the execution status - `/status/{kickoff_id}`: Checks the execution status
@@ -388,6 +287,5 @@ The Enterprise platform also offers:
- **Crew Studio**: Build crews through a chat interface without writing code - **Crew Studio**: Build crews through a chat interface without writing code
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with deployment issues or questions Contact our support team for assistance with deployment issues or questions about the Enterprise platform.
about the Enterprise platform.
</Card> </Card>

View File

@@ -6,8 +6,7 @@ mode: "wide"
--- ---
<Tip> <Tip>
Crew Studio is a powerful **no-code/low-code** tool that allows you to quickly Crew Studio is a powerful **no-code/low-code** tool that allows you to quickly scaffold or build Crews through a conversational interface.
scaffold or build Crews through a conversational interface.
</Tip> </Tip>
## What is Crew Studio? ## What is Crew Studio?
@@ -53,7 +52,6 @@ Before you can start using Crew Studio, you need to configure your LLM connectio
<Frame> <Frame>
![LLM Connection Configuration](/images/enterprise/llm-connection-config.png) ![LLM Connection Configuration](/images/enterprise/llm-connection-config.png)
</Frame> </Frame>
</Step> </Step>
<Step title="Verify Connection Added"> <Step title="Verify Connection Added">
@@ -62,7 +60,6 @@ Before you can start using Crew Studio, you need to configure your LLM connectio
<Frame> <Frame>
![Connection Added](/images/enterprise/connection-added.png) ![Connection Added](/images/enterprise/connection-added.png)
</Frame> </Frame>
</Step> </Step>
<Step title="Configure LLM Defaults"> <Step title="Configure LLM Defaults">
@@ -76,7 +73,6 @@ Before you can start using Crew Studio, you need to configure your LLM connectio
<Frame> <Frame>
![LLM Defaults Configuration](/images/enterprise/llm-defaults.png) ![LLM Defaults Configuration](/images/enterprise/llm-defaults.png)
</Frame> </Frame>
</Step> </Step>
</Steps> </Steps>
@@ -97,7 +93,6 @@ Now that you've configured your LLM connection and default settings, you're read
``` ```
The Crew Assistant will ask clarifying questions to better understand your requirements. The Crew Assistant will ask clarifying questions to better understand your requirements.
</Step> </Step>
<Step title="Review Generated Crew"> <Step title="Review Generated Crew">
@@ -109,7 +104,6 @@ Now that you've configured your LLM connection and default settings, you're read
- Tools to be used - Tools to be used
This is your opportunity to refine the configuration before proceeding. This is your opportunity to refine the configuration before proceeding.
</Step> </Step>
<Step title="Deploy or Download"> <Step title="Deploy or Download">
@@ -118,7 +112,6 @@ Now that you've configured your LLM connection and default settings, you're read
- Download the generated code for local customization - Download the generated code for local customization
- Deploy the crew directly to the CrewAI AMP platform - Deploy the crew directly to the CrewAI AMP platform
- Modify the configuration and regenerate the crew - Modify the configuration and regenerate the crew
</Step> </Step>
<Step title="Test Your Crew"> <Step title="Test Your Crew">
@@ -127,9 +120,7 @@ Now that you've configured your LLM connection and default settings, you're read
</Steps> </Steps>
<Tip> <Tip>
For best results, provide clear, detailed descriptions of what you want your For best results, provide clear, detailed descriptions of what you want your crew to accomplish. Include specific inputs and expected outputs in your description.
crew to accomplish. Include specific inputs and expected outputs in your
description.
</Tip> </Tip>
## Example Workflow ## Example Workflow
@@ -143,14 +134,11 @@ Here's a typical workflow for creating a crew with Crew Studio:
```md ```md
I need a crew that can analyze financial news and provide investment recommendations I need a crew that can analyze financial news and provide investment recommendations
``` ```
</Step> </Step>
{" "} <Step title="Answer Questions">
<Step title="Answer Questions"> Respond to clarifying questions from the Crew Assistant to refine your requirements.
Respond to clarifying questions from the Crew Assistant to refine your </Step>
requirements.
</Step>
<Step title="Review the Plan"> <Step title="Review the Plan">
Review the generated crew plan, which might include: Review the generated crew plan, which might include:
@@ -158,18 +146,15 @@ Here's a typical workflow for creating a crew with Crew Studio:
- A Research Agent to gather financial news - A Research Agent to gather financial news
- An Analysis Agent to interpret the data - An Analysis Agent to interpret the data
- A Recommendations Agent to provide investment advice - A Recommendations Agent to provide investment advice
</Step> </Step>
{" "} <Step title="Approve or Modify">
<Step title="Approve or Modify"> Approve the plan or request changes if necessary.
Approve the plan or request changes if necessary. </Step>
</Step>
{" "} <Step title="Download or Deploy">
<Step title="Download or Deploy"> Download the code for customization or deploy directly to the platform.
Download the code for customization or deploy directly to the platform. </Step>
</Step>
<Step title="Test and Refine"> <Step title="Test and Refine">
Test your crew with sample inputs and refine as needed. Test your crew with sample inputs and refine as needed.
@@ -177,6 +162,5 @@ Here's a typical workflow for creating a crew with Crew Studio:
</Steps> </Steps>
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Crew Studio or any other CrewAI Contact our support team for assistance with Crew Studio or any other CrewAI AMP features.
AMP features.
</Card> </Card>

View File

@@ -10,8 +10,7 @@ mode: "wide"
Use the Gmail Trigger to kick off your deployed crews when Gmail events happen in connected accounts, such as receiving a new email or messages matching a label/filter. Use the Gmail Trigger to kick off your deployed crews when Gmail events happen in connected accounts, such as receiving a new email or messages matching a label/filter.
<Tip> <Tip>
Make sure Gmail is connected in Tools & Integrations and the trigger is Make sure Gmail is connected in Tools & Integrations and the trigger is enabled for your deployment.
enabled for your deployment.
</Tip> </Tip>
## Enabling the Gmail Trigger ## Enabling the Gmail Trigger
@@ -21,10 +20,7 @@ Use the Gmail Trigger to kick off your deployed crews when Gmail events happen i
3. Locate **Gmail** and switch the toggle to enable 3. Locate **Gmail** and switch the toggle to enable
<Frame> <Frame>
<img <img src="/images/enterprise/trigger-selected.png" alt="Enable or disable triggers with toggle" />
src="/images/enterprise/trigger-selected.png"
alt="Enable or disable triggers with toggle"
/>
</Frame> </Frame>
## Example: Process new emails ## Example: Process new emails
@@ -55,43 +51,35 @@ class GmailProcessingCrew:
) )
``` ```
The Gmail payload will be available via the standard context mechanisms. The Gmail payload will be available via the standard context mechanisms. See the payload samples repository for structure and fields.
### Testing Locally ### Sample payloads & crews
Test your Gmail trigger integration locally using the CrewAI CLI: The [CrewAI AMP Trigger Examples repository](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/gmail) includes:
```bash - `new-email-payload-1.json` / `new-email-payload-2.json` — production-style new message alerts with matching crews in `new-email-crew.py`
# View all available triggers - `thread-updated-sample-1.json` — follow-up messages on an existing thread, processed by `gmail-alert-crew.py`
crewai triggers list
# Simulate a Gmail trigger with realistic payload Use these samples to validate your parsing logic locally before wiring the trigger to your live Gmail accounts.
crewai triggers run gmail/new_email_received
```
The `crewai triggers run` command will execute your crew with a complete Gmail payload, allowing you to test your parsing logic before deployment.
<Warning>
Use `crewai triggers run gmail/new_email_received` (not `crewai run`) to
simulate trigger execution during development. After deployment, your crew
will automatically receive the trigger payload.
</Warning>
## Monitoring Executions ## Monitoring Executions
Track history and performance of triggered runs: Track history and performance of triggered runs:
<Frame> <Frame>
<img <img src="/images/enterprise/list-executions.png" alt="List of executions triggered by automation" />
src="/images/enterprise/list-executions.png"
alt="List of executions triggered by automation"
/>
</Frame> </Frame>
## Payload Reference
See the sample payloads and field descriptions:
<Card title="Gmail samples in Trigger Examples Repo" href="https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/gmail" icon="envelopes-bulk">
Gmail samples in Trigger Examples Repo
</Card>
## Troubleshooting ## Troubleshooting
- Ensure Gmail is connected in Tools & Integrations - Ensure Gmail is connected in Tools & Integrations
- Verify the Gmail Trigger is enabled on the Triggers tab - Verify the Gmail Trigger is enabled on the Triggers tab
- Test locally with `crewai triggers run gmail/new_email_received` to see the exact payload structure
- Check the execution logs and confirm the payload is passed as `crewai_trigger_payload` - Check the execution logs and confirm the payload is passed as `crewai_trigger_payload`
- Remember: use `crewai triggers run` (not `crewai run`) to simulate trigger execution

View File

@@ -10,8 +10,7 @@ mode: "wide"
Use the Google Calendar trigger to launch automations whenever calendar events change. Common use cases include briefing a team before a meeting, notifying stakeholders when a critical event is cancelled, or summarizing daily schedules. Use the Google Calendar trigger to launch automations whenever calendar events change. Common use cases include briefing a team before a meeting, notifying stakeholders when a critical event is cancelled, or summarizing daily schedules.
<Tip> <Tip>
Make sure Google Calendar is connected in **Tools & Integrations** and enabled Make sure Google Calendar is connected in **Tools & Integrations** and enabled for the deployment you want to automate.
for the deployment you want to automate.
</Tip> </Tip>
## Enabling the Google Calendar Trigger ## Enabling the Google Calendar Trigger
@@ -21,10 +20,7 @@ Use the Google Calendar trigger to launch automations whenever calendar events c
3. Locate **Google Calendar** and switch the toggle to enable 3. Locate **Google Calendar** and switch the toggle to enable
<Frame> <Frame>
<img <img src="/images/enterprise/calendar-trigger.png" alt="Enable or disable triggers with toggle" />
src="/images/enterprise/calendar-trigger.png"
alt="Enable or disable triggers with toggle"
/>
</Frame> </Frame>
## Example: Summarize meeting details ## Example: Summarize meeting details
@@ -43,41 +39,27 @@ print(result.raw)
Use `crewai_trigger_payload` exactly as it is delivered by the trigger so the crew can extract the proper fields. Use `crewai_trigger_payload` exactly as it is delivered by the trigger so the crew can extract the proper fields.
## Testing Locally ## Sample payloads & crews
Test your Google Calendar trigger integration locally using the CrewAI CLI: The [Google Calendar examples](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/google_calendar) show how to handle multiple event types:
```bash - `new-event.json` → standard event creation handled by `calendar-event-crew.py`
# View all available triggers - `event-updated.json` / `event-started.json` / `event-ended.json` → in-flight updates processed by `calendar-meeting-crew.py`
crewai triggers list - `event-canceled.json` → cancellation workflow that alerts attendees via `calendar-meeting-crew.py`
- Working location events use `calendar-working-location-crew.py` to extract on-site schedules
# Simulate a Google Calendar trigger with realistic payload Each crew transforms raw event metadata (attendees, rooms, working locations) into the summaries your teams need.
crewai triggers run google_calendar/event_changed
```
The `crewai triggers run` command will execute your crew with a complete Calendar payload, allowing you to test your parsing logic before deployment.
<Warning>
Use `crewai triggers run google_calendar/event_changed` (not `crewai run`) to
simulate trigger execution during development. After deployment, your crew
will automatically receive the trigger payload.
</Warning>
## Monitoring Executions ## Monitoring Executions
The **Executions** list in the deployment dashboard tracks every triggered run and surfaces payload metadata, output summaries, and errors. The **Executions** list in the deployment dashboard tracks every triggered run and surfaces payload metadata, output summaries, and errors.
<Frame> <Frame>
<img <img src="/images/enterprise/list-executions.png" alt="List of executions triggered by automation" />
src="/images/enterprise/list-executions.png"
alt="List of executions triggered by automation"
/>
</Frame> </Frame>
## Troubleshooting ## Troubleshooting
- Ensure the correct Google account is connected and the trigger is enabled - Ensure the correct Google account is connected and the trigger is enabled
- Test locally with `crewai triggers run google_calendar/event_changed` to see the exact payload structure
- Confirm your workflow handles all-day events (payloads use `start.date` and `end.date` instead of timestamps) - Confirm your workflow handles all-day events (payloads use `start.date` and `end.date` instead of timestamps)
- Check execution logs if reminders or attendee arrays are missing—calendar permissions can limit fields in the payload - Check execution logs if reminders or attendee arrays are missing—calendar permissions can limit fields in the payload
- Remember: use `crewai triggers run` (not `crewai run`) to simulate trigger execution

View File

@@ -10,8 +10,7 @@ mode: "wide"
Trigger your automations when files are created, updated, or removed in Google Drive. Typical workflows include summarizing newly uploaded content, enforcing sharing policies, or notifying owners when critical files change. Trigger your automations when files are created, updated, or removed in Google Drive. Typical workflows include summarizing newly uploaded content, enforcing sharing policies, or notifying owners when critical files change.
<Tip> <Tip>
Connect Google Drive in **Tools & Integrations** and confirm the trigger is Connect Google Drive in **Tools & Integrations** and confirm the trigger is enabled for the automation you want to monitor.
enabled for the automation you want to monitor.
</Tip> </Tip>
## Enabling the Google Drive Trigger ## Enabling the Google Drive Trigger
@@ -21,10 +20,7 @@ Trigger your automations when files are created, updated, or removed in Google D
3. Locate **Google Drive** and switch the toggle to enable 3. Locate **Google Drive** and switch the toggle to enable
<Frame> <Frame>
<img <img src="/images/enterprise/gdrive-trigger.png" alt="Enable or disable triggers with toggle" />
src="/images/enterprise/gdrive-trigger.png"
alt="Enable or disable triggers with toggle"
/>
</Frame> </Frame>
## Example: Summarize file activity ## Example: Summarize file activity
@@ -40,41 +36,26 @@ crew.kickoff({
}) })
``` ```
## Testing Locally ## Sample payloads & crews
Test your Google Drive trigger integration locally using the CrewAI CLI: Explore the [Google Drive examples](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/google_drive) to cover different operations:
```bash - `new-file.json` → new uploads processed by `drive-file-crew.py`
# View all available triggers - `updated-file.json` → file edits and metadata changes handled by `drive-file-crew.py`
crewai triggers list - `deleted-file.json` → deletion events routed through `drive-file-deletion-crew.py`
# Simulate a Google Drive trigger with realistic payload Each crew highlights the file name, operation type, owner, permissions, and security considerations so downstream systems can respond appropriately.
crewai triggers run google_drive/file_changed
```
The `crewai triggers run` command will execute your crew with a complete Drive payload, allowing you to test your parsing logic before deployment.
<Warning>
Use `crewai triggers run google_drive/file_changed` (not `crewai run`) to
simulate trigger execution during development. After deployment, your crew
will automatically receive the trigger payload.
</Warning>
## Monitoring Executions ## Monitoring Executions
Track history and performance of triggered runs with the **Executions** list in the deployment dashboard. Track history and performance of triggered runs with the **Executions** list in the deployment dashboard.
<Frame> <Frame>
<img <img src="/images/enterprise/list-executions.png" alt="List of executions triggered by automation" />
src="/images/enterprise/list-executions.png"
alt="List of executions triggered by automation"
/>
</Frame> </Frame>
## Troubleshooting ## Troubleshooting
- Verify Google Drive is connected and the trigger toggle is enabled - Verify Google Drive is connected and the trigger toggle is enabled
- Test locally with `crewai triggers run google_drive/file_changed` to see the exact payload structure
- If a payload is missing permission data, ensure the connected account has access to the file or folder - If a payload is missing permission data, ensure the connected account has access to the file or folder
- The trigger sends file IDs only; use the Drive API if you need to fetch binary content during the crew run - The trigger sends file IDs only; use the Drive API if you need to fetch binary content during the crew run
- Remember: use `crewai triggers run` (not `crewai run`) to simulate trigger execution

View File

@@ -15,47 +15,50 @@ This guide provides a step-by-step process to set up HubSpot triggers for CrewAI
## Setup Steps ## Setup Steps
<Steps> <Steps>
<Step title="Connect your HubSpot account with CrewAI AMP"> <Step title="Connect your HubSpot account with CrewAI AMP">
- Log in to your `CrewAI AMP account > Triggers` - Select `HubSpot` from the - Log in to your `CrewAI AMP account > Triggers`
list of available triggers - Choose the HubSpot account you want to connect - Select `HubSpot` from the list of available triggers
with CrewAI AMP - Follow the on-screen prompts to authorize CrewAI AMP - Choose the HubSpot account you want to connect with CrewAI AMP
access to your HubSpot account - A confirmation message will appear once - Follow the on-screen prompts to authorize CrewAI AMP access to your HubSpot account
HubSpot is successfully connected with CrewAI AMP - A confirmation message will appear once HubSpot is successfully connected with CrewAI AMP
</Step> </Step>
<Step title="Create a HubSpot Workflow"> <Step title="Create a HubSpot Workflow">
- Log in to your `HubSpot account > Automations > Workflows > New workflow` - Log in to your `HubSpot account > Automations > Workflows > New workflow`
- Select the workflow type that fits your needs (e.g., Start from scratch) - - Select the workflow type that fits your needs (e.g., Start from scratch)
In the workflow builder, click the Plus (+) icon to add a new action. - - In the workflow builder, click the Plus (+) icon to add a new action.
Choose `Integrated apps > CrewAI > Kickoff a Crew`. - Select the Crew you - Choose `Integrated apps > CrewAI > Kickoff a Crew`.
want to initiate. - Click `Save` to add the action to your workflow - Select the Crew you want to initiate.
<Frame> - Click `Save` to add the action to your workflow
<img <Frame>
src="/images/enterprise/hubspot-workflow-1.png" <img src="/images/enterprise/hubspot-workflow-1.png" alt="HubSpot Workflow 1" />
alt="HubSpot Workflow 1" </Frame>
/> </Step>
</Frame> <Step title="Use Crew results with other actions">
</Step> - After the Kickoff a Crew step, click the Plus (+) icon to add a new action.
<Step title="Use Crew results with other actions"> - For example, to send an internal email notification, choose `Communications > Send internal email notification`
- After the Kickoff a Crew step, click the Plus (+) icon to add a new - In the Body field, click `Insert data`, select `View properties or action outputs from > Action outputs > Crew Result` to include Crew data in the email
action. - For example, to send an internal email notification, choose <Frame>
`Communications > Send internal email notification` - In the Body field, <img src="/images/enterprise/hubspot-workflow-2.png" alt="HubSpot Workflow 2" />
click `Insert data`, select `View properties or action outputs from > Action </Frame>
outputs > Crew Result` to include Crew data in the email - Configure any additional actions as needed
<Frame> - Review your workflow steps to ensure everything is set up correctly
<img - Activate the workflow
src="/images/enterprise/hubspot-workflow-2.png" <Frame>
alt="HubSpot Workflow 2" <img src="/images/enterprise/hubspot-workflow-3.png" alt="HubSpot Workflow 3" />
/> </Frame>
</Frame> </Step>
- Configure any additional actions as needed - Review your workflow
steps to ensure everything is set up correctly - Activate the workflow
<Frame>
<img
src="/images/enterprise/hubspot-workflow-3.png"
alt="HubSpot Workflow 3"
/>
</Frame>
</Step>
</Steps> </Steps>
## Additional Resources
### Sample payloads & crews
You can jump-start development with the [HubSpot examples in the trigger repository](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/hubspot):
- `record-created-contact.json`, `record-updated-contact.json` → contact lifecycle events handled by `hubspot-contact-crew.py`
- `record-created-company.json`, `record-updated-company.json` → company enrichment flows in `hubspot-company-crew.py`
- `record-created-deals.json`, `record-updated-deals.json` → deal pipeline automation in `hubspot-record-crew.py`
Each crew demonstrates how to parse HubSpot record fields, enrich context, and return structured insights.
For more detailed information on available actions and customization options, refer to the [HubSpot Workflows Documentation](https://knowledge.hubspot.com/workflows/create-workflows). For more detailed information on available actions and customization options, refer to the [HubSpot Workflows Documentation](https://knowledge.hubspot.com/workflows/create-workflows).

View File

@@ -17,7 +17,9 @@ Once you've deployed your crew to the CrewAI AMP platform, you can kickoff execu
2. Click on the crew name from your projects list 2. Click on the crew name from your projects list
3. You'll be taken to the crew's detail page 3. You'll be taken to the crew's detail page
<Frame>![Crew Dashboard](/images/enterprise/crew-dashboard.png)</Frame> <Frame>
![Crew Dashboard](/images/enterprise/crew-dashboard.png)
</Frame>
### Step 2: Initiate Execution ### Step 2: Initiate Execution
@@ -29,7 +31,9 @@ From your crew's detail page, you have two options to kickoff an execution:
2. Enter the required input parameters for your crew in the JSON editor 2. Enter the required input parameters for your crew in the JSON editor
3. Click the `Send Request` button 3. Click the `Send Request` button
<Frame>![Kickoff Endpoint](/images/enterprise/kickoff-endpoint.png)</Frame> <Frame>
![Kickoff Endpoint](/images/enterprise/kickoff-endpoint.png)
</Frame>
#### Option B: Using the Visual Interface #### Option B: Using the Visual Interface
@@ -37,7 +41,9 @@ From your crew's detail page, you have two options to kickoff an execution:
2. Enter the required inputs in the form fields 2. Enter the required inputs in the form fields
3. Click the `Run Crew` button 3. Click the `Run Crew` button
<Frame>![Run Crew](/images/enterprise/run-crew.png)</Frame> <Frame>
![Run Crew](/images/enterprise/run-crew.png)
</Frame>
### Step 3: Monitor Execution Progress ### Step 3: Monitor Execution Progress
@@ -46,7 +52,9 @@ After initiating the execution:
1. You'll receive a response containing a `kickoff_id` - **copy this ID** 1. You'll receive a response containing a `kickoff_id` - **copy this ID**
2. This ID is essential for tracking your execution 2. This ID is essential for tracking your execution
<Frame>![Copy Task ID](/images/enterprise/copy-task-id.png)</Frame> <Frame>
![Copy Task ID](/images/enterprise/copy-task-id.png)
</Frame>
### Step 4: Check Execution Status ### Step 4: Check Execution Status
@@ -56,10 +64,11 @@ To monitor the progress of your execution:
2. Paste the `kickoff_id` into the designated field 2. Paste the `kickoff_id` into the designated field
3. Click the "Get Status" button 3. Click the "Get Status" button
<Frame>![Get Status](/images/enterprise/get-status.png)</Frame> <Frame>
![Get Status](/images/enterprise/get-status.png)
</Frame>
The status response will show: The status response will show:
- Current execution state (`running`, `completed`, etc.) - Current execution state (`running`, `completed`, etc.)
- Details about which tasks are in progress - Details about which tasks are in progress
- Any outputs produced so far - Any outputs produced so far
@@ -113,7 +122,7 @@ curl -X GET \
The response will be a JSON object containing an array of required input parameters, for example: The response will be a JSON object containing an array of required input parameters, for example:
```json ```json
{ "inputs": ["topic", "current_year"] } {"inputs":["topic","current_year"]}
``` ```
This example shows that this particular crew requires two inputs: `topic` and `current_year`. This example shows that this particular crew requires two inputs: `topic` and `current_year`.
@@ -133,7 +142,7 @@ curl -X POST \
The response will include a `kickoff_id` that you'll need for tracking: The response will include a `kickoff_id` that you'll need for tracking:
```json ```json
{ "kickoff_id": "abcd1234-5678-90ef-ghij-klmnopqrstuv" } {"kickoff_id":"abcd1234-5678-90ef-ghij-klmnopqrstuv"}
``` ```
### Step 3: Check Execution Status ### Step 3: Check Execution Status
@@ -173,6 +182,5 @@ If an execution fails:
3. Look for LLM responses and tool usage in the trace details 3. Look for LLM responses and tool usage in the trace details
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with execution issues or questions Contact our support team for assistance with execution issues or questions about the Enterprise platform.
about the Enterprise platform.
</Card> </Card>

View File

@@ -10,8 +10,7 @@ mode: "wide"
Use the Microsoft Teams trigger to start automations whenever a new chat is created. Common patterns include summarizing inbound requests, routing urgent messages to support teams, or creating follow-up tasks in other systems. Use the Microsoft Teams trigger to start automations whenever a new chat is created. Common patterns include summarizing inbound requests, routing urgent messages to support teams, or creating follow-up tasks in other systems.
<Tip> <Tip>
Confirm Microsoft Teams is connected under **Tools & Integrations** and Confirm Microsoft Teams is connected under **Tools & Integrations** and enabled in the **Triggers** tab for your deployment.
enabled in the **Triggers** tab for your deployment.
</Tip> </Tip>
## Enabling the Microsoft Teams Trigger ## Enabling the Microsoft Teams Trigger
@@ -21,10 +20,7 @@ Use the Microsoft Teams trigger to start automations whenever a new chat is crea
3. Locate **Microsoft Teams** and switch the toggle to enable 3. Locate **Microsoft Teams** and switch the toggle to enable
<Frame caption="Microsoft Teams trigger connection"> <Frame caption="Microsoft Teams trigger connection">
<img <img src="/images/enterprise/msteams-trigger.png" alt="Enable or disable triggers with toggle" />
src="/images/enterprise/msteams-trigger.png"
alt="Enable or disable triggers with toggle"
/>
</Frame> </Frame>
## Example: Summarize a new chat thread ## Example: Summarize a new chat thread
@@ -41,30 +37,16 @@ print(result.raw)
The crew parses thread metadata (subject, created time, roster) and generates an action plan for the receiving team. The crew parses thread metadata (subject, created time, roster) and generates an action plan for the receiving team.
## Testing Locally ## Sample payloads & crews
Test your Microsoft Teams trigger integration locally using the CrewAI CLI: The [Microsoft Teams examples](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/microsoft-teams) include:
```bash - `chat-created.json` → chat creation payload processed by `teams-chat-created-crew.py`
# View all available triggers
crewai triggers list
# Simulate a Microsoft Teams trigger with realistic payload The crew demonstrates how to extract participants, initial messages, tenant information, and compliance metadata from the Microsoft Graph webhook payload.
crewai triggers run microsoft_teams/teams_message_created
```
The `crewai triggers run` command will execute your crew with a complete Teams payload, allowing you to test your parsing logic before deployment.
<Warning>
Use `crewai triggers run microsoft_teams/teams_message_created` (not `crewai
run`) to simulate trigger execution during development. After deployment, your
crew will automatically receive the trigger payload.
</Warning>
## Troubleshooting ## Troubleshooting
- Ensure the Teams connection is active; it must be refreshed if the tenant revokes permissions - Ensure the Teams connection is active; it must be refreshed if the tenant revokes permissions
- Test locally with `crewai triggers run microsoft_teams/teams_message_created` to see the exact payload structure
- Confirm the webhook subscription in Microsoft 365 is still valid if payloads stop arriving - Confirm the webhook subscription in Microsoft 365 is still valid if payloads stop arriving
- Review execution logs for payload shape mismatches—Graph notifications may omit fields when a chat is private or restricted - Review execution logs for payload shape mismatches—Graph notifications may omit fields when a chat is private or restricted
- Remember: use `crewai triggers run` (not `crewai run`) to simulate trigger execution

View File

@@ -10,8 +10,7 @@ mode: "wide"
Start automations when files change inside OneDrive. You can generate audit summaries, notify security teams about external sharing, or update downstream line-of-business systems with new document metadata. Start automations when files change inside OneDrive. You can generate audit summaries, notify security teams about external sharing, or update downstream line-of-business systems with new document metadata.
<Tip> <Tip>
Connect OneDrive in **Tools & Integrations** and toggle the trigger on for Connect OneDrive in **Tools & Integrations** and toggle the trigger on for your deployment.
your deployment.
</Tip> </Tip>
## Enabling the OneDrive Trigger ## Enabling the OneDrive Trigger
@@ -21,10 +20,7 @@ Start automations when files change inside OneDrive. You can generate audit summ
3. Locate **OneDrive** and switch the toggle to enable 3. Locate **OneDrive** and switch the toggle to enable
<Frame caption="Microsoft OneDrive trigger connection"> <Frame caption="Microsoft OneDrive trigger connection">
<img <img src="/images/enterprise/onedrive-trigger.png" alt="Enable or disable triggers with toggle" />
src="/images/enterprise/onedrive-trigger.png"
alt="Enable or disable triggers with toggle"
/>
</Frame> </Frame>
## Example: Audit file permissions ## Example: Audit file permissions
@@ -40,30 +36,18 @@ crew.kickoff({
The crew inspects file metadata, user activity, and permission changes to produce a compliance-friendly summary. The crew inspects file metadata, user activity, and permission changes to produce a compliance-friendly summary.
## Testing Locally ## Sample payloads & crews
Test your OneDrive trigger integration locally using the CrewAI CLI: The [OneDrive examples](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/onedrive) showcase how to:
```bash - Parse file metadata, size, and folder paths
# View all available triggers - Track who created and last modified the file
crewai triggers list - Highlight permission and external sharing changes
# Simulate a OneDrive trigger with realistic payload `onedrive-file-crew.py` bundles the analysis and summarization tasks so you can add remediation steps as needed.
crewai triggers run microsoft_onedrive/file_changed
```
The `crewai triggers run` command will execute your crew with a complete OneDrive payload, allowing you to test your parsing logic before deployment.
<Warning>
Use `crewai triggers run microsoft_onedrive/file_changed` (not `crewai run`)
to simulate trigger execution during development. After deployment, your crew
will automatically receive the trigger payload.
</Warning>
## Troubleshooting ## Troubleshooting
- Ensure the connected account has permission to read the file metadata included in the webhook - Ensure the connected account has permission to read the file metadata included in the webhook
- Test locally with `crewai triggers run microsoft_onedrive/file_changed` to see the exact payload structure
- If the trigger fires but the payload is missing `permissions`, confirm the site-level sharing settings allow Graph to return this field - If the trigger fires but the payload is missing `permissions`, confirm the site-level sharing settings allow Graph to return this field
- For large tenants, filter notifications upstream so the crew only runs on relevant directories - For large tenants, filter notifications upstream so the crew only runs on relevant directories
- Remember: use `crewai triggers run` (not `crewai run`) to simulate trigger execution

View File

@@ -10,8 +10,7 @@ mode: "wide"
Automate responses when Outlook delivers a new message or when an event is removed from the calendar. Teams commonly route escalations, file tickets, or alert attendees of cancellations. Automate responses when Outlook delivers a new message or when an event is removed from the calendar. Teams commonly route escalations, file tickets, or alert attendees of cancellations.
<Tip> <Tip>
Connect Outlook in **Tools & Integrations** and ensure the trigger is enabled Connect Outlook in **Tools & Integrations** and ensure the trigger is enabled for your deployment.
for your deployment.
</Tip> </Tip>
## Enabling the Outlook Trigger ## Enabling the Outlook Trigger
@@ -21,10 +20,7 @@ Automate responses when Outlook delivers a new message or when an event is remov
3. Locate **Outlook** and switch the toggle to enable 3. Locate **Outlook** and switch the toggle to enable
<Frame caption="Microsoft Outlook trigger connection"> <Frame caption="Microsoft Outlook trigger connection">
<img <img src="/images/enterprise/outlook-trigger.png" alt="Enable or disable triggers with toggle" />
src="/images/enterprise/outlook-trigger.png"
alt="Enable or disable triggers with toggle"
/>
</Frame> </Frame>
## Example: Summarize a new email ## Example: Summarize a new email
@@ -40,30 +36,17 @@ crew.kickoff({
The crew extracts sender details, subject, body preview, and attachments before generating a structured response. The crew extracts sender details, subject, body preview, and attachments before generating a structured response.
## Testing Locally ## Sample payloads & crews
Test your Outlook trigger integration locally using the CrewAI CLI: Review the [Outlook examples](https://github.com/crewAIInc/crewai-enterprise-trigger-examples/tree/main/outlook) for two common scenarios:
```bash - `new-message.json` → new mail notifications parsed by `outlook-message-crew.py`
# View all available triggers - `event-removed.json` → calendar cleanup handled by `outlook-event-removal-crew.py`
crewai triggers list
# Simulate an Outlook trigger with realistic payload Each crew demonstrates how to handle Microsoft Graph payloads, normalize headers, and keep humans in-the-loop with concise summaries.
crewai triggers run microsoft_outlook/email_received
```
The `crewai triggers run` command will execute your crew with a complete Outlook payload, allowing you to test your parsing logic before deployment.
<Warning>
Use `crewai triggers run microsoft_outlook/email_received` (not `crewai run`)
to simulate trigger execution during development. After deployment, your crew
will automatically receive the trigger payload.
</Warning>
## Troubleshooting ## Troubleshooting
- Verify the Outlook connector is still authorized; the subscription must be renewed periodically - Verify the Outlook connector is still authorized; the subscription must be renewed periodically
- Test locally with `crewai triggers run microsoft_outlook/email_received` to see the exact payload structure
- If attachments are missing, confirm the webhook subscription includes the `includeResourceData` flag - If attachments are missing, confirm the webhook subscription includes the `includeResourceData` flag
- Review execution logs when events fail to match—cancellation payloads lack attendee lists by design and the crew should account for that - Review execution logs when events fail to match—cancellation payloads lack attendee lists by design and the crew should account for that
- Remember: use `crewai triggers run` (not `crewai run`) to simulate trigger execution

View File

@@ -17,7 +17,6 @@ This guide explains how to export CrewAI AMP crews as React components and integ
<img src="/images/enterprise/export-react-component.png" alt="Export React Component" /> <img src="/images/enterprise/export-react-component.png" alt="Export React Component" />
</Frame> </Frame>
</Step> </Step>
</Steps> </Steps>
## Setting Up Your React Environment ## Setting Up Your React Environment
@@ -84,7 +83,6 @@ To run this React component locally, you'll need to set up a React development e
``` ```
- This will start the development server, and your default web browser should open automatically to http://localhost:3000, where you'll see your React app running. - This will start the development server, and your default web browser should open automatically to http://localhost:3000, where you'll see your React app running.
</Step> </Step>
</Steps> </Steps>
## Customization ## Customization
@@ -92,16 +90,10 @@ To run this React component locally, you'll need to set up a React development e
You can then customise the `CrewLead.jsx` to add color, title etc You can then customise the `CrewLead.jsx` to add color, title etc
<Frame> <Frame>
<img <img src="/images/enterprise/customise-react-component.png" alt="Customise React Component" />
src="/images/enterprise/customise-react-component.png"
alt="Customise React Component"
/>
</Frame> </Frame>
<Frame> <Frame>
<img <img src="/images/enterprise/customise-react-component-2.png" alt="Customise React Component" />
src="/images/enterprise/customise-react-component-2.png"
alt="Customise React Component"
/>
</Frame> </Frame>
## Next Steps ## Next Steps

View File

@@ -10,30 +10,31 @@ As an administrator of a CrewAI AMP account, you can easily invite new team memb
## Inviting Team Members ## Inviting Team Members
<Steps> <Steps>
<Step title="Access the Settings Page"> <Step title="Access the Settings Page">
- Log in to your CrewAI AMP account - Look for the gear icon (⚙️) in the top - Log in to your CrewAI AMP account
right corner of the dashboard - Click on the gear icon to access the - Look for the gear icon (⚙️) in the top right corner of the dashboard
**Settings** page: - Click on the gear icon to access the **Settings** page:
<Frame caption="Settings page"> <Frame caption="Settings page">
<img src="/images/enterprise/settings-page.png" alt="Settings Page" /> <img src="/images/enterprise/settings-page.png" alt="Settings Page" />
</Frame> </Frame>
</Step> </Step>
<Step title="Navigate to the Members Section"> <Step title="Navigate to the Members Section">
- On the Settings page, you'll see a `Members` tab - Click on the `Members` - On the Settings page, you'll see a `Members` tab
tab to access the **Members** page: - Click on the `Members` tab to access the **Members** page:
<Frame caption="Members tab"> <Frame caption="Members tab">
<img src="/images/enterprise/members-tab.png" alt="Members Tab" /> <img src="/images/enterprise/members-tab.png" alt="Members Tab" />
</Frame> </Frame>
</Step> </Step>
<Step title="Invite New Members"> <Step title="Invite New Members">
- In the Members section, you'll see a list of current members (including - In the Members section, you'll see a list of current members (including yourself)
yourself) - Locate the `Email` input field - Enter the email address of the - Locate the `Email` input field
person you want to invite - Click the `Invite` button to send the invitation - Enter the email address of the person you want to invite
</Step> - Click the `Invite` button to send the invitation
<Step title="Repeat as Needed"> </Step>
- You can repeat this process to invite multiple team members - Each invited <Step title="Repeat as Needed">
member will receive an email invitation to join your organization - You can repeat this process to invite multiple team members
</Step> - Each invited member will receive an email invitation to join your organization
</Step>
</Steps> </Steps>
## Adding Roles ## Adding Roles
@@ -41,44 +42,40 @@ As an administrator of a CrewAI AMP account, you can easily invite new team memb
You can add roles to your team members to control their access to different parts of the platform. You can add roles to your team members to control their access to different parts of the platform.
<Steps> <Steps>
<Step title="Access the Settings Page"> <Step title="Access the Settings Page">
- Log in to your CrewAI AMP account - Look for the gear icon (⚙️) in the top - Log in to your CrewAI AMP account
right corner of the dashboard - Click on the gear icon to access the - Look for the gear icon (⚙️) in the top right corner of the dashboard
**Settings** page: - Click on the gear icon to access the **Settings** page:
<Frame> <Frame>
<img src="/images/enterprise/settings-page.png" alt="Settings Page" /> <img src="/images/enterprise/settings-page.png" alt="Settings Page" />
</Frame> </Frame>
</Step> </Step>
<Step title="Navigate to the Members Section"> <Step title="Navigate to the Members Section">
- On the Settings page, you'll see a `Roles` tab - Click on the `Roles` tab - On the Settings page, you'll see a `Roles` tab
to access the **Roles** page. - Click on the `Roles` tab to access the **Roles** page.
<Frame> <Frame>
<img src="/images/enterprise/roles-tab.png" alt="Roles Tab" /> <img src="/images/enterprise/roles-tab.png" alt="Roles Tab" />
</Frame> </Frame>
- Click on the `Add Role` button to add a new role. - Enter the - Click on the `Add Role` button to add a new role.
details and permissions of the role and click the `Create Role` button to - Enter the details and permissions of the role and click the `Create Role` button to create the role.
create the role. <Frame>
<Frame> <img src="/images/enterprise/add-role-modal.png" alt="Add Role Modal" />
<img src="/images/enterprise/add-role-modal.png" alt="Add Role Modal" /> </Frame>
</Frame> </Step>
</Step> <Step title="Add Roles to Members">
<Step title="Add Roles to Members"> - In the Members section, you'll see a list of current members (including yourself)
- In the Members section, you'll see a list of current members (including <Frame>
yourself) <img src="/images/enterprise/member-accepted-invitation.png" alt="Member Accepted Invitation" />
<Frame> </Frame>
<img - Once the member has accepted the invitation, you can add a role to them.
src="/images/enterprise/member-accepted-invitation.png" - Navigate back to `Roles` tab
alt="Member Accepted Invitation" - Go to the member you want to add a role to and under the `Role` column, click on the dropdown
/> - Select the role you want to add to the member
</Frame> - Click the `Update` button to save the role
- Once the member has accepted the invitation, you can add a role to <Frame>
them. - Navigate back to `Roles` tab - Go to the member you want to add a <img src="/images/enterprise/assign-role.png" alt="Add Role to Member" />
role to and under the `Role` column, click on the dropdown - Select the role </Frame>
you want to add to the member - Click the `Update` button to save the role </Step>
<Frame>
<img src="/images/enterprise/assign-role.png" alt="Add Role to Member" />
</Frame>
</Step>
</Steps> </Steps>
## Important Notes ## Important Notes

View File

@@ -21,7 +21,7 @@ The repository is not a version control system. Use Git to track code changes an
Before using the Tool Repository, ensure you have: Before using the Tool Repository, ensure you have:
- A [CrewAI AMP](https://app.crewai.com) account - A [CrewAI AMP](https://app.crewai.com) account
- [CrewAI CLI](/en/concepts/cli#cli) installed - [CrewAI CLI](https://docs.crewai.com/concepts/cli#cli) installed
- uv>=0.5.0 installed. Check out [how to upgrade](https://docs.astral.sh/uv/getting-started/installation/#upgrading-uv) - uv>=0.5.0 installed. Check out [how to upgrade](https://docs.astral.sh/uv/getting-started/installation/#upgrading-uv)
- [Git](https://git-scm.com) installed and configured - [Git](https://git-scm.com) installed and configured
- Access permissions to publish or install tools in your CrewAI AMP organization - Access permissions to publish or install tools in your CrewAI AMP organization
@@ -112,7 +112,7 @@ By default, tools are published as private. To make a tool public:
crewai tool publish --public crewai tool publish --public
``` ```
For more details on how to build tools, see [Creating your own tools](/en/concepts/tools#creating-your-own-tools). For more details on how to build tools, see [Creating your own tools](https://docs.crewai.com/concepts/tools#creating-your-own-tools).
## Updating Tools ## Updating Tools
@@ -137,7 +137,7 @@ To delete a tool:
4. Click **Delete** 4. Click **Delete**
<Warning> <Warning>
Deletion is permanent. Deleted tools cannot be restored or re-installed. Deletion is permanent. Deleted tools cannot be restored or re-installed.
</Warning> </Warning>
## Security Checks ## Security Checks
@@ -149,6 +149,5 @@ You can check the security check status of a tool at:
`CrewAI AMP > Tools > Your Tool > Versions` `CrewAI AMP > Tools > Your Tool > Versions`
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with API integration or Contact our support team for assistance with API integration or troubleshooting.
troubleshooting.
</Card> </Card>

View File

@@ -6,9 +6,8 @@ mode: "wide"
--- ---
<Note> <Note>
After deploying your crew to CrewAI AMP, you may need to make updates to the After deploying your crew to CrewAI AMP, you may need to make updates to the code, security settings, or configuration.
code, security settings, or configuration. This guide explains how to perform This guide explains how to perform these common update operations.
these common update operations.
</Note> </Note>
## Why Update Your Crew? ## Why Update Your Crew?
@@ -16,7 +15,6 @@ mode: "wide"
CrewAI won't automatically pick up GitHub updates by default, so you'll need to manually trigger updates, unless you checked the `Auto-update` option when deploying your crew. CrewAI won't automatically pick up GitHub updates by default, so you'll need to manually trigger updates, unless you checked the `Auto-update` option when deploying your crew.
There are several reasons you might want to update your crew deployment: There are several reasons you might want to update your crew deployment:
- You want to update the code with a latest commit you pushed to GitHub - You want to update the code with a latest commit you pushed to GitHub
- You want to reset the bearer token for security reasons - You want to reset the bearer token for security reasons
- You want to update environment variables - You want to update environment variables
@@ -28,7 +26,9 @@ When you've pushed new commits to your GitHub repository and want to update your
1. Navigate to your crew in the CrewAI AMP platform 1. Navigate to your crew in the CrewAI AMP platform
2. Click on the `Re-deploy` button on your crew details page 2. Click on the `Re-deploy` button on your crew details page
<Frame>![Re-deploy Button](/images/enterprise/redeploy-button.png)</Frame> <Frame>
![Re-deploy Button](/images/enterprise/redeploy-button.png)
</Frame>
This will trigger an update that you can track using the progress bar. The system will pull the latest code from your repository and rebuild your deployment. This will trigger an update that you can track using the progress bar. The system will pull the latest code from your repository and rebuild your deployment.
@@ -40,11 +40,12 @@ If you need to generate a new bearer token (for example, if you suspect the curr
2. Find the `Bearer Token` section 2. Find the `Bearer Token` section
3. Click the `Reset` button next to your current token 3. Click the `Reset` button next to your current token
<Frame>![Reset Token](/images/enterprise/reset-token.png)</Frame> <Frame>
![Reset Token](/images/enterprise/reset-token.png)
</Frame>
<Warning> <Warning>
Resetting your bearer token will invalidate the previous token immediately. Resetting your bearer token will invalidate the previous token immediately. Make sure to update any applications or scripts that are using the old token.
Make sure to update any applications or scripts that are using the old token.
</Warning> </Warning>
## 3. Updating Environment Variables ## 3. Updating Environment Variables
@@ -68,8 +69,7 @@ To update the environment variables for your crew:
5. Finally, click the `Update Deployment` button at the bottom of the page to apply the changes 5. Finally, click the `Update Deployment` button at the bottom of the page to apply the changes
<Note> <Note>
Updating environment variables will trigger a new deployment, but this will Updating environment variables will trigger a new deployment, but this will only update the environment configuration and not the code itself.
only update the environment configuration and not the code itself.
</Note> </Note>
## After Updating ## After Updating
@@ -81,11 +81,9 @@ After performing any update:
3. Once complete, test your crew to ensure the changes are working as expected 3. Once complete, test your crew to ensure the changes are working as expected
<Tip> <Tip>
If you encounter any issues after updating, you can view deployment logs in If you encounter any issues after updating, you can view deployment logs in the platform or contact support for assistance.
the platform or contact support for assistance.
</Tip> </Tip>
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with updating your crew or Contact our support team for assistance with updating your crew or troubleshooting deployment issues.
troubleshooting deployment issues.
</Card> </Card>

View File

@@ -76,7 +76,6 @@ CrewAI AMP allows you to automate your workflow using webhooks. This article wil
<img src="/images/enterprise/activepieces-email.png" alt="ActivePieces Email" /> <img src="/images/enterprise/activepieces-email.png" alt="ActivePieces Email" />
</Frame> </Frame>
</Step> </Step>
</Steps> </Steps>
## Webhook Output Examples ## Webhook Output Examples
@@ -153,5 +152,4 @@ CrewAI AMP allows you to automate your workflow using webhooks. This article wil
} }
``` ```
</Tab> </Tab>
</Tabs> </Tabs>

View File

@@ -93,7 +93,6 @@ This guide will walk you through the process of setting up Zapier triggers for C
<img src="/images/enterprise/zapier-9.png" alt="Zapier 12" /> <img src="/images/enterprise/zapier-9.png" alt="Zapier 12" />
</Frame> </Frame>
</Step> </Step>
</Steps> </Steps>
## Tips for Success ## Tips for Success

View File

@@ -25,7 +25,7 @@ Before using the Asana integration, ensure you have:
2. Find **Asana** in the Authentication Integrations section 2. Find **Asana** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow 3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for task and project management 4. Grant the necessary permissions for task and project management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations) 5. Copy your Enterprise Token from [Account Settings](https://app.crewai.com/crewai_plus/settings/account)
### 2. Install Required Package ### 2. Install Required Package
@@ -33,37 +33,18 @@ Before using the Asana integration, ensure you have:
uv add crewai-tools uv add crewai-tools
``` ```
### 3. 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
```
## Available Actions ## Available Actions
<AccordionGroup> <AccordionGroup>
<Accordion title="asana/create_comment"> <Accordion title="ASANA_CREATE_COMMENT">
**Description:** Create a comment in Asana. **Description:** Create a comment in Asana.
**Parameters:** **Parameters:**
- `task` (string, required): Task ID - The ID of the Task the comment will be added to. The comment will be authored by the currently authenticated user. - `task` (string, required): Task ID - The ID of the Task the comment will be added to. The comment will be authored by the currently authenticated user.
- `text` (string, required): Text (example: "This is a comment."). - `text` (string, required): Text (example: "This is a comment.").
</Accordion> </Accordion>
<Accordion title="asana/create_project"> <Accordion title="ASANA_CREATE_PROJECT">
**Description:** Create a project in Asana. **Description:** Create a project in Asana.
**Parameters:** **Parameters:**
@@ -71,27 +52,24 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `workspace` (string, required): Workspace - Use Connect Portal Workflow Settings to allow users to select which Workspace to create Projects in. Defaults to the user's first Workspace if left blank. - `workspace` (string, required): Workspace - Use Connect Portal Workflow Settings to allow users to select which Workspace to create Projects in. Defaults to the user's first Workspace if left blank.
- `team` (string, optional): Team - Use Connect Portal Workflow Settings to allow users to select which Team to share this Project with. Defaults to the user's first Team if left blank. - `team` (string, optional): Team - Use Connect Portal Workflow Settings to allow users to select which Team to share this Project with. Defaults to the user's first Team if left blank.
- `notes` (string, optional): Notes (example: "These are things we need to purchase."). - `notes` (string, optional): Notes (example: "These are things we need to purchase.").
</Accordion> </Accordion>
<Accordion title="asana/get_projects"> <Accordion title="ASANA_GET_PROJECTS">
**Description:** Get a list of projects in Asana. **Description:** Get a list of projects in Asana.
**Parameters:** **Parameters:**
- `archived` (string, optional): Archived - Choose "true" to show archived projects, "false" to display only active projects, or "default" to show both archived and active projects. - `archived` (string, optional): Archived - Choose "true" to show archived projects, "false" to display only active projects, or "default" to show both archived and active projects.
- Options: `default`, `true`, `false` - Options: `default`, `true`, `false`
</Accordion> </Accordion>
<Accordion title="asana/get_project_by_id"> <Accordion title="ASANA_GET_PROJECT_BY_ID">
**Description:** Get a project by ID in Asana. **Description:** Get a project by ID in Asana.
**Parameters:** **Parameters:**
- `projectFilterId` (string, required): Project ID. - `projectFilterId` (string, required): Project ID.
</Accordion> </Accordion>
<Accordion title="asana/create_task"> <Accordion title="ASANA_CREATE_TASK">
**Description:** Create a task in Asana. **Description:** Create a task in Asana.
**Parameters:** **Parameters:**
@@ -103,10 +81,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `dueAtDate` (string, optional): Due At - The date and time (ISO timestamp) at which this task is due. Cannot be used together with Due On. (example: "2019-09-15T02:06:58.147Z"). - `dueAtDate` (string, optional): Due At - The date and time (ISO timestamp) at which this task is due. Cannot be used together with Due On. (example: "2019-09-15T02:06:58.147Z").
- `assignee` (string, optional): Assignee - The ID of the Asana user this task will be assigned to. Use Connect Portal Workflow Settings to allow users to select an Assignee. - `assignee` (string, optional): Assignee - The ID of the Asana user this task will be assigned to. Use Connect Portal Workflow Settings to allow users to select an Assignee.
- `gid` (string, optional): External ID - An ID from your application to associate this task with. You can use this ID to sync updates to this task later. - `gid` (string, optional): External ID - An ID from your application to associate this task with. You can use this ID to sync updates to this task later.
</Accordion> </Accordion>
<Accordion title="asana/update_task"> <Accordion title="ASANA_UPDATE_TASK">
**Description:** Update a task in Asana. **Description:** Update a task in Asana.
**Parameters:** **Parameters:**
@@ -119,10 +96,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `dueAtDate` (string, optional): Due At - The date and time (ISO timestamp) at which this task is due. Cannot be used together with Due On. (example: "2019-09-15T02:06:58.147Z"). - `dueAtDate` (string, optional): Due At - The date and time (ISO timestamp) at which this task is due. Cannot be used together with Due On. (example: "2019-09-15T02:06:58.147Z").
- `assignee` (string, optional): Assignee - The ID of the Asana user this task will be assigned to. Use Connect Portal Workflow Settings to allow users to select an Assignee. - `assignee` (string, optional): Assignee - The ID of the Asana user this task will be assigned to. Use Connect Portal Workflow Settings to allow users to select an Assignee.
- `gid` (string, optional): External ID - An ID from your application to associate this task with. You can use this ID to sync updates to this task later. - `gid` (string, optional): External ID - An ID from your application to associate this task with. You can use this ID to sync updates to this task later.
</Accordion> </Accordion>
<Accordion title="asana/get_tasks"> <Accordion title="ASANA_GET_TASKS">
**Description:** Get a list of tasks in Asana. **Description:** Get a list of tasks in Asana.
**Parameters:** **Parameters:**
@@ -130,26 +106,23 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `project` (string, optional): Project - The ID of the Project to filter tasks on. Use Connect Portal Workflow Settings to allow users to select a Project. - `project` (string, optional): Project - The ID of the Project to filter tasks on. Use Connect Portal Workflow Settings to allow users to select a Project.
- `assignee` (string, optional): Assignee - The ID of the assignee to filter tasks on. Use Connect Portal Workflow Settings to allow users to select an Assignee. - `assignee` (string, optional): Assignee - The ID of the assignee to filter tasks on. Use Connect Portal Workflow Settings to allow users to select an Assignee.
- `completedSince` (string, optional): Completed since - Only return tasks that are either incomplete or that have been completed since this time (ISO or Unix timestamp). (example: "2014-04-25T16:15:47-04:00"). - `completedSince` (string, optional): Completed since - Only return tasks that are either incomplete or that have been completed since this time (ISO or Unix timestamp). (example: "2014-04-25T16:15:47-04:00").
</Accordion> </Accordion>
<Accordion title="asana/get_tasks_by_id"> <Accordion title="ASANA_GET_TASKS_BY_ID">
**Description:** Get a list of tasks by ID in Asana. **Description:** Get a list of tasks by ID in Asana.
**Parameters:** **Parameters:**
- `taskId` (string, required): Task ID. - `taskId` (string, required): Task ID.
</Accordion> </Accordion>
<Accordion title="asana/get_task_by_external_id"> <Accordion title="ASANA_GET_TASK_BY_EXTERNAL_ID">
**Description:** Get a task by external ID in Asana. **Description:** Get a task by external ID in Asana.
**Parameters:** **Parameters:**
- `gid` (string, required): External ID - The ID that this task is associated or synced with, from your application. - `gid` (string, required): External ID - The ID that this task is associated or synced with, from your application.
</Accordion> </Accordion>
<Accordion title="asana/add_task_to_section"> <Accordion title="ASANA_ADD_TASK_TO_SECTION">
**Description:** Add a task to a section in Asana. **Description:** Add a task to a section in Asana.
**Parameters:** **Parameters:**
@@ -157,22 +130,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `taskId` (string, required): Task ID - The ID of the task. (example: "1204619611402340"). - `taskId` (string, required): Task ID - The ID of the task. (example: "1204619611402340").
- `beforeTaskId` (string, optional): Before Task ID - The ID of a task in this section that this task will be inserted before. Cannot be used with After Task ID. (example: "1204619611402340"). - `beforeTaskId` (string, optional): Before Task ID - The ID of a task in this section that this task will be inserted before. Cannot be used with After Task ID. (example: "1204619611402340").
- `afterTaskId` (string, optional): After Task ID - The ID of a task in this section that this task will be inserted after. Cannot be used with Before Task ID. (example: "1204619611402340"). - `afterTaskId` (string, optional): After Task ID - The ID of a task in this section that this task will be inserted after. Cannot be used with Before Task ID. (example: "1204619611402340").
</Accordion> </Accordion>
<Accordion title="asana/get_teams"> <Accordion title="ASANA_GET_TEAMS">
**Description:** Get a list of teams in Asana. **Description:** Get a list of teams in Asana.
**Parameters:** **Parameters:**
- `workspace` (string, required): Workspace - Returns the teams in this workspace visible to the authorized user. - `workspace` (string, required): Workspace - Returns the teams in this workspace visible to the authorized user.
</Accordion> </Accordion>
<Accordion title="asana/get_workspaces"> <Accordion title="ASANA_GET_WORKSPACES">
**Description:** Get a list of workspaces in Asana. **Description:** Get a list of workspaces in Asana.
**Parameters:** None required. **Parameters:** None required.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -182,13 +152,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Asana tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Asana capabilities # Create an agent with Asana capabilities
asana_agent = Agent( asana_agent = Agent(
role="Project Manager", role="Project Manager",
goal="Manage tasks and projects in Asana efficiently", goal="Manage tasks and projects in Asana efficiently",
backstory="An AI assistant specialized in project management and task coordination.", backstory="An AI assistant specialized in project management and task coordination.",
apps=['asana'] # All Asana actions will be available tools=[enterprise_tools]
) )
# Task to create a new project # Task to create a new project
@@ -210,18 +186,19 @@ crew.kickoff()
### Filtering Specific Asana Tools ### Filtering Specific Asana Tools
```python ```python
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get only specific Asana tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["asana_create_task", "asana_update_task", "asana_get_tasks"]
)
# Create agent with specific Asana actions only
task_manager_agent = Agent( task_manager_agent = Agent(
role="Task Manager", role="Task Manager",
goal="Create and manage tasks efficiently", goal="Create and manage tasks efficiently",
backstory="An AI assistant that focuses on task creation and management.", backstory="An AI assistant that focuses on task creation and management.",
apps=[ tools=enterprise_tools
'asana/create_task',
'asana/update_task',
'asana/get_tasks'
] # Specific Asana actions
) )
# Task to create and assign a task # Task to create and assign a task
@@ -243,12 +220,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
project_coordinator = Agent( project_coordinator = Agent(
role="Project Coordinator", role="Project Coordinator",
goal="Coordinate project activities and track progress", goal="Coordinate project activities and track progress",
backstory="An experienced project coordinator who ensures projects run smoothly.", backstory="An experienced project coordinator who ensures projects run smoothly.",
apps=['asana'] tools=[enterprise_tools]
) )
# Complex task involving multiple Asana operations # Complex task involving multiple Asana operations

View File

@@ -25,7 +25,7 @@ Before using the Box integration, ensure you have:
2. Find **Box** in the Authentication Integrations section 2. Find **Box** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow 3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for file and folder management 4. Grant the necessary permissions for file and folder management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations) 5. Copy your Enterprise Token from [Account Settings](https://app.crewai.com/crewai_plus/settings/account)
### 2. Install Required Package ### 2. Install Required Package
@@ -33,28 +33,10 @@ Before using the Box integration, ensure you have:
uv add crewai-tools uv add crewai-tools
``` ```
### 3. 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
```
## Available Actions ## Available Actions
<AccordionGroup> <AccordionGroup>
<Accordion title="box/save_file"> <Accordion title="BOX_SAVE_FILE">
**Description:** Save a file from URL in Box. **Description:** Save a file from URL in Box.
**Parameters:** **Parameters:**
@@ -68,28 +50,25 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
} }
``` ```
- `file` (string, required): File URL - Files must be smaller than 50MB in size. (example: "https://picsum.photos/200/300"). - `file` (string, required): File URL - Files must be smaller than 50MB in size. (example: "https://picsum.photos/200/300").
</Accordion> </Accordion>
<Accordion title="box/save_file_from_object"> <Accordion title="BOX_SAVE_FILE_FROM_OBJECT">
**Description:** Save a file in Box. **Description:** Save a file in Box.
**Parameters:** **Parameters:**
- `file` (string, required): File - Accepts a File Object containing file data. Files must be smaller than 50MB in size. - `file` (string, required): File - Accepts a File Object containing file data. Files must be smaller than 50MB in size.
- `fileName` (string, required): File Name (example: "qwerty.png"). - `fileName` (string, required): File Name (example: "qwerty.png").
- `folder` (string, optional): Folder - Use Connect Portal Workflow Settings to allow users to select the File's Folder destination. Defaults to the user's root folder if left blank. - `folder` (string, optional): Folder - Use Connect Portal Workflow Settings to allow users to select the File's Folder destination. Defaults to the user's root folder if left blank.
</Accordion> </Accordion>
<Accordion title="box/get_file_by_id"> <Accordion title="BOX_GET_FILE_BY_ID">
**Description:** Get a file by ID in Box. **Description:** Get a file by ID in Box.
**Parameters:** **Parameters:**
- `fileId` (string, required): File ID - The unique identifier that represents a file. (example: "12345"). - `fileId` (string, required): File ID - The unique identifier that represents a file. (example: "12345").
</Accordion> </Accordion>
<Accordion title="box/list_files"> <Accordion title="BOX_LIST_FILES">
**Description:** List files in Box. **Description:** List files in Box.
**Parameters:** **Parameters:**
@@ -112,10 +91,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
] ]
} }
``` ```
</Accordion> </Accordion>
<Accordion title="box/create_folder"> <Accordion title="BOX_CREATE_FOLDER">
**Description:** Create a folder in Box. **Description:** Create a folder in Box.
**Parameters:** **Parameters:**
@@ -126,10 +104,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
"id": "123456" "id": "123456"
} }
``` ```
</Accordion> </Accordion>
<Accordion title="box/move_folder"> <Accordion title="BOX_MOVE_FOLDER">
**Description:** Move a folder in Box. **Description:** Move a folder in Box.
**Parameters:** **Parameters:**
@@ -141,18 +118,16 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
"id": "123456" "id": "123456"
} }
``` ```
</Accordion> </Accordion>
<Accordion title="box/get_folder_by_id"> <Accordion title="BOX_GET_FOLDER_BY_ID">
**Description:** Get a folder by ID in Box. **Description:** Get a folder by ID in Box.
**Parameters:** **Parameters:**
- `folderId` (string, required): Folder ID - The unique identifier that represents a folder. (example: "0"). - `folderId` (string, required): Folder ID - The unique identifier that represents a folder. (example: "0").
</Accordion> </Accordion>
<Accordion title="box/search_folders"> <Accordion title="BOX_SEARCH_FOLDERS">
**Description:** Search folders in Box. **Description:** Search folders in Box.
**Parameters:** **Parameters:**
@@ -175,16 +150,14 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
] ]
} }
``` ```
</Accordion> </Accordion>
<Accordion title="box/delete_folder"> <Accordion title="BOX_DELETE_FOLDER">
**Description:** Delete a folder in Box. **Description:** Delete a folder in Box.
**Parameters:** **Parameters:**
- `folderId` (string, required): Folder ID - The unique identifier that represents a folder. (example: "0"). - `folderId` (string, required): Folder ID - The unique identifier that represents a folder. (example: "0").
- `recursive` (boolean, optional): Recursive - Delete a folder that is not empty by recursively deleting the folder and all of its content. - `recursive` (boolean, optional): Recursive - Delete a folder that is not empty by recursively deleting the folder and all of its content.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -194,14 +167,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Box tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Box capabilities # Create an agent with Box capabilities
box_agent = Agent( box_agent = Agent(
role="Document Manager", role="Document Manager",
goal="Manage files and folders in Box efficiently", goal="Manage files and folders in Box efficiently",
backstory="An AI assistant specialized in document management and file organization.", backstory="An AI assistant specialized in document management and file organization.",
apps=['box'] # All Box actions will be available tools=[enterprise_tools]
) )
# Task to create a folder structure # Task to create a folder structure
@@ -223,14 +201,19 @@ crew.kickoff()
### Filtering Specific Box Tools ### Filtering Specific Box Tools
```python ```python
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get only specific Box tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["box_create_folder", "box_save_file", "box_list_files"]
)
# Create agent with specific Box actions only
file_organizer_agent = Agent( file_organizer_agent = Agent(
role="File Organizer", role="File Organizer",
goal="Organize and manage file storage efficiently", goal="Organize and manage file storage efficiently",
backstory="An AI assistant that focuses on file organization and storage management.", backstory="An AI assistant that focuses on file organization and storage management.",
apps=['box/create_folder', 'box/save_file', 'box/list_files'] # Specific Box actions tools=enterprise_tools
) )
# Task to organize files # Task to organize files
@@ -252,12 +235,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
file_manager = Agent( file_manager = Agent(
role="File Manager", role="File Manager",
goal="Maintain organized file structure and manage document lifecycle", goal="Maintain organized file structure and manage document lifecycle",
backstory="An experienced file manager who ensures documents are properly organized and accessible.", backstory="An experienced file manager who ensures documents are properly organized and accessible.",
apps=['box'] tools=[enterprise_tools]
) )
# Complex task involving multiple Box operations # Complex task involving multiple Box operations

View File

@@ -25,7 +25,7 @@ Before using the ClickUp integration, ensure you have:
2. Find **ClickUp** in the Authentication Integrations section 2. Find **ClickUp** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow 3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for task and project management 4. Grant the necessary permissions for task and project management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations) 5. Copy your Enterprise Token from [Account Settings](https://app.crewai.com/crewai_plus/settings/account)
### 2. Install Required Package ### 2. Install Required Package
@@ -33,28 +33,10 @@ Before using the ClickUp integration, ensure you have:
uv add crewai-tools uv add crewai-tools
``` ```
### 3. 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
```
## Available Actions ## Available Actions
<AccordionGroup> <AccordionGroup>
<Accordion title="clickup/search_tasks"> <Accordion title="CLICKUP_SEARCH_TASKS">
**Description:** Search for tasks in ClickUp using advanced filters. **Description:** Search for tasks in ClickUp using advanced filters.
**Parameters:** **Parameters:**
@@ -77,19 +59,17 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
} }
``` ```
Available fields: `space_ids%5B%5D`, `project_ids%5B%5D`, `list_ids%5B%5D`, `statuses%5B%5D`, `include_closed`, `assignees%5B%5D`, `tags%5B%5D`, `due_date_gt`, `due_date_lt`, `date_created_gt`, `date_created_lt`, `date_updated_gt`, `date_updated_lt` Available fields: `space_ids%5B%5D`, `project_ids%5B%5D`, `list_ids%5B%5D`, `statuses%5B%5D`, `include_closed`, `assignees%5B%5D`, `tags%5B%5D`, `due_date_gt`, `due_date_lt`, `date_created_gt`, `date_created_lt`, `date_updated_gt`, `date_updated_lt`
</Accordion> </Accordion>
<Accordion title="clickup/get_task_in_list"> <Accordion title="CLICKUP_GET_TASK_IN_LIST">
**Description:** Get tasks in a specific list in ClickUp. **Description:** Get tasks in a specific list in ClickUp.
**Parameters:** **Parameters:**
- `listId` (string, required): List - Select a List to get tasks from. Use Connect Portal User Settings to allow users to select a ClickUp List. - `listId` (string, required): List - Select a List to get tasks from. Use Connect Portal User Settings to allow users to select a ClickUp List.
- `taskFilterFormula` (string, optional): Search for tasks that match specified filters. For example: name=task1. - `taskFilterFormula` (string, optional): Search for tasks that match specified filters. For example: name=task1.
</Accordion> </Accordion>
<Accordion title="clickup/create_task"> <Accordion title="CLICKUP_CREATE_TASK">
**Description:** Create a task in ClickUp. **Description:** Create a task in ClickUp.
**Parameters:** **Parameters:**
@@ -100,10 +80,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `assignees` (string, optional): Assignees - Select a Member (or an array of member IDs) to be assigned to this task. Use Connect Portal User Settings to allow users to select a ClickUp Member. - `assignees` (string, optional): Assignees - Select a Member (or an array of member IDs) to be assigned to this task. Use Connect Portal User Settings to allow users to select a ClickUp Member.
- `dueDate` (string, optional): Due Date - Specify a date for this task to be due on. - `dueDate` (string, optional): Due Date - Specify a date for this task to be due on.
- `additionalFields` (string, optional): Additional Fields - Specify additional fields to include on this task as JSON. - `additionalFields` (string, optional): Additional Fields - Specify additional fields to include on this task as JSON.
</Accordion> </Accordion>
<Accordion title="clickup/update_task"> <Accordion title="CLICKUP_UPDATE_TASK">
**Description:** Update a task in ClickUp. **Description:** Update a task in ClickUp.
**Parameters:** **Parameters:**
@@ -115,62 +94,54 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `assignees` (string, optional): Assignees - Select a Member (or an array of member IDs) to be assigned to this task. Use Connect Portal User Settings to allow users to select a ClickUp Member. - `assignees` (string, optional): Assignees - Select a Member (or an array of member IDs) to be assigned to this task. Use Connect Portal User Settings to allow users to select a ClickUp Member.
- `dueDate` (string, optional): Due Date - Specify a date for this task to be due on. - `dueDate` (string, optional): Due Date - Specify a date for this task to be due on.
- `additionalFields` (string, optional): Additional Fields - Specify additional fields to include on this task as JSON. - `additionalFields` (string, optional): Additional Fields - Specify additional fields to include on this task as JSON.
</Accordion> </Accordion>
<Accordion title="clickup/delete_task"> <Accordion title="CLICKUP_DELETE_TASK">
**Description:** Delete a task in ClickUp. **Description:** Delete a task in ClickUp.
**Parameters:** **Parameters:**
- `taskId` (string, required): Task ID - The ID of the task to delete. - `taskId` (string, required): Task ID - The ID of the task to delete.
</Accordion> </Accordion>
<Accordion title="clickup/get_list"> <Accordion title="CLICKUP_GET_LIST">
**Description:** Get List information in ClickUp. **Description:** Get List information in ClickUp.
**Parameters:** **Parameters:**
- `spaceId` (string, required): Space ID - The ID of the space containing the lists. - `spaceId` (string, required): Space ID - The ID of the space containing the lists.
</Accordion> </Accordion>
<Accordion title="clickup/get_custom_fields_in_list"> <Accordion title="CLICKUP_GET_CUSTOM_FIELDS_IN_LIST">
**Description:** Get Custom Fields in a List in ClickUp. **Description:** Get Custom Fields in a List in ClickUp.
**Parameters:** **Parameters:**
- `listId` (string, required): List ID - The ID of the list to get custom fields from. - `listId` (string, required): List ID - The ID of the list to get custom fields from.
</Accordion> </Accordion>
<Accordion title="clickup/get_all_fields_in_list"> <Accordion title="CLICKUP_GET_ALL_FIELDS_IN_LIST">
**Description:** Get All Fields in a List in ClickUp. **Description:** Get All Fields in a List in ClickUp.
**Parameters:** **Parameters:**
- `listId` (string, required): List ID - The ID of the list to get all fields from. - `listId` (string, required): List ID - The ID of the list to get all fields from.
</Accordion> </Accordion>
<Accordion title="clickup/get_space"> <Accordion title="CLICKUP_GET_SPACE">
**Description:** Get Space information in ClickUp. **Description:** Get Space information in ClickUp.
**Parameters:** **Parameters:**
- `spaceId` (string, optional): Space ID - The ID of the space to retrieve. - `spaceId` (string, optional): Space ID - The ID of the space to retrieve.
</Accordion> </Accordion>
<Accordion title="clickup/get_folders"> <Accordion title="CLICKUP_GET_FOLDERS">
**Description:** Get Folders in ClickUp. **Description:** Get Folders in ClickUp.
**Parameters:** **Parameters:**
- `spaceId` (string, required): Space ID - The ID of the space containing the folders. - `spaceId` (string, required): Space ID - The ID of the space containing the folders.
</Accordion> </Accordion>
<Accordion title="clickup/get_member"> <Accordion title="CLICKUP_GET_MEMBER">
**Description:** Get Member information in ClickUp. **Description:** Get Member information in ClickUp.
**Parameters:** None required. **Parameters:** None required.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -180,14 +151,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Create an agent with Clickup capabilities # Get enterprise tools (ClickUp tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with ClickUp capabilities
clickup_agent = Agent( clickup_agent = Agent(
role="Task Manager", role="Task Manager",
goal="Manage tasks and projects in ClickUp efficiently", goal="Manage tasks and projects in ClickUp efficiently",
backstory="An AI assistant specialized in task management and productivity coordination.", backstory="An AI assistant specialized in task management and productivity coordination.",
apps=['clickup'] # All Clickup actions will be available tools=[enterprise_tools]
) )
# Task to create a new task # Task to create a new task
@@ -209,12 +185,19 @@ crew.kickoff()
### Filtering Specific ClickUp Tools ### Filtering Specific ClickUp Tools
```python ```python
from crewai_tools import CrewaiEnterpriseTools
# Get only specific ClickUp tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["clickup_create_task", "clickup_update_task", "clickup_search_tasks"]
)
task_coordinator = Agent( task_coordinator = Agent(
role="Task Coordinator", role="Task Coordinator",
goal="Create and manage tasks efficiently", goal="Create and manage tasks efficiently",
backstory="An AI assistant that focuses on task creation and status management.", backstory="An AI assistant that focuses on task creation and status management.",
apps=['clickup/create_task'] tools=enterprise_tools
) )
# Task to manage task workflow # Task to manage task workflow
@@ -236,12 +219,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
project_manager = Agent( project_manager = Agent(
role="Project Manager", role="Project Manager",
goal="Coordinate project activities and track team productivity", goal="Coordinate project activities and track team productivity",
backstory="An experienced project manager who ensures projects are delivered on time.", backstory="An experienced project manager who ensures projects are delivered on time.",
apps=['clickup'] tools=[enterprise_tools]
) )
# Complex task involving multiple ClickUp operations # Complex task involving multiple ClickUp operations
@@ -268,12 +256,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
task_analyst = Agent( task_analyst = Agent(
role="Task Analyst", role="Task Analyst",
goal="Analyze task patterns and optimize team productivity", goal="Analyze task patterns and optimize team productivity",
backstory="An AI assistant that analyzes task data to improve team efficiency.", backstory="An AI assistant that analyzes task data to improve team efficiency.",
apps=['clickup'] tools=[enterprise_tools]
) )
# Task to analyze and optimize task distribution # Task to analyze and optimize task distribution
@@ -297,6 +290,5 @@ crew.kickoff()
### Getting Help ### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with ClickUp integration setup or Contact our support team for assistance with ClickUp integration setup or troubleshooting.
troubleshooting.
</Card> </Card>

View File

@@ -25,7 +25,7 @@ Before using the GitHub integration, ensure you have:
2. Find **GitHub** in the Authentication Integrations section 2. Find **GitHub** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow 3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for repository and issue management 4. Grant the necessary permissions for repository and issue management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations) 5. Copy your Enterprise Token from [Account Settings](https://app.crewai.com/crewai_plus/settings/account)
### 2. Install Required Package ### 2. Install Required Package
@@ -33,28 +33,10 @@ Before using the GitHub integration, ensure you have:
uv add crewai-tools uv add crewai-tools
``` ```
### 3. 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
```
## Available Actions ## Available Actions
<AccordionGroup> <AccordionGroup>
<Accordion title="github/create_issue"> <Accordion title="GITHUB_CREATE_ISSUE">
**Description:** Create an issue in GitHub. **Description:** Create an issue in GitHub.
**Parameters:** **Parameters:**
@@ -63,10 +45,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `title` (string, required): Issue Title - Specify the title of the issue to create. - `title` (string, required): Issue Title - Specify the title of the issue to create.
- `body` (string, optional): Issue Body - Specify the body contents of the issue to create. - `body` (string, optional): Issue Body - Specify the body contents of the issue to create.
- `assignees` (string, optional): Assignees - Specify the assignee(s)' GitHub login as an array of strings for this issue. (example: `["octocat"]`). - `assignees` (string, optional): Assignees - Specify the assignee(s)' GitHub login as an array of strings for this issue. (example: `["octocat"]`).
</Accordion> </Accordion>
<Accordion title="github/update_issue"> <Accordion title="GITHUB_UPDATE_ISSUE">
**Description:** Update an issue in GitHub. **Description:** Update an issue in GitHub.
**Parameters:** **Parameters:**
@@ -78,20 +59,18 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `assignees` (string, optional): Assignees - Specify the assignee(s)' GitHub login as an array of strings for this issue. (example: `["octocat"]`). - `assignees` (string, optional): Assignees - Specify the assignee(s)' GitHub login as an array of strings for this issue. (example: `["octocat"]`).
- `state` (string, optional): State - Specify the updated state of the issue. - `state` (string, optional): State - Specify the updated state of the issue.
- Options: `open`, `closed` - Options: `open`, `closed`
</Accordion> </Accordion>
<Accordion title="github/get_issue_by_number"> <Accordion title="GITHUB_GET_ISSUE_BY_NUMBER">
**Description:** Get an issue by number in GitHub. **Description:** Get an issue by number in GitHub.
**Parameters:** **Parameters:**
- `owner` (string, required): Owner - Specify the name of the account owner of the associated repository for this Issue. (example: "abc"). - `owner` (string, required): Owner - Specify the name of the account owner of the associated repository for this Issue. (example: "abc").
- `repo` (string, required): Repository - Specify the name of the associated repository for this Issue. - `repo` (string, required): Repository - Specify the name of the associated repository for this Issue.
- `issue_number` (string, required): Issue Number - Specify the number of the issue to fetch. - `issue_number` (string, required): Issue Number - Specify the number of the issue to fetch.
</Accordion> </Accordion>
<Accordion title="github/lock_issue"> <Accordion title="GITHUB_LOCK_ISSUE">
**Description:** Lock an issue in GitHub. **Description:** Lock an issue in GitHub.
**Parameters:** **Parameters:**
@@ -100,10 +79,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `issue_number` (string, required): Issue Number - Specify the number of the issue to lock. - `issue_number` (string, required): Issue Number - Specify the number of the issue to lock.
- `lock_reason` (string, required): Lock Reason - Specify a reason for locking the issue or pull request conversation. - `lock_reason` (string, required): Lock Reason - Specify a reason for locking the issue or pull request conversation.
- Options: `off-topic`, `too heated`, `resolved`, `spam` - Options: `off-topic`, `too heated`, `resolved`, `spam`
</Accordion> </Accordion>
<Accordion title="github/search_issue"> <Accordion title="GITHUB_SEARCH_ISSUE">
**Description:** Search for issues in GitHub. **Description:** Search for issues in GitHub.
**Parameters:** **Parameters:**
@@ -128,10 +106,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
} }
``` ```
Available fields: `assignee`, `creator`, `mentioned`, `labels` Available fields: `assignee`, `creator`, `mentioned`, `labels`
</Accordion> </Accordion>
<Accordion title="github/create_release"> <Accordion title="GITHUB_CREATE_RELEASE">
**Description:** Create a release in GitHub. **Description:** Create a release in GitHub.
**Parameters:** **Parameters:**
@@ -147,10 +124,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `discussion_category_name` (string, optional): Discussion Category Name - If specified, a discussion of the specified category is created and linked to the release. The value must be a category that already exists in the repository. - `discussion_category_name` (string, optional): Discussion Category Name - If specified, a discussion of the specified category is created and linked to the release. The value must be a category that already exists in the repository.
- `generate_release_notes` (string, optional): Release Notes - Specify whether the created release should automatically create release notes using the provided name and body specified. - `generate_release_notes` (string, optional): Release Notes - Specify whether the created release should automatically create release notes using the provided name and body specified.
- Options: `true`, `false` - Options: `true`, `false`
</Accordion> </Accordion>
<Accordion title="github/update_release"> <Accordion title="GITHUB_UPDATE_RELEASE">
**Description:** Update a release in GitHub. **Description:** Update a release in GitHub.
**Parameters:** **Parameters:**
@@ -167,37 +143,33 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `discussion_category_name` (string, optional): Discussion Category Name - If specified, a discussion of the specified category is created and linked to the release. The value must be a category that already exists in the repository. - `discussion_category_name` (string, optional): Discussion Category Name - If specified, a discussion of the specified category is created and linked to the release. The value must be a category that already exists in the repository.
- `generate_release_notes` (string, optional): Release Notes - Specify whether the created release should automatically create release notes using the provided name and body specified. - `generate_release_notes` (string, optional): Release Notes - Specify whether the created release should automatically create release notes using the provided name and body specified.
- Options: `true`, `false` - Options: `true`, `false`
</Accordion> </Accordion>
<Accordion title="github/get_release_by_id"> <Accordion title="GITHUB_GET_RELEASE_BY_ID">
**Description:** Get a release by ID in GitHub. **Description:** Get a release by ID in GitHub.
**Parameters:** **Parameters:**
- `owner` (string, required): Owner - Specify the name of the account owner of the associated repository for this Release. (example: "abc"). - `owner` (string, required): Owner - Specify the name of the account owner of the associated repository for this Release. (example: "abc").
- `repo` (string, required): Repository - Specify the name of the associated repository for this Release. - `repo` (string, required): Repository - Specify the name of the associated repository for this Release.
- `id` (string, required): Release ID - Specify the release ID of the release to fetch. - `id` (string, required): Release ID - Specify the release ID of the release to fetch.
</Accordion> </Accordion>
<Accordion title="github/get_release_by_tag_name"> <Accordion title="GITHUB_GET_RELEASE_BY_TAG_NAME">
**Description:** Get a release by tag name in GitHub. **Description:** Get a release by tag name in GitHub.
**Parameters:** **Parameters:**
- `owner` (string, required): Owner - Specify the name of the account owner of the associated repository for this Release. (example: "abc"). - `owner` (string, required): Owner - Specify the name of the account owner of the associated repository for this Release. (example: "abc").
- `repo` (string, required): Repository - Specify the name of the associated repository for this Release. - `repo` (string, required): Repository - Specify the name of the associated repository for this Release.
- `tag_name` (string, required): Name - Specify the tag of the release to fetch. (example: "v1.0.0"). - `tag_name` (string, required): Name - Specify the tag of the release to fetch. (example: "v1.0.0").
</Accordion> </Accordion>
<Accordion title="github/delete_release"> <Accordion title="GITHUB_DELETE_RELEASE">
**Description:** Delete a release in GitHub. **Description:** Delete a release in GitHub.
**Parameters:** **Parameters:**
- `owner` (string, required): Owner - Specify the name of the account owner of the associated repository for this Release. (example: "abc"). - `owner` (string, required): Owner - Specify the name of the account owner of the associated repository for this Release. (example: "abc").
- `repo` (string, required): Repository - Specify the name of the associated repository for this Release. - `repo` (string, required): Repository - Specify the name of the associated repository for this Release.
- `id` (string, required): Release ID - Specify the ID of the release to delete. - `id` (string, required): Release ID - Specify the ID of the release to delete.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -207,14 +179,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Create an agent with Github capabilities # Get enterprise tools (GitHub tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with GitHub capabilities
github_agent = Agent( github_agent = Agent(
role="Repository Manager", role="Repository Manager",
goal="Manage GitHub repositories, issues, and releases efficiently", goal="Manage GitHub repositories, issues, and releases efficiently",
backstory="An AI assistant specialized in repository management and issue tracking.", backstory="An AI assistant specialized in repository management and issue tracking.",
apps=['github'] # All Github actions will be available tools=[enterprise_tools]
) )
# Task to create a new issue # Task to create a new issue
@@ -236,12 +213,19 @@ crew.kickoff()
### Filtering Specific GitHub Tools ### Filtering Specific GitHub Tools
```python ```python
from crewai_tools import CrewaiEnterpriseTools
# Get only specific GitHub tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["github_create_issue", "github_update_issue", "github_search_issue"]
)
issue_manager = Agent( issue_manager = Agent(
role="Issue Manager", role="Issue Manager",
goal="Create and manage GitHub issues efficiently", goal="Create and manage GitHub issues efficiently",
backstory="An AI assistant that focuses on issue tracking and management.", backstory="An AI assistant that focuses on issue tracking and management.",
apps=['github/create_issue'] tools=enterprise_tools
) )
# Task to manage issue workflow # Task to manage issue workflow
@@ -263,12 +247,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
release_manager = Agent( release_manager = Agent(
role="Release Manager", role="Release Manager",
goal="Manage software releases and versioning", goal="Manage software releases and versioning",
backstory="An experienced release manager who handles version control and release processes.", backstory="An experienced release manager who handles version control and release processes.",
apps=['github'] tools=[enterprise_tools]
) )
# Task to create a new release # Task to create a new release
@@ -295,12 +284,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
project_coordinator = Agent( project_coordinator = Agent(
role="Project Coordinator", role="Project Coordinator",
goal="Track and coordinate project issues and development progress", goal="Track and coordinate project issues and development progress",
backstory="An AI assistant that helps coordinate development work and track project progress.", backstory="An AI assistant that helps coordinate development work and track project progress.",
apps=['github'] tools=[enterprise_tools]
) )
# Complex task involving multiple GitHub operations # Complex task involving multiple GitHub operations
@@ -326,6 +320,5 @@ crew.kickoff()
### Getting Help ### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with GitHub integration setup or Contact our support team for assistance with GitHub integration setup or troubleshooting.
troubleshooting.
</Card> </Card>

View File

@@ -25,7 +25,7 @@ Before using the Gmail integration, ensure you have:
2. Find **Gmail** in the Authentication Integrations section 2. Find **Gmail** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow 3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for email and contact management 4. Grant the necessary permissions for email and contact management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations) 5. Copy your Enterprise Token from [Account Settings](https://app.crewai.com/crewai_plus/settings/account)
### 2. Install Required Package ### 2. Install Required Package
@@ -33,134 +33,141 @@ Before using the Gmail integration, ensure you have:
uv add crewai-tools uv add crewai-tools
``` ```
### 3. 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
```
## Available Actions ## Available Actions
<AccordionGroup> <AccordionGroup>
<Accordion title="gmail/fetch_emails"> <Accordion title="GMAIL_SEND_EMAIL">
**Description:** Retrieve a list of messages. **Description:** Send an email in Gmail.
**Parameters:** **Parameters:**
- `userId` (string, required): The user's email address or 'me' for the authenticated user. (default: "me") - `toRecipients` (array, required): To - Specify the recipients as either a single string or a JSON array.
- `q` (string, optional): Search query to filter messages (e.g., 'from:someone@example.com is:unread'). ```json
- `maxResults` (integer, optional): Maximum number of messages to return (1-500). (default: 100) [
- `pageToken` (string, optional): Page token to retrieve a specific page of results. "recipient1@domain.com",
- `labelIds` (array, optional): Only return messages with labels that match all of the specified label IDs. "recipient2@domain.com"
- `includeSpamTrash` (boolean, optional): Include messages from SPAM and TRASH in the results. (default: false) ]
```
- `from` (string, required): From - Specify the email of the sender.
- `subject` (string, required): Subject - Specify the subject of the message.
- `messageContent` (string, required): Message Content - Specify the content of the email message as plain text or HTML.
- `attachments` (string, optional): Attachments - Accepts either a single file object or a JSON array of file objects.
- `additionalHeaders` (object, optional): Additional Headers - Specify any additional header fields here.
```json
{
"reply-to": "Sender Name <sender@domain.com>"
}
```
</Accordion> </Accordion>
<Accordion title="gmail/send_email"> <Accordion title="GMAIL_GET_EMAIL_BY_ID">
**Description:** Send an email. **Description:** Get an email by ID in Gmail.
**Parameters:** **Parameters:**
- `to` (string, required): Recipient email address. - `userId` (string, required): User ID - Specify the user's email address. (example: "user@domain.com").
- `subject` (string, required): Email subject line. - `messageId` (string, required): Message ID - Specify the ID of the message to retrieve.
- `body` (string, required): Email message content.
- `userId` (string, optional): The user's email address or 'me' for the authenticated user. (default: "me")
- `cc` (string, optional): CC email addresses (comma-separated).
- `bcc` (string, optional): BCC email addresses (comma-separated).
- `from` (string, optional): Sender email address (if different from authenticated user).
- `replyTo` (string, optional): Reply-to email address.
- `threadId` (string, optional): Thread ID if replying to an existing conversation.
</Accordion> </Accordion>
<Accordion title="gmail/delete_email"> <Accordion title="GMAIL_SEARCH_FOR_EMAIL">
**Description:** Delete an email by ID. **Description:** Search for emails in Gmail using advanced filters.
**Parameters:** **Parameters:**
- `userId` (string, required): The user's email address or 'me' for the authenticated user. - `emailFilterFormula` (object, optional): A filter in disjunctive normal form - OR of AND groups of single conditions.
- `id` (string, required): The ID of the message to delete. ```json
{
"operator": "OR",
"conditions": [
{
"operator": "AND",
"conditions": [
{
"field": "from",
"operator": "$stringContains",
"value": "example@domain.com"
}
]
}
]
}
```
Available fields: `from`, `to`, `date`, `label`, `subject`, `cc`, `bcc`, `category`, `deliveredto:`, `size`, `filename`, `older_than`, `newer_than`, `list`, `is:important`, `is:unread`, `is:snoozed`, `is:starred`, `is:read`, `has:drive`, `has:document`, `has:spreadsheet`, `has:presentation`, `has:attachment`, `has:youtube`, `has:userlabels`
- `paginationParameters` (object, optional): Pagination Parameters.
```json
{
"pageCursor": "page_cursor_string"
}
```
</Accordion> </Accordion>
<Accordion title="gmail/create_draft"> <Accordion title="GMAIL_DELETE_EMAIL">
**Description:** Create a new draft email. **Description:** Delete an email in Gmail.
**Parameters:** **Parameters:**
- `userId` (string, required): The user's email address or 'me' for the authenticated user. - `userId` (string, required): User ID - Specify the user's email address. (example: "user@domain.com").
- `message` (object, required): Message object containing the draft content. - `messageId` (string, required): Message ID - Specify the ID of the message to trash.
- `raw` (string, required): Base64url encoded email message.
</Accordion> </Accordion>
<Accordion title="gmail/get_message"> <Accordion title="GMAIL_CREATE_A_CONTACT">
**Description:** Retrieve a specific message by ID. **Description:** Create a contact in Gmail.
**Parameters:** **Parameters:**
- `userId` (string, required): The user's email address or 'me' for the authenticated user. (default: "me") - `givenName` (string, required): Given Name - Specify the Given Name of the Contact to create. (example: "John").
- `id` (string, required): The ID of the message to retrieve. - `familyName` (string, required): Family Name - Specify the Family Name of the Contact to create. (example: "Doe").
- `format` (string, optional): The format to return the message in. Options: "full", "metadata", "minimal", "raw". (default: "full") - `email` (string, required): Email - Specify the Email Address of the Contact to create.
- `metadataHeaders` (array, optional): When given and format is METADATA, only include headers specified. - `additionalFields` (object, optional): Additional Fields - Additional contact information.
```json
{
"addresses": [
{
"streetAddress": "1000 North St.",
"city": "Los Angeles"
}
]
}
```
</Accordion> </Accordion>
<Accordion title="gmail/get_attachment"> <Accordion title="GMAIL_GET_CONTACT_BY_RESOURCE_NAME">
**Description:** Retrieve a message attachment. **Description:** Get a contact by resource name in Gmail.
**Parameters:** **Parameters:**
- `userId` (string, required): The user's email address or 'me' for the authenticated user. (default: "me") - `resourceName` (string, required): Resource Name - Specify the resource name of the contact to fetch.
- `messageId` (string, required): The ID of the message containing the attachment.
- `id` (string, required): The ID of the attachment to retrieve.
</Accordion> </Accordion>
<Accordion title="gmail/fetch_thread"> <Accordion title="GMAIL_SEARCH_FOR_CONTACT">
**Description:** Retrieve a specific email thread by ID. **Description:** Search for a contact in Gmail.
**Parameters:** **Parameters:**
- `userId` (string, required): The user's email address or 'me' for the authenticated user. (default: "me") - `searchTerm` (string, required): Term - Specify a search term to search for near or exact matches on the names, nickNames, emailAddresses, phoneNumbers, or organizations Contact properties.
- `id` (string, required): The ID of the thread to retrieve.
- `format` (string, optional): The format to return the messages in. Options: "full", "metadata", "minimal". (default: "full")
- `metadataHeaders` (array, optional): When given and format is METADATA, only include headers specified.
</Accordion> </Accordion>
<Accordion title="gmail/modify_thread"> <Accordion title="GMAIL_DELETE_CONTACT">
**Description:** Modify the labels applied to a thread. **Description:** Delete a contact in Gmail.
**Parameters:** **Parameters:**
- `userId` (string, required): The user's email address or 'me' for the authenticated user. (default: "me") - `resourceName` (string, required): Resource Name - Specify the resource name of the contact to delete.
- `id` (string, required): The ID of the thread to modify.
- `addLabelIds` (array, optional): A list of IDs of labels to add to this thread.
- `removeLabelIds` (array, optional): A list of IDs of labels to remove from this thread.
</Accordion> </Accordion>
<Accordion title="gmail/trash_thread"> <Accordion title="GMAIL_CREATE_DRAFT">
**Description:** Move a thread to the trash. **Description:** Create a draft in Gmail.
**Parameters:** **Parameters:**
- `userId` (string, required): The user's email address or 'me' for the authenticated user. (default: "me") - `toRecipients` (array, optional): To - Specify the recipients as either a single string or a JSON array.
- `id` (string, required): The ID of the thread to trash. ```json
[
</Accordion> "recipient1@domain.com",
"recipient2@domain.com"
<Accordion title="gmail/untrash_thread"> ]
**Description:** Remove a thread from the trash. ```
- `from` (string, optional): From - Specify the email of the sender.
**Parameters:** - `subject` (string, optional): Subject - Specify the subject of the message.
- `userId` (string, required): The user's email address or 'me' for the authenticated user. (default: "me") - `messageContent` (string, optional): Message Content - Specify the content of the email message as plain text or HTML.
- `id` (string, required): The ID of the thread to untrash. - `attachments` (string, optional): Attachments - Accepts either a single file object or a JSON array of file objects.
- `additionalHeaders` (object, optional): Additional Headers - Specify any additional header fields here.
```json
{
"reply-to": "Sender Name <sender@domain.com>"
}
```
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -170,13 +177,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Gmail tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Gmail capabilities # Create an agent with Gmail capabilities
gmail_agent = Agent( gmail_agent = Agent(
role="Email Manager", role="Email Manager",
goal="Manage email communications and messages efficiently", goal="Manage email communications and contacts efficiently",
backstory="An AI assistant specialized in email management and communication.", backstory="An AI assistant specialized in email management and communication.",
apps=['gmail'] # All Gmail actions will be available tools=[enterprise_tools]
) )
# Task to send a follow-up email # Task to send a follow-up email
@@ -198,18 +211,19 @@ crew.kickoff()
### Filtering Specific Gmail Tools ### Filtering Specific Gmail Tools
```python ```python
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get only specific Gmail tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["gmail_send_email", "gmail_search_for_email", "gmail_create_draft"]
)
# Create agent with specific Gmail actions only
email_coordinator = Agent( email_coordinator = Agent(
role="Email Coordinator", role="Email Coordinator",
goal="Coordinate email communications and manage drafts", goal="Coordinate email communications and manage drafts",
backstory="An AI assistant that focuses on email coordination and draft management.", backstory="An AI assistant that focuses on email coordination and draft management.",
apps=[ tools=enterprise_tools
'gmail/send_email',
'gmail/fetch_emails',
'gmail/create_draft'
]
) )
# Task to prepare and send emails # Task to prepare and send emails
@@ -227,17 +241,57 @@ crew = Crew(
crew.kickoff() crew.kickoff()
``` ```
### Contact Management
```python
from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
contact_manager = Agent(
role="Contact Manager",
goal="Manage and organize email contacts efficiently",
backstory="An experienced contact manager who maintains organized contact databases.",
tools=[enterprise_tools]
)
# Task to manage contacts
contact_task = Task(
description="""
1. Search for contacts from the 'example.com' domain
2. Create new contacts for recent email senders not in the contact list
3. Update contact information with recent interaction data
""",
agent=contact_manager,
expected_output="Contact database updated with new contacts and recent interactions"
)
crew = Crew(
agents=[contact_manager],
tasks=[contact_task]
)
crew.kickoff()
```
### Email Search and Analysis ### Email Search and Analysis
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create agent with Gmail search and analysis capabilities
email_analyst = Agent( email_analyst = Agent(
role="Email Analyst", role="Email Analyst",
goal="Analyze email patterns and provide insights", goal="Analyze email patterns and provide insights",
backstory="An AI assistant that analyzes email data to provide actionable insights.", backstory="An AI assistant that analyzes email data to provide actionable insights.",
apps=['gmail/fetch_emails', 'gmail/get_message'] # Specific actions for email analysis tools=[enterprise_tools]
) )
# Task to analyze email patterns # Task to analyze email patterns
@@ -259,37 +313,38 @@ crew = Crew(
crew.kickoff() crew.kickoff()
``` ```
### Thread Management ### Automated Email Workflows
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
# Create agent with Gmail thread management capabilities enterprise_tools = CrewaiEnterpriseTools(
thread_manager = Agent( enterprise_token="your_enterprise_token"
role="Thread Manager",
goal="Organize and manage email threads efficiently",
backstory="An AI assistant that specializes in email thread organization and management.",
apps=[
'gmail/fetch_thread',
'gmail/modify_thread',
'gmail/trash_thread'
]
) )
# Task to organize email threads workflow_manager = Agent(
thread_task = Task( role="Email Workflow Manager",
goal="Automate email workflows and responses",
backstory="An AI assistant that manages automated email workflows and responses.",
tools=[enterprise_tools]
)
# Complex task involving multiple Gmail operations
workflow_task = Task(
description=""" description="""
1. Fetch all threads from the last month 1. Search for emails with 'urgent' in the subject from the last 24 hours
2. Apply appropriate labels to organize threads by project 2. Create draft responses for each urgent email
3. Archive or trash threads that are no longer relevant 3. Send automated acknowledgment emails to senders
4. Create a summary report of urgent items requiring attention
""", """,
agent=thread_manager, agent=workflow_manager,
expected_output="Email threads organized with appropriate labels and cleanup completed" expected_output="Urgent emails processed with automated responses and summary report"
) )
crew = Crew( crew = Crew(
agents=[thread_manager], agents=[workflow_manager],
tasks=[thread_task] tasks=[workflow_task]
) )
crew.kickoff() crew.kickoff()
@@ -298,6 +353,5 @@ crew.kickoff()
### Getting Help ### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Gmail integration setup or Contact our support team for assistance with Gmail integration setup or troubleshooting.
troubleshooting.
</Card> </Card>

View File

@@ -24,8 +24,8 @@ Before using the Google Calendar integration, ensure you have:
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors) 1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Google Calendar** in the Authentication Integrations section 2. Find **Google Calendar** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow 3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for calendar access 4. Grant the necessary permissions for calendar and contact access
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations) 5. Copy your Enterprise Token from [Account Settings](https://app.crewai.com/crewai_plus/settings/account)
### 2. Install Required Package ### 2. Install Required Package
@@ -33,148 +33,144 @@ Before using the Google Calendar integration, ensure you have:
uv add crewai-tools uv add crewai-tools
``` ```
### 3. 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
```
## Available Actions ## Available Actions
<AccordionGroup> <AccordionGroup>
<Accordion title="google_calendar/get_availability"> <Accordion title="GOOGLE_CALENDAR_CREATE_EVENT">
**Description:** Get calendar availability (free/busy information). **Description:** Create an event in Google Calendar.
**Parameters:** **Parameters:**
- `timeMin` (string, required): Start time (RFC3339 format) - `eventName` (string, required): Event name.
- `timeMax` (string, required): End time (RFC3339 format) - `startTime` (string, required): Start time - Accepts Unix timestamp or ISO8601 date formats.
- `items` (array, required): Calendar IDs to check - `endTime` (string, optional): End time - Defaults to one hour after the start time if left blank.
- `calendar` (string, optional): Calendar - Use Connect Portal Workflow Settings to allow users to select which calendar the event will be added to. Defaults to the user's primary calendar if left blank.
- `attendees` (string, optional): Attendees - Accepts an array of email addresses or email addresses separated by commas.
- `eventLocation` (string, optional): Event location.
- `eventDescription` (string, optional): Event description.
- `eventId` (string, optional): Event ID - An ID from your application to associate this event with. You can use this ID to sync updates to this event later.
- `includeMeetLink` (boolean, optional): Include Google Meet link? - Automatically creates Google Meet conference link for this event.
</Accordion>
<Accordion title="GOOGLE_CALENDAR_UPDATE_EVENT">
**Description:** Update an existing event in Google Calendar.
**Parameters:**
- `eventId` (string, required): Event ID - The ID of the event to update.
- `eventName` (string, optional): Event name.
- `startTime` (string, optional): Start time - Accepts Unix timestamp or ISO8601 date formats.
- `endTime` (string, optional): End time - Defaults to one hour after the start time if left blank.
- `calendar` (string, optional): Calendar - Use Connect Portal Workflow Settings to allow users to select which calendar the event will be added to. Defaults to the user's primary calendar if left blank.
- `attendees` (string, optional): Attendees - Accepts an array of email addresses or email addresses separated by commas.
- `eventLocation` (string, optional): Event location.
- `eventDescription` (string, optional): Event description.
</Accordion>
<Accordion title="GOOGLE_CALENDAR_LIST_EVENTS">
**Description:** List events from Google Calendar.
**Parameters:**
- `calendar` (string, optional): Calendar - Use Connect Portal Workflow Settings to allow users to select which calendar the event will be added to. Defaults to the user's primary calendar if left blank.
- `after` (string, optional): After - Filters events that start after the provided date (Unix in milliseconds or ISO timestamp). (example: "2025-04-12T10:00:00Z or 1712908800000").
- `before` (string, optional): Before - Filters events that end before the provided date (Unix in milliseconds or ISO timestamp). (example: "2025-04-12T10:00:00Z or 1712908800000").
</Accordion>
<Accordion title="GOOGLE_CALENDAR_GET_EVENT_BY_ID">
**Description:** Get a specific event by ID from Google Calendar.
**Parameters:**
- `eventId` (string, required): Event ID.
- `calendar` (string, optional): Calendar - Use Connect Portal Workflow Settings to allow users to select which calendar the event will be added to. Defaults to the user's primary calendar if left blank.
</Accordion>
<Accordion title="GOOGLE_CALENDAR_DELETE_EVENT">
**Description:** Delete an event from Google Calendar.
**Parameters:**
- `eventId` (string, required): Event ID - The ID of the calendar event to be deleted.
- `calendar` (string, optional): Calendar - Use Connect Portal Workflow Settings to allow users to select which calendar the event will be added to. Defaults to the user's primary calendar if left blank.
</Accordion>
<Accordion title="GOOGLE_CALENDAR_GET_CONTACTS">
**Description:** Get contacts from Google Calendar.
**Parameters:**
- `paginationParameters` (object, optional): Pagination Parameters.
```json
{
"pageCursor": "page_cursor_string"
}
```
</Accordion>
<Accordion title="GOOGLE_CALENDAR_SEARCH_CONTACTS">
**Description:** Search for contacts in Google Calendar.
**Parameters:**
- `query` (string, optional): Search query to search contacts.
</Accordion>
<Accordion title="GOOGLE_CALENDAR_LIST_DIRECTORY_PEOPLE">
**Description:** List directory people.
**Parameters:**
- `paginationParameters` (object, optional): Pagination Parameters.
```json
{
"pageCursor": "page_cursor_string"
}
```
</Accordion>
<Accordion title="GOOGLE_CALENDAR_SEARCH_DIRECTORY_PEOPLE">
**Description:** Search directory people.
**Parameters:**
- `query` (string, required): Search query to search contacts.
- `paginationParameters` (object, optional): Pagination Parameters.
```json
{
"pageCursor": "page_cursor_string"
}
```
</Accordion>
<Accordion title="GOOGLE_CALENDAR_LIST_OTHER_CONTACTS">
**Description:** List other contacts.
**Parameters:**
- `paginationParameters` (object, optional): Pagination Parameters.
```json
{
"pageCursor": "page_cursor_string"
}
```
</Accordion>
<Accordion title="GOOGLE_CALENDAR_SEARCH_OTHER_CONTACTS">
**Description:** Search other contacts.
**Parameters:**
- `query` (string, optional): Search query to search contacts.
</Accordion>
<Accordion title="GOOGLE_CALENDAR_GET_AVAILABILITY">
**Description:** Get availability information for calendars.
**Parameters:**
- `timeMin` (string, required): The start of the interval. In ISO format.
- `timeMax` (string, required): The end of the interval. In ISO format.
- `timeZone` (string, optional): Time zone used in the response. Optional. The default is UTC.
- `items` (array, optional): List of calendars and/or groups to query. Defaults to the user default calendar.
```json ```json
[ [
{ {
"id": "calendar_id" "id": "calendar_id_1"
} },
]
```
- `timeZone` (string, optional): Time zone used in the response. The default is UTC.
- `groupExpansionMax` (integer, optional): Maximal number of calendar identifiers to be provided for a single group. Maximum: 100
- `calendarExpansionMax` (integer, optional): Maximal number of calendars for which FreeBusy information is to be provided. Maximum: 50
</Accordion>
<Accordion title="google_calendar/create_event">
**Description:** Create a new event in the specified calendar.
**Parameters:**
- `calendarId` (string, required): Calendar ID (use 'primary' for main calendar)
- `summary` (string, required): Event title/summary
- `start_dateTime` (string, required): Start time in RFC3339 format (e.g., 2024-01-20T10:00:00-07:00)
- `end_dateTime` (string, required): End time in RFC3339 format
- `description` (string, optional): Event description
- `timeZone` (string, optional): Time zone (e.g., America/Los_Angeles)
- `location` (string, optional): Geographic location of the event as free-form text.
- `attendees` (array, optional): List of attendees for the event.
```json
[
{ {
"email": "attendee@example.com", "id": "calendar_id_2"
"displayName": "Attendee Name",
"optional": false
} }
] ]
``` ```
- `reminders` (object, optional): Information about the event's reminders.
```json
{
"useDefault": true,
"overrides": [
{
"method": "email",
"minutes": 15
}
]
}
```
- `conferenceData` (object, optional): The conference-related information, such as details of a Google Meet conference.
```json
{
"createRequest": {
"requestId": "unique-request-id",
"conferenceSolutionKey": {
"type": "hangoutsMeet"
}
}
}
```
- `visibility` (string, optional): Visibility of the event. Options: default, public, private, confidential. Default: default
- `transparency` (string, optional): Whether the event blocks time on the calendar. Options: opaque, transparent. Default: opaque
</Accordion>
<Accordion title="google_calendar/view_events">
**Description:** Retrieve events for the specified calendar.
**Parameters:**
- `calendarId` (string, required): Calendar ID (use 'primary' for main calendar)
- `timeMin` (string, optional): Lower bound for events (RFC3339)
- `timeMax` (string, optional): Upper bound for events (RFC3339)
- `maxResults` (integer, optional): Maximum number of events (default 10). Minimum: 1, Maximum: 2500
- `orderBy` (string, optional): The order of the events returned in the result. Options: startTime, updated. Default: startTime
- `singleEvents` (boolean, optional): Whether to expand recurring events into instances and only return single one-off events and instances of recurring events. Default: true
- `showDeleted` (boolean, optional): Whether to include deleted events (with status equals cancelled) in the result. Default: false
- `showHiddenInvitations` (boolean, optional): Whether to include hidden invitations in the result. Default: false
- `q` (string, optional): Free text search terms to find events that match these terms in any field.
- `pageToken` (string, optional): Token specifying which result page to return.
- `timeZone` (string, optional): Time zone used in the response.
- `updatedMin` (string, optional): Lower bound for an event's last modification time (RFC3339) to filter by.
- `iCalUID` (string, optional): Specifies an event ID in the iCalendar format to be provided in the response.
</Accordion>
<Accordion title="google_calendar/update_event">
**Description:** Update an existing event.
**Parameters:**
- `calendarId` (string, required): Calendar ID
- `eventId` (string, required): Event ID to update
- `summary` (string, optional): Updated event title
- `description` (string, optional): Updated event description
- `start_dateTime` (string, optional): Updated start time
- `end_dateTime` (string, optional): Updated end time
</Accordion>
<Accordion title="google_calendar/delete_event">
**Description:** Delete a specified event.
**Parameters:**
- `calendarId` (string, required): Calendar ID
- `eventId` (string, required): Event ID to delete
</Accordion>
<Accordion title="google_calendar/view_calendar_list">
**Description:** Retrieve user's calendar list.
**Parameters:**
- `maxResults` (integer, optional): Maximum number of entries returned on one result page. Minimum: 1
- `pageToken` (string, optional): Token specifying which result page to return.
- `showDeleted` (boolean, optional): Whether to include deleted calendar list entries in the result. Default: false
- `showHidden` (boolean, optional): Whether to show hidden entries. Default: false
- `minAccessRole` (string, optional): The minimum access role for the user in the returned entries. Options: freeBusyReader, owner, reader, writer
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -184,13 +180,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Google Calendar tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Google Calendar capabilities # Create an agent with Google Calendar capabilities
calendar_agent = Agent( calendar_agent = Agent(
role="Schedule Manager", role="Schedule Manager",
goal="Manage calendar events and scheduling efficiently", goal="Manage calendar events and scheduling efficiently",
backstory="An AI assistant specialized in calendar management and scheduling coordination.", backstory="An AI assistant specialized in calendar management and scheduling coordination.",
apps=['google_calendar'] # All Google Calendar actions will be available tools=[enterprise_tools]
) )
# Task to create a meeting # Task to create a meeting
@@ -212,11 +214,19 @@ crew.kickoff()
### Filtering Specific Calendar Tools ### Filtering Specific Calendar Tools
```python ```python
from crewai_tools import CrewaiEnterpriseTools
# Get only specific Google Calendar tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["google_calendar_create_event", "google_calendar_list_events", "google_calendar_get_availability"]
)
meeting_coordinator = Agent( meeting_coordinator = Agent(
role="Meeting Coordinator", role="Meeting Coordinator",
goal="Coordinate meetings and check availability", goal="Coordinate meetings and check availability",
backstory="An AI assistant that focuses on meeting scheduling and availability management.", backstory="An AI assistant that focuses on meeting scheduling and availability management.",
apps=['google_calendar/create_event', 'google_calendar/get_availability'] tools=enterprise_tools
) )
# Task to schedule a meeting with availability check # Task to schedule a meeting with availability check
@@ -238,12 +248,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
event_manager = Agent( event_manager = Agent(
role="Event Manager", role="Event Manager",
goal="Manage and update calendar events efficiently", goal="Manage and update calendar events efficiently",
backstory="An experienced event manager who handles event logistics and updates.", backstory="An experienced event manager who handles event logistics and updates.",
apps=['google_calendar'] tools=[enterprise_tools]
) )
# Task to manage event updates # Task to manage event updates
@@ -251,10 +266,10 @@ event_management = Task(
description=""" description="""
1. List all events for this week 1. List all events for this week
2. Update any events that need location changes to include video conference links 2. Update any events that need location changes to include video conference links
3. Check availability for upcoming meetings 3. Send calendar invitations to new team members for recurring meetings
""", """,
agent=event_manager, agent=event_manager,
expected_output="Weekly events updated with proper locations and availability checked" expected_output="Weekly events updated with proper locations and new attendees added"
) )
crew = Crew( crew = Crew(
@@ -265,28 +280,33 @@ crew = Crew(
crew.kickoff() crew.kickoff()
``` ```
### Availability and Calendar Management ### Contact and Availability Management
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
availability_coordinator = Agent( availability_coordinator = Agent(
role="Availability Coordinator", role="Availability Coordinator",
goal="Coordinate availability and manage calendars for scheduling", goal="Coordinate availability and manage contacts for scheduling",
backstory="An AI assistant that specializes in availability management and calendar coordination.", backstory="An AI assistant that specializes in availability management and contact coordination.",
apps=['google_calendar'] tools=[enterprise_tools]
) )
# Task to coordinate availability # Task to coordinate availability
availability_task = Task( availability_task = Task(
description=""" description="""
1. Get the list of available calendars 1. Search for contacts in the engineering department
2. Check availability for all calendars next Friday afternoon 2. Check availability for all engineers next Friday afternoon
3. Create a team meeting for the first available 2-hour slot 3. Create a team meeting for the first available 2-hour slot
4. Include Google Meet link and send invitations 4. Include Google Meet link and send invitations
""", """,
agent=availability_coordinator, agent=availability_coordinator,
expected_output="Team meeting scheduled based on availability with all team members invited" expected_output="Team meeting scheduled based on availability with all engineers invited"
) )
crew = Crew( crew = Crew(
@@ -301,12 +321,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
scheduling_automator = Agent( scheduling_automator = Agent(
role="Scheduling Automator", role="Scheduling Automator",
goal="Automate scheduling workflows and calendar management", goal="Automate scheduling workflows and calendar management",
backstory="An AI assistant that automates complex scheduling scenarios and calendar workflows.", backstory="An AI assistant that automates complex scheduling scenarios and calendar workflows.",
apps=['google_calendar'] tools=[enterprise_tools]
) )
# Complex scheduling automation task # Complex scheduling automation task
@@ -335,26 +360,27 @@ crew.kickoff()
### Common Issues ### Common Issues
**Authentication Errors** **Authentication Errors**
- Ensure your Google account has the necessary permissions for calendar access - Ensure your Google account has the necessary permissions for calendar access
- Verify that the OAuth connection includes all required scopes for Google Calendar API - Verify that the OAuth connection includes all required scopes for Google Calendar API
- Check if calendar sharing settings allow the required access level - Check if calendar sharing settings allow the required access level
**Event Creation Issues** **Event Creation Issues**
- Verify that time formats are correct (ISO8601 or Unix timestamps)
- Verify that time formats are correct (RFC3339 format)
- Ensure attendee email addresses are properly formatted - Ensure attendee email addresses are properly formatted
- Check that the target calendar exists and is accessible - Check that the target calendar exists and is accessible
- Verify time zones are correctly specified - Verify time zones are correctly specified
**Availability and Time Conflicts** **Availability and Time Conflicts**
- Use proper ISO format for time ranges when checking availability
- Use proper RFC3339 format for time ranges when checking availability
- Ensure time zones are consistent across all operations - Ensure time zones are consistent across all operations
- Verify that calendar IDs are correct when checking multiple calendars - Verify that calendar IDs are correct when checking multiple calendars
**Event Updates and Deletions** **Contact and People Search**
- Ensure search queries are properly formatted
- Check that directory access permissions are granted
- Verify that contact information is up to date and accessible
**Event Updates and Deletions**
- Verify that event IDs are correct and events exist - Verify that event IDs are correct and events exist
- Ensure you have edit permissions for the events - Ensure you have edit permissions for the events
- Check that calendar ownership allows modifications - Check that calendar ownership allows modifications
@@ -362,6 +388,5 @@ crew.kickoff()
### Getting Help ### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Google Calendar integration setup Contact our support team for assistance with Google Calendar integration setup or troubleshooting.
or troubleshooting.
</Card> </Card>

View File

@@ -1,440 +0,0 @@
---
title: Google Contacts Integration
description: "Contact and directory management with Google Contacts integration for CrewAI."
icon: "address-book"
mode: "wide"
---
## Overview
Enable your agents to manage contacts and directory information through Google Contacts. Access personal contacts, search directory people, create and update contact information, and manage contact groups with AI-powered automation.
## Prerequisites
Before using the Google Contacts integration, ensure you have:
- A [CrewAI AMP](https://app.crewai.com) account with an active subscription
- A Google account with Google Contacts access
- Connected your Google account through the [Integrations page](https://app.crewai.com/crewai_plus/connectors)
## Setting Up Google Contacts Integration
### 1. Connect Your Google Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Google Contacts** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for contacts and directory access
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Actions
<AccordionGroup>
<Accordion title="google_contacts/get_contacts">
**Description:** Retrieve user's contacts from Google Contacts.
**Parameters:**
- `pageSize` (integer, optional): Number of contacts to return (max 1000). Minimum: 1, Maximum: 1000
- `pageToken` (string, optional): The token of the page to retrieve.
- `personFields` (string, optional): Fields to include (e.g., 'names,emailAddresses,phoneNumbers'). Default: names,emailAddresses,phoneNumbers
- `requestSyncToken` (boolean, optional): Whether the response should include a sync token. Default: false
- `sortOrder` (string, optional): The order in which the connections should be sorted. Options: LAST_MODIFIED_ASCENDING, LAST_MODIFIED_DESCENDING, FIRST_NAME_ASCENDING, LAST_NAME_ASCENDING
</Accordion>
<Accordion title="google_contacts/search_contacts">
**Description:** Search for contacts using a query string.
**Parameters:**
- `query` (string, required): Search query string
- `readMask` (string, required): Fields to read (e.g., 'names,emailAddresses,phoneNumbers')
- `pageSize` (integer, optional): Number of results to return. Minimum: 1, Maximum: 30
- `pageToken` (string, optional): Token specifying which result page to return.
- `sources` (array, optional): The sources to search in. Options: READ_SOURCE_TYPE_CONTACT, READ_SOURCE_TYPE_PROFILE. Default: READ_SOURCE_TYPE_CONTACT
</Accordion>
<Accordion title="google_contacts/list_directory_people">
**Description:** List people in the authenticated user's directory.
**Parameters:**
- `sources` (array, required): Directory sources to search within. Options: DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE, DIRECTORY_SOURCE_TYPE_DOMAIN_CONTACT. Default: DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE
- `pageSize` (integer, optional): Number of people to return. Minimum: 1, Maximum: 1000
- `pageToken` (string, optional): Token specifying which result page to return.
- `readMask` (string, optional): Fields to read (e.g., 'names,emailAddresses')
- `requestSyncToken` (boolean, optional): Whether the response should include a sync token. Default: false
- `mergeSources` (array, optional): Additional data to merge into the directory people responses. Options: CONTACT
</Accordion>
<Accordion title="google_contacts/search_directory_people">
**Description:** Search for people in the directory.
**Parameters:**
- `query` (string, required): Search query
- `sources` (string, required): Directory sources (use 'DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE')
- `pageSize` (integer, optional): Number of results to return
- `readMask` (string, optional): Fields to read
</Accordion>
<Accordion title="google_contacts/list_other_contacts">
**Description:** List other contacts (not in user's personal contacts).
**Parameters:**
- `pageSize` (integer, optional): Number of contacts to return. Minimum: 1, Maximum: 1000
- `pageToken` (string, optional): Token specifying which result page to return.
- `readMask` (string, optional): Fields to read
- `requestSyncToken` (boolean, optional): Whether the response should include a sync token. Default: false
</Accordion>
<Accordion title="google_contacts/search_other_contacts">
**Description:** Search other contacts.
**Parameters:**
- `query` (string, required): Search query
- `readMask` (string, required): Fields to read (e.g., 'names,emailAddresses')
- `pageSize` (integer, optional): Number of results
</Accordion>
<Accordion title="google_contacts/get_person">
**Description:** Get a single person's contact information by resource name.
**Parameters:**
- `resourceName` (string, required): The resource name of the person to get (e.g., 'people/c123456789')
- `personFields` (string, optional): Fields to include (e.g., 'names,emailAddresses,phoneNumbers'). Default: names,emailAddresses,phoneNumbers
</Accordion>
<Accordion title="google_contacts/create_contact">
**Description:** Create a new contact in the user's address book.
**Parameters:**
- `names` (array, optional): Person's names
```json
[
{
"givenName": "John",
"familyName": "Doe",
"displayName": "John Doe"
}
]
```
- `emailAddresses` (array, optional): Email addresses
```json
[
{
"value": "john.doe@example.com",
"type": "work"
}
]
```
- `phoneNumbers` (array, optional): Phone numbers
```json
[
{
"value": "+1234567890",
"type": "mobile"
}
]
```
- `addresses` (array, optional): Postal addresses
```json
[
{
"formattedValue": "123 Main St, City, State 12345",
"type": "home"
}
]
```
- `organizations` (array, optional): Organizations/companies
```json
[
{
"name": "Company Name",
"title": "Job Title",
"type": "work"
}
]
```
</Accordion>
<Accordion title="google_contacts/update_contact">
**Description:** Update an existing contact's information.
**Parameters:**
- `resourceName` (string, required): The resource name of the person to update (e.g., 'people/c123456789')
- `updatePersonFields` (string, required): Fields to update (e.g., 'names,emailAddresses,phoneNumbers')
- `names` (array, optional): Person's names
- `emailAddresses` (array, optional): Email addresses
- `phoneNumbers` (array, optional): Phone numbers
</Accordion>
<Accordion title="google_contacts/delete_contact">
**Description:** Delete a contact from the user's address book.
**Parameters:**
- `resourceName` (string, required): The resource name of the person to delete (e.g., 'people/c123456789')
</Accordion>
<Accordion title="google_contacts/batch_get_people">
**Description:** Get information about multiple people in a single request.
**Parameters:**
- `resourceNames` (array, required): Resource names of people to get. Maximum: 200 items
- `personFields` (string, optional): Fields to include (e.g., 'names,emailAddresses,phoneNumbers'). Default: names,emailAddresses,phoneNumbers
</Accordion>
<Accordion title="google_contacts/list_contact_groups">
**Description:** List the user's contact groups (labels).
**Parameters:**
- `pageSize` (integer, optional): Number of contact groups to return. Minimum: 1, Maximum: 1000
- `pageToken` (string, optional): Token specifying which result page to return.
- `groupFields` (string, optional): Fields to include (e.g., 'name,memberCount,clientData'). Default: name,memberCount
</Accordion>
</AccordionGroup>
## Usage Examples
### Basic Google Contacts Agent Setup
```python
from crewai import Agent, Task, Crew
# Create an agent with Google Contacts capabilities
contacts_agent = Agent(
role="Contact Manager",
goal="Manage contacts and directory information efficiently",
backstory="An AI assistant specialized in contact management and directory operations.",
apps=['google_contacts'] # All Google Contacts actions will be available
)
# Task to retrieve and organize contacts
contact_management_task = Task(
description="Retrieve all contacts and organize them by company affiliation",
agent=contacts_agent,
expected_output="Contacts retrieved and organized by company with summary report"
)
# Run the task
crew = Crew(
agents=[contacts_agent],
tasks=[contact_management_task]
)
crew.kickoff()
```
### Directory Search and Management
```python
from crewai import Agent, Task, Crew
directory_manager = Agent(
role="Directory Manager",
goal="Search and manage directory people and contacts",
backstory="An AI assistant that specializes in directory management and people search.",
apps=[
'google_contacts/search_directory_people',
'google_contacts/list_directory_people',
'google_contacts/search_contacts'
]
)
# Task to search and manage directory
directory_task = Task(
description="Search for team members in the company directory and create a team contact list",
agent=directory_manager,
expected_output="Team directory compiled with contact information"
)
crew = Crew(
agents=[directory_manager],
tasks=[directory_task]
)
crew.kickoff()
```
### Contact Creation and Updates
```python
from crewai import Agent, Task, Crew
contact_curator = Agent(
role="Contact Curator",
goal="Create and update contact information systematically",
backstory="An AI assistant that maintains accurate and up-to-date contact information.",
apps=['google_contacts']
)
# Task to create and update contacts
curation_task = Task(
description="""
1. Search for existing contacts related to new business partners
2. Create new contacts for partners not in the system
3. Update existing contact information with latest details
4. Organize contacts into appropriate groups
""",
agent=contact_curator,
expected_output="Contact database updated with new partners and organized groups"
)
crew = Crew(
agents=[contact_curator],
tasks=[curation_task]
)
crew.kickoff()
```
### Contact Group Management
```python
from crewai import Agent, Task, Crew
group_organizer = Agent(
role="Contact Group Organizer",
goal="Organize contacts into meaningful groups and categories",
backstory="An AI assistant that specializes in contact organization and group management.",
apps=['google_contacts']
)
# Task to organize contact groups
organization_task = Task(
description="""
1. List all existing contact groups
2. Analyze contact distribution across groups
3. Create new groups for better organization
4. Move contacts to appropriate groups based on their information
""",
agent=group_organizer,
expected_output="Contacts organized into logical groups with improved structure"
)
crew = Crew(
agents=[group_organizer],
tasks=[organization_task]
)
crew.kickoff()
```
### Comprehensive Contact Management
```python
from crewai import Agent, Task, Crew
contact_specialist = Agent(
role="Contact Management Specialist",
goal="Provide comprehensive contact management across all sources",
backstory="An AI assistant that handles all aspects of contact management including personal, directory, and other contacts.",
apps=['google_contacts']
)
# Complex contact management task
comprehensive_task = Task(
description="""
1. Retrieve contacts from all sources (personal, directory, other)
2. Search for duplicate contacts and merge information
3. Update outdated contact information
4. Create missing contacts for important stakeholders
5. Organize contacts into meaningful groups
6. Generate a comprehensive contact report
""",
agent=contact_specialist,
expected_output="Complete contact management performed with unified contact database and detailed report"
)
crew = Crew(
agents=[contact_specialist],
tasks=[comprehensive_task]
)
crew.kickoff()
```
## Troubleshooting
### Common Issues
**Permission Errors**
- Ensure your Google account has appropriate permissions for contacts access
- Verify that the OAuth connection includes required scopes for Google Contacts API
- Check that directory access permissions are granted for organization contacts
**Resource Name Format Issues**
- Ensure resource names follow the correct format (e.g., 'people/c123456789' for contacts)
- Verify that contact group resource names use the format 'contactGroups/groupId'
- Check that resource names exist and are accessible
**Search and Query Issues**
- Ensure search queries are properly formatted and not empty
- Use appropriate readMask fields for the data you need
- Verify that search sources are correctly specified (contacts vs profiles)
**Contact Creation and Updates**
- Ensure required fields are provided when creating contacts
- Verify that email addresses and phone numbers are properly formatted
- Check that updatePersonFields parameter includes all fields being updated
**Directory Access Issues**
- Ensure you have appropriate permissions to access organization directory
- Verify that directory sources are correctly specified
- Check that your organization allows API access to directory information
**Pagination and Limits**
- Be mindful of page size limits (varies by endpoint)
- Use pageToken for pagination through large result sets
- Respect API rate limits and implement appropriate delays
**Contact Groups and Organization**
- Ensure contact group names are unique when creating new groups
- Verify that contacts exist before adding them to groups
- Check that you have permissions to modify contact groups
### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Google Contacts integration setup
or troubleshooting.
</Card>

View File

@@ -1,260 +0,0 @@
---
title: Google Docs Integration
description: "Document creation and editing with Google Docs integration for CrewAI."
icon: "file-lines"
mode: "wide"
---
## Overview
Enable your agents to create, edit, and manage Google Docs documents with text manipulation and formatting. Automate document creation, insert and replace text, manage content ranges, and streamline your document workflows with AI-powered automation.
## Prerequisites
Before using the Google Docs integration, ensure you have:
- A [CrewAI AMP](https://app.crewai.com) account with an active subscription
- A Google account with Google Docs access
- Connected your Google account through the [Integrations page](https://app.crewai.com/crewai_plus/connectors)
## Setting Up Google Docs Integration
### 1. Connect Your Google Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Google Docs** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for document access
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Actions
<AccordionGroup>
<Accordion title="google_docs/create_document">
**Description:** Create a new Google Document.
**Parameters:**
- `title` (string, optional): The title for the new document.
</Accordion>
<Accordion title="google_docs/get_document">
**Description:** Get the contents and metadata of a Google Document.
**Parameters:**
- `documentId` (string, required): The ID of the document to retrieve.
- `includeTabsContent` (boolean, optional): Whether to include tab content. Default is `false`.
- `suggestionsViewMode` (string, optional): The suggestions view mode to apply to the document. Enum: `DEFAULT_FOR_CURRENT_ACCESS`, `PREVIEW_SUGGESTIONS_ACCEPTED`, `PREVIEW_WITHOUT_SUGGESTIONS`. Default is `DEFAULT_FOR_CURRENT_ACCESS`.
</Accordion>
<Accordion title="google_docs/batch_update">
**Description:** Apply one or more updates to a Google Document.
**Parameters:**
- `documentId` (string, required): The ID of the document to update.
- `requests` (array, required): A list of updates to apply to the document. Each item is an object representing a request.
- `writeControl` (object, optional): Provides control over how write requests are executed. Contains `requiredRevisionId` (string) and `targetRevisionId` (string).
</Accordion>
<Accordion title="google_docs/insert_text">
**Description:** Insert text into a Google Document at a specific location.
**Parameters:**
- `documentId` (string, required): The ID of the document to update.
- `text` (string, required): The text to insert.
- `index` (integer, optional): The zero-based index where to insert the text. Default is `1`.
</Accordion>
<Accordion title="google_docs/replace_text">
**Description:** Replace all instances of text in a Google Document.
**Parameters:**
- `documentId` (string, required): The ID of the document to update.
- `containsText` (string, required): The text to find and replace.
- `replaceText` (string, required): The text to replace it with.
- `matchCase` (boolean, optional): Whether the search should respect case. Default is `false`.
</Accordion>
<Accordion title="google_docs/delete_content_range">
**Description:** Delete content from a specific range in a Google Document.
**Parameters:**
- `documentId` (string, required): The ID of the document to update.
- `startIndex` (integer, required): The start index of the range to delete.
- `endIndex` (integer, required): The end index of the range to delete.
</Accordion>
<Accordion title="google_docs/insert_page_break">
**Description:** Insert a page break at a specific location in a Google Document.
**Parameters:**
- `documentId` (string, required): The ID of the document to update.
- `index` (integer, optional): The zero-based index where to insert the page break. Default is `1`.
</Accordion>
<Accordion title="google_docs/create_named_range">
**Description:** Create a named range in a Google Document.
**Parameters:**
- `documentId` (string, required): The ID of the document to update.
- `name` (string, required): The name for the named range.
- `startIndex` (integer, required): The start index of the range.
- `endIndex` (integer, required): The end index of the range.
</Accordion>
</AccordionGroup>
## Usage Examples
### Basic Google Docs Agent Setup
```python
from crewai import Agent, Task, Crew
# Create an agent with Google Docs capabilities
docs_agent = Agent(
role="Document Creator",
goal="Create and manage Google Docs documents efficiently",
backstory="An AI assistant specialized in Google Docs document creation and editing.",
apps=['google_docs'] # All Google Docs actions will be available
)
# Task to create a new document
create_doc_task = Task(
description="Create a new Google Document titled 'Project Status Report'",
agent=docs_agent,
expected_output="New Google Document 'Project Status Report' created successfully"
)
# Run the task
crew = Crew(
agents=[docs_agent],
tasks=[create_doc_task]
)
crew.kickoff()
```
### Text Editing and Content Management
```python
from crewai import Agent, Task, Crew
# Create an agent focused on text editing
text_editor = Agent(
role="Document Editor",
goal="Edit and update content in Google Docs documents",
backstory="An AI assistant skilled in precise text editing and content management.",
apps=['google_docs/insert_text', 'google_docs/replace_text', 'google_docs/delete_content_range']
)
# Task to edit document content
edit_content_task = Task(
description="In document 'your_document_id', insert the text 'Executive Summary: ' at the beginning, then replace all instances of 'TODO' with 'COMPLETED'.",
agent=text_editor,
expected_output="Document updated with new text inserted and TODO items replaced."
)
crew = Crew(
agents=[text_editor],
tasks=[edit_content_task]
)
crew.kickoff()
```
### Advanced Document Operations
```python
from crewai import Agent, Task, Crew
# Create an agent for advanced document operations
document_formatter = Agent(
role="Document Formatter",
goal="Apply advanced formatting and structure to Google Docs",
backstory="An AI assistant that handles complex document formatting and organization.",
apps=['google_docs/batch_update', 'google_docs/insert_page_break', 'google_docs/create_named_range']
)
# Task to format document
format_doc_task = Task(
description="In document 'your_document_id', insert a page break at position 100, create a named range called 'Introduction' for characters 1-50, and apply batch formatting updates.",
agent=document_formatter,
expected_output="Document formatted with page break, named range, and styling applied."
)
crew = Crew(
agents=[document_formatter],
tasks=[format_doc_task]
)
crew.kickoff()
```
## Troubleshooting
### Common Issues
**Authentication Errors**
- Ensure your Google account has the necessary permissions for Google Docs access.
- Verify that the OAuth connection includes all required scopes (`https://www.googleapis.com/auth/documents`).
**Document ID Issues**
- Double-check document IDs for correctness.
- Ensure the document exists and is accessible to your account.
- Document IDs can be found in the Google Docs URL.
**Text Insertion and Range Operations**
- When using `insert_text` or `delete_content_range`, ensure index positions are valid.
- Remember that Google Docs uses zero-based indexing.
- The document must have content at the specified index positions.
**Batch Update Request Formatting**
- When using `batch_update`, ensure the `requests` array is correctly formatted according to the Google Docs API documentation.
- Complex updates require specific JSON structures for each request type.
**Replace Text Operations**
- For `replace_text`, ensure the `containsText` parameter exactly matches the text you want to replace.
- Use `matchCase` parameter to control case sensitivity.
### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Google Docs integration setup or
troubleshooting.
</Card>

View File

@@ -1,239 +0,0 @@
---
title: Google Drive Integration
description: "File storage and management with Google Drive integration for CrewAI."
icon: "google"
mode: "wide"
---
## Overview
Enable your agents to manage files and folders through Google Drive. Upload, download, organize, and share files, create folders, and streamline your document management workflows with AI-powered automation.
## Prerequisites
Before using the Google Drive integration, ensure you have:
- A [CrewAI AMP](https://app.crewai.com) account with an active subscription
- A Google account with Google Drive access
- Connected your Google account through the [Integrations page](https://app.crewai.com/crewai_plus/connectors)
## Setting Up Google Drive Integration
### 1. Connect Your Google Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Google Drive** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for file and folder management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Actions
<AccordionGroup>
<Accordion title="google_drive/get_file">
**Description:** Get a file by ID from Google Drive.
**Parameters:**
- `file_id` (string, required): The ID of the file to retrieve.
</Accordion>
<Accordion title="google_drive/list_files">
**Description:** List files in Google Drive.
**Parameters:**
- `q` (string, optional): Query string to filter files (example: "name contains 'report'").
- `page_size` (integer, optional): Maximum number of files to return (default: 100, max: 1000).
- `page_token` (string, optional): Token for retrieving the next page of results.
- `order_by` (string, optional): Sort order (example: "name", "createdTime desc", "modifiedTime").
- `spaces` (string, optional): Comma-separated list of spaces to query (drive, appDataFolder, photos).
</Accordion>
<Accordion title="google_drive/upload_file">
**Description:** Upload a file to Google Drive.
**Parameters:**
- `name` (string, required): Name of the file to create.
- `content` (string, required): Content of the file to upload.
- `mime_type` (string, optional): MIME type of the file (example: "text/plain", "application/pdf").
- `parent_folder_id` (string, optional): ID of the parent folder where the file should be created.
- `description` (string, optional): Description of the file.
</Accordion>
<Accordion title="google_drive/download_file">
**Description:** Download a file from Google Drive.
**Parameters:**
- `file_id` (string, required): The ID of the file to download.
- `mime_type` (string, optional): MIME type for export (required for Google Workspace documents).
</Accordion>
<Accordion title="google_drive/create_folder">
**Description:** Create a new folder in Google Drive.
**Parameters:**
- `name` (string, required): Name of the folder to create.
- `parent_folder_id` (string, optional): ID of the parent folder where the new folder should be created.
- `description` (string, optional): Description of the folder.
</Accordion>
<Accordion title="google_drive/delete_file">
**Description:** Delete a file from Google Drive.
**Parameters:**
- `file_id` (string, required): The ID of the file to delete.
</Accordion>
<Accordion title="google_drive/share_file">
**Description:** Share a file in Google Drive with specific users or make it public.
**Parameters:**
- `file_id` (string, required): The ID of the file to share.
- `role` (string, required): The role granted by this permission (reader, writer, commenter, owner).
- `type` (string, required): The type of the grantee (user, group, domain, anyone).
- `email_address` (string, optional): The email address of the user or group to share with (required for user/group types).
- `domain` (string, optional): The domain to share with (required for domain type).
- `send_notification_email` (boolean, optional): Whether to send a notification email (default: true).
- `email_message` (string, optional): A plain text custom message to include in the notification email.
</Accordion>
<Accordion title="google_drive/update_file">
**Description:** Update an existing file in Google Drive.
**Parameters:**
- `file_id` (string, required): The ID of the file to update.
- `name` (string, optional): New name for the file.
- `content` (string, optional): New content for the file.
- `mime_type` (string, optional): New MIME type for the file.
- `description` (string, optional): New description for the file.
- `add_parents` (string, optional): Comma-separated list of parent folder IDs to add.
- `remove_parents` (string, optional): Comma-separated list of parent folder IDs to remove.
</Accordion>
</AccordionGroup>
## Usage Examples
### Basic Google Drive Agent Setup
```python
from crewai import Agent, Task, Crew
# Create an agent with Google Drive capabilities
drive_agent = Agent(
role="File Manager",
goal="Manage files and folders in Google Drive efficiently",
backstory="An AI assistant specialized in document and file management.",
apps=['google_drive'] # All Google Drive actions will be available
)
# Task to organize files
organize_files_task = Task(
description="List all files in the root directory and organize them into appropriate folders",
agent=drive_agent,
expected_output="Summary of files organized with folder structure"
)
# Run the task
crew = Crew(
agents=[drive_agent],
tasks=[organize_files_task]
)
crew.kickoff()
```
### Filtering Specific Google Drive Tools
```python
from crewai import Agent, Task, Crew
# Create agent with specific Google Drive actions only
file_manager_agent = Agent(
role="Document Manager",
goal="Upload and manage documents efficiently",
backstory="An AI assistant that focuses on document upload and organization.",
apps=[
'google_drive/upload_file',
'google_drive/create_folder',
'google_drive/share_file'
] # Specific Google Drive actions
)
# Task to upload and share documents
document_task = Task(
description="Upload the quarterly report and share it with the finance team",
agent=file_manager_agent,
expected_output="Document uploaded and sharing permissions configured"
)
crew = Crew(
agents=[file_manager_agent],
tasks=[document_task]
)
crew.kickoff()
```
### Advanced File Management
```python
from crewai import Agent, Task, Crew
file_organizer = Agent(
role="File Organizer",
goal="Maintain organized file structure and manage permissions",
backstory="An experienced file manager who ensures proper organization and access control.",
apps=['google_drive']
)
# Complex task involving multiple Google Drive operations
organization_task = Task(
description="""
1. List all files in the shared folder
2. Create folders for different document types (Reports, Presentations, Spreadsheets)
3. Move files to appropriate folders based on their type
4. Set appropriate sharing permissions for each folder
5. Create a summary document of the organization changes
""",
agent=file_organizer,
expected_output="Files organized into categorized folders with proper permissions and summary report"
)
crew = Crew(
agents=[file_organizer],
tasks=[organization_task]
)
crew.kickoff()
```

View File

@@ -26,7 +26,7 @@ Before using the Google Sheets integration, ensure you have:
2. Find **Google Sheets** in the Authentication Integrations section 2. Find **Google Sheets** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow 3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for spreadsheet access 4. Grant the necessary permissions for spreadsheet access
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations) 5. Copy your Enterprise Token from [Account Settings](https://app.crewai.com/crewai_plus/settings/account)
### 2. Install Required Package ### 2. Install Required Package
@@ -34,101 +34,68 @@ Before using the Google Sheets integration, ensure you have:
uv add crewai-tools uv add crewai-tools
``` ```
### 3. 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
```
## Available Actions ## Available Actions
<AccordionGroup> <AccordionGroup>
<Accordion title="google_sheets/get_spreadsheet"> <Accordion title="GOOGLE_SHEETS_GET_ROW">
**Description:** Retrieve properties and data of a spreadsheet. **Description:** Get rows from a Google Sheets spreadsheet.
**Parameters:** **Parameters:**
- `spreadsheetId` (string, required): The ID of the spreadsheet to retrieve. - `spreadsheetId` (string, required): Spreadsheet - Use Connect Portal Workflow Settings to allow users to select a spreadsheet. Defaults to using the first worksheet in the selected spreadsheet.
- `ranges` (array, optional): The ranges to retrieve from the spreadsheet. - `limit` (string, optional): Limit rows - Limit the maximum number of rows to return.
- `includeGridData` (boolean, optional): True if grid data should be returned. Default: false
- `fields` (string, optional): The fields to include in the response. Use this to improve performance by only returning needed data.
</Accordion> </Accordion>
<Accordion title="google_sheets/get_values"> <Accordion title="GOOGLE_SHEETS_CREATE_ROW">
**Description:** Returns a range of values from a spreadsheet. **Description:** Create a new row in a Google Sheets spreadsheet.
**Parameters:** **Parameters:**
- `spreadsheetId` (string, required): The ID of the spreadsheet to retrieve data from. - `spreadsheetId` (string, required): Spreadsheet - Use Connect Portal Workflow Settings to allow users to select a spreadsheet. Defaults to using the first worksheet in the selected spreadsheet..
- `range` (string, required): The A1 notation or R1C1 notation of the range to retrieve values from. - `worksheet` (string, required): Worksheet - Your worksheet must have column headers.
- `valueRenderOption` (string, optional): How values should be represented in the output. Options: FORMATTED_VALUE, UNFORMATTED_VALUE, FORMULA. Default: FORMATTED_VALUE - `additionalFields` (object, required): Fields - Include fields to create this row with, as an object with keys of Column Names. Use Connect Portal Workflow Settings to allow users to select a Column Mapping.
- `dateTimeRenderOption` (string, optional): How dates, times, and durations should be represented in the output. Options: SERIAL_NUMBER, FORMATTED_STRING. Default: SERIAL_NUMBER
- `majorDimension` (string, optional): The major dimension that results should use. Options: ROWS, COLUMNS. Default: ROWS
</Accordion>
<Accordion title="google_sheets/update_values">
**Description:** Sets values in a range of a spreadsheet.
**Parameters:**
- `spreadsheetId` (string, required): The ID of the spreadsheet to update.
- `range` (string, required): The A1 notation of the range to update.
- `values` (array, required): The data to be written. Each array represents a row.
```json ```json
[ {
["Value1", "Value2", "Value3"], "columnName1": "columnValue1",
["Value4", "Value5", "Value6"] "columnName2": "columnValue2",
] "columnName3": "columnValue3",
"columnName4": "columnValue4"
}
``` ```
- `valueInputOption` (string, optional): How the input data should be interpreted. Options: RAW, USER_ENTERED. Default: USER_ENTERED
</Accordion> </Accordion>
<Accordion title="google_sheets/append_values"> <Accordion title="GOOGLE_SHEETS_UPDATE_ROW">
**Description:** Appends values to a spreadsheet. **Description:** Update existing rows in a Google Sheets spreadsheet.
**Parameters:** **Parameters:**
- `spreadsheetId` (string, required): The ID of the spreadsheet to update. - `spreadsheetId` (string, required): Spreadsheet - Use Connect Portal Workflow Settings to allow users to select a spreadsheet. Defaults to using the first worksheet in the selected spreadsheet.
- `range` (string, required): The A1 notation of a range to search for a logical table of data. - `worksheet` (string, required): Worksheet - Your worksheet must have column headers.
- `values` (array, required): The data to append. Each array represents a row. - `filterFormula` (object, optional): A filter in disjunctive normal form - OR of AND groups of single conditions to identify which rows to update.
```json ```json
[ {
["Value1", "Value2", "Value3"], "operator": "OR",
["Value4", "Value5", "Value6"] "conditions": [
] {
``` "operator": "AND",
- `valueInputOption` (string, optional): How the input data should be interpreted. Options: RAW, USER_ENTERED. Default: USER_ENTERED "conditions": [
- `insertDataOption` (string, optional): How the input data should be inserted. Options: OVERWRITE, INSERT_ROWS. Default: INSERT_ROWS {
"field": "status",
</Accordion> "operator": "$stringExactlyMatches",
"value": "pending"
<Accordion title="google_sheets/create_spreadsheet"> }
**Description:** Creates a new spreadsheet. ]
**Parameters:**
- `title` (string, required): The title of the new spreadsheet.
- `sheets` (array, optional): The sheets that are part of the spreadsheet.
```json
[
{
"properties": {
"title": "Sheet1"
} }
} ]
] }
```
Available operators: `$stringContains`, `$stringDoesNotContain`, `$stringExactlyMatches`, `$stringDoesNotExactlyMatch`, `$stringStartsWith`, `$stringDoesNotStartWith`, `$stringEndsWith`, `$stringDoesNotEndWith`, `$numberGreaterThan`, `$numberLessThan`, `$numberEquals`, `$numberDoesNotEqual`, `$dateTimeAfter`, `$dateTimeBefore`, `$dateTimeEquals`, `$booleanTrue`, `$booleanFalse`, `$exists`, `$doesNotExist`
- `additionalFields` (object, required): Fields - Include fields to update, as an object with keys of Column Names. Use Connect Portal Workflow Settings to allow users to select a Column Mapping.
```json
{
"columnName1": "newValue1",
"columnName2": "newValue2",
"columnName3": "newValue3",
"columnName4": "newValue4"
}
``` ```
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -138,13 +105,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Google Sheets tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Google Sheets capabilities # Create an agent with Google Sheets capabilities
sheets_agent = Agent( sheets_agent = Agent(
role="Data Manager", role="Data Manager",
goal="Manage spreadsheet data and track information efficiently", goal="Manage spreadsheet data and track information efficiently",
backstory="An AI assistant specialized in data management and spreadsheet operations.", backstory="An AI assistant specialized in data management and spreadsheet operations.",
apps=['google_sheets'] tools=[enterprise_tools]
) )
# Task to add new data to a spreadsheet # Task to add new data to a spreadsheet
@@ -166,17 +139,19 @@ crew.kickoff()
### Filtering Specific Google Sheets Tools ### Filtering Specific Google Sheets Tools
```python ```python
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get only specific Google Sheets tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["google_sheets_get_row", "google_sheets_create_row"]
)
# Create agent with specific Google Sheets actions only
data_collector = Agent( data_collector = Agent(
role="Data Collector", role="Data Collector",
goal="Collect and organize data in spreadsheets", goal="Collect and organize data in spreadsheets",
backstory="An AI assistant that focuses on data collection and organization.", backstory="An AI assistant that focuses on data collection and organization.",
apps=[ tools=enterprise_tools
'google_sheets/get_values',
'google_sheets/update_values'
]
) )
# Task to collect and organize data # Task to collect and organize data
@@ -198,12 +173,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
data_analyst = Agent( data_analyst = Agent(
role="Data Analyst", role="Data Analyst",
goal="Analyze spreadsheet data and generate insights", goal="Analyze spreadsheet data and generate insights",
backstory="An experienced data analyst who extracts insights from spreadsheet data.", backstory="An experienced data analyst who extracts insights from spreadsheet data.",
apps=['google_sheets'] tools=[enterprise_tools]
) )
# Task to analyze data and create reports # Task to analyze data and create reports
@@ -225,59 +205,33 @@ crew = Crew(
crew.kickoff() crew.kickoff()
``` ```
### Spreadsheet Creation and Management
```python
from crewai import Agent, Task, Crew
spreadsheet_manager = Agent(
role="Spreadsheet Manager",
goal="Create and manage spreadsheets efficiently",
backstory="An AI assistant that specializes in creating and organizing spreadsheets.",
apps=['google_sheets']
)
# Task to create and set up new spreadsheets
setup_task = Task(
description="""
1. Create a new spreadsheet for quarterly reports
2. Set up proper headers and structure
3. Add initial data and formatting
""",
agent=spreadsheet_manager,
expected_output="New quarterly report spreadsheet created and properly structured"
)
crew = Crew(
agents=[spreadsheet_manager],
tasks=[setup_task]
)
crew.kickoff()
```
### Automated Data Updates ### Automated Data Updates
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
data_updater = Agent( data_updater = Agent(
role="Data Updater", role="Data Updater",
goal="Automatically update and maintain spreadsheet data", goal="Automatically update and maintain spreadsheet data",
backstory="An AI assistant that maintains data accuracy and updates records automatically.", backstory="An AI assistant that maintains data accuracy and updates records automatically.",
apps=['google_sheets'] tools=[enterprise_tools]
) )
# Task to update data based on conditions # Task to update data based on conditions
update_task = Task( update_task = Task(
description=""" description="""
1. Get spreadsheet properties and structure 1. Find all pending orders in the orders spreadsheet
2. Read current data from specific ranges 2. Update their status to 'processing'
3. Update values in target ranges with new data 3. Add a timestamp for when the status was updated
4. Append new records to the bottom of the sheet 4. Log the changes in a separate tracking sheet
""", """,
agent=data_updater, agent=data_updater,
expected_output="Spreadsheet data updated successfully with new values and records" expected_output="All pending orders updated to processing status with timestamps logged"
) )
crew = Crew( crew = Crew(
@@ -292,25 +246,30 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
workflow_manager = Agent( workflow_manager = Agent(
role="Data Workflow Manager", role="Data Workflow Manager",
goal="Manage complex data workflows across multiple spreadsheets", goal="Manage complex data workflows across multiple spreadsheets",
backstory="An AI assistant that orchestrates complex data operations across multiple spreadsheets.", backstory="An AI assistant that orchestrates complex data operations across multiple spreadsheets.",
apps=['google_sheets'] tools=[enterprise_tools]
) )
# Complex workflow task # Complex workflow task
workflow_task = Task( workflow_task = Task(
description=""" description="""
1. Get all customer data from the main customer spreadsheet 1. Get all customer data from the main customer spreadsheet
2. Create a new monthly summary spreadsheet 2. Create monthly summary entries for active customers
3. Append summary data to the new spreadsheet 3. Update customer status based on activity in the last 30 days
4. Update customer status based on activity metrics 4. Generate a monthly report with customer metrics
5. Generate reports with proper formatting 5. Archive inactive customer records to a separate sheet
""", """,
agent=workflow_manager, agent=workflow_manager,
expected_output="Monthly customer workflow completed with new spreadsheet and updated data" expected_output="Monthly customer workflow completed with updated statuses and generated reports"
) )
crew = Crew( crew = Crew(
@@ -326,44 +285,38 @@ crew.kickoff()
### Common Issues ### Common Issues
**Permission Errors** **Permission Errors**
- Ensure your Google account has edit access to the target spreadsheets - Ensure your Google account has edit access to the target spreadsheets
- Verify that the OAuth connection includes required scopes for Google Sheets API - Verify that the OAuth connection includes required scopes for Google Sheets API
- Check that spreadsheets are shared with the authenticated account - Check that spreadsheets are shared with the authenticated account
**Spreadsheet Structure Issues** **Spreadsheet Structure Issues**
- Ensure worksheets have proper column headers before creating or updating rows - Ensure worksheets have proper column headers before creating or updating rows
- Verify that range notation (A1 format) is correct for the target cells - Verify that column names in `additionalFields` match the actual column headers
- Check that the specified spreadsheet ID exists and is accessible - Check that the specified worksheet exists in the spreadsheet
**Data Type and Format Issues** **Data Type and Format Issues**
- Ensure data values match the expected format for each column - Ensure data values match the expected format for each column
- Use proper date formats for date columns (ISO format recommended) - Use proper date formats for date columns (ISO format recommended)
- Verify that numeric values are properly formatted for number columns - Verify that numeric values are properly formatted for number columns
**Range and Cell Reference Issues** **Filter Formula Issues**
- Ensure filter formulas follow the correct JSON structure for disjunctive normal form
- Use valid field names that match actual column headers
- Test simple filters before building complex multi-condition queries
- Verify that operator types match the data types in the columns
- Use proper A1 notation for ranges (e.g., "A1:C10", "Sheet1!A1:B5") **Row Limits and Performance**
- Ensure range references don't exceed the actual spreadsheet dimensions - Be mindful of row limits when using `GOOGLE_SHEETS_GET_ROW`
- Verify that sheet names in range references match actual sheet names - Consider pagination for large datasets
- Use specific filters to reduce the amount of data processed
**Value Input and Rendering Options** **Update Operations**
- Ensure filter conditions properly identify the intended rows for updates
- Choose appropriate `valueInputOption` (RAW vs USER_ENTERED) for your data - Test filter conditions with small datasets before large updates
- Select proper `valueRenderOption` based on how you want data formatted - Verify that all required fields are included in update operations
- Consider `dateTimeRenderOption` for consistent date/time handling
**Spreadsheet Creation Issues**
- Ensure spreadsheet titles are unique and follow naming conventions
- Verify that sheet properties are properly structured when creating sheets
- Check that you have permissions to create new spreadsheets in your account
### Getting Help ### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Google Sheets integration setup Contact our support team for assistance with Google Sheets integration setup or troubleshooting.
or troubleshooting.
</Card> </Card>

View File

@@ -1,407 +0,0 @@
---
title: Google Slides Integration
description: "Presentation creation and management with Google Slides integration for CrewAI."
icon: "chart-bar"
mode: "wide"
---
## Overview
Enable your agents to create, edit, and manage Google Slides presentations. Create presentations, update content, import data from Google Sheets, manage pages and thumbnails, and streamline your presentation workflows with AI-powered automation.
## Prerequisites
Before using the Google Slides integration, ensure you have:
- A [CrewAI AMP](https://app.crewai.com) account with an active subscription
- A Google account with Google Slides access
- Connected your Google account through the [Integrations page](https://app.crewai.com/crewai_plus/connectors)
## Setting Up Google Slides Integration
### 1. Connect Your Google Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Google Slides** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for presentations, spreadsheets, and drive access
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Actions
<AccordionGroup>
<Accordion title="google_slides/create_blank_presentation">
**Description:** Creates a blank presentation with no content.
**Parameters:**
- `title` (string, required): The title of the presentation.
</Accordion>
<Accordion title="google_slides/get_presentation">
**Description:** Retrieves a presentation by ID.
**Parameters:**
- `presentationId` (string, required): The ID of the presentation to retrieve.
- `fields` (string, optional): The fields to include in the response. Use this to improve performance by only returning needed data.
</Accordion>
<Accordion title="google_slides/batch_update_presentation">
**Description:** Applies updates, add content, or remove content from a presentation.
**Parameters:**
- `presentationId` (string, required): The ID of the presentation to update.
- `requests` (array, required): A list of updates to apply to the presentation.
```json
[
{
"insertText": {
"objectId": "slide_id",
"text": "Your text content here"
}
}
]
```
- `writeControl` (object, optional): Provides control over how write requests are executed.
```json
{
"requiredRevisionId": "revision_id_string"
}
```
</Accordion>
<Accordion title="google_slides/get_page">
**Description:** Retrieves a specific page by its ID.
**Parameters:**
- `presentationId` (string, required): The ID of the presentation.
- `pageObjectId` (string, required): The ID of the page to retrieve.
</Accordion>
<Accordion title="google_slides/get_thumbnail">
**Description:** Generates a page thumbnail.
**Parameters:**
- `presentationId` (string, required): The ID of the presentation.
- `pageObjectId` (string, required): The ID of the page for thumbnail generation.
</Accordion>
<Accordion title="google_slides/import_data_from_sheet">
**Description:** Imports data from a Google Sheet into a presentation.
**Parameters:**
- `presentationId` (string, required): The ID of the presentation.
- `sheetId` (string, required): The ID of the Google Sheet to import from.
- `dataRange` (string, required): The range of data to import from the sheet.
</Accordion>
<Accordion title="google_slides/upload_file_to_drive">
**Description:** Uploads a file to Google Drive associated with the presentation.
**Parameters:**
- `file` (string, required): The file data to upload.
- `presentationId` (string, required): The ID of the presentation to link the uploaded file.
</Accordion>
<Accordion title="google_slides/link_file_to_presentation">
**Description:** Links a file in Google Drive to a presentation.
**Parameters:**
- `presentationId` (string, required): The ID of the presentation.
- `fileId` (string, required): The ID of the file to link.
</Accordion>
<Accordion title="google_slides/get_all_presentations">
**Description:** Lists all presentations accessible to the user.
**Parameters:**
- `pageSize` (integer, optional): The number of presentations to return per page.
- `pageToken` (string, optional): A token for pagination.
</Accordion>
<Accordion title="google_slides/delete_presentation">
**Description:** Deletes a presentation by ID.
**Parameters:**
- `presentationId` (string, required): The ID of the presentation to delete.
</Accordion>
</AccordionGroup>
## Usage Examples
### Basic Google Slides Agent Setup
```python
from crewai import Agent, Task, Crew
# Create an agent with Google Slides capabilities
slides_agent = Agent(
role="Presentation Manager",
goal="Create and manage presentations efficiently",
backstory="An AI assistant specialized in presentation creation and content management.",
apps=['google_slides'] # All Google Slides actions will be available
)
# Task to create a presentation
create_presentation_task = Task(
description="Create a new presentation for the quarterly business review with key slides",
agent=slides_agent,
expected_output="Quarterly business review presentation created with structured content"
)
# Run the task
crew = Crew(
agents=[slides_agent],
tasks=[create_presentation_task]
)
crew.kickoff()
```
### Presentation Content Management
```python
from crewai import Agent, Task, Crew
content_manager = Agent(
role="Content Manager",
goal="Manage presentation content and updates",
backstory="An AI assistant that focuses on content creation and presentation updates.",
apps=[
'google_slides/create_blank_presentation',
'google_slides/batch_update_presentation',
'google_slides/get_presentation'
]
)
# Task to create and update presentations
content_task = Task(
description="Create a new presentation and add content slides with charts and text",
agent=content_manager,
expected_output="Presentation created with updated content and visual elements"
)
crew = Crew(
agents=[content_manager],
tasks=[content_task]
)
crew.kickoff()
```
### Data Integration and Visualization
```python
from crewai import Agent, Task, Crew
data_visualizer = Agent(
role="Data Visualizer",
goal="Create presentations with data imported from spreadsheets",
backstory="An AI assistant that specializes in data visualization and presentation integration.",
apps=['google_slides']
)
# Task to create data-driven presentations
visualization_task = Task(
description="""
1. Create a new presentation for monthly sales report
2. Import data from the sales spreadsheet
3. Create charts and visualizations from the imported data
4. Generate thumbnails for slide previews
""",
agent=data_visualizer,
expected_output="Data-driven presentation created with imported spreadsheet data and visualizations"
)
crew = Crew(
agents=[data_visualizer],
tasks=[visualization_task]
)
crew.kickoff()
```
### Presentation Library Management
```python
from crewai import Agent, Task, Crew
library_manager = Agent(
role="Presentation Library Manager",
goal="Manage and organize presentation libraries",
backstory="An AI assistant that manages presentation collections and file organization.",
apps=['google_slides']
)
# Task to manage presentation library
library_task = Task(
description="""
1. List all existing presentations
2. Generate thumbnails for presentation previews
3. Upload supporting files to Drive and link to presentations
4. Organize presentations by topic and date
""",
agent=library_manager,
expected_output="Presentation library organized with thumbnails and linked supporting files"
)
crew = Crew(
agents=[library_manager],
tasks=[library_task]
)
crew.kickoff()
```
### Automated Presentation Workflows
```python
from crewai import Agent, Task, Crew
presentation_automator = Agent(
role="Presentation Automator",
goal="Automate presentation creation and management workflows",
backstory="An AI assistant that automates complex presentation workflows and content generation.",
apps=['google_slides']
)
# Complex presentation automation task
automation_task = Task(
description="""
1. Create multiple presentations for different departments
2. Import relevant data from various spreadsheets
3. Update existing presentations with new content
4. Generate thumbnails for all presentations
5. Link supporting documents from Drive
6. Create a master index presentation with links to all others
""",
agent=presentation_automator,
expected_output="Automated presentation workflow completed with multiple presentations and organized structure"
)
crew = Crew(
agents=[presentation_automator],
tasks=[automation_task]
)
crew.kickoff()
```
### Template and Content Creation
```python
from crewai import Agent, Task, Crew
template_creator = Agent(
role="Template Creator",
goal="Create presentation templates and standardized content",
backstory="An AI assistant that creates consistent presentation templates and content standards.",
apps=['google_slides']
)
# Task to create templates
template_task = Task(
description="""
1. Create blank presentation templates for different use cases
2. Add standard layouts and content placeholders
3. Create sample presentations with best practices
4. Generate thumbnails for template previews
5. Upload template assets to Drive and link appropriately
""",
agent=template_creator,
expected_output="Presentation templates created with standardized layouts and linked assets"
)
crew = Crew(
agents=[template_creator],
tasks=[template_task]
)
crew.kickoff()
```
## Troubleshooting
### Common Issues
**Permission Errors**
- Ensure your Google account has appropriate permissions for Google Slides
- Verify that the OAuth connection includes required scopes for presentations, spreadsheets, and drive access
- Check that presentations are shared with the authenticated account
**Presentation ID Issues**
- Verify that presentation IDs are correct and presentations exist
- Ensure you have access permissions to the presentations you're trying to modify
- Check that presentation IDs are properly formatted
**Content Update Issues**
- Ensure batch update requests are properly formatted according to Google Slides API specifications
- Verify that object IDs for slides and elements exist in the presentation
- Check that write control revision IDs are current if using optimistic concurrency
**Data Import Issues**
- Verify that Google Sheet IDs are correct and accessible
- Ensure data ranges are properly specified using A1 notation
- Check that you have read permissions for the source spreadsheets
**File Upload and Linking Issues**
- Ensure file data is properly encoded for upload
- Verify that Drive file IDs are correct when linking files
- Check that you have appropriate Drive permissions for file operations
**Page and Thumbnail Operations**
- Verify that page object IDs exist in the specified presentation
- Ensure presentations have content before attempting to generate thumbnails
- Check that page structure is valid for thumbnail generation
**Pagination and Listing Issues**
- Use appropriate page sizes for listing presentations
- Implement proper pagination using page tokens for large result sets
- Handle empty result sets gracefully
### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Google Slides integration setup
or troubleshooting.
</Card>

View File

@@ -25,7 +25,7 @@ Before using the HubSpot integration, ensure you have:
2. Find **HubSpot** in the Authentication Integrations section. 2. Find **HubSpot** in the Authentication Integrations section.
3. Click **Connect** and complete the OAuth flow. 3. Click **Connect** and complete the OAuth flow.
4. Grant the necessary permissions for company and contact management. 4. Grant the necessary permissions for company and contact management.
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations) 5. Copy your Enterprise Token from [Account Settings](https://app.crewai.com/crewai_plus/settings/account).
### 2. Install Required Package ### 2. Install Required Package
@@ -33,28 +33,10 @@ Before using the HubSpot integration, ensure you have:
uv add crewai-tools uv add crewai-tools
``` ```
### 3. 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
```
## Available Actions ## Available Actions
<AccordionGroup> <AccordionGroup>
<Accordion title="hubspot/create_company"> <Accordion title="HUBSPOT_CREATE_RECORD_COMPANIES">
**Description:** Create a new company record in HubSpot. **Description:** Create a new company record in HubSpot.
**Parameters:** **Parameters:**
@@ -117,10 +99,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `web_technologies` (string, optional): Web Technologies used. Must be one of the predefined values. - `web_technologies` (string, optional): Web Technologies used. Must be one of the predefined values.
- `website` (string, optional): Website URL. - `website` (string, optional): Website URL.
- `founded_year` (string, optional): Year Founded. - `founded_year` (string, optional): Year Founded.
</Accordion> </Accordion>
<Accordion title="hubspot/create_contact"> <Accordion title="HUBSPOT_CREATE_RECORD_CONTACTS">
**Description:** Create a new contact record in HubSpot. **Description:** Create a new contact record in HubSpot.
**Parameters:** **Parameters:**
@@ -217,10 +198,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `hs_whatsapp_phone_number` (string, optional): WhatsApp Phone Number. - `hs_whatsapp_phone_number` (string, optional): WhatsApp Phone Number.
- `work_email` (string, optional): Work email. - `work_email` (string, optional): Work email.
- `hs_googleplusid` (string, optional): googleplus ID. - `hs_googleplusid` (string, optional): googleplus ID.
</Accordion> </Accordion>
<Accordion title="hubspot/create_deal"> <Accordion title="HUBSPOT_CREATE_RECORD_DEALS">
**Description:** Create a new deal record in HubSpot. **Description:** Create a new deal record in HubSpot.
**Parameters:** **Parameters:**
@@ -233,10 +213,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `dealtype` (string, optional): The type of deal. Available values: `newbusiness`, `existingbusiness`. - `dealtype` (string, optional): The type of deal. Available values: `newbusiness`, `existingbusiness`.
- `description` (string, optional): A description of the deal. - `description` (string, optional): A description of the deal.
- `hs_priority` (string, optional): The priority of the deal. Available values: `low`, `medium`, `high`. - `hs_priority` (string, optional): The priority of the deal. Available values: `low`, `medium`, `high`.
</Accordion> </Accordion>
<Accordion title="hubspot/create_record_engagements"> <Accordion title="HUBSPOT_CREATE_RECORD_ENGAGEMENTS">
**Description:** Create a new engagement (e.g., note, email, call, meeting, task) in HubSpot. **Description:** Create a new engagement (e.g., note, email, call, meeting, task) in HubSpot.
**Parameters:** **Parameters:**
@@ -251,10 +230,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `hs_meeting_body` (string, optional): The description for the meeting. (Used for `MEETING`) - `hs_meeting_body` (string, optional): The description for the meeting. (Used for `MEETING`)
- `hs_meeting_start_time` (string, optional): The start time of the meeting. (Used for `MEETING`) - `hs_meeting_start_time` (string, optional): The start time of the meeting. (Used for `MEETING`)
- `hs_meeting_end_time` (string, optional): The end time of the meeting. (Used for `MEETING`) - `hs_meeting_end_time` (string, optional): The end time of the meeting. (Used for `MEETING`)
</Accordion> </Accordion>
<Accordion title="hubspot/update_company"> <Accordion title="HUBSPOT_UPDATE_RECORD_COMPANIES">
**Description:** Update an existing company record in HubSpot. **Description:** Update an existing company record in HubSpot.
**Parameters:** **Parameters:**
@@ -269,19 +247,17 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `numberofemployees` (number, optional): Number of Employees. - `numberofemployees` (number, optional): Number of Employees.
- `annualrevenue` (number, optional): Annual Revenue. - `annualrevenue` (number, optional): Annual Revenue.
- `description` (string, optional): Description. - `description` (string, optional): Description.
</Accordion> </Accordion>
<Accordion title="hubspot/create_record_any"> <Accordion title="HUBSPOT_CREATE_RECORD_ANY">
**Description:** Create a record for a specified object type in HubSpot. **Description:** Create a record for a specified object type in HubSpot.
**Parameters:** **Parameters:**
- `recordType` (string, required): The object type ID of the custom object. - `recordType` (string, required): The object type ID of the custom object.
- Additional parameters depend on the custom object's schema. - Additional parameters depend on the custom object's schema.
</Accordion> </Accordion>
<Accordion title="hubspot/update_contact"> <Accordion title="HUBSPOT_UPDATE_RECORD_CONTACTS">
**Description:** Update an existing contact record in HubSpot. **Description:** Update an existing contact record in HubSpot.
**Parameters:** **Parameters:**
@@ -293,10 +269,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `company` (string, optional): Company Name. - `company` (string, optional): Company Name.
- `jobtitle` (string, optional): Job Title. - `jobtitle` (string, optional): Job Title.
- `lifecyclestage` (string, optional): Lifecycle Stage. - `lifecyclestage` (string, optional): Lifecycle Stage.
</Accordion> </Accordion>
<Accordion title="hubspot/update_deal"> <Accordion title="HUBSPOT_UPDATE_RECORD_DEALS">
**Description:** Update an existing deal record in HubSpot. **Description:** Update an existing deal record in HubSpot.
**Parameters:** **Parameters:**
@@ -307,10 +282,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `pipeline` (string, optional): The pipeline the deal belongs to. - `pipeline` (string, optional): The pipeline the deal belongs to.
- `closedate` (string, optional): The date the deal is expected to close. - `closedate` (string, optional): The date the deal is expected to close.
- `dealtype` (string, optional): The type of deal. - `dealtype` (string, optional): The type of deal.
</Accordion> </Accordion>
<Accordion title="hubspot/update_record_engagements"> <Accordion title="HUBSPOT_UPDATE_RECORD_ENGAGEMENTS">
**Description:** Update an existing engagement in HubSpot. **Description:** Update an existing engagement in HubSpot.
**Parameters:** **Parameters:**
@@ -319,205 +293,181 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `hs_task_subject` (string, optional): The title of the task. - `hs_task_subject` (string, optional): The title of the task.
- `hs_task_body` (string, optional): The notes for the task. - `hs_task_body` (string, optional): The notes for the task.
- `hs_task_status` (string, optional): The status of the task. - `hs_task_status` (string, optional): The status of the task.
</Accordion> </Accordion>
<Accordion title="hubspot/update_record_any"> <Accordion title="HUBSPOT_UPDATE_RECORD_ANY">
**Description:** Update a record for a specified object type in HubSpot. **Description:** Update a record for a specified object type in HubSpot.
**Parameters:** **Parameters:**
- `recordId` (string, required): The ID of the record to update. - `recordId` (string, required): The ID of the record to update.
- `recordType` (string, required): The object type ID of the custom object. - `recordType` (string, required): The object type ID of the custom object.
- Additional parameters depend on the custom object's schema. - Additional parameters depend on the custom object's schema.
</Accordion> </Accordion>
<Accordion title="hubspot/list_companies"> <Accordion title="HUBSPOT_GET_RECORDS_COMPANIES">
**Description:** Get a list of company records from HubSpot. **Description:** Get a list of company records from HubSpot.
**Parameters:** **Parameters:**
- `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages. - `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages.
</Accordion> </Accordion>
<Accordion title="hubspot/list_contacts"> <Accordion title="HUBSPOT_GET_RECORDS_CONTACTS">
**Description:** Get a list of contact records from HubSpot. **Description:** Get a list of contact records from HubSpot.
**Parameters:** **Parameters:**
- `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages. - `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages.
</Accordion> </Accordion>
<Accordion title="hubspot/list_deals"> <Accordion title="HUBSPOT_GET_RECORDS_DEALS">
**Description:** Get a list of deal records from HubSpot. **Description:** Get a list of deal records from HubSpot.
**Parameters:** **Parameters:**
- `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages. - `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages.
</Accordion> </Accordion>
<Accordion title="hubspot/get_records_engagements"> <Accordion title="HUBSPOT_GET_RECORDS_ENGAGEMENTS">
**Description:** Get a list of engagement records from HubSpot. **Description:** Get a list of engagement records from HubSpot.
**Parameters:** **Parameters:**
- `objectName` (string, required): The type of engagement to fetch (e.g., "notes"). - `objectName` (string, required): The type of engagement to fetch (e.g., "notes").
- `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages. - `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages.
</Accordion> </Accordion>
<Accordion title="hubspot/get_records_any"> <Accordion title="HUBSPOT_GET_RECORDS_ANY">
**Description:** Get a list of records for any specified object type in HubSpot. **Description:** Get a list of records for any specified object type in HubSpot.
**Parameters:** **Parameters:**
- `recordType` (string, required): The object type ID of the custom object. - `recordType` (string, required): The object type ID of the custom object.
- `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages. - `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages.
</Accordion> </Accordion>
<Accordion title="hubspot/get_company"> <Accordion title="HUBSPOT_GET_RECORD_BY_ID_COMPANIES">
**Description:** Get a single company record by its ID. **Description:** Get a single company record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): The ID of the company to retrieve. - `recordId` (string, required): The ID of the company to retrieve.
</Accordion> </Accordion>
<Accordion title="hubspot/get_contact"> <Accordion title="HUBSPOT_GET_RECORD_BY_ID_CONTACTS">
**Description:** Get a single contact record by its ID. **Description:** Get a single contact record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): The ID of the contact to retrieve. - `recordId` (string, required): The ID of the contact to retrieve.
</Accordion> </Accordion>
<Accordion title="hubspot/get_deal"> <Accordion title="HUBSPOT_GET_RECORD_BY_ID_DEALS">
**Description:** Get a single deal record by its ID. **Description:** Get a single deal record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): The ID of the deal to retrieve. - `recordId` (string, required): The ID of the deal to retrieve.
</Accordion> </Accordion>
<Accordion title="hubspot/get_record_by_id_engagements"> <Accordion title="HUBSPOT_GET_RECORD_BY_ID_ENGAGEMENTS">
**Description:** Get a single engagement record by its ID. **Description:** Get a single engagement record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): The ID of the engagement to retrieve. - `recordId` (string, required): The ID of the engagement to retrieve.
</Accordion> </Accordion>
<Accordion title="hubspot/get_record_by_id_any"> <Accordion title="HUBSPOT_GET_RECORD_BY_ID_ANY">
**Description:** Get a single record of any specified object type by its ID. **Description:** Get a single record of any specified object type by its ID.
**Parameters:** **Parameters:**
- `recordType` (string, required): The object type ID of the custom object. - `recordType` (string, required): The object type ID of the custom object.
- `recordId` (string, required): The ID of the record to retrieve. - `recordId` (string, required): The ID of the record to retrieve.
</Accordion> </Accordion>
<Accordion title="hubspot/search_companies"> <Accordion title="HUBSPOT_SEARCH_RECORDS_COMPANIES">
**Description:** Search for company records in HubSpot using a filter formula. **Description:** Search for company records in HubSpot using a filter formula.
**Parameters:** **Parameters:**
- `filterFormula` (object, optional): A filter in disjunctive normal form (OR of ANDs). - `filterFormula` (object, optional): A filter in disjunctive normal form (OR of ANDs).
- `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages. - `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages.
</Accordion> </Accordion>
<Accordion title="hubspot/search_contacts"> <Accordion title="HUBSPOT_SEARCH_RECORDS_CONTACTS">
**Description:** Search for contact records in HubSpot using a filter formula. **Description:** Search for contact records in HubSpot using a filter formula.
**Parameters:** **Parameters:**
- `filterFormula` (object, optional): A filter in disjunctive normal form (OR of ANDs). - `filterFormula` (object, optional): A filter in disjunctive normal form (OR of ANDs).
- `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages. - `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages.
</Accordion> </Accordion>
<Accordion title="hubspot/search_deals"> <Accordion title="HUBSPOT_SEARCH_RECORDS_DEALS">
**Description:** Search for deal records in HubSpot using a filter formula. **Description:** Search for deal records in HubSpot using a filter formula.
**Parameters:** **Parameters:**
- `filterFormula` (object, optional): A filter in disjunctive normal form (OR of ANDs). - `filterFormula` (object, optional): A filter in disjunctive normal form (OR of ANDs).
- `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages. - `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages.
</Accordion> </Accordion>
<Accordion title="hubspot/search_records_engagements"> <Accordion title="HUBSPOT_SEARCH_RECORDS_ENGAGEMENTS">
**Description:** Search for engagement records in HubSpot using a filter formula. **Description:** Search for engagement records in HubSpot using a filter formula.
**Parameters:** **Parameters:**
- `engagementFilterFormula` (object, optional): A filter for engagements. - `engagementFilterFormula` (object, optional): A filter for engagements.
- `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages. - `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages.
</Accordion> </Accordion>
<Accordion title="hubspot/search_records_any"> <Accordion title="HUBSPOT_SEARCH_RECORDS_ANY">
**Description:** Search for records of any specified object type in HubSpot. **Description:** Search for records of any specified object type in HubSpot.
**Parameters:** **Parameters:**
- `recordType` (string, required): The object type ID to search. - `recordType` (string, required): The object type ID to search.
- `filterFormula` (string, optional): The filter formula to apply. - `filterFormula` (string, optional): The filter formula to apply.
- `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages. - `paginationParameters` (object, optional): Use `pageCursor` to fetch subsequent pages.
</Accordion> </Accordion>
<Accordion title="hubspot/delete_record_companies"> <Accordion title="HUBSPOT_DELETE_RECORD_COMPANIES">
**Description:** Delete a company record by its ID. **Description:** Delete a company record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): The ID of the company to delete. - `recordId` (string, required): The ID of the company to delete.
</Accordion> </Accordion>
<Accordion title="hubspot/delete_record_contacts"> <Accordion title="HUBSPOT_DELETE_RECORD_CONTACTS">
**Description:** Delete a contact record by its ID. **Description:** Delete a contact record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): The ID of the contact to delete. - `recordId` (string, required): The ID of the contact to delete.
</Accordion> </Accordion>
<Accordion title="hubspot/delete_record_deals"> <Accordion title="HUBSPOT_DELETE_RECORD_DEALS">
**Description:** Delete a deal record by its ID. **Description:** Delete a deal record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): The ID of the deal to delete. - `recordId` (string, required): The ID of the deal to delete.
</Accordion> </Accordion>
<Accordion title="hubspot/delete_record_engagements"> <Accordion title="HUBSPOT_DELETE_RECORD_ENGAGEMENTS">
**Description:** Delete an engagement record by its ID. **Description:** Delete an engagement record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): The ID of the engagement to delete. - `recordId` (string, required): The ID of the engagement to delete.
</Accordion> </Accordion>
<Accordion title="hubspot/delete_record_any"> <Accordion title="HUBSPOT_DELETE_RECORD_ANY">
**Description:** Delete a record of any specified object type by its ID. **Description:** Delete a record of any specified object type by its ID.
**Parameters:** **Parameters:**
- `recordType` (string, required): The object type ID of the custom object. - `recordType` (string, required): The object type ID of the custom object.
- `recordId` (string, required): The ID of the record to delete. - `recordId` (string, required): The ID of the record to delete.
</Accordion> </Accordion>
<Accordion title="hubspot/get_contacts_by_list_id"> <Accordion title="HUBSPOT_GET_CONTACTS_BY_LIST_ID">
**Description:** Get contacts from a specific list by its ID. **Description:** Get contacts from a specific list by its ID.
**Parameters:** **Parameters:**
- `listId` (string, required): The ID of the list to get contacts from. - `listId` (string, required): The ID of the list to get contacts from.
- `paginationParameters` (object, optional): Use `pageCursor` for subsequent pages. - `paginationParameters` (object, optional): Use `pageCursor` for subsequent pages.
</Accordion> </Accordion>
<Accordion title="hubspot/describe_action_schema"> <Accordion title="HUBSPOT_DESCRIBE_ACTION_SCHEMA">
**Description:** Get the expected schema for a given object type and operation. **Description:** Get the expected schema for a given object type and operation.
**Parameters:** **Parameters:**
- `recordType` (string, required): The object type ID (e.g., 'companies'). - `recordType` (string, required): The object type ID (e.g., 'companies').
- `operation` (string, required): The operation type (e.g., 'CREATE_RECORD'). - `operation` (string, required): The operation type (e.g., 'CREATE_RECORD').
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -527,13 +477,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (HubSpot tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with HubSpot capabilities # Create an agent with HubSpot capabilities
hubspot_agent = Agent( hubspot_agent = Agent(
role="CRM Manager", role="CRM Manager",
goal="Manage company and contact records in HubSpot", goal="Manage company and contact records in HubSpot",
backstory="An AI assistant specialized in CRM management.", backstory="An AI assistant specialized in CRM management.",
apps=['hubspot'] # All HubSpot actions will be available tools=[enterprise_tools]
) )
# Task to create a new company # Task to create a new company
@@ -555,14 +511,19 @@ crew.kickoff()
### Filtering Specific HubSpot Tools ### Filtering Specific HubSpot Tools
```python ```python
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get only the tool to create contacts
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["hubspot_create_record_contacts"]
)
# Create agent with specific HubSpot actions only
contact_creator = Agent( contact_creator = Agent(
role="Contact Creator", role="Contact Creator",
goal="Create new contacts in HubSpot", goal="Create new contacts in HubSpot",
backstory="An AI assistant that focuses on creating new contact entries in the CRM.", backstory="An AI assistant that focuses on creating new contact entries in the CRM.",
apps=['hubspot/create_contact'] # Only contact creation action tools=[enterprise_tools]
) )
# Task to create a contact # Task to create a contact
@@ -584,13 +545,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create agent with HubSpot contact management capabilities
crm_manager = Agent( crm_manager = Agent(
role="CRM Manager", role="CRM Manager",
goal="Manage and organize HubSpot contacts efficiently.", goal="Manage and organize HubSpot contacts efficiently.",
backstory="An experienced CRM manager who maintains an organized contact database.", backstory="An experienced CRM manager who maintains an organized contact database.",
apps=['hubspot'] # All HubSpot actions including contact management tools=[enterprise_tools]
) )
# Task to manage contacts # Task to manage contacts
@@ -611,6 +576,5 @@ crew.kickoff()
### Getting Help ### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with HubSpot integration setup or Contact our support team for assistance with HubSpot integration setup or troubleshooting.
troubleshooting.
</Card> </Card>

View File

@@ -25,7 +25,7 @@ Before using the Jira integration, ensure you have:
2. Find **Jira** in the Authentication Integrations section 2. Find **Jira** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow 3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for issue and project management 4. Grant the necessary permissions for issue and project management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations) 5. Copy your Enterprise Token from [Account Settings](https://app.crewai.com/crewai_plus/settings/account)
### 2. Install Required Package ### 2. Install Required Package
@@ -33,28 +33,10 @@ Before using the Jira integration, ensure you have:
uv add crewai-tools uv add crewai-tools
``` ```
### 3. 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
```
## Available Actions ## Available Actions
<AccordionGroup> <AccordionGroup>
<Accordion title="jira/create_issue"> <Accordion title="JIRA_CREATE_ISSUE">
**Description:** Create an issue in Jira. **Description:** Create an issue in Jira.
**Parameters:** **Parameters:**
@@ -72,10 +54,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
"customfield_10001": "value" "customfield_10001": "value"
} }
``` ```
</Accordion> </Accordion>
<Accordion title="jira/update_issue"> <Accordion title="JIRA_UPDATE_ISSUE">
**Description:** Update an issue in Jira. **Description:** Update an issue in Jira.
**Parameters:** **Parameters:**
@@ -88,18 +69,16 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- Options: `description`, `descriptionJSON` - Options: `description`, `descriptionJSON`
- `description` (string, optional): Description - A detailed description of the issue. This field appears only when 'descriptionType' = 'description'. - `description` (string, optional): Description - A detailed description of the issue. This field appears only when 'descriptionType' = 'description'.
- `additionalFields` (string, optional): Additional Fields - Specify any other fields that should be included in JSON format. - `additionalFields` (string, optional): Additional Fields - Specify any other fields that should be included in JSON format.
</Accordion> </Accordion>
<Accordion title="jira/get_issue_by_key"> <Accordion title="JIRA_GET_ISSUE_BY_KEY">
**Description:** Get an issue by key in Jira. **Description:** Get an issue by key in Jira.
**Parameters:** **Parameters:**
- `issueKey` (string, required): Issue Key (example: "TEST-1234"). - `issueKey` (string, required): Issue Key (example: "TEST-1234").
</Accordion> </Accordion>
<Accordion title="jira/filter_issues"> <Accordion title="JIRA_FILTER_ISSUES">
**Description:** Search issues in Jira using filters. **Description:** Search issues in Jira using filters.
**Parameters:** **Parameters:**
@@ -123,10 +102,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
``` ```
Available operators: `$stringExactlyMatches`, `$stringDoesNotExactlyMatch`, `$stringIsIn`, `$stringIsNotIn`, `$stringContains`, `$stringDoesNotContain`, `$stringGreaterThan`, `$stringLessThan` Available operators: `$stringExactlyMatches`, `$stringDoesNotExactlyMatch`, `$stringIsIn`, `$stringIsNotIn`, `$stringContains`, `$stringDoesNotContain`, `$stringGreaterThan`, `$stringLessThan`
- `limit` (string, optional): Limit results - Limit the maximum number of issues to return. Defaults to 10 if left blank. - `limit` (string, optional): Limit results - Limit the maximum number of issues to return. Defaults to 10 if left blank.
</Accordion> </Accordion>
<Accordion title="jira/search_by_jql"> <Accordion title="JIRA_SEARCH_BY_JQL">
**Description:** Search issues by JQL in Jira. **Description:** Search issues by JQL in Jira.
**Parameters:** **Parameters:**
@@ -137,27 +115,24 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
"pageCursor": "cursor_string" "pageCursor": "cursor_string"
} }
``` ```
</Accordion> </Accordion>
<Accordion title="jira/update_issue_any"> <Accordion title="JIRA_UPDATE_ISSUE_ANY">
**Description:** Update any issue in Jira. Use DESCRIBE_ACTION_SCHEMA to get properties schema for this function. **Description:** Update any issue in Jira. Use DESCRIBE_ACTION_SCHEMA to get properties schema for this function.
**Parameters:** No specific parameters - use JIRA_DESCRIBE_ACTION_SCHEMA first to get the expected schema. **Parameters:** No specific parameters - use JIRA_DESCRIBE_ACTION_SCHEMA first to get the expected schema.
</Accordion> </Accordion>
<Accordion title="jira/describe_action_schema"> <Accordion title="JIRA_DESCRIBE_ACTION_SCHEMA">
**Description:** Get the expected schema for an issue type. Use this function first if no other function matches the issue type you want to operate on. **Description:** Get the expected schema for an issue type. Use this function first if no other function matches the issue type you want to operate on.
**Parameters:** **Parameters:**
- `issueTypeId` (string, required): Issue Type ID. - `issueTypeId` (string, required): Issue Type ID.
- `projectKey` (string, required): Project key. - `projectKey` (string, required): Project key.
- `operation` (string, required): Operation Type value, for example CREATE_ISSUE or UPDATE_ISSUE. - `operation` (string, required): Operation Type value, for example CREATE_ISSUE or UPDATE_ISSUE.
</Accordion> </Accordion>
<Accordion title="jira/get_projects"> <Accordion title="JIRA_GET_PROJECTS">
**Description:** Get Projects in Jira. **Description:** Get Projects in Jira.
**Parameters:** **Parameters:**
@@ -167,38 +142,33 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
"pageCursor": "cursor_string" "pageCursor": "cursor_string"
} }
``` ```
</Accordion> </Accordion>
<Accordion title="jira/get_issue_types_by_project"> <Accordion title="JIRA_GET_ISSUE_TYPES_BY_PROJECT">
**Description:** Get Issue Types by project in Jira. **Description:** Get Issue Types by project in Jira.
**Parameters:** **Parameters:**
- `project` (string, required): Project key. - `project` (string, required): Project key.
</Accordion> </Accordion>
<Accordion title="jira/get_issue_types"> <Accordion title="JIRA_GET_ISSUE_TYPES">
**Description:** Get all Issue Types in Jira. **Description:** Get all Issue Types in Jira.
**Parameters:** None required. **Parameters:** None required.
</Accordion> </Accordion>
<Accordion title="jira/get_issue_status_by_project"> <Accordion title="JIRA_GET_ISSUE_STATUS_BY_PROJECT">
**Description:** Get issue statuses for a given project. **Description:** Get issue statuses for a given project.
**Parameters:** **Parameters:**
- `project` (string, required): Project key. - `project` (string, required): Project key.
</Accordion> </Accordion>
<Accordion title="jira/get_all_assignees_by_project"> <Accordion title="JIRA_GET_ALL_ASSIGNEES_BY_PROJECT">
**Description:** Get assignees for a given project. **Description:** Get assignees for a given project.
**Parameters:** **Parameters:**
- `project` (string, required): Project key. - `project` (string, required): Project key.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -208,14 +178,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Jira tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Jira capabilities # Create an agent with Jira capabilities
jira_agent = Agent( jira_agent = Agent(
role="Issue Manager", role="Issue Manager",
goal="Manage Jira issues and track project progress efficiently", goal="Manage Jira issues and track project progress efficiently",
backstory="An AI assistant specialized in issue tracking and project management.", backstory="An AI assistant specialized in issue tracking and project management.",
apps=['jira'] # All Jira actions will be available tools=[enterprise_tools]
) )
# Task to create a bug report # Task to create a bug report
@@ -237,12 +212,19 @@ crew.kickoff()
### Filtering Specific Jira Tools ### Filtering Specific Jira Tools
```python ```python
from crewai_tools import CrewaiEnterpriseTools
# Get only specific Jira tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["jira_create_issue", "jira_update_issue", "jira_search_by_jql"]
)
issue_coordinator = Agent( issue_coordinator = Agent(
role="Issue Coordinator", role="Issue Coordinator",
goal="Create and manage Jira issues efficiently", goal="Create and manage Jira issues efficiently",
backstory="An AI assistant that focuses on issue creation and management.", backstory="An AI assistant that focuses on issue creation and management.",
apps=['jira'] tools=enterprise_tools
) )
# Task to manage issue workflow # Task to manage issue workflow
@@ -264,12 +246,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
project_analyst = Agent( project_analyst = Agent(
role="Project Analyst", role="Project Analyst",
goal="Analyze project data and generate insights from Jira", goal="Analyze project data and generate insights from Jira",
backstory="An experienced project analyst who extracts insights from project management data.", backstory="An experienced project analyst who extracts insights from project management data.",
apps=['jira'] tools=[enterprise_tools]
) )
# Task to analyze project status # Task to analyze project status
@@ -296,12 +283,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
automation_manager = Agent( automation_manager = Agent(
role="Automation Manager", role="Automation Manager",
goal="Automate issue management and workflow processes", goal="Automate issue management and workflow processes",
backstory="An AI assistant that automates repetitive issue management tasks.", backstory="An AI assistant that automates repetitive issue management tasks.",
apps=['jira'] tools=[enterprise_tools]
) )
# Task to automate issue management # Task to automate issue management
@@ -329,12 +321,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
schema_specialist = Agent( schema_specialist = Agent(
role="Schema Specialist", role="Schema Specialist",
goal="Handle complex Jira operations using dynamic schemas", goal="Handle complex Jira operations using dynamic schemas",
backstory="An AI assistant that can work with dynamic Jira schemas and custom issue types.", backstory="An AI assistant that can work with dynamic Jira schemas and custom issue types.",
apps=['jira'] tools=[enterprise_tools]
) )
# Task using schema-based operations # Task using schema-based operations
@@ -362,37 +359,31 @@ crew.kickoff()
### Common Issues ### Common Issues
**Permission Errors** **Permission Errors**
- Ensure your Jira account has necessary permissions for the target projects - Ensure your Jira account has necessary permissions for the target projects
- Verify that the OAuth connection includes required scopes for Jira API - Verify that the OAuth connection includes required scopes for Jira API
- Check if you have create/edit permissions for issues in the specified projects - Check if you have create/edit permissions for issues in the specified projects
**Invalid Project or Issue Keys** **Invalid Project or Issue Keys**
- Double-check project keys and issue keys for correct format (e.g., "PROJ-123") - Double-check project keys and issue keys for correct format (e.g., "PROJ-123")
- Ensure projects exist and are accessible to your account - Ensure projects exist and are accessible to your account
- Verify that issue keys reference existing issues - Verify that issue keys reference existing issues
**Issue Type and Status Issues** **Issue Type and Status Issues**
- Use JIRA_GET_ISSUE_TYPES_BY_PROJECT to get valid issue types for a project - Use JIRA_GET_ISSUE_TYPES_BY_PROJECT to get valid issue types for a project
- Use JIRA_GET_ISSUE_STATUS_BY_PROJECT to get valid statuses - Use JIRA_GET_ISSUE_STATUS_BY_PROJECT to get valid statuses
- Ensure issue types and statuses are available in the target project - Ensure issue types and statuses are available in the target project
**JQL Query Problems** **JQL Query Problems**
- Test JQL queries in Jira's issue search before using in API calls - Test JQL queries in Jira's issue search before using in API calls
- Ensure field names in JQL are spelled correctly and exist in your Jira instance - Ensure field names in JQL are spelled correctly and exist in your Jira instance
- Use proper JQL syntax for complex queries - Use proper JQL syntax for complex queries
**Custom Fields and Schema Issues** **Custom Fields and Schema Issues**
- Use JIRA_DESCRIBE_ACTION_SCHEMA to get the correct schema for complex issue types - Use JIRA_DESCRIBE_ACTION_SCHEMA to get the correct schema for complex issue types
- Ensure custom field IDs are correct (e.g., "customfield_10001") - Ensure custom field IDs are correct (e.g., "customfield_10001")
- Verify that custom fields are available in the target project and issue type - Verify that custom fields are available in the target project and issue type
**Filter Formula Issues** **Filter Formula Issues**
- Ensure filter formulas follow the correct JSON structure for disjunctive normal form - Ensure filter formulas follow the correct JSON structure for disjunctive normal form
- Use valid field names that exist in your Jira configuration - Use valid field names that exist in your Jira configuration
- Test simple filters before building complex multi-condition queries - Test simple filters before building complex multi-condition queries
@@ -400,6 +391,5 @@ crew.kickoff()
### Getting Help ### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Jira integration setup or Contact our support team for assistance with Jira integration setup or troubleshooting.
troubleshooting.
</Card> </Card>

View File

@@ -25,7 +25,7 @@ Before using the Linear integration, ensure you have:
2. Find **Linear** in the Authentication Integrations section 2. Find **Linear** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow 3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for issue and project management 4. Grant the necessary permissions for issue and project management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations) 5. Copy your Enterprise Token from [Account Settings](https://app.crewai.com/crewai_plus/settings/account)
### 2. Install Required Package ### 2. Install Required Package
@@ -33,28 +33,10 @@ Before using the Linear integration, ensure you have:
uv add crewai-tools uv add crewai-tools
``` ```
### 3. 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
```
## Available Actions ## Available Actions
<AccordionGroup> <AccordionGroup>
<Accordion title="linear/create_issue"> <Accordion title="LINEAR_CREATE_ISSUE">
**Description:** Create a new issue in Linear. **Description:** Create a new issue in Linear.
**Parameters:** **Parameters:**
@@ -72,10 +54,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
"labelIds": ["a70bdf0f-530a-4887-857d-46151b52b47c"] "labelIds": ["a70bdf0f-530a-4887-857d-46151b52b47c"]
} }
``` ```
</Accordion> </Accordion>
<Accordion title="linear/update_issue"> <Accordion title="LINEAR_UPDATE_ISSUE">
**Description:** Update an issue in Linear. **Description:** Update an issue in Linear.
**Parameters:** **Parameters:**
@@ -93,26 +74,23 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
"labelIds": ["a70bdf0f-530a-4887-857d-46151b52b47c"] "labelIds": ["a70bdf0f-530a-4887-857d-46151b52b47c"]
} }
``` ```
</Accordion> </Accordion>
<Accordion title="linear/get_issue_by_id"> <Accordion title="LINEAR_GET_ISSUE_BY_ID">
**Description:** Get an issue by ID in Linear. **Description:** Get an issue by ID in Linear.
**Parameters:** **Parameters:**
- `issueId` (string, required): Issue ID - Specify the record ID of the issue to fetch. (example: "90fbc706-18cd-42c9-ae66-6bd344cc8977"). - `issueId` (string, required): Issue ID - Specify the record ID of the issue to fetch. (example: "90fbc706-18cd-42c9-ae66-6bd344cc8977").
</Accordion> </Accordion>
<Accordion title="linear/get_issue_by_issue_identifier"> <Accordion title="LINEAR_GET_ISSUE_BY_ISSUE_IDENTIFIER">
**Description:** Get an issue by issue identifier in Linear. **Description:** Get an issue by issue identifier in Linear.
**Parameters:** **Parameters:**
- `externalId` (string, required): External ID - Specify the human-readable Issue identifier of the issue to fetch. (example: "ABC-1"). - `externalId` (string, required): External ID - Specify the human-readable Issue identifier of the issue to fetch. (example: "ABC-1").
</Accordion> </Accordion>
<Accordion title="linear/search_issue"> <Accordion title="LINEAR_SEARCH_ISSUE">
**Description:** Search issues in Linear. **Description:** Search issues in Linear.
**Parameters:** **Parameters:**
@@ -137,26 +115,23 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
``` ```
Available fields: `title`, `number`, `project`, `createdAt` Available fields: `title`, `number`, `project`, `createdAt`
Available operators: `$stringExactlyMatches`, `$stringDoesNotExactlyMatch`, `$stringIsIn`, `$stringIsNotIn`, `$stringStartsWith`, `$stringDoesNotStartWith`, `$stringEndsWith`, `$stringDoesNotEndWith`, `$stringContains`, `$stringDoesNotContain`, `$stringGreaterThan`, `$stringLessThan`, `$numberGreaterThanOrEqualTo`, `$numberLessThanOrEqualTo`, `$numberGreaterThan`, `$numberLessThan`, `$dateTimeAfter`, `$dateTimeBefore` Available operators: `$stringExactlyMatches`, `$stringDoesNotExactlyMatch`, `$stringIsIn`, `$stringIsNotIn`, `$stringStartsWith`, `$stringDoesNotStartWith`, `$stringEndsWith`, `$stringDoesNotEndWith`, `$stringContains`, `$stringDoesNotContain`, `$stringGreaterThan`, `$stringLessThan`, `$numberGreaterThanOrEqualTo`, `$numberLessThanOrEqualTo`, `$numberGreaterThan`, `$numberLessThan`, `$dateTimeAfter`, `$dateTimeBefore`
</Accordion> </Accordion>
<Accordion title="linear/delete_issue"> <Accordion title="LINEAR_DELETE_ISSUE">
**Description:** Delete an issue in Linear. **Description:** Delete an issue in Linear.
**Parameters:** **Parameters:**
- `issueId` (string, required): Issue ID - Specify the record ID of the issue to delete. (example: "90fbc706-18cd-42c9-ae66-6bd344cc8977"). - `issueId` (string, required): Issue ID - Specify the record ID of the issue to delete. (example: "90fbc706-18cd-42c9-ae66-6bd344cc8977").
</Accordion> </Accordion>
<Accordion title="linear/archive_issue"> <Accordion title="LINEAR_ARCHIVE_ISSUE">
**Description:** Archive an issue in Linear. **Description:** Archive an issue in Linear.
**Parameters:** **Parameters:**
- `issueId` (string, required): Issue ID - Specify the record ID of the issue to archive. (example: "90fbc706-18cd-42c9-ae66-6bd344cc8977"). - `issueId` (string, required): Issue ID - Specify the record ID of the issue to archive. (example: "90fbc706-18cd-42c9-ae66-6bd344cc8977").
</Accordion> </Accordion>
<Accordion title="linear/create_sub_issue"> <Accordion title="LINEAR_CREATE_SUB_ISSUE">
**Description:** Create a sub-issue in Linear. **Description:** Create a sub-issue in Linear.
**Parameters:** **Parameters:**
@@ -170,10 +145,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
"lead": "linear_user_id" "lead": "linear_user_id"
} }
``` ```
</Accordion> </Accordion>
<Accordion title="linear/create_project"> <Accordion title="LINEAR_CREATE_PROJECT">
**Description:** Create a new project in Linear. **Description:** Create a new project in Linear.
**Parameters:** **Parameters:**
@@ -193,10 +167,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
"description": "" "description": ""
} }
``` ```
</Accordion> </Accordion>
<Accordion title="linear/update_project"> <Accordion title="LINEAR_UPDATE_PROJECT">
**Description:** Update a project in Linear. **Description:** Update a project in Linear.
**Parameters:** **Parameters:**
@@ -210,26 +183,23 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
"description": "" "description": ""
} }
``` ```
</Accordion> </Accordion>
<Accordion title="linear/get_project_by_id"> <Accordion title="LINEAR_GET_PROJECT_BY_ID">
**Description:** Get a project by ID in Linear. **Description:** Get a project by ID in Linear.
**Parameters:** **Parameters:**
- `projectId` (string, required): Project ID - Specify the Project ID of the project to fetch. (example: "a6634484-6061-4ac7-9739-7dc5e52c796b"). - `projectId` (string, required): Project ID - Specify the Project ID of the project to fetch. (example: "a6634484-6061-4ac7-9739-7dc5e52c796b").
</Accordion> </Accordion>
<Accordion title="linear/delete_project"> <Accordion title="LINEAR_DELETE_PROJECT">
**Description:** Delete a project in Linear. **Description:** Delete a project in Linear.
**Parameters:** **Parameters:**
- `projectId` (string, required): Project ID - Specify the Project ID of the project to delete. (example: "a6634484-6061-4ac7-9739-7dc5e52c796b"). - `projectId` (string, required): Project ID - Specify the Project ID of the project to delete. (example: "a6634484-6061-4ac7-9739-7dc5e52c796b").
</Accordion> </Accordion>
<Accordion title="linear/search_teams"> <Accordion title="LINEAR_SEARCH_TEAMS">
**Description:** Search teams in Linear. **Description:** Search teams in Linear.
**Parameters:** **Parameters:**
@@ -252,7 +222,6 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
} }
``` ```
Available fields: `id`, `name` Available fields: `id`, `name`
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -262,14 +231,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Linear tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Linear capabilities # Create an agent with Linear capabilities
linear_agent = Agent( linear_agent = Agent(
role="Development Manager", role="Development Manager",
goal="Manage Linear issues and track development progress efficiently", goal="Manage Linear issues and track development progress efficiently",
backstory="An AI assistant specialized in software development project management.", backstory="An AI assistant specialized in software development project management.",
apps=['linear'] # All Linear actions will be available tools=[enterprise_tools]
) )
# Task to create a bug report # Task to create a bug report
@@ -291,12 +265,19 @@ crew.kickoff()
### Filtering Specific Linear Tools ### Filtering Specific Linear Tools
```python ```python
from crewai_tools import CrewaiEnterpriseTools
# Get only specific Linear tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["linear_create_issue", "linear_update_issue", "linear_search_issue"]
)
issue_manager = Agent( issue_manager = Agent(
role="Issue Manager", role="Issue Manager",
goal="Create and manage Linear issues efficiently", goal="Create and manage Linear issues efficiently",
backstory="An AI assistant that focuses on issue creation and lifecycle management.", backstory="An AI assistant that focuses on issue creation and lifecycle management.",
apps=['linear/create_issue'] tools=enterprise_tools
) )
# Task to manage issue workflow # Task to manage issue workflow
@@ -318,12 +299,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
project_coordinator = Agent( project_coordinator = Agent(
role="Project Coordinator", role="Project Coordinator",
goal="Coordinate projects and teams in Linear efficiently", goal="Coordinate projects and teams in Linear efficiently",
backstory="An experienced project coordinator who manages development cycles and team workflows.", backstory="An experienced project coordinator who manages development cycles and team workflows.",
apps=['linear'] tools=[enterprise_tools]
) )
# Task to coordinate project setup # Task to coordinate project setup
@@ -350,12 +336,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
task_organizer = Agent( task_organizer = Agent(
role="Task Organizer", role="Task Organizer",
goal="Organize complex issues into manageable sub-tasks", goal="Organize complex issues into manageable sub-tasks",
backstory="An AI assistant that breaks down complex development work into organized sub-tasks.", backstory="An AI assistant that breaks down complex development work into organized sub-tasks.",
apps=['linear'] tools=[enterprise_tools]
) )
# Task to create issue hierarchy # Task to create issue hierarchy
@@ -382,12 +373,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
workflow_automator = Agent( workflow_automator = Agent(
role="Workflow Automator", role="Workflow Automator",
goal="Automate development workflow processes in Linear", goal="Automate development workflow processes in Linear",
backstory="An AI assistant that automates repetitive development workflow tasks.", backstory="An AI assistant that automates repetitive development workflow tasks.",
apps=['linear'] tools=[enterprise_tools]
) )
# Complex workflow automation task # Complex workflow automation task
@@ -416,44 +412,37 @@ crew.kickoff()
### Common Issues ### Common Issues
**Permission Errors** **Permission Errors**
- Ensure your Linear account has necessary permissions for the target workspace - Ensure your Linear account has necessary permissions for the target workspace
- Verify that the OAuth connection includes required scopes for Linear API - Verify that the OAuth connection includes required scopes for Linear API
- Check if you have create/edit permissions for issues and projects in the workspace - Check if you have create/edit permissions for issues and projects in the workspace
**Invalid IDs and References** **Invalid IDs and References**
- Double-check team IDs, issue IDs, and project IDs for correct UUID format - Double-check team IDs, issue IDs, and project IDs for correct UUID format
- Ensure referenced entities (teams, projects, cycles) exist and are accessible - Ensure referenced entities (teams, projects, cycles) exist and are accessible
- Verify that issue identifiers follow the correct format (e.g., "ABC-1") - Verify that issue identifiers follow the correct format (e.g., "ABC-1")
**Team and Project Association Issues** **Team and Project Association Issues**
- Use LINEAR_SEARCH_TEAMS to get valid team IDs before creating issues or projects - Use LINEAR_SEARCH_TEAMS to get valid team IDs before creating issues or projects
- Ensure teams exist and are active in your workspace - Ensure teams exist and are active in your workspace
- Verify that team IDs are properly formatted as UUIDs - Verify that team IDs are properly formatted as UUIDs
**Issue Status and Priority Problems** **Issue Status and Priority Problems**
- Check that status IDs reference valid workflow states for the team - Check that status IDs reference valid workflow states for the team
- Ensure priority values are within the valid range for your Linear configuration - Ensure priority values are within the valid range for your Linear configuration
- Verify that custom fields and labels exist before referencing them - Verify that custom fields and labels exist before referencing them
**Date and Time Format Issues** **Date and Time Format Issues**
- Use ISO 8601 format for due dates and timestamps - Use ISO 8601 format for due dates and timestamps
- Ensure time zones are handled correctly for due date calculations - Ensure time zones are handled correctly for due date calculations
- Verify that date values are valid and in the future for due dates - Verify that date values are valid and in the future for due dates
**Search and Filter Issues** **Search and Filter Issues**
- Ensure search queries are properly formatted and not empty - Ensure search queries are properly formatted and not empty
- Use valid field names in filter formulas: `title`, `number`, `project`, `createdAt` - Use valid field names in filter formulas: `title`, `number`, `project`, `createdAt`
- Test simple filters before building complex multi-condition queries - Test simple filters before building complex multi-condition queries
- Verify that operator types match the data types of the fields being filtered - Verify that operator types match the data types of the fields being filtered
**Sub-issue Creation Problems** **Sub-issue Creation Problems**
- Ensure parent issue IDs are valid and accessible - Ensure parent issue IDs are valid and accessible
- Verify that the team ID for sub-issues matches or is compatible with the parent issue's team - Verify that the team ID for sub-issues matches or is compatible with the parent issue's team
- Check that parent issues are not already archived or deleted - Check that parent issues are not already archived or deleted
@@ -461,6 +450,5 @@ crew.kickoff()
### Getting Help ### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Linear integration setup or Contact our support team for assistance with Linear integration setup or troubleshooting.
troubleshooting.
</Card> </Card>

View File

@@ -1,488 +0,0 @@
---
title: Microsoft Excel Integration
description: "Workbook and data management with Microsoft Excel integration for CrewAI."
icon: "table"
mode: "wide"
---
## Overview
Enable your agents to create and manage Excel workbooks, worksheets, tables, and charts in OneDrive or SharePoint. Manipulate data ranges, create visualizations, manage tables, and streamline your spreadsheet workflows with AI-powered automation.
## Prerequisites
Before using the Microsoft Excel integration, ensure you have:
- A [CrewAI AMP](https://app.crewai.com) account with an active subscription
- A Microsoft 365 account with Excel and OneDrive/SharePoint access
- Connected your Microsoft account through the [Integrations page](https://app.crewai.com/crewai_plus/connectors)
## Setting Up Microsoft Excel Integration
### 1. Connect Your Microsoft Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Microsoft Excel** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for files and Excel workbook access
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Actions
<AccordionGroup>
<Accordion title="microsoft_excel/create_workbook">
**Description:** Create a new Excel workbook in OneDrive or SharePoint.
**Parameters:**
- `file_path` (string, required): Path where to create the workbook (e.g., 'MyWorkbook.xlsx')
- `worksheets` (array, optional): Initial worksheets to create
```json
[
{
"name": "Sheet1"
},
{
"name": "Data"
}
]
```
</Accordion>
<Accordion title="microsoft_excel/get_workbooks">
**Description:** Get all Excel workbooks from OneDrive or SharePoint.
**Parameters:**
- `select` (string, optional): Select specific properties to return
- `filter` (string, optional): Filter results using OData syntax
- `expand` (string, optional): Expand related resources inline
- `top` (integer, optional): Number of items to return. Minimum: 1, Maximum: 999
- `orderby` (string, optional): Order results by specified properties
</Accordion>
<Accordion title="microsoft_excel/get_worksheets">
**Description:** Get all worksheets in an Excel workbook.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `select` (string, optional): Select specific properties to return (e.g., 'id,name,position')
- `filter` (string, optional): Filter results using OData syntax
- `expand` (string, optional): Expand related resources inline
- `top` (integer, optional): Number of items to return. Minimum: 1, Maximum: 999
- `orderby` (string, optional): Order results by specified properties
</Accordion>
<Accordion title="microsoft_excel/create_worksheet">
**Description:** Create a new worksheet in an Excel workbook.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `name` (string, required): Name of the new worksheet
</Accordion>
<Accordion title="microsoft_excel/get_range_data">
**Description:** Get data from a specific range in an Excel worksheet.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `worksheet_name` (string, required): Name of the worksheet
- `range` (string, required): Range address (e.g., 'A1:C10')
</Accordion>
<Accordion title="microsoft_excel/update_range_data">
**Description:** Update data in a specific range in an Excel worksheet.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `worksheet_name` (string, required): Name of the worksheet
- `range` (string, required): Range address (e.g., 'A1:C10')
- `values` (array, required): 2D array of values to set in the range
```json
[
["Name", "Age", "City"],
["John", 30, "New York"],
["Jane", 25, "Los Angeles"]
]
```
</Accordion>
<Accordion title="microsoft_excel/add_table">
**Description:** Create a table in an Excel worksheet.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `worksheet_name` (string, required): Name of the worksheet
- `range` (string, required): Range for the table (e.g., 'A1:D10')
- `has_headers` (boolean, optional): Whether the first row contains headers. Default: true
</Accordion>
<Accordion title="microsoft_excel/get_tables">
**Description:** Get all tables in an Excel worksheet.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `worksheet_name` (string, required): Name of the worksheet
</Accordion>
<Accordion title="microsoft_excel/add_table_row">
**Description:** Add a new row to an Excel table.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `worksheet_name` (string, required): Name of the worksheet
- `table_name` (string, required): Name of the table
- `values` (array, required): Array of values for the new row
```json
["John Doe", 35, "Manager", "Sales"]
```
</Accordion>
<Accordion title="microsoft_excel/create_chart">
**Description:** Create a chart in an Excel worksheet.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `worksheet_name` (string, required): Name of the worksheet
- `chart_type` (string, required): Type of chart (e.g., 'ColumnClustered', 'Line', 'Pie')
- `source_data` (string, required): Range of data for the chart (e.g., 'A1:B10')
- `series_by` (string, optional): How to interpret the data ('Auto', 'Columns', or 'Rows'). Default: Auto
</Accordion>
<Accordion title="microsoft_excel/get_cell">
**Description:** Get the value of a single cell in an Excel worksheet.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `worksheet_name` (string, required): Name of the worksheet
- `row` (integer, required): Row number (0-based)
- `column` (integer, required): Column number (0-based)
</Accordion>
<Accordion title="microsoft_excel/get_used_range">
**Description:** Get the used range of an Excel worksheet (contains all data).
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `worksheet_name` (string, required): Name of the worksheet
</Accordion>
<Accordion title="microsoft_excel/list_charts">
**Description:** Get all charts in an Excel worksheet.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `worksheet_name` (string, required): Name of the worksheet
</Accordion>
<Accordion title="microsoft_excel/delete_worksheet">
**Description:** Delete a worksheet from an Excel workbook.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `worksheet_name` (string, required): Name of the worksheet to delete
</Accordion>
<Accordion title="microsoft_excel/delete_table">
**Description:** Delete a table from an Excel worksheet.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
- `worksheet_name` (string, required): Name of the worksheet
- `table_name` (string, required): Name of the table to delete
</Accordion>
<Accordion title="microsoft_excel/list_names">
**Description:** Get all named ranges in an Excel workbook.
**Parameters:**
- `file_id` (string, required): The ID of the Excel file
</Accordion>
</AccordionGroup>
## Usage Examples
### Basic Excel Agent Setup
```python
from crewai import Agent, Task, Crew
# Create an agent with Excel capabilities
excel_agent = Agent(
role="Excel Data Manager",
goal="Manage Excel workbooks and data efficiently",
backstory="An AI assistant specialized in Excel data management and analysis.",
apps=['microsoft_excel'] # All Excel actions will be available
)
# Task to create and populate a workbook
data_management_task = Task(
description="Create a new sales report workbook with data analysis and charts",
agent=excel_agent,
expected_output="Excel workbook created with sales data, analysis, and visualizations"
)
# Run the task
crew = Crew(
agents=[excel_agent],
tasks=[data_management_task]
)
crew.kickoff()
```
### Data Analysis and Reporting
```python
from crewai import Agent, Task, Crew
data_analyst = Agent(
role="Data Analyst",
goal="Analyze data in Excel and create comprehensive reports",
backstory="An AI assistant that specializes in data analysis and Excel reporting.",
apps=[
'microsoft_excel/get_workbooks',
'microsoft_excel/get_range_data',
'microsoft_excel/create_chart',
'microsoft_excel/add_table'
]
)
# Task to analyze existing data
analysis_task = Task(
description="Analyze sales data in existing workbooks and create summary charts and tables",
agent=data_analyst,
expected_output="Data analyzed with summary charts and tables created"
)
crew = Crew(
agents=[data_analyst],
tasks=[analysis_task]
)
crew.kickoff()
```
### Workbook Creation and Structure
```python
from crewai import Agent, Task, Crew
workbook_creator = Agent(
role="Workbook Creator",
goal="Create structured Excel workbooks with multiple worksheets and data organization",
backstory="An AI assistant that creates well-organized Excel workbooks for various business needs.",
apps=['microsoft_excel']
)
# Task to create structured workbooks
creation_task = Task(
description="""
1. Create a new quarterly report workbook
2. Add multiple worksheets for different departments
3. Create tables with headers for data organization
4. Set up charts for key metrics visualization
""",
agent=workbook_creator,
expected_output="Structured workbook created with multiple worksheets, tables, and charts"
)
crew = Crew(
agents=[workbook_creator],
tasks=[creation_task]
)
crew.kickoff()
```
### Data Manipulation and Updates
```python
from crewai import Agent, Task, Crew
data_manipulator = Agent(
role="Data Manipulator",
goal="Update and manipulate data in Excel worksheets efficiently",
backstory="An AI assistant that handles data updates, table management, and range operations.",
apps=['microsoft_excel']
)
# Task to manipulate data
manipulation_task = Task(
description="""
1. Get data from existing worksheets
2. Update specific ranges with new information
3. Add new rows to existing tables
4. Create additional charts based on updated data
5. Organize data across multiple worksheets
""",
agent=data_manipulator,
expected_output="Data updated across worksheets with new charts and organized structure"
)
crew = Crew(
agents=[data_manipulator],
tasks=[manipulation_task]
)
crew.kickoff()
```
### Advanced Excel Automation
```python
from crewai import Agent, Task, Crew
excel_automator = Agent(
role="Excel Automator",
goal="Automate complex Excel workflows and data processing",
backstory="An AI assistant that automates sophisticated Excel operations and data workflows.",
apps=['microsoft_excel']
)
# Complex automation task
automation_task = Task(
description="""
1. Scan all Excel workbooks for specific data patterns
2. Create consolidated reports from multiple workbooks
3. Generate charts and tables for trend analysis
4. Set up named ranges for easy data reference
5. Create dashboard worksheets with key metrics
6. Clean up unused worksheets and tables
""",
agent=excel_automator,
expected_output="Automated Excel workflow completed with consolidated reports and dashboards"
)
crew = Crew(
agents=[excel_automator],
tasks=[automation_task]
)
crew.kickoff()
```
### Financial Modeling and Analysis
```python
from crewai import Agent, Task, Crew
financial_modeler = Agent(
role="Financial Modeler",
goal="Create financial models and analysis in Excel",
backstory="An AI assistant specialized in financial modeling and analysis using Excel.",
apps=['microsoft_excel']
)
# Task for financial modeling
modeling_task = Task(
description="""
1. Create financial model workbooks with multiple scenarios
2. Set up input tables for assumptions and variables
3. Create calculation worksheets with formulas and logic
4. Generate charts for financial projections and trends
5. Add summary tables for key financial metrics
6. Create sensitivity analysis tables
""",
agent=financial_modeler,
expected_output="Financial model created with scenarios, calculations, and analysis charts"
)
crew = Crew(
agents=[financial_modeler],
tasks=[modeling_task]
)
crew.kickoff()
```
## Troubleshooting
### Common Issues
**Permission Errors**
- Ensure your Microsoft account has appropriate permissions for Excel and OneDrive/SharePoint
- Verify that the OAuth connection includes required scopes (Files.Read.All, Files.ReadWrite.All)
- Check that you have access to the specific workbooks you're trying to modify
**File ID and Path Issues**
- Verify that file IDs are correct and files exist in your OneDrive or SharePoint
- Ensure file paths are properly formatted when creating new workbooks
- Check that workbook files have the correct .xlsx extension
**Worksheet and Range Issues**
- Verify that worksheet names exist in the specified workbook
- Ensure range addresses are properly formatted (e.g., 'A1:C10')
- Check that ranges don't exceed worksheet boundaries
**Data Format Issues**
- Ensure data values are properly formatted for Excel (strings, numbers, integers)
- Verify that 2D arrays for ranges have consistent row and column counts
- Check that table data includes proper headers when has_headers is true
**Chart Creation Issues**
- Verify that chart types are supported (ColumnClustered, Line, Pie, etc.)
- Ensure source data ranges contain appropriate data for the chart type
- Check that the source data range exists and contains data
**Table Management Issues**
- Ensure table names are unique within worksheets
- Verify that table ranges don't overlap with existing tables
- Check that new row data matches the table's column structure
**Cell and Range Operations**
- Verify that row and column indices are 0-based for cell operations
- Ensure ranges contain data when using get_used_range
- Check that named ranges exist before referencing them
### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Microsoft Excel integration setup
or troubleshooting.
</Card>

View File

@@ -1,286 +0,0 @@
---
title: Microsoft OneDrive Integration
description: "File and folder management with Microsoft OneDrive integration for CrewAI."
icon: "cloud"
mode: "wide"
---
## Overview
Enable your agents to upload, download, and manage files and folders in Microsoft OneDrive. Automate file operations, organize content, create sharing links, and streamline your cloud storage workflows with AI-powered automation.
## Prerequisites
Before using the Microsoft OneDrive integration, ensure you have:
- A [CrewAI AMP](https://app.crewai.com) account with an active subscription
- A Microsoft account with OneDrive access
- Connected your Microsoft account through the [Integrations page](https://app.crewai.com/crewai_plus/connectors)
## Setting Up Microsoft OneDrive Integration
### 1. Connect Your Microsoft Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Microsoft OneDrive** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for file access
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Actions
<AccordionGroup>
<Accordion title="microsoft_onedrive/list_files">
**Description:** List files and folders in OneDrive.
**Parameters:**
- `top` (integer, optional): Number of items to retrieve (max 1000). Default is `50`.
- `orderby` (string, optional): Order by field (e.g., "name asc", "lastModifiedDateTime desc"). Default is "name asc".
- `filter` (string, optional): OData filter expression.
</Accordion>
<Accordion title="microsoft_onedrive/get_file_info">
**Description:** Get information about a specific file or folder.
**Parameters:**
- `item_id` (string, required): The ID of the file or folder.
</Accordion>
<Accordion title="microsoft_onedrive/download_file">
**Description:** Download a file from OneDrive.
**Parameters:**
- `item_id` (string, required): The ID of the file to download.
</Accordion>
<Accordion title="microsoft_onedrive/upload_file">
**Description:** Upload a file to OneDrive.
**Parameters:**
- `file_name` (string, required): Name of the file to upload.
- `content` (string, required): Base64 encoded file content.
</Accordion>
<Accordion title="microsoft_onedrive/create_folder">
**Description:** Create a new folder in OneDrive.
**Parameters:**
- `folder_name` (string, required): Name of the folder to create.
</Accordion>
<Accordion title="microsoft_onedrive/delete_item">
**Description:** Delete a file or folder from OneDrive.
**Parameters:**
- `item_id` (string, required): The ID of the file or folder to delete.
</Accordion>
<Accordion title="microsoft_onedrive/copy_item">
**Description:** Copy a file or folder in OneDrive.
**Parameters:**
- `item_id` (string, required): The ID of the file or folder to copy.
- `parent_id` (string, optional): The ID of the destination folder (optional, defaults to root).
- `new_name` (string, optional): New name for the copied item (optional).
</Accordion>
<Accordion title="microsoft_onedrive/move_item">
**Description:** Move a file or folder in OneDrive.
**Parameters:**
- `item_id` (string, required): The ID of the file or folder to move.
- `parent_id` (string, required): The ID of the destination folder.
- `new_name` (string, optional): New name for the item (optional).
</Accordion>
<Accordion title="microsoft_onedrive/search_files">
**Description:** Search for files and folders in OneDrive.
**Parameters:**
- `query` (string, required): Search query string.
- `top` (integer, optional): Number of results to return (max 1000). Default is `50`.
</Accordion>
<Accordion title="microsoft_onedrive/share_item">
**Description:** Create a sharing link for a file or folder.
**Parameters:**
- `item_id` (string, required): The ID of the file or folder to share.
- `type` (string, optional): Type of sharing link. Enum: `view`, `edit`, `embed`. Default is `view`.
- `scope` (string, optional): Scope of the sharing link. Enum: `anonymous`, `organization`. Default is `anonymous`.
</Accordion>
<Accordion title="microsoft_onedrive/get_thumbnails">
**Description:** Get thumbnails for a file.
**Parameters:**
- `item_id` (string, required): The ID of the file.
</Accordion>
</AccordionGroup>
## Usage Examples
### Basic Microsoft OneDrive Agent Setup
```python
from crewai import Agent, Task, Crew
# Create an agent with Microsoft OneDrive capabilities
onedrive_agent = Agent(
role="File Manager",
goal="Manage files and folders in OneDrive efficiently",
backstory="An AI assistant specialized in Microsoft OneDrive file operations and organization.",
apps=['microsoft_onedrive'] # All OneDrive actions will be available
)
# Task to list files and create a folder
organize_files_task = Task(
description="List all files in my OneDrive root directory and create a new folder called 'Project Documents'.",
agent=onedrive_agent,
expected_output="List of files displayed and new folder 'Project Documents' created."
)
# Run the task
crew = Crew(
agents=[onedrive_agent],
tasks=[organize_files_task]
)
crew.kickoff()
```
### File Upload and Management
```python
from crewai import Agent, Task, Crew
# Create an agent focused on file operations
file_operator = Agent(
role="File Operator",
goal="Upload, download, and manage files with precision",
backstory="An AI assistant skilled in file handling and content management.",
apps=['microsoft_onedrive/upload_file', 'microsoft_onedrive/download_file', 'microsoft_onedrive/get_file_info']
)
# Task to upload and manage a file
file_management_task = Task(
description="Upload a text file named 'report.txt' with content 'This is a sample report for the project.' Then get information about the uploaded file.",
agent=file_operator,
expected_output="File uploaded successfully and file information retrieved."
)
crew = Crew(
agents=[file_operator],
tasks=[file_management_task]
)
crew.kickoff()
```
### File Organization and Sharing
```python
from crewai import Agent, Task, Crew
# Create an agent for file organization and sharing
file_organizer = Agent(
role="File Organizer",
goal="Organize files and create sharing links for collaboration",
backstory="An AI assistant that excels at organizing files and managing sharing permissions.",
apps=['microsoft_onedrive/search_files', 'microsoft_onedrive/move_item', 'microsoft_onedrive/share_item', 'microsoft_onedrive/create_folder']
)
# Task to organize and share files
organize_share_task = Task(
description="Search for files containing 'presentation' in the name, create a folder called 'Presentations', move the found files to this folder, and create a view-only sharing link for the folder.",
agent=file_organizer,
expected_output="Files organized into 'Presentations' folder and sharing link created."
)
crew = Crew(
agents=[file_organizer],
tasks=[organize_share_task]
)
crew.kickoff()
```
## Troubleshooting
### Common Issues
**Authentication Errors**
- Ensure your Microsoft account has the necessary permissions for file access (e.g., `Files.Read`, `Files.ReadWrite`).
- Verify that the OAuth connection includes all required scopes.
**File Upload Issues**
- Ensure `file_name` and `content` are provided for file uploads.
- Content must be Base64 encoded for binary files.
- Check that you have write permissions to OneDrive.
**File/Folder ID Issues**
- Double-check item IDs for correctness when accessing specific files or folders.
- Item IDs are returned by other operations like `list_files` or `search_files`.
- Ensure the referenced items exist and are accessible.
**Search and Filter Operations**
- Use appropriate search terms for `search_files` operations.
- For `filter` parameters, use proper OData syntax.
**File Operations (Copy/Move)**
- For `move_item`, ensure both `item_id` and `parent_id` are provided.
- For `copy_item`, only `item_id` is required; `parent_id` defaults to root if not specified.
- Verify that destination folders exist and are accessible.
**Sharing Link Creation**
- Ensure the item exists before creating sharing links.
- Choose appropriate `type` and `scope` based on your sharing requirements.
- `anonymous` scope allows access without sign-in; `organization` requires organizational account.
### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Microsoft OneDrive integration
setup or troubleshooting.
</Card>

View File

@@ -1,262 +0,0 @@
---
title: Microsoft Outlook Integration
description: "Email, calendar, and contact management with Microsoft Outlook integration for CrewAI."
icon: "envelope"
mode: "wide"
---
## Overview
Enable your agents to access and manage Outlook emails, calendar events, and contacts. Send emails, retrieve messages, manage calendar events, and organize contacts with AI-powered automation.
## Prerequisites
Before using the Microsoft Outlook integration, ensure you have:
- A [CrewAI AMP](https://app.crewai.com) account with an active subscription
- A Microsoft account with Outlook access
- Connected your Microsoft account through the [Integrations page](https://app.crewai.com/crewai_plus/connectors)
## Setting Up Microsoft Outlook Integration
### 1. Connect Your Microsoft Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Microsoft Outlook** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for mail, calendar, and contact access
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Actions
<AccordionGroup>
<Accordion title="microsoft_outlook/get_messages">
**Description:** Get email messages from the user's mailbox.
**Parameters:**
- `top` (integer, optional): Number of messages to retrieve (max 1000). Default is `10`.
- `filter` (string, optional): OData filter expression (e.g., "isRead eq false").
- `search` (string, optional): Search query string.
- `orderby` (string, optional): Order by field (e.g., "receivedDateTime desc"). Default is "receivedDateTime desc".
- `select` (string, optional): Select specific properties to return.
- `expand` (string, optional): Expand related resources inline.
</Accordion>
<Accordion title="microsoft_outlook/send_email">
**Description:** Send an email message.
**Parameters:**
- `to_recipients` (array, required): Array of recipient email addresses.
- `cc_recipients` (array, optional): Array of CC recipient email addresses.
- `bcc_recipients` (array, optional): Array of BCC recipient email addresses.
- `subject` (string, required): Email subject.
- `body` (string, required): Email body content.
- `body_type` (string, optional): Body content type. Enum: `Text`, `HTML`. Default is `HTML`.
- `importance` (string, optional): Message importance level. Enum: `low`, `normal`, `high`. Default is `normal`.
- `reply_to` (array, optional): Array of reply-to email addresses.
- `save_to_sent_items` (boolean, optional): Whether to save the message to Sent Items folder. Default is `true`.
</Accordion>
<Accordion title="microsoft_outlook/get_calendar_events">
**Description:** Get calendar events from the user's calendar.
**Parameters:**
- `top` (integer, optional): Number of events to retrieve (max 1000). Default is `10`.
- `skip` (integer, optional): Number of events to skip. Default is `0`.
- `filter` (string, optional): OData filter expression (e.g., "start/dateTime ge '2024-01-01T00:00:00Z'").
- `orderby` (string, optional): Order by field (e.g., "start/dateTime asc"). Default is "start/dateTime asc".
</Accordion>
<Accordion title="microsoft_outlook/create_calendar_event">
**Description:** Create a new calendar event.
**Parameters:**
- `subject` (string, required): Event subject/title.
- `body` (string, optional): Event body/description.
- `start_datetime` (string, required): Start date and time in ISO 8601 format (e.g., '2024-01-20T10:00:00').
- `end_datetime` (string, required): End date and time in ISO 8601 format.
- `timezone` (string, optional): Time zone (e.g., 'Pacific Standard Time'). Default is `UTC`.
- `location` (string, optional): Event location.
- `attendees` (array, optional): Array of attendee email addresses.
</Accordion>
<Accordion title="microsoft_outlook/get_contacts">
**Description:** Get contacts from the user's address book.
**Parameters:**
- `top` (integer, optional): Number of contacts to retrieve (max 1000). Default is `10`.
- `skip` (integer, optional): Number of contacts to skip. Default is `0`.
- `filter` (string, optional): OData filter expression.
- `orderby` (string, optional): Order by field (e.g., "displayName asc"). Default is "displayName asc".
</Accordion>
<Accordion title="microsoft_outlook/create_contact">
**Description:** Create a new contact in the user's address book.
**Parameters:**
- `displayName` (string, required): Contact's display name.
- `givenName` (string, optional): Contact's first name.
- `surname` (string, optional): Contact's last name.
- `emailAddresses` (array, optional): Array of email addresses. Each item is an object with `address` (string) and `name` (string).
- `businessPhones` (array, optional): Array of business phone numbers.
- `homePhones` (array, optional): Array of home phone numbers.
- `jobTitle` (string, optional): Contact's job title.
- `companyName` (string, optional): Contact's company name.
</Accordion>
</AccordionGroup>
## Usage Examples
### Basic Microsoft Outlook Agent Setup
```python
from crewai import Agent, Task, Crew
# Create an agent with Microsoft Outlook capabilities
outlook_agent = Agent(
role="Email Assistant",
goal="Manage emails, calendar events, and contacts efficiently",
backstory="An AI assistant specialized in Microsoft Outlook operations and communication management.",
apps=['microsoft_outlook'] # All Outlook actions will be available
)
# Task to send an email
send_email_task = Task(
description="Send an email to 'colleague@example.com' with subject 'Project Update' and body 'Hi, here is the latest project update. Best regards.'",
agent=outlook_agent,
expected_output="Email sent successfully to colleague@example.com"
)
# Run the task
crew = Crew(
agents=[outlook_agent],
tasks=[send_email_task]
)
crew.kickoff()
```
### Email Management and Search
```python
from crewai import Agent, Task, Crew
# Create an agent focused on email management
email_manager = Agent(
role="Email Manager",
goal="Retrieve, search, and organize email messages",
backstory="An AI assistant skilled in email organization and management.",
apps=['microsoft_outlook/get_messages']
)
# Task to search and retrieve emails
search_emails_task = Task(
description="Get the latest 20 unread emails and provide a summary of the most important ones.",
agent=email_manager,
expected_output="Summary of the most important unread emails with key details."
)
crew = Crew(
agents=[email_manager],
tasks=[search_emails_task]
)
crew.kickoff()
```
### Calendar and Contact Management
```python
from crewai import Agent, Task, Crew
# Create an agent for calendar and contact management
scheduler = Agent(
role="Calendar and Contact Manager",
goal="Manage calendar events and maintain contact information",
backstory="An AI assistant that handles scheduling and contact organization.",
apps=['microsoft_outlook/create_calendar_event', 'microsoft_outlook/get_calendar_events', 'microsoft_outlook/create_contact']
)
# Task to create a meeting and add a contact
schedule_task = Task(
description="Create a calendar event for tomorrow at 2 PM titled 'Team Meeting' with location 'Conference Room A', and create a new contact for 'John Smith' with email 'john.smith@example.com' and job title 'Project Manager'.",
agent=scheduler,
expected_output="Calendar event created and new contact added successfully."
)
crew = Crew(
agents=[scheduler],
tasks=[schedule_task]
)
crew.kickoff()
```
## Troubleshooting
### Common Issues
**Authentication Errors**
- Ensure your Microsoft account has the necessary permissions for mail, calendar, and contact access.
- Required scopes include: `Mail.Read`, `Mail.Send`, `Calendars.Read`, `Calendars.ReadWrite`, `Contacts.Read`, `Contacts.ReadWrite`.
- Verify that the OAuth connection includes all required scopes.
**Email Sending Issues**
- Ensure `to_recipients`, `subject`, and `body` are provided for `send_email`.
- Check that email addresses are properly formatted.
- Verify that the account has `Mail.Send` permissions.
**Calendar Event Creation**
- Ensure `subject`, `start_datetime`, and `end_datetime` are provided.
- Use proper ISO 8601 format for datetime fields (e.g., '2024-01-20T10:00:00').
- Verify timezone settings if events appear at incorrect times.
**Contact Management**
- For `create_contact`, ensure `displayName` is provided as it's required.
- When providing `emailAddresses`, use the proper object format with `address` and `name` properties.
**Search and Filter Issues**
- Use proper OData syntax for `filter` parameters.
- For date filters, use ISO 8601 format (e.g., "receivedDateTime ge '2024-01-01T00:00:00Z'").
### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Microsoft Outlook integration
setup or troubleshooting.
</Card>

View File

@@ -1,425 +0,0 @@
---
title: Microsoft SharePoint Integration
description: "Site, list, and document management with Microsoft SharePoint integration for CrewAI."
icon: "folder-tree"
mode: "wide"
---
## Overview
Enable your agents to access and manage SharePoint sites, lists, and document libraries. Retrieve site information, manage list items, upload and organize files, and streamline your SharePoint workflows with AI-powered automation.
## Prerequisites
Before using the Microsoft SharePoint integration, ensure you have:
- A [CrewAI AMP](https://app.crewai.com) account with an active subscription
- A Microsoft 365 account with SharePoint access
- Connected your Microsoft account through the [Integrations page](https://app.crewai.com/crewai_plus/connectors)
## Setting Up Microsoft SharePoint Integration
### 1. Connect Your Microsoft Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Microsoft SharePoint** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for SharePoint sites and content access
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Actions
<AccordionGroup>
<Accordion title="microsoft_sharepoint/get_sites">
**Description:** Get all SharePoint sites the user has access to.
**Parameters:**
- `search` (string, optional): Search query to filter sites
- `select` (string, optional): Select specific properties to return (e.g., 'displayName,id,webUrl')
- `filter` (string, optional): Filter results using OData syntax
- `expand` (string, optional): Expand related resources inline
- `top` (integer, optional): Number of items to return. Minimum: 1, Maximum: 999
- `skip` (integer, optional): Number of items to skip. Minimum: 0
- `orderby` (string, optional): Order results by specified properties (e.g., 'displayName desc')
</Accordion>
<Accordion title="microsoft_sharepoint/get_site">
**Description:** Get information about a specific SharePoint site.
**Parameters:**
- `site_id` (string, required): The ID of the SharePoint site
- `select` (string, optional): Select specific properties to return (e.g., 'displayName,id,webUrl,drives')
- `expand` (string, optional): Expand related resources inline (e.g., 'drives,lists')
</Accordion>
<Accordion title="microsoft_sharepoint/get_site_lists">
**Description:** Get all lists in a SharePoint site.
**Parameters:**
- `site_id` (string, required): The ID of the SharePoint site
</Accordion>
<Accordion title="microsoft_sharepoint/get_list">
**Description:** Get information about a specific list.
**Parameters:**
- `site_id` (string, required): The ID of the SharePoint site
- `list_id` (string, required): The ID of the list
</Accordion>
<Accordion title="microsoft_sharepoint/get_list_items">
**Description:** Get items from a SharePoint list.
**Parameters:**
- `site_id` (string, required): The ID of the SharePoint site
- `list_id` (string, required): The ID of the list
- `expand` (string, optional): Expand related data (e.g., 'fields')
</Accordion>
<Accordion title="microsoft_sharepoint/create_list_item">
**Description:** Create a new item in a SharePoint list.
**Parameters:**
- `site_id` (string, required): The ID of the SharePoint site
- `list_id` (string, required): The ID of the list
- `fields` (object, required): The field values for the new item
```json
{
"Title": "New Item Title",
"Description": "Item description",
"Status": "Active"
}
```
</Accordion>
<Accordion title="microsoft_sharepoint/update_list_item">
**Description:** Update an item in a SharePoint list.
**Parameters:**
- `site_id` (string, required): The ID of the SharePoint site
- `list_id` (string, required): The ID of the list
- `item_id` (string, required): The ID of the item to update
- `fields` (object, required): The field values to update
```json
{
"Title": "Updated Title",
"Status": "Completed"
}
```
</Accordion>
<Accordion title="microsoft_sharepoint/delete_list_item">
**Description:** Delete an item from a SharePoint list.
**Parameters:**
- `site_id` (string, required): The ID of the SharePoint site
- `list_id` (string, required): The ID of the list
- `item_id` (string, required): The ID of the item to delete
</Accordion>
<Accordion title="microsoft_sharepoint/upload_file_to_library">
**Description:** Upload a file to a SharePoint document library.
**Parameters:**
- `site_id` (string, required): The ID of the SharePoint site
- `file_path` (string, required): The path where to upload the file (e.g., 'folder/filename.txt')
- `content` (string, required): The file content to upload
</Accordion>
<Accordion title="microsoft_sharepoint/get_drive_items">
**Description:** Get files and folders from a SharePoint document library.
**Parameters:**
- `site_id` (string, required): The ID of the SharePoint site
</Accordion>
<Accordion title="microsoft_sharepoint/delete_drive_item">
**Description:** Delete a file or folder from SharePoint document library.
**Parameters:**
- `site_id` (string, required): The ID of the SharePoint site
- `item_id` (string, required): The ID of the file or folder to delete
</Accordion>
</AccordionGroup>
## Usage Examples
### Basic SharePoint Agent Setup
```python
from crewai import Agent, Task, Crew
# Create an agent with SharePoint capabilities
sharepoint_agent = Agent(
role="SharePoint Manager",
goal="Manage SharePoint sites, lists, and documents efficiently",
backstory="An AI assistant specialized in SharePoint content management and collaboration.",
apps=['microsoft_sharepoint'] # All SharePoint actions will be available
)
# Task to organize SharePoint content
content_organization_task = Task(
description="List all accessible SharePoint sites and organize content by department",
agent=sharepoint_agent,
expected_output="SharePoint sites listed and content organized by department"
)
# Run the task
crew = Crew(
agents=[sharepoint_agent],
tasks=[content_organization_task]
)
crew.kickoff()
```
### List Management and Data Operations
```python
from crewai import Agent, Task, Crew
list_manager = Agent(
role="List Manager",
goal="Manage SharePoint lists and data efficiently",
backstory="An AI assistant that focuses on SharePoint list management and data operations.",
apps=[
'microsoft_sharepoint/get_site_lists',
'microsoft_sharepoint/get_list_items',
'microsoft_sharepoint/create_list_item',
'microsoft_sharepoint/update_list_item'
]
)
# Task to manage list data
list_management_task = Task(
description="Get all lists from the project site, review items, and update status for completed tasks",
agent=list_manager,
expected_output="SharePoint lists reviewed and task statuses updated"
)
crew = Crew(
agents=[list_manager],
tasks=[list_management_task]
)
crew.kickoff()
```
### Document Library Management
```python
from crewai import Agent, Task, Crew
document_manager = Agent(
role="Document Manager",
goal="Manage SharePoint document libraries and files",
backstory="An AI assistant that specializes in document organization and file management.",
apps=['microsoft_sharepoint']
)
# Task to manage documents
document_task = Task(
description="""
1. Get all files from the main document library
2. Upload new policy documents to the appropriate folders
3. Organize files by department and date
4. Remove outdated documents
""",
agent=document_manager,
expected_output="Document library organized with new files uploaded and outdated files removed"
)
crew = Crew(
agents=[document_manager],
tasks=[document_task]
)
crew.kickoff()
```
### Site Administration and Analysis
```python
from crewai import Agent, Task, Crew
site_administrator = Agent(
role="Site Administrator",
goal="Administer and analyze SharePoint sites",
backstory="An AI assistant that handles site administration and provides insights on site usage.",
apps=['microsoft_sharepoint']
)
# Task for site administration
admin_task = Task(
description="""
1. Get information about all accessible SharePoint sites
2. Analyze site structure and content organization
3. Identify sites with low activity or outdated content
4. Generate recommendations for site optimization
""",
agent=site_administrator,
expected_output="Site analysis completed with optimization recommendations"
)
crew = Crew(
agents=[site_administrator],
tasks=[admin_task]
)
crew.kickoff()
```
### Automated Content Workflows
```python
from crewai import Agent, Task, Crew
workflow_automator = Agent(
role="Workflow Automator",
goal="Automate SharePoint content workflows and processes",
backstory="An AI assistant that automates complex SharePoint workflows and content management processes.",
apps=['microsoft_sharepoint']
)
# Complex workflow automation task
automation_task = Task(
description="""
1. Monitor project lists across multiple sites
2. Create status reports based on list data
3. Upload reports to designated document libraries
4. Update project tracking lists with completion status
5. Archive completed project documents
6. Send notifications for overdue items
""",
agent=workflow_automator,
expected_output="Automated workflow completed with status reports generated and project tracking updated"
)
crew = Crew(
agents=[workflow_automator],
tasks=[automation_task]
)
crew.kickoff()
```
### Data Integration and Reporting
```python
from crewai import Agent, Task, Crew
data_integrator = Agent(
role="Data Integrator",
goal="Integrate and analyze data across SharePoint sites and lists",
backstory="An AI assistant that specializes in data integration and cross-site analysis.",
apps=['microsoft_sharepoint']
)
# Task for data integration
integration_task = Task(
description="""
1. Get data from multiple SharePoint lists across different sites
2. Consolidate information into comprehensive reports
3. Create new list items with aggregated data
4. Upload analytical reports to executive document library
5. Update dashboard lists with key metrics
""",
agent=data_integrator,
expected_output="Data integrated across sites with comprehensive reports and updated dashboards"
)
crew = Crew(
agents=[data_integrator],
tasks=[integration_task]
)
crew.kickoff()
```
## Troubleshooting
### Common Issues
**Permission Errors**
- Ensure your Microsoft account has appropriate permissions for SharePoint sites
- Verify that the OAuth connection includes required scopes (Sites.Read.All, Sites.ReadWrite.All)
- Check that you have access to the specific sites and lists you're trying to access
**Site and List ID Issues**
- Verify that site IDs and list IDs are correct and properly formatted
- Ensure that sites and lists exist and are accessible to your account
- Use the get_sites and get_site_lists actions to discover valid IDs
**Field and Schema Issues**
- Ensure field names match exactly with the SharePoint list schema
- Verify that required fields are included when creating or updating list items
- Check that field types and values are compatible with the list column definitions
**File Upload Issues**
- Ensure file paths are properly formatted and don't contain invalid characters
- Verify that you have write permissions to the target document library
- Check that file content is properly encoded for upload
**OData Query Issues**
- Use proper OData syntax for filter, select, expand, and orderby parameters
- Verify that property names used in queries exist in the target resources
- Test simple queries before building complex filter expressions
**Pagination and Performance**
- Use top and skip parameters appropriately for large result sets
- Implement proper pagination for lists with many items
- Consider using select parameters to return only needed properties
**Document Library Operations**
- Ensure you have proper permissions for document library operations
- Verify that drive item IDs are correct when deleting files or folders
- Check that file paths don't conflict with existing content
### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Microsoft SharePoint integration
setup or troubleshooting.
</Card>

View File

@@ -1,243 +0,0 @@
---
title: Microsoft Teams Integration
description: "Team collaboration and communication with Microsoft Teams integration for CrewAI."
icon: "users"
mode: "wide"
---
## Overview
Enable your agents to access Teams data, send messages, create meetings, and manage channels. Automate team communication, schedule meetings, retrieve messages, and streamline your collaboration workflows with AI-powered automation.
## Prerequisites
Before using the Microsoft Teams integration, ensure you have:
- A [CrewAI AMP](https://app.crewai.com) account with an active subscription
- A Microsoft account with Teams access
- Connected your Microsoft account through the [Integrations page](https://app.crewai.com/crewai_plus/connectors)
## Setting Up Microsoft Teams Integration
### 1. Connect Your Microsoft Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Microsoft Teams** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for Teams access
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Actions
<AccordionGroup>
<Accordion title="microsoft_teams/get_teams">
**Description:** Get all teams the user is a member of.
**Parameters:**
- No parameters required.
</Accordion>
<Accordion title="microsoft_teams/get_channels">
**Description:** Get channels in a specific team.
**Parameters:**
- `team_id` (string, required): The ID of the team.
</Accordion>
<Accordion title="microsoft_teams/send_message">
**Description:** Send a message to a Teams channel.
**Parameters:**
- `team_id` (string, required): The ID of the team.
- `channel_id` (string, required): The ID of the channel.
- `message` (string, required): The message content.
- `content_type` (string, optional): Content type (html or text). Enum: `html`, `text`. Default is `text`.
</Accordion>
<Accordion title="microsoft_teams/get_messages">
**Description:** Get messages from a Teams channel.
**Parameters:**
- `team_id` (string, required): The ID of the team.
- `channel_id` (string, required): The ID of the channel.
- `top` (integer, optional): Number of messages to retrieve (max 50). Default is `20`.
</Accordion>
<Accordion title="microsoft_teams/create_meeting">
**Description:** Create a Teams meeting.
**Parameters:**
- `subject` (string, required): Meeting subject/title.
- `startDateTime` (string, required): Meeting start time (ISO 8601 format with timezone).
- `endDateTime` (string, required): Meeting end time (ISO 8601 format with timezone).
</Accordion>
<Accordion title="microsoft_teams/search_online_meetings_by_join_url">
**Description:** Search online meetings by Join Web URL.
**Parameters:**
- `join_web_url` (string, required): The join web URL of the meeting to search for.
</Accordion>
</AccordionGroup>
## Usage Examples
### Basic Microsoft Teams Agent Setup
```python
from crewai import Agent, Task, Crew
# Create an agent with Microsoft Teams capabilities
teams_agent = Agent(
role="Teams Coordinator",
goal="Manage Teams communication and meetings efficiently",
backstory="An AI assistant specialized in Microsoft Teams operations and team collaboration.",
apps=['microsoft_teams'] # All Teams actions will be available
)
# Task to list teams and channels
explore_teams_task = Task(
description="List all teams I'm a member of and then get the channels for the first team.",
agent=teams_agent,
expected_output="List of teams and channels displayed."
)
# Run the task
crew = Crew(
agents=[teams_agent],
tasks=[explore_teams_task]
)
crew.kickoff()
```
### Messaging and Communication
```python
from crewai import Agent, Task, Crew
# Create an agent focused on messaging
messenger = Agent(
role="Teams Messenger",
goal="Send and retrieve messages in Teams channels",
backstory="An AI assistant skilled in team communication and message management.",
apps=['microsoft_teams/send_message', 'microsoft_teams/get_messages']
)
# Task to send a message and retrieve recent messages
messaging_task = Task(
description="Send a message 'Hello team! This is an automated update from our AI assistant.' to the General channel of team 'your_team_id', then retrieve the last 10 messages from that channel.",
agent=messenger,
expected_output="Message sent successfully and recent messages retrieved."
)
crew = Crew(
agents=[messenger],
tasks=[messaging_task]
)
crew.kickoff()
```
### Meeting Management
```python
from crewai import Agent, Task, Crew
# Create an agent for meeting management
meeting_scheduler = Agent(
role="Meeting Scheduler",
goal="Create and manage Teams meetings",
backstory="An AI assistant that handles meeting scheduling and organization.",
apps=['microsoft_teams/create_meeting', 'microsoft_teams/search_online_meetings_by_join_url']
)
# Task to create a meeting
schedule_meeting_task = Task(
description="Create a Teams meeting titled 'Weekly Team Sync' scheduled for tomorrow at 10:00 AM lasting for 1 hour (use proper ISO 8601 format with timezone).",
agent=meeting_scheduler,
expected_output="Teams meeting created successfully with meeting details."
)
crew = Crew(
agents=[meeting_scheduler],
tasks=[schedule_meeting_task]
)
crew.kickoff()
```
## Troubleshooting
### Common Issues
**Authentication Errors**
- Ensure your Microsoft account has the necessary permissions for Teams access.
- Required scopes include: `Team.ReadBasic.All`, `Channel.ReadBasic.All`, `ChannelMessage.Send`, `ChannelMessage.Read.All`, `OnlineMeetings.ReadWrite`, `OnlineMeetings.Read`.
- Verify that the OAuth connection includes all required scopes.
**Team and Channel Access**
- Ensure you are a member of the teams you're trying to access.
- Double-check team IDs and channel IDs for correctness.
- Team and channel IDs can be obtained using the `get_teams` and `get_channels` actions.
**Message Sending Issues**
- Ensure `team_id`, `channel_id`, and `message` are provided for `send_message`.
- Verify that you have permissions to send messages to the specified channel.
- Choose appropriate `content_type` (text or html) based on your message format.
**Meeting Creation**
- Ensure `subject`, `startDateTime`, and `endDateTime` are provided.
- Use proper ISO 8601 format with timezone for datetime fields (e.g., '2024-01-20T10:00:00-08:00').
- Verify that the meeting times are in the future.
**Message Retrieval Limitations**
- The `get_messages` action can retrieve a maximum of 50 messages per request.
- Messages are returned in reverse chronological order (newest first).
**Meeting Search**
- For `search_online_meetings_by_join_url`, ensure the join URL is exact and properly formatted.
- The URL should be the complete Teams meeting join URL.
### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Microsoft Teams integration setup
or troubleshooting.
</Card>

View File

@@ -1,220 +0,0 @@
---
title: Microsoft Word Integration
description: "Document creation and management with Microsoft Word integration for CrewAI."
icon: "file-word"
mode: "wide"
---
## Overview
Enable your agents to create, read, and manage Word documents and text files in OneDrive or SharePoint. Automate document creation, retrieve content, manage document properties, and streamline your document workflows with AI-powered automation.
## Prerequisites
Before using the Microsoft Word integration, ensure you have:
- A [CrewAI AMP](https://app.crewai.com) account with an active subscription
- A Microsoft account with Word and OneDrive/SharePoint access
- Connected your Microsoft account through the [Integrations page](https://app.crewai.com/crewai_plus/connectors)
## Setting Up Microsoft Word Integration
### 1. Connect Your Microsoft Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Microsoft Word** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for file access
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Actions
<AccordionGroup>
<Accordion title="microsoft_word/get_documents">
**Description:** Get all Word documents from OneDrive or SharePoint.
**Parameters:**
- `select` (string, optional): Select specific properties to return.
- `filter` (string, optional): Filter results using OData syntax.
- `expand` (string, optional): Expand related resources inline.
- `top` (integer, optional): Number of items to return (min 1, max 999).
- `orderby` (string, optional): Order results by specified properties.
</Accordion>
<Accordion title="microsoft_word/create_text_document">
**Description:** Create a text document (.txt) with content. RECOMMENDED for programmatic content creation that needs to be readable and editable.
**Parameters:**
- `file_name` (string, required): Name of the text document (should end with .txt).
- `content` (string, optional): Text content for the document. Default is "This is a new text document created via API."
</Accordion>
<Accordion title="microsoft_word/get_document_content">
**Description:** Get the content of a document (works best with text files).
**Parameters:**
- `file_id` (string, required): The ID of the document.
</Accordion>
<Accordion title="microsoft_word/get_document_properties">
**Description:** Get properties and metadata of a document.
**Parameters:**
- `file_id` (string, required): The ID of the document.
</Accordion>
<Accordion title="microsoft_word/delete_document">
**Description:** Delete a document.
**Parameters:**
- `file_id` (string, required): The ID of the document to delete.
</Accordion>
</AccordionGroup>
## Usage Examples
### Basic Microsoft Word Agent Setup
```python
from crewai import Agent, Task, Crew
# Create an agent with Microsoft Word capabilities
word_agent = Agent(
role="Document Manager",
goal="Manage Word documents and text files efficiently",
backstory="An AI assistant specialized in Microsoft Word document operations and content management.",
apps=['microsoft_word'] # All Word actions will be available
)
# Task to create a new text document
create_doc_task = Task(
description="Create a new text document named 'meeting_notes.txt' with content 'Meeting Notes from January 2024: Key discussion points and action items.'",
agent=word_agent,
expected_output="New text document 'meeting_notes.txt' created successfully."
)
# Run the task
crew = Crew(
agents=[word_agent],
tasks=[create_doc_task]
)
crew.kickoff()
```
### Reading and Managing Documents
```python
from crewai import Agent, Task, Crew
# Create an agent focused on document operations
document_reader = Agent(
role="Document Reader",
goal="Retrieve and analyze document content and properties",
backstory="An AI assistant skilled in reading and analyzing document content.",
apps=['microsoft_word/get_documents', 'microsoft_word/get_document_content', 'microsoft_word/get_document_properties']
)
# Task to list and read documents
read_docs_task = Task(
description="List all Word documents in my OneDrive, then get the content and properties of the first document found.",
agent=document_reader,
expected_output="List of documents with content and properties of the first document."
)
crew = Crew(
agents=[document_reader],
tasks=[read_docs_task]
)
crew.kickoff()
```
### Document Cleanup and Organization
```python
from crewai import Agent, Task, Crew
# Create an agent for document management
document_organizer = Agent(
role="Document Organizer",
goal="Organize and clean up document collections",
backstory="An AI assistant that helps maintain organized document libraries.",
apps=['microsoft_word/get_documents', 'microsoft_word/get_document_properties', 'microsoft_word/delete_document']
)
# Task to organize documents
organize_task = Task(
description="List all documents, check their properties, and identify any documents that might be duplicates or outdated for potential cleanup.",
agent=document_organizer,
expected_output="Analysis of document library with recommendations for organization."
)
crew = Crew(
agents=[document_organizer],
tasks=[organize_task]
)
crew.kickoff()
```
## Troubleshooting
### Common Issues
**Authentication Errors**
- Ensure your Microsoft account has the necessary permissions for file access (e.g., `Files.Read.All`, `Files.ReadWrite.All`).
- Verify that the OAuth connection includes all required scopes.
**File Creation Issues**
- When creating text documents, ensure the `file_name` ends with `.txt` extension.
- Verify that you have write permissions to the target location (OneDrive/SharePoint).
**Document Access Issues**
- Double-check document IDs for correctness when accessing specific documents.
- Ensure the referenced documents exist and are accessible.
- Note that this integration works best with text files (.txt) for content operations.
**Content Retrieval Limitations**
- The `get_document_content` action works best with text files (.txt).
- For complex Word documents (.docx), consider using the document properties action to get metadata.
### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Microsoft Word integration setup
or troubleshooting.
</Card>

View File

@@ -1,13 +1,13 @@
--- ---
title: Notion Integration title: Notion Integration
description: "User management and commenting with Notion integration for CrewAI." description: "Page and database management with Notion integration for CrewAI."
icon: "book" icon: "book"
mode: "wide" mode: "wide"
--- ---
## Overview ## Overview
Enable your agents to manage users and create comments through Notion. Access workspace user information and create comments on pages and discussions, streamlining your collaboration workflows with AI-powered automation. Enable your agents to manage pages, databases, and content through Notion. Create and update pages, manage content blocks, organize knowledge bases, and streamline your documentation workflows with AI-powered automation.
## Prerequisites ## Prerequisites
@@ -24,8 +24,8 @@ Before using the Notion integration, ensure you have:
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors) 1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Notion** in the Authentication Integrations section 2. Find **Notion** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow 3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for user access and comment creation 4. Grant the necessary permissions for page and database management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations) 5. Copy your Enterprise Token from [Account Settings](https://app.crewai.com/crewai_plus/settings/account)
### 2. Install Required Package ### 2. Install Required Package
@@ -33,74 +33,245 @@ Before using the Notion integration, ensure you have:
uv add crewai-tools uv add crewai-tools
``` ```
### 3. 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
```
## Available Actions ## Available Actions
<AccordionGroup> <AccordionGroup>
<Accordion title="notion/list_users"> <Accordion title="NOTION_CREATE_PAGE">
**Description:** List all users in the workspace. **Description:** Create a page in Notion.
**Parameters:** **Parameters:**
- `page_size` (integer, optional): Number of items returned in the response. Minimum: 1, Maximum: 100, Default: 100 - `parent` (object, required): Parent - The parent page or database where the new page is inserted, represented as a JSON object with a page_id or database_id key.
- `start_cursor` (string, optional): Cursor for pagination. Return results after this cursor.
</Accordion>
<Accordion title="notion/get_user">
**Description:** Retrieve a specific user by ID.
**Parameters:**
- `user_id` (string, required): The ID of the user to retrieve.
</Accordion>
<Accordion title="notion/create_comment">
**Description:** Create a comment on a page or discussion.
**Parameters:**
- `parent` (object, required): The parent page or discussion to comment on.
```json ```json
{ {
"type": "page_id", "database_id": "DATABASE_ID"
"page_id": "PAGE_ID_HERE"
} }
``` ```
or - `properties` (object, required): Properties - The values of the page's properties. If the parent is a database, then the schema must match the parent database's properties.
```json ```json
{ {
"type": "discussion_id", "title": [
"discussion_id": "DISCUSSION_ID_HERE" {
"text": {
"content": "My Page"
}
}
]
} }
``` ```
- `rich_text` (array, required): The rich text content of the comment. - `icon` (object, required): Icon - The page icon.
```json
{
"emoji": "🥬"
}
```
- `children` (object, optional): Children - Content blocks to add to the page.
```json ```json
[ [
{ {
"type": "text", "object": "block",
"text": { "type": "heading_2",
"content": "This is my comment text" "heading_2": {
"rich_text": [
{
"type": "text",
"text": {
"content": "Lacinato kale"
}
}
]
} }
} }
] ]
``` ```
- `cover` (object, optional): Cover - The page cover image.
```json
{
"external": {
"url": "https://upload.wikimedia.org/wikipedia/commons/6/62/Tuscankale.jpg"
}
}
```
</Accordion>
<Accordion title="NOTION_UPDATE_PAGE">
**Description:** Update a page in Notion.
**Parameters:**
- `pageId` (string, required): Page ID - Specify the ID of the Page to Update. (example: "59833787-2cf9-4fdf-8782-e53db20768a5").
- `icon` (object, required): Icon - The page icon.
```json
{
"emoji": "🥬"
}
```
- `archived` (boolean, optional): Archived - Whether the page is archived (deleted). Set to true to archive a page. Set to false to un-archive (restore) a page.
- `properties` (object, optional): Properties - The property values to update for the page.
```json
{
"title": [
{
"text": {
"content": "My Updated Page"
}
}
]
}
```
- `cover` (object, optional): Cover - The page cover image.
```json
{
"external": {
"url": "https://upload.wikimedia.org/wikipedia/commons/6/62/Tuscankale.jpg"
}
}
```
</Accordion>
<Accordion title="NOTION_GET_PAGE_BY_ID">
**Description:** Get a page by ID in Notion.
**Parameters:**
- `pageId` (string, required): Page ID - Specify the ID of the Page to Get. (example: "59833787-2cf9-4fdf-8782-e53db20768a5").
</Accordion>
<Accordion title="NOTION_ARCHIVE_PAGE">
**Description:** Archive a page in Notion.
**Parameters:**
- `pageId` (string, required): Page ID - Specify the ID of the Page to Archive. (example: "59833787-2cf9-4fdf-8782-e53db20768a5").
</Accordion>
<Accordion title="NOTION_SEARCH_PAGES">
**Description:** Search pages in Notion using filters.
**Parameters:**
- `searchByTitleFilterSearch` (object, optional): A filter in disjunctive normal form - OR of AND groups of single conditions.
```json
{
"operator": "OR",
"conditions": [
{
"operator": "AND",
"conditions": [
{
"field": "query",
"operator": "$stringExactlyMatches",
"value": "meeting notes"
}
]
}
]
}
```
Available fields: `query`, `filter.value`, `direction`, `page_size`
</Accordion>
<Accordion title="NOTION_GET_PAGE_CONTENT">
**Description:** Get page content (blocks) in Notion.
**Parameters:**
- `blockId` (string, required): Page ID - Specify a Block or Page ID to receive all of its block's children in order. (example: "59833787-2cf9-4fdf-8782-e53db20768a5").
</Accordion>
<Accordion title="NOTION_UPDATE_BLOCK">
**Description:** Update a block in Notion.
**Parameters:**
- `blockId` (string, required): Block ID - Specify the ID of the Block to Update. (example: "9bc30ad4-9373-46a5-84ab-0a7845ee52e6").
- `archived` (boolean, optional): Archived - Set to true to archive (delete) a block. Set to false to un-archive (restore) a block.
- `paragraph` (object, optional): Paragraph content.
```json
{
"rich_text": [
{
"type": "text",
"text": {
"content": "Lacinato kale",
"link": null
}
}
],
"color": "default"
}
```
- `image` (object, optional): Image block.
```json
{
"type": "external",
"external": {
"url": "https://website.domain/images/image.png"
}
}
```
- `bookmark` (object, optional): Bookmark block.
```json
{
"caption": [],
"url": "https://companywebsite.com"
}
```
- `code` (object, optional): Code block.
```json
{
"rich_text": [
{
"type": "text",
"text": {
"content": "const a = 3"
}
}
],
"language": "javascript"
}
```
- `pdf` (object, optional): PDF block.
```json
{
"type": "external",
"external": {
"url": "https://website.domain/files/doc.pdf"
}
}
```
- `table` (object, optional): Table block.
```json
{
"table_width": 2,
"has_column_header": false,
"has_row_header": false
}
```
- `tableOfContent` (object, optional): Table of Contents block.
```json
{
"color": "default"
}
```
- `additionalFields` (object, optional): Additional block types.
```json
{
"child_page": {
"title": "Lacinato kale"
},
"child_database": {
"title": "My database"
}
}
```
</Accordion>
<Accordion title="NOTION_GET_BLOCK_BY_ID">
**Description:** Get a block by ID in Notion.
**Parameters:**
- `blockId` (string, required): Block ID - Specify the ID of the Block to Get. (example: "9bc30ad4-9373-46a5-84ab-0a7845ee52e6").
</Accordion>
<Accordion title="NOTION_DELETE_BLOCK">
**Description:** Delete a block in Notion.
**Parameters:**
- `blockId` (string, required): Block ID - Specify the ID of the Block to Delete. (example: "9bc30ad4-9373-46a5-84ab-0a7845ee52e6").
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -110,26 +281,32 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Notion tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Notion capabilities # Create an agent with Notion capabilities
notion_agent = Agent( notion_agent = Agent(
role="Workspace Manager", role="Documentation Manager",
goal="Manage workspace users and facilitate collaboration through comments", goal="Manage documentation and knowledge base in Notion efficiently",
backstory="An AI assistant specialized in user management and team collaboration.", backstory="An AI assistant specialized in content management and documentation.",
apps=['notion'] # All Notion actions will be available tools=[enterprise_tools]
) )
# Task to list workspace users # Task to create a meeting notes page
user_management_task = Task( create_notes_task = Task(
description="List all users in the workspace and provide a summary of team members", description="Create a new meeting notes page in the team database with today's date and agenda items",
agent=notion_agent, agent=notion_agent,
expected_output="Complete list of workspace users with their details" expected_output="Meeting notes page created successfully with structured content"
) )
# Run the task # Run the task
crew = Crew( crew = Crew(
agents=[notion_agent], agents=[notion_agent],
tasks=[user_management_task] tasks=[create_notes_task]
) )
crew.kickoff() crew.kickoff()
@@ -138,116 +315,144 @@ crew.kickoff()
### Filtering Specific Notion Tools ### Filtering Specific Notion Tools
```python ```python
comment_manager = Agent( from crewai_tools import CrewaiEnterpriseTools
role="Comment Manager",
goal="Create and manage comments on Notion pages", # Get only specific Notion tools
backstory="An AI assistant that focuses on facilitating discussions through comments.", enterprise_tools = CrewaiEnterpriseTools(
apps=['notion/create_comment'] enterprise_token="your_enterprise_token",
actions_list=["notion_create_page", "notion_update_block", "notion_search_pages"]
) )
# Task to create comments on pages content_manager = Agent(
comment_task = Task( role="Content Manager",
description="Create a summary comment on the project status page with key updates", goal="Create and manage content pages efficiently",
agent=comment_manager, backstory="An AI assistant that focuses on content creation and management.",
expected_output="Comment created successfully with project status updates" tools=enterprise_tools
)
# Task to manage content workflow
content_workflow = Task(
description="Create a new project documentation page and add structured content blocks for requirements and specifications",
agent=content_manager,
expected_output="Project documentation created with organized content sections"
) )
crew = Crew( crew = Crew(
agents=[comment_manager], agents=[content_manager],
tasks=[comment_task] tasks=[content_workflow]
) )
crew.kickoff() crew.kickoff()
``` ```
### User Information and Team Management ### Knowledge Base Management
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
team_coordinator = Agent( enterprise_tools = CrewaiEnterpriseTools(
role="Team Coordinator", enterprise_token="your_enterprise_token"
goal="Coordinate team activities and manage user information",
backstory="An AI assistant that helps coordinate team activities and manages user information.",
apps=['notion']
) )
# Task to coordinate team activities knowledge_curator = Agent(
coordination_task = Task( role="Knowledge Curator",
goal="Curate and organize knowledge base content in Notion",
backstory="An experienced knowledge manager who organizes and maintains comprehensive documentation.",
tools=[enterprise_tools]
)
# Task to curate knowledge base
curation_task = Task(
description=""" description="""
1. List all users in the workspace 1. Search for existing documentation pages related to our new product feature
2. Get detailed information for specific team members 2. Create a comprehensive feature documentation page with proper structure
3. Create comments on relevant pages to notify team members about updates 3. Add code examples, images, and links to related resources
4. Update existing pages with cross-references to the new documentation
""", """,
agent=team_coordinator, agent=knowledge_curator,
expected_output="Team coordination completed with user information gathered and notifications sent" expected_output="Feature documentation created and integrated with existing knowledge base"
) )
crew = Crew( crew = Crew(
agents=[team_coordinator], agents=[knowledge_curator],
tasks=[coordination_task] tasks=[curation_task]
) )
crew.kickoff() crew.kickoff()
``` ```
### Collaboration and Communication ### Content Structure and Organization
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
collaboration_facilitator = Agent( enterprise_tools = CrewaiEnterpriseTools(
role="Collaboration Facilitator", enterprise_token="your_enterprise_token"
goal="Facilitate team collaboration through comments and user management",
backstory="An AI assistant that specializes in team collaboration and communication.",
apps=['notion']
) )
# Task to facilitate collaboration content_organizer = Agent(
collaboration_task = Task( role="Content Organizer",
goal="Organize and structure content blocks for optimal readability",
backstory="An AI assistant that specializes in content structure and user experience.",
tools=[enterprise_tools]
)
# Task to organize content structure
organization_task = Task(
description=""" description="""
1. Identify active users in the workspace 1. Get content from existing project pages
2. Create contextual comments on project pages to facilitate discussions 2. Analyze the structure and identify improvement opportunities
3. Provide status updates and feedback through comments 3. Update content blocks to use proper headings, tables, and formatting
4. Add table of contents and improve navigation between related pages
5. Create templates for future documentation consistency
""", """,
agent=collaboration_facilitator, agent=content_organizer,
expected_output="Collaboration facilitated with comments created and team members notified" expected_output="Content reorganized with improved structure and navigation"
) )
crew = Crew( crew = Crew(
agents=[collaboration_facilitator], agents=[content_organizer],
tasks=[collaboration_task] tasks=[organization_task]
) )
crew.kickoff() crew.kickoff()
``` ```
### Automated Team Communication ### Automated Documentation Workflows
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
communication_automator = Agent( enterprise_tools = CrewaiEnterpriseTools(
role="Communication Automator", enterprise_token="your_enterprise_token"
goal="Automate team communication and user management workflows",
backstory="An AI assistant that automates communication workflows and manages user interactions.",
apps=['notion']
) )
# Complex communication automation task doc_automator = Agent(
role="Documentation Automator",
goal="Automate documentation workflows and maintenance",
backstory="An AI assistant that automates repetitive documentation tasks.",
tools=[enterprise_tools]
)
# Complex documentation automation task
automation_task = Task( automation_task = Task(
description=""" description="""
1. List all workspace users and identify team roles 1. Search for pages that haven't been updated in the last 30 days
2. Get specific user information for project stakeholders 2. Review and update outdated content blocks
3. Create automated status update comments on key project pages 3. Create weekly team update pages with consistent formatting
4. Facilitate team communication through targeted comments 4. Add status indicators and progress tracking to project pages
5. Generate monthly documentation health reports
6. Archive completed project pages and organize them in archive sections
""", """,
agent=communication_automator, agent=doc_automator,
expected_output="Automated communication workflow completed with user management and comments" expected_output="Documentation automated with updated content, weekly reports, and organized archives"
) )
crew = Crew( crew = Crew(
agents=[communication_automator], agents=[doc_automator],
tasks=[automation_task] tasks=[automation_task]
) )
@@ -259,38 +464,47 @@ crew.kickoff()
### Common Issues ### Common Issues
**Permission Errors** **Permission Errors**
- Ensure your Notion account has edit access to the target workspace
- Verify that the OAuth connection includes required scopes for Notion API
- Check that pages and databases are shared with the authenticated integration
- Ensure your Notion account has appropriate permissions to read user information **Invalid Page and Block IDs**
- Verify that the OAuth connection includes required scopes for user access and comment creation - Double-check page IDs and block IDs for correct UUID format
- Check that you have permissions to comment on the target pages or discussions - Ensure referenced pages and blocks exist and are accessible
- Verify that parent page or database IDs are valid when creating new pages
**User Access Issues** **Property Schema Issues**
- Ensure page properties match the database schema when creating pages in databases
- Verify that property names and types are correct for the target database
- Check that required properties are included when creating or updating pages
- Ensure you have workspace admin permissions to list all users **Content Block Structure**
- Verify that user IDs are correct and users exist in the workspace - Ensure block content follows Notion's rich text format specifications
- Check that the workspace allows API access to user information - Verify that nested block structures are properly formatted
- Check that media URLs are accessible and properly formatted
**Comment Creation Issues** **Search and Filter Issues**
- Ensure search queries are properly formatted and not empty
- Use valid field names in filter formulas: `query`, `filter.value`, `direction`, `page_size`
- Test simple searches before building complex filter conditions
- Verify that page IDs or discussion IDs are correct and accessible **Parent-Child Relationships**
- Ensure that rich text content follows Notion's API format specifications - Verify that parent page or database exists before creating child pages
- Check that you have comment permissions on the target pages or discussions - Ensure proper permissions exist for the parent container
- Check that database schemas allow the properties you're trying to set
**API Rate Limits** **Rich Text and Media Content**
- Ensure URLs for external images, PDFs, and bookmarks are accessible
- Verify that rich text formatting follows Notion's API specifications
- Check that code block language types are supported by Notion
- Be mindful of Notion's API rate limits when making multiple requests **Archive and Deletion Operations**
- Implement appropriate delays between requests if needed - Understand the difference between archiving (reversible) and deleting (permanent)
- Consider pagination for large user lists - Verify that you have permissions to archive or delete the target content
- Be cautious with bulk operations that might affect multiple pages or blocks
**Parent Object Specification**
- Ensure parent object type is correctly specified (page_id or discussion_id)
- Verify that the parent page or discussion exists and is accessible
- Check that the parent object ID format is correct
### Getting Help ### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Notion integration setup or Contact our support team for assistance with Notion integration setup or troubleshooting.
troubleshooting.
</Card> </Card>

View File

@@ -17,46 +17,12 @@ Before using the Salesforce integration, ensure you have:
- A Salesforce account with appropriate permissions - A Salesforce account with appropriate permissions
- Connected your Salesforce account through the [Integrations page](https://app.crewai.com/integrations) - Connected your Salesforce account through the [Integrations page](https://app.crewai.com/integrations)
## Setting Up Salesforce Integration
### 1. Connect Your Salesforce Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Salesforce** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for CRM and sales management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Tools ## Available Tools
### **Record Management** ### **Record Management**
<AccordionGroup> <AccordionGroup>
<Accordion title="salesforce/create_record_contact"> <Accordion title="SALESFORCE_CREATE_RECORD_CONTACT">
**Description:** Create a new Contact record in Salesforce. **Description:** Create a new Contact record in Salesforce.
**Parameters:** **Parameters:**
@@ -67,10 +33,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `Title` (string, optional): Title of the contact, such as CEO or Vice President - `Title` (string, optional): Title of the contact, such as CEO or Vice President
- `Description` (string, optional): A description of the Contact - `Description` (string, optional): A description of the Contact
- `additionalFields` (object, optional): Additional fields in JSON format for custom Contact fields - `additionalFields` (object, optional): Additional fields in JSON format for custom Contact fields
</Accordion> </Accordion>
<Accordion title="salesforce/create_record_lead"> <Accordion title="SALESFORCE_CREATE_RECORD_LEAD">
**Description:** Create a new Lead record in Salesforce. **Description:** Create a new Lead record in Salesforce.
**Parameters:** **Parameters:**
@@ -84,10 +49,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `Status` (string, optional): Lead Status - Use Connect Portal Workflow Settings to select Lead Status - `Status` (string, optional): Lead Status - Use Connect Portal Workflow Settings to select Lead Status
- `Description` (string, optional): A description of the Lead - `Description` (string, optional): A description of the Lead
- `additionalFields` (object, optional): Additional fields in JSON format for custom Lead fields - `additionalFields` (object, optional): Additional fields in JSON format for custom Lead fields
</Accordion> </Accordion>
<Accordion title="salesforce/create_record_opportunity"> <Accordion title="SALESFORCE_CREATE_RECORD_OPPORTUNITY">
**Description:** Create a new Opportunity record in Salesforce. **Description:** Create a new Opportunity record in Salesforce.
**Parameters:** **Parameters:**
@@ -100,10 +64,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `OwnerId` (string, optional): The Salesforce user assigned to work on this Opportunity - `OwnerId` (string, optional): The Salesforce user assigned to work on this Opportunity
- `NextStep` (string, optional): Description of next task in closing Opportunity - `NextStep` (string, optional): Description of next task in closing Opportunity
- `additionalFields` (object, optional): Additional fields in JSON format for custom Opportunity fields - `additionalFields` (object, optional): Additional fields in JSON format for custom Opportunity fields
</Accordion> </Accordion>
<Accordion title="salesforce/create_record_task"> <Accordion title="SALESFORCE_CREATE_RECORD_TASK">
**Description:** Create a new Task record in Salesforce. **Description:** Create a new Task record in Salesforce.
**Parameters:** **Parameters:**
@@ -119,10 +82,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `isReminderSet` (boolean, optional): Whether reminder is set - `isReminderSet` (boolean, optional): Whether reminder is set
- `reminderDateTime` (string, optional): Reminder Date/Time in ISO format - `reminderDateTime` (string, optional): Reminder Date/Time in ISO format
- `additionalFields` (object, optional): Additional fields in JSON format for custom Task fields - `additionalFields` (object, optional): Additional fields in JSON format for custom Task fields
</Accordion> </Accordion>
<Accordion title="salesforce/create_record_account"> <Accordion title="SALESFORCE_CREATE_RECORD_ACCOUNT">
**Description:** Create a new Account record in Salesforce. **Description:** Create a new Account record in Salesforce.
**Parameters:** **Parameters:**
@@ -132,21 +94,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `Phone` (string, optional): Phone number - `Phone` (string, optional): Phone number
- `Description` (string, optional): Account description - `Description` (string, optional): Account description
- `additionalFields` (object, optional): Additional fields in JSON format for custom Account fields - `additionalFields` (object, optional): Additional fields in JSON format for custom Account fields
</Accordion> </Accordion>
<Accordion title="salesforce/create_record_any"> <Accordion title="SALESFORCE_CREATE_RECORD_ANY">
**Description:** Create a record of any object type in Salesforce. **Description:** Create a record of any object type in Salesforce.
**Note:** This is a flexible tool for creating records of custom or unknown object types. **Note:** This is a flexible tool for creating records of custom or unknown object types.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Record Updates** ### **Record Updates**
<AccordionGroup> <AccordionGroup>
<Accordion title="salesforce/update_record_contact"> <Accordion title="SALESFORCE_UPDATE_RECORD_CONTACT">
**Description:** Update an existing Contact record in Salesforce. **Description:** Update an existing Contact record in Salesforce.
**Parameters:** **Parameters:**
@@ -158,10 +118,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `Title` (string, optional): Title of the contact - `Title` (string, optional): Title of the contact
- `Description` (string, optional): A description of the Contact - `Description` (string, optional): A description of the Contact
- `additionalFields` (object, optional): Additional fields in JSON format for custom Contact fields - `additionalFields` (object, optional): Additional fields in JSON format for custom Contact fields
</Accordion> </Accordion>
<Accordion title="salesforce/update_record_lead"> <Accordion title="SALESFORCE_UPDATE_RECORD_LEAD">
**Description:** Update an existing Lead record in Salesforce. **Description:** Update an existing Lead record in Salesforce.
**Parameters:** **Parameters:**
@@ -176,10 +135,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `Status` (string, optional): Lead Status - `Status` (string, optional): Lead Status
- `Description` (string, optional): A description of the Lead - `Description` (string, optional): A description of the Lead
- `additionalFields` (object, optional): Additional fields in JSON format for custom Lead fields - `additionalFields` (object, optional): Additional fields in JSON format for custom Lead fields
</Accordion> </Accordion>
<Accordion title="salesforce/update_record_opportunity"> <Accordion title="SALESFORCE_UPDATE_RECORD_OPPORTUNITY">
**Description:** Update an existing Opportunity record in Salesforce. **Description:** Update an existing Opportunity record in Salesforce.
**Parameters:** **Parameters:**
@@ -193,10 +151,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `OwnerId` (string, optional): The Salesforce user assigned to work on this Opportunity - `OwnerId` (string, optional): The Salesforce user assigned to work on this Opportunity
- `NextStep` (string, optional): Description of next task in closing Opportunity - `NextStep` (string, optional): Description of next task in closing Opportunity
- `additionalFields` (object, optional): Additional fields in JSON format for custom Opportunity fields - `additionalFields` (object, optional): Additional fields in JSON format for custom Opportunity fields
</Accordion> </Accordion>
<Accordion title="salesforce/update_record_task"> <Accordion title="SALESFORCE_UPDATE_RECORD_TASK">
**Description:** Update an existing Task record in Salesforce. **Description:** Update an existing Task record in Salesforce.
**Parameters:** **Parameters:**
@@ -212,10 +169,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `isReminderSet` (boolean, optional): Whether reminder is set - `isReminderSet` (boolean, optional): Whether reminder is set
- `reminderDateTime` (string, optional): Reminder Date/Time in ISO format - `reminderDateTime` (string, optional): Reminder Date/Time in ISO format
- `additionalFields` (object, optional): Additional fields in JSON format for custom Task fields - `additionalFields` (object, optional): Additional fields in JSON format for custom Task fields
</Accordion> </Accordion>
<Accordion title="salesforce/update_record_account"> <Accordion title="SALESFORCE_UPDATE_RECORD_ACCOUNT">
**Description:** Update an existing Account record in Salesforce. **Description:** Update an existing Account record in Salesforce.
**Parameters:** **Parameters:**
@@ -226,74 +182,66 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `Phone` (string, optional): Phone number - `Phone` (string, optional): Phone number
- `Description` (string, optional): Account description - `Description` (string, optional): Account description
- `additionalFields` (object, optional): Additional fields in JSON format for custom Account fields - `additionalFields` (object, optional): Additional fields in JSON format for custom Account fields
</Accordion> </Accordion>
<Accordion title="salesforce/update_record_any"> <Accordion title="SALESFORCE_UPDATE_RECORD_ANY">
**Description:** Update a record of any object type in Salesforce. **Description:** Update a record of any object type in Salesforce.
**Note:** This is a flexible tool for updating records of custom or unknown object types. **Note:** This is a flexible tool for updating records of custom or unknown object types.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Record Retrieval** ### **Record Retrieval**
<AccordionGroup> <AccordionGroup>
<Accordion title="salesforce/get_record_by_id_contact"> <Accordion title="SALESFORCE_GET_RECORD_BY_ID_CONTACT">
**Description:** Get a Contact record by its ID. **Description:** Get a Contact record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): Record ID of the Contact - `recordId` (string, required): Record ID of the Contact
</Accordion> </Accordion>
<Accordion title="salesforce/get_record_by_id_lead"> <Accordion title="SALESFORCE_GET_RECORD_BY_ID_LEAD">
**Description:** Get a Lead record by its ID. **Description:** Get a Lead record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): Record ID of the Lead - `recordId` (string, required): Record ID of the Lead
</Accordion> </Accordion>
<Accordion title="salesforce/get_record_by_id_opportunity"> <Accordion title="SALESFORCE_GET_RECORD_BY_ID_OPPORTUNITY">
**Description:** Get an Opportunity record by its ID. **Description:** Get an Opportunity record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): Record ID of the Opportunity - `recordId` (string, required): Record ID of the Opportunity
</Accordion> </Accordion>
<Accordion title="salesforce/get_record_by_id_task"> <Accordion title="SALESFORCE_GET_RECORD_BY_ID_TASK">
**Description:** Get a Task record by its ID. **Description:** Get a Task record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): Record ID of the Task - `recordId` (string, required): Record ID of the Task
</Accordion> </Accordion>
<Accordion title="salesforce/get_record_by_id_account"> <Accordion title="SALESFORCE_GET_RECORD_BY_ID_ACCOUNT">
**Description:** Get an Account record by its ID. **Description:** Get an Account record by its ID.
**Parameters:** **Parameters:**
- `recordId` (string, required): Record ID of the Account - `recordId` (string, required): Record ID of the Account
</Accordion> </Accordion>
<Accordion title="salesforce/get_record_by_id_any"> <Accordion title="SALESFORCE_GET_RECORD_BY_ID_ANY">
**Description:** Get a record of any object type by its ID. **Description:** Get a record of any object type by its ID.
**Parameters:** **Parameters:**
- `recordType` (string, required): Record Type (e.g., "CustomObject__c") - `recordType` (string, required): Record Type (e.g., "CustomObject__c")
- `recordId` (string, required): Record ID - `recordId` (string, required): Record ID
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Record Search** ### **Record Search**
<AccordionGroup> <AccordionGroup>
<Accordion title="salesforce/search_records_contact"> <Accordion title="SALESFORCE_SEARCH_RECORDS_CONTACT">
**Description:** Search for Contact records with advanced filtering. **Description:** Search for Contact records with advanced filtering.
**Parameters:** **Parameters:**
@@ -302,10 +250,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `sortDirection` (string, optional): Sort direction - Options: ASC, DESC - `sortDirection` (string, optional): Sort direction - Options: ASC, DESC
- `includeAllFields` (boolean, optional): Include all fields in results - `includeAllFields` (boolean, optional): Include all fields in results
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
<Accordion title="salesforce/search_records_lead"> <Accordion title="SALESFORCE_SEARCH_RECORDS_LEAD">
**Description:** Search for Lead records with advanced filtering. **Description:** Search for Lead records with advanced filtering.
**Parameters:** **Parameters:**
@@ -314,10 +261,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `sortDirection` (string, optional): Sort direction - Options: ASC, DESC - `sortDirection` (string, optional): Sort direction - Options: ASC, DESC
- `includeAllFields` (boolean, optional): Include all fields in results - `includeAllFields` (boolean, optional): Include all fields in results
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
<Accordion title="salesforce/search_records_opportunity"> <Accordion title="SALESFORCE_SEARCH_RECORDS_OPPORTUNITY">
**Description:** Search for Opportunity records with advanced filtering. **Description:** Search for Opportunity records with advanced filtering.
**Parameters:** **Parameters:**
@@ -326,10 +272,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `sortDirection` (string, optional): Sort direction - Options: ASC, DESC - `sortDirection` (string, optional): Sort direction - Options: ASC, DESC
- `includeAllFields` (boolean, optional): Include all fields in results - `includeAllFields` (boolean, optional): Include all fields in results
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
<Accordion title="salesforce/search_records_task"> <Accordion title="SALESFORCE_SEARCH_RECORDS_TASK">
**Description:** Search for Task records with advanced filtering. **Description:** Search for Task records with advanced filtering.
**Parameters:** **Parameters:**
@@ -338,10 +283,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `sortDirection` (string, optional): Sort direction - Options: ASC, DESC - `sortDirection` (string, optional): Sort direction - Options: ASC, DESC
- `includeAllFields` (boolean, optional): Include all fields in results - `includeAllFields` (boolean, optional): Include all fields in results
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
<Accordion title="salesforce/search_records_account"> <Accordion title="SALESFORCE_SEARCH_RECORDS_ACCOUNT">
**Description:** Search for Account records with advanced filtering. **Description:** Search for Account records with advanced filtering.
**Parameters:** **Parameters:**
@@ -350,10 +294,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `sortDirection` (string, optional): Sort direction - Options: ASC, DESC - `sortDirection` (string, optional): Sort direction - Options: ASC, DESC
- `includeAllFields` (boolean, optional): Include all fields in results - `includeAllFields` (boolean, optional): Include all fields in results
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
<Accordion title="salesforce/search_records_any"> <Accordion title="SALESFORCE_SEARCH_RECORDS_ANY">
**Description:** Search for records of any object type. **Description:** Search for records of any object type.
**Parameters:** **Parameters:**
@@ -361,73 +304,66 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `filterFormula` (string, optional): Filter search criteria - `filterFormula` (string, optional): Filter search criteria
- `includeAllFields` (boolean, optional): Include all fields in results - `includeAllFields` (boolean, optional): Include all fields in results
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **List View Retrieval** ### **List View Retrieval**
<AccordionGroup> <AccordionGroup>
<Accordion title="salesforce/get_record_by_view_id_contact"> <Accordion title="SALESFORCE_GET_RECORD_BY_VIEW_ID_CONTACT">
**Description:** Get Contact records from a specific List View. **Description:** Get Contact records from a specific List View.
**Parameters:** **Parameters:**
- `listViewId` (string, required): List View ID - `listViewId` (string, required): List View ID
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
<Accordion title="salesforce/get_record_by_view_id_lead"> <Accordion title="SALESFORCE_GET_RECORD_BY_VIEW_ID_LEAD">
**Description:** Get Lead records from a specific List View. **Description:** Get Lead records from a specific List View.
**Parameters:** **Parameters:**
- `listViewId` (string, required): List View ID - `listViewId` (string, required): List View ID
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
<Accordion title="salesforce/get_record_by_view_id_opportunity"> <Accordion title="SALESFORCE_GET_RECORD_BY_VIEW_ID_OPPORTUNITY">
**Description:** Get Opportunity records from a specific List View. **Description:** Get Opportunity records from a specific List View.
**Parameters:** **Parameters:**
- `listViewId` (string, required): List View ID - `listViewId` (string, required): List View ID
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
<Accordion title="salesforce/get_record_by_view_id_task"> <Accordion title="SALESFORCE_GET_RECORD_BY_VIEW_ID_TASK">
**Description:** Get Task records from a specific List View. **Description:** Get Task records from a specific List View.
**Parameters:** **Parameters:**
- `listViewId` (string, required): List View ID - `listViewId` (string, required): List View ID
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
<Accordion title="salesforce/get_record_by_view_id_account"> <Accordion title="SALESFORCE_GET_RECORD_BY_VIEW_ID_ACCOUNT">
**Description:** Get Account records from a specific List View. **Description:** Get Account records from a specific List View.
**Parameters:** **Parameters:**
- `listViewId` (string, required): List View ID - `listViewId` (string, required): List View ID
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
<Accordion title="salesforce/get_record_by_view_id_any"> <Accordion title="SALESFORCE_GET_RECORD_BY_VIEW_ID_ANY">
**Description:** Get records of any object type from a specific List View. **Description:** Get records of any object type from a specific List View.
**Parameters:** **Parameters:**
- `recordType` (string, required): Record Type - `recordType` (string, required): Record Type
- `listViewId` (string, required): List View ID - `listViewId` (string, required): List View ID
- `paginationParameters` (object, optional): Pagination settings with pageCursor - `paginationParameters` (object, optional): Pagination settings with pageCursor
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Custom Fields** ### **Custom Fields**
<AccordionGroup> <AccordionGroup>
<Accordion title="salesforce/create_custom_field_contact"> <Accordion title="SALESFORCE_CREATE_CUSTOM_FIELD_CONTACT">
**Description:** Deploy custom fields for Contact objects. **Description:** Deploy custom fields for Contact objects.
**Parameters:** **Parameters:**
@@ -441,10 +377,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `description` (string, optional): Field description - `description` (string, optional): Field description
- `helperText` (string, optional): Helper text shown on hover - `helperText` (string, optional): Helper text shown on hover
- `defaultFieldValue` (string, optional): Default field value - `defaultFieldValue` (string, optional): Default field value
</Accordion> </Accordion>
<Accordion title="salesforce/create_custom_field_lead"> <Accordion title="SALESFORCE_CREATE_CUSTOM_FIELD_LEAD">
**Description:** Deploy custom fields for Lead objects. **Description:** Deploy custom fields for Lead objects.
**Parameters:** **Parameters:**
@@ -458,10 +393,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `description` (string, optional): Field description - `description` (string, optional): Field description
- `helperText` (string, optional): Helper text shown on hover - `helperText` (string, optional): Helper text shown on hover
- `defaultFieldValue` (string, optional): Default field value - `defaultFieldValue` (string, optional): Default field value
</Accordion> </Accordion>
<Accordion title="salesforce/create_custom_field_opportunity"> <Accordion title="SALESFORCE_CREATE_CUSTOM_FIELD_OPPORTUNITY">
**Description:** Deploy custom fields for Opportunity objects. **Description:** Deploy custom fields for Opportunity objects.
**Parameters:** **Parameters:**
@@ -475,10 +409,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `description` (string, optional): Field description - `description` (string, optional): Field description
- `helperText` (string, optional): Helper text shown on hover - `helperText` (string, optional): Helper text shown on hover
- `defaultFieldValue` (string, optional): Default field value - `defaultFieldValue` (string, optional): Default field value
</Accordion> </Accordion>
<Accordion title="salesforce/create_custom_field_task"> <Accordion title="SALESFORCE_CREATE_CUSTOM_FIELD_TASK">
**Description:** Deploy custom fields for Task objects. **Description:** Deploy custom fields for Task objects.
**Parameters:** **Parameters:**
@@ -492,10 +425,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `description` (string, optional): Field description - `description` (string, optional): Field description
- `helperText` (string, optional): Helper text shown on hover - `helperText` (string, optional): Helper text shown on hover
- `defaultFieldValue` (string, optional): Default field value - `defaultFieldValue` (string, optional): Default field value
</Accordion> </Accordion>
<Accordion title="salesforce/create_custom_field_account"> <Accordion title="SALESFORCE_CREATE_CUSTOM_FIELD_ACCOUNT">
**Description:** Deploy custom fields for Account objects. **Description:** Deploy custom fields for Account objects.
**Parameters:** **Parameters:**
@@ -509,29 +441,26 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `description` (string, optional): Field description - `description` (string, optional): Field description
- `helperText` (string, optional): Helper text shown on hover - `helperText` (string, optional): Helper text shown on hover
- `defaultFieldValue` (string, optional): Default field value - `defaultFieldValue` (string, optional): Default field value
</Accordion> </Accordion>
<Accordion title="salesforce/create_custom_field_any"> <Accordion title="SALESFORCE_CREATE_CUSTOM_FIELD_ANY">
**Description:** Deploy custom fields for any object type. **Description:** Deploy custom fields for any object type.
**Note:** This is a flexible tool for creating custom fields on custom or unknown object types. **Note:** This is a flexible tool for creating custom fields on custom or unknown object types.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Advanced Operations** ### **Advanced Operations**
<AccordionGroup> <AccordionGroup>
<Accordion title="salesforce/write_soql_query"> <Accordion title="SALESFORCE_WRITE_SOQL_QUERY">
**Description:** Execute custom SOQL queries against your Salesforce data. **Description:** Execute custom SOQL queries against your Salesforce data.
**Parameters:** **Parameters:**
- `query` (string, required): SOQL Query (e.g., "SELECT Id, Name FROM Account WHERE Name = 'Example'") - `query` (string, required): SOQL Query (e.g., "SELECT Id, Name FROM Account WHERE Name = 'Example'")
</Accordion> </Accordion>
<Accordion title="salesforce/create_custom_object"> <Accordion title="SALESFORCE_CREATE_CUSTOM_OBJECT">
**Description:** Deploy a new custom object in Salesforce. **Description:** Deploy a new custom object in Salesforce.
**Parameters:** **Parameters:**
@@ -539,10 +468,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `pluralLabel` (string, required): Plural Label (e.g., "Accounts") - `pluralLabel` (string, required): Plural Label (e.g., "Accounts")
- `description` (string, optional): A description of the Custom Object - `description` (string, optional): A description of the Custom Object
- `recordName` (string, required): Record Name that appears in layouts and searches (e.g., "Account Name") - `recordName` (string, required): Record Name that appears in layouts and searches (e.g., "Account Name")
</Accordion> </Accordion>
<Accordion title="salesforce/describe_action_schema"> <Accordion title="SALESFORCE_DESCRIBE_ACTION_SCHEMA">
**Description:** Get the expected schema for operations on specific object types. **Description:** Get the expected schema for operations on specific object types.
**Parameters:** **Parameters:**
@@ -550,7 +478,6 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `operation` (string, required): Operation Type (e.g., "CREATE_RECORD" or "UPDATE_RECORD") - `operation` (string, required): Operation Type (e.g., "CREATE_RECORD" or "UPDATE_RECORD")
**Note:** Use this function first when working with custom objects to understand their schema before performing operations. **Note:** Use this function first when working with custom objects to understand their schema before performing operations.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -560,14 +487,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Salesforce tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Salesforce capabilities # Create an agent with Salesforce capabilities
salesforce_agent = Agent( salesforce_agent = Agent(
role="CRM Manager", role="CRM Manager",
goal="Manage customer relationships and sales processes efficiently", goal="Manage customer relationships and sales processes efficiently",
backstory="An AI assistant specialized in CRM operations and sales automation.", backstory="An AI assistant specialized in CRM operations and sales automation.",
apps=['salesforce'] # All Salesforce actions will be available tools=[enterprise_tools]
) )
# Task to create a new lead # Task to create a new lead
@@ -589,12 +521,19 @@ crew.kickoff()
### Filtering Specific Salesforce Tools ### Filtering Specific Salesforce Tools
```python ```python
from crewai_tools import CrewaiEnterpriseTools
# Get only specific Salesforce tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["salesforce_create_record_lead", "salesforce_update_record_opportunity", "salesforce_search_records_contact"]
)
sales_manager = Agent( sales_manager = Agent(
role="Sales Manager", role="Sales Manager",
goal="Manage leads and opportunities in the sales pipeline", goal="Manage leads and opportunities in the sales pipeline",
backstory="An experienced sales manager who handles lead qualification and opportunity management.", backstory="An experienced sales manager who handles lead qualification and opportunity management.",
apps=['salesforce/create_record_lead'] tools=enterprise_tools
) )
# Task to manage sales pipeline # Task to manage sales pipeline
@@ -616,12 +555,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
account_manager = Agent( account_manager = Agent(
role="Account Manager", role="Account Manager",
goal="Manage customer accounts and maintain strong relationships", goal="Manage customer accounts and maintain strong relationships",
backstory="An AI assistant that specializes in account management and customer relationship building.", backstory="An AI assistant that specializes in account management and customer relationship building.",
apps=['salesforce'] tools=[enterprise_tools]
) )
# Task to manage customer accounts # Task to manage customer accounts
@@ -647,12 +591,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
data_analyst = Agent( data_analyst = Agent(
role="Sales Data Analyst", role="Sales Data Analyst",
goal="Generate insights from Salesforce data using SOQL queries", goal="Generate insights from Salesforce data using SOQL queries",
backstory="An analytical AI that excels at extracting meaningful insights from CRM data.", backstory="An analytical AI that excels at extracting meaningful insights from CRM data.",
apps=['salesforce'] tools=[enterprise_tools]
) )
# Complex task involving SOQL queries and data analysis # Complex task involving SOQL queries and data analysis
@@ -680,6 +629,5 @@ This comprehensive documentation covers all the Salesforce tools organized by fu
### Getting Help ### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Salesforce integration setup or Contact our support team for assistance with Salesforce integration setup or troubleshooting.
troubleshooting.
</Card> </Card>

View File

@@ -17,46 +17,12 @@ Before using the Shopify integration, ensure you have:
- A Shopify store with appropriate admin permissions - A Shopify store with appropriate admin permissions
- Connected your Shopify store through the [Integrations page](https://app.crewai.com/integrations) - Connected your Shopify store through the [Integrations page](https://app.crewai.com/integrations)
## Setting Up Shopify Integration
### 1. Connect Your Shopify Store
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Shopify** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for store and product management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Tools ## Available Tools
### **Customer Management** ### **Customer Management**
<AccordionGroup> <AccordionGroup>
<Accordion title="shopify/get_customers"> <Accordion title="SHOPIFY_GET_CUSTOMERS">
**Description:** Retrieve a list of customers from your Shopify store. **Description:** Retrieve a list of customers from your Shopify store.
**Parameters:** **Parameters:**
@@ -66,19 +32,17 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `updatedAtMin` (string, optional): Only return customers updated after this date (ISO or Unix timestamp) - `updatedAtMin` (string, optional): Only return customers updated after this date (ISO or Unix timestamp)
- `updatedAtMax` (string, optional): Only return customers updated before this date (ISO or Unix timestamp) - `updatedAtMax` (string, optional): Only return customers updated before this date (ISO or Unix timestamp)
- `limit` (string, optional): Maximum number of customers to return (defaults to 250) - `limit` (string, optional): Maximum number of customers to return (defaults to 250)
</Accordion> </Accordion>
<Accordion title="shopify/search_customers"> <Accordion title="SHOPIFY_SEARCH_CUSTOMERS">
**Description:** Search for customers using advanced filtering criteria. **Description:** Search for customers using advanced filtering criteria.
**Parameters:** **Parameters:**
- `filterFormula` (object, optional): Advanced filter in disjunctive normal form with field-specific operators - `filterFormula` (object, optional): Advanced filter in disjunctive normal form with field-specific operators
- `limit` (string, optional): Maximum number of customers to return (defaults to 250) - `limit` (string, optional): Maximum number of customers to return (defaults to 250)
</Accordion> </Accordion>
<Accordion title="shopify/create_customer"> <Accordion title="SHOPIFY_CREATE_CUSTOMER">
**Description:** Create a new customer in your Shopify store. **Description:** Create a new customer in your Shopify store.
**Parameters:** **Parameters:**
@@ -97,10 +61,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `note` (string, optional): Customer note - `note` (string, optional): Customer note
- `sendEmailInvite` (boolean, optional): Whether to send email invitation - `sendEmailInvite` (boolean, optional): Whether to send email invitation
- `metafields` (object, optional): Additional metafields in JSON format - `metafields` (object, optional): Additional metafields in JSON format
</Accordion> </Accordion>
<Accordion title="shopify/update_customer"> <Accordion title="SHOPIFY_UPDATE_CUSTOMER">
**Description:** Update an existing customer in your Shopify store. **Description:** Update an existing customer in your Shopify store.
**Parameters:** **Parameters:**
@@ -120,14 +83,13 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `note` (string, optional): Customer note - `note` (string, optional): Customer note
- `sendEmailInvite` (boolean, optional): Whether to send email invitation - `sendEmailInvite` (boolean, optional): Whether to send email invitation
- `metafields` (object, optional): Additional metafields in JSON format - `metafields` (object, optional): Additional metafields in JSON format
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Order Management** ### **Order Management**
<AccordionGroup> <AccordionGroup>
<Accordion title="shopify/get_orders"> <Accordion title="SHOPIFY_GET_ORDERS">
**Description:** Retrieve a list of orders from your Shopify store. **Description:** Retrieve a list of orders from your Shopify store.
**Parameters:** **Parameters:**
@@ -137,10 +99,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `updatedAtMin` (string, optional): Only return orders updated after this date (ISO or Unix timestamp) - `updatedAtMin` (string, optional): Only return orders updated after this date (ISO or Unix timestamp)
- `updatedAtMax` (string, optional): Only return orders updated before this date (ISO or Unix timestamp) - `updatedAtMax` (string, optional): Only return orders updated before this date (ISO or Unix timestamp)
- `limit` (string, optional): Maximum number of orders to return (defaults to 250) - `limit` (string, optional): Maximum number of orders to return (defaults to 250)
</Accordion> </Accordion>
<Accordion title="shopify/create_order"> <Accordion title="SHOPIFY_CREATE_ORDER">
**Description:** Create a new order in your Shopify store. **Description:** Create a new order in your Shopify store.
**Parameters:** **Parameters:**
@@ -151,10 +112,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `financialStatus` (string, optional): Financial status - Options: pending, authorized, partially_paid, paid, partially_refunded, refunded, voided - `financialStatus` (string, optional): Financial status - Options: pending, authorized, partially_paid, paid, partially_refunded, refunded, voided
- `inventoryBehaviour` (string, optional): Inventory behavior - Options: bypass, decrement_ignoring_policy, decrement_obeying_policy - `inventoryBehaviour` (string, optional): Inventory behavior - Options: bypass, decrement_ignoring_policy, decrement_obeying_policy
- `note` (string, optional): Order note - `note` (string, optional): Order note
</Accordion> </Accordion>
<Accordion title="shopify/update_order"> <Accordion title="SHOPIFY_UPDATE_ORDER">
**Description:** Update an existing order in your Shopify store. **Description:** Update an existing order in your Shopify store.
**Parameters:** **Parameters:**
@@ -166,10 +126,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `financialStatus` (string, optional): Financial status - Options: pending, authorized, partially_paid, paid, partially_refunded, refunded, voided - `financialStatus` (string, optional): Financial status - Options: pending, authorized, partially_paid, paid, partially_refunded, refunded, voided
- `inventoryBehaviour` (string, optional): Inventory behavior - Options: bypass, decrement_ignoring_policy, decrement_obeying_policy - `inventoryBehaviour` (string, optional): Inventory behavior - Options: bypass, decrement_ignoring_policy, decrement_obeying_policy
- `note` (string, optional): Order note - `note` (string, optional): Order note
</Accordion> </Accordion>
<Accordion title="shopify/get_abandoned_carts"> <Accordion title="SHOPIFY_GET_ABANDONED_CARTS">
**Description:** Retrieve abandoned carts from your Shopify store. **Description:** Retrieve abandoned carts from your Shopify store.
**Parameters:** **Parameters:**
@@ -179,14 +138,13 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `createdAtMin` (string, optional): Only return carts created after this date (ISO or Unix timestamp) - `createdAtMin` (string, optional): Only return carts created after this date (ISO or Unix timestamp)
- `createdAtMax` (string, optional): Only return carts created before this date (ISO or Unix timestamp) - `createdAtMax` (string, optional): Only return carts created before this date (ISO or Unix timestamp)
- `limit` (string, optional): Maximum number of carts to return (defaults to 250) - `limit` (string, optional): Maximum number of carts to return (defaults to 250)
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Product Management (REST API)** ### **Product Management (REST API)**
<AccordionGroup> <AccordionGroup>
<Accordion title="shopify/get_products"> <Accordion title="SHOPIFY_GET_PRODUCTS">
**Description:** Retrieve a list of products from your Shopify store using REST API. **Description:** Retrieve a list of products from your Shopify store using REST API.
**Parameters:** **Parameters:**
@@ -200,10 +158,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `updatedAtMin` (string, optional): Only return products updated after this date (ISO or Unix timestamp) - `updatedAtMin` (string, optional): Only return products updated after this date (ISO or Unix timestamp)
- `updatedAtMax` (string, optional): Only return products updated before this date (ISO or Unix timestamp) - `updatedAtMax` (string, optional): Only return products updated before this date (ISO or Unix timestamp)
- `limit` (string, optional): Maximum number of products to return (defaults to 250) - `limit` (string, optional): Maximum number of products to return (defaults to 250)
</Accordion> </Accordion>
<Accordion title="shopify/create_product"> <Accordion title="SHOPIFY_CREATE_PRODUCT">
**Description:** Create a new product in your Shopify store using REST API. **Description:** Create a new product in your Shopify store using REST API.
**Parameters:** **Parameters:**
@@ -217,10 +174,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `imageUrl` (string, optional): Product image URL - `imageUrl` (string, optional): Product image URL
- `isPublished` (boolean, optional): Whether product is published - `isPublished` (boolean, optional): Whether product is published
- `publishToPointToSale` (boolean, optional): Whether to publish to point of sale - `publishToPointToSale` (boolean, optional): Whether to publish to point of sale
</Accordion> </Accordion>
<Accordion title="shopify/update_product"> <Accordion title="SHOPIFY_UPDATE_PRODUCT">
**Description:** Update an existing product in your Shopify store using REST API. **Description:** Update an existing product in your Shopify store using REST API.
**Parameters:** **Parameters:**
@@ -235,22 +191,20 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `imageUrl` (string, optional): Product image URL - `imageUrl` (string, optional): Product image URL
- `isPublished` (boolean, optional): Whether product is published - `isPublished` (boolean, optional): Whether product is published
- `publishToPointToSale` (boolean, optional): Whether to publish to point of sale - `publishToPointToSale` (boolean, optional): Whether to publish to point of sale
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Product Management (GraphQL)** ### **Product Management (GraphQL)**
<AccordionGroup> <AccordionGroup>
<Accordion title="shopify/get_products_graphql"> <Accordion title="SHOPIFY_GET_PRODUCTS_GRAPHQL">
**Description:** Retrieve products using advanced GraphQL filtering capabilities. **Description:** Retrieve products using advanced GraphQL filtering capabilities.
**Parameters:** **Parameters:**
- `productFilterFormula` (object, optional): Advanced filter in disjunctive normal form with support for fields like id, title, vendor, status, handle, tag, created_at, updated_at, published_at - `productFilterFormula` (object, optional): Advanced filter in disjunctive normal form with support for fields like id, title, vendor, status, handle, tag, created_at, updated_at, published_at
</Accordion> </Accordion>
<Accordion title="shopify/create_product_graphql"> <Accordion title="SHOPIFY_CREATE_PRODUCT_GRAPHQL">
**Description:** Create a new product using GraphQL API with enhanced media support. **Description:** Create a new product using GraphQL API with enhanced media support.
**Parameters:** **Parameters:**
@@ -261,10 +215,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `tags` (string, optional): Product tags as array or comma-separated list - `tags` (string, optional): Product tags as array or comma-separated list
- `media` (object, optional): Media objects with alt text, content type, and source URL - `media` (object, optional): Media objects with alt text, content type, and source URL
- `additionalFields` (object, optional): Additional product fields like status, requiresSellingPlan, giftCard - `additionalFields` (object, optional): Additional product fields like status, requiresSellingPlan, giftCard
</Accordion> </Accordion>
<Accordion title="shopify/update_product_graphql"> <Accordion title="SHOPIFY_UPDATE_PRODUCT_GRAPHQL">
**Description:** Update an existing product using GraphQL API with enhanced media support. **Description:** Update an existing product using GraphQL API with enhanced media support.
**Parameters:** **Parameters:**
@@ -276,7 +229,6 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `tags` (string, optional): Product tags as array or comma-separated list - `tags` (string, optional): Product tags as array or comma-separated list
- `media` (object, optional): Updated media objects with alt text, content type, and source URL - `media` (object, optional): Updated media objects with alt text, content type, and source URL
- `additionalFields` (object, optional): Additional product fields like status, requiresSellingPlan, giftCard - `additionalFields` (object, optional): Additional product fields like status, requiresSellingPlan, giftCard
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -286,14 +238,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Shopify tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Shopify capabilities # Create an agent with Shopify capabilities
shopify_agent = Agent( shopify_agent = Agent(
role="E-commerce Manager", role="E-commerce Manager",
goal="Manage online store operations and customer relationships efficiently", goal="Manage online store operations and customer relationships efficiently",
backstory="An AI assistant specialized in e-commerce operations and online store management.", backstory="An AI assistant specialized in e-commerce operations and online store management.",
apps=['shopify'] # All Shopify actions will be available tools=[enterprise_tools]
) )
# Task to create a new customer # Task to create a new customer
@@ -315,12 +272,19 @@ crew.kickoff()
### Filtering Specific Shopify Tools ### Filtering Specific Shopify Tools
```python ```python
from crewai_tools import CrewaiEnterpriseTools
# Get only specific Shopify tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["shopify_create_customer", "shopify_create_order", "shopify_get_products"]
)
store_manager = Agent( store_manager = Agent(
role="Store Manager", role="Store Manager",
goal="Manage customer orders and product catalog", goal="Manage customer orders and product catalog",
backstory="An experienced store manager who handles customer relationships and inventory management.", backstory="An experienced store manager who handles customer relationships and inventory management.",
apps=['shopify/create_customer'] tools=enterprise_tools
) )
# Task to manage store operations # Task to manage store operations
@@ -342,12 +306,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
product_manager = Agent( product_manager = Agent(
role="Product Manager", role="Product Manager",
goal="Manage product catalog and inventory with advanced GraphQL capabilities", goal="Manage product catalog and inventory with advanced GraphQL capabilities",
backstory="An AI assistant that specializes in product management and catalog optimization.", backstory="An AI assistant that specializes in product management and catalog optimization.",
apps=['shopify'] tools=[enterprise_tools]
) )
# Task to manage product catalog # Task to manage product catalog
@@ -374,12 +343,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
analytics_agent = Agent( analytics_agent = Agent(
role="E-commerce Analyst", role="E-commerce Analyst",
goal="Analyze customer behavior and order patterns to optimize store performance", goal="Analyze customer behavior and order patterns to optimize store performance",
backstory="An analytical AI that excels at extracting insights from e-commerce data.", backstory="An analytical AI that excels at extracting insights from e-commerce data.",
apps=['shopify'] tools=[enterprise_tools]
) )
# Complex task involving multiple operations # Complex task involving multiple operations
@@ -405,6 +379,5 @@ crew.kickoff()
### Getting Help ### Getting Help
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Shopify integration setup or Contact our support team for assistance with Shopify integration setup or troubleshooting.
troubleshooting.
</Card> </Card>

View File

@@ -17,62 +17,26 @@ Before using the Slack integration, ensure you have:
- A Slack workspace with appropriate permissions - A Slack workspace with appropriate permissions
- Connected your Slack workspace through the [Integrations page](https://app.crewai.com/integrations) - Connected your Slack workspace through the [Integrations page](https://app.crewai.com/integrations)
## Setting Up Slack Integration
### 1. Connect Your Slack Workspace
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Slack** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for team communication
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Tools ## Available Tools
### **User Management** ### **User Management**
<AccordionGroup> <AccordionGroup>
<Accordion title="slack/list_members"> <Accordion title="SLACK_LIST_MEMBERS">
**Description:** List all members in a Slack channel. **Description:** List all members in a Slack channel.
**Parameters:** **Parameters:**
- No parameters required - retrieves all channel members - No parameters required - retrieves all channel members
</Accordion> </Accordion>
<Accordion title="slack/get_user_by_email"> <Accordion title="SLACK_GET_USER_BY_EMAIL">
**Description:** Find a user in your Slack workspace by their email address. **Description:** Find a user in your Slack workspace by their email address.
**Parameters:** **Parameters:**
- `email` (string, required): The email address of a user in the workspace - `email` (string, required): The email address of a user in the workspace
</Accordion> </Accordion>
<Accordion title="slack/get_users_by_name"> <Accordion title="SLACK_GET_USERS_BY_NAME">
**Description:** Search for users by their name or display name. **Description:** Search for users by their name or display name.
**Parameters:** **Parameters:**
@@ -80,26 +44,24 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `displayName` (string, required): User's display name to search for - `displayName` (string, required): User's display name to search for
- `paginationParameters` (object, optional): Pagination settings - `paginationParameters` (object, optional): Pagination settings
- `pageCursor` (string, optional): Page cursor for pagination - `pageCursor` (string, optional): Page cursor for pagination
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Channel Management** ### **Channel Management**
<AccordionGroup> <AccordionGroup>
<Accordion title="slack/list_channels"> <Accordion title="SLACK_LIST_CHANNELS">
**Description:** List all channels in your Slack workspace. **Description:** List all channels in your Slack workspace.
**Parameters:** **Parameters:**
- No parameters required - retrieves all accessible channels - No parameters required - retrieves all accessible channels
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Messaging** ### **Messaging**
<AccordionGroup> <AccordionGroup>
<Accordion title="slack/send_message"> <Accordion title="SLACK_SEND_MESSAGE">
**Description:** Send a message to a Slack channel. **Description:** Send a message to a Slack channel.
**Parameters:** **Parameters:**
@@ -109,10 +71,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `botIcon` (string, required): Bot icon - Can be either an image URL or an emoji (e.g., ":dog:") - `botIcon` (string, required): Bot icon - Can be either an image URL or an emoji (e.g., ":dog:")
- `blocks` (object, optional): Slack Block Kit JSON for rich message formatting with attachments and interactive elements - `blocks` (object, optional): Slack Block Kit JSON for rich message formatting with attachments and interactive elements
- `authenticatedUser` (boolean, optional): If true, message appears to come from your authenticated Slack user instead of the application (defaults to false) - `authenticatedUser` (boolean, optional): If true, message appears to come from your authenticated Slack user instead of the application (defaults to false)
</Accordion> </Accordion>
<Accordion title="slack/send_direct_message"> <Accordion title="SLACK_SEND_DIRECT_MESSAGE">
**Description:** Send a direct message to a specific user in Slack. **Description:** Send a direct message to a specific user in Slack.
**Parameters:** **Parameters:**
@@ -122,14 +83,13 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `botIcon` (string, required): Bot icon - Can be either an image URL or an emoji (e.g., ":dog:") - `botIcon` (string, required): Bot icon - Can be either an image URL or an emoji (e.g., ":dog:")
- `blocks` (object, optional): Slack Block Kit JSON for rich message formatting with attachments and interactive elements - `blocks` (object, optional): Slack Block Kit JSON for rich message formatting with attachments and interactive elements
- `authenticatedUser` (boolean, optional): If true, message appears to come from your authenticated Slack user instead of the application (defaults to false) - `authenticatedUser` (boolean, optional): If true, message appears to come from your authenticated Slack user instead of the application (defaults to false)
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Search & Discovery** ### **Search & Discovery**
<AccordionGroup> <AccordionGroup>
<Accordion title="slack/search_messages"> <Accordion title="SLACK_SEARCH_MESSAGES">
**Description:** Search for messages across your Slack workspace. **Description:** Search for messages across your Slack workspace.
**Parameters:** **Parameters:**
@@ -140,7 +100,6 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `from:@john in:#general` - Search for messages from John in the #general channel - `from:@john in:#general` - Search for messages from John in the #general channel
- `has:link after:2023-01-01` - Search for messages with links after January 1, 2023 - `has:link after:2023-01-01` - Search for messages with links after January 1, 2023
- `in:@channel before:yesterday` - Search for messages in a specific channel before yesterday - `in:@channel before:yesterday` - Search for messages in a specific channel before yesterday
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -149,7 +108,6 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
Slack's Block Kit allows you to create rich, interactive messages. Here are some examples of how to use the `blocks` parameter: Slack's Block Kit allows you to create rich, interactive messages. Here are some examples of how to use the `blocks` parameter:
### Simple Text with Attachment ### Simple Text with Attachment
```json ```json
[ [
{ {
@@ -164,7 +122,6 @@ Slack's Block Kit allows you to create rich, interactive messages. Here are some
``` ```
### Rich Formatting with Sections ### Rich Formatting with Sections
```json ```json
[ [
{ {
@@ -193,13 +150,19 @@ Slack's Block Kit allows you to create rich, interactive messages. Here are some
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Slack tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Slack capabilities # Create an agent with Slack capabilities
slack_agent = Agent( slack_agent = Agent(
role="Team Communication Manager", role="Team Communication Manager",
goal="Facilitate team communication and coordinate collaboration efficiently", goal="Facilitate team communication and coordinate collaboration efficiently",
backstory="An AI assistant specialized in team communication and workspace coordination.", backstory="An AI assistant specialized in team communication and workspace coordination.",
apps=['slack'] # All Slack actions will be available tools=[enterprise_tools]
) )
# Task to send project updates # Task to send project updates
@@ -221,18 +184,19 @@ crew.kickoff()
### Filtering Specific Slack Tools ### Filtering Specific Slack Tools
```python ```python
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get only specific Slack tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["slack_send_message", "slack_send_direct_message", "slack_search_messages"]
)
# Create agent with specific Slack actions only
communication_manager = Agent( communication_manager = Agent(
role="Communication Coordinator", role="Communication Coordinator",
goal="Manage team communications and ensure important messages reach the right people", goal="Manage team communications and ensure important messages reach the right people",
backstory="An experienced communication coordinator who handles team messaging and notifications.", backstory="An experienced communication coordinator who handles team messaging and notifications.",
apps=[ tools=enterprise_tools
'slack/send_message',
'slack/send_direct_message',
'slack/search_messages'
] # Using canonical action names from canonical_integrations.yml
) )
# Task to coordinate team communication # Task to coordinate team communication
@@ -254,13 +218,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create agent with Slack messaging capabilities
notification_agent = Agent( notification_agent = Agent(
role="Notification Manager", role="Notification Manager",
goal="Create rich, interactive notifications and manage workspace communication", goal="Create rich, interactive notifications and manage workspace communication",
backstory="An AI assistant that specializes in creating engaging team notifications and updates.", backstory="An AI assistant that specializes in creating engaging team notifications and updates.",
apps=['slack/send_message'] # Specific action for sending messages tools=[enterprise_tools]
) )
# Task to send rich notifications # Task to send rich notifications
@@ -286,17 +254,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create agent with Slack search and user management capabilities
analytics_agent = Agent( analytics_agent = Agent(
role="Communication Analyst", role="Communication Analyst",
goal="Analyze team communication patterns and extract insights from conversations", goal="Analyze team communication patterns and extract insights from conversations",
backstory="An analytical AI that excels at understanding team dynamics through communication data.", backstory="An analytical AI that excels at understanding team dynamics through communication data.",
apps=[ tools=[enterprise_tools]
'slack/search_messages',
'slack/get_user_by_email',
'slack/list_members'
] # Using canonical action names from canonical_integrations.yml
) )
# Complex task involving search and analysis # Complex task involving search and analysis
@@ -322,6 +290,5 @@ crew.kickoff()
## Contact Support ## Contact Support
<Card title="Need Help?" icon="headset" href="mailto:support@crewai.com"> <Card title="Need Help?" icon="headset" href="mailto:support@crewai.com">
Contact our support team for assistance with Slack integration setup or Contact our support team for assistance with Slack integration setup or troubleshooting.
troubleshooting.
</Card> </Card>

View File

@@ -17,46 +17,12 @@ Before using the Stripe integration, ensure you have:
- A Stripe account with appropriate API permissions - A Stripe account with appropriate API permissions
- Connected your Stripe account through the [Integrations page](https://app.crewai.com/integrations) - Connected your Stripe account through the [Integrations page](https://app.crewai.com/integrations)
## Setting Up Stripe Integration
### 1. Connect Your Stripe Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Stripe** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for payment processing
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Tools ## Available Tools
### **Customer Management** ### **Customer Management**
<AccordionGroup> <AccordionGroup>
<Accordion title="stripe/create_customer"> <Accordion title="STRIPE_CREATE_CUSTOMER">
**Description:** Create a new customer in your Stripe account. **Description:** Create a new customer in your Stripe account.
**Parameters:** **Parameters:**
@@ -64,18 +30,16 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `name` (string, optional): Customer's full name - `name` (string, optional): Customer's full name
- `description` (string, optional): Customer description for internal reference - `description` (string, optional): Customer description for internal reference
- `metadataCreateCustomer` (object, optional): Additional metadata as key-value pairs (e.g., `{"field1": 1, "field2": 2}`) - `metadataCreateCustomer` (object, optional): Additional metadata as key-value pairs (e.g., `{"field1": 1, "field2": 2}`)
</Accordion> </Accordion>
<Accordion title="stripe/get_customer_by_id"> <Accordion title="STRIPE_GET_CUSTOMER_BY_ID">
**Description:** Retrieve a specific customer by their Stripe customer ID. **Description:** Retrieve a specific customer by their Stripe customer ID.
**Parameters:** **Parameters:**
- `idGetCustomer` (string, required): The Stripe customer ID to retrieve - `idGetCustomer` (string, required): The Stripe customer ID to retrieve
</Accordion> </Accordion>
<Accordion title="stripe/get_customers"> <Accordion title="STRIPE_GET_CUSTOMERS">
**Description:** Retrieve a list of customers with optional filtering. **Description:** Retrieve a list of customers with optional filtering.
**Parameters:** **Parameters:**
@@ -83,10 +47,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `createdAfter` (string, optional): Filter customers created after this date (Unix timestamp) - `createdAfter` (string, optional): Filter customers created after this date (Unix timestamp)
- `createdBefore` (string, optional): Filter customers created before this date (Unix timestamp) - `createdBefore` (string, optional): Filter customers created before this date (Unix timestamp)
- `limitGetCustomers` (string, optional): Maximum number of customers to return (defaults to 10) - `limitGetCustomers` (string, optional): Maximum number of customers to return (defaults to 10)
</Accordion> </Accordion>
<Accordion title="stripe/update_customer"> <Accordion title="STRIPE_UPDATE_CUSTOMER">
**Description:** Update an existing customer's information. **Description:** Update an existing customer's information.
**Parameters:** **Parameters:**
@@ -95,87 +58,79 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `name` (string, optional): Updated customer name - `name` (string, optional): Updated customer name
- `description` (string, optional): Updated customer description - `description` (string, optional): Updated customer description
- `metadataUpdateCustomer` (object, optional): Updated metadata as key-value pairs - `metadataUpdateCustomer` (object, optional): Updated metadata as key-value pairs
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Subscription Management** ### **Subscription Management**
<AccordionGroup> <AccordionGroup>
<Accordion title="stripe/create_subscription"> <Accordion title="STRIPE_CREATE_SUBSCRIPTION">
**Description:** Create a new subscription for a customer. **Description:** Create a new subscription for a customer.
**Parameters:** **Parameters:**
- `customerIdCreateSubscription` (string, required): The customer ID for whom the subscription will be created - `customerIdCreateSubscription` (string, required): The customer ID for whom the subscription will be created
- `plan` (string, required): The plan ID for the subscription - Use Connect Portal Workflow Settings to allow users to select a plan - `plan` (string, required): The plan ID for the subscription - Use Connect Portal Workflow Settings to allow users to select a plan
- `metadataCreateSubscription` (object, optional): Additional metadata for the subscription - `metadataCreateSubscription` (object, optional): Additional metadata for the subscription
</Accordion> </Accordion>
<Accordion title="stripe/get_subscriptions"> <Accordion title="STRIPE_GET_SUBSCRIPTIONS">
**Description:** Retrieve subscriptions with optional filtering. **Description:** Retrieve subscriptions with optional filtering.
**Parameters:** **Parameters:**
- `customerIdGetSubscriptions` (string, optional): Filter subscriptions by customer ID - `customerIdGetSubscriptions` (string, optional): Filter subscriptions by customer ID
- `subscriptionStatus` (string, optional): Filter by subscription status - Options: incomplete, incomplete_expired, trialing, active, past_due, canceled, unpaid - `subscriptionStatus` (string, optional): Filter by subscription status - Options: incomplete, incomplete_expired, trialing, active, past_due, canceled, unpaid
- `limitGetSubscriptions` (string, optional): Maximum number of subscriptions to return (defaults to 10) - `limitGetSubscriptions` (string, optional): Maximum number of subscriptions to return (defaults to 10)
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Product Management** ### **Product Management**
<AccordionGroup> <AccordionGroup>
<Accordion title="stripe/create_product"> <Accordion title="STRIPE_CREATE_PRODUCT">
**Description:** Create a new product in your Stripe catalog. **Description:** Create a new product in your Stripe catalog.
**Parameters:** **Parameters:**
- `productName` (string, required): The product name - `productName` (string, required): The product name
- `description` (string, optional): Product description - `description` (string, optional): Product description
- `metadataProduct` (object, optional): Additional product metadata as key-value pairs - `metadataProduct` (object, optional): Additional product metadata as key-value pairs
</Accordion> </Accordion>
<Accordion title="stripe/get_product_by_id"> <Accordion title="STRIPE_GET_PRODUCT_BY_ID">
**Description:** Retrieve a specific product by its Stripe product ID. **Description:** Retrieve a specific product by its Stripe product ID.
**Parameters:** **Parameters:**
- `productId` (string, required): The Stripe product ID to retrieve - `productId` (string, required): The Stripe product ID to retrieve
</Accordion> </Accordion>
<Accordion title="stripe/get_products"> <Accordion title="STRIPE_GET_PRODUCTS">
**Description:** Retrieve a list of products with optional filtering. **Description:** Retrieve a list of products with optional filtering.
**Parameters:** **Parameters:**
- `createdAfter` (string, optional): Filter products created after this date (Unix timestamp) - `createdAfter` (string, optional): Filter products created after this date (Unix timestamp)
- `createdBefore` (string, optional): Filter products created before this date (Unix timestamp) - `createdBefore` (string, optional): Filter products created before this date (Unix timestamp)
- `limitGetProducts` (string, optional): Maximum number of products to return (defaults to 10) - `limitGetProducts` (string, optional): Maximum number of products to return (defaults to 10)
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Financial Operations** ### **Financial Operations**
<AccordionGroup> <AccordionGroup>
<Accordion title="stripe/get_balance_transactions"> <Accordion title="STRIPE_GET_BALANCE_TRANSACTIONS">
**Description:** Retrieve balance transactions from your Stripe account. **Description:** Retrieve balance transactions from your Stripe account.
**Parameters:** **Parameters:**
- `balanceTransactionType` (string, optional): Filter by transaction type - Options: charge, refund, payment, payment_refund - `balanceTransactionType` (string, optional): Filter by transaction type - Options: charge, refund, payment, payment_refund
- `paginationParameters` (object, optional): Pagination settings - `paginationParameters` (object, optional): Pagination settings
- `pageCursor` (string, optional): Page cursor for pagination - `pageCursor` (string, optional): Page cursor for pagination
</Accordion> </Accordion>
<Accordion title="stripe/get_plans"> <Accordion title="STRIPE_GET_PLANS">
**Description:** Retrieve subscription plans from your Stripe account. **Description:** Retrieve subscription plans from your Stripe account.
**Parameters:** **Parameters:**
- `isPlanActive` (boolean, optional): Filter by plan status - true for active plans, false for inactive plans - `isPlanActive` (boolean, optional): Filter by plan status - true for active plans, false for inactive plans
- `paginationParameters` (object, optional): Pagination settings - `paginationParameters` (object, optional): Pagination settings
- `pageCursor` (string, optional): Page cursor for pagination - `pageCursor` (string, optional): Page cursor for pagination
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -185,14 +140,19 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Stripe tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Stripe capabilities # Create an agent with Stripe capabilities
stripe_agent = Agent( stripe_agent = Agent(
role="Payment Manager", role="Payment Manager",
goal="Manage customer payments, subscriptions, and billing operations efficiently", goal="Manage customer payments, subscriptions, and billing operations efficiently",
backstory="An AI assistant specialized in payment processing and subscription management.", backstory="An AI assistant specialized in payment processing and subscription management.",
apps=['stripe'] # All Stripe actions will be available tools=[enterprise_tools]
) )
# Task to create a new customer # Task to create a new customer
@@ -214,12 +174,19 @@ crew.kickoff()
### Filtering Specific Stripe Tools ### Filtering Specific Stripe Tools
```python ```python
from crewai_tools import CrewaiEnterpriseTools
# Get only specific Stripe tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["stripe_create_customer", "stripe_create_subscription", "stripe_get_balance_transactions"]
)
billing_manager = Agent( billing_manager = Agent(
role="Billing Manager", role="Billing Manager",
goal="Handle customer billing, subscriptions, and payment processing", goal="Handle customer billing, subscriptions, and payment processing",
backstory="An experienced billing manager who handles subscription lifecycle and payment operations.", backstory="An experienced billing manager who handles subscription lifecycle and payment operations.",
apps=['stripe'] tools=enterprise_tools
) )
# Task to manage billing operations # Task to manage billing operations
@@ -241,12 +208,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
subscription_manager = Agent( subscription_manager = Agent(
role="Subscription Manager", role="Subscription Manager",
goal="Manage customer subscriptions and optimize recurring revenue", goal="Manage customer subscriptions and optimize recurring revenue",
backstory="An AI assistant that specializes in subscription lifecycle management and customer retention.", backstory="An AI assistant that specializes in subscription lifecycle management and customer retention.",
apps=['stripe'] tools=[enterprise_tools]
) )
# Task to manage subscription operations # Task to manage subscription operations
@@ -273,12 +245,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
financial_analyst = Agent( financial_analyst = Agent(
role="Financial Analyst", role="Financial Analyst",
goal="Analyze payment data and generate financial insights", goal="Analyze payment data and generate financial insights",
backstory="An analytical AI that excels at extracting insights from payment and subscription data.", backstory="An analytical AI that excels at extracting insights from payment and subscription data.",
apps=['stripe'] tools=[enterprise_tools]
) )
# Complex task involving financial analysis # Complex task involving financial analysis

View File

@@ -17,46 +17,12 @@ Before using the Zendesk integration, ensure you have:
- A Zendesk account with appropriate API permissions - A Zendesk account with appropriate API permissions
- Connected your Zendesk account through the [Integrations page](https://app.crewai.com/integrations) - Connected your Zendesk account through the [Integrations page](https://app.crewai.com/integrations)
## Setting Up Zendesk Integration
### 1. Connect Your Zendesk Account
1. Navigate to [CrewAI AMP Integrations](https://app.crewai.com/crewai_plus/connectors)
2. Find **Zendesk** in the Authentication Integrations section
3. Click **Connect** and complete the OAuth flow
4. Grant the necessary permissions for ticket and user management
5. Copy your Enterprise Token from [Integration Settings](https://app.crewai.com/crewai_plus/settings/integrations)
### 2. Install Required Package
```bash
uv add crewai-tools
```
### 3. 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
```
## Available Tools ## Available Tools
### **Ticket Management** ### **Ticket Management**
<AccordionGroup> <AccordionGroup>
<Accordion title="zendesk/create_ticket"> <Accordion title="ZENDESK_CREATE_TICKET">
**Description:** Create a new support ticket in Zendesk. **Description:** Create a new support ticket in Zendesk.
**Parameters:** **Parameters:**
@@ -72,10 +38,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `ticketTags` (string, optional): Array of tags to apply (e.g., `["enterprise", "other_tag"]`) - `ticketTags` (string, optional): Array of tags to apply (e.g., `["enterprise", "other_tag"]`)
- `ticketExternalId` (string, optional): External ID to link tickets to local records - `ticketExternalId` (string, optional): External ID to link tickets to local records
- `ticketCustomFields` (object, optional): Custom field values in JSON format - `ticketCustomFields` (object, optional): Custom field values in JSON format
</Accordion> </Accordion>
<Accordion title="zendesk/update_ticket"> <Accordion title="ZENDESK_UPDATE_TICKET">
**Description:** Update an existing support ticket in Zendesk. **Description:** Update an existing support ticket in Zendesk.
**Parameters:** **Parameters:**
@@ -91,18 +56,16 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `ticketTags` (string, optional): Updated tags array - `ticketTags` (string, optional): Updated tags array
- `ticketExternalId` (string, optional): Updated external ID - `ticketExternalId` (string, optional): Updated external ID
- `ticketCustomFields` (object, optional): Updated custom field values - `ticketCustomFields` (object, optional): Updated custom field values
</Accordion> </Accordion>
<Accordion title="zendesk/get_ticket_by_id"> <Accordion title="ZENDESK_GET_TICKET_BY_ID">
**Description:** Retrieve a specific ticket by its ID. **Description:** Retrieve a specific ticket by its ID.
**Parameters:** **Parameters:**
- `ticketId` (string, required): The ticket ID to retrieve (e.g., "35436") - `ticketId` (string, required): The ticket ID to retrieve (e.g., "35436")
</Accordion> </Accordion>
<Accordion title="zendesk/add_comment_to_ticket"> <Accordion title="ZENDESK_ADD_COMMENT_TO_TICKET">
**Description:** Add a comment or internal note to an existing ticket. **Description:** Add a comment or internal note to an existing ticket.
**Parameters:** **Parameters:**
@@ -110,10 +73,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `commentBody` (string, required): Comment message (accepts plain text or HTML, e.g., "Thanks for your help!") - `commentBody` (string, required): Comment message (accepts plain text or HTML, e.g., "Thanks for your help!")
- `isInternalNote` (boolean, optional): Set to true for internal notes instead of public replies (defaults to false) - `isInternalNote` (boolean, optional): Set to true for internal notes instead of public replies (defaults to false)
- `isPublic` (boolean, optional): True for public comments, false for internal notes - `isPublic` (boolean, optional): True for public comments, false for internal notes
</Accordion> </Accordion>
<Accordion title="zendesk/search_tickets"> <Accordion title="ZENDESK_SEARCH_TICKETS">
**Description:** Search for tickets using various filters and criteria. **Description:** Search for tickets using various filters and criteria.
**Parameters:** **Parameters:**
@@ -132,14 +94,13 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `dueDate` (object, optional): Filter by due date with operator and value - `dueDate` (object, optional): Filter by due date with operator and value
- `sort_by` (string, optional): Sort field - Options: created_at, updated_at, priority, status, ticket_type - `sort_by` (string, optional): Sort field - Options: created_at, updated_at, priority, status, ticket_type
- `sort_order` (string, optional): Sort direction - Options: asc, desc - `sort_order` (string, optional): Sort direction - Options: asc, desc
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **User Management** ### **User Management**
<AccordionGroup> <AccordionGroup>
<Accordion title="zendesk/create_user"> <Accordion title="ZENDESK_CREATE_USER">
**Description:** Create a new user in Zendesk. **Description:** Create a new user in Zendesk.
**Parameters:** **Parameters:**
@@ -150,10 +111,9 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `externalId` (string, optional): Unique identifier from another system - `externalId` (string, optional): Unique identifier from another system
- `details` (string, optional): Additional user details - `details` (string, optional): Additional user details
- `notes` (string, optional): Internal notes about the user - `notes` (string, optional): Internal notes about the user
</Accordion> </Accordion>
<Accordion title="zendesk/update_user"> <Accordion title="ZENDESK_UPDATE_USER">
**Description:** Update an existing user's information. **Description:** Update an existing user's information.
**Parameters:** **Parameters:**
@@ -165,18 +125,16 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `externalId` (string, optional): Updated external ID - `externalId` (string, optional): Updated external ID
- `details` (string, optional): Updated user details - `details` (string, optional): Updated user details
- `notes` (string, optional): Updated internal notes - `notes` (string, optional): Updated internal notes
</Accordion> </Accordion>
<Accordion title="zendesk/get_user_by_id"> <Accordion title="ZENDESK_GET_USER_BY_ID">
**Description:** Retrieve a specific user by their ID. **Description:** Retrieve a specific user by their ID.
**Parameters:** **Parameters:**
- `userId` (string, required): The user ID to retrieve - `userId` (string, required): The user ID to retrieve
</Accordion> </Accordion>
<Accordion title="zendesk/search_users"> <Accordion title="ZENDESK_SEARCH_USERS">
**Description:** Search for users using various criteria. **Description:** Search for users using various criteria.
**Parameters:** **Parameters:**
@@ -186,30 +144,27 @@ CREWAI_PLATFORM_INTEGRATION_TOKEN=your_enterprise_token
- `externalId` (string, optional): Filter by external ID - `externalId` (string, optional): Filter by external ID
- `sort_by` (string, optional): Sort field - Options: created_at, updated_at - `sort_by` (string, optional): Sort field - Options: created_at, updated_at
- `sort_order` (string, optional): Sort direction - Options: asc, desc - `sort_order` (string, optional): Sort direction - Options: asc, desc
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
### **Administrative Tools** ### **Administrative Tools**
<AccordionGroup> <AccordionGroup>
<Accordion title="zendesk/get_ticket_fields"> <Accordion title="ZENDESK_GET_TICKET_FIELDS">
**Description:** Retrieve all standard and custom fields available for tickets. **Description:** Retrieve all standard and custom fields available for tickets.
**Parameters:** **Parameters:**
- `paginationParameters` (object, optional): Pagination settings - `paginationParameters` (object, optional): Pagination settings
- `pageCursor` (string, optional): Page cursor for pagination - `pageCursor` (string, optional): Page cursor for pagination
</Accordion> </Accordion>
<Accordion title="zendesk/get_ticket_audits"> <Accordion title="ZENDESK_GET_TICKET_AUDITS">
**Description:** Get audit records (read-only history) for tickets. **Description:** Get audit records (read-only history) for tickets.
**Parameters:** **Parameters:**
- `ticketId` (string, optional): Get audits for specific ticket (if empty, retrieves audits for all non-archived tickets, e.g., "1234") - `ticketId` (string, optional): Get audits for specific ticket (if empty, retrieves audits for all non-archived tickets, e.g., "1234")
- `paginationParameters` (object, optional): Pagination settings - `paginationParameters` (object, optional): Pagination settings
- `pageCursor` (string, optional): Page cursor for pagination - `pageCursor` (string, optional): Page cursor for pagination
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -250,14 +205,19 @@ Standard ticket status progression:
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get enterprise tools (Zendesk tools will be included)
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
# Create an agent with Zendesk capabilities # Create an agent with Zendesk capabilities
zendesk_agent = Agent( zendesk_agent = Agent(
role="Support Manager", role="Support Manager",
goal="Manage customer support tickets and provide excellent customer service", goal="Manage customer support tickets and provide excellent customer service",
backstory="An AI assistant specialized in customer support operations and ticket management.", backstory="An AI assistant specialized in customer support operations and ticket management.",
apps=['zendesk'] # All Zendesk actions will be available tools=[enterprise_tools]
) )
# Task to create a new support ticket # Task to create a new support ticket
@@ -279,14 +239,19 @@ crew.kickoff()
### Filtering Specific Zendesk Tools ### Filtering Specific Zendesk Tools
```python ```python
from crewai import Agent, Task, Crew from crewai_tools import CrewaiEnterpriseTools
# Get only specific Zendesk tools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token",
actions_list=["zendesk_create_ticket", "zendesk_update_ticket", "zendesk_add_comment_to_ticket"]
)
# Create agent with specific Zendesk actions only
support_agent = Agent( support_agent = Agent(
role="Customer Support Agent", role="Customer Support Agent",
goal="Handle customer inquiries and resolve support issues efficiently", goal="Handle customer inquiries and resolve support issues efficiently",
backstory="An experienced support agent who specializes in ticket resolution and customer communication.", backstory="An experienced support agent who specializes in ticket resolution and customer communication.",
apps=['zendesk/create_ticket'] # Specific Zendesk actions tools=enterprise_tools
) )
# Task to manage support workflow # Task to manage support workflow
@@ -308,12 +273,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
ticket_manager = Agent( ticket_manager = Agent(
role="Ticket Manager", role="Ticket Manager",
goal="Manage support ticket workflows and ensure timely resolution", goal="Manage support ticket workflows and ensure timely resolution",
backstory="An AI assistant that specializes in support ticket triage and workflow optimization.", backstory="An AI assistant that specializes in support ticket triage and workflow optimization.",
apps=['zendesk'] tools=[enterprise_tools]
) )
# Task to manage ticket lifecycle # Task to manage ticket lifecycle
@@ -340,12 +310,17 @@ crew.kickoff()
```python ```python
from crewai import Agent, Task, Crew from crewai import Agent, Task, Crew
from crewai_tools import CrewaiEnterpriseTools
enterprise_tools = CrewaiEnterpriseTools(
enterprise_token="your_enterprise_token"
)
support_analyst = Agent( support_analyst = Agent(
role="Support Analyst", role="Support Analyst",
goal="Analyze support metrics and generate insights for team performance", goal="Analyze support metrics and generate insights for team performance",
backstory="An analytical AI that excels at extracting insights from support data and ticket patterns.", backstory="An analytical AI that excels at extracting insights from support data and ticket patterns.",
apps=['zendesk'] tools=[enterprise_tools]
) )
# Complex task involving analytics and reporting # Complex task involving analytics and reporting

View File

@@ -10,10 +10,7 @@ mode: "wide"
CrewAI AMP(Agent Management Platform) provides a platform for deploying, monitoring, and scaling your crews and agents in a production environment. CrewAI AMP(Agent Management Platform) provides a platform for deploying, monitoring, and scaling your crews and agents in a production environment.
<Frame> <Frame>
<img <img src="/images/enterprise/crewai-enterprise-dashboard.png" alt="CrewAI AMP Dashboard" />
src="/images/enterprise/crewai-enterprise-dashboard.png"
alt="CrewAI AMP Dashboard"
/>
</Frame> </Frame>
CrewAI AMP extends the power of the open-source framework with features designed for production deployments, collaboration, and scalability. Deploy your crews to a managed infrastructure and monitor their execution in real-time. CrewAI AMP extends the power of the open-source framework with features designed for production deployments, collaboration, and scalability. Deploy your crews to a managed infrastructure and monitor their execution in real-time.
@@ -25,8 +22,7 @@ CrewAI AMP extends the power of the open-source framework with features designed
Deploy your crews to a managed infrastructure with a few clicks Deploy your crews to a managed infrastructure with a few clicks
</Card> </Card>
<Card title="API Access" icon="code"> <Card title="API Access" icon="code">
Access your deployed crews via REST API for integration with existing Access your deployed crews via REST API for integration with existing systems
systems
</Card> </Card>
<Card title="Observability" icon="chart-line"> <Card title="Observability" icon="chart-line">
Monitor your crews with detailed execution traces and logs Monitor your crews with detailed execution traces and logs
@@ -61,7 +57,11 @@ CrewAI AMP extends the power of the open-source framework with features designed
<Steps> <Steps>
<Step title="Sign up for an account"> <Step title="Sign up for an account">
Create your account at [app.crewai.com](https://app.crewai.com) Create your account at [app.crewai.com](https://app.crewai.com)
<Card title="Sign Up" icon="user" href="https://app.crewai.com/signup"> <Card
title="Sign Up"
icon="user"
href="https://app.crewai.com/signup"
>
Sign Up Sign Up
</Card> </Card>
</Step> </Step>

View File

@@ -49,7 +49,7 @@ mode: "wide"
To integrate human input into agent execution, set the `human_input` flag in the task definition. When enabled, the agent prompts the user for input before delivering its final answer. This input can provide extra context, clarify ambiguities, or validate the agent's output. To integrate human input into agent execution, set the `human_input` flag in the task definition. When enabled, the agent prompts the user for input before delivering its final answer. This input can provide extra context, clarify ambiguities, or validate the agent's output.
For detailed implementation guidance, see our [Human-in-the-Loop guide](/en/enterprise/guides/human-in-the-loop). For detailed implementation guidance, see our [Human-in-the-Loop guide](/en/how-to/human-in-the-loop).
</Accordion> </Accordion>
<Accordion title="What advanced customization options are available for tailoring and enhancing agent behavior and capabilities in CrewAI?"> <Accordion title="What advanced customization options are available for tailoring and enhancing agent behavior and capabilities in CrewAI?">
@@ -142,11 +142,10 @@ mode: "wide"
<Accordion title="How can I create custom tools for my CrewAI agents?"> <Accordion title="How can I create custom tools for my CrewAI agents?">
You can create custom tools by subclassing the `BaseTool` class provided by CrewAI or by using the tool decorator. Subclassing involves defining a new class that inherits from `BaseTool`, specifying the name, description, and the `_run` method for operational logic. The tool decorator allows you to create a `Tool` object directly with the required attributes and a functional logic. You can create custom tools by subclassing the `BaseTool` class provided by CrewAI or by using the tool decorator. Subclassing involves defining a new class that inherits from `BaseTool`, specifying the name, description, and the `_run` method for operational logic. The tool decorator allows you to create a `Tool` object directly with the required attributes and a functional logic.
<Card href="/en/learn/create-custom-tools" icon="code">CrewAI Tools Guide</Card> <Card href="https://docs.crewai.com/how-to/create-custom-tools" icon="code">CrewAI Tools Guide</Card>
</Accordion> </Accordion>
<Accordion title="How can you control the maximum number of requests per minute that the entire crew can perform?"> <Accordion title="How can you control the maximum number of requests per minute that the entire crew can perform?">
The `max_rpm` attribute sets the maximum number of requests per minute the crew can perform to avoid rate limits and will override individual agents' `max_rpm` settings if you set it. The `max_rpm` attribute sets the maximum number of requests per minute the crew can perform to avoid rate limits and will override individual agents' `max_rpm` settings if you set it.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>

View File

@@ -6,7 +6,6 @@ mode: "wide"
--- ---
## Video Tutorial ## Video Tutorial
Watch this video tutorial for a step-by-step demonstration of the installation process: Watch this video tutorial for a step-by-step demonstration of the installation process:
<iframe <iframe
@@ -19,25 +18,21 @@ Watch this video tutorial for a step-by-step demonstration of the installation p
></iframe> ></iframe>
## Text Tutorial ## Text Tutorial
<Note> <Note>
**Python Version Requirements** **Python Version Requirements**
CrewAI requires `Python >=3.10 and <3.14`. Here's how to check your version: CrewAI requires `Python >=3.10 and <3.14`. Here's how to check your version:
```bash
```bash python3 --version
python3 --version ```
```
If you need to update Python, visit [python.org/downloads](https://python.org/downloads)
If you need to update Python, visit [python.org/downloads](https://python.org/downloads)
</Note> </Note>
<Note> <Note>
**OpenAI SDK Requirement** **OpenAI SDK Requirement**
CrewAI 0.175.0 requires `openai >= 1.13.3`. If you manage dependencies yourself, ensure your environment satisfies this constraint to avoid import/runtime issues. CrewAI 0.175.0 requires `openai >= 1.13.3`. If you manage dependencies yourself, ensure your environment satisfies this constraint to avoid import/runtime issues.
</Note> </Note>
CrewAI uses the `uv` as its dependency management and package handling tool. It simplifies project setup and execution, offering a seamless experience. CrewAI uses the `uv` as its dependency management and package handling tool. It simplifies project setup and execution, offering a seamless experience.
@@ -100,7 +95,6 @@ If you haven't installed `uv` yet, follow **step 1** to quickly get it set up on
``` ```
<Check>Installation successful! You're ready to create your first crew! 🎉</Check> <Check>Installation successful! You're ready to create your first crew! 🎉</Check>
</Step> </Step>
</Steps> </Steps>
# Creating a CrewAI Project # Creating a CrewAI Project
@@ -134,7 +128,6 @@ We recommend using the `YAML` template scaffolding for a structured approach to
├── agents.yaml ├── agents.yaml
└── tasks.yaml └── tasks.yaml
``` ```
</Step> </Step>
<Step title="Customize Your Project"> <Step title="Customize Your Project">
@@ -151,7 +144,6 @@ We recommend using the `YAML` template scaffolding for a structured approach to
- Start by editing `agents.yaml` and `tasks.yaml` to define your crew's behavior. - Start by editing `agents.yaml` and `tasks.yaml` to define your crew's behavior.
- Keep sensitive information like API keys in `.env`. - Keep sensitive information like API keys in `.env`.
</Step> </Step>
<Step title="Run your Crew"> <Step title="Run your Crew">
@@ -176,14 +168,12 @@ We recommend using the `YAML` template scaffolding for a structured approach to
For teams and organizations, CrewAI offers enterprise deployment options that eliminate setup complexity: For teams and organizations, CrewAI offers enterprise deployment options that eliminate setup complexity:
### CrewAI AMP (SaaS) ### CrewAI AMP (SaaS)
- Zero installation required - just sign up for free at [app.crewai.com](https://app.crewai.com) - Zero installation required - just sign up for free at [app.crewai.com](https://app.crewai.com)
- Automatic updates and maintenance - Automatic updates and maintenance
- Managed infrastructure and scaling - Managed infrastructure and scaling
- Build Crews with no Code - Build Crews with no Code
### CrewAI Factory (Self-hosted) ### CrewAI Factory (Self-hosted)
- Containerized deployment for your infrastructure - Containerized deployment for your infrastructure
- Supports any hyperscaler including on prem deployments - Supports any hyperscaler including on prem deployments
- Integration with your existing security systems - Integration with your existing security systems
@@ -196,9 +186,12 @@ For teams and organizations, CrewAI offers enterprise deployment options that el
## Next Steps ## Next Steps
<CardGroup cols={2}> <CardGroup cols={2}>
<Card title="Build Your First Agent" icon="code" href="/en/quickstart"> <Card
Follow our quickstart guide to create your first CrewAI agent and get title="Build Your First Agent"
hands-on experience. icon="code"
href="/en/quickstart"
>
Follow our quickstart guide to create your first CrewAI agent and get hands-on experience.
</Card> </Card>
<Card <Card
title="Join the Community" title="Join the Community"

View File

@@ -7,89 +7,110 @@ mode: "wide"
# What is CrewAI? # What is CrewAI?
**CrewAI is the leading open-source framework for orchestrating autonomous AI agents and building complex workflows.** **CrewAI is a lean, lightning-fast Python framework built entirely from scratch—completely independent of LangChain or other agent frameworks.**
It empowers developers to build production-ready multi-agent systems by combining the collaborative intelligence of **Crews** with the precise control of **Flows**. CrewAI empowers developers with both high-level simplicity and precise low-level control, ideal for creating autonomous AI agents tailored to any scenario:
- **[CrewAI Flows](/en/guides/flows/first-flow)**: The backbone of your AI application. Flows allow you to create structured, event-driven workflows that manage state and control execution. They provide the scaffolding for your AI agents to work within. - **[CrewAI Crews](/en/guides/crews/first-crew)**: Optimize for autonomy and collaborative intelligence, enabling you to create AI teams where each agent has specific roles, tools, and goals.
- **[CrewAI Crews](/en/guides/crews/first-crew)**: The units of work within your Flow. Crews are teams of autonomous agents that collaborate to solve specific tasks delegated to them by the Flow. - **[CrewAI Flows](/en/guides/flows/first-flow)**: Enable granular, event-driven control, single LLM calls for precise task orchestration and supports Crews natively.
With over 100,000 developers certified through our community courses, CrewAI is the standard for enterprise-ready AI automation. With over 100,000 developers certified through our community courses, CrewAI is rapidly becoming the standard for enterprise-ready AI automation.
## The CrewAI Architecture
CrewAI's architecture is designed to balance autonomy with control. ## How Crews Work
### 1. Flows: The Backbone
<Note> <Note>
Think of a Flow as the "manager" or the "process definition" of your application. It defines the steps, the logic, and how data moves through your system. Just like a company has departments (Sales, Engineering, Marketing) working together under leadership to achieve business goals, CrewAI helps you create an organization of AI agents with specialized roles collaborating to accomplish complex tasks.
</Note>
<Frame caption="CrewAI Framework Overview">
<img src="/images/flows.png" alt="CrewAI Framework Overview" />
</Frame>
Flows provide:
- **State Management**: Persist data across steps and executions.
- **Event-Driven Execution**: Trigger actions based on events or external inputs.
- **Control Flow**: Use conditional logic, loops, and branching.
### 2. Crews: The Intelligence
<Note>
Crews are the "teams" that do the heavy lifting. Within a Flow, you can trigger a Crew to tackle a complex problem requiring creativity and collaboration.
</Note> </Note>
<Frame caption="CrewAI Framework Overview"> <Frame caption="CrewAI Framework Overview">
<img src="/images/crews.png" alt="CrewAI Framework Overview" /> <img src="/images/crews.png" alt="CrewAI Framework Overview" />
</Frame> </Frame>
Crews provide: | Component | Description | Key Features |
- **Role-Playing Agents**: Specialized agents with specific goals and tools. |:----------|:-----------:|:------------|
- **Autonomous Collaboration**: Agents work together to solve tasks. | **Crew** | The top-level organization | • Manages AI agent teams<br/>• Oversees workflows<br/>• Ensures collaboration<br/>• Delivers outcomes |
- **Task Delegation**: Tasks are assigned and executed based on agent capabilities. | **AI Agents** | Specialized team members | • Have specific roles (researcher, writer)<br/>• Use designated tools<br/>• Can delegate tasks<br/>• Make autonomous decisions |
| **Process** | Workflow management system | • Defines collaboration patterns<br/>• Controls task assignments<br/>• Manages interactions<br/>• Ensures efficient execution |
| **Tasks** | Individual assignments | • Have clear objectives<br/>• Use specific tools<br/>• Feed into larger process<br/>• Produce actionable results |
## How It All Works Together ### How It All Works Together
1. **The Flow** triggers an event or starts a process. 1. The **Crew** organizes the overall operation
2. **The Flow** manages the state and decides what to do next. 2. **AI Agents** work on their specialized tasks
3. **The Flow** delegates a complex task to a **Crew**. 3. The **Process** ensures smooth collaboration
4. **The Crew**'s agents collaborate to complete the task. 4. **Tasks** get completed to achieve the goal
5. **The Crew** returns the result to the **Flow**.
6. **The Flow** continues execution based on the result.
## Key Features ## Key Features
<CardGroup cols={2}> <CardGroup cols={2}>
<Card title="Production-Grade Flows" icon="arrow-progress"> <Card title="Role-Based Agents" icon="users">
Build reliable, stateful workflows that can handle long-running processes and complex logic. Create specialized agents with defined roles, expertise, and goals - from researchers to analysts to writers
</Card>
<Card title="Autonomous Crews" icon="users">
Deploy teams of agents that can plan, execute, and collaborate to achieve high-level goals.
</Card> </Card>
<Card title="Flexible Tools" icon="screwdriver-wrench"> <Card title="Flexible Tools" icon="screwdriver-wrench">
Connect your agents to any API, database, or local tool. Equip agents with custom tools and APIs to interact with external services and data sources
</Card> </Card>
<Card title="Enterprise Security" icon="lock"> <Card title="Intelligent Collaboration" icon="people-arrows">
Designed with security and compliance in mind for enterprise deployments. Agents work together, sharing insights and coordinating tasks to achieve complex objectives
</Card>
<Card title="Task Management" icon="list-check">
Define sequential or parallel workflows, with agents automatically handling task dependencies
</Card>
</CardGroup>
## How Flows Work
<Note>
While Crews excel at autonomous collaboration, Flows provide structured automations, offering granular control over workflow execution. Flows ensure tasks are executed reliably, securely, and efficiently, handling conditional logic, loops, and dynamic state management with precision. Flows integrate seamlessly with Crews, enabling you to balance high autonomy with exacting control.
</Note>
<Frame caption="CrewAI Framework Overview">
<img src="/images/flows.png" alt="CrewAI Framework Overview" />
</Frame>
| Component | Description | Key Features |
|:----------|:-----------:|:------------|
| **Flow** | Structured workflow orchestration | • Manages execution paths<br/>• Handles state transitions<br/>• Controls task sequencing<br/>• Ensures reliable execution |
| **Events** | Triggers for workflow actions | • Initiate specific processes<br/>• Enable dynamic responses<br/>• Support conditional branching<br/>• Allow for real-time adaptation |
| **States** | Workflow execution contexts | • Maintain execution data<br/>• Enable persistence<br/>• Support resumability<br/>• Ensure execution integrity |
| **Crew Support** | Enhances workflow automation | • Injects pockets of agency when needed<br/>• Complements structured workflows<br/>• Balances automation with intelligence<br/>• Enables adaptive decision-making |
### Key Capabilities
<CardGroup cols={2}>
<Card title="Event-Driven Orchestration" icon="bolt">
Define precise execution paths responding dynamically to events
</Card>
<Card title="Fine-Grained Control" icon="sliders">
Manage workflow states and conditional execution securely and efficiently
</Card>
<Card title="Native Crew Integration" icon="puzzle-piece">
Effortlessly combine with Crews for enhanced autonomy and intelligence
</Card>
<Card title="Deterministic Execution" icon="route">
Ensure predictable outcomes with explicit control flow and error handling
</Card> </Card>
</CardGroup> </CardGroup>
## When to Use Crews vs. Flows ## When to Use Crews vs. Flows
**The short answer: Use both.** <Note>
Understanding when to use [Crews](/en/guides/crews/first-crew) versus [Flows](/en/guides/flows/first-flow) is key to maximizing the potential of CrewAI in your applications.
</Note>
For any production-ready application, **start with a Flow**. | Use Case | Recommended Approach | Why? |
|:---------|:---------------------|:-----|
| **Open-ended research** | [Crews](/en/guides/crews/first-crew) | When tasks require creative thinking, exploration, and adaptation |
| **Content generation** | [Crews](/en/guides/crews/first-crew) | For collaborative creation of articles, reports, or marketing materials |
| **Decision workflows** | [Flows](/en/guides/flows/first-flow) | When you need predictable, auditable decision paths with precise control |
| **API orchestration** | [Flows](/en/guides/flows/first-flow) | For reliable integration with multiple external services in a specific sequence |
| **Hybrid applications** | Combined approach | Use [Flows](/en/guides/flows/first-flow) to orchestrate overall process with [Crews](/en/guides/crews/first-crew) handling complex subtasks |
- **Use a Flow** to define the overall structure, state, and logic of your application. ### Decision Framework
- **Use a Crew** within a Flow step when you need a team of agents to perform a specific, complex task that requires autonomy.
| Use Case | Architecture | - **Choose [Crews](/en/guides/crews/first-crew) when:** You need autonomous problem-solving, creative collaboration, or exploratory tasks
| :--- | :--- | - **Choose [Flows](/en/guides/flows/first-flow) when:** You require deterministic outcomes, auditability, or precise control over execution
| **Simple Automation** | Single Flow with Python tasks | - **Combine both when:** Your application needs both structured processes and pockets of autonomous intelligence
| **Complex Research** | Flow managing state -> Crew performing research |
| **Application Backend** | Flow handling API requests -> Crew generating content -> Flow saving to DB |
## Why Choose CrewAI? ## Why Choose CrewAI?
@@ -103,13 +124,6 @@ For any production-ready application, **start with a Flow**.
## Ready to Start Building? ## Ready to Start Building?
<CardGroup cols={2}> <CardGroup cols={2}>
<Card
title="Build Your First Flow"
icon="diagram-project"
href="/en/guides/flows/first-flow"
>
Learn how to create structured, event-driven workflows with precise control over execution.
</Card>
<Card <Card
title="Build Your First Crew" title="Build Your First Crew"
icon="users-gear" icon="users-gear"
@@ -117,6 +131,13 @@ For any production-ready application, **start with a Flow**.
> >
Step-by-step tutorial to create a collaborative AI team that works together to solve complex problems. Step-by-step tutorial to create a collaborative AI team that works together to solve complex problems.
</Card> </Card>
<Card
title="Build Your First Flow"
icon="diagram-project"
href="/en/guides/flows/first-flow"
>
Learn how to create structured, event-driven workflows with precise control over execution.
</Card>
</CardGroup> </CardGroup>
<CardGroup cols={3}> <CardGroup cols={3}>

View File

@@ -1,367 +0,0 @@
---
title: Agent-to-Agent (A2A) Protocol
description: Enable CrewAI agents to delegate tasks to remote A2A-compliant agents for specialized handling
icon: network-wired
mode: "wide"
---
## A2A Agent Delegation
CrewAI supports the Agent-to-Agent (A2A) protocol, allowing agents to delegate tasks to remote specialized agents. The agent's LLM automatically decides whether to handle a task directly or delegate to an A2A agent based on the task requirements.
<Note>
A2A delegation requires the `a2a-sdk` package. Install with: `uv add 'crewai[a2a]'` or `pip install 'crewai[a2a]'`
</Note>
## How It Works
When an agent is configured with A2A capabilities:
1. The LLM analyzes each task
2. It decides to either:
- Handle the task directly using its own capabilities
- Delegate to a remote A2A agent for specialized handling
3. If delegating, the agent communicates with the remote A2A agent through the protocol
4. Results are returned to the CrewAI workflow
## Basic Configuration
Configure an agent for A2A delegation by setting the `a2a` parameter:
```python Code
from crewai import Agent, Crew, Task
from crewai.a2a import A2AConfig
agent = Agent(
role="Research Coordinator",
goal="Coordinate research tasks efficiently",
backstory="Expert at delegating to specialized research agents",
llm="gpt-4o",
a2a=A2AConfig(
endpoint="https://example.com/.well-known/agent-card.json",
timeout=120,
max_turns=10
)
)
task = Task(
description="Research the latest developments in quantum computing",
expected_output="A comprehensive research report",
agent=agent
)
crew = Crew(agents=[agent], tasks=[task], verbose=True)
result = crew.kickoff()
```
## Configuration Options
The `A2AConfig` class accepts the following parameters:
<ParamField path="endpoint" type="str" required>
The A2A agent endpoint URL (typically points to `.well-known/agent-card.json`)
</ParamField>
<ParamField path="auth" type="AuthScheme" default="None">
Authentication scheme for the A2A agent. Supports Bearer tokens, OAuth2, API keys, and HTTP authentication.
</ParamField>
<ParamField path="timeout" type="int" default="120">
Request timeout in seconds
</ParamField>
<ParamField path="max_turns" type="int" default="10">
Maximum number of conversation turns with the A2A agent
</ParamField>
<ParamField path="response_model" type="type[BaseModel]" default="None">
Optional Pydantic model for requesting structured output from an A2A agent. A2A protocol does not
enforce this, so an A2A agent does not need to honor this request.
</ParamField>
<ParamField path="fail_fast" type="bool" default="True">
Whether to raise an error immediately if agent connection fails. When `False`, the agent continues with available agents and informs the LLM about unavailable ones.
</ParamField>
<ParamField path="trust_remote_completion_status" type="bool" default="False">
When `True`, returns the A2A agent's result directly when it signals completion. When `False`, allows the server agent to review the result and potentially continue the conversation.
</ParamField>
<ParamField path="updates" type="UpdateConfig" default="StreamingConfig()">
Update mechanism for receiving task status. Options: `StreamingConfig`, `PollingConfig`, or `PushNotificationConfig`.
</ParamField>
## Authentication
For A2A agents that require authentication, use one of the provided auth schemes:
<Tabs>
<Tab title="Bearer Token">
```python Code
from crewai.a2a import A2AConfig
from crewai.a2a.auth import BearerTokenAuth
agent = Agent(
role="Secure Coordinator",
goal="Coordinate tasks with secured agents",
backstory="Manages secure agent communications",
llm="gpt-4o",
a2a=A2AConfig(
endpoint="https://secure-agent.example.com/.well-known/agent-card.json",
auth=BearerTokenAuth(token="your-bearer-token"),
timeout=120
)
)
```
</Tab>
<Tab title="API Key">
```python Code
from crewai.a2a import A2AConfig
from crewai.a2a.auth import APIKeyAuth
agent = Agent(
role="API Coordinator",
goal="Coordinate with API-based agents",
backstory="Manages API-authenticated communications",
llm="gpt-4o",
a2a=A2AConfig(
endpoint="https://api-agent.example.com/.well-known/agent-card.json",
auth=APIKeyAuth(
api_key="your-api-key",
location="header", # or "query" or "cookie"
name="X-API-Key"
),
timeout=120
)
)
```
</Tab>
<Tab title="OAuth2">
```python Code
from crewai.a2a import A2AConfig
from crewai.a2a.auth import OAuth2ClientCredentials
agent = Agent(
role="OAuth Coordinator",
goal="Coordinate with OAuth-secured agents",
backstory="Manages OAuth-authenticated communications",
llm="gpt-4o",
a2a=A2AConfig(
endpoint="https://oauth-agent.example.com/.well-known/agent-card.json",
auth=OAuth2ClientCredentials(
token_url="https://auth.example.com/oauth/token",
client_id="your-client-id",
client_secret="your-client-secret",
scopes=["read", "write"]
),
timeout=120
)
)
```
</Tab>
<Tab title="HTTP Basic">
```python Code
from crewai.a2a import A2AConfig
from crewai.a2a.auth import HTTPBasicAuth
agent = Agent(
role="Basic Auth Coordinator",
goal="Coordinate with basic auth agents",
backstory="Manages basic authentication communications",
llm="gpt-4o",
a2a=A2AConfig(
endpoint="https://basic-agent.example.com/.well-known/agent-card.json",
auth=HTTPBasicAuth(
username="your-username",
password="your-password"
),
timeout=120
)
)
```
</Tab>
</Tabs>
## Multiple A2A Agents
Configure multiple A2A agents for delegation by passing a list:
```python Code
from crewai.a2a import A2AConfig
from crewai.a2a.auth import BearerTokenAuth
agent = Agent(
role="Multi-Agent Coordinator",
goal="Coordinate with multiple specialized agents",
backstory="Expert at delegating to the right specialist",
llm="gpt-4o",
a2a=[
A2AConfig(
endpoint="https://research.example.com/.well-known/agent-card.json",
timeout=120
),
A2AConfig(
endpoint="https://data.example.com/.well-known/agent-card.json",
auth=BearerTokenAuth(token="data-token"),
timeout=90
)
]
)
```
The LLM will automatically choose which A2A agent to delegate to based on the task requirements.
## Error Handling
Control how agent connection failures are handled using the `fail_fast` parameter:
```python Code
from crewai.a2a import A2AConfig
# Fail immediately on connection errors (default)
agent = Agent(
role="Research Coordinator",
goal="Coordinate research tasks",
backstory="Expert at delegation",
llm="gpt-4o",
a2a=A2AConfig(
endpoint="https://research.example.com/.well-known/agent-card.json",
fail_fast=True
)
)
# Continue with available agents
agent = Agent(
role="Multi-Agent Coordinator",
goal="Coordinate with multiple agents",
backstory="Expert at working with available resources",
llm="gpt-4o",
a2a=[
A2AConfig(
endpoint="https://primary.example.com/.well-known/agent-card.json",
fail_fast=False
),
A2AConfig(
endpoint="https://backup.example.com/.well-known/agent-card.json",
fail_fast=False
)
]
)
```
When `fail_fast=False`:
- If some agents fail, the LLM is informed which agents are unavailable and can delegate to working agents
- If all agents fail, the LLM receives a notice about unavailable agents and handles the task directly
- Connection errors are captured and included in the context for better decision-making
## Update Mechanisms
Control how your agent receives task status updates from remote A2A agents:
<Tabs>
<Tab title="Streaming (Default)">
```python Code
from crewai.a2a import A2AConfig
from crewai.a2a.updates import StreamingConfig
agent = Agent(
role="Research Coordinator",
goal="Coordinate research tasks",
backstory="Expert at delegation",
llm="gpt-4o",
a2a=A2AConfig(
endpoint="https://research.example.com/.well-known/agent-card.json",
updates=StreamingConfig()
)
)
```
</Tab>
<Tab title="Polling">
```python Code
from crewai.a2a import A2AConfig
from crewai.a2a.updates import PollingConfig
agent = Agent(
role="Research Coordinator",
goal="Coordinate research tasks",
backstory="Expert at delegation",
llm="gpt-4o",
a2a=A2AConfig(
endpoint="https://research.example.com/.well-known/agent-card.json",
updates=PollingConfig(
interval=2.0,
timeout=300.0,
max_polls=100
)
)
)
```
</Tab>
<Tab title="Push Notifications">
```python Code
from crewai.a2a import A2AConfig
from crewai.a2a.updates import PushNotificationConfig
agent = Agent(
role="Research Coordinator",
goal="Coordinate research tasks",
backstory="Expert at delegation",
llm="gpt-4o",
a2a=A2AConfig(
endpoint="https://research.example.com/.well-known/agent-card.json",
updates=PushNotificationConfig(
url={base_url}/a2a/callback",
token="your-validation-token",
timeout=300.0
)
)
)
```
</Tab>
</Tabs>
## Best Practices
<CardGroup cols={2}>
<Card title="Set Appropriate Timeouts" icon="clock">
Configure timeouts based on expected A2A agent response times. Longer-running tasks may need higher timeout values.
</Card>
<Card title="Limit Conversation Turns" icon="comments">
Use `max_turns` to prevent excessive back-and-forth. The agent will automatically conclude conversations before hitting the limit.
</Card>
<Card title="Use Resilient Error Handling" icon="shield-check">
Set `fail_fast=False` for production environments with multiple agents to gracefully handle connection failures and maintain workflow continuity.
</Card>
<Card title="Secure Your Credentials" icon="lock">
Store authentication tokens and credentials as environment variables, not in code.
</Card>
<Card title="Monitor Delegation Decisions" icon="eye">
Use verbose mode to observe when the LLM chooses to delegate versus handle tasks directly.
</Card>
</CardGroup>
## Supported Authentication Methods
- **Bearer Token** - Simple token-based authentication
- **OAuth2 Client Credentials** - OAuth2 flow for machine-to-machine communication
- **OAuth2 Authorization Code** - OAuth2 flow requiring user authorization
- **API Key** - Key-based authentication (header, query param, or cookie)
- **HTTP Basic** - Username/password authentication
- **HTTP Digest** - Digest authentication (requires `httpx-auth` package)
## Learn More
For more information about the A2A protocol and reference implementations:
- [A2A Protocol Documentation](https://a2a-protocol.org)
- [A2A Sample Implementations](https://github.com/a2aproject/a2a-samples)
- [A2A Python SDK](https://github.com/a2aproject/a2a-python)

View File

@@ -66,55 +66,5 @@ def my_cache_strategy(arguments: dict, result: str) -> bool:
cached_tool.cache_function = my_cache_strategy cached_tool.cache_function = my_cache_strategy
``` ```
### Creating Async Tools
CrewAI supports async tools for non-blocking I/O operations. This is useful when your tool needs to make HTTP requests, database queries, or other I/O-bound operations.
#### Using the `@tool` Decorator with Async Functions
The simplest way to create an async tool is using the `@tool` decorator with an async function:
```python Code
import aiohttp
from crewai.tools import tool
@tool("Async Web Fetcher")
async def fetch_webpage(url: str) -> str:
"""Fetch content from a webpage asynchronously."""
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
```
#### Subclassing `BaseTool` with Async Support
For more control, subclass `BaseTool` and implement both `_run` (sync) and `_arun` (async) methods:
```python Code
import requests
import aiohttp
from crewai.tools import BaseTool
from pydantic import BaseModel, Field
class WebFetcherInput(BaseModel):
"""Input schema for WebFetcher."""
url: str = Field(..., description="The URL to fetch")
class WebFetcherTool(BaseTool):
name: str = "Web Fetcher"
description: str = "Fetches content from a URL"
args_schema: type[BaseModel] = WebFetcherInput
def _run(self, url: str) -> str:
"""Synchronous implementation."""
return requests.get(url).text
async def _arun(self, url: str) -> str:
"""Asynchronous implementation for non-blocking I/O."""
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
```
By adhering to these guidelines and incorporating new functionalities and collaboration tools into your tool creation and management processes, By adhering to these guidelines and incorporating new functionalities and collaboration tools into your tool creation and management processes,
you can leverage the full capabilities of the CrewAI framework, enhancing both the development experience and the efficiency of your AI agents. you can leverage the full capabilities of the CrewAI framework, enhancing both the development experience and the efficiency of your AI agents.

View File

@@ -1,522 +0,0 @@
---
title: Execution Hooks Overview
description: Understanding and using execution hooks in CrewAI for fine-grained control over agent operations
mode: "wide"
---
Execution Hooks provide fine-grained control over the runtime behavior of your CrewAI agents. Unlike kickoff hooks that run before and after crew execution, execution hooks intercept specific operations during agent execution, allowing you to modify behavior, implement safety checks, and add comprehensive monitoring.
## Types of Execution Hooks
CrewAI provides two main categories of execution hooks:
### 1. [LLM Call Hooks](/learn/llm-hooks)
Control and monitor language model interactions:
- **Before LLM Call**: Modify prompts, validate inputs, implement approval gates
- **After LLM Call**: Transform responses, sanitize outputs, update conversation history
**Use Cases:**
- Iteration limiting
- Cost tracking and token usage monitoring
- Response sanitization and content filtering
- Human-in-the-loop approval for LLM calls
- Adding safety guidelines or context
- Debug logging and request/response inspection
[View LLM Hooks Documentation →](/learn/llm-hooks)
### 2. [Tool Call Hooks](/learn/tool-hooks)
Control and monitor tool execution:
- **Before Tool Call**: Modify inputs, validate parameters, block dangerous operations
- **After Tool Call**: Transform results, sanitize outputs, log execution details
**Use Cases:**
- Safety guardrails for destructive operations
- Human approval for sensitive actions
- Input validation and sanitization
- Result caching and rate limiting
- Tool usage analytics
- Debug logging and monitoring
[View Tool Hooks Documentation →](/learn/tool-hooks)
## Hook Registration Methods
### 1. Decorator-Based Hooks (Recommended)
The cleanest and most Pythonic way to register hooks:
```python
from crewai.hooks import before_llm_call, after_llm_call, before_tool_call, after_tool_call
@before_llm_call
def limit_iterations(context):
"""Prevent infinite loops by limiting iterations."""
if context.iterations > 10:
return False # Block execution
return None
@after_llm_call
def sanitize_response(context):
"""Remove sensitive data from LLM responses."""
if "API_KEY" in context.response:
return context.response.replace("API_KEY", "[REDACTED]")
return None
@before_tool_call
def block_dangerous_tools(context):
"""Block destructive operations."""
if context.tool_name == "delete_database":
return False # Block execution
return None
@after_tool_call
def log_tool_result(context):
"""Log tool execution."""
print(f"Tool {context.tool_name} completed")
return None
```
### 2. Crew-Scoped Hooks
Apply hooks only to specific crew instances:
```python
from crewai import CrewBase
from crewai.project import crew
from crewai.hooks import before_llm_call_crew, after_tool_call_crew
@CrewBase
class MyProjCrew:
@before_llm_call_crew
def validate_inputs(self, context):
# Only applies to this crew
print(f"LLM call in {self.__class__.__name__}")
return None
@after_tool_call_crew
def log_results(self, context):
# Crew-specific logging
print(f"Tool result: {context.tool_result[:50]}...")
return None
@crew
def crew(self) -> Crew:
return Crew(
agents=self.agents,
tasks=self.tasks,
process=Process.sequential
)
```
## Hook Execution Flow
### LLM Call Flow
```
Agent needs to call LLM
[Before LLM Call Hooks Execute]
├→ Hook 1: Validate iteration count
├→ Hook 2: Add safety context
└→ Hook 3: Log request
If any hook returns False:
├→ Block LLM call
└→ Raise ValueError
If all hooks return True/None:
├→ LLM call proceeds
└→ Response generated
[After LLM Call Hooks Execute]
├→ Hook 1: Sanitize response
├→ Hook 2: Log response
└→ Hook 3: Update metrics
Final response returned
```
### Tool Call Flow
```
Agent needs to execute tool
[Before Tool Call Hooks Execute]
├→ Hook 1: Check if tool is allowed
├→ Hook 2: Validate inputs
└→ Hook 3: Request approval if needed
If any hook returns False:
├→ Block tool execution
└→ Return error message
If all hooks return True/None:
├→ Tool execution proceeds
└→ Result generated
[After Tool Call Hooks Execute]
├→ Hook 1: Sanitize result
├→ Hook 2: Cache result
└→ Hook 3: Log metrics
Final result returned
```
## Hook Context Objects
### LLMCallHookContext
Provides access to LLM execution state:
```python
class LLMCallHookContext:
executor: CrewAgentExecutor # Full executor access
messages: list # Mutable message list
agent: Agent # Current agent
task: Task # Current task
crew: Crew # Crew instance
llm: BaseLLM # LLM instance
iterations: int # Current iteration
response: str | None # LLM response (after hooks)
```
### ToolCallHookContext
Provides access to tool execution state:
```python
class ToolCallHookContext:
tool_name: str # Tool being called
tool_input: dict # Mutable input parameters
tool: CrewStructuredTool # Tool instance
agent: Agent | None # Agent executing
task: Task | None # Current task
crew: Crew | None # Crew instance
tool_result: str | None # Tool result (after hooks)
```
## Common Patterns
### Safety and Validation
```python
@before_tool_call
def safety_check(context):
"""Block destructive operations."""
dangerous = ['delete_file', 'drop_table', 'system_shutdown']
if context.tool_name in dangerous:
print(f"🛑 Blocked: {context.tool_name}")
return False
return None
@before_llm_call
def iteration_limit(context):
"""Prevent infinite loops."""
if context.iterations > 15:
print("⛔ Maximum iterations exceeded")
return False
return None
```
### Human-in-the-Loop
```python
@before_tool_call
def require_approval(context):
"""Require approval for sensitive operations."""
sensitive = ['send_email', 'make_payment', 'post_message']
if context.tool_name in sensitive:
response = context.request_human_input(
prompt=f"Approve {context.tool_name}?",
default_message="Type 'yes' to approve:"
)
if response.lower() != 'yes':
return False
return None
```
### Monitoring and Analytics
```python
from collections import defaultdict
import time
metrics = defaultdict(lambda: {'count': 0, 'total_time': 0})
@before_tool_call
def start_timer(context):
context.tool_input['_start'] = time.time()
return None
@after_tool_call
def track_metrics(context):
start = context.tool_input.get('_start', time.time())
duration = time.time() - start
metrics[context.tool_name]['count'] += 1
metrics[context.tool_name]['total_time'] += duration
return None
# View metrics
def print_metrics():
for tool, data in metrics.items():
avg = data['total_time'] / data['count']
print(f"{tool}: {data['count']} calls, {avg:.2f}s avg")
```
### Response Sanitization
```python
import re
@after_llm_call
def sanitize_llm_response(context):
"""Remove sensitive data from LLM responses."""
if not context.response:
return None
result = context.response
result = re.sub(r'(api[_-]?key)["\']?\s*[:=]\s*["\']?[\w-]+',
r'\1: [REDACTED]', result, flags=re.IGNORECASE)
return result
@after_tool_call
def sanitize_tool_result(context):
"""Remove sensitive data from tool results."""
if not context.tool_result:
return None
result = context.tool_result
result = re.sub(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b',
'[EMAIL-REDACTED]', result)
return result
```
## Hook Management
### Clearing All Hooks
```python
from crewai.hooks import clear_all_global_hooks
# Clear all hooks at once
result = clear_all_global_hooks()
print(f"Cleared {result['total']} hooks")
# Output: {'llm_hooks': (2, 1), 'tool_hooks': (1, 2), 'total': (3, 3)}
```
### Clearing Specific Hook Types
```python
from crewai.hooks import (
clear_before_llm_call_hooks,
clear_after_llm_call_hooks,
clear_before_tool_call_hooks,
clear_after_tool_call_hooks
)
# Clear specific types
llm_before_count = clear_before_llm_call_hooks()
tool_after_count = clear_after_tool_call_hooks()
```
### Unregistering Individual Hooks
```python
from crewai.hooks import (
unregister_before_llm_call_hook,
unregister_after_tool_call_hook
)
def my_hook(context):
...
# Register
register_before_llm_call_hook(my_hook)
# Later, unregister
success = unregister_before_llm_call_hook(my_hook)
print(f"Unregistered: {success}")
```
## Best Practices
### 1. Keep Hooks Focused
Each hook should have a single, clear responsibility:
```python
# ✅ Good - focused responsibility
@before_tool_call
def validate_file_path(context):
if context.tool_name == 'read_file':
if '..' in context.tool_input.get('path', ''):
return False
return None
# ❌ Bad - too many responsibilities
@before_tool_call
def do_everything(context):
# Validation + logging + metrics + approval...
...
```
### 2. Handle Errors Gracefully
```python
@before_llm_call
def safe_hook(context):
try:
# Your logic
if some_condition:
return False
except Exception as e:
print(f"Hook error: {e}")
return None # Allow execution despite error
```
### 3. Modify Context In-Place
```python
# ✅ Correct - modify in-place
@before_llm_call
def add_context(context):
context.messages.append({"role": "system", "content": "Be concise"})
# ❌ Wrong - replaces reference
@before_llm_call
def wrong_approach(context):
context.messages = [{"role": "system", "content": "Be concise"}]
```
### 4. Use Type Hints
```python
from crewai.hooks import LLMCallHookContext, ToolCallHookContext
def my_llm_hook(context: LLMCallHookContext) -> bool | None:
# IDE autocomplete and type checking
return None
def my_tool_hook(context: ToolCallHookContext) -> str | None:
return None
```
### 5. Clean Up in Tests
```python
import pytest
from crewai.hooks import clear_all_global_hooks
@pytest.fixture(autouse=True)
def clean_hooks():
"""Reset hooks before each test."""
yield
clear_all_global_hooks()
```
## When to Use Which Hook
### Use LLM Hooks When:
- Implementing iteration limits
- Adding context or safety guidelines to prompts
- Tracking token usage and costs
- Sanitizing or transforming responses
- Implementing approval gates for LLM calls
- Debugging prompt/response interactions
### Use Tool Hooks When:
- Blocking dangerous or destructive operations
- Validating tool inputs before execution
- Implementing approval gates for sensitive actions
- Caching tool results
- Tracking tool usage and performance
- Sanitizing tool outputs
- Rate limiting tool calls
### Use Both When:
Building comprehensive observability, safety, or approval systems that need to monitor all agent operations.
## Alternative Registration Methods
### Programmatic Registration (Advanced)
For dynamic hook registration or when you need to register hooks programmatically:
```python
from crewai.hooks import (
register_before_llm_call_hook,
register_after_tool_call_hook
)
def my_hook(context):
return None
# Register programmatically
register_before_llm_call_hook(my_hook)
# Useful for:
# - Loading hooks from configuration
# - Conditional hook registration
# - Plugin systems
```
**Note:** For most use cases, decorators are cleaner and more maintainable.
## Performance Considerations
1. **Keep Hooks Fast**: Hooks execute on every call - avoid heavy computation
2. **Cache When Possible**: Store expensive validations or lookups
3. **Be Selective**: Use crew-scoped hooks when global hooks aren't needed
4. **Monitor Hook Overhead**: Profile hook execution time in production
5. **Lazy Import**: Import heavy dependencies only when needed
## Debugging Hooks
### Enable Debug Logging
```python
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
@before_llm_call
def debug_hook(context):
logger.debug(f"LLM call: {context.agent.role}, iteration {context.iterations}")
return None
```
### Hook Execution Order
Hooks execute in registration order. If a before hook returns `False`, subsequent hooks don't execute:
```python
# Register order matters!
register_before_tool_call_hook(hook1) # Executes first
register_before_tool_call_hook(hook2) # Executes second
register_before_tool_call_hook(hook3) # Executes third
# If hook2 returns False:
# - hook1 executed
# - hook2 executed and returned False
# - hook3 NOT executed
# - Tool call blocked
```
## Related Documentation
- [LLM Call Hooks →](/learn/llm-hooks) - Detailed LLM hook documentation
- [Tool Call Hooks →](/learn/tool-hooks) - Detailed tool hook documentation
- [Before and After Kickoff Hooks →](/learn/before-and-after-kickoff-hooks) - Crew lifecycle hooks
- [Human-in-the-Loop →](/learn/human-in-the-loop) - Human input patterns
## Conclusion
Execution hooks provide powerful control over agent runtime behavior. Use them to implement safety guardrails, approval workflows, comprehensive monitoring, and custom business logic. Combined with proper error handling, type safety, and performance considerations, hooks enable production-ready, secure, and observable agent systems.

View File

@@ -97,7 +97,7 @@ project_crew = Crew(
``` ```
<Tip> <Tip>
For more details on creating and customizing a manager agent, check out the [Custom Manager Agent documentation](/en/learn/custom-manager-agent). For more details on creating and customizing a manager agent, check out the [Custom Manager Agent documentation](https://docs.crewai.com/how-to/custom-manager-agent#custom-manager-agent).
</Tip> </Tip>

View File

@@ -1,581 +0,0 @@
---
title: Human Feedback in Flows
description: Learn how to integrate human feedback directly into your CrewAI Flows using the @human_feedback decorator
icon: user-check
mode: "wide"
---
## Overview
The `@human_feedback` decorator enables human-in-the-loop (HITL) workflows directly within CrewAI Flows. It allows you to pause flow execution, present output to a human for review, collect their feedback, and optionally route to different listeners based on the feedback outcome.
This is particularly valuable for:
- **Quality assurance**: Review AI-generated content before it's used downstream
- **Decision gates**: Let humans make critical decisions in automated workflows
- **Approval workflows**: Implement approve/reject/revise patterns
- **Interactive refinement**: Collect feedback to improve outputs iteratively
```mermaid
flowchart LR
A[Flow Method] --> B[Output Generated]
B --> C[Human Reviews]
C --> D{Feedback}
D -->|emit specified| E[LLM Collapses to Outcome]
D -->|no emit| F[HumanFeedbackResult]
E --> G["@listen('approved')"]
E --> H["@listen('rejected')"]
F --> I[Next Listener]
```
## Quick Start
Here's the simplest way to add human feedback to a flow:
```python Code
from crewai.flow.flow import Flow, start, listen
from crewai.flow.human_feedback import human_feedback
class SimpleReviewFlow(Flow):
@start()
@human_feedback(message="Please review this content:")
def generate_content(self):
return "This is AI-generated content that needs review."
@listen(generate_content)
def process_feedback(self, result):
print(f"Content: {result.output}")
print(f"Human said: {result.feedback}")
flow = SimpleReviewFlow()
flow.kickoff()
```
When this flow runs, it will:
1. Execute `generate_content` and return the string
2. Display the output to the user with the request message
3. Wait for the user to type feedback (or press Enter to skip)
4. Pass a `HumanFeedbackResult` object to `process_feedback`
## The @human_feedback Decorator
### Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `message` | `str` | Yes | The message shown to the human alongside the method output |
| `emit` | `Sequence[str]` | No | List of possible outcomes. Feedback is collapsed to one of these, which triggers `@listen` decorators |
| `llm` | `str \| BaseLLM` | When `emit` specified | LLM used to interpret feedback and map to an outcome |
| `default_outcome` | `str` | No | Outcome to use if no feedback provided. Must be in `emit` |
| `metadata` | `dict` | No | Additional data for enterprise integrations |
| `provider` | `HumanFeedbackProvider` | No | Custom provider for async/non-blocking feedback. See [Async Human Feedback](#async-human-feedback-non-blocking) |
### Basic Usage (No Routing)
When you don't specify `emit`, the decorator simply collects feedback and passes a `HumanFeedbackResult` to the next listener:
```python Code
@start()
@human_feedback(message="What do you think of this analysis?")
def analyze_data(self):
return "Analysis results: Revenue up 15%, costs down 8%"
@listen(analyze_data)
def handle_feedback(self, result):
# result is a HumanFeedbackResult
print(f"Analysis: {result.output}")
print(f"Feedback: {result.feedback}")
```
### Routing with emit
When you specify `emit`, the decorator becomes a router. The human's free-form feedback is interpreted by an LLM and collapsed into one of the specified outcomes:
```python Code
@start()
@human_feedback(
message="Do you approve this content for publication?",
emit=["approved", "rejected", "needs_revision"],
llm="gpt-4o-mini",
default_outcome="needs_revision",
)
def review_content(self):
return "Draft blog post content here..."
@listen("approved")
def publish(self, result):
print(f"Publishing! User said: {result.feedback}")
@listen("rejected")
def discard(self, result):
print(f"Discarding. Reason: {result.feedback}")
@listen("needs_revision")
def revise(self, result):
print(f"Revising based on: {result.feedback}")
```
<Tip>
The LLM uses structured outputs (function calling) when available to guarantee the response is one of your specified outcomes. This makes routing reliable and predictable.
</Tip>
## HumanFeedbackResult
The `HumanFeedbackResult` dataclass contains all information about a human feedback interaction:
```python Code
from crewai.flow.human_feedback import HumanFeedbackResult
@dataclass
class HumanFeedbackResult:
output: Any # The original method output shown to the human
feedback: str # The raw feedback text from the human
outcome: str | None # The collapsed outcome (if emit was specified)
timestamp: datetime # When the feedback was received
method_name: str # Name of the decorated method
metadata: dict # Any metadata passed to the decorator
```
### Accessing in Listeners
When a listener is triggered by a `@human_feedback` method with `emit`, it receives the `HumanFeedbackResult`:
```python Code
@listen("approved")
def on_approval(self, result: HumanFeedbackResult):
print(f"Original output: {result.output}")
print(f"User feedback: {result.feedback}")
print(f"Outcome: {result.outcome}") # "approved"
print(f"Received at: {result.timestamp}")
```
## Accessing Feedback History
The `Flow` class provides two attributes for accessing human feedback:
### last_human_feedback
Returns the most recent `HumanFeedbackResult`:
```python Code
@listen(some_method)
def check_feedback(self):
if self.last_human_feedback:
print(f"Last feedback: {self.last_human_feedback.feedback}")
```
### human_feedback_history
A list of all `HumanFeedbackResult` objects collected during the flow:
```python Code
@listen(final_step)
def summarize(self):
print(f"Total feedback collected: {len(self.human_feedback_history)}")
for i, fb in enumerate(self.human_feedback_history):
print(f"{i+1}. {fb.method_name}: {fb.outcome or 'no routing'}")
```
<Warning>
Each `HumanFeedbackResult` is appended to `human_feedback_history`, so multiple feedback steps won't overwrite each other. Use this list to access all feedback collected during the flow.
</Warning>
## Complete Example: Content Approval Workflow
Here's a full example implementing a content review and approval workflow:
<CodeGroup>
```python Code
from crewai.flow.flow import Flow, start, listen
from crewai.flow.human_feedback import human_feedback, HumanFeedbackResult
from pydantic import BaseModel
class ContentState(BaseModel):
topic: str = ""
draft: str = ""
final_content: str = ""
revision_count: int = 0
class ContentApprovalFlow(Flow[ContentState]):
"""A flow that generates content and gets human approval."""
@start()
def get_topic(self):
self.state.topic = input("What topic should I write about? ")
return self.state.topic
@listen(get_topic)
def generate_draft(self, topic):
# In real use, this would call an LLM
self.state.draft = f"# {topic}\n\nThis is a draft about {topic}..."
return self.state.draft
@listen(generate_draft)
@human_feedback(
message="Please review this draft. Reply 'approved', 'rejected', or provide revision feedback:",
emit=["approved", "rejected", "needs_revision"],
llm="gpt-4o-mini",
default_outcome="needs_revision",
)
def review_draft(self, draft):
return draft
@listen("approved")
def publish_content(self, result: HumanFeedbackResult):
self.state.final_content = result.output
print("\n✅ Content approved and published!")
print(f"Reviewer comment: {result.feedback}")
return "published"
@listen("rejected")
def handle_rejection(self, result: HumanFeedbackResult):
print("\n❌ Content rejected")
print(f"Reason: {result.feedback}")
return "rejected"
@listen("needs_revision")
def revise_content(self, result: HumanFeedbackResult):
self.state.revision_count += 1
print(f"\n📝 Revision #{self.state.revision_count} requested")
print(f"Feedback: {result.feedback}")
# In a real flow, you might loop back to generate_draft
# For this example, we just acknowledge
return "revision_requested"
# Run the flow
flow = ContentApprovalFlow()
result = flow.kickoff()
print(f"\nFlow completed. Revisions requested: {flow.state.revision_count}")
```
```text Output
What topic should I write about? AI Safety
==================================================
OUTPUT FOR REVIEW:
==================================================
# AI Safety
This is a draft about AI Safety...
==================================================
Please review this draft. Reply 'approved', 'rejected', or provide revision feedback:
(Press Enter to skip, or type your feedback)
Your feedback: Looks good, approved!
✅ Content approved and published!
Reviewer comment: Looks good, approved!
Flow completed. Revisions requested: 0
```
</CodeGroup>
## Combining with Other Decorators
The `@human_feedback` decorator works with other flow decorators. Place it as the innermost decorator (closest to the function):
```python Code
# Correct: @human_feedback is innermost (closest to the function)
@start()
@human_feedback(message="Review this:")
def my_start_method(self):
return "content"
@listen(other_method)
@human_feedback(message="Review this too:")
def my_listener(self, data):
return f"processed: {data}"
```
<Tip>
Place `@human_feedback` as the innermost decorator (last/closest to the function) so it wraps the method directly and can capture the return value before passing to the flow system.
</Tip>
## Best Practices
### 1. Write Clear Request Messages
The `request` parameter is what the human sees. Make it actionable:
```python Code
# ✅ Good - clear and actionable
@human_feedback(message="Does this summary accurately capture the key points? Reply 'yes' or explain what's missing:")
# ❌ Bad - vague
@human_feedback(message="Review this:")
```
### 2. Choose Meaningful Outcomes
When using `emit`, pick outcomes that map naturally to human responses:
```python Code
# ✅ Good - natural language outcomes
emit=["approved", "rejected", "needs_more_detail"]
# ❌ Bad - technical or unclear
emit=["state_1", "state_2", "state_3"]
```
### 3. Always Provide a Default Outcome
Use `default_outcome` to handle cases where users press Enter without typing:
```python Code
@human_feedback(
message="Approve? (press Enter to request revision)",
emit=["approved", "needs_revision"],
llm="gpt-4o-mini",
default_outcome="needs_revision", # Safe default
)
```
### 4. Use Feedback History for Audit Trails
Access `human_feedback_history` to create audit logs:
```python Code
@listen(final_step)
def create_audit_log(self):
log = []
for fb in self.human_feedback_history:
log.append({
"step": fb.method_name,
"outcome": fb.outcome,
"feedback": fb.feedback,
"timestamp": fb.timestamp.isoformat(),
})
return log
```
### 5. Handle Both Routed and Non-Routed Feedback
When designing flows, consider whether you need routing:
| Scenario | Use |
|----------|-----|
| Simple review, just need the feedback text | No `emit` |
| Need to branch to different paths based on response | Use `emit` |
| Approval gates with approve/reject/revise | Use `emit` |
| Collecting comments for logging only | No `emit` |
## Async Human Feedback (Non-Blocking)
By default, `@human_feedback` blocks execution waiting for console input. For production applications, you may need **async/non-blocking** feedback that integrates with external systems like Slack, email, webhooks, or APIs.
### The Provider Abstraction
Use the `provider` parameter to specify a custom feedback collection strategy:
```python Code
from crewai.flow import Flow, start, human_feedback, HumanFeedbackProvider, HumanFeedbackPending, PendingFeedbackContext
class WebhookProvider(HumanFeedbackProvider):
"""Provider that pauses flow and waits for webhook callback."""
def __init__(self, webhook_url: str):
self.webhook_url = webhook_url
def request_feedback(self, context: PendingFeedbackContext, flow: Flow) -> str:
# Notify external system (e.g., send Slack message, create ticket)
self.send_notification(context)
# Pause execution - framework handles persistence automatically
raise HumanFeedbackPending(
context=context,
callback_info={"webhook_url": f"{self.webhook_url}/{context.flow_id}"}
)
class ReviewFlow(Flow):
@start()
@human_feedback(
message="Review this content:",
emit=["approved", "rejected"],
llm="gpt-4o-mini",
provider=WebhookProvider("https://myapp.com/api"),
)
def generate_content(self):
return "AI-generated content..."
@listen("approved")
def publish(self, result):
return "Published!"
```
<Tip>
The flow framework **automatically persists state** when `HumanFeedbackPending` is raised. Your provider only needs to notify the external system and raise the exception—no manual persistence calls required.
</Tip>
### Handling Paused Flows
When using an async provider, `kickoff()` returns a `HumanFeedbackPending` object instead of raising an exception:
```python Code
flow = ReviewFlow()
result = flow.kickoff()
if isinstance(result, HumanFeedbackPending):
# Flow is paused, state is automatically persisted
print(f"Waiting for feedback at: {result.callback_info['webhook_url']}")
print(f"Flow ID: {result.context.flow_id}")
else:
# Normal completion
print(f"Flow completed: {result}")
```
### Resuming a Paused Flow
When feedback arrives (e.g., via webhook), resume the flow:
```python Code
# Sync handler:
def handle_feedback_webhook(flow_id: str, feedback: str):
flow = ReviewFlow.from_pending(flow_id)
result = flow.resume(feedback)
return result
# Async handler (FastAPI, aiohttp, etc.):
async def handle_feedback_webhook(flow_id: str, feedback: str):
flow = ReviewFlow.from_pending(flow_id)
result = await flow.resume_async(feedback)
return result
```
### Key Types
| Type | Description |
|------|-------------|
| `HumanFeedbackProvider` | Protocol for custom feedback providers |
| `PendingFeedbackContext` | Contains all info needed to resume a paused flow |
| `HumanFeedbackPending` | Returned by `kickoff()` when flow is paused for feedback |
| `ConsoleProvider` | Default blocking console input provider |
### PendingFeedbackContext
The context contains everything needed to resume:
```python Code
@dataclass
class PendingFeedbackContext:
flow_id: str # Unique identifier for this flow execution
flow_class: str # Fully qualified class name
method_name: str # Method that triggered feedback
method_output: Any # Output shown to the human
message: str # The request message
emit: list[str] | None # Possible outcomes for routing
default_outcome: str | None
metadata: dict # Custom metadata
llm: str | None # LLM for outcome collapsing
requested_at: datetime
```
### Complete Async Flow Example
```python Code
from crewai.flow import (
Flow, start, listen, human_feedback,
HumanFeedbackProvider, HumanFeedbackPending, PendingFeedbackContext
)
class SlackNotificationProvider(HumanFeedbackProvider):
"""Provider that sends Slack notifications and pauses for async feedback."""
def __init__(self, channel: str):
self.channel = channel
def request_feedback(self, context: PendingFeedbackContext, flow: Flow) -> str:
# Send Slack notification (implement your own)
slack_thread_id = self.post_to_slack(
channel=self.channel,
message=f"Review needed:\n\n{context.method_output}\n\n{context.message}",
)
# Pause execution - framework handles persistence automatically
raise HumanFeedbackPending(
context=context,
callback_info={
"slack_channel": self.channel,
"thread_id": slack_thread_id,
}
)
class ContentPipeline(Flow):
@start()
@human_feedback(
message="Approve this content for publication?",
emit=["approved", "rejected", "needs_revision"],
llm="gpt-4o-mini",
default_outcome="needs_revision",
provider=SlackNotificationProvider("#content-reviews"),
)
def generate_content(self):
return "AI-generated blog post content..."
@listen("approved")
def publish(self, result):
print(f"Publishing! Reviewer said: {result.feedback}")
return {"status": "published"}
@listen("rejected")
def archive(self, result):
print(f"Archived. Reason: {result.feedback}")
return {"status": "archived"}
@listen("needs_revision")
def queue_revision(self, result):
print(f"Queued for revision: {result.feedback}")
return {"status": "revision_needed"}
# Starting the flow (will pause and wait for Slack response)
def start_content_pipeline():
flow = ContentPipeline()
result = flow.kickoff()
if isinstance(result, HumanFeedbackPending):
return {"status": "pending", "flow_id": result.context.flow_id}
return result
# Resuming when Slack webhook fires (sync handler)
def on_slack_feedback(flow_id: str, slack_message: str):
flow = ContentPipeline.from_pending(flow_id)
result = flow.resume(slack_message)
return result
# If your handler is async (FastAPI, aiohttp, Slack Bolt async, etc.)
async def on_slack_feedback_async(flow_id: str, slack_message: str):
flow = ContentPipeline.from_pending(flow_id)
result = await flow.resume_async(slack_message)
return result
```
<Warning>
If you're using an async web framework (FastAPI, aiohttp, Slack Bolt async mode), use `await flow.resume_async()` instead of `flow.resume()`. Calling `resume()` from within a running event loop will raise a `RuntimeError`.
</Warning>
### Best Practices for Async Feedback
1. **Check the return type**: `kickoff()` returns `HumanFeedbackPending` when paused—no try/except needed
2. **Use the right resume method**: Use `resume()` in sync code, `await resume_async()` in async code
3. **Store callback info**: Use `callback_info` to store webhook URLs, ticket IDs, etc.
4. **Implement idempotency**: Your resume handler should be idempotent for safety
5. **Automatic persistence**: State is automatically saved when `HumanFeedbackPending` is raised and uses `SQLiteFlowPersistence` by default
6. **Custom persistence**: Pass a custom persistence instance to `from_pending()` if needed
## Related Documentation
- [Flows Overview](/en/concepts/flows) - Learn about CrewAI Flows
- [Flow State Management](/en/guides/flows/mastering-flow-state) - Managing state in flows
- [Flow Persistence](/en/concepts/flows#persistence) - Persisting flow state
- [Routing with @router](/en/concepts/flows#router) - More about conditional routing
- [Human Input on Execution](/en/learn/human-input-on-execution) - Task-level human input

View File

@@ -5,22 +5,9 @@ icon: "user-check"
mode: "wide" mode: "wide"
--- ---
Human-in-the-Loop (HITL) is a powerful approach that combines artificial intelligence with human expertise to enhance decision-making and improve task outcomes. CrewAI provides multiple ways to implement HITL depending on your needs. Human-in-the-Loop (HITL) is a powerful approach that combines artificial intelligence with human expertise to enhance decision-making and improve task outcomes. This guide shows you how to implement HITL within CrewAI.
## Choosing Your HITL Approach ## Setting Up HITL Workflows
CrewAI offers two main approaches for implementing human-in-the-loop workflows:
| Approach | Best For | Integration |
|----------|----------|-------------|
| **Flow-based** (`@human_feedback` decorator) | Local development, console-based review, synchronous workflows | [Human Feedback in Flows](/en/learn/human-feedback-in-flows) |
| **Webhook-based** (Enterprise) | Production deployments, async workflows, external integrations (Slack, Teams, etc.) | This guide |
<Tip>
If you're building flows and want to add human review steps with routing based on feedback, check out the [Human Feedback in Flows](/en/learn/human-feedback-in-flows) guide for the `@human_feedback` decorator.
</Tip>
## Setting Up Webhook-Based HITL Workflows
<Steps> <Steps>
<Step title="Configure Your Task"> <Step title="Configure Your Task">

View File

@@ -10,25 +10,14 @@ mode: "wide"
CrewAI provides the ability to kickoff a crew asynchronously, allowing you to start the crew execution in a non-blocking manner. CrewAI provides the ability to kickoff a crew asynchronously, allowing you to start the crew execution in a non-blocking manner.
This feature is particularly useful when you want to run multiple crews concurrently or when you need to perform other tasks while the crew is executing. This feature is particularly useful when you want to run multiple crews concurrently or when you need to perform other tasks while the crew is executing.
CrewAI offers two approaches for async execution: ## Asynchronous Crew Execution
| Method | Type | Description | To kickoff a crew asynchronously, use the `kickoff_async()` method. This method initiates the crew execution in a separate thread, allowing the main thread to continue executing other tasks.
|--------|------|-------------|
| `akickoff()` | Native async | True async/await throughout the entire execution chain |
| `kickoff_async()` | Thread-based | Wraps synchronous execution in `asyncio.to_thread` |
<Note>
For high-concurrency workloads, `akickoff()` is recommended as it uses native async for task execution, memory operations, and knowledge retrieval.
</Note>
## Native Async Execution with `akickoff()`
The `akickoff()` method provides true native async execution, using async/await throughout the entire execution chain including task execution, memory operations, and knowledge queries.
### Method Signature ### Method Signature
```python Code ```python Code
async def akickoff(self, inputs: dict) -> CrewOutput: def kickoff_async(self, inputs: dict) -> CrewOutput:
``` ```
### Parameters ### Parameters
@@ -39,148 +28,23 @@ async def akickoff(self, inputs: dict) -> CrewOutput:
- `CrewOutput`: An object representing the result of the crew execution. - `CrewOutput`: An object representing the result of the crew execution.
### Example: Native Async Crew Execution ## Potential Use Cases
```python Code - **Parallel Content Generation**: Kickoff multiple independent crews asynchronously, each responsible for generating content on different topics. For example, one crew might research and draft an article on AI trends, while another crew generates social media posts about a new product launch. Each crew operates independently, allowing content production to scale efficiently.
import asyncio
from crewai import Crew, Agent, Task - **Concurrent Market Research Tasks**: Launch multiple crews asynchronously to conduct market research in parallel. One crew might analyze industry trends, while another examines competitor strategies, and yet another evaluates consumer sentiment. Each crew independently completes its task, enabling faster and more comprehensive insights.
# Create an agent - **Independent Travel Planning Modules**: Execute separate crews to independently plan different aspects of a trip. One crew might handle flight options, another handles accommodation, and a third plans activities. Each crew works asynchronously, allowing various components of the trip to be planned simultaneously and independently for faster results.
coding_agent = Agent(
role="Python Data Analyst", ## Example: Single Asynchronous Crew Execution
goal="Analyze data and provide insights using Python",
backstory="You are an experienced data analyst with strong Python skills.", Here's an example of how to kickoff a crew asynchronously using asyncio and awaiting the result:
allow_code_execution=True
)
# Create a task
data_analysis_task = Task(
description="Analyze the given dataset and calculate the average age of participants. Ages: {ages}",
agent=coding_agent,
expected_output="The average age of the participants."
)
# Create a crew
analysis_crew = Crew(
agents=[coding_agent],
tasks=[data_analysis_task]
)
# Native async execution
async def main():
result = await analysis_crew.akickoff(inputs={"ages": [25, 30, 35, 40, 45]})
print("Crew Result:", result)
asyncio.run(main())
```
### Example: Multiple Native Async Crews
Run multiple crews concurrently using `asyncio.gather()` with native async:
```python Code
import asyncio
from crewai import Crew, Agent, Task
coding_agent = Agent(
role="Python Data Analyst",
goal="Analyze data and provide insights using Python",
backstory="You are an experienced data analyst with strong Python skills.",
allow_code_execution=True
)
task_1 = Task(
description="Analyze the first dataset and calculate the average age. Ages: {ages}",
agent=coding_agent,
expected_output="The average age of the participants."
)
task_2 = Task(
description="Analyze the second dataset and calculate the average age. Ages: {ages}",
agent=coding_agent,
expected_output="The average age of the participants."
)
crew_1 = Crew(agents=[coding_agent], tasks=[task_1])
crew_2 = Crew(agents=[coding_agent], tasks=[task_2])
async def main():
results = await asyncio.gather(
crew_1.akickoff(inputs={"ages": [25, 30, 35, 40, 45]}),
crew_2.akickoff(inputs={"ages": [20, 22, 24, 28, 30]})
)
for i, result in enumerate(results, 1):
print(f"Crew {i} Result:", result)
asyncio.run(main())
```
### Example: Native Async for Multiple Inputs
Use `akickoff_for_each()` to execute your crew against multiple inputs concurrently with native async:
```python Code
import asyncio
from crewai import Crew, Agent, Task
coding_agent = Agent(
role="Python Data Analyst",
goal="Analyze data and provide insights using Python",
backstory="You are an experienced data analyst with strong Python skills.",
allow_code_execution=True
)
data_analysis_task = Task(
description="Analyze the dataset and calculate the average age. Ages: {ages}",
agent=coding_agent,
expected_output="The average age of the participants."
)
analysis_crew = Crew(
agents=[coding_agent],
tasks=[data_analysis_task]
)
async def main():
datasets = [
{"ages": [25, 30, 35, 40, 45]},
{"ages": [20, 22, 24, 28, 30]},
{"ages": [30, 35, 40, 45, 50]}
]
results = await analysis_crew.akickoff_for_each(datasets)
for i, result in enumerate(results, 1):
print(f"Dataset {i} Result:", result)
asyncio.run(main())
```
## Thread-Based Async with `kickoff_async()`
The `kickoff_async()` method provides async execution by wrapping the synchronous `kickoff()` in a thread. This is useful for simpler async integration or backward compatibility.
### Method Signature
```python Code
async def kickoff_async(self, inputs: dict) -> CrewOutput:
```
### Parameters
- `inputs` (dict): A dictionary containing the input data required for the tasks.
### Returns
- `CrewOutput`: An object representing the result of the crew execution.
### Example: Thread-Based Async Execution
```python Code ```python Code
import asyncio import asyncio
from crewai import Crew, Agent, Task from crewai import Crew, Agent, Task
# Create an agent with code execution enabled
coding_agent = Agent( coding_agent = Agent(
role="Python Data Analyst", role="Python Data Analyst",
goal="Analyze data and provide insights using Python", goal="Analyze data and provide insights using Python",
@@ -188,30 +52,37 @@ coding_agent = Agent(
allow_code_execution=True allow_code_execution=True
) )
# Create a task that requires code execution
data_analysis_task = Task( data_analysis_task = Task(
description="Analyze the given dataset and calculate the average age of participants. Ages: {ages}", description="Analyze the given dataset and calculate the average age of participants. Ages: {ages}",
agent=coding_agent, agent=coding_agent,
expected_output="The average age of the participants." expected_output="The average age of the participants."
) )
# Create a crew and add the task
analysis_crew = Crew( analysis_crew = Crew(
agents=[coding_agent], agents=[coding_agent],
tasks=[data_analysis_task] tasks=[data_analysis_task]
) )
# Async function to kickoff the crew asynchronously
async def async_crew_execution(): async def async_crew_execution():
result = await analysis_crew.kickoff_async(inputs={"ages": [25, 30, 35, 40, 45]}) result = await analysis_crew.kickoff_async(inputs={"ages": [25, 30, 35, 40, 45]})
print("Crew Result:", result) print("Crew Result:", result)
# Run the async function
asyncio.run(async_crew_execution()) asyncio.run(async_crew_execution())
``` ```
### Example: Multiple Thread-Based Async Crews ## Example: Multiple Asynchronous Crew Executions
In this example, we'll show how to kickoff multiple crews asynchronously and wait for all of them to complete using `asyncio.gather()`:
```python Code ```python Code
import asyncio import asyncio
from crewai import Crew, Agent, Task from crewai import Crew, Agent, Task
# Create an agent with code execution enabled
coding_agent = Agent( coding_agent = Agent(
role="Python Data Analyst", role="Python Data Analyst",
goal="Analyze data and provide insights using Python", goal="Analyze data and provide insights using Python",
@@ -219,6 +90,7 @@ coding_agent = Agent(
allow_code_execution=True allow_code_execution=True
) )
# Create tasks that require code execution
task_1 = Task( task_1 = Task(
description="Analyze the first dataset and calculate the average age of participants. Ages: {ages}", description="Analyze the first dataset and calculate the average age of participants. Ages: {ages}",
agent=coding_agent, agent=coding_agent,
@@ -231,76 +103,22 @@ task_2 = Task(
expected_output="The average age of the participants." expected_output="The average age of the participants."
) )
# Create two crews and add tasks
crew_1 = Crew(agents=[coding_agent], tasks=[task_1]) crew_1 = Crew(agents=[coding_agent], tasks=[task_1])
crew_2 = Crew(agents=[coding_agent], tasks=[task_2]) crew_2 = Crew(agents=[coding_agent], tasks=[task_2])
# Async function to kickoff multiple crews asynchronously and wait for all to finish
async def async_multiple_crews(): async def async_multiple_crews():
# Create coroutines for concurrent execution
result_1 = crew_1.kickoff_async(inputs={"ages": [25, 30, 35, 40, 45]}) result_1 = crew_1.kickoff_async(inputs={"ages": [25, 30, 35, 40, 45]})
result_2 = crew_2.kickoff_async(inputs={"ages": [20, 22, 24, 28, 30]}) result_2 = crew_2.kickoff_async(inputs={"ages": [20, 22, 24, 28, 30]})
# Wait for both crews to finish
results = await asyncio.gather(result_1, result_2) results = await asyncio.gather(result_1, result_2)
for i, result in enumerate(results, 1): for i, result in enumerate(results, 1):
print(f"Crew {i} Result:", result) print(f"Crew {i} Result:", result)
# Run the async function
asyncio.run(async_multiple_crews()) asyncio.run(async_multiple_crews())
``` ```
## Async Streaming
Both async methods support streaming when `stream=True` is set on the crew:
```python Code
import asyncio
from crewai import Crew, Agent, Task
agent = Agent(
role="Researcher",
goal="Research and summarize topics",
backstory="You are an expert researcher."
)
task = Task(
description="Research the topic: {topic}",
agent=agent,
expected_output="A comprehensive summary of the topic."
)
crew = Crew(
agents=[agent],
tasks=[task],
stream=True # Enable streaming
)
async def main():
streaming_output = await crew.akickoff(inputs={"topic": "AI trends in 2024"})
# Async iteration over streaming chunks
async for chunk in streaming_output:
print(f"Chunk: {chunk.content}")
# Access final result after streaming completes
result = streaming_output.result
print(f"Final result: {result.raw}")
asyncio.run(main())
```
## Potential Use Cases
- **Parallel Content Generation**: Kickoff multiple independent crews asynchronously, each responsible for generating content on different topics. For example, one crew might research and draft an article on AI trends, while another crew generates social media posts about a new product launch.
- **Concurrent Market Research Tasks**: Launch multiple crews asynchronously to conduct market research in parallel. One crew might analyze industry trends, while another examines competitor strategies, and yet another evaluates consumer sentiment.
- **Independent Travel Planning Modules**: Execute separate crews to independently plan different aspects of a trip. One crew might handle flight options, another handles accommodation, and a third plans activities.
## Choosing Between `akickoff()` and `kickoff_async()`
| Feature | `akickoff()` | `kickoff_async()` |
|---------|--------------|-------------------|
| Execution model | Native async/await | Thread-based wrapper |
| Task execution | Async with `aexecute_sync()` | Sync in thread pool |
| Memory operations | Async | Sync in thread pool |
| Knowledge retrieval | Async | Sync in thread pool |
| Best for | High-concurrency, I/O-bound workloads | Simple async integration |
| Streaming support | Yes | Yes |

View File

@@ -1,427 +0,0 @@
---
title: LLM Call Hooks
description: Learn how to use LLM call hooks to intercept, modify, and control language model interactions in CrewAI
mode: "wide"
---
LLM Call Hooks provide fine-grained control over language model interactions during agent execution. These hooks allow you to intercept LLM calls, modify prompts, transform responses, implement approval gates, and add custom logging or monitoring.
## Overview
LLM hooks are executed at two critical points:
- **Before LLM Call**: Modify messages, validate inputs, or block execution
- **After LLM Call**: Transform responses, sanitize outputs, or modify conversation history
## Hook Types
### Before LLM Call Hooks
Executed before every LLM call, these hooks can:
- Inspect and modify messages sent to the LLM
- Block LLM execution based on conditions
- Implement rate limiting or approval gates
- Add context or system messages
- Log request details
**Signature:**
```python
def before_hook(context: LLMCallHookContext) -> bool | None:
# Return False to block execution
# Return True or None to allow execution
...
```
### After LLM Call Hooks
Executed after every LLM call, these hooks can:
- Modify or sanitize LLM responses
- Add metadata or formatting
- Log response details
- Update conversation history
- Implement content filtering
**Signature:**
```python
def after_hook(context: LLMCallHookContext) -> str | None:
# Return modified response string
# Return None to keep original response
...
```
## LLM Hook Context
The `LLMCallHookContext` object provides comprehensive access to execution state:
```python
class LLMCallHookContext:
executor: CrewAgentExecutor # Full executor reference
messages: list # Mutable message list
agent: Agent # Current agent
task: Task # Current task
crew: Crew # Crew instance
llm: BaseLLM # LLM instance
iterations: int # Current iteration count
response: str | None # LLM response (after hooks only)
```
### Modifying Messages
**Important:** Always modify messages in-place:
```python
# ✅ Correct - modify in-place
def add_context(context: LLMCallHookContext) -> None:
context.messages.append({"role": "system", "content": "Be concise"})
# ❌ Wrong - replaces list reference
def wrong_approach(context: LLMCallHookContext) -> None:
context.messages = [{"role": "system", "content": "Be concise"}]
```
## Registration Methods
### 1. Global Hook Registration
Register hooks that apply to all LLM calls across all crews:
```python
from crewai.hooks import register_before_llm_call_hook, register_after_llm_call_hook
def log_llm_call(context):
print(f"LLM call by {context.agent.role} at iteration {context.iterations}")
return None # Allow execution
register_before_llm_call_hook(log_llm_call)
```
### 2. Decorator-Based Registration
Use decorators for cleaner syntax:
```python
from crewai.hooks import before_llm_call, after_llm_call
@before_llm_call
def validate_iteration_count(context):
if context.iterations > 10:
print("⚠️ Exceeded maximum iterations")
return False # Block execution
return None
@after_llm_call
def sanitize_response(context):
if context.response and "API_KEY" in context.response:
return context.response.replace("API_KEY", "[REDACTED]")
return None
```
### 3. Crew-Scoped Hooks
Register hooks for a specific crew instance:
```python
@CrewBase
class MyProjCrew:
@before_llm_call_crew
def validate_inputs(self, context):
# Only applies to this crew
if context.iterations == 0:
print(f"Starting task: {context.task.description}")
return None
@after_llm_call_crew
def log_responses(self, context):
# Crew-specific response logging
print(f"Response length: {len(context.response)}")
return None
@crew
def crew(self) -> Crew:
return Crew(
agents=self.agents,
tasks=self.tasks,
process=Process.sequential,
verbose=True
)
```
## Common Use Cases
### 1. Iteration Limiting
```python
@before_llm_call
def limit_iterations(context: LLMCallHookContext) -> bool | None:
max_iterations = 15
if context.iterations > max_iterations:
print(f"⛔ Blocked: Exceeded {max_iterations} iterations")
return False # Block execution
return None
```
### 2. Human Approval Gate
```python
@before_llm_call
def require_approval(context: LLMCallHookContext) -> bool | None:
if context.iterations > 5:
response = context.request_human_input(
prompt=f"Iteration {context.iterations}: Approve LLM call?",
default_message="Press Enter to approve, or type 'no' to block:"
)
if response.lower() == "no":
print("🚫 LLM call blocked by user")
return False
return None
```
### 3. Adding System Context
```python
@before_llm_call
def add_guardrails(context: LLMCallHookContext) -> None:
# Add safety guidelines to every LLM call
context.messages.append({
"role": "system",
"content": "Ensure responses are factual and cite sources when possible."
})
return None
```
### 4. Response Sanitization
```python
@after_llm_call
def sanitize_sensitive_data(context: LLMCallHookContext) -> str | None:
if not context.response:
return None
# Remove sensitive patterns
import re
sanitized = context.response
sanitized = re.sub(r'\b\d{3}-\d{2}-\d{4}\b', '[SSN-REDACTED]', sanitized)
sanitized = re.sub(r'\b\d{4}[- ]?\d{4}[- ]?\d{4}[- ]?\d{4}\b', '[CARD-REDACTED]', sanitized)
return sanitized
```
### 5. Cost Tracking
```python
import tiktoken
@before_llm_call
def track_token_usage(context: LLMCallHookContext) -> None:
encoding = tiktoken.get_encoding("cl100k_base")
total_tokens = sum(
len(encoding.encode(msg.get("content", "")))
for msg in context.messages
)
print(f"📊 Input tokens: ~{total_tokens}")
return None
@after_llm_call
def track_response_tokens(context: LLMCallHookContext) -> None:
if context.response:
encoding = tiktoken.get_encoding("cl100k_base")
tokens = len(encoding.encode(context.response))
print(f"📊 Response tokens: ~{tokens}")
return None
```
### 6. Debug Logging
```python
@before_llm_call
def debug_request(context: LLMCallHookContext) -> None:
print(f"""
🔍 LLM Call Debug:
- Agent: {context.agent.role}
- Task: {context.task.description[:50]}...
- Iteration: {context.iterations}
- Message Count: {len(context.messages)}
- Last Message: {context.messages[-1] if context.messages else 'None'}
""")
return None
@after_llm_call
def debug_response(context: LLMCallHookContext) -> None:
if context.response:
print(f"✅ Response Preview: {context.response[:100]}...")
return None
```
## Hook Management
### Unregistering Hooks
```python
from crewai.hooks import (
unregister_before_llm_call_hook,
unregister_after_llm_call_hook
)
# Unregister specific hook
def my_hook(context):
...
register_before_llm_call_hook(my_hook)
# Later...
unregister_before_llm_call_hook(my_hook) # Returns True if found
```
### Clearing Hooks
```python
from crewai.hooks import (
clear_before_llm_call_hooks,
clear_after_llm_call_hooks,
clear_all_llm_call_hooks
)
# Clear specific hook type
count = clear_before_llm_call_hooks()
print(f"Cleared {count} before hooks")
# Clear all LLM hooks
before_count, after_count = clear_all_llm_call_hooks()
print(f"Cleared {before_count} before and {after_count} after hooks")
```
### Listing Registered Hooks
```python
from crewai.hooks import (
get_before_llm_call_hooks,
get_after_llm_call_hooks
)
# Get current hooks
before_hooks = get_before_llm_call_hooks()
after_hooks = get_after_llm_call_hooks()
print(f"Registered: {len(before_hooks)} before, {len(after_hooks)} after")
```
## Advanced Patterns
### Conditional Hook Execution
```python
@before_llm_call
def conditional_blocking(context: LLMCallHookContext) -> bool | None:
# Only block for specific agents
if context.agent.role == "researcher" and context.iterations > 10:
return False
# Only block for specific tasks
if "sensitive" in context.task.description.lower() and context.iterations > 5:
return False
return None
```
### Context-Aware Modifications
```python
@before_llm_call
def adaptive_prompting(context: LLMCallHookContext) -> None:
# Add different context based on iteration
if context.iterations == 0:
context.messages.append({
"role": "system",
"content": "Start with a high-level overview."
})
elif context.iterations > 3:
context.messages.append({
"role": "system",
"content": "Focus on specific details and provide examples."
})
return None
```
### Chaining Hooks
```python
# Multiple hooks execute in registration order
@before_llm_call
def first_hook(context):
print("1. First hook executed")
return None
@before_llm_call
def second_hook(context):
print("2. Second hook executed")
return None
@before_llm_call
def blocking_hook(context):
if context.iterations > 10:
print("3. Blocking hook - execution stopped")
return False # Subsequent hooks won't execute
print("3. Blocking hook - execution allowed")
return None
```
## Best Practices
1. **Keep Hooks Focused**: Each hook should have a single responsibility
2. **Avoid Heavy Computation**: Hooks execute on every LLM call
3. **Handle Errors Gracefully**: Use try-except to prevent hook failures from breaking execution
4. **Use Type Hints**: Leverage `LLMCallHookContext` for better IDE support
5. **Document Hook Behavior**: Especially for blocking conditions
6. **Test Hooks Independently**: Unit test hooks before using in production
7. **Clear Hooks in Tests**: Use `clear_all_llm_call_hooks()` between test runs
8. **Modify In-Place**: Always modify `context.messages` in-place, never replace
## Error Handling
```python
@before_llm_call
def safe_hook(context: LLMCallHookContext) -> bool | None:
try:
# Your hook logic
if some_condition:
return False
except Exception as e:
print(f"⚠️ Hook error: {e}")
# Decide: allow or block on error
return None # Allow execution despite error
```
## Type Safety
```python
from crewai.hooks import LLMCallHookContext, BeforeLLMCallHookType, AfterLLMCallHookType
# Explicit type annotations
def my_before_hook(context: LLMCallHookContext) -> bool | None:
return None
def my_after_hook(context: LLMCallHookContext) -> str | None:
return None
# Type-safe registration
register_before_llm_call_hook(my_before_hook)
register_after_llm_call_hook(my_after_hook)
```
## Troubleshooting
### Hook Not Executing
- Verify hook is registered before crew execution
- Check if previous hook returned `False` (blocks subsequent hooks)
- Ensure hook signature matches expected type
### Message Modifications Not Persisting
- Use in-place modifications: `context.messages.append()`
- Don't replace the list: `context.messages = []`
### Response Modifications Not Working
- Return the modified string from after hooks
- Returning `None` keeps the original response
## Conclusion
LLM Call Hooks provide powerful capabilities for controlling and monitoring language model interactions in CrewAI. Use them to implement safety guardrails, approval gates, logging, cost tracking, and response sanitization. Combined with proper error handling and type safety, hooks enable robust and production-ready agent systems.

View File

@@ -1,7 +1,7 @@
--- ---
title: "Strategic LLM Selection Guide" title: 'Strategic LLM Selection Guide'
description: "Strategic framework for choosing the right LLM for your CrewAI AI agents and writing effective task and agent definitions" description: 'Strategic framework for choosing the right LLM for your CrewAI AI agents and writing effective task and agent definitions'
icon: "brain-circuit" icon: 'brain-circuit'
mode: "wide" mode: "wide"
--- ---
@@ -10,35 +10,23 @@ mode: "wide"
Rather than prescriptive model recommendations, we advocate for a **thinking framework** that helps you make informed decisions based on your specific use case, constraints, and requirements. The LLM landscape evolves rapidly, with new models emerging regularly and existing ones being updated frequently. What matters most is developing a systematic approach to evaluation that remains relevant regardless of which specific models are available. Rather than prescriptive model recommendations, we advocate for a **thinking framework** that helps you make informed decisions based on your specific use case, constraints, and requirements. The LLM landscape evolves rapidly, with new models emerging regularly and existing ones being updated frequently. What matters most is developing a systematic approach to evaluation that remains relevant regardless of which specific models are available.
<Note> <Note>
This guide focuses on strategic thinking rather than specific model This guide focuses on strategic thinking rather than specific model recommendations, as the LLM landscape evolves rapidly.
recommendations, as the LLM landscape evolves rapidly.
</Note> </Note>
## Quick Decision Framework ## Quick Decision Framework
<Steps> <Steps>
<Step title="Analyze Your Tasks"> <Step title="Analyze Your Tasks">
Begin by deeply understanding what your tasks actually require. Consider the Begin by deeply understanding what your tasks actually require. Consider the cognitive complexity involved, the depth of reasoning needed, the format of expected outputs, and the amount of context the model will need to process. This foundational analysis will guide every subsequent decision.
cognitive complexity involved, the depth of reasoning needed, the format of
expected outputs, and the amount of context the model will need to process.
This foundational analysis will guide every subsequent decision.
</Step> </Step>
<Step title="Map Model Capabilities"> <Step title="Map Model Capabilities">
Once you understand your requirements, map them to model strengths. Once you understand your requirements, map them to model strengths. Different model families excel at different types of work; some are optimized for reasoning and analysis, others for creativity and content generation, and others for speed and efficiency.
Different model families excel at different types of work; some are
optimized for reasoning and analysis, others for creativity and content
generation, and others for speed and efficiency.
</Step> </Step>
<Step title="Consider Constraints"> <Step title="Consider Constraints">
Factor in your real-world operational constraints including budget Factor in your real-world operational constraints including budget limitations, latency requirements, data privacy needs, and infrastructure capabilities. The theoretically best model may not be the practically best choice for your situation.
limitations, latency requirements, data privacy needs, and infrastructure
capabilities. The theoretically best model may not be the practically best
choice for your situation.
</Step> </Step>
<Step title="Test and Iterate"> <Step title="Test and Iterate">
Start with reliable, well-understood models and optimize based on actual Start with reliable, well-understood models and optimize based on actual performance in your specific use case. Real-world results often differ from theoretical benchmarks, so empirical testing is crucial.
performance in your specific use case. Real-world results often differ from
theoretical benchmarks, so empirical testing is crucial.
</Step> </Step>
</Steps> </Steps>
@@ -55,7 +43,6 @@ The most critical step in LLM selection is understanding what your task actually
- **Complex Tasks** require multi-step reasoning, strategic thinking, and the ability to handle ambiguous or incomplete information. These might involve analyzing multiple data sources, developing comprehensive strategies, or solving problems that require breaking down into smaller components. The model needs to maintain context across multiple reasoning steps and often must make inferences that aren't explicitly stated. - **Complex Tasks** require multi-step reasoning, strategic thinking, and the ability to handle ambiguous or incomplete information. These might involve analyzing multiple data sources, developing comprehensive strategies, or solving problems that require breaking down into smaller components. The model needs to maintain context across multiple reasoning steps and often must make inferences that aren't explicitly stated.
- **Creative Tasks** demand a different type of cognitive capability focused on generating novel, engaging, and contextually appropriate content. This includes storytelling, marketing copy creation, and creative problem-solving. The model needs to understand nuance, tone, and audience while producing content that feels authentic and engaging rather than formulaic. - **Creative Tasks** demand a different type of cognitive capability focused on generating novel, engaging, and contextually appropriate content. This includes storytelling, marketing copy creation, and creative problem-solving. The model needs to understand nuance, tone, and audience while producing content that feels authentic and engaging rather than formulaic.
</Tab> </Tab>
<Tab title="Output Requirements"> <Tab title="Output Requirements">
@@ -64,7 +51,6 @@ The most critical step in LLM selection is understanding what your task actually
- **Creative Content** outputs demand a balance of technical competence and creative flair. The model needs to understand audience, tone, and brand voice while producing content that engages readers and achieves specific communication goals. Quality here is often subjective and requires models that can adapt their writing style to different contexts and purposes. - **Creative Content** outputs demand a balance of technical competence and creative flair. The model needs to understand audience, tone, and brand voice while producing content that engages readers and achieves specific communication goals. Quality here is often subjective and requires models that can adapt their writing style to different contexts and purposes.
- **Technical Content** sits between structured data and creative content, requiring both precision and clarity. Documentation, code generation, and technical analysis need to be accurate and comprehensive while remaining accessible to the intended audience. The model must understand complex technical concepts and communicate them effectively. - **Technical Content** sits between structured data and creative content, requiring both precision and clarity. Documentation, code generation, and technical analysis need to be accurate and comprehensive while remaining accessible to the intended audience. The model must understand complex technical concepts and communicate them effectively.
</Tab> </Tab>
<Tab title="Context Needs"> <Tab title="Context Needs">
@@ -73,7 +59,6 @@ The most critical step in LLM selection is understanding what your task actually
- **Long Context** requirements emerge when working with substantial documents, extended conversations, or complex multi-part tasks. The model needs to maintain coherence across thousands of tokens while referencing earlier information accurately. This capability becomes crucial for document analysis, comprehensive research, and sophisticated dialogue systems. - **Long Context** requirements emerge when working with substantial documents, extended conversations, or complex multi-part tasks. The model needs to maintain coherence across thousands of tokens while referencing earlier information accurately. This capability becomes crucial for document analysis, comprehensive research, and sophisticated dialogue systems.
- **Very Long Context** scenarios push the boundaries of what's currently possible, involving massive document processing, extensive research synthesis, or complex multi-session interactions. These use cases require models specifically designed for extended context handling and often involve trade-offs between context length and processing speed. - **Very Long Context** scenarios push the boundaries of what's currently possible, involving massive document processing, extensive research synthesis, or complex multi-session interactions. These use cases require models specifically designed for extended context handling and often involve trade-offs between context length and processing speed.
</Tab> </Tab>
</Tabs> </Tabs>
@@ -88,7 +73,6 @@ Understanding model capabilities requires looking beyond marketing claims and be
The strength of reasoning models lies in their ability to maintain logical consistency across extended reasoning chains and to break down complex problems into manageable components. They're particularly valuable for strategic planning, complex analysis, and situations where the quality of reasoning matters more than speed of response. The strength of reasoning models lies in their ability to maintain logical consistency across extended reasoning chains and to break down complex problems into manageable components. They're particularly valuable for strategic planning, complex analysis, and situations where the quality of reasoning matters more than speed of response.
However, reasoning models often come with trade-offs in terms of speed and cost. They may also be less suitable for creative tasks or simple operations where their sophisticated reasoning capabilities aren't needed. Consider these models when your tasks involve genuine complexity that benefits from systematic, step-by-step analysis. However, reasoning models often come with trade-offs in terms of speed and cost. They may also be less suitable for creative tasks or simple operations where their sophisticated reasoning capabilities aren't needed. Consider these models when your tasks involve genuine complexity that benefits from systematic, step-by-step analysis.
</Accordion> </Accordion>
<Accordion title="General Purpose Models" icon="microchip"> <Accordion title="General Purpose Models" icon="microchip">
@@ -97,7 +81,6 @@ Understanding model capabilities requires looking beyond marketing claims and be
The primary advantage of general purpose models is their reliability and predictability across different types of work. They handle most standard business tasks competently, from research and analysis to content creation and data processing. This makes them excellent choices for teams that need consistent performance across varied workflows. The primary advantage of general purpose models is their reliability and predictability across different types of work. They handle most standard business tasks competently, from research and analysis to content creation and data processing. This makes them excellent choices for teams that need consistent performance across varied workflows.
While general purpose models may not achieve the peak performance of specialized alternatives in specific domains, they offer operational simplicity and reduced complexity in model management. They're often the best starting point for new projects, allowing teams to understand their specific needs before potentially optimizing with more specialized models. While general purpose models may not achieve the peak performance of specialized alternatives in specific domains, they offer operational simplicity and reduced complexity in model management. They're often the best starting point for new projects, allowing teams to understand their specific needs before potentially optimizing with more specialized models.
</Accordion> </Accordion>
<Accordion title="Fast & Efficient Models" icon="bolt"> <Accordion title="Fast & Efficient Models" icon="bolt">
@@ -106,7 +89,6 @@ Understanding model capabilities requires looking beyond marketing claims and be
These models excel in scenarios involving routine operations, simple data processing, function calling, and high-volume tasks where the cognitive requirements are relatively straightforward. They're particularly valuable for applications that need to process many requests quickly or operate within tight budget constraints. These models excel in scenarios involving routine operations, simple data processing, function calling, and high-volume tasks where the cognitive requirements are relatively straightforward. They're particularly valuable for applications that need to process many requests quickly or operate within tight budget constraints.
The key consideration with efficient models is ensuring that their capabilities align with your task requirements. While they can handle many routine operations effectively, they may struggle with tasks requiring nuanced understanding, complex reasoning, or sophisticated content generation. They're best used for well-defined, routine operations where speed and cost matter more than sophistication. The key consideration with efficient models is ensuring that their capabilities align with your task requirements. While they can handle many routine operations effectively, they may struggle with tasks requiring nuanced understanding, complex reasoning, or sophisticated content generation. They're best used for well-defined, routine operations where speed and cost matter more than sophistication.
</Accordion> </Accordion>
<Accordion title="Creative Models" icon="pen"> <Accordion title="Creative Models" icon="pen">
@@ -115,7 +97,6 @@ Understanding model capabilities requires looking beyond marketing claims and be
The strength of creative models lies in their ability to adapt writing style to different audiences, maintain consistent voice and tone, and generate content that engages readers effectively. They often perform better on tasks involving storytelling, marketing copy, brand communications, and other content where creativity and engagement are primary goals. The strength of creative models lies in their ability to adapt writing style to different audiences, maintain consistent voice and tone, and generate content that engages readers effectively. They often perform better on tasks involving storytelling, marketing copy, brand communications, and other content where creativity and engagement are primary goals.
When selecting creative models, consider not just their ability to generate text, but their understanding of audience, context, and purpose. The best creative models can adapt their output to match specific brand voices, target different audience segments, and maintain consistency across extended content pieces. When selecting creative models, consider not just their ability to generate text, but their understanding of audience, context, and purpose. The best creative models can adapt their output to match specific brand voices, target different audience segments, and maintain consistency across extended content pieces.
</Accordion> </Accordion>
<Accordion title="Open Source Models" icon="code"> <Accordion title="Open Source Models" icon="code">
@@ -124,7 +105,6 @@ Understanding model capabilities requires looking beyond marketing claims and be
The primary benefits of open source models include elimination of per-token costs, ability to fine-tune for specific use cases, complete data privacy, and independence from external API providers. They're particularly valuable for organizations with strict data privacy requirements, budget constraints, or specific customization needs. The primary benefits of open source models include elimination of per-token costs, ability to fine-tune for specific use cases, complete data privacy, and independence from external API providers. They're particularly valuable for organizations with strict data privacy requirements, budget constraints, or specific customization needs.
However, open source models require more technical expertise to deploy and maintain effectively. Teams need to consider infrastructure costs, model management complexity, and the ongoing effort required to keep models updated and optimized. The total cost of ownership may be higher than cloud-based alternatives when factoring in technical overhead. However, open source models require more technical expertise to deploy and maintain effectively. Teams need to consider infrastructure costs, model management complexity, and the ongoing effort required to keep models updated and optimized. The total cost of ownership may be higher than cloud-based alternatives when factoring in technical overhead.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -133,8 +113,7 @@ Understanding model capabilities requires looking beyond marketing claims and be
### a. Multi-Model Approach ### a. Multi-Model Approach
<Tip> <Tip>
Use different models for different purposes within the same crew to optimize Use different models for different purposes within the same crew to optimize both performance and cost.
both performance and cost.
</Tip> </Tip>
The most sophisticated CrewAI implementations often employ multiple models strategically, assigning different models to different agents based on their specific roles and requirements. This approach allows teams to optimize for both performance and cost by using the most appropriate model for each type of work. The most sophisticated CrewAI implementations often employ multiple models strategically, assigning different models to different agents based on their specific roles and requirements. This approach allows teams to optimize for both performance and cost by using the most appropriate model for each type of work.
@@ -198,7 +177,6 @@ The key to successful multi-model implementation is understanding how different
Effective manager LLMs require strong reasoning capabilities to make good delegation decisions, consistent performance to ensure predictable coordination, and excellent context management to track the state of multiple agents simultaneously. The model needs to understand the capabilities and limitations of different agents while optimizing task allocation for efficiency and quality. Effective manager LLMs require strong reasoning capabilities to make good delegation decisions, consistent performance to ensure predictable coordination, and excellent context management to track the state of multiple agents simultaneously. The model needs to understand the capabilities and limitations of different agents while optimizing task allocation for efficiency and quality.
Cost considerations are particularly important for manager LLMs since they're involved in every operation. The model needs to provide sufficient capability for effective coordination while remaining cost-effective for frequent use. This often means finding models that offer good reasoning capabilities without the premium pricing of the most sophisticated options. Cost considerations are particularly important for manager LLMs since they're involved in every operation. The model needs to provide sufficient capability for effective coordination while remaining cost-effective for frequent use. This often means finding models that offer good reasoning capabilities without the premium pricing of the most sophisticated options.
</Tab> </Tab>
<Tab title="Function Calling LLM"> <Tab title="Function Calling LLM">
@@ -207,7 +185,6 @@ The key to successful multi-model implementation is understanding how different
The most important characteristics for function calling LLMs are precision and reliability rather than creativity or sophisticated reasoning. The model needs to consistently extract the correct parameters from natural language requests and handle tool responses appropriately. Speed is also important since tool usage often involves multiple round trips that can impact overall performance. The most important characteristics for function calling LLMs are precision and reliability rather than creativity or sophisticated reasoning. The model needs to consistently extract the correct parameters from natural language requests and handle tool responses appropriately. Speed is also important since tool usage often involves multiple round trips that can impact overall performance.
Many teams find that specialized function calling models or general purpose models with strong tool support work better than creative or reasoning-focused models for this role. The key is ensuring that the model can reliably bridge the gap between natural language instructions and structured tool calls. Many teams find that specialized function calling models or general purpose models with strong tool support work better than creative or reasoning-focused models for this role. The key is ensuring that the model can reliably bridge the gap between natural language instructions and structured tool calls.
</Tab> </Tab>
<Tab title="Agent-Specific Overrides"> <Tab title="Agent-Specific Overrides">
@@ -216,7 +193,6 @@ The key to successful multi-model implementation is understanding how different
Consider agent-specific overrides when an agent's role requires capabilities that differ substantially from other crew members. For example, a creative writing agent might benefit from a model optimized for content generation, while a data analysis agent might perform better with a reasoning-focused model. Consider agent-specific overrides when an agent's role requires capabilities that differ substantially from other crew members. For example, a creative writing agent might benefit from a model optimized for content generation, while a data analysis agent might perform better with a reasoning-focused model.
The challenge with agent-specific overrides is balancing optimization with operational complexity. Each additional model adds complexity to deployment, monitoring, and cost management. Teams should focus overrides on agents where the performance improvement justifies the additional complexity. The challenge with agent-specific overrides is balancing optimization with operational complexity. Each additional model adds complexity to deployment, monitoring, and cost management. Teams should focus overrides on agents where the performance improvement justifies the additional complexity.
</Tab> </Tab>
</Tabs> </Tabs>
@@ -233,7 +209,6 @@ Effective task definition is often more important than model selection in determ
Effective task descriptions include relevant context and constraints that help the agent understand the broader purpose and any limitations they need to work within. They break complex work into focused steps that can be executed systematically, rather than presenting overwhelming, multi-faceted objectives that are difficult to approach systematically. Effective task descriptions include relevant context and constraints that help the agent understand the broader purpose and any limitations they need to work within. They break complex work into focused steps that can be executed systematically, rather than presenting overwhelming, multi-faceted objectives that are difficult to approach systematically.
Common mistakes include being too vague about objectives, failing to provide necessary context, setting unclear success criteria, or combining multiple unrelated tasks into a single description. The goal is to provide enough information for the agent to succeed while maintaining focus on a single, clear objective. Common mistakes include being too vague about objectives, failing to provide necessary context, setting unclear success criteria, or combining multiple unrelated tasks into a single description. The goal is to provide enough information for the agent to succeed while maintaining focus on a single, clear objective.
</Accordion> </Accordion>
<Accordion title="Expected Output Guidelines" icon="bullseye"> <Accordion title="Expected Output Guidelines" icon="bullseye">
@@ -242,7 +217,6 @@ Effective task definition is often more important than model selection in determ
The best output guidelines provide concrete examples of quality indicators and define completion criteria clearly enough that both the agent and human reviewers can assess whether the task has been completed successfully. This reduces ambiguity and helps ensure consistent results across multiple task executions. The best output guidelines provide concrete examples of quality indicators and define completion criteria clearly enough that both the agent and human reviewers can assess whether the task has been completed successfully. This reduces ambiguity and helps ensure consistent results across multiple task executions.
Avoid generic output descriptions that could apply to any task, missing format specifications that leave agents guessing about structure, unclear quality standards that make evaluation difficult, or failing to provide examples or templates that help agents understand expectations. Avoid generic output descriptions that could apply to any task, missing format specifications that leave agents guessing about structure, unclear quality standards that make evaluation difficult, or failing to provide examples or templates that help agents understand expectations.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -255,7 +229,6 @@ Effective task definition is often more important than model selection in determ
Implementing sequential dependencies effectively requires using the context parameter to chain related tasks, building complexity gradually through task progression, and ensuring that each task produces outputs that serve as meaningful inputs for subsequent tasks. The goal is to maintain logical flow between dependent tasks while avoiding unnecessary bottlenecks. Implementing sequential dependencies effectively requires using the context parameter to chain related tasks, building complexity gradually through task progression, and ensuring that each task produces outputs that serve as meaningful inputs for subsequent tasks. The goal is to maintain logical flow between dependent tasks while avoiding unnecessary bottlenecks.
Sequential dependencies work best when there's a clear logical progression from one task to another and when the output of one task genuinely improves the quality or feasibility of subsequent tasks. However, they can create bottlenecks if not managed carefully, so it's important to identify which dependencies are truly necessary versus those that are merely convenient. Sequential dependencies work best when there's a clear logical progression from one task to another and when the output of one task genuinely improves the quality or feasibility of subsequent tasks. However, they can create bottlenecks if not managed carefully, so it's important to identify which dependencies are truly necessary versus those that are merely convenient.
</Tab> </Tab>
<Tab title="Parallel Execution"> <Tab title="Parallel Execution">
@@ -264,7 +237,6 @@ Effective task definition is often more important than model selection in determ
Successful parallel execution requires identifying tasks that can truly run independently, grouping related but separate work streams effectively, and planning for result integration when parallel tasks need to be combined into a final deliverable. The key is ensuring that parallel tasks don't create conflicts or redundancies that reduce overall quality. Successful parallel execution requires identifying tasks that can truly run independently, grouping related but separate work streams effectively, and planning for result integration when parallel tasks need to be combined into a final deliverable. The key is ensuring that parallel tasks don't create conflicts or redundancies that reduce overall quality.
Consider parallel execution when you have multiple independent research streams, different types of analysis that don't depend on each other, or content creation tasks that can be developed simultaneously. However, be mindful of resource allocation and ensure that parallel execution doesn't overwhelm your available model capacity or budget. Consider parallel execution when you have multiple independent research streams, different types of analysis that don't depend on each other, or content creation tasks that can be developed simultaneously. However, be mindful of resource allocation and ensure that parallel execution doesn't overwhelm your available model capacity or budget.
</Tab> </Tab>
</Tabs> </Tabs>
@@ -273,8 +245,7 @@ Effective task definition is often more important than model selection in determ
### a. Role-Driven LLM Selection ### a. Role-Driven LLM Selection
<Warning> <Warning>
Generic agent roles make it impossible to select the right LLM. Specific roles Generic agent roles make it impossible to select the right LLM. Specific roles enable targeted model optimization.
enable targeted model optimization.
</Warning> </Warning>
The specificity of your agent roles directly determines which LLM capabilities matter most for optimal performance. This creates a strategic opportunity to match precise model strengths with agent responsibilities. The specificity of your agent roles directly determines which LLM capabilities matter most for optimal performance. This creates a strategic opportunity to match precise model strengths with agent responsibilities.
@@ -282,7 +253,6 @@ The specificity of your agent roles directly determines which LLM capabilities m
**Generic vs. Specific Role Impact on LLM Choice:** **Generic vs. Specific Role Impact on LLM Choice:**
When defining roles, think about the specific domain knowledge, working style, and decision-making frameworks that would be most valuable for the tasks the agent will handle. The more specific and contextual the role definition, the better the model can embody that role effectively. When defining roles, think about the specific domain knowledge, working style, and decision-making frameworks that would be most valuable for the tasks the agent will handle. The more specific and contextual the role definition, the better the model can embody that role effectively.
```python ```python
# ✅ Specific role - clear LLM requirements # ✅ Specific role - clear LLM requirements
specific_agent = Agent( specific_agent = Agent(
@@ -303,8 +273,7 @@ specific_agent = Agent(
### b. Backstory as Model Context Amplifier ### b. Backstory as Model Context Amplifier
<Info> <Info>
Strategic backstories multiply your chosen LLM's effectiveness by providing Strategic backstories multiply your chosen LLM's effectiveness by providing domain-specific context that generic prompting cannot achieve.
domain-specific context that generic prompting cannot achieve.
</Info> </Info>
A well-crafted backstory transforms your LLM choice from generic capability to specialized expertise. This is especially crucial for cost optimization - a well-contextualized efficient model can outperform a premium model without proper context. A well-crafted backstory transforms your LLM choice from generic capability to specialized expertise. This is especially crucial for cost optimization - a well-contextualized efficient model can outperform a premium model without proper context.
@@ -331,7 +300,6 @@ domain_expert = Agent(
``` ```
**Backstory Elements That Enhance LLM Performance:** **Backstory Elements That Enhance LLM Performance:**
- **Domain Experience**: "10+ years in enterprise SaaS sales" - **Domain Experience**: "10+ years in enterprise SaaS sales"
- **Specific Expertise**: "Specializes in technical due diligence for Series B+ rounds" - **Specific Expertise**: "Specializes in technical due diligence for Series B+ rounds"
- **Working Style**: "Prefers data-driven decisions with clear documentation" - **Working Style**: "Prefers data-driven decisions with clear documentation"
@@ -364,7 +332,6 @@ tech_writer = Agent(
``` ```
**Alignment Checklist:** **Alignment Checklist:**
- ✅ **Role Specificity**: Clear domain and responsibilities - ✅ **Role Specificity**: Clear domain and responsibilities
- ✅ **LLM Match**: Model strengths align with role requirements - ✅ **LLM Match**: Model strengths align with role requirements
- ✅ **Backstory Depth**: Provides domain context the LLM can leverage - ✅ **Backstory Depth**: Provides domain context the LLM can leverage
@@ -386,7 +353,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
- Are any agents heavily tool-dependent? - Are any agents heavily tool-dependent?
**Action**: Document current agent roles and identify optimization opportunities. **Action**: Document current agent roles and identify optimization opportunities.
</Step> </Step>
<Step title="Implement Crew-Level Strategy" icon="users-gear"> <Step title="Implement Crew-Level Strategy" icon="users-gear">
@@ -403,7 +369,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
``` ```
**Action**: Establish your crew's default LLM before optimizing individual agents. **Action**: Establish your crew's default LLM before optimizing individual agents.
</Step> </Step>
<Step title="Optimize High-Impact Agents" icon="star"> <Step title="Optimize High-Impact Agents" icon="star">
@@ -425,7 +390,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
``` ```
**Action**: Upgrade 20% of your agents that handle 80% of the complexity. **Action**: Upgrade 20% of your agents that handle 80% of the complexity.
</Step> </Step>
<Step title="Validate with Enterprise Testing" icon="test-tube"> <Step title="Validate with Enterprise Testing" icon="test-tube">
@@ -436,7 +400,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
- Share results with your team for collaborative decision-making - Share results with your team for collaborative decision-making
**Action**: Replace guesswork with data-driven validation using the testing platform. **Action**: Replace guesswork with data-driven validation using the testing platform.
</Step> </Step>
</Steps> </Steps>
@@ -449,7 +412,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
Consider reasoning models for business strategy development, complex data analysis that requires drawing insights from multiple sources, multi-step problem solving where each step depends on previous analysis, and strategic planning tasks that require considering multiple variables and their interactions. Consider reasoning models for business strategy development, complex data analysis that requires drawing insights from multiple sources, multi-step problem solving where each step depends on previous analysis, and strategic planning tasks that require considering multiple variables and their interactions.
However, reasoning models often come with higher costs and slower response times, so they're best reserved for tasks where their sophisticated capabilities provide genuine value rather than being used for simple operations that don't require complex reasoning. However, reasoning models often come with higher costs and slower response times, so they're best reserved for tasks where their sophisticated capabilities provide genuine value rather than being used for simple operations that don't require complex reasoning.
</Tab> </Tab>
<Tab title="Creative Models"> <Tab title="Creative Models">
@@ -458,7 +420,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
Use creative models for blog post writing and article creation, marketing copy that needs to engage and persuade, creative storytelling and narrative development, and brand communications where voice and tone are crucial. These models often understand nuance and context better than general purpose alternatives. Use creative models for blog post writing and article creation, marketing copy that needs to engage and persuade, creative storytelling and narrative development, and brand communications where voice and tone are crucial. These models often understand nuance and context better than general purpose alternatives.
Creative models may be less suitable for technical or analytical tasks where precision and factual accuracy are more important than engagement and style. They're best used when the creative and communicative aspects of the output are primary success factors. Creative models may be less suitable for technical or analytical tasks where precision and factual accuracy are more important than engagement and style. They're best used when the creative and communicative aspects of the output are primary success factors.
</Tab> </Tab>
<Tab title="Efficient Models"> <Tab title="Efficient Models">
@@ -467,7 +428,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
Consider efficient models for data processing and transformation tasks, simple formatting and organization operations, function calling and tool usage where precision matters more than sophistication, and high-volume operations where cost per operation is a significant factor. Consider efficient models for data processing and transformation tasks, simple formatting and organization operations, function calling and tool usage where precision matters more than sophistication, and high-volume operations where cost per operation is a significant factor.
The key with efficient models is ensuring that their capabilities align with task requirements. They can handle many routine operations effectively but may struggle with tasks requiring nuanced understanding, complex reasoning, or sophisticated content generation. The key with efficient models is ensuring that their capabilities align with task requirements. They can handle many routine operations effectively but may struggle with tasks requiring nuanced understanding, complex reasoning, or sophisticated content generation.
</Tab> </Tab>
<Tab title="Open Source Models"> <Tab title="Open Source Models">
@@ -476,7 +436,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
Consider open source models for internal company tools where data privacy is paramount, privacy-sensitive applications that can't use external APIs, cost-optimized deployments where per-token pricing is prohibitive, and situations requiring custom model modifications or fine-tuning. Consider open source models for internal company tools where data privacy is paramount, privacy-sensitive applications that can't use external APIs, cost-optimized deployments where per-token pricing is prohibitive, and situations requiring custom model modifications or fine-tuning.
However, open source models require more technical expertise to deploy and maintain effectively. Consider the total cost of ownership including infrastructure, technical overhead, and ongoing maintenance when evaluating open source options. However, open source models require more technical expertise to deploy and maintain effectively. Consider the total cost of ownership including infrastructure, technical overhead, and ongoing maintenance when evaluating open source options.
</Tab> </Tab>
</Tabs> </Tabs>
@@ -496,7 +455,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
# Processing agent gets efficient model # Processing agent gets efficient model
processor = Agent(role="Data Processor", llm=LLM(model="gpt-4o-mini")) processor = Agent(role="Data Processor", llm=LLM(model="gpt-4o-mini"))
``` ```
</Accordion> </Accordion>
<Accordion title="Ignoring Crew-Level vs Agent-Level LLM Hierarchy" icon="shuffle"> <Accordion title="Ignoring Crew-Level vs Agent-Level LLM Hierarchy" icon="shuffle">
@@ -516,7 +474,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
# Agents inherit crew LLM unless specifically overridden # Agents inherit crew LLM unless specifically overridden
agent1 = Agent(llm=LLM(model="claude-3-5-sonnet")) # Override for specific needs agent1 = Agent(llm=LLM(model="claude-3-5-sonnet")) # Override for specific needs
``` ```
</Accordion> </Accordion>
<Accordion title="Function Calling Model Mismatch" icon="screwdriver-wrench"> <Accordion title="Function Calling Model Mismatch" icon="screwdriver-wrench">
@@ -535,7 +492,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
llm=LLM(model="claude-3-5-sonnet") # Also strong with tools llm=LLM(model="claude-3-5-sonnet") # Also strong with tools
) )
``` ```
</Accordion> </Accordion>
<Accordion title="Premature Optimization Without Testing" icon="gear"> <Accordion title="Premature Optimization Without Testing" icon="gear">
@@ -551,7 +507,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
# Test performance, then optimize specific agents as needed # Test performance, then optimize specific agents as needed
# Use Enterprise platform testing to validate improvements # Use Enterprise platform testing to validate improvements
``` ```
</Accordion> </Accordion>
<Accordion title="Overlooking Context and Memory Limitations" icon="brain"> <Accordion title="Overlooking Context and Memory Limitations" icon="brain">
@@ -560,7 +515,6 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
**Real Example**: Using a short-context model for agents that need to maintain conversation history across multiple task iterations, or in crews with extensive agent-to-agent communication. **Real Example**: Using a short-context model for agents that need to maintain conversation history across multiple task iterations, or in crews with extensive agent-to-agent communication.
**CrewAI Solution**: Match context capabilities to crew communication patterns. **CrewAI Solution**: Match context capabilities to crew communication patterns.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -568,35 +522,21 @@ Rather than repeating the strategic framework, here's a tactical checklist for i
<Steps> <Steps>
<Step title="Start Simple" icon="play"> <Step title="Start Simple" icon="play">
Begin with reliable, general-purpose models that are well-understood and Begin with reliable, general-purpose models that are well-understood and widely supported. This provides a stable foundation for understanding your specific requirements and performance expectations before optimizing for specialized needs.
widely supported. This provides a stable foundation for understanding your
specific requirements and performance expectations before optimizing for
specialized needs.
</Step> </Step>
<Step title="Measure What Matters" icon="chart-line"> <Step title="Measure What Matters" icon="chart-line">
Develop metrics that align with your specific use case and business Develop metrics that align with your specific use case and business requirements rather than relying solely on general benchmarks. Focus on measuring outcomes that directly impact your success rather than theoretical performance indicators.
requirements rather than relying solely on general benchmarks. Focus on
measuring outcomes that directly impact your success rather than theoretical
performance indicators.
</Step> </Step>
<Step title="Iterate Based on Results" icon="arrows-rotate"> <Step title="Iterate Based on Results" icon="arrows-rotate">
Make model changes based on observed performance in your specific context Make model changes based on observed performance in your specific context rather than theoretical considerations or general recommendations. Real-world performance often differs significantly from benchmark results or general reputation.
rather than theoretical considerations or general recommendations.
Real-world performance often differs significantly from benchmark results or
general reputation.
</Step> </Step>
<Step title="Consider Total Cost" icon="calculator"> <Step title="Consider Total Cost" icon="calculator">
Evaluate the complete cost of ownership including model costs, development Evaluate the complete cost of ownership including model costs, development time, maintenance overhead, and operational complexity. The cheapest model per token may not be the most cost-effective choice when considering all factors.
time, maintenance overhead, and operational complexity. The cheapest model
per token may not be the most cost-effective choice when considering all
factors.
</Step> </Step>
</Steps> </Steps>
<Tip> <Tip>
Focus on understanding your requirements first, then select models that best Focus on understanding your requirements first, then select models that best match those needs. The best LLM choice is the one that consistently delivers the results you need within your operational constraints.
match those needs. The best LLM choice is the one that consistently delivers
the results you need within your operational constraints.
</Tip> </Tip>
### Enterprise-Grade Model Validation ### Enterprise-Grade Model Validation
@@ -622,9 +562,7 @@ For teams serious about optimizing their LLM selection, the **CrewAI AMP platfor
Go to [app.crewai.com](https://app.crewai.com) to get started! Go to [app.crewai.com](https://app.crewai.com) to get started!
<Info> <Info>
The Enterprise platform transforms model selection from guesswork into a The Enterprise platform transforms model selection from guesswork into a data-driven process, enabling you to validate the principles in this guide with your actual use cases and requirements.
data-driven process, enabling you to validate the principles in this guide
with your actual use cases and requirements.
</Info> </Info>
## Key Principles Summary ## Key Principles Summary
@@ -634,27 +572,21 @@ Go to [app.crewai.com](https://app.crewai.com) to get started!
Choose models based on what the task actually requires, not theoretical capabilities or general reputation. Choose models based on what the task actually requires, not theoretical capabilities or general reputation.
</Card> </Card>
{" "} <Card title="Capability Matching" icon="puzzle-piece">
<Card title="Capability Matching" icon="puzzle-piece"> Align model strengths with agent roles and responsibilities for optimal performance.
Align model strengths with agent roles and responsibilities for optimal </Card>
performance.
</Card>
{" "} <Card title="Strategic Consistency" icon="link">
<Card title="Strategic Consistency" icon="link"> Maintain coherent model selection strategy across related components and workflows.
Maintain coherent model selection strategy across related components and </Card>
workflows.
</Card>
{" "} <Card title="Practical Testing" icon="flask">
<Card title="Practical Testing" icon="flask"> Validate choices through real-world usage rather than benchmarks alone.
Validate choices through real-world usage rather than benchmarks alone. </Card>
</Card>
{" "} <Card title="Iterative Improvement" icon="arrow-up">
<Card title="Iterative Improvement" icon="arrow-up"> Start simple and optimize based on actual performance and needs.
Start simple and optimize based on actual performance and needs. </Card>
</Card>
<Card title="Operational Balance" icon="scale-balanced"> <Card title="Operational Balance" icon="scale-balanced">
Balance performance requirements with cost and complexity constraints. Balance performance requirements with cost and complexity constraints.
@@ -662,20 +594,13 @@ Go to [app.crewai.com](https://app.crewai.com) to get started!
</CardGroup> </CardGroup>
<Check> <Check>
Remember: The best LLM choice is the one that consistently delivers the Remember: The best LLM choice is the one that consistently delivers the results you need within your operational constraints. Focus on understanding your requirements first, then select models that best match those needs.
results you need within your operational constraints. Focus on understanding
your requirements first, then select models that best match those needs.
</Check> </Check>
## Current Model Landscape (June 2025) ## Current Model Landscape (June 2025)
<Warning> <Warning>
**Snapshot in Time**: The following model rankings represent current **Snapshot in Time**: The following model rankings represent current leaderboard standings as of June 2025, compiled from [LMSys Arena](https://arena.lmsys.org/), [Artificial Analysis](https://artificialanalysis.ai/), and other leading benchmarks. LLM performance, availability, and pricing change rapidly. Always conduct your own evaluations with your specific use cases and data.
leaderboard standings as of June 2025, compiled from [LMSys
Arena](https://arena.lmsys.org/), [Artificial
Analysis](https://artificialanalysis.ai/), and other leading benchmarks. LLM
performance, availability, and pricing change rapidly. Always conduct your own
evaluations with your specific use cases and data.
</Warning> </Warning>
### Leading Models by Category ### Leading Models by Category
@@ -683,10 +608,7 @@ Go to [app.crewai.com](https://app.crewai.com) to get started!
The tables below show a representative sample of current top-performing models across different categories, with guidance on their suitability for CrewAI agents: The tables below show a representative sample of current top-performing models across different categories, with guidance on their suitability for CrewAI agents:
<Note> <Note>
These tables/metrics showcase selected leading models in each category and are These tables/metrics showcase selected leading models in each category and are not exhaustive. Many excellent models exist beyond those listed here. The goal is to illustrate the types of capabilities to look for rather than provide a complete catalog.
not exhaustive. Many excellent models exist beyond those listed here. The goal
is to illustrate the types of capabilities to look for rather than provide a
complete catalog.
</Note> </Note>
<Tabs> <Tabs>
@@ -702,7 +624,6 @@ The tables below show a representative sample of current top-performing models a
| **Qwen3 235B (Reasoning)** | 62 | $2.63 | Moderate | Open-source alternative for reasoning tasks | | **Qwen3 235B (Reasoning)** | 62 | $2.63 | Moderate | Open-source alternative for reasoning tasks |
These models excel at multi-step reasoning and are ideal for agents that need to develop strategies, coordinate other agents, or analyze complex information. These models excel at multi-step reasoning and are ideal for agents that need to develop strategies, coordinate other agents, or analyze complex information.
</Tab> </Tab>
<Tab title="Coding & Technical"> <Tab title="Coding & Technical">
@@ -717,7 +638,6 @@ The tables below show a representative sample of current top-performing models a
| **Llama 3.1 405B** | Good | 81.1% | $3.50 | Function calling LLM for tool-heavy workflows | | **Llama 3.1 405B** | Good | 81.1% | $3.50 | Function calling LLM for tool-heavy workflows |
These models are optimized for code generation, debugging, and technical problem-solving, making them ideal for development-focused crews. These models are optimized for code generation, debugging, and technical problem-solving, making them ideal for development-focused crews.
</Tab> </Tab>
<Tab title="Speed & Efficiency"> <Tab title="Speed & Efficiency">
@@ -732,7 +652,6 @@ The tables below show a representative sample of current top-performing models a
| **Nova Micro** | High | 0.30s | $0.04 | Simple, fast task execution | | **Nova Micro** | High | 0.30s | $0.04 | Simple, fast task execution |
These models prioritize speed and efficiency, perfect for agents handling routine operations or requiring quick responses. **Pro tip**: Pairing these models with fast inference providers like Groq can achieve even better performance, especially for open-source models like Llama. These models prioritize speed and efficiency, perfect for agents handling routine operations or requiring quick responses. **Pro tip**: Pairing these models with fast inference providers like Groq can achieve even better performance, especially for open-source models like Llama.
</Tab> </Tab>
<Tab title="Balanced Performance"> <Tab title="Balanced Performance">
@@ -747,7 +666,6 @@ The tables below show a representative sample of current top-performing models a
| **Qwen3 32B** | 44 | Good | $1.23 | Budget-friendly versatility | | **Qwen3 32B** | 44 | Good | $1.23 | Budget-friendly versatility |
These models offer good performance across multiple dimensions, suitable for crews with diverse task requirements. These models offer good performance across multiple dimensions, suitable for crews with diverse task requirements.
</Tab> </Tab>
</Tabs> </Tabs>
@@ -758,28 +676,24 @@ The tables below show a representative sample of current top-performing models a
**When performance is the priority**: Use top-tier models like **o3**, **Gemini 2.5 Pro**, or **Claude 4 Sonnet** for manager LLMs and critical agents. These models excel at complex reasoning and coordination but come with higher costs. **When performance is the priority**: Use top-tier models like **o3**, **Gemini 2.5 Pro**, or **Claude 4 Sonnet** for manager LLMs and critical agents. These models excel at complex reasoning and coordination but come with higher costs.
**Strategy**: Implement a multi-model approach where premium models handle strategic thinking while efficient models handle routine operations. **Strategy**: Implement a multi-model approach where premium models handle strategic thinking while efficient models handle routine operations.
</Accordion> </Accordion>
<Accordion title="Cost-Conscious Crews" icon="dollar-sign"> <Accordion title="Cost-Conscious Crews" icon="dollar-sign">
**When budget is a primary constraint**: Focus on models like **DeepSeek R1**, **Llama 4 Scout**, or **Gemini 2.0 Flash**. These provide strong performance at significantly lower costs. **When budget is a primary constraint**: Focus on models like **DeepSeek R1**, **Llama 4 Scout**, or **Gemini 2.0 Flash**. These provide strong performance at significantly lower costs.
**Strategy**: Use cost-effective models for most agents, reserving premium models only for the most critical decision-making roles. **Strategy**: Use cost-effective models for most agents, reserving premium models only for the most critical decision-making roles.
</Accordion> </Accordion>
<Accordion title="Specialized Workflows" icon="screwdriver-wrench"> <Accordion title="Specialized Workflows" icon="screwdriver-wrench">
**For specific domain expertise**: Choose models optimized for your primary use case. **Claude 4** series for coding, **Gemini 2.5 Pro** for research, **Llama 405B** for function calling. **For specific domain expertise**: Choose models optimized for your primary use case. **Claude 4** series for coding, **Gemini 2.5 Pro** for research, **Llama 405B** for function calling.
**Strategy**: Select models based on your crew's primary function, ensuring the core capability aligns with model strengths. **Strategy**: Select models based on your crew's primary function, ensuring the core capability aligns with model strengths.
</Accordion> </Accordion>
<Accordion title="Enterprise & Privacy" icon="shield"> <Accordion title="Enterprise & Privacy" icon="shield">
**For data-sensitive operations**: Consider open-source models like **Llama 4** series, **DeepSeek V3**, or **Qwen3** that can be deployed locally while maintaining competitive performance. **For data-sensitive operations**: Consider open-source models like **Llama 4** series, **DeepSeek V3**, or **Qwen3** that can be deployed locally while maintaining competitive performance.
**Strategy**: Deploy open-source models on private infrastructure, accepting potential performance trade-offs for data control. **Strategy**: Deploy open-source models on private infrastructure, accepting potential performance trade-offs for data control.
</Accordion> </Accordion>
</AccordionGroup> </AccordionGroup>
@@ -792,10 +706,7 @@ The tables below show a representative sample of current top-performing models a
- **Open Source Viability**: The gap between open-source and proprietary models continues to narrow, with models like Llama 4 Maverick and DeepSeek V3 offering competitive performance at attractive price points. Fast inference providers particularly shine with open-source models, often delivering better speed-to-cost ratios than proprietary alternatives. - **Open Source Viability**: The gap between open-source and proprietary models continues to narrow, with models like Llama 4 Maverick and DeepSeek V3 offering competitive performance at attractive price points. Fast inference providers particularly shine with open-source models, often delivering better speed-to-cost ratios than proprietary alternatives.
<Info> <Info>
**Testing is Essential**: Leaderboard rankings provide general guidance, but **Testing is Essential**: Leaderboard rankings provide general guidance, but your specific use case, prompting style, and evaluation criteria may produce different results. Always test candidate models with your actual tasks and data before making final decisions.
your specific use case, prompting style, and evaluation criteria may produce
different results. Always test candidate models with your actual tasks and
data before making final decisions.
</Info> </Info>
### Practical Implementation Strategy ### Practical Implementation Strategy
@@ -805,20 +716,13 @@ The tables below show a representative sample of current top-performing models a
Begin with well-established models like **GPT-4.1**, **Claude 3.7 Sonnet**, or **Gemini 2.0 Flash** that offer good performance across multiple dimensions and have extensive real-world validation. Begin with well-established models like **GPT-4.1**, **Claude 3.7 Sonnet**, or **Gemini 2.0 Flash** that offer good performance across multiple dimensions and have extensive real-world validation.
</Step> </Step>
{" "} <Step title="Identify Specialized Needs">
<Step title="Identify Specialized Needs"> Determine if your crew has specific requirements (coding, reasoning, speed) that would benefit from specialized models like **Claude 4 Sonnet** for development or **o3** for complex analysis. For speed-critical applications, consider fast inference providers like **Groq** alongside model selection.
Determine if your crew has specific requirements (coding, reasoning, speed) </Step>
that would benefit from specialized models like **Claude 4 Sonnet** for
development or **o3** for complex analysis. For speed-critical applications,
consider fast inference providers like **Groq** alongside model selection.
</Step>
{" "} <Step title="Implement Multi-Model Strategy">
<Step title="Implement Multi-Model Strategy"> Use different models for different agents based on their roles. High-capability models for managers and complex tasks, efficient models for routine operations.
Use different models for different agents based on their roles. </Step>
High-capability models for managers and complex tasks, efficient models for
routine operations.
</Step>
<Step title="Monitor and Optimize"> <Step title="Monitor and Optimize">
Track performance metrics relevant to your use case and be prepared to adjust model selections as new models are released or pricing changes. Track performance metrics relevant to your use case and be prepared to adjust model selections as new models are released or pricing changes.

View File

@@ -1,356 +0,0 @@
---
title: Streaming Crew Execution
description: Stream real-time output from your CrewAI crew execution
icon: wave-pulse
mode: "wide"
---
## Introduction
CrewAI provides the ability to stream real-time output during crew execution, allowing you to display results as they're generated rather than waiting for the entire process to complete. This feature is particularly useful for building interactive applications, providing user feedback, and monitoring long-running processes.
## How Streaming Works
When streaming is enabled, CrewAI captures LLM responses and tool calls as they happen, packaging them into structured chunks that include context about which task and agent is executing. You can iterate over these chunks in real-time and access the final result once execution completes.
## Enabling Streaming
To enable streaming, set the `stream` parameter to `True` when creating your crew:
```python Code
from crewai import Agent, Crew, Task
# Create your agents and tasks
researcher = Agent(
role="Research Analyst",
goal="Gather comprehensive information on topics",
backstory="You are an experienced researcher with excellent analytical skills.",
)
task = Task(
description="Research the latest developments in AI",
expected_output="A detailed report on recent AI advancements",
agent=researcher,
)
# Enable streaming
crew = Crew(
agents=[researcher],
tasks=[task],
stream=True # Enable streaming output
)
```
## Synchronous Streaming
When you call `kickoff()` on a crew with streaming enabled, it returns a `CrewStreamingOutput` object that you can iterate over to receive chunks as they arrive:
```python Code
# Start streaming execution
streaming = crew.kickoff(inputs={"topic": "artificial intelligence"})
# Iterate over chunks as they arrive
for chunk in streaming:
print(chunk.content, end="", flush=True)
# Access the final result after streaming completes
result = streaming.result
print(f"\n\nFinal output: {result.raw}")
```
### Stream Chunk Information
Each chunk provides rich context about the execution:
```python Code
streaming = crew.kickoff(inputs={"topic": "AI"})
for chunk in streaming:
print(f"Task: {chunk.task_name} (index {chunk.task_index})")
print(f"Agent: {chunk.agent_role}")
print(f"Content: {chunk.content}")
print(f"Type: {chunk.chunk_type}") # TEXT or TOOL_CALL
if chunk.tool_call:
print(f"Tool: {chunk.tool_call.tool_name}")
print(f"Arguments: {chunk.tool_call.arguments}")
```
### Accessing Streaming Results
The `CrewStreamingOutput` object provides several useful properties:
```python Code
streaming = crew.kickoff(inputs={"topic": "AI"})
# Iterate and collect chunks
for chunk in streaming:
print(chunk.content, end="", flush=True)
# After iteration completes
print(f"\nCompleted: {streaming.is_completed}")
print(f"Full text: {streaming.get_full_text()}")
print(f"All chunks: {len(streaming.chunks)}")
print(f"Final result: {streaming.result.raw}")
```
## Asynchronous Streaming
For async applications, you can use either `akickoff()` (native async) or `kickoff_async()` (thread-based) with async iteration:
### Native Async with `akickoff()`
The `akickoff()` method provides true native async execution throughout the entire chain:
```python Code
import asyncio
async def stream_crew():
crew = Crew(
agents=[researcher],
tasks=[task],
stream=True
)
# Start native async streaming
streaming = await crew.akickoff(inputs={"topic": "AI"})
# Async iteration over chunks
async for chunk in streaming:
print(chunk.content, end="", flush=True)
# Access final result
result = streaming.result
print(f"\n\nFinal output: {result.raw}")
asyncio.run(stream_crew())
```
### Thread-Based Async with `kickoff_async()`
For simpler async integration or backward compatibility:
```python Code
import asyncio
async def stream_crew():
crew = Crew(
agents=[researcher],
tasks=[task],
stream=True
)
# Start thread-based async streaming
streaming = await crew.kickoff_async(inputs={"topic": "AI"})
# Async iteration over chunks
async for chunk in streaming:
print(chunk.content, end="", flush=True)
# Access final result
result = streaming.result
print(f"\n\nFinal output: {result.raw}")
asyncio.run(stream_crew())
```
<Note>
For high-concurrency workloads, `akickoff()` is recommended as it uses native async for task execution, memory operations, and knowledge retrieval. See the [Kickoff Crew Asynchronously](/en/learn/kickoff-async) guide for more details.
</Note>
## Streaming with kickoff_for_each
When executing a crew for multiple inputs with `kickoff_for_each()`, streaming works differently depending on whether you use sync or async:
### Synchronous kickoff_for_each
With synchronous `kickoff_for_each()`, you get a list of `CrewStreamingOutput` objects, one for each input:
```python Code
crew = Crew(
agents=[researcher],
tasks=[task],
stream=True
)
inputs_list = [
{"topic": "AI in healthcare"},
{"topic": "AI in finance"}
]
# Returns list of streaming outputs
streaming_outputs = crew.kickoff_for_each(inputs=inputs_list)
# Iterate over each streaming output
for i, streaming in enumerate(streaming_outputs):
print(f"\n=== Input {i + 1} ===")
for chunk in streaming:
print(chunk.content, end="", flush=True)
result = streaming.result
print(f"\n\nResult {i + 1}: {result.raw}")
```
### Asynchronous kickoff_for_each_async
With async `kickoff_for_each_async()`, you get a single `CrewStreamingOutput` that yields chunks from all crews as they arrive concurrently:
```python Code
import asyncio
async def stream_multiple_crews():
crew = Crew(
agents=[researcher],
tasks=[task],
stream=True
)
inputs_list = [
{"topic": "AI in healthcare"},
{"topic": "AI in finance"}
]
# Returns single streaming output for all crews
streaming = await crew.kickoff_for_each_async(inputs=inputs_list)
# Chunks from all crews arrive as they're generated
async for chunk in streaming:
print(f"[{chunk.task_name}] {chunk.content}", end="", flush=True)
# Access all results
results = streaming.results # List of CrewOutput objects
for i, result in enumerate(results):
print(f"\n\nResult {i + 1}: {result.raw}")
asyncio.run(stream_multiple_crews())
```
## Stream Chunk Types
Chunks can be of different types, indicated by the `chunk_type` field:
### TEXT Chunks
Standard text content from LLM responses:
```python Code
for chunk in streaming:
if chunk.chunk_type == StreamChunkType.TEXT:
print(chunk.content, end="", flush=True)
```
### TOOL_CALL Chunks
Information about tool calls being made:
```python Code
for chunk in streaming:
if chunk.chunk_type == StreamChunkType.TOOL_CALL:
print(f"\nCalling tool: {chunk.tool_call.tool_name}")
print(f"Arguments: {chunk.tool_call.arguments}")
```
## Practical Example: Building a UI with Streaming
Here's a complete example showing how to build an interactive application with streaming:
```python Code
import asyncio
from crewai import Agent, Crew, Task
from crewai.types.streaming import StreamChunkType
async def interactive_research():
# Create crew with streaming enabled
researcher = Agent(
role="Research Analyst",
goal="Provide detailed analysis on any topic",
backstory="You are an expert researcher with broad knowledge.",
)
task = Task(
description="Research and analyze: {topic}",
expected_output="A comprehensive analysis with key insights",
agent=researcher,
)
crew = Crew(
agents=[researcher],
tasks=[task],
stream=True,
verbose=False
)
# Get user input
topic = input("Enter a topic to research: ")
print(f"\n{'='*60}")
print(f"Researching: {topic}")
print(f"{'='*60}\n")
# Start streaming execution
streaming = await crew.kickoff_async(inputs={"topic": topic})
current_task = ""
async for chunk in streaming:
# Show task transitions
if chunk.task_name != current_task:
current_task = chunk.task_name
print(f"\n[{chunk.agent_role}] Working on: {chunk.task_name}")
print("-" * 60)
# Display text chunks
if chunk.chunk_type == StreamChunkType.TEXT:
print(chunk.content, end="", flush=True)
# Display tool calls
elif chunk.chunk_type == StreamChunkType.TOOL_CALL and chunk.tool_call:
print(f"\n🔧 Using tool: {chunk.tool_call.tool_name}")
# Show final result
result = streaming.result
print(f"\n\n{'='*60}")
print("Analysis Complete!")
print(f"{'='*60}")
print(f"\nToken Usage: {result.token_usage}")
asyncio.run(interactive_research())
```
## Use Cases
Streaming is particularly valuable for:
- **Interactive Applications**: Provide real-time feedback to users as agents work
- **Long-Running Tasks**: Show progress for research, analysis, or content generation
- **Debugging and Monitoring**: Observe agent behavior and decision-making in real-time
- **User Experience**: Reduce perceived latency by showing incremental results
- **Live Dashboards**: Build monitoring interfaces that display crew execution status
## Important Notes
- Streaming automatically enables LLM streaming for all agents in the crew
- You must iterate through all chunks before accessing the `.result` property
- For `kickoff_for_each_async()` with streaming, use `.results` (plural) to get all outputs
- Streaming adds minimal overhead and can actually improve perceived performance
- Each chunk includes full context (task, agent, chunk type) for rich UIs
## Error Handling
Handle errors during streaming execution:
```python Code
streaming = crew.kickoff(inputs={"topic": "AI"})
try:
for chunk in streaming:
print(chunk.content, end="", flush=True)
result = streaming.result
print(f"\nSuccess: {result.raw}")
except Exception as e:
print(f"\nError during streaming: {e}")
if streaming.is_completed:
print("Streaming completed but an error occurred")
```
By leveraging streaming, you can build more responsive and interactive applications with CrewAI, providing users with real-time visibility into agent execution and results.

View File

@@ -1,450 +0,0 @@
---
title: Streaming Flow Execution
description: Stream real-time output from your CrewAI flow execution
icon: wave-pulse
mode: "wide"
---
## Introduction
CrewAI Flows support streaming output, allowing you to receive real-time updates as your flow executes. This feature enables you to build responsive applications that display results incrementally, provide live progress updates, and create better user experiences for long-running workflows.
## How Flow Streaming Works
When streaming is enabled on a Flow, CrewAI captures and streams output from any crews or LLM calls within the flow. The stream delivers structured chunks containing the content, task context, and agent information as execution progresses.
## Enabling Streaming
To enable streaming, set the `stream` attribute to `True` on your Flow class:
```python Code
from crewai.flow.flow import Flow, listen, start
from crewai import Agent, Crew, Task
class ResearchFlow(Flow):
stream = True # Enable streaming for the entire flow
@start()
def initialize(self):
return {"topic": "AI trends"}
@listen(initialize)
def research_topic(self, data):
researcher = Agent(
role="Research Analyst",
goal="Research topics thoroughly",
backstory="Expert researcher with analytical skills",
)
task = Task(
description="Research {topic} and provide insights",
expected_output="Detailed research findings",
agent=researcher,
)
crew = Crew(
agents=[researcher],
tasks=[task],
)
return crew.kickoff(inputs=data)
```
## Synchronous Streaming
When you call `kickoff()` on a flow with streaming enabled, it returns a `FlowStreamingOutput` object that you can iterate over:
```python Code
flow = ResearchFlow()
# Start streaming execution
streaming = flow.kickoff()
# Iterate over chunks as they arrive
for chunk in streaming:
print(chunk.content, end="", flush=True)
# Access the final result after streaming completes
result = streaming.result
print(f"\n\nFinal output: {result}")
```
### Stream Chunk Information
Each chunk provides context about where it originated in the flow:
```python Code
streaming = flow.kickoff()
for chunk in streaming:
print(f"Agent: {chunk.agent_role}")
print(f"Task: {chunk.task_name}")
print(f"Content: {chunk.content}")
print(f"Type: {chunk.chunk_type}") # TEXT or TOOL_CALL
```
### Accessing Streaming Properties
The `FlowStreamingOutput` object provides useful properties and methods:
```python Code
streaming = flow.kickoff()
# Iterate and collect chunks
for chunk in streaming:
print(chunk.content, end="", flush=True)
# After iteration completes
print(f"\nCompleted: {streaming.is_completed}")
print(f"Full text: {streaming.get_full_text()}")
print(f"Total chunks: {len(streaming.chunks)}")
print(f"Final result: {streaming.result}")
```
## Asynchronous Streaming
For async applications, use `kickoff_async()` with async iteration:
```python Code
import asyncio
async def stream_flow():
flow = ResearchFlow()
# Start async streaming
streaming = await flow.kickoff_async()
# Async iteration over chunks
async for chunk in streaming:
print(chunk.content, end="", flush=True)
# Access final result
result = streaming.result
print(f"\n\nFinal output: {result}")
asyncio.run(stream_flow())
```
## Streaming with Multi-Step Flows
Streaming works seamlessly across multiple flow steps, including flows that execute multiple crews:
```python Code
from crewai.flow.flow import Flow, listen, start
from crewai import Agent, Crew, Task
class MultiStepFlow(Flow):
stream = True
@start()
def research_phase(self):
"""First crew: Research the topic."""
researcher = Agent(
role="Research Analyst",
goal="Gather comprehensive information",
backstory="Expert at finding relevant information",
)
task = Task(
description="Research AI developments in healthcare",
expected_output="Research findings on AI in healthcare",
agent=researcher,
)
crew = Crew(agents=[researcher], tasks=[task])
result = crew.kickoff()
self.state["research"] = result.raw
return result.raw
@listen(research_phase)
def analysis_phase(self, research_data):
"""Second crew: Analyze the research."""
analyst = Agent(
role="Data Analyst",
goal="Analyze information and extract insights",
backstory="Expert at identifying patterns and trends",
)
task = Task(
description="Analyze this research: {research}",
expected_output="Key insights and trends",
agent=analyst,
)
crew = Crew(agents=[analyst], tasks=[task])
return crew.kickoff(inputs={"research": research_data})
# Stream across both phases
flow = MultiStepFlow()
streaming = flow.kickoff()
current_step = ""
for chunk in streaming:
# Track which flow step is executing
if chunk.task_name != current_step:
current_step = chunk.task_name
print(f"\n\n=== {chunk.task_name} ===\n")
print(chunk.content, end="", flush=True)
result = streaming.result
print(f"\n\nFinal analysis: {result}")
```
## Practical Example: Progress Dashboard
Here's a complete example showing how to build a progress dashboard with streaming:
```python Code
import asyncio
from crewai.flow.flow import Flow, listen, start
from crewai import Agent, Crew, Task
from crewai.types.streaming import StreamChunkType
class ResearchPipeline(Flow):
stream = True
@start()
def gather_data(self):
researcher = Agent(
role="Data Gatherer",
goal="Collect relevant information",
backstory="Skilled at finding quality sources",
)
task = Task(
description="Gather data on renewable energy trends",
expected_output="Collection of relevant data points",
agent=researcher,
)
crew = Crew(agents=[researcher], tasks=[task])
result = crew.kickoff()
self.state["data"] = result.raw
return result.raw
@listen(gather_data)
def analyze_data(self, data):
analyst = Agent(
role="Data Analyst",
goal="Extract meaningful insights",
backstory="Expert at data analysis",
)
task = Task(
description="Analyze: {data}",
expected_output="Key insights and trends",
agent=analyst,
)
crew = Crew(agents=[analyst], tasks=[task])
return crew.kickoff(inputs={"data": data})
async def run_with_dashboard():
flow = ResearchPipeline()
print("="*60)
print("RESEARCH PIPELINE DASHBOARD")
print("="*60)
streaming = await flow.kickoff_async()
current_agent = ""
current_task = ""
chunk_count = 0
async for chunk in streaming:
chunk_count += 1
# Display phase transitions
if chunk.task_name != current_task:
current_task = chunk.task_name
current_agent = chunk.agent_role
print(f"\n\n📋 Phase: {current_task}")
print(f"👤 Agent: {current_agent}")
print("-" * 60)
# Display text output
if chunk.chunk_type == StreamChunkType.TEXT:
print(chunk.content, end="", flush=True)
# Display tool usage
elif chunk.chunk_type == StreamChunkType.TOOL_CALL and chunk.tool_call:
print(f"\n🔧 Tool: {chunk.tool_call.tool_name}")
# Show completion summary
result = streaming.result
print(f"\n\n{'='*60}")
print("PIPELINE COMPLETE")
print(f"{'='*60}")
print(f"Total chunks: {chunk_count}")
print(f"Final output length: {len(str(result))} characters")
asyncio.run(run_with_dashboard())
```
## Streaming with State Management
Streaming works naturally with Flow state management:
```python Code
from pydantic import BaseModel
class AnalysisState(BaseModel):
topic: str = ""
research: str = ""
insights: str = ""
class StatefulStreamingFlow(Flow[AnalysisState]):
stream = True
@start()
def research(self):
# State is available during streaming
topic = self.state.topic
print(f"Researching: {topic}")
researcher = Agent(
role="Researcher",
goal="Research topics thoroughly",
backstory="Expert researcher",
)
task = Task(
description=f"Research {topic}",
expected_output="Research findings",
agent=researcher,
)
crew = Crew(agents=[researcher], tasks=[task])
result = crew.kickoff()
self.state.research = result.raw
return result.raw
@listen(research)
def analyze(self, research):
# Access updated state
print(f"Analyzing {len(self.state.research)} chars of research")
analyst = Agent(
role="Analyst",
goal="Extract insights",
backstory="Expert analyst",
)
task = Task(
description="Analyze: {research}",
expected_output="Key insights",
agent=analyst,
)
crew = Crew(agents=[analyst], tasks=[task])
result = crew.kickoff(inputs={"research": research})
self.state.insights = result.raw
return result.raw
# Run with streaming
flow = StatefulStreamingFlow()
streaming = flow.kickoff(inputs={"topic": "quantum computing"})
for chunk in streaming:
print(chunk.content, end="", flush=True)
result = streaming.result
print(f"\n\nFinal state:")
print(f"Topic: {flow.state.topic}")
print(f"Research length: {len(flow.state.research)}")
print(f"Insights length: {len(flow.state.insights)}")
```
## Use Cases
Flow streaming is particularly valuable for:
- **Multi-Stage Workflows**: Show progress across research, analysis, and synthesis phases
- **Complex Pipelines**: Provide visibility into long-running data processing flows
- **Interactive Applications**: Build responsive UIs that display intermediate results
- **Monitoring and Debugging**: Observe flow execution and crew interactions in real-time
- **Progress Tracking**: Show users which stage of the workflow is currently executing
- **Live Dashboards**: Create monitoring interfaces for production flows
## Stream Chunk Types
Like crew streaming, flow chunks can be of different types:
### TEXT Chunks
Standard text content from LLM responses:
```python Code
for chunk in streaming:
if chunk.chunk_type == StreamChunkType.TEXT:
print(chunk.content, end="", flush=True)
```
### TOOL_CALL Chunks
Information about tool calls within the flow:
```python Code
for chunk in streaming:
if chunk.chunk_type == StreamChunkType.TOOL_CALL and chunk.tool_call:
print(f"\nTool: {chunk.tool_call.tool_name}")
print(f"Args: {chunk.tool_call.arguments}")
```
## Error Handling
Handle errors gracefully during streaming:
```python Code
flow = ResearchFlow()
streaming = flow.kickoff()
try:
for chunk in streaming:
print(chunk.content, end="", flush=True)
result = streaming.result
print(f"\nSuccess! Result: {result}")
except Exception as e:
print(f"\nError during flow execution: {e}")
if streaming.is_completed:
print("Streaming completed but flow encountered an error")
```
## Important Notes
- Streaming automatically enables LLM streaming for any crews used within the flow
- You must iterate through all chunks before accessing the `.result` property
- Streaming works with both structured and unstructured flow state
- Flow streaming captures output from all crews and LLM calls in the flow
- Each chunk includes context about which agent and task generated it
- Streaming adds minimal overhead to flow execution
## Combining with Flow Visualization
You can combine streaming with flow visualization to provide a complete picture:
```python Code
# Generate flow visualization
flow = ResearchFlow()
flow.plot("research_flow") # Creates HTML visualization
# Run with streaming
streaming = flow.kickoff()
for chunk in streaming:
print(chunk.content, end="", flush=True)
result = streaming.result
print(f"\nFlow complete! View structure at: research_flow.html")
```
By leveraging flow streaming, you can build sophisticated, responsive applications that provide users with real-time visibility into complex multi-stage workflows, making your AI automations more transparent and engaging.

View File

@@ -1,600 +0,0 @@
---
title: Tool Call Hooks
description: Learn how to use tool call hooks to intercept, modify, and control tool execution in CrewAI
mode: "wide"
---
Tool Call Hooks provide fine-grained control over tool execution during agent operations. These hooks allow you to intercept tool calls, modify inputs, transform outputs, implement safety checks, and add comprehensive logging or monitoring.
## Overview
Tool hooks are executed at two critical points:
- **Before Tool Call**: Modify inputs, validate parameters, or block execution
- **After Tool Call**: Transform results, sanitize outputs, or log execution details
## Hook Types
### Before Tool Call Hooks
Executed before every tool execution, these hooks can:
- Inspect and modify tool inputs
- Block tool execution based on conditions
- Implement approval gates for dangerous operations
- Validate parameters
- Log tool invocations
**Signature:**
```python
def before_hook(context: ToolCallHookContext) -> bool | None:
# Return False to block execution
# Return True or None to allow execution
...
```
### After Tool Call Hooks
Executed after every tool execution, these hooks can:
- Modify or sanitize tool results
- Add metadata or formatting
- Log execution results
- Implement result validation
- Transform output formats
**Signature:**
```python
def after_hook(context: ToolCallHookContext) -> str | None:
# Return modified result string
# Return None to keep original result
...
```
## Tool Hook Context
The `ToolCallHookContext` object provides comprehensive access to tool execution state:
```python
class ToolCallHookContext:
tool_name: str # Name of the tool being called
tool_input: dict[str, Any] # Mutable tool input parameters
tool: CrewStructuredTool # Tool instance reference
agent: Agent | BaseAgent | None # Agent executing the tool
task: Task | None # Current task
crew: Crew | None # Crew instance
tool_result: str | None # Tool result (after hooks only)
```
### Modifying Tool Inputs
**Important:** Always modify tool inputs in-place:
```python
# ✅ Correct - modify in-place
def sanitize_input(context: ToolCallHookContext) -> None:
context.tool_input['query'] = context.tool_input['query'].lower()
# ❌ Wrong - replaces dict reference
def wrong_approach(context: ToolCallHookContext) -> None:
context.tool_input = {'query': 'new query'}
```
## Registration Methods
### 1. Global Hook Registration
Register hooks that apply to all tool calls across all crews:
```python
from crewai.hooks import register_before_tool_call_hook, register_after_tool_call_hook
def log_tool_call(context):
print(f"Tool: {context.tool_name}")
print(f"Input: {context.tool_input}")
return None # Allow execution
register_before_tool_call_hook(log_tool_call)
```
### 2. Decorator-Based Registration
Use decorators for cleaner syntax:
```python
from crewai.hooks import before_tool_call, after_tool_call
@before_tool_call
def block_dangerous_tools(context):
dangerous_tools = ['delete_database', 'drop_table', 'rm_rf']
if context.tool_name in dangerous_tools:
print(f"⛔ Blocked dangerous tool: {context.tool_name}")
return False # Block execution
return None
@after_tool_call
def sanitize_results(context):
if context.tool_result and "password" in context.tool_result.lower():
return context.tool_result.replace("password", "[REDACTED]")
return None
```
### 3. Crew-Scoped Hooks
Register hooks for a specific crew instance:
```python
@CrewBase
class MyProjCrew:
@before_tool_call_crew
def validate_tool_inputs(self, context):
# Only applies to this crew
if context.tool_name == "web_search":
if not context.tool_input.get('query'):
print("❌ Invalid search query")
return False
return None
@after_tool_call_crew
def log_tool_results(self, context):
# Crew-specific tool logging
print(f"✅ {context.tool_name} completed")
return None
@crew
def crew(self) -> Crew:
return Crew(
agents=self.agents,
tasks=self.tasks,
process=Process.sequential,
verbose=True
)
```
## Common Use Cases
### 1. Safety Guardrails
```python
@before_tool_call
def safety_check(context: ToolCallHookContext) -> bool | None:
# Block tools that could cause harm
destructive_tools = [
'delete_file',
'drop_table',
'remove_user',
'system_shutdown'
]
if context.tool_name in destructive_tools:
print(f"🛑 Blocked destructive tool: {context.tool_name}")
return False
# Warn on sensitive operations
sensitive_tools = ['send_email', 'post_to_social_media', 'charge_payment']
if context.tool_name in sensitive_tools:
print(f"⚠️ Executing sensitive tool: {context.tool_name}")
return None
```
### 2. Human Approval Gate
```python
@before_tool_call
def require_approval_for_actions(context: ToolCallHookContext) -> bool | None:
approval_required = [
'send_email',
'make_purchase',
'delete_file',
'post_message'
]
if context.tool_name in approval_required:
response = context.request_human_input(
prompt=f"Approve {context.tool_name}?",
default_message=f"Input: {context.tool_input}\nType 'yes' to approve:"
)
if response.lower() != 'yes':
print(f"❌ Tool execution denied: {context.tool_name}")
return False
return None
```
### 3. Input Validation and Sanitization
```python
@before_tool_call
def validate_and_sanitize_inputs(context: ToolCallHookContext) -> bool | None:
# Validate search queries
if context.tool_name == 'web_search':
query = context.tool_input.get('query', '')
if len(query) < 3:
print("❌ Search query too short")
return False
# Sanitize query
context.tool_input['query'] = query.strip().lower()
# Validate file paths
if context.tool_name == 'read_file':
path = context.tool_input.get('path', '')
if '..' in path or path.startswith('/'):
print("❌ Invalid file path")
return False
return None
```
### 4. Result Sanitization
```python
@after_tool_call
def sanitize_sensitive_data(context: ToolCallHookContext) -> str | None:
if not context.tool_result:
return None
import re
result = context.tool_result
# Remove API keys
result = re.sub(
r'(api[_-]?key|token)["\']?\s*[:=]\s*["\']?[\w-]+',
r'\1: [REDACTED]',
result,
flags=re.IGNORECASE
)
# Remove email addresses
result = re.sub(
r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b',
'[EMAIL-REDACTED]',
result
)
# Remove credit card numbers
result = re.sub(
r'\b\d{4}[- ]?\d{4}[- ]?\d{4}[- ]?\d{4}\b',
'[CARD-REDACTED]',
result
)
return result
```
### 5. Tool Usage Analytics
```python
import time
from collections import defaultdict
tool_stats = defaultdict(lambda: {'count': 0, 'total_time': 0, 'failures': 0})
@before_tool_call
def start_timer(context: ToolCallHookContext) -> None:
context.tool_input['_start_time'] = time.time()
return None
@after_tool_call
def track_tool_usage(context: ToolCallHookContext) -> None:
start_time = context.tool_input.get('_start_time', time.time())
duration = time.time() - start_time
tool_stats[context.tool_name]['count'] += 1
tool_stats[context.tool_name]['total_time'] += duration
if not context.tool_result or 'error' in context.tool_result.lower():
tool_stats[context.tool_name]['failures'] += 1
print(f"""
📊 Tool Stats for {context.tool_name}:
- Executions: {tool_stats[context.tool_name]['count']}
- Avg Time: {tool_stats[context.tool_name]['total_time'] / tool_stats[context.tool_name]['count']:.2f}s
- Failures: {tool_stats[context.tool_name]['failures']}
""")
return None
```
### 6. Rate Limiting
```python
from collections import defaultdict
from datetime import datetime, timedelta
tool_call_history = defaultdict(list)
@before_tool_call
def rate_limit_tools(context: ToolCallHookContext) -> bool | None:
tool_name = context.tool_name
now = datetime.now()
# Clean old entries (older than 1 minute)
tool_call_history[tool_name] = [
call_time for call_time in tool_call_history[tool_name]
if now - call_time < timedelta(minutes=1)
]
# Check rate limit (max 10 calls per minute)
if len(tool_call_history[tool_name]) >= 10:
print(f"🚫 Rate limit exceeded for {tool_name}")
return False
# Record this call
tool_call_history[tool_name].append(now)
return None
```
### 7. Caching Tool Results
```python
import hashlib
import json
tool_cache = {}
def cache_key(tool_name: str, tool_input: dict) -> str:
"""Generate cache key from tool name and input."""
input_str = json.dumps(tool_input, sort_keys=True)
return hashlib.md5(f"{tool_name}:{input_str}".encode()).hexdigest()
@before_tool_call
def check_cache(context: ToolCallHookContext) -> bool | None:
key = cache_key(context.tool_name, context.tool_input)
if key in tool_cache:
print(f"💾 Cache hit for {context.tool_name}")
# Note: Can't return cached result from before hook
# Would need to implement this differently
return None
@after_tool_call
def cache_result(context: ToolCallHookContext) -> None:
if context.tool_result:
key = cache_key(context.tool_name, context.tool_input)
tool_cache[key] = context.tool_result
print(f"💾 Cached result for {context.tool_name}")
return None
```
### 8. Debug Logging
```python
@before_tool_call
def debug_tool_call(context: ToolCallHookContext) -> None:
print(f"""
🔍 Tool Call Debug:
- Tool: {context.tool_name}
- Agent: {context.agent.role if context.agent else 'Unknown'}
- Task: {context.task.description[:50] if context.task else 'Unknown'}...
- Input: {context.tool_input}
""")
return None
@after_tool_call
def debug_tool_result(context: ToolCallHookContext) -> None:
if context.tool_result:
result_preview = context.tool_result[:200]
print(f"✅ Result Preview: {result_preview}...")
else:
print("⚠️ No result returned")
return None
```
## Hook Management
### Unregistering Hooks
```python
from crewai.hooks import (
unregister_before_tool_call_hook,
unregister_after_tool_call_hook
)
# Unregister specific hook
def my_hook(context):
...
register_before_tool_call_hook(my_hook)
# Later...
success = unregister_before_tool_call_hook(my_hook)
print(f"Unregistered: {success}")
```
### Clearing Hooks
```python
from crewai.hooks import (
clear_before_tool_call_hooks,
clear_after_tool_call_hooks,
clear_all_tool_call_hooks
)
# Clear specific hook type
count = clear_before_tool_call_hooks()
print(f"Cleared {count} before hooks")
# Clear all tool hooks
before_count, after_count = clear_all_tool_call_hooks()
print(f"Cleared {before_count} before and {after_count} after hooks")
```
### Listing Registered Hooks
```python
from crewai.hooks import (
get_before_tool_call_hooks,
get_after_tool_call_hooks
)
# Get current hooks
before_hooks = get_before_tool_call_hooks()
after_hooks = get_after_tool_call_hooks()
print(f"Registered: {len(before_hooks)} before, {len(after_hooks)} after")
```
## Advanced Patterns
### Conditional Hook Execution
```python
@before_tool_call
def conditional_blocking(context: ToolCallHookContext) -> bool | None:
# Only block for specific agents
if context.agent and context.agent.role == "junior_agent":
if context.tool_name in ['delete_file', 'send_email']:
print(f"❌ Junior agents cannot use {context.tool_name}")
return False
# Only block during specific tasks
if context.task and "sensitive" in context.task.description.lower():
if context.tool_name == 'web_search':
print("❌ Web search blocked for sensitive tasks")
return False
return None
```
### Context-Aware Input Modification
```python
@before_tool_call
def enhance_tool_inputs(context: ToolCallHookContext) -> None:
# Add context based on agent role
if context.agent and context.agent.role == "researcher":
if context.tool_name == 'web_search':
# Add domain restrictions for researchers
context.tool_input['domains'] = ['edu', 'gov', 'org']
# Add context based on task
if context.task and "urgent" in context.task.description.lower():
if context.tool_name == 'send_email':
context.tool_input['priority'] = 'high'
return None
```
### Tool Chain Monitoring
```python
tool_call_chain = []
@before_tool_call
def track_tool_chain(context: ToolCallHookContext) -> None:
tool_call_chain.append({
'tool': context.tool_name,
'timestamp': time.time(),
'agent': context.agent.role if context.agent else 'Unknown'
})
# Detect potential infinite loops
recent_calls = tool_call_chain[-5:]
if len(recent_calls) == 5 and all(c['tool'] == context.tool_name for c in recent_calls):
print(f"⚠️ Warning: {context.tool_name} called 5 times in a row")
return None
```
## Best Practices
1. **Keep Hooks Focused**: Each hook should have a single responsibility
2. **Avoid Heavy Computation**: Hooks execute on every tool call
3. **Handle Errors Gracefully**: Use try-except to prevent hook failures
4. **Use Type Hints**: Leverage `ToolCallHookContext` for better IDE support
5. **Document Blocking Conditions**: Make it clear when/why tools are blocked
6. **Test Hooks Independently**: Unit test hooks before using in production
7. **Clear Hooks in Tests**: Use `clear_all_tool_call_hooks()` between test runs
8. **Modify In-Place**: Always modify `context.tool_input` in-place, never replace
9. **Log Important Decisions**: Especially when blocking tool execution
10. **Consider Performance**: Cache expensive validations when possible
## Error Handling
```python
@before_tool_call
def safe_validation(context: ToolCallHookContext) -> bool | None:
try:
# Your validation logic
if not validate_input(context.tool_input):
return False
except Exception as e:
print(f"⚠️ Hook error: {e}")
# Decide: allow or block on error
return None # Allow execution despite error
```
## Type Safety
```python
from crewai.hooks import ToolCallHookContext, BeforeToolCallHookType, AfterToolCallHookType
# Explicit type annotations
def my_before_hook(context: ToolCallHookContext) -> bool | None:
return None
def my_after_hook(context: ToolCallHookContext) -> str | None:
return None
# Type-safe registration
register_before_tool_call_hook(my_before_hook)
register_after_tool_call_hook(my_after_hook)
```
## Integration with Existing Tools
### Wrapping Existing Validation
```python
def existing_validator(tool_name: str, inputs: dict) -> bool:
"""Your existing validation function."""
# Your validation logic
return True
@before_tool_call
def integrate_validator(context: ToolCallHookContext) -> bool | None:
if not existing_validator(context.tool_name, context.tool_input):
print(f"❌ Validation failed for {context.tool_name}")
return False
return None
```
### Logging to External Systems
```python
import logging
logger = logging.getLogger(__name__)
@before_tool_call
def log_to_external_system(context: ToolCallHookContext) -> None:
logger.info(f"Tool call: {context.tool_name}", extra={
'tool_name': context.tool_name,
'tool_input': context.tool_input,
'agent': context.agent.role if context.agent else None
})
return None
```
## Troubleshooting
### Hook Not Executing
- Verify hook is registered before crew execution
- Check if previous hook returned `False` (blocks execution and subsequent hooks)
- Ensure hook signature matches expected type
### Input Modifications Not Working
- Use in-place modifications: `context.tool_input['key'] = value`
- Don't replace the dict: `context.tool_input = {}`
### Result Modifications Not Working
- Return the modified string from after hooks
- Returning `None` keeps the original result
- Ensure the tool actually returned a result
### Tool Blocked Unexpectedly
- Check all before hooks for blocking conditions
- Verify hook execution order
- Add debug logging to identify which hook is blocking
## Conclusion
Tool Call Hooks provide powerful capabilities for controlling and monitoring tool execution in CrewAI. Use them to implement safety guardrails, approval gates, input validation, result sanitization, logging, and analytics. Combined with proper error handling and type safety, hooks enable secure and production-ready agent systems with comprehensive observability.

View File

@@ -1,349 +0,0 @@
---
title: MCP DSL Integration
description: Learn how to use CrewAI's simple DSL syntax to integrate MCP servers directly with your agents using the mcps field.
icon: code
mode: "wide"
---
## Overview
CrewAI's MCP DSL (Domain Specific Language) integration provides the **simplest way** to connect your agents to MCP (Model Context Protocol) servers. Just add an `mcps` field to your agent and CrewAI handles all the complexity automatically.
<Info>
This is the **recommended approach** for most MCP use cases. For advanced
scenarios requiring manual connection management, see
[MCPServerAdapter](/en/mcp/overview#advanced-mcpserveradapter).
</Info>
## Basic Usage
Add MCP servers to your agent using the `mcps` field:
```python
from crewai import Agent
agent = Agent(
role="Research Assistant",
goal="Help with research and analysis tasks",
backstory="Expert assistant with access to advanced research tools",
mcps=[
"https://mcp.exa.ai/mcp?api_key=your_key&profile=research"
]
)
# MCP tools are now automatically available!
# No need for manual connection management or tool configuration
```
## Supported Reference Formats
### External MCP Remote Servers
```python
# Basic HTTPS server
"https://api.example.com/mcp"
# Server with authentication
"https://mcp.exa.ai/mcp?api_key=your_key&profile=your_profile"
# Server with custom path
"https://services.company.com/api/v1/mcp"
```
### Specific Tool Selection
Use the `#` syntax to select specific tools from a server:
```python
# Get only the forecast tool from weather server
"https://weather.api.com/mcp#get_forecast"
# Get only the search tool from Exa
"https://mcp.exa.ai/mcp?api_key=your_key#web_search_exa"
```
### CrewAI AMP Marketplace
Access tools from the CrewAI AMP marketplace:
```python
# Full service with all tools
"crewai-amp:financial-data"
# Specific tool from AMP service
"crewai-amp:research-tools#pubmed_search"
# Multiple AMP services
mcps=[
"crewai-amp:weather-insights",
"crewai-amp:market-analysis",
"crewai-amp:social-media-monitoring"
]
```
## Complete Example
Here's a complete example using multiple MCP servers:
```python
from crewai import Agent, Task, Crew, Process
# Create agent with multiple MCP sources
multi_source_agent = Agent(
role="Multi-Source Research Analyst",
goal="Conduct comprehensive research using multiple data sources",
backstory="""Expert researcher with access to web search, weather data,
financial information, and academic research tools""",
mcps=[
# External MCP servers
"https://mcp.exa.ai/mcp?api_key=your_exa_key&profile=research",
"https://weather.api.com/mcp#get_current_conditions",
# CrewAI AMP marketplace
"crewai-amp:financial-insights",
"crewai-amp:academic-research#pubmed_search",
"crewai-amp:market-intelligence#competitor_analysis"
]
)
# Create comprehensive research task
research_task = Task(
description="""Research the impact of AI agents on business productivity.
Include current weather impacts on remote work, financial market trends,
and recent academic publications on AI agent frameworks.""",
expected_output="""Comprehensive report covering:
1. AI agent business impact analysis
2. Weather considerations for remote work
3. Financial market trends related to AI
4. Academic research citations and insights
5. Competitive landscape analysis""",
agent=multi_source_agent
)
# Create and execute crew
research_crew = Crew(
agents=[multi_source_agent],
tasks=[research_task],
process=Process.sequential,
verbose=True
)
result = research_crew.kickoff()
print(f"Research completed with {len(multi_source_agent.mcps)} MCP data sources")
```
## Tool Naming and Organization
CrewAI automatically handles tool naming to prevent conflicts:
```python
# Original MCP server has tools: "search", "analyze"
# CrewAI creates tools: "mcp_exa_ai_search", "mcp_exa_ai_analyze"
agent = Agent(
role="Tool Organization Demo",
goal="Show how tool naming works",
backstory="Demonstrates automatic tool organization",
mcps=[
"https://mcp.exa.ai/mcp?api_key=key", # Tools: mcp_exa_ai_*
"https://weather.service.com/mcp", # Tools: weather_service_com_*
"crewai-amp:financial-data" # Tools: financial_data_*
]
)
# Each server's tools get unique prefixes based on the server name
# This prevents naming conflicts between different MCP servers
```
## Error Handling and Resilience
The MCP DSL is designed to be robust and user-friendly:
### Graceful Server Failures
```python
agent = Agent(
role="Resilient Researcher",
goal="Research despite server issues",
backstory="Experienced researcher who adapts to available tools",
mcps=[
"https://primary-server.com/mcp", # Primary data source
"https://backup-server.com/mcp", # Backup if primary fails
"https://unreachable-server.com/mcp", # Will be skipped with warning
"crewai-amp:reliable-service" # Reliable AMP service
]
)
# Agent will:
# 1. Successfully connect to working servers
# 2. Log warnings for failing servers
# 3. Continue with available tools
# 4. Not crash or hang on server failures
```
### Timeout Protection
All MCP operations have built-in timeouts:
- **Connection timeout**: 10 seconds
- **Tool execution timeout**: 30 seconds
- **Discovery timeout**: 15 seconds
```python
# These servers will timeout gracefully if unresponsive
mcps=[
"https://slow-server.com/mcp", # Will timeout after 10s if unresponsive
"https://overloaded-api.com/mcp" # Will timeout if discovery takes > 15s
]
```
## Performance Features
### Automatic Caching
Tool schemas are cached for 5 minutes to improve performance:
```python
# First agent creation - discovers tools from server
agent1 = Agent(role="First", goal="Test", backstory="Test",
mcps=["https://api.example.com/mcp"])
# Second agent creation (within 5 minutes) - uses cached tool schemas
agent2 = Agent(role="Second", goal="Test", backstory="Test",
mcps=["https://api.example.com/mcp"]) # Much faster!
```
### On-Demand Connections
Tool connections are established only when tools are actually used:
```python
# Agent creation is fast - no MCP connections made yet
agent = Agent(
role="On-Demand Agent",
goal="Use tools efficiently",
backstory="Efficient agent that connects only when needed",
mcps=["https://api.example.com/mcp"]
)
# MCP connection is made only when a tool is actually executed
# This minimizes connection overhead and improves startup performance
```
## Integration with Existing Features
MCP tools work seamlessly with other CrewAI features:
```python
from crewai.tools import BaseTool
class CustomTool(BaseTool):
name: str = "custom_analysis"
description: str = "Custom analysis tool"
def _run(self, **kwargs):
return "Custom analysis result"
agent = Agent(
role="Full-Featured Agent",
goal="Use all available tool types",
backstory="Agent with comprehensive tool access",
# All tool types work together
tools=[CustomTool()], # Custom tools
apps=["gmail", "slack"], # Platform integrations
mcps=[ # MCP servers
"https://mcp.exa.ai/mcp?api_key=key",
"crewai-amp:research-tools"
],
verbose=True,
max_iter=15
)
```
## Best Practices
### 1. Use Specific Tools When Possible
```python
# Good - only get the tools you need
mcps=["https://weather.api.com/mcp#get_forecast"]
# Less efficient - gets all tools from server
mcps=["https://weather.api.com/mcp"]
```
### 2. Handle Authentication Securely
```python
import os
# Store API keys in environment variables
exa_key = os.getenv("EXA_API_KEY")
exa_profile = os.getenv("EXA_PROFILE")
agent = Agent(
role="Secure Agent",
goal="Use MCP tools securely",
backstory="Security-conscious agent",
mcps=[f"https://mcp.exa.ai/mcp?api_key={exa_key}&profile={exa_profile}"]
)
```
### 3. Plan for Server Failures
```python
# Always include backup options
mcps=[
"https://primary-api.com/mcp", # Primary choice
"https://backup-api.com/mcp", # Backup option
"crewai-amp:reliable-service" # AMP fallback
]
```
### 4. Use Descriptive Agent Roles
```python
agent = Agent(
role="Weather-Enhanced Market Analyst",
goal="Analyze markets considering weather impacts",
backstory="Financial analyst with access to weather data for agricultural market insights",
mcps=[
"https://weather.service.com/mcp#get_forecast",
"crewai-amp:financial-data#stock_analysis"
]
)
```
## Troubleshooting
### Common Issues
**No tools discovered:**
```python
# Check your MCP server URL and authentication
# Verify the server is running and accessible
mcps=["https://mcp.example.com/mcp?api_key=valid_key"]
```
**Connection timeouts:**
```python
# Server may be slow or overloaded
# CrewAI will log warnings and continue with other servers
# Check server status or try backup servers
```
**Authentication failures:**
```python
# Verify API keys and credentials
# Check server documentation for required parameters
# Ensure query parameters are properly URL encoded
```
## Advanced: MCPServerAdapter
For complex scenarios requiring manual connection management, use the `MCPServerAdapter` class from `crewai-tools`. Using a Python context manager (`with` statement) is the recommended approach as it automatically handles starting and stopping the connection to the MCP server.

View File

@@ -1,6 +1,6 @@
--- ---
title: "MCP Servers as Tools in CrewAI" title: 'MCP Servers as Tools in CrewAI'
description: "Learn how to integrate MCP servers as tools in your CrewAI agents using the `crewai-tools` library." description: 'Learn how to integrate MCP servers as tools in your CrewAI agents using the `crewai-tools` library.'
icon: plug icon: plug
mode: "wide" mode: "wide"
--- ---
@@ -8,86 +8,16 @@ mode: "wide"
## Overview ## Overview
The [Model Context Protocol](https://modelcontextprotocol.io/introduction) (MCP) provides a standardized way for AI agents to provide context to LLMs by communicating with external services, known as MCP Servers. The [Model Context Protocol](https://modelcontextprotocol.io/introduction) (MCP) provides a standardized way for AI agents to provide context to LLMs by communicating with external services, known as MCP Servers.
The `crewai-tools` library extends CrewAI's capabilities by allowing you to seamlessly integrate tools from these MCP servers into your agents.
CrewAI offers **two approaches** for MCP integration: This gives your crews access to a vast ecosystem of functionalities.
### 🚀 **Simple DSL Integration** (Recommended)
Use the `mcps` field directly on agents for seamless MCP tool integration. The DSL supports both **string references** (for quick setup) and **structured configurations** (for full control).
#### String-Based References (Quick Setup)
Perfect for remote HTTPS servers and CrewAI AMP marketplace:
```python
from crewai import Agent
agent = Agent(
role="Research Analyst",
goal="Research and analyze information",
backstory="Expert researcher with access to external tools",
mcps=[
"https://mcp.exa.ai/mcp?api_key=your_key", # External MCP server
"https://api.weather.com/mcp#get_forecast", # Specific tool from server
"crewai-amp:financial-data", # CrewAI AMP marketplace
"crewai-amp:research-tools#pubmed_search" # Specific AMP tool
]
)
# MCP tools are now automatically available to your agent!
```
#### Structured Configurations (Full Control)
For complete control over connection settings, tool filtering, and all transport types:
```python
from crewai import Agent
from crewai.mcp import MCPServerStdio, MCPServerHTTP, MCPServerSSE
from crewai.mcp.filters import create_static_tool_filter
agent = Agent(
role="Advanced Research Analyst",
goal="Research with full control over MCP connections",
backstory="Expert researcher with advanced tool access",
mcps=[
# Stdio transport for local servers
MCPServerStdio(
command="npx",
args=["-y", "@modelcontextprotocol/server-filesystem"],
env={"API_KEY": "your_key"},
tool_filter=create_static_tool_filter(
allowed_tool_names=["read_file", "list_directory"]
),
cache_tools_list=True,
),
# HTTP/Streamable HTTP transport for remote servers
MCPServerHTTP(
url="https://api.example.com/mcp",
headers={"Authorization": "Bearer your_token"},
streamable=True,
cache_tools_list=True,
),
# SSE transport for real-time streaming
MCPServerSSE(
url="https://stream.example.com/mcp/sse",
headers={"Authorization": "Bearer your_token"},
),
]
)
```
### 🔧 **Advanced: MCPServerAdapter** (For Complex Scenarios)
For advanced use cases requiring manual connection management, the `crewai-tools` library provides the `MCPServerAdapter` class.
We currently support the following transport mechanisms: We currently support the following transport mechanisms:
- **Stdio**: for local servers (communication via standard input/output between processes on the same machine) - **Stdio**: for local servers (communication via standard input/output between processes on the same machine)
- **Server-Sent Events (SSE)**: for remote servers (unidirectional, real-time data streaming from server to client over HTTP) - **Server-Sent Events (SSE)**: for remote servers (unidirectional, real-time data streaming from server to client over HTTP)
- **Streamable HTTPS**: for remote servers (flexible, potentially bi-directional communication over HTTPS, often utilizing SSE for server-to-client streams) - **Streamable HTTP**: for remote servers (flexible, potentially bi-directional communication over HTTP, often utilizing SSE for server-to-client streams)
## Video Tutorial ## Video Tutorial
Watch this video tutorial for a comprehensive guide on MCP integration with CrewAI: Watch this video tutorial for a comprehensive guide on MCP integration with CrewAI:
<iframe <iframe
@@ -101,339 +31,17 @@ Watch this video tutorial for a comprehensive guide on MCP integration with Crew
## Installation ## Installation
CrewAI MCP integration requires the `mcp` library: Before you start using MCP with `crewai-tools`, you need to install the `mcp` extra `crewai-tools` dependency with the following command:
```shell ```shell
# For Simple DSL Integration (Recommended)
uv add mcp
# For Advanced MCPServerAdapter usage
uv pip install 'crewai-tools[mcp]' uv pip install 'crewai-tools[mcp]'
``` ```
## Quick Start: Simple DSL Integration ## Key Concepts & Getting Started
The easiest way to integrate MCP servers is using the `mcps` field on your agents. You can use either string references or structured configurations. The `MCPServerAdapter` class from `crewai-tools` is the primary way to connect to an MCP server and make its tools available to your CrewAI agents. It supports different transport mechanisms and simplifies connection management.
### Quick Start with String References Using a Python context manager (`with` statement) is the **recommended approach** for `MCPServerAdapter`. It automatically handles starting and stopping the connection to the MCP server.
```python
from crewai import Agent, Task, Crew
# Create agent with MCP tools using string references
research_agent = Agent(
role="Research Analyst",
goal="Find and analyze information using advanced search tools",
backstory="Expert researcher with access to multiple data sources",
mcps=[
"https://mcp.exa.ai/mcp?api_key=your_key&profile=your_profile",
"crewai-amp:weather-service#current_conditions"
]
)
# Create task
research_task = Task(
description="Research the latest developments in AI agent frameworks",
expected_output="Comprehensive research report with citations",
agent=research_agent
)
# Create and run crew
crew = Crew(agents=[research_agent], tasks=[research_task])
result = crew.kickoff()
```
### Quick Start with Structured Configurations
```python
from crewai import Agent, Task, Crew
from crewai.mcp import MCPServerStdio, MCPServerHTTP, MCPServerSSE
# Create agent with structured MCP configurations
research_agent = Agent(
role="Research Analyst",
goal="Find and analyze information using advanced search tools",
backstory="Expert researcher with access to multiple data sources",
mcps=[
# Local stdio server
MCPServerStdio(
command="python",
args=["local_server.py"],
env={"API_KEY": "your_key"},
),
# Remote HTTP server
MCPServerHTTP(
url="https://api.research.com/mcp",
headers={"Authorization": "Bearer your_token"},
),
]
)
# Create task
research_task = Task(
description="Research the latest developments in AI agent frameworks",
expected_output="Comprehensive research report with citations",
agent=research_agent
)
# Create and run crew
crew = Crew(agents=[research_agent], tasks=[research_task])
result = crew.kickoff()
```
That's it! The MCP tools are automatically discovered and available to your agent.
## MCP Reference Formats
The `mcps` field supports both **string references** (for quick setup) and **structured configurations** (for full control). You can mix both formats in the same list.
### String-Based References
#### External MCP Servers
```python
mcps=[
# Full server - get all available tools
"https://mcp.example.com/api",
# Specific tool from server using # syntax
"https://api.weather.com/mcp#get_current_weather",
# Server with authentication parameters
"https://mcp.exa.ai/mcp?api_key=your_key&profile=your_profile"
]
```
#### CrewAI AMP Marketplace
```python
mcps=[
# Full AMP MCP service - get all available tools
"crewai-amp:financial-data",
# Specific tool from AMP service using # syntax
"crewai-amp:research-tools#pubmed_search",
# Multiple AMP services
"crewai-amp:weather-service",
"crewai-amp:market-analysis"
]
```
### Structured Configurations
#### Stdio Transport (Local Servers)
Perfect for local MCP servers that run as processes:
```python
from crewai.mcp import MCPServerStdio
from crewai.mcp.filters import create_static_tool_filter
mcps=[
MCPServerStdio(
command="npx",
args=["-y", "@modelcontextprotocol/server-filesystem"],
env={"API_KEY": "your_key"},
tool_filter=create_static_tool_filter(
allowed_tool_names=["read_file", "write_file"]
),
cache_tools_list=True,
),
# Python-based server
MCPServerStdio(
command="python",
args=["path/to/server.py"],
env={"UV_PYTHON": "3.12", "API_KEY": "your_key"},
),
]
```
#### HTTP/Streamable HTTP Transport (Remote Servers)
For remote MCP servers over HTTP/HTTPS:
```python
from crewai.mcp import MCPServerHTTP
mcps=[
# Streamable HTTP (default)
MCPServerHTTP(
url="https://api.example.com/mcp",
headers={"Authorization": "Bearer your_token"},
streamable=True,
cache_tools_list=True,
),
# Standard HTTP
MCPServerHTTP(
url="https://api.example.com/mcp",
headers={"Authorization": "Bearer your_token"},
streamable=False,
),
]
```
#### SSE Transport (Real-Time Streaming)
For remote servers using Server-Sent Events:
```python
from crewai.mcp import MCPServerSSE
mcps=[
MCPServerSSE(
url="https://stream.example.com/mcp/sse",
headers={"Authorization": "Bearer your_token"},
cache_tools_list=True,
),
]
```
### Mixed References
You can combine string references and structured configurations:
```python
from crewai.mcp import MCPServerStdio, MCPServerHTTP
mcps=[
# String references
"https://external-api.com/mcp", # External server
"crewai-amp:financial-insights", # AMP service
# Structured configurations
MCPServerStdio(
command="npx",
args=["-y", "@modelcontextprotocol/server-filesystem"],
),
MCPServerHTTP(
url="https://api.example.com/mcp",
headers={"Authorization": "Bearer token"},
),
]
```
### Tool Filtering
Structured configurations support advanced tool filtering:
```python
from crewai.mcp import MCPServerStdio
from crewai.mcp.filters import create_static_tool_filter, create_dynamic_tool_filter, ToolFilterContext
# Static filtering (allow/block lists)
static_filter = create_static_tool_filter(
allowed_tool_names=["read_file", "write_file"],
blocked_tool_names=["delete_file"],
)
# Dynamic filtering (context-aware)
def dynamic_filter(context: ToolFilterContext, tool: dict) -> bool:
# Block dangerous tools for certain agent roles
if context.agent.role == "Code Reviewer":
if "delete" in tool.get("name", "").lower():
return False
return True
mcps=[
MCPServerStdio(
command="npx",
args=["-y", "@modelcontextprotocol/server-filesystem"],
tool_filter=static_filter, # or dynamic_filter
),
]
```
## Configuration Parameters
Each transport type supports specific configuration options:
### MCPServerStdio Parameters
- **`command`** (required): Command to execute (e.g., `"python"`, `"node"`, `"npx"`, `"uvx"`)
- **`args`** (optional): List of command arguments (e.g., `["server.py"]` or `["-y", "@mcp/server"]`)
- **`env`** (optional): Dictionary of environment variables to pass to the process
- **`tool_filter`** (optional): Tool filter function for filtering available tools
- **`cache_tools_list`** (optional): Whether to cache the tool list for faster subsequent access (default: `False`)
### MCPServerHTTP Parameters
- **`url`** (required): Server URL (e.g., `"https://api.example.com/mcp"`)
- **`headers`** (optional): Dictionary of HTTP headers for authentication or other purposes
- **`streamable`** (optional): Whether to use streamable HTTP transport (default: `True`)
- **`tool_filter`** (optional): Tool filter function for filtering available tools
- **`cache_tools_list`** (optional): Whether to cache the tool list for faster subsequent access (default: `False`)
### MCPServerSSE Parameters
- **`url`** (required): Server URL (e.g., `"https://api.example.com/mcp/sse"`)
- **`headers`** (optional): Dictionary of HTTP headers for authentication or other purposes
- **`tool_filter`** (optional): Tool filter function for filtering available tools
- **`cache_tools_list`** (optional): Whether to cache the tool list for faster subsequent access (default: `False`)
### Common Parameters
All transport types support:
- **`tool_filter`**: Filter function to control which tools are available. Can be:
- `None` (default): All tools are available
- Static filter: Created with `create_static_tool_filter()` for allow/block lists
- Dynamic filter: Created with `create_dynamic_tool_filter()` for context-aware filtering
- **`cache_tools_list`**: When `True`, caches the tool list after first discovery to improve performance on subsequent connections
## Key Features
- 🔄 **Automatic Tool Discovery**: Tools are automatically discovered and integrated
- 🏷️ **Name Collision Prevention**: Server names are prefixed to tool names
- ⚡ **Performance Optimized**: On-demand connections with schema caching
- 🛡️ **Error Resilience**: Graceful handling of unavailable servers
- ⏱️ **Timeout Protection**: Built-in timeouts prevent hanging connections
- 📊 **Transparent Integration**: Works seamlessly with existing CrewAI features
- 🔧 **Full Transport Support**: Stdio, HTTP/Streamable HTTP, and SSE transports
- 🎯 **Advanced Filtering**: Static and dynamic tool filtering capabilities
- 🔐 **Flexible Authentication**: Support for headers, environment variables, and query parameters
## Error Handling
The MCP DSL integration is designed to be resilient and handles failures gracefully:
```python
from crewai import Agent
from crewai.mcp import MCPServerStdio, MCPServerHTTP
agent = Agent(
role="Resilient Agent",
goal="Continue working despite server issues",
backstory="Agent that handles failures gracefully",
mcps=[
# String references
"https://reliable-server.com/mcp", # Will work
"https://unreachable-server.com/mcp", # Will be skipped gracefully
"crewai-amp:working-service", # Will work
# Structured configs
MCPServerStdio(
command="python",
args=["reliable_server.py"], # Will work
),
MCPServerHTTP(
url="https://slow-server.com/mcp", # Will timeout gracefully
),
]
)
# Agent will use tools from working servers and log warnings for failing ones
```
All connection errors are handled gracefully:
- **Connection failures**: Logged as warnings, agent continues with available tools
- **Timeout errors**: Connections timeout after 30 seconds (configurable)
- **Authentication errors**: Logged clearly for debugging
- **Invalid configurations**: Validation errors are raised at agent creation time
## Advanced: MCPServerAdapter
For complex scenarios requiring manual connection management, use the `MCPServerAdapter` class from `crewai-tools`. Using a Python context manager (`with` statement) is the recommended approach as it automatically handles starting and stopping the connection to the MCP server.
## Connection Configuration ## Connection Configuration
@@ -487,7 +95,6 @@ with MCPServerAdapter(server_params, connect_timeout=60) as mcp_tools:
) )
# ... rest of your crew setup ... # ... rest of your crew setup ...
``` ```
This general pattern shows how to integrate tools. For specific examples tailored to each transport, refer to the detailed guides below. This general pattern shows how to integrate tools. For specific examples tailored to each transport, refer to the detailed guides below.
## Filtering Tools ## Filtering Tools
@@ -574,7 +181,6 @@ When a crew class is decorated with `@CrewBase`, the adapter lifecycle is manage
- If `mcp_server_params` is not defined, `get_mcp_tools()` simply returns an empty list, allowing the same code paths to run with or without MCP configured. - If `mcp_server_params` is not defined, `get_mcp_tools()` simply returns an empty list, allowing the same code paths to run with or without MCP configured.
This makes it safe to call `get_mcp_tools()` from multiple agent methods or selectively enable MCP per environment. This makes it safe to call `get_mcp_tools()` from multiple agent methods or selectively enable MCP per environment.
</Tip> </Tip>
### Connection Timeout Configuration ### Connection Timeout Configuration
@@ -635,74 +241,65 @@ class CrewWithCustomTimeout:
## Explore MCP Integrations ## Explore MCP Integrations
<CardGroup cols={2}> <CardGroup cols={2}>
<Card
title="Simple DSL Integration"
icon="code"
href="/en/mcp/dsl-integration"
color="#3B82F6"
>
**Recommended**: Use the simple `mcps=[]` field syntax for effortless MCP
integration.
</Card>
<Card <Card
title="Stdio Transport" title="Stdio Transport"
icon="server" icon="server"
href="/en/mcp/stdio" href="/en/mcp/stdio"
color="#3B82F6"
>
Connect to local MCP servers via standard input/output. Ideal for scripts and local executables.
</Card>
<Card
title="SSE Transport"
icon="wifi"
href="/en/mcp/sse"
color="#10B981" color="#10B981"
> >
Connect to local MCP servers via standard input/output. Ideal for scripts Integrate with remote MCP servers using Server-Sent Events for real-time data streaming.
and local executables.
</Card>
<Card title="SSE Transport" icon="wifi" href="/en/mcp/sse" color="#F59E0B">
Integrate with remote MCP servers using Server-Sent Events for real-time
data streaming.
</Card> </Card>
<Card <Card
title="Streamable HTTP Transport" title="Streamable HTTP Transport"
icon="globe" icon="globe"
href="/en/mcp/streamable-http" href="/en/mcp/streamable-http"
color="#8B5CF6" color="#F59E0B"
> >
Utilize flexible Streamable HTTP for robust communication with remote MCP Utilize flexible Streamable HTTP for robust communication with remote MCP servers.
servers.
</Card> </Card>
<Card <Card
title="Connecting to Multiple Servers" title="Connecting to Multiple Servers"
icon="layer-group" icon="layer-group"
href="/en/mcp/multiple-servers" href="/en/mcp/multiple-servers"
color="#EF4444" color="#8B5CF6"
> >
Aggregate tools from several MCP servers simultaneously using a single Aggregate tools from several MCP servers simultaneously using a single adapter.
adapter.
</Card> </Card>
<Card <Card
title="Security Considerations" title="Security Considerations"
icon="lock" icon="lock"
href="/en/mcp/security" href="/en/mcp/security"
color="#DC2626" color="#EF4444"
> >
Review important security best practices for MCP integration to keep your Review important security best practices for MCP integration to keep your agents safe.
agents safe.
</Card> </Card>
</CardGroup> </CardGroup>
Checkout this repository for full demos and examples of MCP integration with CrewAI! 👇 Checkout this repository for full demos and examples of MCP integration with CrewAI! 👇
<Card <Card
title="GitHub Repository" title="GitHub Repository"
icon="github" icon="github"
href="https://github.com/tonykipkemboi/crewai-mcp-demo" href="https://github.com/tonykipkemboi/crewai-mcp-demo"
target="_blank" target="_blank"
> >
CrewAI MCP Demo CrewAI MCP Demo
</Card> </Card>
## Staying Safe with MCP ## Staying Safe with MCP
<Warning>
<Warning>Always ensure that you trust an MCP Server before using it.</Warning> Always ensure that you trust an MCP Server before using it.
</Warning>
#### Security Warning: DNS Rebinding Attacks #### Security Warning: DNS Rebinding Attacks
SSE transports can be vulnerable to DNS rebinding attacks if not properly secured. SSE transports can be vulnerable to DNS rebinding attacks if not properly secured.
To prevent this: To prevent this:
@@ -715,7 +312,6 @@ Without these protections, attackers could use DNS rebinding to interact with lo
For more details, see the [Anthropic's MCP Transport Security docs](https://modelcontextprotocol.io/docs/concepts/transports#security-considerations). For more details, see the [Anthropic's MCP Transport Security docs](https://modelcontextprotocol.io/docs/concepts/transports#security-considerations).
### Limitations ### Limitations
* **Supported Primitives**: Currently, `MCPServerAdapter` primarily supports adapting MCP `tools`.
- **Supported Primitives**: Currently, `MCPServerAdapter` primarily supports adapting MCP `tools`. Other MCP primitives like `prompts` or `resources` are not directly integrated as CrewAI components through this adapter at this time.
Other MCP primitives like `prompts` or `resources` are not directly integrated as CrewAI components through this adapter at this time. * **Output Handling**: The adapter typically processes the primary text output from an MCP tool (e.g., `.content[0].text`). Complex or multi-modal outputs might require custom handling if not fitting this pattern.
- **Output Handling**: The adapter typically processes the primary text output from an MCP tool (e.g., `.content[0].text`). Complex or multi-modal outputs might require custom handling if not fitting this pattern.

View File

@@ -1,109 +0,0 @@
---
title: Datadog Integration
description: Learn how to integrate Datadog with CrewAI to submit LLM Observability traces to Datadog.
icon: dog
mode: "wide"
---
# Integrate Datadog with CrewAI
This guide will demonstrate how to integrate **[Datadog LLM Observability](https://docs.datadoghq.com/llm_observability/)** with **CrewAI** using [Datadog auto-instrumentation](https://docs.datadoghq.com/llm_observability/instrumentation/auto_instrumentation?tab=python). By the end of this guide, you will be able to submit LLM Observability traces to Datadog and view your CrewAI agent runs in Datadog LLM Observability's [Agentic Execution View](https://docs.datadoghq.com/llm_observability/monitoring/agent_monitoring).
## What is Datadog LLM Observability?
[Datadog LLM Observability](https://www.datadoghq.com/product/llm-observability/) helps AI engineers, data scientists, and application developers quickly develop, evaluate, and monitor LLM applications. Confidently improve output quality, performance, costs, and overall risk with structured experiments, end-to-end tracing across AI agents, and evaluations.
## Getting Started
### Install Dependencies
```shell
pip install ddtrace crewai crewai-tools
```
### Set Environment Variables
If you do not have a Datadog API key, you can [create an account](https://www.datadoghq.com/) and [get your API key](https://docs.datadoghq.com/account_management/api-app-keys/#api-keys).
You will also need to specify an ML Application name in the following environment variables. An ML Application is a grouping of LLM Observability traces associated with a specific LLM-based application. See [ML Application Naming Guidelines](https://docs.datadoghq.com/llm_observability/instrumentation/sdk?tab=python#application-naming-guidelines) for more information on limitations with ML Application names.
```shell
export DD_API_KEY=<YOUR_DD_API_KEY>
export DD_SITE=<YOUR_DD_SITE>
export DD_LLMOBS_ENABLED=true
export DD_LLMOBS_ML_APP=<YOUR_ML_APP_NAME>
export DD_LLMOBS_AGENTLESS_ENABLED=true
export DD_APM_TRACING_ENABLED=false
```
Additionally, configure any LLM provider API keys
```shell
export OPENAI_API_KEY=<YOUR_OPENAI_API_KEY>
export ANTHROPIC_API_KEY=<YOUR_ANTHROPIC_API_KEY>
export GEMINI_API_KEY=<YOUR_GEMINI_API_KEY>
...
```
### Create a CrewAI Agent Application
```python
# crewai_agent.py
from crewai import Agent, Task, Crew
from crewai_tools import (
WebsiteSearchTool
)
web_rag_tool = WebsiteSearchTool()
writer = Agent(
role="Writer",
goal="You make math engaging and understandable for young children through poetry",
backstory="You're an expert in writing haikus but you know nothing of math.",
tools=[web_rag_tool],
)
task = Task(
description=("What is {multiplication}?"),
expected_output=("Compose a haiku that includes the answer."),
agent=writer
)
crew = Crew(
agents=[writer],
tasks=[task],
share_crew=False
)
output = crew.kickoff(dict(multiplication="2 * 2"))
```
### Run the Application with Datadog Auto-Instrumentation
With the [environment variables](#set-environment-variables) set, you can now run the application with Datadog auto-instrumentation.
```shell
ddtrace-run python crewai_agent.py
```
### View the Traces in Datadog
After running the application, you can view the traces in [Datadog LLM Observability's Traces View](https://app.datadoghq.com/llm/traces), selecting the ML Application name you chose from the top-left dropdown.
Clicking on a trace will show you the details of the trace, including total tokens used, number of LLM calls, models used, and estimated cost. Clicking into a specific span will narrow down these details, and show related input, output, and metadata.
<Frame>
<img src="/images/datadog-llm-observability-1.png" alt="Datadog LLM Observability Trace View" />
</Frame>
Additionally, you can view the execution graph view of the trace, which shows the control and data flow of the trace, which will scale with larger agents to show handoffs and relationships between LLM calls, tool calls, and agent interactions.
<Frame>
<img src="/images/datadog-llm-observability-2.png" alt="Datadog LLM Observability Agent Execution Flow View" />
</Frame>
## References
- [Datadog LLM Observability](https://www.datadoghq.com/product/llm-observability/)
- [Datadog LLM Observability CrewAI Auto-Instrumentation](https://docs.datadoghq.com/llm_observability/instrumentation/auto_instrumentation?tab=python#crew-ai)

View File

@@ -733,7 +733,9 @@ Here's a basic configuration to route requests to OpenAI, specifically using GPT
- Collect relevant metadata to filter logs - Collect relevant metadata to filter logs
- Enforce access permissions - Enforce access permissions
Create API keys through the [Portkey App](https://app.portkey.ai/) Create API keys through:
- [Portkey App](https://app.portkey.ai/)
- [API Key Management API](/en/api-reference/admin-api/control-plane/api-keys/create-api-key)
Example using Python SDK: Example using Python SDK:
```python ```python
@@ -756,7 +758,7 @@ Here's a basic configuration to route requests to OpenAI, specifically using GPT
) )
``` ```
For detailed key management instructions, see the [Portkey documentation](https://portkey.ai/docs). For detailed key management instructions, see our [API Keys documentation](/en/api-reference/admin-api/control-plane/api-keys/create-api-key).
</Accordion> </Accordion>
<Accordion title="Step 4: Deploy & Monitor"> <Accordion title="Step 4: Deploy & Monitor">

View File

@@ -45,7 +45,6 @@ crewai login
``` ```
This command will: This command will:
1. Open your browser to the authentication page 1. Open your browser to the authentication page
2. Prompt you to enter a device code 2. Prompt you to enter a device code
3. Authenticate your local environment with your CrewAI AMP account 3. Authenticate your local environment with your CrewAI AMP account
@@ -154,6 +153,7 @@ After running the crew or flow, you can view the traces generated by your CrewAI
Just click on the link below to view the traces or head over to the traces tab in the dashboard [here](https://app.crewai.com/crewai_plus/trace_batches) Just click on the link below to view the traces or head over to the traces tab in the dashboard [here](https://app.crewai.com/crewai_plus/trace_batches)
![CrewAI Tracing Interface](/images/view-traces.png) ![CrewAI Tracing Interface](/images/view-traces.png)
### Alternative: Environment Variable Configuration ### Alternative: Environment Variable Configuration
You can also enable tracing globally by setting an environment variable: You can also enable tracing globally by setting an environment variable:
@@ -190,7 +190,6 @@ CrewAI tracing provides comprehensive visibility into:
- **Error Tracking**: Detailed error information and stack traces - **Error Tracking**: Detailed error information and stack traces
### Trace Features ### Trace Features
- **Execution Timeline**: Click through different stages of execution - **Execution Timeline**: Click through different stages of execution
- **Detailed Logs**: Access comprehensive logs for debugging - **Detailed Logs**: Access comprehensive logs for debugging
- **Performance Analytics**: Analyze execution patterns and optimize performance - **Performance Analytics**: Analyze execution patterns and optimize performance

View File

@@ -58,7 +58,6 @@ Follow the steps below to get Crewing! 🚣‍♂️
your ability to turn complex data into clear and concise reports, making your ability to turn complex data into clear and concise reports, making
it easy for others to understand and act on the information you provide. it easy for others to understand and act on the information you provide.
``` ```
</Step> </Step>
<Step title="Modify your `tasks.yaml` file"> <Step title="Modify your `tasks.yaml` file">
```yaml tasks.yaml ```yaml tasks.yaml
@@ -82,7 +81,6 @@ Follow the steps below to get Crewing! 🚣‍♂️
agent: reporting_analyst agent: reporting_analyst
output_file: report.md output_file: report.md
``` ```
</Step> </Step>
<Step title="Modify your `crew.py` file"> <Step title="Modify your `crew.py` file">
```python crew.py ```python crew.py
@@ -138,7 +136,6 @@ Follow the steps below to get Crewing! 🚣‍♂️
verbose=True, verbose=True,
) )
``` ```
</Step> </Step>
<Step title="[Optional] Add before and after crew functions"> <Step title="[Optional] Add before and after crew functions">
```python crew.py ```python crew.py
@@ -163,7 +160,6 @@ Follow the steps below to get Crewing! 🚣‍♂️
# ... remaining code # ... remaining code
``` ```
</Step> </Step>
<Step title="Feel free to pass custom inputs to your crew"> <Step title="Feel free to pass custom inputs to your crew">
For example, you can pass the `topic` input to your crew to customize the research and reporting. For example, you can pass the `topic` input to your crew to customize the research and reporting.
@@ -182,7 +178,6 @@ Follow the steps below to get Crewing! 🚣‍♂️
} }
LatestAiDevelopmentCrew().crew().kickoff(inputs=inputs) LatestAiDevelopmentCrew().crew().kickoff(inputs=inputs)
``` ```
</Step> </Step>
<Step title="Set your environment variables"> <Step title="Set your environment variables">
Before running your crew, make sure you have the following keys set as environment variables in your `.env` file: Before running your crew, make sure you have the following keys set as environment variables in your `.env` file:
@@ -216,13 +211,13 @@ Follow the steps below to get Crewing! 🚣‍♂️
<Step title="Enterprise Alternative: Create in Crew Studio"> <Step title="Enterprise Alternative: Create in Crew Studio">
For CrewAI AMP users, you can create the same crew without writing code: For CrewAI AMP users, you can create the same crew without writing code:
1. Log in to your CrewAI AMP account (create a free account at [app.crewai.com](https://app.crewai.com)) 1. Log in to your CrewAI AMP account (create a free account at [app.crewai.com](https://app.crewai.com))
2. Open Crew Studio 2. Open Crew Studio
3. Type what is the automation you're trying to build 3. Type what is the automation you're trying to build
4. Create your tasks visually and connect them in sequence 4. Create your tasks visually and connect them in sequence
5. Configure your inputs and click "Download Code" or "Deploy" 5. Configure your inputs and click "Download Code" or "Deploy"
![Crew Studio Quickstart](/images/enterprise/crew-studio-interface.png) ![Crew Studio Quickstart](/images/enterprise/crew-studio-interface.png)
<Card title="Try CrewAI AMP" icon="rocket" href="https://app.crewai.com"> <Card title="Try CrewAI AMP" icon="rocket" href="https://app.crewai.com">
Start your free account at CrewAI AMP Start your free account at CrewAI AMP
@@ -231,7 +226,7 @@ Follow the steps below to get Crewing! 🚣‍♂️
<Step title="View your final report"> <Step title="View your final report">
You should see the output in the console and the `report.md` file should be created in the root of your project with the final report. You should see the output in the console and the `report.md` file should be created in the root of your project with the final report.
Here's an example of what the report should look like: Here's an example of what the report should look like:
<CodeGroup> <CodeGroup>
```markdown output/report.md ```markdown output/report.md
@@ -294,7 +289,6 @@ Here's an example of what the report should look like:
## 8. Conclusion ## 8. Conclusion
The emergence of AI agents is undeniably reshaping the workplace landscape in 5. With their ability to automate tasks, enhance efficiency, and improve decision-making, AI agents are critical in driving operational success. Organizations must embrace and adapt to AI developments to thrive in an increasingly digital business environment. The emergence of AI agents is undeniably reshaping the workplace landscape in 5. With their ability to automate tasks, enhance efficiency, and improve decision-making, AI agents are critical in driving operational success. Organizations must embrace and adapt to AI developments to thrive in an increasingly digital business environment.
``` ```
</CodeGroup> </CodeGroup>
</Step> </Step>
</Steps> </Steps>
@@ -303,7 +297,6 @@ Here's an example of what the report should look like:
Congratulations! Congratulations!
You have successfully set up your crew project and are ready to start building your own agentic workflows! You have successfully set up your crew project and are ready to start building your own agentic workflows!
</Check> </Check>
### Note on Consistency in Naming ### Note on Consistency in Naming
@@ -315,38 +308,34 @@ This naming consistency allows CrewAI to automatically link your configurations
#### Example References #### Example References
<Tip> <Tip>
Note how we use the same name for the agent in the `agents.yaml` Note how we use the same name for the agent in the `agents.yaml` (`email_summarizer`) file as the method name in the `crew.py` (`email_summarizer`) file.
(`email_summarizer`) file as the method name in the `crew.py`
(`email_summarizer`) file.
</Tip> </Tip>
```yaml agents.yaml ```yaml agents.yaml
email_summarizer: email_summarizer:
role: > role: >
Email Summarizer Email Summarizer
goal: > goal: >
Summarize emails into a concise and clear summary Summarize emails into a concise and clear summary
backstory: > backstory: >
You will create a 5 bullet point summary of the report You will create a 5 bullet point summary of the report
llm: provider/model-id # Add your choice of model here llm: provider/model-id # Add your choice of model here
``` ```
<Tip> <Tip>
Note how we use the same name for the task in the `tasks.yaml` Note how we use the same name for the task in the `tasks.yaml` (`email_summarizer_task`) file as the method name in the `crew.py` (`email_summarizer_task`) file.
(`email_summarizer_task`) file as the method name in the `crew.py`
(`email_summarizer_task`) file.
</Tip> </Tip>
```yaml tasks.yaml ```yaml tasks.yaml
email_summarizer_task: email_summarizer_task:
description: > description: >
Summarize the email into a 5 bullet point summary Summarize the email into a 5 bullet point summary
expected_output: > expected_output: >
A 5 bullet point summary of the email A 5 bullet point summary of the email
agent: email_summarizer agent: email_summarizer
context: context:
- reporting_task - reporting_task
- research_task - research_task
``` ```
## Deploying Your Crew ## Deploying Your Crew
@@ -365,16 +354,18 @@ Watch this video tutorial for a step-by-step demonstration of deploying your cre
></iframe> ></iframe>
<CardGroup cols={2}> <CardGroup cols={2}>
<Card title="Deploy on Enterprise" icon="rocket" href="http://app.crewai.com"> <Card
Get started with CrewAI AMP and deploy your crew in a production environment title="Deploy on Enterprise"
with just a few clicks. icon="rocket"
href="http://app.crewai.com"
>
Get started with CrewAI AMP and deploy your crew in a production environment with just a few clicks.
</Card> </Card>
<Card <Card
title="Join the Community" title="Join the Community"
icon="comments" icon="comments"
href="https://community.crewai.com" href="https://community.crewai.com"
> >
Join our open source community to discuss ideas, share your projects, and Join our open source community to discuss ideas, share your projects, and connect with other CrewAI developers.
connect with other CrewAI developers.
</Card> </Card>
</CardGroup> </CardGroup>

Some files were not shown because too many files have changed in this diff Show More