mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-03 21:28:29 +00:00
* initial knowledge * WIP * Adding core knowledge sources * Improve types and better support for file paths * added additional sources * fix linting * update yaml to include optional deps * adding in lorenze feedback * ensure embeddings are persisted * improvements all around Knowledge class * return this * properly reset memory * properly reset memory+knowledge * consolodation and improvements * linted * cleanup rm unused embedder * fix test * fix duplicate * generating cassettes for knowledge test * updated default embedder * None embedder to use default on pipeline cloning * improvements * fixed text_file_knowledge * mypysrc fixes * type check fixes * added extra cassette * just mocks * linted * mock knowledge query to not spin up db * linted * verbose run * put a flag * fix * adding docs * better docs * improvements from review * more docs * linted * rm print * more fixes * clearer docs * added docstrings and type hints for cli --------- Co-authored-by: João Moura <joaomdmoura@gmail.com> Co-authored-by: Lorenze Jay <lorenzejaytech@gmail.com>
348 lines
9.0 KiB
Python
348 lines
9.0 KiB
Python
from typing import Optional
|
|
|
|
import click
|
|
import pkg_resources
|
|
|
|
from crewai.cli.add_crew_to_flow import add_crew_to_flow
|
|
from crewai.cli.create_crew import create_crew
|
|
from crewai.cli.create_flow import create_flow
|
|
from crewai.cli.create_pipeline import create_pipeline
|
|
from crewai.memory.storage.kickoff_task_outputs_storage import (
|
|
KickoffTaskOutputsSQLiteStorage,
|
|
)
|
|
|
|
from .authentication.main import AuthenticationCommand
|
|
from .deploy.main import DeployCommand
|
|
from .evaluate_crew import evaluate_crew
|
|
from .install_crew import install_crew
|
|
from .kickoff_flow import kickoff_flow
|
|
from .plot_flow import plot_flow
|
|
from .replay_from_task import replay_task_command
|
|
from .reset_memories_command import reset_memories_command
|
|
from .run_crew import run_crew
|
|
from .tools.main import ToolCommand
|
|
from .train_crew import train_crew
|
|
from .update_crew import update_crew
|
|
|
|
|
|
@click.group()
|
|
def crewai():
|
|
"""Top-level command group for crewai."""
|
|
|
|
|
|
@crewai.command()
|
|
@click.argument("type", type=click.Choice(["crew", "pipeline", "flow"]))
|
|
@click.argument("name")
|
|
@click.option("--provider", type=str, help="The provider to use for the crew")
|
|
@click.option("--skip_provider", is_flag=True, help="Skip provider validation")
|
|
def create(type, name, provider, skip_provider=False):
|
|
"""Create a new crew, pipeline, or flow."""
|
|
if type == "crew":
|
|
create_crew(name, provider, skip_provider)
|
|
elif type == "pipeline":
|
|
create_pipeline(name)
|
|
elif type == "flow":
|
|
create_flow(name)
|
|
else:
|
|
click.secho(
|
|
"Error: Invalid type. Must be 'crew', 'pipeline', or 'flow'.", fg="red"
|
|
)
|
|
|
|
|
|
@crewai.command()
|
|
@click.option(
|
|
"--tools", is_flag=True, help="Show the installed version of crewai tools"
|
|
)
|
|
def version(tools):
|
|
"""Show the installed version of crewai."""
|
|
crewai_version = pkg_resources.get_distribution("crewai").version
|
|
click.echo(f"crewai version: {crewai_version}")
|
|
|
|
if tools:
|
|
try:
|
|
tools_version = pkg_resources.get_distribution("crewai-tools").version
|
|
click.echo(f"crewai tools version: {tools_version}")
|
|
except pkg_resources.DistributionNotFound:
|
|
click.echo("crewai tools not installed")
|
|
|
|
|
|
@crewai.command()
|
|
@click.option(
|
|
"-n",
|
|
"--n_iterations",
|
|
type=int,
|
|
default=5,
|
|
help="Number of iterations to train the crew",
|
|
)
|
|
@click.option(
|
|
"-f",
|
|
"--filename",
|
|
type=str,
|
|
default="trained_agents_data.pkl",
|
|
help="Path to a custom file for training",
|
|
)
|
|
def train(n_iterations: int, filename: str):
|
|
"""Train the crew."""
|
|
click.echo(f"Training the Crew for {n_iterations} iterations")
|
|
train_crew(n_iterations, filename)
|
|
|
|
|
|
@crewai.command()
|
|
@click.option(
|
|
"-t",
|
|
"--task_id",
|
|
type=str,
|
|
help="Replay the crew from this task ID, including all subsequent tasks.",
|
|
)
|
|
def replay(task_id: str) -> None:
|
|
"""
|
|
Replay the crew execution from a specific task.
|
|
|
|
Args:
|
|
task_id (str): The ID of the task to replay from.
|
|
"""
|
|
try:
|
|
click.echo(f"Replaying the crew from task {task_id}")
|
|
replay_task_command(task_id)
|
|
except Exception as e:
|
|
click.echo(f"An error occurred while replaying: {e}", err=True)
|
|
|
|
|
|
@crewai.command()
|
|
def log_tasks_outputs() -> None:
|
|
"""
|
|
Retrieve your latest crew.kickoff() task outputs.
|
|
"""
|
|
try:
|
|
storage = KickoffTaskOutputsSQLiteStorage()
|
|
tasks = storage.load()
|
|
|
|
if not tasks:
|
|
click.echo(
|
|
"No task outputs found. Only crew kickoff task outputs are logged."
|
|
)
|
|
return
|
|
|
|
for index, task in enumerate(tasks, 1):
|
|
click.echo(f"Task {index}: {task['task_id']}")
|
|
click.echo(f"Description: {task['expected_output']}")
|
|
click.echo("------")
|
|
|
|
except Exception as e:
|
|
click.echo(f"An error occurred while logging task outputs: {e}", err=True)
|
|
|
|
|
|
@crewai.command()
|
|
@click.option("-l", "--long", is_flag=True, help="Reset LONG TERM memory")
|
|
@click.option("-s", "--short", is_flag=True, help="Reset SHORT TERM memory")
|
|
@click.option("-e", "--entities", is_flag=True, help="Reset ENTITIES memory")
|
|
@click.option("-kn", "--knowledge", is_flag=True, help="Reset KNOWLEDGE storage")
|
|
@click.option(
|
|
"-k",
|
|
"--kickoff-outputs",
|
|
is_flag=True,
|
|
help="Reset LATEST KICKOFF TASK OUTPUTS",
|
|
)
|
|
@click.option("-a", "--all", is_flag=True, help="Reset ALL memories")
|
|
def reset_memories(
|
|
long: bool,
|
|
short: bool,
|
|
entities: bool,
|
|
knowledge: bool,
|
|
kickoff_outputs: bool,
|
|
all: bool,
|
|
) -> None:
|
|
"""
|
|
Reset the crew memories (long, short, entity, latest_crew_kickoff_ouputs). This will delete all the data saved.
|
|
"""
|
|
try:
|
|
if not all and not (long or short or entities or knowledge or kickoff_outputs):
|
|
click.echo(
|
|
"Please specify at least one memory type to reset using the appropriate flags."
|
|
)
|
|
return
|
|
reset_memories_command(long, short, entities, knowledge, kickoff_outputs, all)
|
|
except Exception as e:
|
|
click.echo(f"An error occurred while resetting memories: {e}", err=True)
|
|
|
|
|
|
@crewai.command()
|
|
@click.option(
|
|
"-n",
|
|
"--n_iterations",
|
|
type=int,
|
|
default=3,
|
|
help="Number of iterations to Test the crew",
|
|
)
|
|
@click.option(
|
|
"-m",
|
|
"--model",
|
|
type=str,
|
|
default="gpt-4o-mini",
|
|
help="LLM Model to run the tests on the Crew. For now only accepting only OpenAI models.",
|
|
)
|
|
def test(n_iterations: int, model: str):
|
|
"""Test the crew and evaluate the results."""
|
|
click.echo(f"Testing the crew for {n_iterations} iterations with model {model}")
|
|
evaluate_crew(n_iterations, model)
|
|
|
|
|
|
@crewai.command(
|
|
context_settings=dict(
|
|
ignore_unknown_options=True,
|
|
allow_extra_args=True,
|
|
)
|
|
)
|
|
@click.pass_context
|
|
def install(context):
|
|
"""Install the Crew."""
|
|
install_crew(context.args)
|
|
|
|
|
|
@crewai.command()
|
|
def run():
|
|
"""Run the Crew."""
|
|
click.echo("Running the Crew")
|
|
run_crew()
|
|
|
|
|
|
@crewai.command()
|
|
def update():
|
|
"""Update the pyproject.toml of the Crew project to use uv."""
|
|
update_crew()
|
|
|
|
|
|
@crewai.command()
|
|
def signup():
|
|
"""Sign Up/Login to CrewAI+."""
|
|
AuthenticationCommand().signup()
|
|
|
|
|
|
@crewai.command()
|
|
def login():
|
|
"""Sign Up/Login to CrewAI+."""
|
|
AuthenticationCommand().signup()
|
|
|
|
|
|
# DEPLOY CREWAI+ COMMANDS
|
|
@crewai.group()
|
|
def deploy():
|
|
"""Deploy the Crew CLI group."""
|
|
pass
|
|
|
|
|
|
@crewai.group()
|
|
def tool():
|
|
"""Tool Repository related commands."""
|
|
pass
|
|
|
|
|
|
@deploy.command(name="create")
|
|
@click.option("-y", "--yes", is_flag=True, help="Skip the confirmation prompt")
|
|
def deploy_create(yes: bool):
|
|
"""Create a Crew deployment."""
|
|
deploy_cmd = DeployCommand()
|
|
deploy_cmd.create_crew(yes)
|
|
|
|
|
|
@deploy.command(name="list")
|
|
def deploy_list():
|
|
"""List all deployments."""
|
|
deploy_cmd = DeployCommand()
|
|
deploy_cmd.list_crews()
|
|
|
|
|
|
@deploy.command(name="push")
|
|
@click.option("-u", "--uuid", type=str, help="Crew UUID parameter")
|
|
def deploy_push(uuid: Optional[str]):
|
|
"""Deploy the Crew."""
|
|
deploy_cmd = DeployCommand()
|
|
deploy_cmd.deploy(uuid=uuid)
|
|
|
|
|
|
@deploy.command(name="status")
|
|
@click.option("-u", "--uuid", type=str, help="Crew UUID parameter")
|
|
def deply_status(uuid: Optional[str]):
|
|
"""Get the status of a deployment."""
|
|
deploy_cmd = DeployCommand()
|
|
deploy_cmd.get_crew_status(uuid=uuid)
|
|
|
|
|
|
@deploy.command(name="logs")
|
|
@click.option("-u", "--uuid", type=str, help="Crew UUID parameter")
|
|
def deploy_logs(uuid: Optional[str]):
|
|
"""Get the logs of a deployment."""
|
|
deploy_cmd = DeployCommand()
|
|
deploy_cmd.get_crew_logs(uuid=uuid)
|
|
|
|
|
|
@deploy.command(name="remove")
|
|
@click.option("-u", "--uuid", type=str, help="Crew UUID parameter")
|
|
def deploy_remove(uuid: Optional[str]):
|
|
"""Remove a deployment."""
|
|
deploy_cmd = DeployCommand()
|
|
deploy_cmd.remove_crew(uuid=uuid)
|
|
|
|
|
|
@tool.command(name="create")
|
|
@click.argument("handle")
|
|
def tool_create(handle: str):
|
|
tool_cmd = ToolCommand()
|
|
tool_cmd.create(handle)
|
|
|
|
|
|
@tool.command(name="install")
|
|
@click.argument("handle")
|
|
def tool_install(handle: str):
|
|
tool_cmd = ToolCommand()
|
|
tool_cmd.login()
|
|
tool_cmd.install(handle)
|
|
|
|
|
|
@tool.command(name="publish")
|
|
@click.option(
|
|
"--force",
|
|
is_flag=True,
|
|
show_default=True,
|
|
default=False,
|
|
help="Bypasses Git remote validations",
|
|
)
|
|
@click.option("--public", "is_public", flag_value=True, default=False)
|
|
@click.option("--private", "is_public", flag_value=False)
|
|
def tool_publish(is_public: bool, force: bool):
|
|
tool_cmd = ToolCommand()
|
|
tool_cmd.login()
|
|
tool_cmd.publish(is_public, force)
|
|
|
|
|
|
@crewai.group()
|
|
def flow():
|
|
"""Flow related commands."""
|
|
pass
|
|
|
|
|
|
@flow.command(name="kickoff")
|
|
def flow_run():
|
|
"""Kickoff the Flow."""
|
|
click.echo("Running the Flow")
|
|
kickoff_flow()
|
|
|
|
|
|
@flow.command(name="plot")
|
|
def flow_plot():
|
|
"""Plot the Flow."""
|
|
click.echo("Plotting the Flow")
|
|
plot_flow()
|
|
|
|
|
|
@flow.command(name="add-crew")
|
|
@click.argument("crew_name")
|
|
def flow_add_crew(crew_name):
|
|
"""Add a crew to an existing flow."""
|
|
click.echo(f"Adding crew {crew_name} to the flow")
|
|
add_crew_to_flow(crew_name)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
crewai()
|