name = "crewai-workspace" description = "Cutting-edge framework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks." readme = "README.md" requires-python = ">=3.10,<3.14" authors = [ { name = "Joao Moura", email = "joao@crewai.com" } ] [dependency-groups] dev = [ "ruff>=0.13.1", "mypy>=1.18.2", "pre-commit>=4.3.0", "bandit>=1.8.6", "pytest>=8.4.2", "pytest-asyncio>=1.2.0", "pytest-subprocess>=1.5.3", "vcrpy==7.0.0", # pinned, less versions break pytest-recording "pytest-recording>=0.13.4", "pytest-randomly>=4.0.1", "pytest-timeout>=2.4.0", "pytest-xdist>=3.8.0", "pytest-split>=0.10.0", "types-requests~=2.31.0.6", "types-pyyaml==6.0.*", "types-regex==2024.11.6.*", "types-appdirs==1.4.*", "boto3-stubs[bedrock-runtime]>=1.40.54", ] [tool.ruff] src = ["lib/*"] extend-exclude = [ "lib/crewai/src/crewai/cli/templates", "lib/crewai/tests/", "lib/crewai-tools/tests/", ] force-exclude = true fix = true target-version = "py310" [tool.ruff.lint] select = [ "E", # pycodestyle errors (style issues) "F", # Pyflakes (code errors) "B", # flake8-bugbear (bug prevention) "S", # bandit (security issues) "RUF", # ruff-specific rules "N", # pep8-naming (naming conventions) "W", # pycodestyle warnings "I", # isort (import formatting) "T", # flake8-print (print statements) # "D", # pydocstyle (docstring conventions) disabled until "PERF", # performance issues "PIE", # flake8-pie (unnecessary code) "ASYNC", # async/await best practices "RET", # flake8-return (return improvements) "UP006", # use collections.abc "UP007", # use X | Y for unions "UP035", # use dict/list instead of typing.Dict/List "UP037", # remove quotes from type annotations "UP045", # use X | None instead of Optional[X] "UP004", # use isinstance instead of type "UP008", # use super() instead of super(Class, self) "UP010", # use isinstance for type checks "UP018", # use str() instead of "string" "UP031", # use f-strings for .format() "UP032", # use f-strings for .format() with positional "I001", # sort imports "I002", # remove unused imports ] ignore = ["E501"] # ignore line too long globally [tool.ruff.format] docstring-code-format = true [tool.ruff.lint.isort] case-sensitive = true combine-as-imports = true force-single-line = false force-sort-within-sections = true known-first-party = [] section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"] lines-after-imports = 2 split-on-trailing-comma = true [tool.ruff.lint.pydocstyle] convention = "google" [tool.ruff.lint.per-file-ignores] "lib/crewai/tests/**/*.py" = ["S101", "RET504", "S105", "S106"] # Allow assert statements, unnecessary assignments, and hardcoded passwords in tests "lib/crewai-tools/tests/**/*.py" = ["S101", "RET504", "S105", "S106", "RUF012", "N818", "E402", "RUF043", "S110", "B017"] # Allow various test-specific patterns [tool.mypy] exclude = [ "lib/crewai/src/crewai/cli/templates", "lib/crewai/tests/", # crewai-tools "lib/crewai-tools/tests/" ] plugins = ["pydantic.mypy"] [tool.bandit] exclude_dirs = ["lib/crewai/src/crewai/cli/templates"] [tool.pytest.ini_options] markers = [ "telemetry: mark test as a telemetry test (don't mock telemetry)", ] testpaths = [ "lib/crewai/tests", "lib/crewai-tools/tests", ] asyncio_mode = "strict" asyncio_default_fixture_loop_scope = "function" addopts = "--tb=short" python_files = "test_*.py" python_classes = "Test*" python_functions = "test_*" [tool.uv.workspace] members = [ "lib/crewai", "lib/crewai-tools", "lib/devtools", ] [tool.uv.sources] crewai = { workspace = true } crewai-tools = { workspace = true } crewai-devtools = { workspace = true }