from typing import Any from core.tools.entities.tool_entities import ToolParameter class ToolParameterConverter: @staticmethod def get_parameter_type(parameter_type: str | ToolParameter.ToolParameterType) -> str: match parameter_type: case ToolParameter.ToolParameterType.STRING \ | ToolParameter.ToolParameterType.SECRET_INPUT \ | ToolParameter.ToolParameterType.SELECT: return 'string' case ToolParameter.ToolParameterType.BOOLEAN: return 'boolean' case ToolParameter.ToolParameterType.NUMBER: return 'number' case _: raise ValueError(f"Unsupported parameter type {parameter_type}") @staticmethod def cast_parameter_by_type(value: Any, parameter_type: str) -> Any: # convert tool parameter config to correct type try: match parameter_type: case ToolParameter.ToolParameterType.STRING \ | ToolParameter.ToolParameterType.SECRET_INPUT \ | ToolParameter.ToolParameterType.SELECT: if value is None: return '' else: return value if isinstance(value, str) else str(value) case ToolParameter.ToolParameterType.BOOLEAN: if value is None: return False elif isinstance(value, str): # Allowed YAML boolean value strings: https://yaml.org/type/bool.html # and also '0' for False and '1' for True match value.lower(): case 'true' | 'yes' | 'y' | '1': return True case 'false' | 'no' | 'n' | '0': return False case _: return bool(value) else: return value if isinstance(value, bool) else bool(value) case ToolParameter.ToolParameterType.NUMBER: if isinstance(value, int) | isinstance(value, float): return value elif isinstance(value, str) and value != '': if '.' in value: return float(value) else: return int(value) case ToolParameter.ToolParameterType.FILE: return value case _: return str(value) except Exception: raise ValueError(f"The tool parameter value {value} is not in correct type of {parameter_type}.")