mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-05-08 02:29:00 +00:00
102 lines
3.6 KiB
Python
102 lines
3.6 KiB
Python
from enum import Enum
|
|
import subprocess
|
|
|
|
import click
|
|
from packaging import version
|
|
|
|
from crewai.cli.utils import build_env_with_all_tool_credentials, read_toml
|
|
from crewai.utilities.constants import CREWAI_TRAINED_AGENTS_FILE_ENV
|
|
from crewai.utilities.version import get_crewai_version
|
|
|
|
|
|
class CrewType(Enum):
|
|
STANDARD = "standard"
|
|
FLOW = "flow"
|
|
|
|
|
|
def run_crew(trained_agents_file: str | None = None) -> None:
|
|
"""Run the crew or flow by running a command in the UV environment.
|
|
|
|
Starting from version 0.103.0, this command can be used to run both
|
|
standard crews and flows. For flows, it detects the type from pyproject.toml
|
|
and automatically runs the appropriate command.
|
|
|
|
Args:
|
|
trained_agents_file: Optional path to a trained-agents pickle produced
|
|
by ``crewai train -f``. When set, exported as
|
|
``CREWAI_TRAINED_AGENTS_FILE`` so agents load suggestions from this
|
|
file instead of the default ``trained_agents_data.pkl``.
|
|
"""
|
|
crewai_version = get_crewai_version()
|
|
min_required_version = "0.71.0"
|
|
pyproject_data = read_toml()
|
|
|
|
# Check for legacy poetry configuration
|
|
if pyproject_data.get("tool", {}).get("poetry") and (
|
|
version.parse(crewai_version) < version.parse(min_required_version)
|
|
):
|
|
click.secho(
|
|
f"You are running an older version of crewAI ({crewai_version}) that uses poetry pyproject.toml. "
|
|
f"Please run `crewai update` to update your pyproject.toml to use uv.",
|
|
fg="red",
|
|
)
|
|
|
|
# Determine crew type
|
|
is_flow = pyproject_data.get("tool", {}).get("crewai", {}).get("type") == "flow"
|
|
crew_type = CrewType.FLOW if is_flow else CrewType.STANDARD
|
|
|
|
# Display appropriate message
|
|
click.echo(f"Running the {'Flow' if is_flow else 'Crew'}")
|
|
|
|
# Execute the appropriate command
|
|
execute_command(crew_type, trained_agents_file=trained_agents_file)
|
|
|
|
|
|
def execute_command(
|
|
crew_type: CrewType, trained_agents_file: str | None = None
|
|
) -> None:
|
|
"""Execute the appropriate command based on crew type.
|
|
|
|
Args:
|
|
crew_type: The type of crew to run.
|
|
trained_agents_file: Optional trained-agents pickle path forwarded to
|
|
the subprocess via the ``CREWAI_TRAINED_AGENTS_FILE`` env var.
|
|
"""
|
|
command = ["uv", "run", "kickoff" if crew_type == CrewType.FLOW else "run_crew"]
|
|
|
|
env = build_env_with_all_tool_credentials()
|
|
if trained_agents_file:
|
|
env[CREWAI_TRAINED_AGENTS_FILE_ENV] = trained_agents_file
|
|
|
|
try:
|
|
subprocess.run(command, capture_output=False, text=True, check=True, env=env) # noqa: S603
|
|
|
|
except subprocess.CalledProcessError as e:
|
|
handle_error(e, crew_type)
|
|
|
|
except Exception as e:
|
|
click.echo(f"An unexpected error occurred: {e}", err=True)
|
|
|
|
|
|
def handle_error(error: subprocess.CalledProcessError, crew_type: CrewType) -> None:
|
|
"""
|
|
Handle subprocess errors with appropriate messaging.
|
|
|
|
Args:
|
|
error: The subprocess error that occurred
|
|
crew_type: The type of crew that was being run
|
|
"""
|
|
entity_type = "flow" if crew_type == CrewType.FLOW else "crew"
|
|
click.echo(f"An error occurred while running the {entity_type}: {error}", err=True)
|
|
|
|
if error.output:
|
|
click.echo(error.output, err=True, nl=True)
|
|
|
|
pyproject_data = read_toml()
|
|
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",
|
|
)
|