diff --git a/IQ/Automation/On-Demand Runbooks/101-riverbed-iq-assist-suggest-remediation/README.md b/IQ/Automation/On-Demand Runbooks/101-riverbed-iq-assist-suggest-remediation/README.md index 2269ddde..7b920e47 100644 --- a/IQ/Automation/On-Demand Runbooks/101-riverbed-iq-assist-suggest-remediation/README.md +++ b/IQ/Automation/On-Demand Runbooks/101-riverbed-iq-assist-suggest-remediation/README.md @@ -4,13 +4,15 @@ On-demand runbook that suggests remediations to run on a device based on the hea The runbook fetches health events for the request device, uses a first GenAI node to get an analysis of the events and suggested resolutions, then continues the GenAI conversation though a second genAI node to assess what remediation from the available remediations on the tenant would address the issues. -![image](https://github.com/user-attachments/assets/04e0d58b-a53b-4688-ab6d-e437b2e4a5c3) +![image](image.png) -## Prerequisistes +## Prerequisites -1. Aternity integration is installed and the connector is configured (IQ > Integration Library) -2. Remediations available in the Aternity tenant -3. IQ Assist feature is enabled (see help page) +1. Riverbed IQ Assist feature is enabled + +2. Aternity integration is installed and the connector is configured (IQ > Integration Library) + +3. Remediations available in the Aternity tenant ## Quick Setup diff --git a/IQ/Automation/On-Demand Runbooks/101-riverbed-iq-assist-suggest-remediation/Riverbed IQ Assist - Diagnostic and Remediation Suggestion for User Endpoint.json b/IQ/Automation/On-Demand Runbooks/101-riverbed-iq-assist-suggest-remediation/Riverbed IQ Assist - Diagnostic and Remediation Suggestion for User Endpoint.json index a7b1ddb7..02688054 100644 --- a/IQ/Automation/On-Demand Runbooks/101-riverbed-iq-assist-suggest-remediation/Riverbed IQ Assist - Diagnostic and Remediation Suggestion for User Endpoint.json +++ b/IQ/Automation/On-Demand Runbooks/101-riverbed-iq-assist-suggest-remediation/Riverbed IQ Assist - Diagnostic and Remediation Suggestion for User Endpoint.json @@ -1,34 +1,16 @@ { "runbook": { - "id": "18ca3099-32bf-4d53-84a2-4b46759cfe36", - "createdTime": "1740577659.648523300", - "lastUpdatedTime": "1740577797.861110000", + "id": "ed869632-9aae-4db7-8979-c1cb19fa3856", + "createdTime": "1740557225.531146600", + "lastUpdatedTime": "1764176891.810107300", "factoryResourceName": null, "isFactory": false, - "name": "example - Riverbed IQ Assist - Diagnostic and Remediation Suggestion for User Endpoint", + "name": "Demo - Riverbed IQ Assist - On-Demand Diagnostic and Remediation Suggestion for User Endpoint", "description": "Diagnose the user endpoint and suggest remediations", "isReady": false, "triggerType": "on_demand_input", "runtimeVariables": { "primitiveVariables": [ - { - "type": "string", - "defaultValue": "devicename", - "name": "runtime.Device_Name", - "isReadonly": false - }, - { - "type": "string", - "defaultValue": null, - "name": "runtime.Device_Type", - "isReadonly": false - }, - { - "type": "string", - "defaultValue": null, - "name": "runtime.Device_Model", - "isReadonly": false - }, { "type": "boolean", "defaultValue": null, @@ -83,52 +65,53 @@ "subflowVariables": null, "nodes": [ { - "id": "ec14b9db-670d-4594-a25b-87b224257e68", + "id": "1a138bca-e910-45a6-b876-00e2acd374a8", "isIntegrationSubflowNode": false, "type": "on_demand_input", "label": "Input", "description": "", "properties": { - "x": 368.00000000000006, - "y": 350, + "x": 408.0000000000001, + "y": 290, "triggerType": "on_demand_input", "debug": false, "outputDataFormat": "summary", - "synthKeys": [], - "inputVariables": [ - "runtime.Device_Name" + "synthKeys": [ + { + "id": "user_device", + "label": "User Device", + "type": "object", + "unit": "", + "dataOceanId": "user_device", + "dataOceanKeys": [ + { + "id": "user_device.device_name", + "label": "User Device Name", + "type": "string", + "category": "Device", + "unit": "none" + } + ] + } ], + "inputVariables": [], "outputVariables": [] }, "wires": [ [ - "bf00fa98-1597-4ca7-9eba-ea4edfb9849c" + "a7faf9c0-5399-4b96-8125-f8033dfa1552" ] ] }, { - "id": "4f8436da-b45c-4901-8874-cb6cd33e079e", - "isIntegrationSubflowNode": false, - "type": "insight", - "label": "Display Computer Details in IQ", - "description": "", - "properties": { - "x": 917, - "y": 410, - "template": "

User Endpoint: {{variables[\"runtime.Device_Name\"]}} 

", - "debug": false - }, - "wires": [] - }, - { - "id": "4031c6dd-15ce-45e7-8aca-3dd69a7616f8", + "id": "c90e3728-3f44-4cfd-a68a-4719b0628cde", "isIntegrationSubflowNode": false, "type": "genai", "label": "Riverbed IQ Assist: Diagnose Health Events (GenAI)", "description": "", "properties": { "x": 907, - "y": 250, + "y": 270, "instructions": "You are an end-user computing experts, specialist about endpoints especially Windows and Mac OS.\nYour role is to analyze recent health events that can impact the stability of the endpoint. Follow these instructions carefully:\n\n1. Adopt the persona of a professional, concise analyst specializing in troubleshooting performance issues related to endpoints, networks, and applications.\n2. Process the provided data thoroughly to analyze performance trends, metrics, and anomalies. Focus on identifying the **top 3 most relevant findings or anomalies** that are critical to performance.\n3. For each identified issue, include a brief but detailed summary explaining the finding, why it is important, and its potential impact on the system or user experience.\n4. Structure each finding as an itemized, numbered list within an HTML `
` tag to ensure easily readable output. Each item should clearly and concisely describe the issue while maintaining a professional tone.\n5. Ensure that the information is organized, unambiguous, and actionable for the person relying on it.\n\nHere is an example of the expected format for the HTML output:\n\"\"\"\n
\n

Finding #1: [Issue description].
Explanation: [Why this matters and the potential impact].

\n

Finding #2: [Issue description].
Explanation: [Why this matters and the potential impact].

\n

Finding #3: [Issue description].
Explanation: [Why this matters and the potential impact].

\n
\n
\n

AI-generated content

\n
\n\"\"\"\n\nOnly include the top 3 findings—no more, no less. Avoid redundancies and keep the focus on critical insights.", "instructionsLocation": "enter", "queryLocation": "$parent", @@ -136,87 +119,46 @@ }, "wires": [ [ - "485bf125-4b2e-4fb3-9ef7-4e1a7ca92da3" + "1b4f7aef-1579-4546-8d85-4d08766ada06" ] ] }, { - "id": "485bf125-4b2e-4fb3-9ef7-4e1a7ca92da3", + "id": "1b4f7aef-1579-4546-8d85-4d08766ada06", "isIntegrationSubflowNode": false, "type": "set_primitive_variables", "label": "Format Insight Health Events", "description": "", "properties": { "x": 1138, - "y": 270, + "y": 290, "variables": [ { "name": "runtime.Insight_Health_HTML" } ], "transformTemplate": "{% assign title = \"Health Events on \" | append: variables[\"runtime.Device_Name\"] | append: \"\" %}\n{% assign html_string = node_input.output.data[0].keys['gen_ai.response'] | replace: '```html', \"\" | replace: '```', \"\" | replace: '\\n', \"\" | replace: '\\\"', \""\" | replace: '\\\\', '\' | prepend: title %}\n{\n \"runtime.Insight_Health_HTML\": \"{{ html_string }}\"\n}", - "debug": true - }, - "wires": [ - [ - "378955b0-4177-4fca-9f42-eee865adb747", - "17db9e49-1e6f-4f33-8bd6-0b8e57b97658" - ] - ] - }, - { - "id": "bf00fa98-1597-4ca7-9eba-ea4edfb9849c", - "isIntegrationSubflowNode": false, - "type": "subflow", - "label": "Aternity: Get Device Health Events", - "description": "", - "properties": { - "x": 676, - "y": 350, - "debug": false, - "configurationId": "5a13d267-e1d0-4750-aa7a-fd0416499efc", - "in": [ - { - "inner": "subflow.Aternity_Connector", - "outer": "00000000-0000-0000-0000-000000000000", - "method": "connector" - }, - { - "inner": "subflow.Device_Name", - "outer": "runtime.Device_Name", - "method": "runtime" - } - ], - "out": [ - { - "inner": "subflow.Successful", - "outer": "" - }, - { - "inner": "subflow.Error_Message", - "outer": "" - } - ] + "debug": false }, "wires": [ [ - "4031c6dd-15ce-45e7-8aca-3dd69a7616f8", - "4f8436da-b45c-4901-8874-cb6cd33e079e" + "66ccc5ab-0a16-4e79-8839-a1092e8ba2cc", + "99c4fbcd-758e-40e8-bb2b-1fbe2c99f40d" ] ] }, { - "id": "378955b0-4177-4fca-9f42-eee865adb747", + "id": "66ccc5ab-0a16-4e79-8839-a1092e8ba2cc", "isIntegrationSubflowNode": false, "type": "http", "label": "Aternity: Get available Remediations", "description": "", "properties": { "x": 1339, - "y": 350, + "y": 370, "syncCall": { "request": { - "authenticationProfileId": "220091de-418b-4317-889a-c658c4f936ac", + "authenticationProfileId": "", "edgeDeviceId": "", "httpVerbTemplate": "GET", "endpointTemplate": "https://{{variables[\"runtime.Aternity_EUEM_ENV\"]}}-odata.aternity.com/aternity.odata/latest/REMEDIATION_ACTIONS_INVENTORY?$filter=ACCOUNT_ID eq {{variables[\"runtime.Aternity_EUEM_ACCOUNT_ID\"]}} &$select=ACTION_DESCRIPTION,ACTION_NAME,IS_SUPPORTED_MACOS,IS_SUPPORTED_WINDOWS", @@ -230,65 +172,65 @@ }, "wires": [ [ - "ec8bc4f2-dffb-47cf-85d9-8ff8b3fd5172" + "e3db3fde-7d9c-4fcc-9f0d-a3d6aeac3d51" ] ] }, { - "id": "ec8bc4f2-dffb-47cf-85d9-8ff8b3fd5172", + "id": "e3db3fde-7d9c-4fcc-9f0d-a3d6aeac3d51", "isIntegrationSubflowNode": false, "type": "set_primitive_variables", "label": "Extract Remediations", "description": "", "properties": { "x": 1555, - "y": 370, + "y": 390, "variables": [ { "name": "runtime.Remediations" } ], "transformTemplate": "{\n \"runtime.Remediations\": {{ node_input.output.data[0].keys['http_response.body']['value'] | json }}\n\n}", - "debug": true + "debug": false }, "wires": [ [ - "7f2b8ac9-48df-4c2d-b374-02413773acf0" + "55cef427-b5e1-4183-b417-f7f5b4d48275" ] ] }, { - "id": "bc7248ff-f875-4354-8bbb-0b1e38cb6fb8", + "id": "9616cb12-42ef-47a2-8195-0780e22d8e69", "isIntegrationSubflowNode": false, "type": "set_primitive_variables", "label": "Format Insight", "description": "", "properties": { "x": 2246, - "y": 270, + "y": 290, "variables": [ { "name": "runtime.Suggestion_HTML" } ], "transformTemplate": "{% assign html_string = node_input.output.data[0].keys['gen_ai.response'] | replace: '```html', \"\" | replace: '```', \"\" | replace: '\\n', \"\" | replace: '\\\"', \""\" | replace: '\\\\', '\' %}\n{\n \"runtime.Suggestion_HTML\": \"{{ html_string }}\"\n}", - "debug": true + "debug": false }, "wires": [ [ - "94ce60a8-d84e-4c62-adcb-dcb22973ef5b" + "2f991c21-e59d-41ae-a5fc-55cdecc7fea7" ] ] }, { - "id": "94ce60a8-d84e-4c62-adcb-dcb22973ef5b", + "id": "2f991c21-e59d-41ae-a5fc-55cdecc7fea7", "isIntegrationSubflowNode": false, "type": "rvbd_ui_text", "label": "Display: Remediation", "description": "", "properties": { "x": 2481, - "y": 190, + "y": 210, "title": "Suggested Remediations", "row": "20", "notes": "

{{variables[\"runtime.Suggestion_HTML\"]}}

", @@ -297,57 +239,57 @@ "wires": [] }, { - "id": "c794bb00-9130-43fd-8c0c-978939a26443", + "id": "8f97a64d-c825-4079-b62b-02953245cd62", "isIntegrationSubflowNode": false, "type": "genai", "label": "Riverbed IQ Assist: Suggest Remediations (GenAI)", "description": "", "properties": { "x": 2019.9999999999998, - "y": 250, + "y": 270, "instructions": "Follow the instructions in the query", "instructionsLocation": "enter", "queryLocation": "runtime.Prompt_Template", - "debug": true + "debug": false }, "wires": [ [ - "bc7248ff-f875-4354-8bbb-0b1e38cb6fb8" + "9616cb12-42ef-47a2-8195-0780e22d8e69" ] ] }, { - "id": "7f2b8ac9-48df-4c2d-b374-02413773acf0", + "id": "55cef427-b5e1-4183-b417-f7f5b4d48275", "isIntegrationSubflowNode": false, "type": "set_primitive_variables", "label": "Prepare Query", "description": "", "properties": { "x": 1777, - "y": 370, + "y": 390, "variables": [ { "name": "runtime.Prompt_Template" } ], "transformTemplate": "{\n \"runtime.Prompt_Template\": \"As an IT specialist with expertise in troubleshooting Windows issues and PowerShell scripting, you analyze the list of remediations to recommend the most suitable. Structure the response within an HTML `
` tag to ensure easily readable output. Your response concisely describe suggested remediation while maintaining a professional tone.\n\n\nList of remediations:\n{% for item in variables[\"runtime.Remediations\"] %}\nRemediation Name: {{ item.ACTION_NAME | escape | replace: '\\n', \"\" | replace: '\\\"', \""\" | replace: '\\\\', '\' }}\nDescription: {{ item.ACTION_DESCRIPTION | escape | replace: '\\n', \"\" | replace: '\\\"', \""\" | replace: '\\\\', '\' }}\n\n{% endfor %}\n\nExample:\n```html\n\n```\n\nInclude up to 3 relevant remediations—no more, and if not relevant just says 'Could not find relevant remediation'. Avoid redundancies and keep the focus on critical insights.\n\n---\n\n{{variables[\"runtime.Insight_Health_HTML\"]}}\n\"\n}\n\n", - "debug": true + "debug": false }, "wires": [ [ - "c794bb00-9130-43fd-8c0c-978939a26443" + "8f97a64d-c825-4079-b62b-02953245cd62" ] ] }, { - "id": "17db9e49-1e6f-4f33-8bd6-0b8e57b97658", + "id": "99c4fbcd-758e-40e8-bb2b-1fbe2c99f40d", "isIntegrationSubflowNode": false, "type": "rvbd_ui_text", "label": "Display: Diagnostic", "description": "", "properties": { "x": 1344, - "y": 190, + "y": 210, "title": "Diagnostic", "row": "30", "notes": "

{{variables[\"runtime.Insight_Health_HTML\"]}}

", @@ -356,41 +298,84 @@ "wires": [] }, { - "id": "33b36b1d-9991-4e2f-9a58-e74ebdaf487e", + "id": "4a85d86d-8cf9-4e53-9a70-a116c82a8b51", "isIntegrationSubflowNode": false, "type": "comment", "label": "Comment", "description": "", "properties": { - "x": 50, + "x": 108, "y": 50, - "comment": "

Setup

\n

Diagnose the user endpoint and suggest remediations.

\n


\n

Prerequisites:

\n\n


\n


", + "comment": "

Setup

Diagnose the user endpoint and suggest remediations.


Prerequisites:


Demo

", "debug": false }, "wires": [] + }, + { + "id": "799de0d7-1c42-4eca-81e5-35c263bd9ac9", + "isIntegrationSubflowNode": false, + "type": "comment", + "label": "Comment 1", + "description": "", + "properties": { + "x": 128, + "y": 520, + "comment": "

Version 2025-11-05-1

", + "debug": false + }, + "wires": [] + }, + { + "id": "a7faf9c0-5399-4b96-8125-f8033dfa1552", + "isIntegrationSubflowNode": false, + "type": "data_ocean_dynamic", + "label": "Data Store", + "description": "", + "properties": { + "x": 658, + "y": 300, + "objType": "aternity_device_health_events_hourly.traffic", + "timeSeries": false, + "limit": "100", + "topBy": [ + { + "id": "health_event_last_timestamp", + "direction": "desc" + } + ], + "groupBy": [ + "user_device.device_name", + "health_event_name", + "health_event_severity", + "health_event_status", + "health_event_error", + "health_event_details", + "health_event_category", + "health_event_component", + "health_event_last_timestamp" + ], + "duration": 604800, + "filters": {}, + "debug": false + }, + "wires": [ + [ + "c90e3728-3f44-4cfd-a68a-4719b0628cde" + ] + ] } ], "lastUpdatedUser": "Runbook Export", "createdByUser": "Runbook Export", - "eTag": "W/\"datetime'2025-02-26T13%3A49%3A57.8808898Z'\"", + "eTag": "W/\"datetime'2025-11-26T17%3A08%3A11.8250787Z'\"", "variant": "on_demand", - "seriesId": "18ca3099-32bf-4d53-84a2-4b46759cfe36", + "seriesId": "ed869632-9aae-4db7-8979-c1cb19fa3856", "version": "1.0", "otherVersions": null, "isScheduled": false, - "isValidated": true + "isValidated": true, + "isProprietary": false }, - "dependencies": [ - { - "id": "5a13d267-e1d0-4750-aa7a-fd0416499efc", - "type": "subflow", - "name": "Aternity: Get Device Health Events", - "globalId": "Aternity::Get_Device_Health_Events", - "originalVersion": "2.1.0", - "nodeLabel": "Aternity: Get Device Health Events", - "sourceLocation": "integrationLibrary", - "sourcePackageId": "Aternity" - } - ], - "token": "9bbTio6Eq+yPC+robNvU0bGEIdcbLbpPuqJsws+/+vE=" -} + "dependencies": [], + "token": "CKEzfh4EVvW3fNgnKOQlXxqG6ONUxH4Z/KxO+Kn97UU=" +} \ No newline at end of file diff --git a/IQ/Automation/On-Demand Runbooks/101-riverbed-iq-assist-suggest-remediation/image.png b/IQ/Automation/On-Demand Runbooks/101-riverbed-iq-assist-suggest-remediation/image.png new file mode 100644 index 00000000..f43ddd97 Binary files /dev/null and b/IQ/Automation/On-Demand Runbooks/101-riverbed-iq-assist-suggest-remediation/image.png differ