DIAL Chat Visualizer Connector
DIAL Chat Visualizer Connector is a library for connecting custom visualizers - applications which could visualize some special type data (for example plot data for the Plotly).
Public classes to use
ChatVisualizerConnector
- class which provides needed methods for the Visualizer(rendered in the iframe) to interact with DIAL Chat (receive data to visualize).
Prerequisites
For security reason your Dial Chat application should configure sources where your custom visualizers hosted:
ALLOWED_IFRAME_SOURCES
- list of allowed iframe sources in <source> <source>
format.
Note: For development purposes you can set *
ALLOWED_IFRAME_SOURCES=http://localhost:8000
Moreover, it needs to be configured some Visualizer properties:
CUSTOM_VISUALIZERS
- list of the objects with custom visualizers properties. This properties are : { title, description, icon, contentType, url }
.
interface CustomVisualizer {
title: string;
description: string;
icon: string;
contentType: string;
url: string;
}
CUSTOM_VISUALIZERS=[
{
"title":"CUSTOM_VISUALIZER",
"description": "CUSTOM VISUALIZER to render images",
"icon":"data:image/svg+xml;base64,some-base64-image",
"contentType":"image/png,image/jpg",
"url":"http://localhost:8000"
},
{
}
]
Futhermore, model or application should send data in json-like format which should include layout property. This layout object should have width and height properties. All other properties could be set to anything you need for your Visualizer.
export interface CustomVisualizerDataLayout {
width: number;
height: number;
}
export interface CustomVisualizerData {
layout: CustomVisualizerDataLayout;
}
To integrate Visualizer with DIAL CHAT.
- Install library
npm i @epam/ai-dial-chat-visualizer-connector
- Add file to serving folder in your application or just import it in code
import { AttachmentData, ChatVisualizerConnector, CustomVisualizerDataLayout } from '@epam/ai-dial-chat-visualizer-connector';
ChatVisualizerConnector
- class which provides needed methods for the Visualizer(rendered in the iframe) to interact with DIAL Chat (receive data to visualize).
Expects following required arguments:
new ChatVisualizerConnector(dialHost, appName, setData);
AttachmentData
- interface for the payload you will get from the DIAL CHAT
export interface AttachmentData {
mimeType: string;
visualizerData: CustomVisualizerData;
}
CustomVisualizerDataLayout
- interface for the layout you will get from the DIAL CHAT.
Properties width and height is needed for the proper rendering in the DIAL CHAT.
export interface CustomVisualizerDataLayout {
width: number;
height: number;
}
- Set
dialHost
to the DIAL CHAT host you want to connect:
const dialHost = 'https://hosted-dial-chat-domain.com';
- Set
appName
same as title
in the DIAL CHAT configuration in the CUSTOM_VISUALIZERS
environmental variable:
const appName = 'CUSTOM_VISUALIZER';
- Create an instance of
ChatVisualizerConnector
in your code.
ChatVisualizerConnector:
const [data, setData] = useState<AttachmentData>();
const chatVisualizerConnector = useRef<ChatVisualizerConnector | null>(null);
useEffect(() => {
if (!chatVisualizerConnector.current && dialHost && appName) {
chatVisualizerConnector.current = new ChatVisualizerConnector(dialHost, appName, setData);
return () => {
chatVisualizerConnector.current?.destroy();
chatVisualizerConnector.current = null;
};
}
}, [appName, dialHost]);
- Send 'READY' event via
sendReady()
to the DIAL CHAT to inform that your Visualizer is ready (this action will hide loader). Then you could do some preparation (login, etc.) and, after that, send 'READY TO INTERACT' event via sendReadyToInteract()
to inform DIAL CHAT that Visualizer is ready to receive data.
useEffect(() => {
if (appName && dialHost) {
chatVisualizerConnector.current?.sendReady();
chatVisualizerConnector.current?.sendReadyToInteract();
}
}, [dialHost, appName]);
- Make needed type assertion for the data from the DIAL CHAT
Note: Data send by model/application from DIAL CHAT should be the same type as you expect.
interface YourVisualizerLayout extends CustomVisualizerDataLayout {
}
data.visualizerData as { dataToRender: string; layout: YourVisualizerLayout };
- Render data in your Visualizer;
<div>{typedVisualizerData.dataToRender}</div>
Full React code example to connect your custom visualizer:
Module.tsx
import { AttachmentData, ChatVisualizerConnector, CustomVisualizerDataLayout } from '@epam/ai-dial-chat-visualizer-connector';
export const Module: FC = () => {
const [data, setData] = useState<AttachmentData>();
const chatVisualizerConnector = useRef<ChatVisualizerConnector | null>(
null
);
const dialHost = 'https://hosted-dial-chat-domain.com';
const appName = 'CUSTOM_VISUALIZER';
useEffect(() => {
if (!chatVisualizerConnector.current && dialHost && appName) {
chatVisualizerConnector.current = new ChatVisualizerConnector(
dialHost,
appName,
setData
);
return () => {
chatVisualizerConnector.current?.destroy();
chatVisualizerConnector.current = null;
};
}
}, [appName, dialHost]);
useEffect(() => {
if (appName && dialHost) {
chatVisualizerConnector.current?.sendReady();
chatVisualizerConnector.current?.sendReadyToInteract();
}
}, [dialHost, appName]);
const typedVisualizerData = useMemo(() => {
return (
data?.visualizerData && (data.visualizerData as unknown as { dataToRender: string; layout: YourVisualizerLayout })
);
}, [data?.visualizerData]);
return (
<div>
{!!typedVisualizerData?.dataToRender && (
<div>
{typedVisualizerData.dataToRender}
</div>
)}
</div>
);
};
index.ts
import { Module } from "./Module.tsx";
const root = createRoot(document.getElementById("root"));
root.render(<Module />);