diff --git a/pyproject.toml b/pyproject.toml index 56fdee20d..ce7b65b20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ dependencies = [ "uv>=0.4.25", "tomli-w>=1.1.0", "chromadb>=0.4.24", + "tomli>=2.0.2", ] [project.urls] diff --git a/src/crewai/cli/run_crew.py b/src/crewai/cli/run_crew.py index 829d8ed95..20d6aed01 100644 --- a/src/crewai/cli/run_crew.py +++ b/src/crewai/cli/run_crew.py @@ -1,10 +1,9 @@ import subprocess import click -import tomllib from packaging import version -from crewai.cli.utils import get_crewai_version +from crewai.cli.utils import get_crewai_version, read_toml def run_crew() -> None: @@ -15,10 +14,9 @@ def run_crew() -> None: crewai_version = get_crewai_version() min_required_version = "0.71.0" - with open("pyproject.toml", "rb") as f: - data = tomllib.load(f) + pyproject_data = read_toml() - if data.get("tool", {}).get("poetry") and ( + if pyproject_data.get("tool", {}).get("poetry") and ( version.parse(crewai_version) < version.parse(min_required_version) ): click.secho( @@ -35,10 +33,7 @@ def run_crew() -> None: click.echo(f"An error occurred while running the crew: {e}", err=True) click.echo(e.output, err=True, nl=True) - with open("pyproject.toml", "rb") as f: - data = tomllib.load(f) - - if data.get("tool", {}).get("poetry"): + if pyproject_data.get("tool", {}).get("poetry"): click.secho( "It's possible that you are using an old version of crewAI that uses poetry, please run `crewai update` to update your pyproject.toml to use uv.", fg="yellow", diff --git a/src/crewai/cli/update_crew.py b/src/crewai/cli/update_crew.py index d38e11a25..b8bc3b297 100644 --- a/src/crewai/cli/update_crew.py +++ b/src/crewai/cli/update_crew.py @@ -2,7 +2,8 @@ import os import shutil import tomli_w -import tomllib + +from crewai.cli.utils import read_toml def update_crew() -> None: @@ -20,8 +21,7 @@ def migrate_pyproject(input_file, output_file): """ # Read the input pyproject.toml - with open(input_file, "rb") as f: - pyproject = tomllib.load(f) + pyproject_data = read_toml() # Initialize the new project structure new_pyproject = { @@ -30,8 +30,8 @@ def migrate_pyproject(input_file, output_file): } # Migrate project metadata - if "tool" in pyproject and "poetry" in pyproject["tool"]: - poetry = pyproject["tool"]["poetry"] + if "tool" in pyproject_data and "poetry" in pyproject_data["tool"]: + poetry = pyproject_data["tool"]["poetry"] new_pyproject["project"]["name"] = poetry.get("name") new_pyproject["project"]["version"] = poetry.get("version") new_pyproject["project"]["description"] = poetry.get("description") @@ -45,7 +45,7 @@ def migrate_pyproject(input_file, output_file): new_pyproject["project"]["requires-python"] = poetry.get("python") else: # If it's already in the new format, just copy the project section - new_pyproject["project"] = pyproject.get("project", {}) + new_pyproject["project"] = pyproject_data.get("project", {}) # Migrate or copy dependencies if "dependencies" in new_pyproject["project"]: @@ -69,8 +69,8 @@ def migrate_pyproject(input_file, output_file): # Migrate or copy scripts if "scripts" in poetry: new_pyproject["project"]["scripts"] = poetry["scripts"] - elif "scripts" in pyproject.get("project", {}): - new_pyproject["project"]["scripts"] = pyproject["project"]["scripts"] + elif "scripts" in pyproject_data.get("project", {}): + new_pyproject["project"]["scripts"] = pyproject_data["project"]["scripts"] else: new_pyproject["project"]["scripts"] = {} diff --git a/src/crewai/cli/utils.py b/src/crewai/cli/utils.py index c32113faa..25da9e31a 100644 --- a/src/crewai/cli/utils.py +++ b/src/crewai/cli/utils.py @@ -6,6 +6,7 @@ from functools import reduce from typing import Any, Dict, List import click +import tomli from rich.console import Console from crewai.cli.authentication.utils import TokenManager @@ -54,6 +55,13 @@ def simple_toml_parser(content): return result +def read_toml(file_path: str = "pyproject.toml"): + """Read the content of a TOML file and return it as a dictionary.""" + with open(file_path, "rb") as f: + toml_dict = tomli.load(f) + return toml_dict + + def parse_toml(content): if sys.version_info >= (3, 11): return tomllib.loads(content) diff --git a/uv.lock b/uv.lock index ddd57b313..73cd038ca 100644 --- a/uv.lock +++ b/uv.lock @@ -648,6 +648,7 @@ dependencies = [ { name = "python-dotenv" }, { name = "pyvis" }, { name = "regex" }, + { name = "tomli" }, { name = "tomli-w" }, { name = "uv" }, ] @@ -702,6 +703,7 @@ requires-dist = [ { name = "python-dotenv", specifier = ">=1.0.0" }, { name = "pyvis", specifier = ">=0.3.2" }, { name = "regex", specifier = ">=2024.9.11" }, + { name = "tomli", specifier = ">=2.0.2" }, { name = "tomli-w", specifier = ">=1.1.0" }, { name = "uv", specifier = ">=0.4.25" }, ]