diff --git a/src/crewai/agents/agent_builder/base_agent_executor_mixin.py b/src/crewai/agents/agent_builder/base_agent_executor_mixin.py index e7917f2bd..e24390e26 100644 --- a/src/crewai/agents/agent_builder/base_agent_executor_mixin.py +++ b/src/crewai/agents/agent_builder/base_agent_executor_mixin.py @@ -91,6 +91,7 @@ class CrewAgentExecutorMixin: print(f"Missing attributes for long term memory: {e}") pass except Exception as e: + # Only log the error; don't let it affect task output print(f"Failed to add to long term memory: {e}") pass diff --git a/src/crewai/utilities/embedding_configurator.py b/src/crewai/utilities/embedding_configurator.py index e523b60f0..4e3ae27cd 100644 --- a/src/crewai/utilities/embedding_configurator.py +++ b/src/crewai/utilities/embedding_configurator.py @@ -104,28 +104,40 @@ class EmbeddingConfigurator: @staticmethod def _configure_vertexai(config, model_name): - from chromadb.utils.embedding_functions.google_embedding_function import ( - GoogleVertexEmbeddingFunction, - ) - - return GoogleVertexEmbeddingFunction( - model_name=model_name, - api_key=config.get("api_key"), - project_id=config.get("project_id"), - region=config.get("region"), - ) + try: + from chromadb.utils.embedding_functions.google_embedding_function import ( + GoogleVertexEmbeddingFunction, + ) + + return GoogleVertexEmbeddingFunction( + model_name=model_name, + api_key=config.get("api_key"), + project_id=config.get("project_id"), + region=config.get("region"), + ) + except ImportError: + raise ImportError( + "Google Vertex AI dependencies are not installed. " + "Please install them using 'pip install google-cloud-aiplatform'." + ) @staticmethod def _configure_google(config, model_name): - from chromadb.utils.embedding_functions.google_embedding_function import ( - GoogleGenerativeAiEmbeddingFunction, - ) - - return GoogleGenerativeAiEmbeddingFunction( - model_name=model_name, - api_key=config.get("api_key"), - task_type=config.get("task_type"), - ) + try: + from chromadb.utils.embedding_functions.google_embedding_function import ( + GoogleGenerativeAiEmbeddingFunction, + ) + + return GoogleGenerativeAiEmbeddingFunction( + model_name=model_name, + api_key=config.get("api_key"), + task_type=config.get("task_type"), + ) + except ImportError: + raise ImportError( + "Google Generative AI dependencies are not installed. " + "Please install them using 'pip install google-generativeai'." + ) @staticmethod def _configure_cohere(config, model_name): diff --git a/tests/test_output_pydantic.py b/tests/test_output_pydantic.py new file mode 100644 index 000000000..89b66179b --- /dev/null +++ b/tests/test_output_pydantic.py @@ -0,0 +1,65 @@ +import pytest +from unittest.mock import patch, MagicMock +from pydantic import BaseModel, Field +from crewai import Agent, Task, Crew +from crewai.utilities.converter import Converter + +class ResponseFormat(BaseModel): + string: str = Field(description='string needs to be maintained') + +def test_pydantic_model_conversion(): + """Test that pydantic model conversion works without causing import errors.""" + + # Test data + test_string = '{"string": "test value"}' + + # Create a pydantic model directly + result = ResponseFormat.model_validate_json(test_string) + + # Verify the conversion worked + assert result is not None + assert hasattr(result, "string") + assert isinstance(result.string, str) + assert result.string == "test value" + +@patch('crewai.crew.Crew.kickoff') +def test_output_pydantic_with_mocked_crew(mock_kickoff): + """Test that output_pydantic works properly without causing import errors.""" + + # Mock the crew kickoff to return a valid response + mock_result = ResponseFormat(string="mocked result") + mock_kickoff.return_value = mock_result + + # Create a simple agent + agent = Agent( + role="Test Agent", + goal="Test pydantic model output", + backstory="Testing pydantic output functionality", + verbose=True + ) + + # Create a task with output_pydantic + task = Task( + description="Return a simple string", + expected_output="A simple string", + agent=agent, + output_pydantic=ResponseFormat + ) + + # Create a crew with the agent and task + crew = Crew( + agents=[agent], + tasks=[task], + verbose=True + ) + + # Execute the crew (this will use our mock) + result = crew.kickoff() + + # Verify we got a result + assert result is not None + + # Verify the result has a string attribute (as defined in ResponseFormat) + assert hasattr(result, "string") + assert isinstance(result.string, str) + assert result.string == "mocked result"