diff --git a/docs/concepts/agents.mdx b/docs/concepts/agents.mdx index fa954d4fc..4234e6428 100644 --- a/docs/concepts/agents.mdx +++ b/docs/concepts/agents.mdx @@ -255,7 +255,11 @@ custom_agent = Agent( - `response_template`: Formats agent responses -When using custom templates, you can use variables like `{role}`, `{goal}`, and `{input}` in your templates. These will be automatically populated during execution. +When using custom templates, ensure that both `system_template` and `prompt_template` are defined. The `response_template` is optional but recommended for consistent output formatting. + + + +When using custom templates, you can use variables like `{role}`, `{goal}`, and `{backstory}` in your templates. These will be automatically populated during execution. ## Agent Tools diff --git a/pyproject.toml b/pyproject.toml index 085a6e242..f15942207 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ Documentation = "https://docs.crewai.com" Repository = "https://github.com/crewAIInc/crewAI" [project.optional-dependencies] -tools = ["crewai-tools~=0.42.0"] +tools = ["crewai-tools~=0.42.2"] embeddings = [ "tiktoken~=0.7.0" ] diff --git a/src/crewai/cli/templates/crew/pyproject.toml b/src/crewai/cli/templates/crew/pyproject.toml index 6dd0d5067..8f3400a74 100644 --- a/src/crewai/cli/templates/crew/pyproject.toml +++ b/src/crewai/cli/templates/crew/pyproject.toml @@ -5,7 +5,7 @@ description = "{{name}} using crewAI" authors = [{ name = "Your Name", email = "you@example.com" }] requires-python = ">=3.10,<3.13" dependencies = [ - "crewai[tools]>=0.117.0,<1.0.0" + "crewai[tools]>=0.117.1,<1.0.0" ] [project.scripts] diff --git a/src/crewai/cli/templates/flow/pyproject.toml b/src/crewai/cli/templates/flow/pyproject.toml index a03f3eee2..9c89661aa 100644 --- a/src/crewai/cli/templates/flow/pyproject.toml +++ b/src/crewai/cli/templates/flow/pyproject.toml @@ -5,7 +5,7 @@ description = "{{name}} using crewAI" authors = [{ name = "Your Name", email = "you@example.com" }] requires-python = ">=3.10,<3.13" dependencies = [ - "crewai[tools]>=0.117.0,<1.0.0", + "crewai[tools]>=0.117.1,<1.0.0", ] [project.scripts] diff --git a/src/crewai/cli/templates/tool/pyproject.toml b/src/crewai/cli/templates/tool/pyproject.toml index 01fef4c1d..437fb7994 100644 --- a/src/crewai/cli/templates/tool/pyproject.toml +++ b/src/crewai/cli/templates/tool/pyproject.toml @@ -5,7 +5,7 @@ description = "Power up your crews with {{folder_name}}" readme = "README.md" requires-python = ">=3.10,<3.13" dependencies = [ - "crewai[tools]>=0.117.0" + "crewai[tools]>=0.117.1" ] [tool.crewai] diff --git a/src/crewai/utilities/prompts.py b/src/crewai/utilities/prompts.py index 0100f0f07..cd3577874 100644 --- a/src/crewai/utilities/prompts.py +++ b/src/crewai/utilities/prompts.py @@ -54,10 +54,12 @@ class Prompts(BaseModel): response_template=None, ) -> str: """Constructs a prompt string from specified components.""" - if not system_template and not prompt_template: + if not system_template or not prompt_template: + # If any of the required templates are missing, fall back to the default format prompt_parts = [self.i18n.slice(component) for component in components] prompt = "".join(prompt_parts) else: + # All templates are provided, use them prompt_parts = [ self.i18n.slice(component) for component in components @@ -67,8 +69,12 @@ class Prompts(BaseModel): prompt = prompt_template.replace( "{{ .Prompt }}", "".join(self.i18n.slice("task")) ) - response = response_template.split("{{ .Response }}")[0] - prompt = f"{system}\n{prompt}\n{response}" + # Handle missing response_template + if response_template: + response = response_template.split("{{ .Response }}")[0] + prompt = f"{system}\n{prompt}\n{response}" + else: + prompt = f"{system}\n{prompt}" prompt = ( prompt.replace("{goal}", self.agent.goal) diff --git a/tests/agent_test.py b/tests/agent_test.py index 94d68cab2..b3d243a53 100644 --- a/tests/agent_test.py +++ b/tests/agent_test.py @@ -72,9 +72,54 @@ def test_agent_creation(): assert agent.role == "test role" assert agent.goal == "test goal" assert agent.backstory == "test backstory" - assert agent.tools == [] + +def test_agent_with_only_system_template(): + """Test that an agent with only system_template works without errors.""" + agent = Agent( + role="Test Role", + goal="Test Goal", + backstory="Test Backstory", + allow_delegation=False, + system_template="You are a test agent...", + # prompt_template is intentionally missing + ) + + assert agent.role == "Test Role" + assert agent.goal == "Test Goal" + assert agent.backstory == "Test Backstory" + +def test_agent_with_only_prompt_template(): + """Test that an agent with only system_template works without errors.""" + agent = Agent( + role="Test Role", + goal="Test Goal", + backstory="Test Backstory", + allow_delegation=False, + prompt_template="You are a test agent...", + # prompt_template is intentionally missing + ) + + assert agent.role == "Test Role" + assert agent.goal == "Test Goal" + assert agent.backstory == "Test Backstory" +def test_agent_with_missing_response_template(): + """Test that an agent with system_template and prompt_template but no response_template works without errors.""" + agent = Agent( + role="Test Role", + goal="Test Goal", + backstory="Test Backstory", + allow_delegation=False, + system_template="You are a test agent...", + prompt_template="This is a test prompt...", + # response_template is intentionally missing + ) + + assert agent.role == "Test Role" + assert agent.goal == "Test Goal" + assert agent.backstory == "Test Backstory" + def test_agent_default_values(): agent = Agent(role="test role", goal="test goal", backstory="test backstory") assert agent.llm.model == "gpt-4o-mini" diff --git a/uv.lock b/uv.lock index c47eee516..19e5b0e71 100644 --- a/uv.lock +++ b/uv.lock @@ -826,7 +826,7 @@ requires-dist = [ { name = "blinker", specifier = ">=1.9.0" }, { name = "chromadb", specifier = ">=0.5.23" }, { name = "click", specifier = ">=8.1.7" }, - { name = "crewai-tools", marker = "extra == 'tools'", specifier = "~=0.42.0" }, + { name = "crewai-tools", marker = "extra == 'tools'", specifier = "~=0.42.2" }, { name = "docling", marker = "extra == 'docling'", specifier = ">=2.12.0" }, { name = "fastembed", marker = "extra == 'fastembed'", specifier = ">=0.4.1" }, { name = "instructor", specifier = ">=1.3.3" }, @@ -875,7 +875,7 @@ dev = [ [[package]] name = "crewai-tools" -version = "0.42.0" +version = "0.42.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "chromadb" }, @@ -890,9 +890,9 @@ dependencies = [ { name = "pytube" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c2/dc/94e9cdf83f1ac699855ee0624451e68bb00c217e55edd2fa2200de9a7ba4/crewai_tools-0.42.0.tar.gz", hash = "sha256:cf66d48e5a46ecc0964b60bf985f84c5ae4a0a82c4fe35326d5f706fc4020f71", size = 754588 } +sdist = { url = "https://files.pythonhosted.org/packages/17/34/9e63e2db53d8f5c30353f271a3240687a48e55204bbd176a057c0b7658c8/crewai_tools-0.42.2.tar.gz", hash = "sha256:69365ffb168cccfea970e09b308905aa5007cfec60024d731ffac1362a0153c0", size = 754967 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/2b/2245ee519a7c96988c27d65eb224023d9c204101eea44763e3297d3ba01a/crewai_tools-0.42.0-py3-none-any.whl", hash = "sha256:ee095d5366b96ee1ad2558e350abda098065c20d24afd6afe0e49baaa5a371b7", size = 583065 }, + { url = "https://files.pythonhosted.org/packages/4e/43/0f70b95350084e5cb1e1d74e9acb9e18a89ba675b1d579c787c2662baba7/crewai_tools-0.42.2-py3-none-any.whl", hash = "sha256:13727fb68f0efefd21edeb281be3d66ff2f5a3b5029d4e6adef388b11fd5846a", size = 583933 }, ] [[package]]