diff --git a/src/pipecat/processors/frameworks/rtvi.py b/src/pipecat/processors/frameworks/rtvi.py index a2aad62bf..d4862a05e 100644 --- a/src/pipecat/processors/frameworks/rtvi.py +++ b/src/pipecat/processors/frameworks/rtvi.py @@ -63,6 +63,7 @@ class RTVIAction(BaseModel): service: str action: str arguments: List[RTVIActionArgument] = [] + result: Literal["bool", "number", "string", "array", "object"] handler: Callable[["RTVIProcessor", str, Dict[str, Any]], Awaitable[ActionResult]] = Field(exclude=True) _arguments_dict: Dict[str, RTVIActionArgument] = PrivateAttr(default={}) @@ -146,6 +147,17 @@ class RTVIDescribeConfig(BaseModel): data: RTVIDescribeConfigData +class RTVIDescribeActionsData(BaseModel): + actions: List[RTVIAction] + + +class RTVIDescribeActions(BaseModel): + label: Literal["rtvi-ai"] = "rtvi-ai" + type: Literal["actions-available"] = "actions-available" + id: str + data: RTVIDescribeActionsData + + class RTVIConfigResponse(BaseModel): label: Literal["rtvi-ai"] = "rtvi-ai" type: Literal["config"] = "config" @@ -334,6 +346,8 @@ class RTVIProcessor(FrameProcessor): try: match message.type: + case "describe-actions": + await self._handle_describe_actions(message.id) case "describe-config": await self._handle_describe_config(message.id) case "get-config": @@ -360,6 +374,12 @@ class RTVIProcessor(FrameProcessor): frame = TransportMessageFrame(message=message.model_dump(exclude_none=True)) await self.push_frame(frame) + async def _handle_describe_actions(self, request_id: str): + actions = list(self._registered_actions.values()) + message = RTVIDescribeActions(id=request_id, data=RTVIDescribeActionsData(actions=actions)) + frame = TransportMessageFrame(message=message.model_dump(exclude_none=True)) + await self.push_frame(frame) + async def _handle_get_config(self, request_id: str): message = RTVIConfigResponse(id=request_id, data=self._config) frame = TransportMessageFrame(message=message.model_dump(exclude_none=True))