From 18d46c60b7e91186c0866ee5d64f60ed08b48a4f Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 22 May 2024 15:44:33 -0600 Subject: [PATCH 1/5] updated flight logs --- flight-logs/2024-05-22-cocreate.mdx | 62 +++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 flight-logs/2024-05-22-cocreate.mdx diff --git a/flight-logs/2024-05-22-cocreate.mdx b/flight-logs/2024-05-22-cocreate.mdx new file mode 100644 index 00000000..62fbdaa4 --- /dev/null +++ b/flight-logs/2024-05-22-cocreate.mdx @@ -0,0 +1,62 @@ +--- +title: Log 29 🛫 +description: Flight Log of Co-Creation Activities +slug: flight-log-29 +tags: [log] +--- + +## Objective +Deploy watsonx.ai on self-managed AWS infrastructure for customer software evaluation + +```mermaid +flowchart LR + A(Deploy Services)-->B + subgraph "You are here" + B(Application Verification) + end +``` + +## Milestones +1. Deploy and configuration of boot node to establish a beach-head into the customer AWS environment + - Complete +2. Deploy OCP using the documented UPI installation steps + - Complete +3. Install Cloud Pak for Data + - Complete +4. Deploy and configure watsonx.ai on self-managed AWS infrastructure on ref environment and document + - In Progress + +### Summary +- Continuing to investigate NeuralSeek configuration / CP4D + - Support team reviewing CP4D install and connectivity + - Potential issues found on customer network blocking API connectivity + Run port forward service on port 8888 + ```shell + oc port-forward service/ibm-nginx-svc 8888:443 + ``` + From a new terminal on the same node: + ```shell + ss -tlnp + ``` + Verified 8888 listenting on localhost + ```shell + # Custom support js + curl -k -LO https://127.0.0.1:8888/common-nav/api/nls/login-nls.js + ``` + Output shows Pod recieving required files + Something in between the pods that disallows authenticated traffic + - Customer to engage network team to assess / log network traffic via AWS +- Issue resolved + - There were eronious EC2 instances in the AWS load balencer from previous configurations that interfered with cluster communication + - Issue was not constant and only appeared when network traffic was sent to an incorrect destination (non-existant) by the load balencer +- Ready to continue application verification + +## Decisions and Action Items (DAI) +- None pending + +## Lessons Learned +- Cleaning previous networking configurations + +## Next Steps +- Application validation + - watsonx Orchestrate \ No newline at end of file From 15ccc9bf034f19a85259114143a2a9eb3ce3d3d3 Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 24 May 2024 09:42:33 -0600 Subject: [PATCH 2/5] updated flight logs --- flight-logs/2024-05-16-cocreate.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flight-logs/2024-05-16-cocreate.mdx b/flight-logs/2024-05-16-cocreate.mdx index 9b0d1de2..101c6620 100644 --- a/flight-logs/2024-05-16-cocreate.mdx +++ b/flight-logs/2024-05-16-cocreate.mdx @@ -1,7 +1,7 @@ --- title: Log 26 🛫 description: Flight Log of Co-Creation Activities -slug: flight-log-26 +slug: flight-log-2 tags: [log] --- From 464cf6e6209116fa64b896bb9f5bc2c08815b70b Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 28 May 2024 10:45:11 -0600 Subject: [PATCH 3/5] updated documentation for watsonx Orchestrate --- docs/3-Use-Cases/Watsonx Assistant.mdx | 8 +- docs/3-Use-Cases/Watsonx Orchestrate.mdx | 101 +++- .../Watsonx Orchestrate ServiceNow API.yml | 493 ++++++++++++++++++ 3 files changed, 595 insertions(+), 7 deletions(-) create mode 100644 docs/3-Use-Cases/assets/wxo_scripts/Watsonx Orchestrate ServiceNow API.yml diff --git a/docs/3-Use-Cases/Watsonx Assistant.mdx b/docs/3-Use-Cases/Watsonx Assistant.mdx index 015c627d..f34ec835 100644 --- a/docs/3-Use-Cases/Watsonx Assistant.mdx +++ b/docs/3-Use-Cases/Watsonx Assistant.mdx @@ -1,11 +1,11 @@ --- id: Watsonx-Assistant sidebar_position: 4 -title: Watsonx Assistant +title: watsonx Assistant custom_edit_url: null --- ## Pre-Requisites -- Access to Watsonx Assistant +- Access to watsonx Assistant ## Create new Assistant 1. When you first launch the experience, you’ll be prompted to create your first assistant: @@ -28,7 +28,7 @@ To reinstate a backup copy of actions that you exported from another service ins ## Create Custom Extension: NeuralSeek ### Pre-Requisites -- Access to NeuralSeek instance that has been integrated with Watson Discovery and Watsonx.ai +- Access to NeuralSeek instance that has been integrated with Watson Discovery and watsonx.ai ### Create NeuralSeek custom extension 1. In Watson Assistant, on the "Integrations" tab of Watson Assistant, click "Build Custom Extension" then "Next". 2. Name the extension "NeuralSeek" and give a brief description. Click "Next". @@ -93,6 +93,6 @@ To reinstate a backup copy of actions that you exported from another service ins 2. Select "Build Custom Extension" 3. For the "Basic Information" page fill out all appropriate fields and click "Next" 4. Upload the Service Now OpenAPI spec, click "Next" and then "Finish" -5. Within the extensions in Watsonx Assistant click "Add+" on the recently made ServiceNow custom extension +5. Within the extensions in watsonx Assistant click "Add+" on the recently made ServiceNow custom extension 6. On the Authentication page fill out the **username** and **password** fields with the values saved from "Get Developer Instance Credentials and OpenAPI spec" step 3 7. Click "Next" and then "Finish" diff --git a/docs/3-Use-Cases/Watsonx Orchestrate.mdx b/docs/3-Use-Cases/Watsonx Orchestrate.mdx index a77493ec..122956d9 100644 --- a/docs/3-Use-Cases/Watsonx Orchestrate.mdx +++ b/docs/3-Use-Cases/Watsonx Orchestrate.mdx @@ -1,8 +1,103 @@ --- id: Watsonx-Orchestrate sidebar_position: 5 -title: Watsonx Orchestrate +title: watsonx Orchestrate custom_edit_url: null --- -- Skills 1 -- Skills 2 \ No newline at end of file + +## Default Skills +watsonx Orchestrate provides a set of out-of-the-box skills and the ability to add custom skills. To add skills, go to the skill catalog and add each skill that you would like to use. +Skills can also be added to a skill workflow, or "composite" skill. + +## ServiceNow Skills +ServiceNow skills can be added from the out-of-box list or added as a custom skill (instructions below). For this documentation we will be using a custom skill. Custom ServiceNow skill documentation referenced from the [watsonx Orchestrate Solutions Document](https://ibm-client-engineering.github.io/solution-watsonx-orchestrate/) + +:::tip +Both custom and default skills for ServiceNow require a ServiceNow developer account. +To create a ServiceNow Developer account and your own ServiceNow instance, [do so here.](https://developer.servicenow.com/dev.do) +::: + +### ServiceNow Custom Skill + +#### Download and prepare the yaml + +1. Download the latest .yaml file here +2. Open the script and replace the ServiceNow instance URL with your ServiceNow instance URL: + + +```yaml +servers: + - url: https://YourServiceNowInstance.service-now.com/ + # Example: https://dev123456.service-now.com/ +``` + +3. Upload the script to your watsonx Orchestrate instance + 1. Click the hamburger menu icon at the top left of the page, then click "Skills" + 2. Click "Add skills" at the top right of the page + 3. Click the "From files" tab + 4. Click the upload box and select the yaml file + 5. Click next + +4. Select the skills you need from the application +5. Click add on the bottom right + +Each skill should now be available in your list of skills and are ready to be staged. + +#### Staging the skills + +Before we can use the newly imported skills, they must be "enhanced" in order to publish. This gives us the opportunity to stage the skill to properly display the output. + +You must repeat this process for each skill + +1. Click the hamburger menu icon at the top left of the page, then click "Skills" +2. Using the search bar, search for "JC - ". This will show all skills denoted with name JC - like our ServiceNow skills +3. For each skill, click the 3 dotted menu icon on the right and proceed with the following steps: + 1. Click enhance + 2. Click the output tab + 3. Click "edit response" + 4. Fill in the proper "friendly name" for each collumn for the results output + +:::warning +The last collumn in some skils will be "Empty". This is used to output the ServiceNow "sysID" for composite skills without exposing the value to the user. Leave the header for "Empty" in the output table blank. +::: + +Example: + +| Number | Short Description | State | Opened By | Urgency | Assigned to | Assignment Group | Opened at | | +|---|---|---|---|---|---|---|---|---| +| results.number | results.short_description | results.state | results.opened by | results.urgency | result.assigned_to | result.assignment_group | result.opened_at | "Empty" | + +4. Click Publish at the bottom right + +#### Add the skills + +Add the ServiceNow skill(s) from the skill catalog, and connect the application: +1. From the home screen, towards the bottom, click the "Add skills from the catalog" box +2. Find and select "ServiceNow Table API" from the list +3. Connect the app + 1. Click the "Connect the app" box on the top right + 2. Enter the username and password of the ServiceNow account with access to the REST API + 3. Click connect app +4. Add each imported skill from the list + +Your ServiceNow Skills from the "ServiceNow Table API" application should now be ready for use from the watsonx Orchestrate chat page. + +### Microsoft Outlook Skill + +watsonx Orchestrate provides a default set of skills that integrate with Microsoft Outlook + +:::tip +Microsoft Outlook skills require an o365 administrator to allow the watsonx Orchestrate application to integrate (permissions such as sending emails from users) +To create an Outlook Developer account, [do so here.](https://developer.microsoft.com/en-us/microsoft-365/dev-program) Further documentation [here.](https://learn.microsoft.com/en-us/office/developer-program/microsoft-365-developer-program) +::: + +Add the Outlook skill(s) from the skill catalog, and connect the application: +1. From the home screen, towards the bottom, click the "Add skills from the catalog" box +2. Find and select "Microsoft Outlook" from the list +3. Connect the app + 1. Click the "Connect the app" box on the top right + 2. Enter the username and password of the Outlook account + 3. Click connect app +4. Add required each skill from the list + +Your Microsoft Outlook Skills from the "Microsoft Outlook" application should now be ready for use from the watsonx Orchestrate chat page. \ No newline at end of file diff --git a/docs/3-Use-Cases/assets/wxo_scripts/Watsonx Orchestrate ServiceNow API.yml b/docs/3-Use-Cases/assets/wxo_scripts/Watsonx Orchestrate ServiceNow API.yml new file mode 100644 index 00000000..8caaa782 --- /dev/null +++ b/docs/3-Use-Cases/assets/wxo_scripts/Watsonx Orchestrate ServiceNow API.yml @@ -0,0 +1,493 @@ +{ + "openapi": "3.0.1", + "info": { + "title": "ServiceNow Table API", + "contact": { + "name": "Joe Cosenza", + "email": "jcosenz@us.ibm.com", + "url": "https://ibm-client-engineering.github.io/solution-wxo/servicenow" + }, + "x-ibm-application-name": "ServiceNow Table API", + "x-ibm-application-id": "ServiceNowTableAPI", + "description": "Allows you to perform create, read, update, and delete (CRUD) operations on existing ServiceNow tables", + "version": "latest", + "x-ibm-application-icon": "ServiceNow" + }, + "externalDocs": { + "url": "https://docs.servicenow.com/?context=CSHelp:REST-Table-API" + }, + "servers": [ + { + "url": "https://YOURINSTANCE.service-now.com/" + } + ], + "security": [ + { + "basicAuth": [] + } + ], + "paths": { + "/api/now/table/sn_km_mr_st_kb_knowledge?sysparm_display_value=true&sysparm_exclude_reference_link=true": { + "get": { + "summary": "Retrieve all KBs from ServiceNow", + "description": "Retrieve all KBs from ServiceNow", + "operationId": "retrieveKBs", + "responses": { + "200": { + "description": "Results", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getKBs" + } + } + } + } + } + } + }, + "/api/now/table/sc_task?sysparm_display_value=true&sysparm_exclude_reference_link=true": { + "get": { + "summary": "Retrieve all Tasks from ServiceNow", + "description": "Retrieve all Tasks from ServiceNow", + "operationId": "retrieveTasks", + "responses": { + "200": { + "description": "Results", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getTable" + } + } + } + } + } + }, + "post": { + "summary": "Create a new Task in ServiceNow", + "description": "Create a new Task in ServiceNow", + "operationId": "createTask", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/editTable" + } + } + } + }, + "responses": { + "201": { + "description": "Task created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getthisTable" + } + } + } + } + } + } + }, + "/api/now/table/incident?sysparm_display_value=true&sysparm_exclude_reference_link=true": { + "get": { + "summary": "Retrieve all Incidents from ServiceNow", + "description": "Retrieve all Incidents from ServiceNow", + "operationId": "retrieveIncidents", + "responses": { + "200": { + "description": "Results", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getTable" + } + } + } + } + } + }, + "post": { + "summary": "Create a new Incident in ServiceNow", + "description": "Create a new Incident in ServiceNow", + "operationId": "createIncident", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/editTable" + } + } + } + }, + "responses": { + "201": { + "description": "Incident created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getTable" + } + } + } + } + } + } + }, + "/api/now/table/sc_task/{sys_id}?sysparm_display_value=true&sysparm_exclude_reference_link=true": { + "get": { + "summary": "Retrieve a specific Task in ServiceNow (Composite only)", + "description": "Composite Skill - Retrieve a Task record in ServiceNow", + "operationId": "retrievethisTask", + "parameters": [ + { + "name": "sys_id", + "x-ibm-label": "ServiceNow SysID (hidden)", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/sysID" + } + } + ], + "responses": { + "200": { + "description": "ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getthisTable" + } + } + } + } + } + }, + "put": { + "summary": "Modify a specific Task in ServiceNow (Composite only)", + "description": "Composite Skill - Modify a specific Task in ServiceNow", + "operationId": "modifythisTask", + "parameters": [ + { + "name": "sys_id", + "x-ibm-label": "ServiceNow SysID (hidden)", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/sysID" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/editTable" + } + } + } + }, + "responses": { + "200": { + "description": "Record updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getthisTable" + } + } + } + } + } + } + }, + "/api/now/table/incident/{sys_id}?sysparm_display_value=true&sysparm_exclude_reference_link=true": { + "get": { + "summary": "Retrieve a specific Incident in ServiceNow (Composite only)", + "description": "Composite Skill - Retrieve a Incident record in ServiceNow", + "operationId": "retrievethisIncident", + "parameters": [ + { + "name": "sys_id", + "x-ibm-label": "ServiceNow SysID (hidden)", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/sysID" + } + } + ], + "responses": { + "200": { + "description": "ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getthisTable" + } + } + } + } + } + }, + "put": { + "summary": "Modify a specific Incident in ServiceNow (Composite only)", + "description": "Composite Skill - Modify a specific Incident in ServiceNow", + "operationId": "modifythisIncident", + "parameters": [ + { + "name": "sys_id", + "x-ibm-label": "ServiceNow SysID (hidden)", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/sysID" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/editTable" + } + } + } + }, + "responses": { + "200": { + "description": "Record updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getthisTable" + } + } + } + } + } + } + }, + "/api/now/table/sn_km_mr_st_kb_knowledge/{sys_id}?sysparm_display_value=true&sysparm_exclude_reference_link=true": { + "get": { + "summary": "Retrieve a specific KB in ServiceNow (Composite only)", + "description": "Composite Skill - Retrieve a specific KB in ServiceNow", + "operationId": "retrievethisKB", + "parameters": [ + { + "name": "sys_id", + "x-ibm-label": "ServiceNow SysID (hidden)", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/sysID" + } + } + ], + "responses": { + "200": { + "description": "ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/getsingleKB" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "tableOptions": { + "type": "string" + }, + "sysID": { + "x-ibm-show": false, + "type": "string" + }, + "getthisTable": { + "type": "object", + "properties": { + "result": { + "x-ibm-label": "Results", + "type": "object", + "properties": { + "sys_id": { + "$ref": "#/components/schemas/sysID" + }, + "opened_at": { + "type": "string" + }, + "assignment_group": { + "type": "string" + }, + "assigned_to": { + "type": "string" + }, + "urgency": { + "type": "string" + }, + "opened_by": { + "type": "string" + }, + "state": { + "type": "string" + }, + "description": { + "type": "string" + }, + "short_description": { + "type": "string" + }, + "number": { + "type": "string" + } + } + } + } + }, + "getsingleKB": { + "type": "object", + "properties": { + "result": { + "x-ibm-label": "Results", + "type": "object", + "properties": { + "sys_id": { + "$ref": "#/components/schemas/sysID" + }, + "last_updated_on": { + "type": "string" + }, + "content": { + "type": "string" + }, + "author": { + "type": "string" + }, + "short_description": { + "type": "string" + }, + "number": { + "type": "string" + } + } + } + } + }, + "getKBs": { + "type": "object", + "properties": { + "result": { + "x-ibm-label": "Knowledge Articles", + "type": "array", + "items": { + "type": "object", + "properties": { + "sys_id": { + "$ref": "#/components/schemas/sysID" + }, + "last_updated_on": { + "type": "string" + }, + "content": { + "type": "string" + }, + "author": { + "type": "string" + }, + "short_description": { + "type": "string" + }, + "number": { + "type": "string" + } + } + } + } + } + }, + "getTable": { + "type": "object", + "properties": { + "result": { + "x-ibm-label": "Results", + "type": "array", + "items": { + "type": "object", + "properties": { + "sys_id": { + "$ref": "#/components/schemas/sysID" + }, + "opened_at": { + "type": "string" + }, + "assignment_group": { + "type": "string" + }, + "assigned_to": { + "type": "string" + }, + "urgency": { + "type": "string" + }, + "opened_by": { + "type": "string" + }, + "state": { + "type": "string" + }, + "description": { + "type": "string" + }, + "short_description": { + "type": "string" + }, + "number": { + "type": "string" + } + } + } + } + } + }, + "editTable": { + "type": "object", + "properties": { + "short_description": { + "x-ibm-label": "Short Description", + "type": "string", + "description": "Short description of the record" + }, + "description": { + "x-ibm-label": "Description", + "x-ibm-multiline": true, + "type": "string", + "description": "Detailed description of the record" + }, + "urgency": { + "x-ibm-label": "Urgency", + "type": "integer", + "description": "3 - Low, 2 - Medium, 1 - High", + "enum": [ + 3, + 2, + 1 + ] + } + } + } + }, + "securitySchemes": { + "basicAuth": { + "type": "http", + "scheme": "basic" + } + } + } +} \ No newline at end of file From 9b3a040fcc668505ed7e47df1e9ed9ea23df525c Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 28 May 2024 11:38:05 -0600 Subject: [PATCH 4/5] updated flight logs --- flight-logs/2024-05-28-cocreate.mdx | 48 +++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 flight-logs/2024-05-28-cocreate.mdx diff --git a/flight-logs/2024-05-28-cocreate.mdx b/flight-logs/2024-05-28-cocreate.mdx new file mode 100644 index 00000000..04d2790f --- /dev/null +++ b/flight-logs/2024-05-28-cocreate.mdx @@ -0,0 +1,48 @@ +--- +title: Log 30 🛫 +description: Flight Log of Co-Creation Activities +slug: flight-log-30 +tags: [log] +--- + +## Objective +Deploy watsonx.ai on self-managed AWS infrastructure for customer software evaluation + +```mermaid +flowchart LR + A(Deploy Services)-->B + subgraph "You are here" + B(Application Verification) + end +``` + +## Milestones +1. Deploy and configuration of boot node to establish a beach-head into the customer AWS environment + - Complete +2. Deploy OCP using the documented UPI installation steps + - Complete +3. Install Cloud Pak for Data + - Complete +4. Deploy and configure watsonx.ai on self-managed AWS infrastructure on ref environment and document + - In Progress + +### Summary +- Testing NeuralSeek functionality +- NeuralSeek verified opperational +- Configuring watsonx Assistant ServiceNow extension + - Unable to access ServiceNow, getting blocked outbound + - Investigating AWS and Cluster network connectivity + - Curl requests working from bastion, not from application or cluster + - Issue found: Customer proxy needs to be used in all API requests (even though cluster is configured to use proxy) + - Proposed workaround: Add proxy to OpenAPI spec for watsonx Assistant and Orchestrate + +## Decisions and Action Items (DAI) +- None pending + +## Lessons Learned +If customer has a proxy, the proxy configuration needs to be used in all API requests (even though cluster is configured to use proxy) on watsonx Orchestrate and Assistant. + +## Next Steps +- Application validation + - watsonx Assistant + - watsonx Orchestrate \ No newline at end of file From 0746d18a0e0f1b5f658c4d3497a0d758e764afbf Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 28 May 2024 11:59:31 -0600 Subject: [PATCH 5/5] updated flight logs --- flight-logs/2024-05-28-cocreate.mdx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/flight-logs/2024-05-28-cocreate.mdx b/flight-logs/2024-05-28-cocreate.mdx index 04d2790f..0d0c6692 100644 --- a/flight-logs/2024-05-28-cocreate.mdx +++ b/flight-logs/2024-05-28-cocreate.mdx @@ -34,15 +34,21 @@ flowchart LR - Investigating AWS and Cluster network connectivity - Curl requests working from bastion, not from application or cluster - Issue found: Customer proxy needs to be used in all API requests (even though cluster is configured to use proxy) - - Proposed workaround: Add proxy to OpenAPI spec for watsonx Assistant and Orchestrate + - ~~Proposed workaround: Add proxy to OpenAPI spec for watsonx Assistant and Orchestrate~~ + - Fix: Configure cluster environments to use customer proxy + ``` + oc set env deployment --all http_proxy=http://my_proxy:my_port + oc set env deployment --all https_proxy=http://my_proxy:my_port + ``` ## Decisions and Action Items (DAI) - None pending ## Lessons Learned -If customer has a proxy, the proxy configuration needs to be used in all API requests (even though cluster is configured to use proxy) on watsonx Orchestrate and Assistant. +- If customer has a proxy, the proxy configuration needs to be applied to the deployment environments for cluster applications to use the proxy. Initially the proxy was only applied to the cluster itself, not the deployment environments. ## Next Steps +- Proxy configuration testing - Application validation - watsonx Assistant - watsonx Orchestrate \ No newline at end of file