From eb8b6d1b87f01c7f62061ccac8c7dc7c34703de4 Mon Sep 17 00:00:00 2001 From: Fernando Pauer Date: Fri, 22 Nov 2024 15:04:16 -0800 Subject: [PATCH] chore: add assistant documentation, overview, kpi, gauge, chart, table, chatbot --- apps/doc-site/.storybook/preview.js | 1 + apps/doc-site/assets/ChatbotPreview.png | Bin 0 -> 127996 bytes apps/doc-site/common/cards.jsx | 89 ++++++++++ .../stories/components/chart/Docs.mdx | 19 +++ .../stories/components/gauge/Docs.mdx | 46 +---- apps/doc-site/stories/components/kpi/Docs.mdx | 49 +----- .../stories/components/kpi/Kpi.stories.tsx | 63 +------ .../stories/components/table/Docs.mdx | 19 +++ .../doc-site/stories/assistant/Overview.mdx | 26 +++ .../stories/assistant/components/Chart.mdx | 86 ++++++++++ .../assistant/components/Chart.stories.tsx | 77 +++++++++ .../stories/assistant/components/Chatbot.mdx | 83 +++++++++ .../assistant/components/Chatbot.stories.tsx | 159 ++++++++++++++++++ .../stories/assistant/components/Gauge.mdx | 73 ++++++++ .../assistant/components/Gauge.stories.tsx | 81 +++++++++ .../stories/assistant/components/KPI.mdx | 83 +++++++++ .../assistant/components/KPI.stories.tsx | 125 ++++++++++++++ .../stories/assistant/components/Table.mdx | 26 +++ .../assistant/components/Table.stories.tsx | 106 ++++++++++++ 19 files changed, 1058 insertions(+), 153 deletions(-) create mode 100644 apps/doc-site/assets/ChatbotPreview.png create mode 100644 packages/doc-site/stories/assistant/Overview.mdx create mode 100644 packages/doc-site/stories/assistant/components/Chart.mdx create mode 100644 packages/doc-site/stories/assistant/components/Chart.stories.tsx create mode 100644 packages/doc-site/stories/assistant/components/Chatbot.mdx create mode 100644 packages/doc-site/stories/assistant/components/Chatbot.stories.tsx create mode 100644 packages/doc-site/stories/assistant/components/Gauge.mdx create mode 100644 packages/doc-site/stories/assistant/components/Gauge.stories.tsx create mode 100644 packages/doc-site/stories/assistant/components/KPI.mdx create mode 100644 packages/doc-site/stories/assistant/components/KPI.stories.tsx create mode 100644 packages/doc-site/stories/assistant/components/Table.mdx create mode 100644 packages/doc-site/stories/assistant/components/Table.stories.tsx diff --git a/apps/doc-site/.storybook/preview.js b/apps/doc-site/.storybook/preview.js index 8850c322d..6086a58a6 100644 --- a/apps/doc-site/.storybook/preview.js +++ b/apps/doc-site/.storybook/preview.js @@ -16,6 +16,7 @@ const preview = { 'Overview', 'Data sources', 'Components', + 'Assistant', 'Core', 'React hooks', ], diff --git a/apps/doc-site/assets/ChatbotPreview.png b/apps/doc-site/assets/ChatbotPreview.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b09c876dc741713d41f138cf00a812bef80857 GIT binary patch literal 127996 zcmd?Qgzd+l6%#doaQL5)x*Kt(26yf|L}sx~r3wt-U1@l6-h#GP-8`^s^6#5BdE1k}owRoj$rF%VT7H zrj^p6m>u$OhOWF|j`nHfCa0|vjw>}}A+CrrFV30*o6 zI&3~=v>xGEsET^Hj6_FE`@|4`&p0t$t0AbqigdtN&eixXTVtxJ~%2Hu;4o6va*a+%jQqgXgR}Tg};DPuZ%L+TGy2mHrHI^*M)166xw{Tsyepk<{sRH z?rSY_mGU<^WE0Y9kMX2RFe|Mu$GA||Un`~)a}7w|Tinv;%iq!ErzZc3NwX4#38{dg7A8YcJ~DwgZgZ)1-;`dQCmB{h9;Z@Myv2C` zfqD(hk2L+!a+(0k)H=eA;pbX{{bQ_pQ{=~T9aUck%4?uC=6uju;SFWwU)xC!m~BODtfiuXv$ zK@2CV&Zwn72(CUL;Um+Ezt%&Rc?szaYRt#gZzSoD zH`^GTapq7xf6!5*+$|Blcue)<1**iGFyyy1IP%0?A74`&gkjW6iK^p2fBZ`lL!FEM zW9~4f4TUClqWJo7KmpMWnjl(6XsP)8FiHV2>8Axru<3K<5ZiJ-d+ed0R1PfMPjpM4 zow=G&2ZOPeRGdi+(WrvbmQIg&uW(-no3zor{6L$v^-?5(AtKx?M^fFTfIb1W22<

EhRK7F+QTS2&0(!u=!|* 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 { /> ); } + +export const AssistantComponentsCards = () => { + return ( + `select ${t.name}`, + selectionGroupLabel: "Item selection" + }} + cardDefinition={{ + header: item => item.title, + sections: [ + { + id: "name", + content: item => ( + + {item.image ? placeholder : null + } + + ) + }, + { + id: "description", + content: item => ( + <> + {item.description}  + Learn more + + ) + } + ] + }} + cardsPerRow={[ + { cards: 1 }, + { minWidth: 500, cards: 3 } + ]} + items={[ + { + name: "Dashboard", + image: "/iot-app-kit/assets/DashboardPreview.jpg", + title: "Dashboard", + link: "/iot-app-kit/?path=/docs/assistant-components-dashboard---docs", + description: "Dashboard component allows you to easily create, modify, view, and organize widgets for a tailored experience to monitor your IoT data." + }, + { + name: "KPI", + image: "/iot-app-kit/assets/KPIPreview.png", + title: "KPI", + link: "/iot-app-kit/?path=/docs/assistant-components-kpi--docs", + description: "The Key Performance Indicator (KPI) component provides a compact representation when you need an overview of your asset properties. This overview provides critical insights into the overall performance of your devices, equipment, and processes." + }, + { + name: "Gauge", + image: "/iot-app-kit/assets/GaugePreview.png", + title: "Gauge", + link: "/iot-app-kit/?path=/docs/assistant-components-gauge--docs", + description: "The Gauge component provides a compact representation of an overview of your asset properties. Visualize critical insights into the overall performance of your devices, equipment, or processes." + }, + { + name: "Chart", + image: "/iot-app-kit/assets/ChartPreview.png", + title: "Chart", + link: "/iot-app-kit/?path=/docs/assistant-components-chart--docs", + description: "The chart component is a way to visualize and navigate time series data from one or more data sources.Chart supports a rich set of features including trend cursors, thresholds, high performance live-streaming and smooth syncing across other IoT App Kit components." + }, + { + name: "Chatbot", + image: "/iot-app-kit/assets/ChatbotPreview.png", + title: "Chatbot", + link: "/iot-app-kit/?path=/docs/assistant-components-chatbot--docs", + description: "The Assistant Chatbot component provides an interactive chat interface for conversational dive-deeps in IoT applications." + }, + { + name: "Table", + title: "Table", + link: "/iot-app-kit/?path=/docs/assistant-components-table--docs", + description: "Presents data in a two-dimensional table format, arranged in columns and rows in a rectangular form." + }, + ]} + loadingText="Loading resources" + empty={`No resources`} + /> + ); +} diff --git a/apps/doc-site/stories/components/chart/Docs.mdx b/apps/doc-site/stories/components/chart/Docs.mdx index fe077b905..0f5190109 100644 --- a/apps/doc-site/stories/components/chart/Docs.mdx +++ b/apps/doc-site/stories/components/chart/Docs.mdx @@ -295,6 +295,25 @@ This specifies the color and position of the legend section. Default value is `u +#### assistant +##### (object, optional) +This specifies settings to enable the IoT Sitewise AI assistant within the component. Please refer to the [AWS documentation for more details about IoT Sitewise AI assistant](https://aws.amazon.com/iot-sitewise/features/). + + +{` +| Name | Type | Default | Description | +| ------------ | ------------ | -------------- | ------------------- | +| \`client\` | object, required | - | Specifies an instantiated assistant client \`IoTSitewiseAssistantClient\`, the assistant client is responsible for interfacing with the Assistant API.| +| \`conversationId\` | string, required | - | Defines a conversation ID to be used as unique identifier for conversations with the assistant, the conversation ID can be the same for multiple components or unique, depending on use cases. | +| \`componentId\` | string, required | - | Each component **must define an unique ID** which will be used by the assistant to manage state and assistant results. | +| \`target\` | object, required | - | Defines the target for the assistant actions, the target options are \`dashboard\` and \`widget\`. For target \`dashboard\` all assistant results will be broadcasted to the Dashboard component, for target \`widget\` the assistant results will be display next to the component. | +| \`enabled\` | boolean, optional | true | Allows to disable or enable the assistant at the component level. | +| \`onAction\` | event, optional | - | Allows to pass a callback function to listen for any assistant action within the component. | +`} + + +**Complete code examples and demos in [Assistant/Components/Chart](/iot-app-kit/?path=/docs/assistant-components-chart--docs) docs.** + ## Alarms diff --git a/apps/doc-site/stories/components/gauge/Docs.mdx b/apps/doc-site/stories/components/gauge/Docs.mdx index df5882fe7..fe328a9b5 100644 --- a/apps/doc-site/stories/components/gauge/Docs.mdx +++ b/apps/doc-site/stories/components/gauge/Docs.mdx @@ -178,7 +178,7 @@ It has the following style settings that are customizable: #### assistant ##### (object, optional) -This specifies settings to enable the IoT Sitewise AI assistant within the component. Please refer to the [AWS documentation for more details about IoT Sitewise AI assistant](#). +This specifies settings to enable the IoT Sitewise AI assistant within the component. Please refer to the [AWS documentation for more details about IoT Sitewise AI assistant](https://aws.amazon.com/iot-sitewise/features/). {` @@ -193,49 +193,7 @@ This specifies settings to enable the IoT Sitewise AI assistant within the compo `} - { - const client = new IoTSitewiseAssistantClient({ - iotSiteWiseClient - }); - - const { generateSummary } = useAssistant({ - assistantClient: client, - }); - - useEffect(() => { - generateSummary({ - componentId: 'my-kpi-component-id', - conversationId: 'my-conversation-id', - target: 'widget', - utterance: 'generate a summary and return the response in markdown format.', - }); - }, []); - - return ( - - ); -};`} /> +**Complete code examples and demos in [Assistant/Components/Gauge](/iot-app-kit/?path=/docs/assistant-components-gauge--docs) docs.** ## Alarms diff --git a/apps/doc-site/stories/components/kpi/Docs.mdx b/apps/doc-site/stories/components/kpi/Docs.mdx index ed8dedc89..bbd86cf53 100644 --- a/apps/doc-site/stories/components/kpi/Docs.mdx +++ b/apps/doc-site/stories/components/kpi/Docs.mdx @@ -116,7 +116,7 @@ For more information, [Number.toFixed](https://developer.mozilla.org/en-US/docs/ #### assistant ##### (object, optional) -This specifies settings to enable the IoT Sitewise AI assistant within the component. Please refer to the [AWS documentation for more details about IoT Sitewise AI assistant](#). +This specifies settings to enable the IoT Sitewise AI assistant within the component. Please refer to the [AWS documentation for more details about IoT Sitewise AI assistant](https://aws.amazon.com/iot-sitewise/features/). {` @@ -131,52 +131,7 @@ This specifies settings to enable the IoT Sitewise AI assistant within the compo `} - - { - const client = new IoTSitewiseAssistantClient({ - iotSiteWiseClient - }); - - const { generateSummary } = useAssistant({ - assistantClient: client, - }); - - useEffect(() => { - generateSummary({ - componentId: 'my-kpi-component-id', - conversationId: 'my-conversation-id', - target: 'widget', - utterance: 'generate a summary and return the response in markdown format.', - }); - }, []); - - return ( -

- ); -};`} /> +**Complete code examples and demos in [Assistant/Components/KPI](/iot-app-kit/?path=/docs/assistant-components-kpi--docs) docs.** ## Alarms diff --git a/apps/doc-site/stories/components/kpi/Kpi.stories.tsx b/apps/doc-site/stories/components/kpi/Kpi.stories.tsx index b77504252..018ce6009 100644 --- a/apps/doc-site/stories/components/kpi/Kpi.stories.tsx +++ b/apps/doc-site/stories/components/kpi/Kpi.stories.tsx @@ -1,5 +1,4 @@ -import { useEffect } from 'react'; -import { KPI, useAssistant } from '@iot-app-kit/react-components'; +import { KPI } from '@iot-app-kit/react-components'; import { mockSinWaveData, mockSinWaveDataWithQuality, @@ -8,9 +7,7 @@ import { mockTimeSeriesDataQueryWithError, mockTimeSeriesDataQueryLoading, } from '@iot-app-kit/testing-util'; -import { IoTSitewiseAssistantClient } from '@iot-app-kit/core-util'; import { type Meta, type StoryObj } from '@storybook/react'; -import { MockInvokeAssistant } from '../../mockAssistantAPI'; // More on how to set up stories at: https://storybook.js.org/docs/7.0/react/writing-stories/introduction const meta: Meta = { @@ -155,61 +152,3 @@ export const SignificantDigits: Story = { significantDigits: 2, }, }; - -const componentId = 'a8cdf292-8a1c-4809-9c9a-3485d88c447b'; -const client = new IoTSitewiseAssistantClient({ - iotSiteWiseClient: { - invokeAssistant: MockInvokeAssistant, - }, - defaultContext: '', -}); - -export const Assistant: Story = { - render: (props) => { - const { generateSummary } = useAssistant({ - assistantClient: client, - }); - - useEffect(() => { - generateSummary({ - componentId, - conversationId: crypto.randomUUID(), - target: 'widget', - utterance: - 'generate a summary and return the response in markdown format.', - }); - }, []); - - return ( -
- -
- ); - }, - args: { - query: mockSinWaveData('5s'), - settings: { - showUnit: true, - showName: true, - showTimestamp: true, - showAggregationAndResolution: true, - fontSize: 30, - secondaryFontSize: 12, - backgroundColor: '#ffffff', - }, - }, -}; diff --git a/apps/doc-site/stories/components/table/Docs.mdx b/apps/doc-site/stories/components/table/Docs.mdx index a8ebefa72..c9051b609 100644 --- a/apps/doc-site/stories/components/table/Docs.mdx +++ b/apps/doc-site/stories/components/table/Docs.mdx @@ -269,6 +269,25 @@ If set to true, the pagination will enable for the table. Use it together with ` ##### (number, optional) The number of items it should display in a table page. Available only if you specify the `paginationEnabled` property as true. +#### assistant +##### (object, optional) +This specifies settings to enable the IoT Sitewise AI assistant within the component. Please refer to the [AWS documentation for more details about IoT Sitewise AI assistant](https://aws.amazon.com/iot-sitewise/features/). + + +{` +| Name | Type | Default | Description | +| ------------ | ------------ | -------------- | ------------------- | +| \`client\` | object, required | - | Specifies an instantiated assistant client \`IoTSitewiseAssistantClient\`, the assistant client is responsible for interfacing with the Assistant API.| +| \`conversationId\` | string, required | - | Defines a conversation ID to be used as unique identifier for conversations with the assistant, the conversation ID can be the same for multiple components or unique, depending on use cases. | +| \`componentId\` | string, required | - | Each component **must define an unique ID** which will be used by the assistant to manage state and assistant results. | +| \`target\` | object, required | - | Defines the target for the assistant actions, the target options are \`dashboard\` and \`widget\`. For target \`dashboard\` all assistant results will be broadcasted to the Dashboard component, for target \`widget\` the assistant results will be display next to the component. | +| \`enabled\` | boolean, optional | true | Allows to disable or enable the assistant at the component level. | +| \`onAction\` | event, optional | - | Allows to pass a callback function to listen for any assistant action within the component. | +`} + + +**Complete code examples and demos in [Assistant/Components/Table](/iot-app-kit/?path=/docs/assistant-components-table--docs) docs.** + ## Alarms diff --git a/packages/doc-site/stories/assistant/Overview.mdx b/packages/doc-site/stories/assistant/Overview.mdx new file mode 100644 index 000000000..43eb4a47e --- /dev/null +++ b/packages/doc-site/stories/assistant/Overview.mdx @@ -0,0 +1,26 @@ +import { Meta, IconGallery, IconItem } from '@storybook/blocks'; +import { AssistantComponentsCards } from "../../common/cards"; + + + +# AWS IoT SiteWise Assistant + +AWS IoT SiteWise Assistant, a generative AI-powered assistant in AWS IoT SiteWise that allows industrial users to gain insights, +solve problems, and take actions from their operational data and other data sources intuitively using natural language queries. + +## Get Started +Please check our user guide about how to setup and enable the AWS IoT Sitewise assistant: [https://docs.aws.amazon.com/iot-sitewise/latest/userguide/assistant-get-started.html](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/assistant-get-started.html) + +## Features + +For more details, please read [Transforming industrial decision making with AWS IoT SiteWise Assistant](https://aws.amazon.com/blogs/industries/transforming-industrial-decision-making-with-aws-iot-sitewise-assistant/) + +- Summarization: Cut through the noise +- Deep-dive: Uncover Insights with Q&A +- Analysis: Accelerating Decision-Making +- Seamless Integration and Accessibility +- Security and Privacy + +## AI-aware app kit components + + \ No newline at end of file diff --git a/packages/doc-site/stories/assistant/components/Chart.mdx b/packages/doc-site/stories/assistant/components/Chart.mdx new file mode 100644 index 000000000..2f2dfccd7 --- /dev/null +++ b/packages/doc-site/stories/assistant/components/Chart.mdx @@ -0,0 +1,86 @@ +import { Canvas, Meta, Story, Source, Markdown, IconItem } from '@storybook/blocks'; + +import * as ChartStories from './Chart.stories'; +import { Icon } from '@cloudscape-design/components'; + + + +# Chart + +The chart component is a way to visualize and navigate time series data from one or more [data sources](/docs/core-datasources--docs). + +Chart supports a rich set of features including trend cursors, thresholds, high performance live-streaming and smooth syncing across other IoT App Kit components. + +This component can be used to draw both line (step-up, step-down, step-mid etc.) and scatter charts. + +## Assistant +##### (object, optional) +This specifies settings to enable the IoT Sitewise AI assistant within the component. Please refer to the [AWS documentation for more details about IoT Sitewise AI assistant](https://aws.amazon.com/iot-sitewise/features/). + + +{` +| Name | Type | Default | Description | +| ------------ | ------------ | -------------- | ------------------- | +| \`client\` | object, required | - | Specifies an instantiated assistant client \`IoTSitewiseAssistantClient\`, the assistant client is responsible for interfacing with the Assistant API.| +| \`conversationId\` | string, required | - | Defines a conversation ID to be used as unique identifier for conversations with the assistant, the conversation ID can be the same for multiple components or unique, depending on use cases. | +| \`componentId\` | string, required | - | Each component **must define an unique ID** which will be used by the assistant to manage state and assistant results. | +| \`target\` | object, required | - | Defines the target for the assistant actions, the target options are \`dashboard\` and \`widget\`. For target \`dashboard\` all assistant results will be broadcasted to the Dashboard component, for target \`widget\` the assistant results will be display next to the component. | +| \`enabled\` | boolean, optional | true | Allows to disable or enable the assistant at the component level. | +| \`onAction\` | event, optional | - | Allows to pass a callback function to listen for any assistant action within the component. | +`} + + + + { + const client = new IoTSitewiseAssistantClient({ + iotSiteWiseClient + }); + + const { generateSummary } = useAssistant({ + assistantClient: client, + }); + + return ( +
+ Please, select an item in the table below: + { + if (event.type === 'selection') { + generateSummary({ + componentId, + conversationId: crypto.randomUUID(), + target: 'widget', + utterance: + 'generate a summary and return the response in markdown format.', + }); + } + } + }} + /> +
+ ); +};`} /> diff --git a/packages/doc-site/stories/assistant/components/Chart.stories.tsx b/packages/doc-site/stories/assistant/components/Chart.stories.tsx new file mode 100644 index 000000000..1d72be117 --- /dev/null +++ b/packages/doc-site/stories/assistant/components/Chart.stories.tsx @@ -0,0 +1,77 @@ +import { Chart, useAssistant } from '@iot-app-kit/react-components'; +import { + mockSinWaveData, +} from '@iot-app-kit/testing-util'; +import { IoTSitewiseAssistantClient } from '@iot-app-kit/core-util'; +import { type Meta, type StoryObj } from '@storybook/react'; +import { MockInvokeAssistant } from '../../mockAssistantAPI'; + +// More on how to set up stories at: https://storybook.js.org/docs/7.0/react/writing-stories/introduction +const meta: Meta = { + title: 'Assistant/Components/Chart', + component: Chart, +}; + +export default meta; + +type Story = StoryObj; + +const componentId1 = 'a1cdf292-8a1c-4809-9c9a-3485d88c447b'; +const componentId2 = 'a2cdf292-8a1c-4809-9c9a-3485d88c447b'; +const client = new IoTSitewiseAssistantClient({ + iotSiteWiseClient: { + invokeAssistant: MockInvokeAssistant, + }, + defaultContext: '', +}); + +export const Assistant: Story = { + render: (props) => { + const { generateSummary, clearAll } = useAssistant({ + assistantClient: client, + }); + + return ( +
+ Please, select an item in the table below: + { + if (event.type === 'selection') { + clearAll(); + generateSummary({ + componentId: componentId1, + conversationId: crypto.randomUUID(), + target: 'widget', + utterance: + 'generate a summary and return the response in markdown format.', + }); + } + } + }} + /> +
+ ) + }, + args: { + queries: [mockSinWaveData()], + viewport: { duration: '30s' }, + }, +}; diff --git a/packages/doc-site/stories/assistant/components/Chatbot.mdx b/packages/doc-site/stories/assistant/components/Chatbot.mdx new file mode 100644 index 000000000..d09933867 --- /dev/null +++ b/packages/doc-site/stories/assistant/components/Chatbot.mdx @@ -0,0 +1,83 @@ +import { Canvas, Meta, Story, Source, Markdown } from '@storybook/blocks'; +import * as ChatbotStories from './Chatbot.stories'; + +# Chatbot + +An AI-powered chatbot component powered by [IoT Sitewise Assistant](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/assistant-get-started.html) pre-trained on large volumes of industrial data and using a large language model (LLM). + +The chatbot allows users like plant managers, quality engineers, and maintenance technicians to gain insights, dive deep on question to solve problems, and get directions how to act directly from their operational and enterprise data. + + + + + +## Chatbot Properties + +The Chatbot component contains the following customizable properties. + +#### messages +##### (array, required) +This specifies a list of messages to visualize in the chatbot. The messages can be harded code or retrieved using useAssistant hooks, learn more about [useAssistant hook](/docs/hooks-useassistant--docs). + +Array of chat messages to display + +Example for messages data. + +`} /> + +#### height +##### (number, required) +This defines a fixed height for the Chatbot. Default behavior is to use 100% of the avaliable height of the parent component. + +#### visible +##### (boolean, optional) +This defines the visible state of the chatbot, this can be used to display or not the chatbot depending on the use case. Default to `true`. + +#### header +##### (object, optional) +This specifies the header settings for the Chatbot component. Default value is `undefined`. + +#### Chatbot Header props: + +{` +| Name | Type | Default | Description | +| ------------ | ------------ | -------------- | ------------------- | +| \`headerText\` | string, required | true | The header title of the chatbot. | +| \`showResetButton\` | boolean, optional | false | Displays the reset button or not. | +| \`showCloseButton\` | boolean, optional | false | Displays the close button or not. | +| \`closeIconName\` | string, optional | 'close' | The icon name used to display the close button. | +| \`onReset\` | function, optional | - | Callback function to listen when customer clicks on the reset button. | +| \`onClose\` | function, optional | - | Callback function to listen when customer clicks on the close button. | +`} + + +#### onSubmit +##### (function, optional) +Callback function to listen when customer clicks on the send button. Default value is `undefined`. + +## More Examples + +### Loading + + +### Error + diff --git a/packages/doc-site/stories/assistant/components/Chatbot.stories.tsx b/packages/doc-site/stories/assistant/components/Chatbot.stories.tsx new file mode 100644 index 000000000..60100dee9 --- /dev/null +++ b/packages/doc-site/stories/assistant/components/Chatbot.stories.tsx @@ -0,0 +1,159 @@ +/* eslint-disable */ +// @ts-nocheck +import { useEffect } from 'react'; +import { ComponentMeta, ComponentStory } from '@storybook/react'; +import { AssistantChatbot, useAssistant, MessageType } from '@iot-app-kit/react-components'; +import { IoTSitewiseAssistantClient } from '@iot-app-kit/core-util'; +import '@cloudscape-design/global-styles/index.css'; +import { MockInvokeAssistant } from '../../mockAssistantAPI'; + +export default { + title: 'Assistant/Components/Chatbot', + component: AssistantChatbot, + argTypes: { + accessKeyId: { control: { type: 'string' } }, + secretAccessKey: { control: { type: 'string' } }, + sessionToken: { control: { type: 'string' } }, + containerWidth: { control: { type: 'number' }, defaultValue: 200 }, + containerHeight: { control: { type: 'number' }, defaultValue: 200 }, + }, + parameters: { + layout: 'fullscreen', + }, +} as ComponentMeta; + +const conversationId = crypto.randomUUID(); +const client = new IoTSitewiseAssistantClient({ + iotSiteWiseClient: { + invokeAssistant: MockInvokeAssistant, + }, + defaultContext: '', +}); + +export const Standard: ComponentStory< + typeof AssistantChatbot +> = () => { + + const { messages, invokeAssistant, clearAll, setMessages } = useAssistant({ + assistantClient: client, + }); + + useEffect(() => { + clearAll(); + setMessages([ + { + content: + 'Who are you ?', + sender: 'user', + type: MessageType.TEXT, + id: crypto.randomUUID(), + loading: false, + }, + { + content: + 'Hello, I am your AWS IoT SiteWise Assistant. Please ask me anything about your dashboard.', + sender: 'assistant', + type: MessageType.TEXT, + id: crypto.randomUUID(), + loading: false, + }, + ]); + }, []); + + const handleSubmit = (utterance: string) => { + invokeAssistant({ componentId: '', conversationId, utterance }); + }; + + return ( +
+ {}} + header={{ + headerText: 'IoT Sitewise Assistant', + showCloseButton: true, + showResetButton: true, + onReset: () => clearAll(), + onClose: () => {}, + }} + /> +
+ ); +}; + +export const LoadingState: ComponentStory< + typeof AssistantChatbot +> = () => { + + const messages = [ + { + content: + 'Processing assistant response, please wait..', + sender: 'assistant', + type: MessageType.TEXT, + id: crypto.randomUUID(), + loading: true, + }, + { + content: + 'Processing assistant response, please wait...processing assistant response, please wait...processing assistant response, please wait...', + sender: 'assistant', + type: MessageType.TEXT, + id: crypto.randomUUID(), + loading: true, + }, + ]; + + return ( +
+ {}} + onClose={() => {}} + /> +
+ ); +}; + +export const ErrorState: ComponentStory< + typeof AssistantChatbot +> = () => { + + const messages = [ + { + content: + 'Processing assistant response, please wait..', + sender: 'assistant', + type: MessageType.TEXT, + id: crypto.randomUUID(), + loading: true, + }, + { + content: 'You do not have the required permissions to use the Sitewise Assistant. Please contact your administrator to request access.', + sender: 'assistant', + type: MessageType.ERROR, + id: crypto.randomUUID(), + loading: false, + payload: { + accessDeniedException: { + name: 'accessDeniedException', + message: 'You do not have the required permissions to use the Sitewise Assistant. Please contact your administrator to request access.', + } + } + } + ]; + + return ( +
+ {}} + onClose={() => {}} + /> +
+ ); +}; \ No newline at end of file diff --git a/packages/doc-site/stories/assistant/components/Gauge.mdx b/packages/doc-site/stories/assistant/components/Gauge.mdx new file mode 100644 index 000000000..54217b99b --- /dev/null +++ b/packages/doc-site/stories/assistant/components/Gauge.mdx @@ -0,0 +1,73 @@ +import { Canvas, Meta, Story, Source, Markdown } from '@storybook/blocks'; +import * as GaugeStories from './Gauge.stories'; + +# Gauge + +The Gauge component provides a compact representation of an overview of your asset properties. +Visualize critical insights into the overall performance of your devices, equipment, or processes. +Interact with IoT data from one or more data sources with Gauge. + + + +## Assistant +##### (object, optional) +This specifies settings to enable the IoT Sitewise AI assistant within the component. Please refer to the [AWS documentation for more details about IoT Sitewise AI assistant](https://aws.amazon.com/iot-sitewise/features/). + + +{` +| Name | Type | Default | Description | +| ------------ | ------------ | -------------- | ------------------- | +| \`client\` | object, required | - | Specifies an instantiated assistant client \`IoTSitewiseAssistantClient\`, the assistant client is responsible for interfacing with the Assistant API.| +| \`conversationId\` | string, required | - | Defines a conversation ID to be used as unique identifier for conversations with the assistant, the conversation ID can be the same for multiple components or unique, depending on use cases. | +| \`componentId\` | string, required | - | Each component **must define an unique ID** which will be used by the assistant to manage state and assistant results. | +| \`target\` | object, required | - | Defines the target for the assistant actions, the target options are \`dashboard\` and \`widget\`. For target \`dashboard\` all assistant results will be broadcasted to the Dashboard component, for target \`widget\` the assistant results will be display next to the component. | +| \`enabled\` | boolean, optional | true | Allows to disable or enable the assistant at the component level. | +| \`onAction\` | event, optional | - | Allows to pass a callback function to listen for any assistant action within the component. | +`} + + + { + const client = new IoTSitewiseAssistantClient({ + iotSiteWiseClient + }); + + const { generateSummary } = useAssistant({ + assistantClient: client, + }); + + useEffect(() => { + generateSummary({ + componentId: 'my-kpi-component-id', + conversationId: 'my-conversation-id', + target: 'widget', + utterance: 'generate a summary and return the response in markdown format.', + }); + }, []); + + return ( + + ); +};`} /> diff --git a/packages/doc-site/stories/assistant/components/Gauge.stories.tsx b/packages/doc-site/stories/assistant/components/Gauge.stories.tsx new file mode 100644 index 000000000..56eab2959 --- /dev/null +++ b/packages/doc-site/stories/assistant/components/Gauge.stories.tsx @@ -0,0 +1,81 @@ +import { useEffect } from 'react'; +// eslint-disable-next-line import/default +import { Gauge, useAssistant} from '@iot-app-kit/react-components'; +import { + mockSinWaveDataWithQuality, +} from '@iot-app-kit/testing-util'; +import { type Meta, type StoryObj } from '@storybook/react'; +import { IoTSitewiseAssistantClient } from '@iot-app-kit/core-util'; +import { MockInvokeAssistant } from '../../mockAssistantAPI'; + +// More on how to set up stories at: https://storybook.js.org/docs/7.0/react/writing-stories/introduction +const meta: Meta = { + title: 'Assistant/Components/Gauge', + component: Gauge, +}; + +export default meta; + +type Story = StoryObj; + +const componentId1 = 'a1cdf292-8a1c-4809-9c9a-3485d88c447b'; +const client = new IoTSitewiseAssistantClient({ + iotSiteWiseClient: { + invokeAssistant: MockInvokeAssistant, + }, + defaultContext: '', +}); + +export const Assistant: Story = { + render: (props) => { + const { generateSummary, clearAll } = useAssistant({ + assistantClient: client, + }); + + useEffect(() => { + clearAll(); + generateSummary({ + componentId: componentId1, + conversationId: crypto.randomUUID(), + target: 'widget', + utterance: + 'generate a summary and return the response in markdown format.', + }); + }, []); + + return ( +
+ +
+ ); + }, + args: { + query: mockSinWaveDataWithQuality({ frequency: '5s', positiveOnly: true }), + settings: { + gaugeThickness: 30, + showUnit: true, + showName: false, + fontSize: 40, + labelFontSize: 16, + unitFontSize: 16, + yMin: -100, + yMax: 100, + }, + }, +}; diff --git a/packages/doc-site/stories/assistant/components/KPI.mdx b/packages/doc-site/stories/assistant/components/KPI.mdx new file mode 100644 index 000000000..f66bf4390 --- /dev/null +++ b/packages/doc-site/stories/assistant/components/KPI.mdx @@ -0,0 +1,83 @@ +import { Canvas, Meta, Story, Source, Markdown } from '@storybook/blocks'; +import * as KPIStories from './KPI.stories'; + + + +# KPI + +The Key Performance Indicator (KPI) component provides a compact representation when you need an overview of your asset properties. +This overview provides critical insights into the overall performance of your devices, equipment, and processes. +The KPI component lets you can interact with IoT data from one or more data sources. + +## Assistant +##### (object, optional) +This specifies settings to enable the IoT Sitewise AI assistant within the component. Please refer to the [AWS documentation for more details about IoT Sitewise AI assistant](https://aws.amazon.com/iot-sitewise/features/). + + +{` +| Name | Type | Default | Description | +| ------------ | ------------ | -------------- | ------------------- | +| \`client\` | object, required | - | Specifies an instantiated assistant client \`IoTSitewiseAssistantClient\`, the assistant client is responsible for interfacing with the Assistant API.| +| \`conversationId\` | string, required | - | Defines a conversation ID to be used as unique identifier for conversations with the assistant, the conversation ID can be the same for multiple components or unique, depending on use cases. | +| \`componentId\` | string, required | - | Each component **must define an unique ID** which will be used by the assistant to manage state and assistant results. | +| \`target\` | object, required | - | Defines the target for the assistant actions, the target options are \`dashboard\` and \`widget\`. For target \`dashboard\` all assistant results will be broadcasted to the Dashboard component, for target \`widget\` the assistant results will be display next to the component. | +| \`enabled\` | boolean, optional | true | Allows to disable or enable the assistant at the component level. | +| \`onAction\` | event, optional | - | Allows to pass a callback function to listen for any assistant action within the component. | +`} + + + + { + const client = new IoTSitewiseAssistantClient({ + iotSiteWiseClient + }); + + const { generateSummary } = useAssistant({ + assistantClient: client, + }); + + useEffect(() => { + generateSummary({ + componentId: 'my-kpi-component-id', + conversationId: 'my-conversation-id', + target: 'widget', + utterance: 'generate a summary and return the response in markdown format.', + }); + }, []); + + return ( +
+ +
+ ); +};`} /> + +## Alarms + + + +When you add an IoT SiteWise alarm to the KPI the alarm's state will be displayed as a label, and the alarm's threshold will be added. + +An IoT SiteWise alarm is triggered based on a SiteWise input property. The associated input property data will automatically be displayed on the KPI as well. diff --git a/packages/doc-site/stories/assistant/components/KPI.stories.tsx b/packages/doc-site/stories/assistant/components/KPI.stories.tsx new file mode 100644 index 000000000..3c83e7a0e --- /dev/null +++ b/packages/doc-site/stories/assistant/components/KPI.stories.tsx @@ -0,0 +1,125 @@ +import { useEffect } from 'react'; +import { KPI, useAssistant } from '@iot-app-kit/react-components'; +import { mockAlarmData, mockSinWaveData } from '@iot-app-kit/testing-util'; +import { IoTSitewiseAssistantClient } from '@iot-app-kit/core-util'; +import { type Meta, type StoryObj } from '@storybook/react'; +import { MockInvokeAssistant } from '../../mockAssistantAPI'; + +// More on how to set up stories at: https://storybook.js.org/docs/7.0/react/writing-stories/introduction +const meta: Meta = { + title: 'Assistant/Components/KPI', + component: KPI, +}; + +export default meta; + +type Story = StoryObj; + +const componentId1 = 'a1cdf292-8a1c-4809-9c9a-3485d88c447b'; +const componentId2 = 'a2cdf292-8a1c-4809-9c9a-3485d88c447b'; +const client = new IoTSitewiseAssistantClient({ + iotSiteWiseClient: { + invokeAssistant: MockInvokeAssistant, + }, + defaultContext: '', +}); + +export const Assistant: Story = { + render: (props) => { + const { generateSummary, clearAll } = useAssistant({ + assistantClient: client, + }); + + useEffect(() => { + clearAll(); + generateSummary({ + componentId: componentId1, + conversationId: crypto.randomUUID(), + target: 'widget', + utterance: + 'generate a summary and return the response in markdown format.', + }); + }, []); + + return ( +
+ +
+ ); + }, + args: { + query: mockSinWaveData('5s'), + settings: { + showUnit: true, + showName: true, + showTimestamp: true, + showAggregationAndResolution: true, + fontSize: 30, + secondaryFontSize: 12, + backgroundColor: '#ffffff', + }, + }, +}; + +export const Alarm: Story = { + render: (props) => { + const { generateSummary, getContextByComponent } = useAssistant({ + assistantClient: client, + }); + + return ( +
+ { + if (event.type === 'summarize') { + generateSummary({ + componentId: event.sourceComponentId, + conversationId: crypto.randomUUID(), + target: 'widget', + utterance: + 'generate a summary and return the response in markdown format.', + context: getContextByComponent(event.sourceComponentId) + }); + } + } + }} + /> +
+ ); + }, + args: { + query: mockAlarmData(), + settings: { + showUnit: true, + showName: true, + showTimestamp: true, + showAggregationAndResolution: true, + fontSize: 30, + secondaryFontSize: 12, + }, + }, +}; \ No newline at end of file diff --git a/packages/doc-site/stories/assistant/components/Table.mdx b/packages/doc-site/stories/assistant/components/Table.mdx new file mode 100644 index 000000000..74396a2ea --- /dev/null +++ b/packages/doc-site/stories/assistant/components/Table.mdx @@ -0,0 +1,26 @@ +import { Meta, Canvas, Source, Markdown } from '@storybook/blocks'; +import * as TableStories from './Table.stories'; + + + +# Table +The table component provides a compact form for viewing one or more data streams from one or more time series data sources. + +## Assistant +##### (object, optional) +This specifies settings to enable the IoT Sitewise AI assistant within the component. Please refer to the [AWS documentation for more details about IoT Sitewise AI assistant](https://aws.amazon.com/iot-sitewise/features/). + + +{` +| Name | Type | Default | Description | +| ------------ | ------------ | -------------- | ------------------- | +| \`client\` | object, required | - | Specifies an instantiated assistant client \`IoTSitewiseAssistantClient\`, the assistant client is responsible for interfacing with the Assistant API.| +| \`conversationId\` | string, required | - | Defines a conversation ID to be used as unique identifier for conversations with the assistant, the conversation ID can be the same for multiple components or unique, depending on use cases. | +| \`componentId\` | string, required | - | Each component **must define an unique ID** which will be used by the assistant to manage state and assistant results. | +| \`target\` | object, required | - | Defines the target for the assistant actions, the target options are \`dashboard\` and \`widget\`. For target \`dashboard\` all assistant results will be broadcasted to the Dashboard component, for target \`widget\` the assistant results will be display next to the component. | +| \`enabled\` | boolean, optional | true | Allows to disable or enable the assistant at the component level. | +| \`onAction\` | event, optional | - | Allows to pass a callback function to listen for any assistant action within the component. | +`} + + + diff --git a/packages/doc-site/stories/assistant/components/Table.stories.tsx b/packages/doc-site/stories/assistant/components/Table.stories.tsx new file mode 100644 index 000000000..2e177643e --- /dev/null +++ b/packages/doc-site/stories/assistant/components/Table.stories.tsx @@ -0,0 +1,106 @@ +import { useEffect } from 'react'; +import { Table, useAssistant, AssistantChatbot } from '@iot-app-kit/react-components'; +import Button from '@cloudscape-design/components/button'; +import { mockAlarmData } from '@iot-app-kit/testing-util'; +import { DATA_TYPE } from '@iot-app-kit/core'; +import { IoTSitewiseAssistantClient } from '@iot-app-kit/core-util'; +import { type Meta, type StoryObj } from '@storybook/react'; +import { MockInvokeAssistant } from '../../mockAssistantAPI'; + +const meta: Meta = { + title: 'Assistant/Components/Table', + component: Table, +}; + +export default meta; + +type Story = StoryObj; + +const VIEWPORT = { duration: '30s' }; + +const LATEST_VALUE = 123.2; +const DATA_STREAM = { + id: 'wind_speed', + name: 'wind_speed', + dataType: DATA_TYPE.NUMBER, + data: [{ x: new Date(2000, 0, 0).getTime(), y: LATEST_VALUE }], + resolution: 0, + unit: 'mph', + isLoading: false, +}; + +const componentId = 'a1cdf292-8a1c-4809-9c9a-3485d88c447b'; +const client = new IoTSitewiseAssistantClient({ + iotSiteWiseClient: { + invokeAssistant: MockInvokeAssistant, + }, + defaultContext: '', +}); + +export const Assistant: Story = { + render: (props) => { + const { messages, generateSummary, clearAll } = useAssistant({ + assistantClient: client, + }); + + useEffect(() => { + clearAll(); + }, []); + + return ( +
+ { + if (event.type === 'selection') { + console.log('onAction', event); + } + } + }} + /> +
+ +
+ {messages.length > 0 ? ( + {}} + /> + ): null } + + ) + }, + args: { + queries: [mockAlarmData()], + }, +};