Fix KeyError when specifying function_calling_llm in agents.yaml

Co-Authored-By: Joe Moura <joao@crewai.com>
This commit is contained in:
Devin AI
2025-03-11 08:44:54 +00:00
parent 41a670166a
commit e74c4dd5d6
2 changed files with 85 additions and 3 deletions

View File

@@ -172,9 +172,12 @@ def CrewBase(cls: T) -> T:
]
if function_calling_llm := agent_info.get("function_calling_llm"):
self.agents_config[agent_name]["function_calling_llm"] = agents[
function_calling_llm
]()
try:
self.agents_config[agent_name]["function_calling_llm"] = agents[
function_calling_llm
]()
except KeyError:
self.agents_config[agent_name]["function_calling_llm"] = function_calling_llm
if step_callback := agent_info.get("step_callback"):
self.agents_config[agent_name]["step_callback"] = callbacks[

79
tests/yaml_config_test.py Normal file
View File

@@ -0,0 +1,79 @@
import os
import tempfile
import yaml
import pytest
from crewai.project import CrewBase, agent, crew, task, tool
from crewai import Agent, Crew, Task, Process
from crewai.tools import BaseTool
from pydantic import BaseModel, Field
from typing import Type
def test_function_calling_llm_in_yaml():
"""Test that function_calling_llm can be specified in YAML."""
# Create temporary YAML files
with tempfile.TemporaryDirectory() as temp_dir:
# Create agents.yaml with function_calling_llm
agents_yaml = os.path.join(temp_dir, "agents.yaml")
with open(agents_yaml, "w") as f:
yaml.dump(
{
"test_agent": {
"role": "Test Agent",
"goal": "Test Goal",
"backstory": "Test Backstory",
"function_calling_llm": "gpt-4o-mini"
}
},
f
)
# Create tasks.yaml
tasks_yaml = os.path.join(temp_dir, "tasks.yaml")
with open(tasks_yaml, "w") as f:
yaml.dump(
{
"test_task": {
"description": "Test Task",
"expected_output": "Test Output",
"agent": "test_agent"
}
},
f
)
# Create a CrewBase class that uses the YAML files
@CrewBase
class TestCrew:
"""Test crew with function_calling_llm in YAML."""
agents_config = agents_yaml
tasks_config = tasks_yaml
@agent
def test_agent(self) -> Agent:
return Agent(
config=self.agents_config["test_agent"],
verbose=True
)
@task
def test_task(self) -> Task:
return Task(
config=self.tasks_config["test_task"]
)
@crew
def crew(self) -> Crew:
return Crew(
agents=self.agents,
tasks=self.tasks,
process=Process.sequential,
verbose=True
)
# Initialize the crew - this should not raise a KeyError
test_crew = TestCrew()
crew_instance = test_crew.crew()
# Verify that function_calling_llm was properly set
assert crew_instance.agents[0].function_calling_llm is not None
assert crew_instance.agents[0].function_calling_llm.model == "gpt-4o-mini"