From 4a5674bc6c0f71c03a2426d7919b1b750547d500 Mon Sep 17 00:00:00 2001
From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Date: Wed, 19 Mar 2025 06:33:45 +0000
Subject: [PATCH 1/5] Fix issue #2402: Handle missing templates gracefully

Co-Authored-By: Joe Moura <joao@crewai.com>
---
 src/crewai/utilities/prompts.py | 12 ++++++---
 test_fix_2402.py                | 42 +++++++++++++++++++++++++++++
 tests/test_templates.py         | 47 +++++++++++++++++++++++++++++++++
 3 files changed, 98 insertions(+), 3 deletions(-)
 create mode 100644 test_fix_2402.py
 create mode 100644 tests/test_templates.py

diff --git a/src/crewai/utilities/prompts.py b/src/crewai/utilities/prompts.py
index 66909644f0..84cd67dfac 100644
--- a/src/crewai/utilities/prompts.py
+++ b/src/crewai/utilities/prompts.py
@@ -54,10 +54,12 @@ def _build_prompt(
         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 @@ def _build_prompt(
             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/test_fix_2402.py b/test_fix_2402.py
new file mode 100644
index 0000000000..c3d385f3c5
--- /dev/null
+++ b/test_fix_2402.py
@@ -0,0 +1,42 @@
+# test_fix_2402.py
+from crewai import Agent, Task, Crew
+
+# Case 1: Only system_template provided
+agent1 = Agent(
+    role="Test Role",
+    goal="Test Goal",
+    backstory="Test Backstory",
+    system_template="You are a test agent...",
+    # prompt_template is intentionally missing
+)
+
+# Case 2: system_template and prompt_template provided, but response_template missing
+agent2 = Agent(
+    role="Test Role",
+    goal="Test Goal",
+    backstory="Test Backstory",
+    system_template="You are a test agent...",
+    prompt_template="This is a test prompt...",
+    # response_template is intentionally missing
+)
+
+# Create tasks and crews
+task1 = Task(description="Test task 1", agent=agent1, expected_output="Test output 1")
+task2 = Task(description="Test task 2", agent=agent2, expected_output="Test output 2")
+
+crew1 = Crew(agents=[agent1], tasks=[task1])
+crew2 = Crew(agents=[agent2], tasks=[task2])
+
+print("Testing agent with only system_template...")
+try:
+    agent1.execute_task(task1)
+    print("Success! No error was raised.")
+except Exception as e:
+    print(f"Error: {e}")
+
+print("\nTesting agent with missing response_template...")
+try:
+    agent2.execute_task(task2)
+    print("Success! No error was raised.")
+except Exception as e:
+    print(f"Error: {e}")
diff --git a/tests/test_templates.py b/tests/test_templates.py
new file mode 100644
index 0000000000..071e1294e6
--- /dev/null
+++ b/tests/test_templates.py
@@ -0,0 +1,47 @@
+"""Test template handling in Agent creation."""
+
+import pytest
+from crewai import Agent, Task, Crew
+
+
+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
+    )
+    
+    task = Task(description="Test task", agent=agent, expected_output="Test output")
+    
+    # This should not raise an error
+    try:
+        agent.execute_task(task)
+        assert True
+    except AttributeError:
+        pytest.fail("AttributeError was raised with only system_template")
+
+
+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
+    )
+    
+    task = Task(description="Test task", agent=agent, expected_output="Test output")
+    
+    # This should not raise an error
+    try:
+        agent.execute_task(task)
+        assert True
+    except AttributeError:
+        pytest.fail("AttributeError was raised with missing response_template")

From b2a0f1052ca96556ce4754e1c16f96e725b9364e Mon Sep 17 00:00:00 2001
From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Date: Wed, 19 Mar 2025 06:35:35 +0000
Subject: [PATCH 2/5] Fix import sorting in test files

Co-Authored-By: Joe Moura <joao@crewai.com>
---
 test_fix_2402.py        | 2 +-
 tests/test_templates.py | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/test_fix_2402.py b/test_fix_2402.py
index c3d385f3c5..7d7b661b78 100644
--- a/test_fix_2402.py
+++ b/test_fix_2402.py
@@ -1,5 +1,5 @@
 # test_fix_2402.py
-from crewai import Agent, Task, Crew
+from crewai import Agent, Crew, Task
 
 # Case 1: Only system_template provided
 agent1 = Agent(
diff --git a/tests/test_templates.py b/tests/test_templates.py
index 071e1294e6..f23c68e86f 100644
--- a/tests/test_templates.py
+++ b/tests/test_templates.py
@@ -1,7 +1,8 @@
 """Test template handling in Agent creation."""
 
 import pytest
-from crewai import Agent, Task, Crew
+
+from crewai import Agent, Crew, Task
 
 
 def test_agent_with_only_system_template():

From 8026f67e5baffa83d1eecc0bb307b79ce70f5f64 Mon Sep 17 00:00:00 2001
From: Vidit-Ostwal <viditostwal@gmail.com>
Date: Wed, 19 Mar 2025 23:21:45 +0530
Subject: [PATCH 3/5] Bluit in top of devin-ai integration

---
 test_fix_2402.py        | 42 ------------------------------------
 tests/agent_test.py     | 45 ++++++++++++++++++++++++++++++++++++++
 tests/test_templates.py | 48 -----------------------------------------
 3 files changed, 45 insertions(+), 90 deletions(-)
 delete mode 100644 test_fix_2402.py
 delete mode 100644 tests/test_templates.py

diff --git a/test_fix_2402.py b/test_fix_2402.py
deleted file mode 100644
index 7d7b661b78..0000000000
--- a/test_fix_2402.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# test_fix_2402.py
-from crewai import Agent, Crew, Task
-
-# Case 1: Only system_template provided
-agent1 = Agent(
-    role="Test Role",
-    goal="Test Goal",
-    backstory="Test Backstory",
-    system_template="You are a test agent...",
-    # prompt_template is intentionally missing
-)
-
-# Case 2: system_template and prompt_template provided, but response_template missing
-agent2 = Agent(
-    role="Test Role",
-    goal="Test Goal",
-    backstory="Test Backstory",
-    system_template="You are a test agent...",
-    prompt_template="This is a test prompt...",
-    # response_template is intentionally missing
-)
-
-# Create tasks and crews
-task1 = Task(description="Test task 1", agent=agent1, expected_output="Test output 1")
-task2 = Task(description="Test task 2", agent=agent2, expected_output="Test output 2")
-
-crew1 = Crew(agents=[agent1], tasks=[task1])
-crew2 = Crew(agents=[agent2], tasks=[task2])
-
-print("Testing agent with only system_template...")
-try:
-    agent1.execute_task(task1)
-    print("Success! No error was raised.")
-except Exception as e:
-    print(f"Error: {e}")
-
-print("\nTesting agent with missing response_template...")
-try:
-    agent2.execute_task(task2)
-    print("Success! No error was raised.")
-except Exception as e:
-    print(f"Error: {e}")
diff --git a/tests/agent_test.py b/tests/agent_test.py
index b5b3aae931..ef07fef892 100644
--- a/tests/agent_test.py
+++ b/tests/agent_test.py
@@ -73,7 +73,52 @@ def test_agent_creation():
     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/tests/test_templates.py b/tests/test_templates.py
deleted file mode 100644
index f23c68e86f..0000000000
--- a/tests/test_templates.py
+++ /dev/null
@@ -1,48 +0,0 @@
-"""Test template handling in Agent creation."""
-
-import pytest
-
-from crewai import Agent, Crew, Task
-
-
-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
-    )
-    
-    task = Task(description="Test task", agent=agent, expected_output="Test output")
-    
-    # This should not raise an error
-    try:
-        agent.execute_task(task)
-        assert True
-    except AttributeError:
-        pytest.fail("AttributeError was raised with only system_template")
-
-
-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
-    )
-    
-    task = Task(description="Test task", agent=agent, expected_output="Test output")
-    
-    # This should not raise an error
-    try:
-        agent.execute_task(task)
-        assert True
-    except AttributeError:
-        pytest.fail("AttributeError was raised with missing response_template")

From c9ecd7f230831b3ed3f5326d659ac321e035a17b Mon Sep 17 00:00:00 2001
From: Vidit-Ostwal <viditostwal@gmail.com>
Date: Wed, 19 Mar 2025 23:30:42 +0530
Subject: [PATCH 4/5] Fixed test cases

---
 tests/agent_test.py | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/tests/agent_test.py b/tests/agent_test.py
index ef07fef892..4a99404599 100644
--- a/tests/agent_test.py
+++ b/tests/agent_test.py
@@ -68,10 +68,9 @@ def test_agent_llm_creation_with_env_vars():
 def test_agent_creation():
     agent = Agent(role="test role", goal="test goal", backstory="test backstory")
 
-    assert agent.role == "test role"
-    assert agent.goal == "test goal"
-    assert agent.backstory == "test backstory"
-    assert agent.tools == []
+    assert agent.role == "Test Role"
+    assert agent.goal == "Test Goal"
+    assert agent.backstory == "Test Backstory"
 
 def test_agent_with_only_system_template():
     """Test that an agent with only system_template works without errors."""
@@ -84,9 +83,9 @@ def test_agent_with_only_system_template():
         # prompt_template is intentionally missing
     )
 
-    assert agent.role == "test role"
-    assert agent.goal == "test goal"
-    assert agent.backstory == "test backstory"
+    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."""
@@ -99,10 +98,11 @@ def test_agent_with_only_prompt_template():
         # prompt_template is intentionally missing
     )
 
-    assert agent.role == "test role"
-    assert agent.goal == "test goal"
-    assert agent.backstory == "test backstory"
+    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(

From 481db1c16a8c8075feff50d305e2feab770d6ae9 Mon Sep 17 00:00:00 2001
From: Vidit-Ostwal <viditostwal@gmail.com>
Date: Wed, 19 Mar 2025 23:35:38 +0530
Subject: [PATCH 5/5] Fixed test cases

---
 tests/agent_test.py | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/tests/agent_test.py b/tests/agent_test.py
index 4a99404599..857eebf2a5 100644
--- a/tests/agent_test.py
+++ b/tests/agent_test.py
@@ -68,9 +68,9 @@ def test_agent_llm_creation_with_env_vars():
 def test_agent_creation():
     agent = Agent(role="test role", goal="test goal", backstory="test backstory")
 
-    assert agent.role == "Test Role"
-    assert agent.goal == "Test Goal"
-    assert agent.backstory == "Test Backstory"
+    assert agent.role == "test role"
+    assert agent.goal == "test goal"
+    assert agent.backstory == "test backstory"
 
 def test_agent_with_only_system_template():
     """Test that an agent with only system_template works without errors."""
@@ -102,7 +102,7 @@ def test_agent_with_only_prompt_template():
     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(
@@ -115,9 +115,9 @@ def test_agent_with_missing_response_template():
         # response_template is intentionally missing
     )
 
-    assert agent.role == "test role"
-    assert agent.goal == "test goal"
-    assert agent.backstory == "test backstory"
+    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")