Source code for agent_inspect.user_proxy.utils.user_proxy_validators
import logging
from typing import List
from agent_inspect.exception.error_codes import UserProxyComponent, ErrorCode
from agent_inspect.exception import InvalidInputValueError
from agent_inspect.models.user_proxy.terminating_condition import (
TerminatingCondition,
TaskCompletedTerminatingCondition,
TaskDelegatedTerminatingCondition,
TaskBlockedTerminatingCondition,
)
logger = logging.getLogger(__name__)
[docs]
class UserProxyInputValidator:
@staticmethod
def validate_task_summary(task_summary: str):
if not task_summary or task_summary.strip() == "":
raise InvalidInputValueError(
component_code=UserProxyComponent.USER_PROXY_ERROR_CODE.value,
internal_code=ErrorCode.MISSING_VALUE.value,
message="Task summary cannot be empty to create User Proxy.",
)
@staticmethod
def replace_empty_strings_fields_with_defaults(
terminating_condition: TerminatingCondition,
):
if terminating_condition.check.strip() == "":
terminating_condition.check = terminating_condition.__class__.__dataclass_fields__[
"check"
].default
logger.warning(
"Terminating condition check was given as empty string. Replaced with default value."
)
if terminating_condition.stop_sequence.strip() == "":
terminating_condition.stop_sequence = (
terminating_condition.__class__.__dataclass_fields__["stop_sequence"].default
)
logger.warning(
"Terminating condition stop_sequence was given as empty string. Replaced with default value."
)
@staticmethod
def validate_single_terminating_condition(
terminating_conditions: List[TerminatingCondition],
):
if len(terminating_conditions) != 1:
raise InvalidInputValueError(
component_code=UserProxyComponent.USER_PROXY_ERROR_CODE.value,
internal_code=ErrorCode.INVALID_VALUE.value,
message="Exactly one terminating condition must be provided when multi terminating conditions flag is not set.",
)
if type(terminating_conditions[0]) is not TerminatingCondition:
raise InvalidInputValueError(
component_code=UserProxyComponent.USER_PROXY_ERROR_CODE.value,
internal_code=ErrorCode.INVALID_VALUE.value,
message="Terminating condition must be of type TerminatingCondition and not its subclasses when multi terminating conditions flag is not set.",
)
UserProxyInputValidator.replace_empty_strings_fields_with_defaults(
terminating_conditions[0]
)
@staticmethod
def validate_multiple_terminating_conditions(
terminating_conditions: List[TerminatingCondition],
):
completed_condition_count = sum(
1
for condition in terminating_conditions
if isinstance(condition, TaskCompletedTerminatingCondition)
)
delegated_condition_count = sum(
1
for condition in terminating_conditions
if isinstance(condition, TaskDelegatedTerminatingCondition)
)
blocked_condition_count = sum(
1
for condition in terminating_conditions
if isinstance(condition, TaskBlockedTerminatingCondition)
)
base_condition_count = sum(
1 for condition in terminating_conditions if type(condition) is TerminatingCondition
)
if base_condition_count > 0:
raise InvalidInputValueError(
component_code=UserProxyComponent.USER_PROXY_ERROR_CODE.value,
internal_code=ErrorCode.INVALID_VALUE.value,
message="Terminating conditions must be of type TaskCompletedTerminatingCondition, "
"TaskDelegatedTerminatingCondition, or TaskBlockedTerminatingCondition when multi terminating conditions flag is set.",
)
if completed_condition_count > 1:
raise InvalidInputValueError(
component_code=UserProxyComponent.USER_PROXY_ERROR_CODE.value,
internal_code=ErrorCode.INVALID_VALUE.value,
message="Only one task completed terminating condition can be provided.",
)
if delegated_condition_count > 1:
raise InvalidInputValueError(
component_code=UserProxyComponent.USER_PROXY_ERROR_CODE.value,
internal_code=ErrorCode.INVALID_VALUE.value,
message="Only one task delegated terminating condition can be provided.",
)
if blocked_condition_count > 1:
raise InvalidInputValueError(
component_code=UserProxyComponent.USER_PROXY_ERROR_CODE.value,
internal_code=ErrorCode.INVALID_VALUE.value,
message="Only one task blocked terminating condition can be provided.",
)
for terminating_condition in terminating_conditions:
UserProxyInputValidator.replace_empty_strings_fields_with_defaults(
terminating_condition
)
@staticmethod
def validate_terminating_conditions(
terminating_conditions: List[TerminatingCondition], allow_multiple: bool
):
if allow_multiple:
UserProxyInputValidator.validate_multiple_terminating_conditions(terminating_conditions)
else:
UserProxyInputValidator.validate_single_terminating_condition(terminating_conditions)