mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-05 06:08:29 +00:00
* adding fingerprints * fixed * fix * Fix Pydantic v2 compatibility in SecurityConfig and Fingerprint classes (#2335) * Fix Pydantic v2 compatibility in SecurityConfig and Fingerprint classes Co-Authored-By: Joe Moura <joao@crewai.com> * Fix type-checker errors in fingerprint properties Co-Authored-By: Joe Moura <joao@crewai.com> * Enhance security validation in Fingerprint and SecurityConfig classes Co-Authored-By: Joe Moura <joao@crewai.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Joe Moura <joao@crewai.com> * incorporate small improvements / changes * Expect different * Remove redundant null check in Crew.fingerprint property (#2342) * Remove redundant null check in Crew.fingerprint property and add security module Co-Authored-By: Joe Moura <joao@crewai.com> * Enhance security module with type hints, improved UUID namespace, metadata validation, and versioning Co-Authored-By: Joe Moura <joao@crewai.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Joe Moura <joao@crewai.com> Co-authored-by: João Moura <joaomdmoura@gmail.com> --------- Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Joe Moura <joao@crewai.com> Co-authored-by: Brandon Hancock <brandon@brandonhancock.io>
259 lines
7.3 KiB
Python
259 lines
7.3 KiB
Python
"""Test integration of fingerprinting with Agent, Crew, and Task classes."""
|
|
|
|
import pytest
|
|
|
|
from crewai import Agent, Crew, Task
|
|
from crewai.security import Fingerprint, SecurityConfig
|
|
|
|
|
|
def test_agent_with_security_config():
|
|
"""Test creating an Agent with a SecurityConfig."""
|
|
# Create agent with SecurityConfig
|
|
security_config = SecurityConfig()
|
|
|
|
agent = Agent(
|
|
role="Tester",
|
|
goal="Test fingerprinting",
|
|
backstory="Testing fingerprinting",
|
|
security_config=security_config
|
|
)
|
|
|
|
assert agent.security_config is not None
|
|
assert agent.security_config == security_config
|
|
assert agent.security_config.fingerprint is not None
|
|
assert agent.fingerprint is not None
|
|
|
|
|
|
def test_agent_fingerprint_property():
|
|
"""Test the fingerprint property on Agent."""
|
|
# Create agent without security_config
|
|
agent = Agent(
|
|
role="Tester",
|
|
goal="Test fingerprinting",
|
|
backstory="Testing fingerprinting"
|
|
)
|
|
|
|
# Fingerprint should be automatically generated
|
|
assert agent.fingerprint is not None
|
|
assert isinstance(agent.fingerprint, Fingerprint)
|
|
assert agent.security_config is not None
|
|
|
|
|
|
def test_crew_with_security_config():
|
|
"""Test creating a Crew with a SecurityConfig."""
|
|
# Create crew with SecurityConfig
|
|
security_config = SecurityConfig()
|
|
|
|
agent1 = Agent(
|
|
role="Tester1",
|
|
goal="Test fingerprinting",
|
|
backstory="Testing fingerprinting"
|
|
)
|
|
|
|
agent2 = Agent(
|
|
role="Tester2",
|
|
goal="Test fingerprinting",
|
|
backstory="Testing fingerprinting"
|
|
)
|
|
|
|
crew = Crew(
|
|
agents=[agent1, agent2],
|
|
security_config=security_config
|
|
)
|
|
|
|
assert crew.security_config is not None
|
|
assert crew.security_config == security_config
|
|
assert crew.security_config.fingerprint is not None
|
|
assert crew.fingerprint is not None
|
|
|
|
|
|
def test_crew_fingerprint_property():
|
|
"""Test the fingerprint property on Crew."""
|
|
# Create crew without security_config
|
|
agent1 = Agent(
|
|
role="Tester1",
|
|
goal="Test fingerprinting",
|
|
backstory="Testing fingerprinting"
|
|
)
|
|
|
|
agent2 = Agent(
|
|
role="Tester2",
|
|
goal="Test fingerprinting",
|
|
backstory="Testing fingerprinting"
|
|
)
|
|
|
|
crew = Crew(agents=[agent1, agent2])
|
|
|
|
# Fingerprint should be automatically generated
|
|
assert crew.fingerprint is not None
|
|
assert isinstance(crew.fingerprint, Fingerprint)
|
|
assert crew.security_config is not None
|
|
|
|
|
|
def test_task_with_security_config():
|
|
"""Test creating a Task with a SecurityConfig."""
|
|
# Create task with SecurityConfig
|
|
security_config = SecurityConfig()
|
|
|
|
agent = Agent(
|
|
role="Tester",
|
|
goal="Test fingerprinting",
|
|
backstory="Testing fingerprinting"
|
|
)
|
|
|
|
task = Task(
|
|
description="Test task",
|
|
expected_output="Testing output",
|
|
agent=agent,
|
|
security_config=security_config
|
|
)
|
|
|
|
assert task.security_config is not None
|
|
assert task.security_config == security_config
|
|
assert task.security_config.fingerprint is not None
|
|
assert task.fingerprint is not None
|
|
|
|
|
|
def test_task_fingerprint_property():
|
|
"""Test the fingerprint property on Task."""
|
|
# Create task without security_config
|
|
agent = Agent(
|
|
role="Tester",
|
|
goal="Test fingerprinting",
|
|
backstory="Testing fingerprinting"
|
|
)
|
|
|
|
task = Task(
|
|
description="Test task",
|
|
expected_output="Testing output",
|
|
agent=agent
|
|
)
|
|
|
|
# Fingerprint should be automatically generated
|
|
assert task.fingerprint is not None
|
|
assert isinstance(task.fingerprint, Fingerprint)
|
|
assert task.security_config is not None
|
|
|
|
|
|
def test_end_to_end_fingerprinting():
|
|
"""Test end-to-end fingerprinting across Agent, Crew, and Task."""
|
|
# Create components with auto-generated fingerprints
|
|
agent1 = Agent(
|
|
role="Researcher",
|
|
goal="Research information",
|
|
backstory="Expert researcher"
|
|
)
|
|
|
|
agent2 = Agent(
|
|
role="Writer",
|
|
goal="Write content",
|
|
backstory="Expert writer"
|
|
)
|
|
|
|
task1 = Task(
|
|
description="Research topic",
|
|
expected_output="Research findings",
|
|
agent=agent1
|
|
)
|
|
|
|
task2 = Task(
|
|
description="Write article",
|
|
expected_output="Written article",
|
|
agent=agent2
|
|
)
|
|
|
|
crew = Crew(
|
|
agents=[agent1, agent2],
|
|
tasks=[task1, task2]
|
|
)
|
|
|
|
# Verify all fingerprints were automatically generated
|
|
assert agent1.fingerprint is not None
|
|
assert agent2.fingerprint is not None
|
|
assert task1.fingerprint is not None
|
|
assert task2.fingerprint is not None
|
|
assert crew.fingerprint is not None
|
|
|
|
# Verify fingerprints are unique
|
|
fingerprints = [
|
|
agent1.fingerprint.uuid_str,
|
|
agent2.fingerprint.uuid_str,
|
|
task1.fingerprint.uuid_str,
|
|
task2.fingerprint.uuid_str,
|
|
crew.fingerprint.uuid_str
|
|
]
|
|
assert len(fingerprints) == len(set(fingerprints)), "All fingerprints should be unique"
|
|
|
|
|
|
def test_fingerprint_persistence():
|
|
"""Test that fingerprints persist and don't change."""
|
|
# Create an agent and check its fingerprint
|
|
agent = Agent(
|
|
role="Tester",
|
|
goal="Test fingerprinting",
|
|
backstory="Testing fingerprinting"
|
|
)
|
|
|
|
# Get initial fingerprint
|
|
initial_fingerprint = agent.fingerprint.uuid_str
|
|
|
|
# Access the fingerprint again - it should be the same
|
|
assert agent.fingerprint.uuid_str == initial_fingerprint
|
|
|
|
# Create a task with the agent
|
|
task = Task(
|
|
description="Test task",
|
|
expected_output="Testing output",
|
|
agent=agent
|
|
)
|
|
|
|
# Check that task has its own unique fingerprint
|
|
assert task.fingerprint is not None
|
|
assert task.fingerprint.uuid_str != agent.fingerprint.uuid_str
|
|
|
|
|
|
def test_shared_security_config_fingerprints():
|
|
"""Test that components with the same SecurityConfig share the same fingerprint."""
|
|
# Create a shared SecurityConfig
|
|
shared_security_config = SecurityConfig()
|
|
fingerprint_uuid = shared_security_config.fingerprint.uuid_str
|
|
|
|
# Create multiple components with the same security config
|
|
agent1 = Agent(
|
|
role="Researcher",
|
|
goal="Research information",
|
|
backstory="Expert researcher",
|
|
security_config=shared_security_config
|
|
)
|
|
|
|
agent2 = Agent(
|
|
role="Writer",
|
|
goal="Write content",
|
|
backstory="Expert writer",
|
|
security_config=shared_security_config
|
|
)
|
|
|
|
task = Task(
|
|
description="Write article",
|
|
expected_output="Written article",
|
|
agent=agent1,
|
|
security_config=shared_security_config
|
|
)
|
|
|
|
crew = Crew(
|
|
agents=[agent1, agent2],
|
|
tasks=[task],
|
|
security_config=shared_security_config
|
|
)
|
|
|
|
# Verify all components have the same fingerprint UUID
|
|
assert agent1.fingerprint.uuid_str == fingerprint_uuid
|
|
assert agent2.fingerprint.uuid_str == fingerprint_uuid
|
|
assert task.fingerprint.uuid_str == fingerprint_uuid
|
|
assert crew.fingerprint.uuid_str == fingerprint_uuid
|
|
|
|
# Verify the identity of the fingerprint objects
|
|
assert agent1.fingerprint is shared_security_config.fingerprint
|
|
assert agent2.fingerprint is shared_security_config.fingerprint
|
|
assert task.fingerprint is shared_security_config.fingerprint
|
|
assert crew.fingerprint is shared_security_config.fingerprint |