"""Actions""" import re from inspect import iscoroutinefunction from typing import Optional, List, Callable, TypedDict, Any, cast from .parameter import Parameter, normalize_parameters class ActionDict(TypedDict): """Dict representation of an action""" name: str description: str parameters: List[Parameter] class ActionResultDict(TypedDict): """Dict representation of an action result""" result: Any class Action: # pylint: disable=too-few-public-methods """Action class for CopilotKit""" def __init__( self, *, name: str, handler: Callable, description: Optional[str] = None, parameters: Optional[List[Parameter]] = None, ): self.name = name self.description = description self.parameters = parameters self.handler = handler if not re.match(r"^[a-zA-Z0-9_-]+$", name): raise ValueError( f"Invalid action name '{name}': " + "must consist of alphanumeric characters, underscores, and hyphens only" ) async def execute( self, *, arguments: dict ) -> ActionResultDict: """Execute the action""" result = self.handler(**arguments) return { "result": await result if iscoroutinefunction(self.handler) else result } def dict_repr(self) -> ActionDict: """Dict representation of the action""" return { 'name': self.name, 'description': self.description or '', 'parameters': normalize_parameters(cast(Any, self.parameters)), }