Hello, I use the socket.io channel provided by Rasa and now I want to pass metadata “through” Rasa, i.e. the incoming event has dynamic metadata that should be added to the outgoing event too. What is the least intrusive way doing this?
I figured that I can simply write a custom input channel and add the metadata like so:
message = UserMessage(
text=data["message"],
output_channel=output_channel,
sender_id=sender_id,
input_channel=self.name(),
metadata=data["metadata"]
)
For the Output channel, though, I have no idea. Any thoughts?
Hi @ScienceGuy, did you have any luck solving this? I am trying to do a similar thing.
Hi, yes it turned out to be quite simple. In the custom INPUT channel, you can define the output channel to use. Here is what I did to add “metadata”.
@sio.on(self.user_message_evt, namespace=self.namespace)
async def handle_message(sid: Text, data: Dict) -> None:
# Changed Output channel to custom channel.
output_channel = CustomSocketIOOutput(sio, self.bot_message_evt, data["metadata"])
Here is my custom output chanel:
class CustomSocketIOOutput(SocketIOOutput):
def __init__(self, sio: AsyncServer, bot_message_evt: Text, metadata: Any) -> None:
self.sio = sio
self.bot_message_evt = bot_message_evt
self.metadata = metadata
async def _send_message(self, socket_id: Text, response: Any) -> None:
"""
Sends a message to the recipient using the bot event.
"""
response['metadata'] = self.metadata
await self.sio.emit(self.bot_message_evt, response, room=socket_id)
Since the input channel seems to define its target output channel, they can share information this way.