From 8c5812fb875366ded502d1c26ef657677151a9a2 Mon Sep 17 00:00:00 2001 From: Morgan Carroll Date: Mon, 19 Feb 2024 12:21:30 -0600 Subject: [PATCH 1/4] adds deployed prompt endpoint functionality --- .../language-model-watsonx/README.md | 18 +- .../language-model-watsonx/assets/sample2.png | Bin 0 -> 40222 bytes .../watsonx-actions.json | 372 ++++++++++++++++-- .../watsonx-openapi.json | 106 +++++ 4 files changed, 461 insertions(+), 35 deletions(-) create mode 100644 integrations/extensions/starter-kits/language-model-watsonx/assets/sample2.png diff --git a/integrations/extensions/starter-kits/language-model-watsonx/README.md b/integrations/extensions/starter-kits/language-model-watsonx/README.md index 2e994029..b586c99f 100644 --- a/integrations/extensions/starter-kits/language-model-watsonx/README.md +++ b/integrations/extensions/starter-kits/language-model-watsonx/README.md @@ -13,13 +13,15 @@ The watsonx specification in the starter kit describes one endpoint and a few of | Endpoint | Description | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Generation | Used with watsonx text completion models such as `google/flan-ul2` and `google/flan-t5-xxl`. You provide text as a prompt, and it returns the text that follows that prompt. | +| Generation from a deployed prompt | Used with a deployed watsonx prompt. You provide optional the prompt deployment ID, and the query text, and optional passages for RAG. ## Prerequisites -### Create an API key and a project ID +### Create an API key, project ID, and prompt deployment 1. Log in to [watsonx](https://dataplatform.cloud.ibm.com/wx/home?context=wx&apps=cos&nocache=true&onboarding=true&quick_start_target=watsonx) and [generate an API key](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ml-authentication.html?context=cpdaas). Save this API key somewhere safe and accessible. You need this API key to set up the watsonx custom extension later. 1. To find your watsonx project id, go to [watsonx.ai](https://dataplatform.test.cloud.ibm.com/wx) and find Projects/ (this could be your `sandbox`, which is created for you by default). Click on the link, then follow the Project's Manage tab (Project -> Manage -> General -> Details) to find the project id. +1. [Create your prompt](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html?context=wx&audience=wdp#creating-and-running-a-prompt) in Prompt Lab. Ensure you add the `query_text` and `passages` [variables](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html?context=wx&audience=wdp#creating-prompt-variables). Once your prompt is saved, [deploy your prompt](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/prompt-template-deploy.html?context=wx) and note your deployment ID. ### Create an assistant @@ -52,6 +54,7 @@ If you need capabilities that are not in the watsonx specification provided, fee Use **Actions Global Settings** to upload the [`watsonx-actions.json`](./watsonx-actions.json) file in this kit to your assistant. For more information, see [Uploading](https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-admin-backup-restore#backup-restore-import). You may also need to refresh the action Preview chat, after uploading, to get all the session variables initialized before these actions will work correctly. 1. Under Variables/Created by you within the Actions page, set the `watsonx_project_id` session variable using [a project ID value from watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html?context=wx&audience=wdp). See [this section](#create-an-api-key-and-a-project-id) for additional details on how to find your project ID. +1. Set the `deployment_id` variable to your deployment space ID. **NOTE**: If you import the actions _before_ configuring the extensions, you will see errors on the actions because it could not find the extensions. Configure the extensions (as described [above](#prerequisites)), and re-import the action JSON file. @@ -59,8 +62,10 @@ The starter kit includes [a JSON file with sample actions](./watsonx-actions.jso | Action | Description | | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Invoke watsonx Generation API | Connects to watson with the selected model and the model input | +| Invoke watsonx Generation API | Connects to watson with the selected model and the model input. | | Test model | Simple test action that asks what model, length, temperature and prompt you want and then calls "Invoke watsonx Generation API" so the model can generate a response to the specified prompt. | +| Invoke watsonx deployed prompt API | Connects to the deployed prompt using the specified deployment ID and input. | +| Test deployment | Simple test action that calls "Invoke watsonx deployed prompt API" so the model can generate a response to the specified query using a saved prompt template. | Note that the "Test model" action includes a step that invokes an extension and includes a parameter named `model_id`. You can set the `model_id` session variable to control which model is used by `Test model`. You can see which models work with the Generate API by viewing the supported foundation models in [the watsonx Prompt Lab](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-lab.html?context=wx). @@ -78,11 +83,20 @@ These are the session variables used in this example. - `model_response`: The text generated by the model in response to the user input. - `watsonx_api_version` - watsonx api date version. It currently defaults to `2023-05-29`. - `watsonx_project_id`: You **MUST** set this value to be [a project ID value from watsonx](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/manage-projects.html). By default, this is a [sandbox project id](https://dataplatform.cloud.ibm.com/docs/content/wsj/manage-data/sandbox.html) that is automatically created for you when you sign up for watsonx.ai. +- `deployment_id`: The ID of the deployment space where your prompt is promoted to. +- `parameters.prompt_variables.query_text`: The input for the deployed prompt. +- `parameters.prompt_variables.passages`: Optional variable to include passages for RAG-related queries. + +Note: `passages` and `query_text` must be [added as parameters](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-variables.html?context=wx&audience=wdp#creating-prompt-variables) in Prompt Lab. Here is an example of how to use the `Test model` action: +Here is an example of how to use the `Test deployment` action: + + + ### Limitations Adding large values for max_new_tokens & min_new_tokens can result in timeouts, if you see any timeouts please adjust the values of those tokens. diff --git a/integrations/extensions/starter-kits/language-model-watsonx/assets/sample2.png b/integrations/extensions/starter-kits/language-model-watsonx/assets/sample2.png new file mode 100644 index 0000000000000000000000000000000000000000..f23bc4fcae94d696986457d7ea19b6a43d19c3cb GIT binary patch literal 40222 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 bWeEH~31pm!(zU8}00000NkvXXu0mjfE>*B; literal 0 HcmV?d00001 diff --git a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json index c290d92c..af75580f 100644 --- a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json +++ b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json @@ -3,10 +3,10 @@ "type": "action", "valid": true, "status": "Available", - "created": "2023-07-26T00:29:57.573Z", - "updated": "2023-07-26T00:34:33.767Z", + "created": "2024-02-13T19:58:31.627Z", + "updated": "2024-02-19T18:14:25.678Z", "language": "en", - "skill_id": "d7b6684e-45f0-4fed-967e-c1091494f945", + "skill_id": "62868f8b-e3ea-463b-8494-1a8038d3ac43", "workspace": { "actions": [ { @@ -629,8 +629,8 @@ "type": "integration_interaction", "method": "POST", "internal": { - "spec_hash_id": "cc50493e455de183d661b95360196ddb468a02051add6dcaf4a6479b34900be5", - "catalog_item_id": "4f170e0d-95b5-4f59-9d1d-e52f67ee9352" + "spec_hash_id": "045d65f7e2f6a58f76649209e3d6c1fe900b7b8986c328c3f5144a23fd542f55", + "catalog_item_id": "4cbb5358-1079-463a-8b09-45a12954bfef" }, "request_mapping": { "body": [ @@ -651,36 +651,163 @@ "skill_variable": "watsonx_project_id" }, "parameter": "project_id" - }, + } + ], + "query": [ { "value": { - "skill_variable": "model_parameters_temperature" + "skill_variable": "watsonx_api_version" }, - "parameter": "parameters.temperature" - }, + "parameter": "version" + } + ] + }, + "result_variable": "step_817_result_2" + } + }, + "variable": "step_817", + "next_step": "step_606" + }, + { + "step": "step_606", + "output": { + "generic": [] + }, + "context": { + "variables": [ + { + "value": { + "expression": "${step_817_result_2.body.results}[0].generated_text" + }, + "skill_variable": "model_response" + } + ] + }, + "handlers": [], + "resolver": { + "type": "end_action" + }, + "variable": "step_606", + "condition": { + "and": [ + { + "eq": [ { - "value": { - "skill_variable": "model_parameters_max_new_tokens" - }, - "parameter": "parameters.max_new_tokens" + "variable": "step_817_result_2", + "variable_path": "success" }, { - "value": { - "skill_variable": "model_parameters_min_new_tokens" - }, - "parameter": "parameters.min_new_tokens" - }, + "scalar": true + } + ] + }, + { + "expression": "${step_817_result_2.body.results}.size() > 0" + } + ] + }, + "next_step": "step_212" + }, + { + "step": "step_212", + "output": { + "generic": [] + }, + "context": { + "variables": [ + { + "value": { + "expression": "null" + }, + "skill_variable": "model_response" + } + ] + }, + "handlers": [], + "resolver": { + "type": "end_action" + }, + "variable": "step_212" + } + ], + "title": "Invoke watsonx Generation API", + "action": "action_3200-2", + "boosts": [], + "handlers": [], + "condition": { + "intent": "action_3200_intent_45093-2" + }, + "variables": [ + { + "title": "", + "variable": "step_212", + "data_type": "any" + }, + { + "title": "", + "variable": "step_606", + "data_type": "any" + }, + { + "title": "No response", + "privacy": { + "enabled": false + }, + "variable": "step_817", + "data_type": "any" + }, + { + "privacy": { + "enabled": false + }, + "variable": "step_817_result_2", + "data_type": "any" + } + ], + "next_action": "action_3200-3", + "topic_switch": { + "allowed_from": true, + "allowed_into": true, + "never_return": false + }, + "disambiguation_opt_out": false + }, + { + "steps": [ + { + "step": "step_817", + "output": { + "generic": [] + }, + "context": { + "variables": [] + }, + "handlers": [], + "resolver": { + "type": "callout", + "callout": { + "path": "/ml/v1-beta/deployments/{deployment-id}/generation/text", + "type": "integration_interaction", + "method": "POST", + "internal": { + "spec_hash_id": "045d65f7e2f6a58f76649209e3d6c1fe900b7b8986c328c3f5144a23fd542f55", + "catalog_item_id": "4cbb5358-1079-463a-8b09-45a12954bfef" + }, + "request_mapping": { + "body": [ { "value": { - "skill_variable": "model_parameters_stop_sequences" + "skill_variable": "model_input" }, - "parameter": "parameters.stop_sequences" - }, + "parameter": "parameters.prompt_variables.query_text" + } + ], + "path": [ { "value": { - "skill_variable": "model_parameters_repetition_penalty" + "skill_variable": "deployment_id" }, - "parameter": "parameters.repetition_penalty" + "parameter": "deployment-id" } ], "query": [ @@ -760,12 +887,12 @@ "variable": "step_212" } ], - "title": "Invoke watsonx Generation API", - "action": "action_3200-2", + "title": "Invoke watsonx deployed prompt API", + "action": "action_3200-3", "boosts": [], "handlers": [], "condition": { - "intent": "action_3200_intent_45093-2" + "intent": "action_3200_intent_45093-3" }, "variables": [ { @@ -780,14 +907,164 @@ }, { "title": "No response", + "privacy": { + "enabled": false + }, "variable": "step_817", "data_type": "any" }, { + "privacy": { + "enabled": false + }, "variable": "step_817_result_2", "data_type": "any" } ], + "next_action": "action_3200-4", + "topic_switch": { + "allowed_from": true, + "allowed_into": true, + "never_return": false + }, + "disambiguation_opt_out": false + }, + { + "steps": [ + { + "step": "step_129", + "output": { + "generic": [ + { + "values": [ + { + "text_expression": { + "concat": [ + { + "scalar": "What would you like to ask?" + } + ] + } + } + ], + "response_type": "text", + "selection_policy": "sequential" + } + ] + }, + "context": { + "variables": [] + }, + "handlers": [], + "question": { + "free_text": true, + "response_collection_behavior": "always_ask" + }, + "resolver": { + "type": "continue" + }, + "variable": "step_129", + "next_step": "step_817" + }, + { + "step": "step_817", + "output": { + "generic": [] + }, + "context": { + "variables": [ + { + "value": { + "expression": "${step_129}" + }, + "skill_variable": "model_input" + } + ] + }, + "handlers": [], + "resolver": { + "type": "invoke_another_action", + "invoke_action": { + "action": "action_3200-3", + "policy": "default", + "parameters": null, + "result_variable": "step_817_result_1" + } + }, + "variable": "step_817", + "next_step": "step_606" + }, + { + "step": "step_606", + "output": { + "generic": [ + { + "values": [ + { + "text_expression": { + "concat": [ + { + "scalar": "Response is: " + }, + { + "skill_variable": "model_response" + } + ] + } + } + ], + "response_type": "text", + "selection_policy": "sequential" + } + ] + }, + "context": { + "variables": [] + }, + "handlers": [], + "resolver": { + "type": "end_action" + }, + "variable": "step_606" + } + ], + "title": "Test deployment", + "action": "action_3200-4", + "boosts": [], + "handlers": [], + "condition": { + "intent": "action_3200_intent_45093-4" + }, + "variables": [ + { + "title": "What would you like to ask?", + "privacy": { + "enabled": false + }, + "variable": "step_129", + "data_type": "any" + }, + { + "title": "Response is: {variable}", + "variable": "step_606", + "data_type": "any" + }, + { + "title": "No response", + "privacy": { + "enabled": false + }, + "variable": "step_817", + "data_type": "any" + }, + { + "privacy": { + "enabled": false + }, + "variable": "step_817_result_1", + "data_type": "any" + } + ], "next_action": "fallback", "topic_switch": { "allowed_from": true, @@ -1328,6 +1605,18 @@ "intent": "action_3200_intent_45093-2", "examples": [] }, + { + "intent": "action_3200_intent_45093-3", + "examples": [] + }, + { + "intent": "action_3200_intent_45093-4", + "examples": [ + { + "text": "Test deployment" + } + ] + }, { "intent": "fallback_connect_to_agent", "examples": [ @@ -1362,12 +1651,19 @@ { "type": "synonyms", "value": "google/flan-t5-xxl", - "synonyms": ["flan-t5-xxl", "t5", "xxl"] + "synonyms": [ + "flan-t5-xxl", + "t5", + "xxl" + ] }, { "type": "synonyms", "value": "google/flan-ul2", - "synonyms": ["flan-ul2", "ul2"] + "synonyms": [ + "flan-ul2", + "ul2" + ] } ], "fuzzy_match": true @@ -1389,10 +1685,19 @@ "metadata": { "api_version": { "major_version": "v2", - "minor_version": "2021-11-27" + "minor_version": "2018-11-08" } }, "variables": [ + { + "title": "deployment_id", + "privacy": { + "enabled": false + }, + "variable": "deployment_id", + "data_type": "any", + "description": "" + }, { "title": "model_id", "variable": "model_id", @@ -1580,8 +1885,9 @@ "learning_opt_out": true }, "description": "created for assistant 05c10d7d-336f-4d33-8cb3-5c53520d61ce", - "assistant_id": "67614f79-ba73-4c10-a90f-9b647f797521", - "workspace_id": "d7b6684e-45f0-4fed-967e-c1091494f945", + "assistant_id": "d0dbfa96-66ee-4f69-be16-836342bfa386", + "workspace_id": "62868f8b-e3ea-463b-8494-1a8038d3ac43", "dialog_settings": {}, - "next_snapshot_version": "1" -} + "next_snapshot_version": "1", + "environment_id": "1fbc2854-6d9a-4fce-b99f-3b8c7c53a9d7" +} \ No newline at end of file diff --git a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json index a89fd57d..a25c3503 100644 --- a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json +++ b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json @@ -157,6 +157,112 @@ } } } + }, + "/ml/v1-beta/deployments/{deployment-id}/generation/text": { + "post": { + "description": "Generation from a deployed prompt", + "parameters": [ + { + "name": "version", + "in": "query", + "description": "Release date of the version of the API you want to use. Specify dates in YYYY-MM-DD format.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "deployment-id", + "in": "path", + "description": "Deployment ID of the prompt deployment you want to use.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "parameters": { + "type": "object", + "properties": { + "prompt_variables": { + "type": "object", + "properties": { + "query_text": { + "type": "string", + "description": "The original query text from the user", + "example": "Who is the president of the United States?" + }, + "passages": { + "type": "string", + "description": "Optional specific passages to pass to the deployed prompt", + "example": "Austin is the state capital of Texas, an inland city bordering the Hill Country region. Home to the University of Texas flagship campus, Austin is known for its eclectic live-music scene centered around country, blues and rock. Its many parks and lakes are popular for hiking, biking, swimming and boating. South of the city, Formula One's Circuit of the Americas raceway has hosted the United States Grand Prix." + } + } + } + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Default Response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "model_id": { + "description": "The ID of the model to be used for this request", + "type": "string" + }, + "created_at": { + "description": "The date and time of the response", + "type": "string" + }, + "results": { + "type": "array", + "items": { + "type": "object", + "properties": { + "generated_text": { + "description": "The generated text", + "type": "string" + }, + "generated_token_count": { + "description": "The number of tokens in the output", + "type": "integer" + }, + "input_token_count": { + "description": "The number of tokens in the input", + "type": "integer" + }, + "stop_reason": { + "description": "The reason for stopping the generation. Can be NOT_FINISHED - Possibly more tokens to be streamed, MAX_TOKENS - Maximum requested tokens reached, EOS_TOKEN - End of sequence token encountered, CANCELLED - Request canceled by the client, TIME_LIMIT - Time limit reached, STOP_SEQUENCE - Stop sequence encountered, TOKEN_LIMIT - Token limit reached, ERROR - Error encountered", + "type": "string" + } + } + }, + "description": "Outputs of the generation" + } + } + } + } + } + }, + "default": { + "description": "Unexpected error" + } + } + } } } } From d39da0a3c279235943300c977dfaee9bdc3ce372 Mon Sep 17 00:00:00 2001 From: Morgan Carroll Date: Thu, 11 Apr 2024 14:58:03 -0500 Subject: [PATCH 2/4] hook up extensions --- .../watsonx-actions.json | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json index af75580f..57022d7c 100644 --- a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json +++ b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json @@ -1,15 +1,16 @@ { - "name": "watsonx extension sample actions", + "name": "toolkit deployment-action", "type": "action", "valid": true, "status": "Available", - "created": "2024-02-13T19:58:31.627Z", - "updated": "2024-02-19T18:14:25.678Z", + "created": "2024-04-11T19:48:48.994Z", + "updated": "2024-04-11T19:52:51.039Z", "language": "en", - "skill_id": "62868f8b-e3ea-463b-8494-1a8038d3ac43", + "skill_id": "0ed4a357-5fc6-4385-8beb-7cf34135432b", "workspace": { "actions": [ { + "type": "standard", "steps": [ { "step": "step_285", @@ -612,6 +613,7 @@ "disambiguation_opt_out": false }, { + "type": "standard", "steps": [ { "step": "step_817", @@ -629,8 +631,8 @@ "type": "integration_interaction", "method": "POST", "internal": { - "spec_hash_id": "045d65f7e2f6a58f76649209e3d6c1fe900b7b8986c328c3f5144a23fd542f55", - "catalog_item_id": "4cbb5358-1079-463a-8b09-45a12954bfef" + "spec_hash_id": "366bf7affb4190cdefb16d75a1596c4f2540660040682420f5947d9373870755", + "catalog_item_id": "99ff6df2-adb9-411c-8a3b-e8e792bf7456" }, "request_mapping": { "body": [ @@ -773,6 +775,7 @@ "disambiguation_opt_out": false }, { + "type": "standard", "steps": [ { "step": "step_817", @@ -790,18 +793,10 @@ "type": "integration_interaction", "method": "POST", "internal": { - "spec_hash_id": "045d65f7e2f6a58f76649209e3d6c1fe900b7b8986c328c3f5144a23fd542f55", - "catalog_item_id": "4cbb5358-1079-463a-8b09-45a12954bfef" + "spec_hash_id": "366bf7affb4190cdefb16d75a1596c4f2540660040682420f5947d9373870755", + "catalog_item_id": "99ff6df2-adb9-411c-8a3b-e8e792bf7456" }, "request_mapping": { - "body": [ - { - "value": { - "skill_variable": "model_input" - }, - "parameter": "parameters.prompt_variables.query_text" - } - ], "path": [ { "value": { @@ -930,6 +925,7 @@ "disambiguation_opt_out": false }, { + "type": "standard", "steps": [ { "step": "step_129", @@ -1074,6 +1070,7 @@ "disambiguation_opt_out": false }, { + "type": "standard", "steps": [ { "step": "step_001", @@ -1170,6 +1167,7 @@ "disambiguation_opt_out": true }, { + "type": "standard", "steps": [ { "step": "digression_failure", @@ -1478,6 +1476,7 @@ "disambiguation_opt_out": true }, { + "type": "standard", "steps": [ { "step": "danger_word_detected", @@ -1552,6 +1551,7 @@ "next_action": "anything_else" }, { + "type": "standard", "steps": [ { "step": "step_001", @@ -1885,9 +1885,9 @@ "learning_opt_out": true }, "description": "created for assistant 05c10d7d-336f-4d33-8cb3-5c53520d61ce", - "assistant_id": "d0dbfa96-66ee-4f69-be16-836342bfa386", - "workspace_id": "62868f8b-e3ea-463b-8494-1a8038d3ac43", + "assistant_id": "9bbf3c63-9e2e-4927-b771-0ec57afc9f7f", + "workspace_id": "0ed4a357-5fc6-4385-8beb-7cf34135432b", "dialog_settings": {}, "next_snapshot_version": "1", - "environment_id": "1fbc2854-6d9a-4fce-b99f-3b8c7c53a9d7" + "environment_id": "c571aff7-3869-4633-a0ab-890f06e0f209" } \ No newline at end of file From e1c9f049659dc906b9251247999ab303ee655412 Mon Sep 17 00:00:00 2001 From: Morgan Carroll Date: Fri, 26 Apr 2024 11:19:12 -0500 Subject: [PATCH 3/4] updates endpoint --- .../starter-kits/language-model-watsonx/watsonx-actions.json | 2 +- .../starter-kits/language-model-watsonx/watsonx-openapi.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json index 2c0a7602..ecda61ed 100644 --- a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json +++ b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json @@ -789,7 +789,7 @@ "resolver": { "type": "callout", "callout": { - "path": "/ml/v1-beta/deployments/{deployment-id}/generation/text", + "path": "/ml/v1/deployments/{deployment-id}/generation/text", "type": "integration_interaction", "method": "POST", "internal": { diff --git a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json index 11fde41b..8780454c 100644 --- a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json +++ b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json @@ -188,7 +188,7 @@ } } }, - "/ml/v1-beta/deployments/{deployment-id}/generation/text": { + "/ml/v1/deployments/{deployment-id}/generation/text": { "post": { "description": "Generation from a deployed prompt", "parameters": [ From 61b9058bc5528ab00a8ac93128285a06594b52c7 Mon Sep 17 00:00:00 2001 From: Morgan Carroll Date: Wed, 8 May 2024 11:40:50 -0500 Subject: [PATCH 4/4] hopefully final edit --- .../watsonx-actions.json | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json index ecda61ed..ed1f822a 100644 --- a/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json +++ b/integrations/extensions/starter-kits/language-model-watsonx/watsonx-actions.json @@ -1,12 +1,12 @@ { - "name": "toolkit deployment-action", + "name": "watsonx extension sample actions", "type": "action", "valid": true, "status": "Available", - "created": "2024-04-11T19:48:48.994Z", - "updated": "2024-04-11T19:52:51.039Z", + "created": "2024-05-08T16:31:44.640Z", + "updated": "2024-05-08T16:35:10.141Z", "language": "en", - "skill_id": "0ed4a357-5fc6-4385-8beb-7cf34135432b", + "skill_id": "a901b7b6-c8aa-4bf1-a61e-e885ecffe9ea", "workspace": { "actions": [ { @@ -631,8 +631,8 @@ "type": "integration_interaction", "method": "POST", "internal": { - "spec_hash_id": "366bf7affb4190cdefb16d75a1596c4f2540660040682420f5947d9373870755", - "catalog_item_id": "99ff6df2-adb9-411c-8a3b-e8e792bf7456" + "spec_hash_id": "16f2e2f8ca5a1910b7a1d34a1a499202bd2d5c85515447b9ac020c0ae516e299", + "catalog_item_id": "5d2e03cf-aff3-4618-b0bc-c9444b255363" }, "request_mapping": { "body": [ @@ -793,8 +793,8 @@ "type": "integration_interaction", "method": "POST", "internal": { - "spec_hash_id": "366bf7affb4190cdefb16d75a1596c4f2540660040682420f5947d9373870755", - "catalog_item_id": "99ff6df2-adb9-411c-8a3b-e8e792bf7456" + "spec_hash_id": "16f2e2f8ca5a1910b7a1d34a1a499202bd2d5c85515447b9ac020c0ae516e299", + "catalog_item_id": "5d2e03cf-aff3-4618-b0bc-c9444b255363" }, "request_mapping": { "path": [ @@ -1885,9 +1885,9 @@ "learning_opt_out": true }, "description": "created for assistant 05c10d7d-336f-4d33-8cb3-5c53520d61ce", - "assistant_id": "9bbf3c63-9e2e-4927-b771-0ec57afc9f7f", - "workspace_id": "0ed4a357-5fc6-4385-8beb-7cf34135432b", + "assistant_id": "bd63fead-e90b-43b4-9e57-e0fb90553861", + "workspace_id": "a901b7b6-c8aa-4bf1-a61e-e885ecffe9ea", "dialog_settings": {}, "next_snapshot_version": "1", - "environment_id": "c571aff7-3869-4633-a0ab-890f06e0f209" + "environment_id": "77419769-c935-4105-8da5-87a20d970abb" } \ No newline at end of file