From d1a05a24d7b4c4e61a1785363df3131655f3fd7e Mon Sep 17 00:00:00 2001 From: sbsmith09 Date: Tue, 6 May 2025 22:10:08 +0000 Subject: [PATCH 1/4] Add duplicate evidence error handling and logging utility --- .../utils/duplicate_evidence.py | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 agent-framework/prometheus_swarm/utils/duplicate_evidence.py diff --git a/agent-framework/prometheus_swarm/utils/duplicate_evidence.py b/agent-framework/prometheus_swarm/utils/duplicate_evidence.py new file mode 100644 index 00000000..480facd4 --- /dev/null +++ b/agent-framework/prometheus_swarm/utils/duplicate_evidence.py @@ -0,0 +1,58 @@ +import logging +from typing import Any, Dict, List + +class DuplicateEvidenceError(Exception): + """Custom exception for handling duplicate evidence scenarios.""" + def __init__(self, message: str, existing_evidence: List[Dict[str, Any]] = None): + """ + Initialize DuplicateEvidenceError with detailed information. + + Args: + message (str): Description of the duplicate evidence error + existing_evidence (List[Dict[str, Any]], optional): List of existing evidence entries + """ + self.message = message + self.existing_evidence = existing_evidence or [] + super().__init__(self.message) + +def log_duplicate_evidence(evidence: Dict[str, Any], existing_entries: List[Dict[str, Any]]) -> None: + """ + Log details about duplicate evidence. + + Args: + evidence (Dict[str, Any]): The evidence being checked + existing_entries (List[Dict[str, Any]]): List of existing evidence entries + """ + logger = logging.getLogger(__name__) + logger.warning( + "Duplicate evidence detected", + extra={ + "current_evidence": evidence, + "existing_entries_count": len(existing_entries), + "existing_entries_ids": [entry.get('id') for entry in existing_entries] + } + ) + +def check_duplicate_evidence(new_evidence: Dict[str, Any], existing_evidence: List[Dict[str, Any]], unique_key: str = 'id') -> None: + """ + Check for duplicate evidence and raise an error if duplicates are found. + + Args: + new_evidence (Dict[str, Any]): The new evidence to be added + existing_evidence (List[Dict[str, Any]]): List of existing evidence + unique_key (str, optional): Key to use for identifying duplicates. Defaults to 'id'. + + Raises: + DuplicateEvidenceError: If duplicate evidence is found + """ + duplicates = [ + entry for entry in existing_evidence + if entry.get(unique_key) == new_evidence.get(unique_key) + ] + + if duplicates: + log_duplicate_evidence(new_evidence, duplicates) + raise DuplicateEvidenceError( + f"Evidence with {unique_key} '{new_evidence.get(unique_key)}' already exists", + existing_evidence=duplicates + ) \ No newline at end of file From f0ebc8a58aabfa0782099de1a9d2be04d1a9f8d5 Mon Sep 17 00:00:00 2001 From: sbsmith09 Date: Tue, 6 May 2025 22:10:23 +0000 Subject: [PATCH 2/4] Add unit tests for duplicate evidence error handling --- .../tests/unit/test_duplicate_evidence.py | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 agent-framework/tests/unit/test_duplicate_evidence.py diff --git a/agent-framework/tests/unit/test_duplicate_evidence.py b/agent-framework/tests/unit/test_duplicate_evidence.py new file mode 100644 index 00000000..54e213d4 --- /dev/null +++ b/agent-framework/tests/unit/test_duplicate_evidence.py @@ -0,0 +1,69 @@ +import pytest +import logging +from prometheus_swarm.utils.duplicate_evidence import ( + DuplicateEvidenceError, + check_duplicate_evidence, + log_duplicate_evidence +) + +def test_duplicate_evidence_error(): + """Test the DuplicateEvidenceError is raised correctly.""" + existing_evidence = [ + {'id': 1, 'name': 'Evidence 1'}, + {'id': 2, 'name': 'Evidence 2'} + ] + new_evidence = {'id': 1, 'name': 'Duplicate Evidence'} + + with pytest.raises(DuplicateEvidenceError) as exc_info: + check_duplicate_evidence(new_evidence, existing_evidence) + + assert str(exc_info.value) == "Evidence with id '1' already exists" + assert len(exc_info.value.existing_evidence) == 1 + +def test_no_duplicate_evidence(): + """Test that no error is raised when no duplicates exist.""" + existing_evidence = [ + {'id': 1, 'name': 'Evidence 1'}, + {'id': 2, 'name': 'Evidence 2'} + ] + new_evidence = {'id': 3, 'name': 'New Evidence'} + + try: + check_duplicate_evidence(new_evidence, existing_evidence) + except DuplicateEvidenceError: + pytest.fail("Unexpected DuplicateEvidenceError raised") + +def test_log_duplicate_evidence(caplog): + """Test logging of duplicate evidence.""" + caplog.set_level(logging.WARNING) + + existing_evidence = [ + {'id': 1, 'name': 'Evidence 1'}, + {'id': 2, 'name': 'Evidence 2'} + ] + new_evidence = {'id': 1, 'name': 'Duplicate Evidence'} + + with pytest.raises(DuplicateEvidenceError): + check_duplicate_evidence(new_evidence, existing_evidence) + + assert len(caplog.records) == 1 + log_record = caplog.records[0] + + assert log_record.levelname == 'WARNING' + assert 'Duplicate evidence detected' in log_record.msg + assert log_record.extra['current_evidence'] == new_evidence + assert log_record.extra['existing_entries_count'] == 1 + assert log_record.extra['existing_entries_ids'] == [1] + +def test_custom_unique_key(): + """Test duplicate checking with a custom unique key.""" + existing_evidence = [ + {'key': 'abc', 'name': 'Evidence 1'}, + {'key': 'def', 'name': 'Evidence 2'} + ] + new_evidence = {'key': 'abc', 'name': 'Duplicate Evidence'} + + with pytest.raises(DuplicateEvidenceError) as exc_info: + check_duplicate_evidence(new_evidence, existing_evidence, unique_key='key') + + assert str(exc_info.value) == "Evidence with key 'abc' already exists" \ No newline at end of file From b11e62d145a7789efb4b026d8d2a74dfbdaf95b4 Mon Sep 17 00:00:00 2001 From: sbsmith09 Date: Tue, 6 May 2025 22:10:46 +0000 Subject: [PATCH 3/4] Update logging to use string formatting instead of extra --- .../prometheus_swarm/utils/duplicate_evidence.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/agent-framework/prometheus_swarm/utils/duplicate_evidence.py b/agent-framework/prometheus_swarm/utils/duplicate_evidence.py index 480facd4..8fe8f5d4 100644 --- a/agent-framework/prometheus_swarm/utils/duplicate_evidence.py +++ b/agent-framework/prometheus_swarm/utils/duplicate_evidence.py @@ -25,12 +25,10 @@ def log_duplicate_evidence(evidence: Dict[str, Any], existing_entries: List[Dict """ logger = logging.getLogger(__name__) logger.warning( - "Duplicate evidence detected", - extra={ - "current_evidence": evidence, - "existing_entries_count": len(existing_entries), - "existing_entries_ids": [entry.get('id') for entry in existing_entries] - } + "Duplicate evidence detected. " + f"Current Evidence: {evidence}, " + f"Existing Entries Count: {len(existing_entries)}, " + f"Existing Entries IDs: {[entry.get('id') for entry in existing_entries]}" ) def check_duplicate_evidence(new_evidence: Dict[str, Any], existing_evidence: List[Dict[str, Any]], unique_key: str = 'id') -> None: From dac06aeacc0fdb7a5c0acb09ce788ab9f601c3f6 Mon Sep 17 00:00:00 2001 From: sbsmith09 Date: Tue, 6 May 2025 22:11:05 +0000 Subject: [PATCH 4/4] Update test to match new logging format --- agent-framework/tests/unit/test_duplicate_evidence.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/agent-framework/tests/unit/test_duplicate_evidence.py b/agent-framework/tests/unit/test_duplicate_evidence.py index 54e213d4..e3c57a9d 100644 --- a/agent-framework/tests/unit/test_duplicate_evidence.py +++ b/agent-framework/tests/unit/test_duplicate_evidence.py @@ -51,9 +51,9 @@ def test_log_duplicate_evidence(caplog): assert log_record.levelname == 'WARNING' assert 'Duplicate evidence detected' in log_record.msg - assert log_record.extra['current_evidence'] == new_evidence - assert log_record.extra['existing_entries_count'] == 1 - assert log_record.extra['existing_entries_ids'] == [1] + assert 'Current Evidence: ' + str(new_evidence) in log_record.msg + assert 'Existing Entries Count: 1' in log_record.msg + assert 'Existing Entries IDs: [1]' in log_record.msg def test_custom_unique_key(): """Test duplicate checking with a custom unique key."""