"""Parameter classes for CopilotKit""" from typing import TypedDict, Optional, Literal, List, Union, cast, Any from typing_extensions import NotRequired class SimpleParameter(TypedDict): """Simple parameter class""" name: str description: NotRequired[str] required: NotRequired[bool] type: NotRequired[Literal["number", "boolean", "number[]", "boolean[]"]] class ObjectParameter(TypedDict): """Object parameter class""" name: str description: NotRequired[str] required: NotRequired[bool] type: Literal["object", "object[]"] attributes: List["Parameter"] class StringParameter(TypedDict): """String parameter class""" name: str description: NotRequired[str] required: NotRequired[bool] type: Literal["string", "string[]"] enum: NotRequired[List[str]] Parameter = Union[SimpleParameter, ObjectParameter, StringParameter] def normalize_parameters(parameters: Optional[List[Parameter]]) -> List[Parameter]: """Normalize the parameters to ensure they have the correct type and format.""" if parameters is None: return [] return [_normalize_parameter(parameter) for parameter in parameters] def _normalize_parameter(parameter: Parameter) -> Parameter: """Normalize a parameter to ensure it has the correct type and format.""" if not "type" in parameter: cast(Any, parameter)["type"] = "string" if not "required" in parameter: parameter["required"] = True if not "description" in parameter: parameter["description"] = "" if "type" in parameter and ( parameter["type"] == "object" or parameter["type"] == "object[]" ): cast(Any, parameter)["attributes"] = normalize_parameters( parameter.get("attributes") ) return parameter