From 0284095ff81528484bca06a161d88f5daa75596d Mon Sep 17 00:00:00 2001 From: Brandon Hancock Date: Mon, 30 Dec 2024 14:43:18 -0500 Subject: [PATCH] accessing crew directly instead of through uv commands --- src/crewai/cli/crew_chat.py | 95 +++++++++++++++----- src/crewai/cli/templates/crew/pyproject.toml | 2 - 2 files changed, 75 insertions(+), 22 deletions(-) diff --git a/src/crewai/cli/crew_chat.py b/src/crewai/cli/crew_chat.py index 7812e9784..739e55f55 100644 --- a/src/crewai/cli/crew_chat.py +++ b/src/crewai/cli/crew_chat.py @@ -1,11 +1,16 @@ import json -from typing import Any, Dict, List +import sys +from pathlib import Path +from typing import Any, Dict, List, Tuple import click +import tomli from crewai.cli.fetch_chat_llm import fetch_chat_llm from crewai.cli.fetch_crew_inputs import fetch_crew_inputs -from crewai.types.crew_chat import ChatInputs +from crewai.crew import Crew +from crewai.types.crew_chat import ChatInputField, ChatInputs +from crewai.utilities.llm_utils import create_llm def run_chat(): @@ -15,27 +20,27 @@ def run_chat(): Exits if crew_name or crew_description are missing. """ click.secho("Welcome to CrewAI Chat with Function-Calling!", fg="green") - - # 1) Fetch CrewInputs - click.secho("Gathering crew inputs via `fetch_crew_inputs()`...", fg="cyan") - try: - crew_inputs = fetch_crew_inputs() - click.echo(f"CrewInputs: {crew_inputs}") - if not crew_inputs: - click.secho("Error: Failed to fetch crew inputs. Exiting.", fg="red") - return - except Exception as e: - click.secho(f"Error fetching crew inputs: {e}", fg="red") - return + # TODO: Build the crew then get the inputs and schema. + # 1) Build the crew + crew, crew_name = generate_crew() + # TODO: GENERATE DESCRIPTION AUTOMATICALLY + crew_chat_inputs = ChatInputs( + crew_name=crew_name, + crew_description="Crew to research and report on a topic", + inputs=[ + ChatInputField(name="topic", description="Topic to research"), + ], + ) + print("crew_inputs:", crew_chat_inputs) # 2) Generate a tool schema from the crew inputs - crew_tool_schema = generate_crew_tool_schema(crew_inputs) + crew_tool_schema = generate_crew_tool_schema(crew_chat_inputs) # 3) Build initial system message required_fields_str = ( ", ".join( f"{field.name} (desc: {field.description or 'n/a'})" - for field in crew_inputs.inputs + for field in crew_chat_inputs.inputs ) or "(No required fields detected)" ) @@ -52,8 +57,8 @@ def run_chat(): "If a user asks a question outside the crew's scope, provide a brief answer and remind them of the crew's purpose. " "After calling the tool, be prepared to take user feedback and make adjustments as needed. " "If you are ever unsure about a user's request or need clarification, ask the user for more information." - f"\nCrew Name: {crew_inputs.crew_name}" - f"\nCrew Description: {crew_inputs.crew_description}" + f"\nCrew Name: {crew_chat_inputs.crew_name}" + f"\nCrew Description: {crew_chat_inputs.crew_description}" ) messages = [ @@ -63,7 +68,8 @@ def run_chat(): # 4) Retrieve ChatLLM click.secho("\nFetching the Chat LLM...", fg="cyan") try: - chat_llm = fetch_chat_llm() + chat_llm = create_llm(crew.chat_llm) + except Exception as e: click.secho(f"Failed to retrieve Chat LLM: {e}", fg="red") return @@ -77,7 +83,7 @@ def run_chat(): # 5) Prepare available_functions with the wrapper function available_functions = { - crew_inputs.crew_name: run_crew_tool_with_messages, + crew_chat_inputs.crew_name: run_crew_tool_with_messages, } click.secho( @@ -200,3 +206,52 @@ def run_crew_tool(messages: List[Dict[str, str]], **kwargs: Any) -> str: ) except Exception as e: return f"Unexpected error running crew: {e}" + + +def generate_crew() -> Tuple[Crew, str]: + """ + Generates the crew by importing the crew class from the user's project. + """ + # Get the current working directory + cwd = Path.cwd() + + # Path to the pyproject.toml file + pyproject_path = cwd / "pyproject.toml" + if not pyproject_path.exists(): + raise FileNotFoundError("pyproject.toml not found in the current directory.") + + # Load the pyproject.toml file using 'tomli' + with pyproject_path.open("rb") as f: + pyproject_data = tomli.load(f) + + # Get the project name from the 'project' section + project_name = pyproject_data["project"]["name"] + folder_name = project_name + + # Derive the crew class name from the project name + # E.g., if project_name is 'my_project', crew_class_name is 'MyProject' + crew_class_name = project_name.replace("_", " ").title().replace(" ", "") + + # Add the 'src' directory to sys.path + src_path = cwd / "src" + if str(src_path) not in sys.path: + sys.path.insert(0, str(src_path)) + + # Import the crew module + crew_module_name = f"{folder_name}.crew" + try: + crew_module = __import__(crew_module_name, fromlist=[crew_class_name]) + except ImportError as e: + raise ImportError(f"Failed to import crew module {crew_module_name}: {e}") + + # Get the crew class from the module + try: + crew_class = getattr(crew_module, crew_class_name) + except AttributeError: + raise AttributeError( + f"Crew class {crew_class_name} not found in module {crew_module_name}" + ) + + # Instantiate the crew + crew_instance = crew_class().crew() + return crew_instance, crew_class_name diff --git a/src/crewai/cli/templates/crew/pyproject.toml b/src/crewai/cli/templates/crew/pyproject.toml index f02feca3c..5ea8194c8 100644 --- a/src/crewai/cli/templates/crew/pyproject.toml +++ b/src/crewai/cli/templates/crew/pyproject.toml @@ -14,8 +14,6 @@ run_crew = "{{folder_name}}.main:run" train = "{{folder_name}}.main:train" replay = "{{folder_name}}.main:replay" test = "{{folder_name}}.main:test" -fetch_chat_inputs = "{{folder_name}}.main:fetch_chat_inputs" -fetch_chat_llm = "{{folder_name}}.main:fetch_chat_llm" [build-system] requires = ["hatchling"]