diff --git a/tutorials/ai-core-orchestration-consumption/ai-core-orchestration-consumption.md b/tutorials/ai-core-orchestration-consumption/ai-core-orchestration-consumption.md index 23890f322c..7b0ec49079 100644 --- a/tutorials/ai-core-orchestration-consumption/ai-core-orchestration-consumption.md +++ b/tutorials/ai-core-orchestration-consumption/ai-core-orchestration-consumption.md @@ -35,7 +35,7 @@ author_profile: https://github.com/I321506 [OPTION END] -[OPTION BEGIN [Python SDK]] +[OPTION BEGIN [Gen AI Hub SDK]] • Configure proxy modules by setting up environment variables for AI Core credentials. @@ -48,7 +48,7 @@ author_profile: https://github.com/I321506 [OPTION END] -[OPTION BEGIN [JavaScript SDK]] +[OPTION BEGIN [SAP Cloud SDK]] • Download the service key for the AI Core service instance. @@ -66,11 +66,11 @@ author_profile: https://github.com/I321506 • SAP Cloud SDK for AI: Uses the `dotenv` library to load environment variables. If you encounter issues with the dotenv library, ensure it is installed correctly by running: -```CODE -npm install dotenv -``` + ```javascript + npm install dotenv + ``` -```CODE +```javascript import dotenv from 'dotenv'; dotenv.config(); @@ -83,40 +83,6 @@ console.log(process.env.AICORE_SERVICE_KEY); [OPTION END] -[OPTION BEGIN [Java SDK]] - -• [Create a service key](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/create-service-key) for your AI Core instance and copy the JSON object. - -• Create a `.env` file in the **working directory from which you run the code**. Add the following line using the copied JSON: - -``` -AICORE_SERVICE_KEY={"clientid": "...", "clientsecret": "...", "url": "...", "serviceurls": { "AI_API_URL": "..." } } -``` - -• **IMPORTANT:** The value of `AICORE_SERVICE_KEY` must be a single line, so remove any line breaks from the service key JSON. - -• This tutorial is designed for a Java [maven project](https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html). Add the following dependencies to your project `pom.xml` file: - -```xml - - com.sap.ai.sdk - core - - ${ai-sdk.version} - - - - com.sap.ai.sdk - orchestration - - ${ai-sdk.version} - -``` - -• For other options of access configuration and detailed information on installation and usage of the **SAP Cloud SDK for AI (for Java)**, visit the official [GitHub repository](https://github.com/SAP/ai-sdk-java). This page provides comprehensive steps to set up and integrate the SDK effectively in your projects. - -[OPTION END] - [OPTION BEGIN [Bruno]] #### Download and Import the Bruno Collection - Download the [bruno_collections](img/Bruno_Collection.json) file @@ -145,7 +111,9 @@ AICORE_SERVICE_KEY={"clientid": "...", "clientsecret": "...", "url": "...", "ser - Click on "No Environment" in the top-right corner and select "Grounding-test". ![img](img/env_set.png) + #### Generate the Token + - Select the get_token request from the root folder of the imported collection. - Execute the request to generate the token. @@ -180,7 +148,7 @@ Go to the Configuration section within your chosen Resource Group. [OPTION END] -[OPTION BEGIN [Python SDK]] +[OPTION BEGIN [Gen AI SDK]] • Create a folder named orchestration, then navigate to this folder using VS Code. @@ -190,7 +158,28 @@ Go to the Configuration section within your chosen Resource Group. You'll create a configuration that defines the orchestration setup. Use the following code to initialize your configuration. -```CODE +```python + +import time +import json +import os +from IPython.display import clear_output +from ai_core_sdk.ai_core_v2_client import AICoreV2Client +from ai_api_client_sdk.models.parameter_binding import ParameterBinding +from enum import Enum + +# Create AI Core client instance +def create_ai_core_client(credCF): + set_environment_vars(credCF) # Ensure environment variables are set + return AICoreV2Client( + base_url=os.environ['AICORE_BASE_URL'], + auth_url=os.environ['AICORE_AUTH_URL'], + client_id=os.environ['AICORE_CLIENT_ID'], + client_secret=os.environ['AICORE_CLIENT_SECRET'], + resource_group=os.environ['AICORE_RESOURCE_GROUP'] + ) + +ai_core_client = create_ai_core_client(credCF) # Define scenario ID, executable ID, and configuration suffix scenario_id = "orchestration" @@ -217,11 +206,11 @@ print(f"Configuration created successfully with ID: {config.id} and Name: {confi [OPTION END] -[OPTION BEGIN [JavaScript SDK]] +[OPTION BEGIN [SAP Cloud SDK ]] In this step, we define a function to create an orchestration configuration using the ConfigurationApi from the SAP AI SDK. This configuration integrates various parameters needed for orchestration, such as the executable ID and scenario ID. -```CODE +```javascript import { ConfigurationApi } from '@sap-ai-sdk/ai-api'; @@ -270,48 +259,10 @@ orchestrationConfig; • config_name: Choose a unique name for the configuration (e.g., "config-new-orchestration") -[OPTION END] - -[OPTION BEGIN [Java SDK]] - -In this step, we will create an orchestration configuration using the core module of the [SAP Cloud SDK for Java](https://github.com/SAP/cloud-sdk-java). This configuration integrates various parameters needed for orchestration, such as the executable ID and scenario ID. - -• Add the following code to your project to create an orchestration configuration: - -```java -// Define the resource group, change this to your resource group name -var RESOURCE_GROUP = "yourResourceGroup"; - -// Define parameter and input artifact bindings you may need for orchestration -var modelFilterList = AiParameterArgumentBinding.create() - .key("modelFilterList").value("null"); -var modelFilterListType = AiParameterArgumentBinding.create() - .key("modelFilterListType").value("allow"); - -// Create a configuration data object for your configuration -var configurationData = AiConfigurationBaseData.create() - .name("orchestration-config") // Choose a meaningful name - .executableId("orchestration") // Orchestration executable ID - .scenarioId("orchestration") // Orchestration scenario ID - .addParameterBindingsItem(modelFilterList) - .addParameterBindingsItem(modelFilterListType); - -// Create the configuration with your individual resource group -var configuration = new ConfigurationApi().create(RESOURCE_GROUP, configurationData); - -// Print the configuration response message -System.out.println(configuration.getMessage()); -``` - -**Note**: - -• `scenarioId` and `executableId`: Both are set to "orchestration" for this tutorial. - -• `name`: Choose a unique name for the configuration (e.g., "config-new-orchestration") - [OPTION END] [OPTION BEGIN [Bruno]] + #### Create Resource Group - Expand the 01_resource_group section in the collection. @@ -323,6 +274,7 @@ System.out.println(configuration.getMessage()); - Follow the screenshot attached for reference. ![img](img/get_resource_group.png) + #### Create Configuration - Navigate to the configuration request and execute it to create a configuration. @@ -347,7 +299,7 @@ Once the deployment begins, continue to the status page. Verify that the Deploym [OPTION END] -[OPTION BEGIN [Python SDK]] +[OPTION BEGIN [Gen AI SDK]] With the configuration ID, you can proceed to deploy the orchestration and monitor its progress. @@ -355,7 +307,7 @@ With the configuration ID, you can proceed to deploy the orchestration and monit Run the following code to create a deployment using the configuration ID obtained in Step 2. -```CODE +```python # Create a deployment using the configuration ID from the previous cell @@ -370,7 +322,7 @@ print(f"Deployment created successfully with ID: {deployment.id}") Execute the following code to monitor the deployment until it’s fully active. The status should eventually display as "Running". -```CODE +```PYTHON from ai_api_client_sdk.models.status import Status @@ -405,11 +357,11 @@ Result: The code will display a loading spinner until the deployment status upda [OPTION END] -[OPTION BEGIN [JavaScript SDK]] +[OPTION BEGIN [SAP Cloud SDK ]] This step involves creating a deployment using the specified configuration and resource group. The deployment is handled via the DeploymentApi, which streamlines the process of activating the orchestration setup. -```CODE +```javascript import { DeploymentApi } from '@sap-ai-sdk/ai-api'; import type { AiDeploymentCreationResponse } from '@sap-ai-sdk/ai-api'; @@ -470,26 +422,6 @@ export async function deployOrchestration( [OPTION END] -[OPTION BEGIN [Java SDK]] - -In this step, we will create a deployment from the configuration created in the previous step using the core module of the [SAP Cloud SDK for Java](https://github.com/SAP/cloud-sdk-java). - -• Add the following code to your project to create an orchestration deployment: - -```java -// Create a deployment creation request with the ID of the created configuration -var deploymentCreationRequest = - AiDeploymentCreationRequest.create().configurationId(configuration.getId()); - -// Create the deployment with the deployment creation request -var deployment = new DeploymentApi().create(RESOURCE_GROUP, deploymentCreationRequest); - -// Print the deployment response message -System.out.println(deployment.getMessage()); -``` - -[OPTION END] - [OPTION BEGIN [Bruno]] #### Update Configuration ID and Create Deployment - Navigate to the create_deployment request. @@ -498,6 +430,7 @@ System.out.println(deployment.getMessage()); - Execute the request to create a deployment. Follow the screenshot attached for reference. ![img](img/img021.png) + #### Verify Deployment Status - Execute the get_deployment request repeatedly until: - The status is RUNNING. @@ -505,6 +438,7 @@ System.out.println(deployment.getMessage()); Follow the screenshot attached for reference. ![img](img/deployement_running.png) + #### Update Environment Variable - Copy the deploymentUrl from the response. @@ -668,7 +602,7 @@ Data masking and content filtering are available to enhance data privacy and saf [OPTION END] -[OPTION BEGIN [Python SDK]] +[OPTION BEGIN [Gen AI SDK]] To begin the consumption process for the orchestration you’ve deployed, follow the process below: @@ -680,7 +614,7 @@ To begin the consumption process for the orchestration you’ve deployed, follow - Load the CV file using the following code to read its content -```CODE +```python from gen_ai_hub.orchestration.utils import load_text_file @@ -699,7 +633,7 @@ The next step involves creating a template that specifies how the AI should hand • UserMessage: Represents the user's input (i.e., the CV content) to be processed by the AI. -```CODE +```python from gen_ai_hub.orchestration.models.message import SystemMessage, UserMessage from gen_ai_hub.orchestration.models.template import Template, TemplateValue @@ -722,11 +656,9 @@ template = Template( ``` -We can define multiple models for the use case. Only use those models that are already deployed in your instances. For this example, we have selected the following three models: - Here’s an example of how to configure them: -```CODE +```python from gen_ai_hub.orchestration.models.llm import LLM from gen_ai_hub.orchestration.models.config import OrchestrationConfig @@ -750,15 +682,13 @@ for model in models: print("Model configurations created successfully:") -``` - -**Note:** Make sure that the models you choose are already deployed in your instance. You can replace the models in this example with any other models from your deployment as required. +``` **Execute the Orchestration and Collect Results** Now, you can run the orchestration with the prepared configurations. The results will be saved in a text file for later review. -```CODE +```python from gen_ai_hub.orchestration.service import OrchestrationService @@ -804,7 +734,7 @@ Data masking and content filtering are available to enhance data privacy and saf [OPTION END] -[OPTION BEGIN [JavaScript SDK]] +[OPTION BEGIN [SAP Cloud SDK ]] To begin the consumption process for the orchestration you’ve deployed, follow the process below: @@ -816,7 +746,7 @@ To begin the consumption process for the orchestration you’ve deployed, follow - Load the CV file using the following code to read its content -```CODE +```javascript const filePath = './cv.txt'; let txtContent; @@ -836,7 +766,7 @@ The next step involves creating a template that specifies how the AI should hand • UserMessage: Represents the user's input (i.e., the CV content) to be processed by the AI. -```CODE +```javascript // Define the template for resume screening @@ -858,11 +788,11 @@ console.log('Resume screening template configuration defined successfully.'); ``` -We can define multiple models for the use case. Only use those models that are already deployed in your instances. For this example, we have selected the following three models +We can define multiple models for the use case. Since orchestration provides direct access to models without requiring separate deployments, you can use any available models. For this example, we have selected the following three models. Here’s an example of how to configure them: -```CODE +```javascript // List of models to iterate through const models = [ @@ -873,7 +803,7 @@ const models = [ ``` -```CODE +```javascript // Function to create configuration for each model const createModelConfig = (modelName) => ({ @@ -903,7 +833,7 @@ Model Iteration: Iterates over the list of model names to update the configurati Query Execution: Uses OrchestrationClient to generate responses for each query. -```CODE +```javascript import { writeFileStrSync } from "https://deno.land/std@0.52.0/fs/mod.ts"; import {OrchestrationClient} from '@sap-ai-sdk/orchestration'; @@ -965,132 +895,6 @@ Data masking and content filtering are available to enhance data privacy and saf [OPTION END] -[OPTION BEGIN [Java SDK]] - -In this step, we will consume an LLM through the orchestration service with the created deployment, using the core and orchestration module of the [SAP Cloud SDK for Java](https://github.com/SAP/cloud-sdk-java). - -To begin the consumption process, follow the steps below: - - -**Prepare the CV File** - -• Download the [cv.txt](img/cv.txt) file, which contains the CV used this tutorial. Add it to your project. - -• Read the CV file from the correct path using the following code: - -```java -// Adapt filepath to the location you stored the file -var filePath = "path/to/cv.txt"; - -// Read file into string -String cvContent; -try { - cvContent = new String(Files.readAllBytes(Paths.get(filePath))); -} catch (IOException e) { - throw new RuntimeException(e); -} - -// Print file content -System.out.println(cvContent); - -``` -The next step involves creating the prompt for the LLM including both `SystemMessage` and `UserMessage` components. - -• `SystemMessage`: Defines the AI assistant's role and instructions. - -• `UserMessage`: Represents the user's input (i.e., the CV content) to be processed by the LLM. - -```java -// Define system and user messages for prompt -var systemMessage = Message.system( - """ - You are an AI assistant designed to screen resumes for HR purposes. - Please assess the candidate qualifications based on the provided resume. - """ -); -var userMessage = Message.user("Candidate Resume: \n" + cvContent); - -// Define the prompt for resume screening -var prompt = new OrchestrationPrompt(systemMessage, userMessage); - -``` - - -We can define model parameters and a list of models to use. Only use those models that are already deployed in your instances. For this example, we have selected the following parameters and models: - -```java -// List of models with parameters to iterate through, can be adapted if desired -var models = Stream.of( - OrchestrationAiModel.GPT_4O, - OrchestrationAiModel.MISTRAL_LARGE_INSTRUCT, - OrchestrationAiModel.CLAUDE_3_5_SONNET - ).map(model -> model.withParam(MAX_TOKENS, 1000).withParam(TEMPERATURE, 0.6)).toList(); - -``` - - -The following function writes the responses from different models, stored in a list, to a file: - -```java -// Function writitng responses to a file -void createFileFromResponses (ArrayList responses) { - // Format model responses - var formattedResponses = responses.stream(). - map(response -> "Response from model " + response.get("model") + - ": \n\n" + response.get("response")); - - // Write model responses to provided file path - try { - Files.writeString(Path.of("src/main/resources/static/responses.txt"), - String.join("\n\n" + "-".repeat(120) + "\n\n", formattedResponses.toList())); - } catch (IOException e) { - throw new RuntimeException(e); - } -} -``` - -**Generate Responses for Multiple Models** - -This step outlines the process of generating responses for a set of queries using different models. We iterate through the list of models created earlier and query the model with the created prompt using an `OrchestrationClient`. - -```java -// Create the client used for interaction with orchestration service -var client = new OrchestrationClient(new AiCoreService() - .getInferenceDestination(RESOURCE_GROUP).forScenario("orchestration")); - -// A list to store all responses from the different models -var responses = new ArrayList(); - -// Iterate through the list of models -for (var model: models) { - System.out.println("\n=== Responses for model: %s ===\n"formatted(model.getName())); - - // Create orchestration module configuration for current model - var moduleConfig = new OrchestrationModuleConfig().withLlmConfig(model); - - // Prompt model with orchestration module configuration - var response = client.chatCompletion(prompt, moduleConfig); - - // Add response to list of all model responses - responses.add(Map.of("model", model.getName(), "response", response.getContent())); - - System.out.println(response.getContent()); -} - -// Write all responses to a file -createFileFromResponses(responses); -``` - -**Important Note** - -Ensure at least one orchestration deployment is ready to be consumed during this process. - -**Optional Advanced Modules** - -Together with document grounding and templating, data masking and content filtering are available to enhance data privacy and safety. Data masking hides sensitive information like phone numbers or organization names, while content filtering can screen for categories such as hate self-harm, sexual content, and violence. In this tutorial, the response generated by the LLM models may carry sensitive information, such as names and phone numbers. For further enhancement, refer to the next tutorial on implementing these modules. - -[OPTION END] - [OPTION BEGIN [Bruno]] - Go to the 08_consume_model section in the collection. @@ -1142,4 +946,4 @@ Together with document grounding and templating, data masking and content filter Data masking and content filtering are available to enhance data privacy and safety. Data masking hides sensitive information like phone numbers or organization names, while content filtering can screen for categories such as hate self-harm, sexual content, and violence. In this tutorial, the response generated by the LLM models may carry sensitive information, such as names and phone numbers etc.. For further enhancement, refer to the next tutorial on implementing these modules. -[OPTION END] +[OPTION END] \ No newline at end of file diff --git a/tutorials/ai-core-orchestration-consumption/img/Bruno_Collection.json b/tutorials/ai-core-orchestration-consumption/img/Bruno_Collection.json new file mode 100644 index 0000000000..8c9dd9b7ae --- /dev/null +++ b/tutorials/ai-core-orchestration-consumption/img/Bruno_Collection.json @@ -0,0 +1,1591 @@ +{ + "name": "Grounding", + "version": "1", + "items": [ + { + "type": "http", + "name": "get_token", + "seq": 1, + "request": { + "url": "{{ai_auth_url}}/oauth/token", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/x-www-form-urlencoded", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "formUrlEncoded", + "formUrlEncoded": [ + { + "name": "grant_type", + "value": "client_credentials", + "enabled": true + }, + { + "name": "client_id", + "value": "{{client_id}}", + "enabled": true + }, + { + "name": "client_secret", + "value": "{{client_secret}}", + "enabled": true + } + ], + "multipartForm": [] + }, + "script": { + "res": "if (res.getStatus() == 200) {\n bru.setEnvVar(\"access_token\", res.body.access_token);\n}" + }, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "none" + } + } + }, + { + "type": "http", + "name": "health", + "seq": 2, + "request": { + "url": "{{ai_api_url}}/api/v1/healthz", + "method": "GET", + "headers": [], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "folder", + "name": "02_deployments", + "items": [ + { + "type": "http", + "name": "create_deployment", + "seq": 5, + "request": { + "url": "{{ai_api_url}}/v2/lm/deployments", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"ttl\": \"24H\",\n \"configurationId\": \"\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete_deployment_id", + "seq": 9, + "request": { + "url": "{{ai_api_url}}/v2/lm/deployments/", + "method": "DELETE", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "json": "{\n \"ttl\": \"24H\",\n \"configurationId\": \"\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_configuration", + "seq": 4, + "request": { + "url": "{{ai_api_url}}/v2/lm/configurations", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "create_configuration", + "seq": 3, + "request": { + "url": "{{ai_api_url}}/v2/lm/configurations", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"name\": \"orchestration-config\",\n \"executableId\": \"orchestration\",\n \"scenarioId\": \"orchestration\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_deployment", + "seq": 6, + "request": { + "url": "{{ai_api_url}}/v2/lm/deployments", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "json": "{\n \"ttl\": \"24H\",\n \"configurationId\": \"\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_deployment_id", + "seq": 7, + "request": { + "url": "{{ai_api_url}}/v2/lm/deployments/<>DEPLOYMENT_ID", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "json": "{\n \"ttl\": \"24H\",\n \"configurationId\": \"\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_scenario", + "seq": 1, + "request": { + "url": "{{ai_api_url}}/v2/lm/scenarios", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "stop_deployment_id", + "seq": 8, + "request": { + "url": "{{ai_api_url}}/v2/lm/deployments/", + "method": "PATCH", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"targetStatus\": \"STOPPED\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_scenario_executable", + "seq": 2, + "request": { + "url": "{{ai_api_url}}/v2/lm/scenarios/orchestration/executables", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "04_pipeline", + "items": [ + { + "type": "http", + "name": "create_pipeline", + "seq": 1, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/pipelines", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json", + "enabled": true + }, + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"type\": \"MSSharePoint\",\n \"configuration\": {\n \"destination\": \"\",\n \"sharePoint\": {\n \"site\": {\n \"name\": \"\",\n \"includePaths\": [\n \"/\"\n ]\n }\n }\n }\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete_pipeline_by_pipeline_id", + "seq": 5, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/pipelines/", + "method": "DELETE", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_all_pipelines", + "seq": 2, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/pipelines", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_pipeline_by_pipeline_id", + "seq": 3, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/pipelines/", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_pipeline_status_by_pipeline_id", + "seq": 4, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/pipelines//status", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "01_resource_group", + "items": [ + { + "type": "http", + "name": "create", + "seq": 1, + "request": { + "url": "{{ai_api_url}}/v2/admin/resourceGroups", + "method": "POST", + "headers": [], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"resourceGroupId\": \"{{resource_group}}\",\n \"labels\": [\n {\n \"key\": \"ext.ai.sap.com/document-grounding\",\n \"value\": \"true\"\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete_by_id", + "seq": 4, + "request": { + "url": "{{ai_api_url}}/v2/admin/resourceGroups/{{resource_group}}", + "method": "DELETE", + "headers": [], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get", + "seq": 2, + "request": { + "url": "{{ai_api_url}}/v2/admin/resourceGroups", + "method": "GET", + "headers": [], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_by_id", + "seq": 3, + "request": { + "url": "{{ai_api_url}}/v2/admin/resourceGroups/{{resource_group}}", + "method": "GET", + "headers": [], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "03_generic_secret", + "items": [ + { + "type": "http", + "name": "create", + "seq": 2, + "request": { + "url": "{{ai_api_url}}/v2/admin/secrets", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"name\": \"\",\n \"data\": {\n \"type\": \"SFRUUA==\",\n \"description\": \"\",\n \"clientId\": \"\",\n \"authentication\": \"\",\n \"tokenServiceURL\": \"\",\n \"password\": \"\",\n \"proxyType\": \"PROXY\",\n \"url\": \"\",\n \"tokenServiceURLType\": \"TOKENSERVICE\",\n \"user\": \"\",\n \"clientSecret\": \"\",\n \"scope\": \"\"\n },\n \"labels\": [\n {\n \"key\": \"ext.ai.sap.com/document-grounding\",\n \"value\": \"true\"\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete", + "seq": 3, + "request": { + "url": "{{ai_api_url}}/v2/admin/secrets/canary-rg-secret", + "method": "DELETE", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_all", + "seq": 1, + "request": { + "url": "{{ai_api_url}}/v2/admin/secrets", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "update", + "seq": 4, + "request": { + "url": "{{ai_api_url}}/v2/admin/secrets/canary-rg-secret", + "method": "PATCH", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"data\": {\n \"clientId\": \"\"\n }\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "06_vector", + "items": [ + { + "type": "http", + "name": "create_collections", + "seq": 2, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"title\": \"test-canary-collection\",\n \"embeddingConfig\": {\n \"modelName\": \"text-embedding-ada-002-v2\"\n },\n \"metadata\": [\n {\n \"key\": \"purpose\",\n \"value\": [\n \"demonstration\"\n ]\n },\n {\n \"key\": \"a-random-key\",\n \"value\": [\n \"hello world!\"\n ]\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "create_documents", + "seq": 5, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//documents", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"documents\": [\n {\n \"metadata\": [\n {\n \"key\": \"url\",\n \"value\": [\n \"http://hello.com\",\n \"123\"\n ]\n }\n ],\n \"chunks\": [\n {\n \"content\": \"Joule is the AI copilot that truly understands your business. Joule revolutionizes how you interact with your SAP business systems, making every touchpoint count and every task simpler.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"1\"\n ]\n }\n ]\n },\n {\n \"content\": \"It enables the companion of the Intelligent Enterprise, guiding you through content discovery within SAP Ecosystem, and giving a transparent role-based access to the relevant processes from everywhere. This is the one assistant experience, a unified and delightful user experience across SAP’s Ǯ solution portfolio.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"2\"\n ]\n }\n ]\n }\n ]\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete_collection_by_id", + "seq": 12, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections/", + "method": "DELETE", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete_documents_by_id", + "seq": 11, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//documents/", + "method": "DELETE", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_all_collections", + "seq": 1, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_all_documents_by_collection_id", + "seq": 6, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//documents", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_collection_by_id", + "seq": 4, + "request": { + "url": "{{ai_api_url}}/v2/lm/document-grounding/vector/collections/", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_collection_creation_status_by_id", + "seq": 3, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//creationStatus", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_collection_deletion_status_by_id", + "seq": 13, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//deletionStatus", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_documents_by_id", + "seq": 7, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//documents/", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "insert_documents", + "seq": 9, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//documents", + "method": "PATCH", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"documents\": [\n {\n \"id\": \"\",\n \"metadata\": [\n {\n \"key\": \"url\",\n \"value\": [\"http://hello1.com\"]\n },\n {\n \"key\": \"test-insert\",\n \"value\": [\"123\"]\n }\n ],\n \"chunks\": [\n {\n \"content\": \"Joule is not the AI copilot that truly understands your business. Joule revolutionizes how you interact with your SAP business systems, making every touchpoint count and every task simpler.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"1\"\n ]\n }\n ]\n },\n {\n \"content\": \"It enables the companion of the Intelligent Enterprise, guiding you through content discovery within SAP Ecosystem, and giving a transparent role-based access to the relevant processes from everywhere. This is the one assistant experience, a unified and delightful user experience across SAP’s Ǯ solution portfolio.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"2\"\n ]\n }\n ]\n }\n ]\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "search", + "seq": 10, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/search", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"query\": \"is Joule an AI Copilot?\",\n \"filters\": [\n {\n \"id\": \"string\",\n \"collectionIds\": [\n \"\"\n ],\n \"configuration\": {},\n \"collectionMetadata\": [],\n \"documentMetadata\": [\n {\n \"key\": \"url\",\n \"value\": [\n \"http://hello1.com\"\n ],\n \"selectMode\": [\"ignoreIfKeyAbsent\"]\n }\n ],\n \"chunkMetadata\": []\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "update_documents", + "seq": 8, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//documents", + "method": "PATCH", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"documents\": [\n {\n \"id\": \"\",\n \"metadata\": [\n {\n \"key\": \"url\",\n \"value\": [\"http://hello1.com\"]\n }\n ],\n \"chunks\": [\n {\n \"content\": \"Joule is not the AI copilot that truly understands your business. Joule revolutionizes how you interact with your SAP business systems, making every touchpoint count and every task simpler.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"1\"\n ]\n }\n ]\n },\n {\n \"content\": \"It enables the companion of the Intelligent Enterprise, guiding you through content discovery within SAP Ecosystem, and giving a transparent role-based access to the relevant processes from everywhere. This is the one assistant experience, a unified and delightful user experience across SAP’s Ǯ solution portfolio.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"2\"\n ]\n }\n ]\n }\n ]\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "07_retrieval", + "items": [ + { + "type": "http", + "name": "dataRepositories by id", + "seq": 2, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/retrieval/dataRepositories/", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "dataRepositories", + "seq": 1, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/retrieval/dataRepositories", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "retrieval_pipeline", + "seq": 3, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/retrieval/search", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + }, + { + "name": "Content-Type", + "value": "application/json", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"query\": \"what is AI106 about and who are the presenters?\",\n \"filters\": [\n {\n \"id\": \"string\",\n \"searchConfiguration\": {},\n \"dataRepositories\": [\n \"\"\n ],\n \"dataRepositoryType\": \"vector\",\n \"dataRepositoryMetadata\": [],\n \"documentMetadata\": [],\n \"chunkMetadata\": []\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "retrieval_vector", + "seq": 4, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/retrieval/search", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + }, + { + "name": "Content-Type", + "value": "application/json", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"query\": \"is joule an ai copilot?\",\n \"filters\": [\n {\n \"id\": \"string\",\n \"searchConfiguration\": {\n \"maxChunkCount\": 1\n },\n \"dataRepositories\": [\n \"\"\n ],\n \"dataRepositoryType\": \"vector\",\n \"dataRepositoryMetadata\": [],\n \"documentMetadata\": [],\n \"chunkMetadata\": []\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "05_orchestration", + "items": [ + { + "type": "http", + "name": "completion", + "seq": 1, + "request": { + "url": "{{orchestration_service_url}}/completion", + "method": "POST", + "headers": [ + { + "name": "ai-resource-group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"orchestration_config\": {\n \"module_configurations\": {\n \"grounding_module_config\": {\n \"type\": \"document_grounding_service\",\n \"config\": {\n \"filters\": [\n {\n \"id\": \"filter1\",\n \"data_repositories\": [\n \"\"\n ],\n \"search_config\": {\n \"max_chunk_count\": 10\n },\n \"data_repository_type\": \"vector\"\n }\n ],\n \"input_params\": [\n \"groundingRequest\"\n ],\n \"output_param\": \"groundingOutput\"\n }\n },\n \"llm_module_config\": {\n \"model_name\": \"gpt-35-turbo\",\n \"model_params\": {},\n \"model_version\": \"latest\"\n },\n \"templating_module_config\": {\n \"template\": [\n {\n \"role\": \"user\",\n \"content\": \"You are a helpful assistant for any queries for answering questions.\\\\\\\\nAnswer the grounding request by providing relevant answers that fit to the request. \\\\\\\\n\\\\\\\\nRequest: {{ ?groundingRequest }}\\\\\\\\n\\\\\\\\nContext:{{ ?groundingOutput }}\"\n }\n ],\n \"defaults\": {}\n },\n \"filtering_module_config\": {\n \"input\": {\n \"filters\": [\n {\n \"type\": \"azure_content_safety\",\n \"config\": {\n \"Hate\": 2,\n \"SelfHarm\": 2,\n \"Sexual\": 2,\n \"Violence\": 2\n }\n }\n ]\n },\n \"output\": {\n \"filters\": [\n {\n \"type\": \"azure_content_safety\",\n \"config\": {\n \"Hate\": 2,\n \"SelfHarm\": 2,\n \"Sexual\": 2,\n \"Violence\": 2\n }\n }\n ]\n }\n }\n }\n },\n \"input_params\": {\n \"groundingRequest\": \"what is orchestration service?\"\n },\n \"return_module_results\": true\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "completion_help", + "seq": 2, + "request": { + "url": "{{orchestration_service_url}}/completion", + "method": "POST", + "headers": [ + { + "name": "ai-resource-group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"orchestration_config\": {\n \"module_configurations\": {\n \"grounding_module_config\": {\n \"type\": \"document_grounding_service\",\n \"config\": {\n \"filters\": [\n {\n \"id\": \"filter1\",\n \"data_repositories\": [\n \"*\"\n ],\n \"search_config\": {},\n \"data_repository_type\": \"help.sap.com\"\n }\n ],\n \"input_params\": [\n \"groundingRequest\"\n ],\n \"output_param\": \"groundingOutput\"\n }\n },\n \"llm_module_config\": {\n \"model_name\": \"gemini-1.5-pro\",\n \"model_params\": {},\n \"model_version\": \"001\"\n },\n \"templating_module_config\": {\n \"template\": [\n {\n \"role\": \"user\",\n \"content\": \"You are a helpful assistant for any queries for SAP Teched 2024.\\\\nAnswer the grounding request by providing relevant answers that fit to the request. \\\\n\\\\nRequest: {{ ?groundingRequest }}\\\\n\\\\nReports:{{ ?groundingOutput }}\"\n }\n ],\n \"defaults\": {}\n },\n \"filtering_module_config\": {\n \"input\": {\n \"filters\": [\n {\n \"type\": \"azure_content_safety\",\n \"config\": {\n \"Hate\": 2,\n \"SelfHarm\": 2,\n \"Sexual\": 2,\n \"Violence\": 2\n }\n }\n ]\n },\n \"output\": {\n \"filters\": [\n {\n \"type\": \"azure_content_safety\",\n \"config\": {\n \"Hate\": 2,\n \"SelfHarm\": 2,\n \"Sexual\": 2,\n \"Violence\": 2\n }\n }\n ]\n }\n }\n }\n },\n \"input_params\": {\n \"groundingRequest\": \"what is joule?\"\n },\n \"return_module_results\": true\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_foundation_models", + "seq": 3, + "request": { + "url": "{{ai_api_url}}/v2/lm/scenarios/foundation-models/models", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "08_consume_model", + "items": [ + { + "type": "http", + "name": "direct_model_usage", + "seq": 2, + "request": { + "url": "{{orchestration_service_url}}/completion", + "method": "POST", + "headers": [ + { + "name": "ai-resource-group", + "value": "{{resource_group}}", + "enabled": true + }, + { + "name": "Content-Type", + "value": "application/json", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{ \n \"orchestration_config\": { \n \"module_configurations\": { \n \"templating_module_config\": { \n \"template\": [ \n { \n \"role\": \"system\", \n \"content\": \"You are an AI assistant designed to screen resumes for HR purposes. Please assess the candidate qualifications based on the provided resume.\" \n }, \n { \n \"role\": \"user\", \n \"content\": \"Candidate Resume:\\n{{candidate_resume}}\" \n } \n ] \n }, \n \"llm_module_config\": { \n \"model_name\": \"gpt-35-turbo-16k\", \n \"model_params\": { \n \"max_tokens\": 300, \n \"temperature\": 0.1, \n \"frequency_penalty\": 0, \n \"presence_penalty\": 0 \n } \n }, \n \"masking_module_config\": { \n \"masking_providers\": [ \n { \n \"type\": \"sap_data_privacy_integration\", \n \"method\": \"anonymization\", \n \"entities\": [ \n { \n \"type\": \"profile-email\" \n }, \n { \n \"type\": \"profile-person\" \n }, \n { \n \"type\": \"profile-phone\" \n }, \n { \n \"type\": \"profile-org\" \n }, \n { \n \"type\": \"profile-location\" \n } \n ] \n } \n ] \n }, \n \"filtering_module_config\": { \n \"input\": { \n \"filters\": [ \n { \n \"type\": \"azure_content_safety\", \n \"config\": { \n \"Hate\": 2, \n \"SelfHarm\": 2, \n \"Sexual\": 2, \n \"Violence\": 2 \n } \n } \n ] \n }, \n \"output\": { \n \"filters\": [ \n { \n \"type\": \"azure_content_safety\", \n \"config\": { \n \"Hate\": 2, \n \"SelfHarm\": 2, \n \"Sexual\": 2, \n \"Violence\": 2 \n } \n } \n ] \n } \n } \n } \n }, \n \"defaults\": { \n \"candidate_resume\": \"John Doe\\n1234 Data St, San Francisco, CA 94101\\n(123) 456-7890\\njohndoe@email.com\\nLinkedIn Profile\\nGitHub Profile\\n\\nObjective\\nDetail-oriented Data Scientist with 3+ years of experience in data analysis, statistical modeling, and machine learning. Seeking to leverage expertise in predictive modeling and data visualization to help drive data-informed decision-making at [Company Name].\\n\\nEducation\\nMaster of Science in Data Science\\nUniversity of California, Berkeley\\nGraduated: May 2021\\n\\nBachelor of Science in Computer Science\\nUniversity of California, Los Angeles\\nGraduated: May 2019\\n\\nTechnical Skills\\n\\nProgramming Languages: Python, R, SQL, Java\\nData Analysis & Visualization: Pandas, NumPy, Matplotlib, Seaborn, Tableau\\nMachine Learning: Scikit-learn, TensorFlow, Keras, XGBoost\\nBig Data Technologies: Hadoop, Spark\\nDatabases: MySQL, PostgreSQL\\nVersion Control: Git\\n\\nProfessional Experience\\n\\nData Scientist\\nDataCorp Inc., San Francisco, CA\\nJune 2021 – Present\\n\\nDeveloped predictive models to optimize marketing campaigns, which increased ROI by 20%.\\nConducted in-depth data analysis using Python and SQL to identify trends and patterns in large datasets.\\nCollaborated with cross-functional teams to implement data-driven strategies that improved customer satisfaction scores by 15%.\\n Created interactive dashboards using Tableau to visualize KPIs for stakeholders.\\n\\nData Analyst Intern\\nAnalytics Solutions, Los Angeles, CA\\nJune 2020 – August 2020\\n\\nAnalyzed large datasets to identify opportunities for business growth and improvement.\\nAssisted in the development of automated reporting tools using Python and Excel.\\nWorked with data visualization tools to create insightful reports for management.\\n\\nProjects\\n\\nCustomer Segmentation Analysis\\nConducted K-means clustering on customer data to segment the customer base into distinct groups, enabling targeted marketing strategies.\\n\\nPredictive Stock Price Modeling\\nBuilt a predictive model using time series analysis to forecast stock prices, achieving an accuracy rate of 85%.\\n\\nSentiment Analysis on Social Media\\nImplemented natural language processing techniques to analyze sentiment from tweets, providing insights into public opinion on various topics.\\n\\nCertifications\\n\\nCertified Data Scientist (CDS) – Data Science Council of America\\nMachine Learning Specialization – Coursera by Stanford University\\n\\nProfessional Affiliations\\n\\nMember, Association for Computing Machinery (ACM)\\nMember, Data Science Society\\n\\nReferences\\nAvailable upon request.\\n\\nPersonal Interests\\n- I absolutely love exploring new technologies and working on innovative projects.\\n- I enjoy reading books, especially on artificial intelligence and machine learning.\\n- I hate people who are dishonest and unreliable.\" \n } \n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + } + ], + "environments": [ + { + "variables": [ + { + "name": "ai_auth_url", + "value": "https://********.****.eu11.hana.ondemand.com", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "ai_api_url", + "value": "https://api.ai.*******.aws.ml.hana.ondemand.com", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "client_id", + "value": "", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "client_secret", + "value": "", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "resource_group", + "value": "", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "common_endpoint", + "value": "/v2/lm/document-grounding", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "orchestration_service_url", + "value": "", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "access_token", + "value": "", + "enabled": true, + "secret": true, + "type": "text" + } + ], + "name": "Grounding-test" + } + ], + "brunoConfig": { + "version": "1", + "name": "bruno_config", + "type": "collection", + "ignore": [ + "node_modules", + ".git" + ] + } +} \ No newline at end of file diff --git a/tutorials/ai-core-orchestration-consumption/img/access_token.png b/tutorials/ai-core-orchestration-consumption/img/access_token.png new file mode 100644 index 0000000000..f6a229c960 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/access_token.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/cv.txt b/tutorials/ai-core-orchestration-consumption/img/cv.txt index b518a2cec8..002b35fc8f 100644 --- a/tutorials/ai-core-orchestration-consumption/img/cv.txt +++ b/tutorials/ai-core-orchestration-consumption/img/cv.txt @@ -1,79 +1,79 @@ -John Doe -1234 Data St, San Francisco, CA 94101 -(123) 456-7890 -johndoe@email.com -LinkedIn Profile -GitHub Profile - -Objective -Detail-oriented Data Scientist with 3+ years of experience in data analysis, statistical modeling, and machine learning. Seeking to leverage expertise in predictive modeling and data visualization to help drive data-informed decision-making at [Company Name]. - -Education -Master of Science in Data Science -University of California, Berkeley -Graduated: May 2021 - -Bachelor of Science in Computer Science -University of California, Los Angeles -Graduated: May 2019 - -Technical Skills - -Programming Languages: Python, R, SQL, Java -Data Analysis & Visualization: Pandas, NumPy, Matplotlib, Seaborn, Tableau -Machine Learning: Scikit-learn, TensorFlow, Keras, XGBoost -Big Data Technologies: Hadoop, Spark -Databases: MySQL, PostgreSQL -Version Control: Git - -Professional Experience - -Data Scientist -DataCorp Inc., San Francisco, CA -June 2021 – Present - -Developed predictive models to optimize marketing campaigns, which increased ROI by 20%. -Conducted in-depth data analysis using Python and SQL to identify trends and patterns in large datasets. -Collaborated with cross-functional teams to implement data-driven strategies that improved customer satisfaction scores by 15%. -Created interactive dashboards using Tableau to visualize KPIs for stakeholders. - -Data Analyst Intern -Analytics Solutions, Los Angeles, CA -June 2020 – August 2020 - -Analyzed large datasets to identify opportunities for business growth and improvement. -Assisted in the development of automated reporting tools using Python and Excel. -Worked with data visualization tools to create insightful reports for management. - -Projects - -Customer Segmentation Analysis -Conducted K-means clustering on customer data to segment the customer base into distinct groups, enabling targeted marketing strategies. - -Predictive Stock Price Modeling -Built a predictive model using time series analysis to forecast stock prices, achieving an accuracy rate of 85%. - -Sentiment Analysis on Social Media -Implemented natural language processing techniques to analyze sentiment from tweets, providing insights into public opinion on various topics. - -Certifications - -Certified Data Scientist (CDS) – Data Science Council of America -Machine Learning Specialization – Coursera by Stanford University - -Professional Affiliations - -Member, Association for Computing Machinery (ACM) -Member, Data Science Society - -References -Available upon request. - -Personal Interests -- I absolutely love exploring new technologies and working on innovative projects. -- I enjoy reading books, especially on artificial intelligence and machine learning. -- I hate people who are dishonest and unreliable. -- I love traveling and experiencing new cultures. -- I enjoy playing video games, especially competitive ones. -- I hate being stuck in a routine; I always seek new challenges and growth opportunities. --I hate working in Azure cloud -"Azure cloud is the most irritating platform i have ever used" +John Doe +1234 Data St, San Francisco, CA 94101 +(123) 456-7890 +johndoe@email.com +LinkedIn Profile +GitHub Profile + +Objective +Detail-oriented Data Scientist with 3+ years of experience in data analysis, statistical modeling, and machine learning. Seeking to leverage expertise in predictive modeling and data visualization to help drive data-informed decision-making at [Company Name]. + +Education +Master of Science in Data Science +University of California, Berkeley +Graduated: May 2021 + +Bachelor of Science in Computer Science +University of California, Los Angeles +Graduated: May 2019 + +Technical Skills + +Programming Languages: Python, R, SQL, Java +Data Analysis & Visualization: Pandas, NumPy, Matplotlib, Seaborn, Tableau +Machine Learning: Scikit-learn, TensorFlow, Keras, XGBoost +Big Data Technologies: Hadoop, Spark +Databases: MySQL, PostgreSQL +Version Control: Git + +Professional Experience + +Data Scientist +DataCorp Inc., San Francisco, CA +June 2021 – Present + +Developed predictive models to optimize marketing campaigns, which increased ROI by 20%. +Conducted in-depth data analysis using Python and SQL to identify trends and patterns in large datasets. +Collaborated with cross-functional teams to implement data-driven strategies that improved customer satisfaction scores by 15%. +Created interactive dashboards using Tableau to visualize KPIs for stakeholders. + +Data Analyst Intern +Analytics Solutions, Los Angeles, CA +June 2020 – August 2020 + +Analyzed large datasets to identify opportunities for business growth and improvement. +Assisted in the development of automated reporting tools using Python and Excel. +Worked with data visualization tools to create insightful reports for management. + +Projects + +Customer Segmentation Analysis +Conducted K-means clustering on customer data to segment the customer base into distinct groups, enabling targeted marketing strategies. + +Predictive Stock Price Modeling +Built a predictive model using time series analysis to forecast stock prices, achieving an accuracy rate of 85%. + +Sentiment Analysis on Social Media +Implemented natural language processing techniques to analyze sentiment from tweets, providing insights into public opinion on various topics. + +Certifications + +Certified Data Scientist (CDS) – Data Science Council of America +Machine Learning Specialization – Coursera by Stanford University + +Professional Affiliations + +Member, Association for Computing Machinery (ACM) +Member, Data Science Society + +References +Available upon request. + +Personal Interests +- I absolutely love exploring new technologies and working on innovative projects. +- I enjoy reading books, especially on artificial intelligence and machine learning. +- I hate people who are dishonest and unreliable. +- I love traveling and experiencing new cultures. +- I enjoy playing video games, especially competitive ones. +- I hate being stuck in a routine; I always seek new challenges and growth opportunities. +-I hate working in Azure cloud -"Azure cloud is the most irritating platform i have ever used" diff --git a/tutorials/ai-core-orchestration-consumption/img/deployement_running.png b/tutorials/ai-core-orchestration-consumption/img/deployement_running.png new file mode 100644 index 0000000000..cf88b981c0 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/deployement_running.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/deployment_create_config.png b/tutorials/ai-core-orchestration-consumption/img/deployment_create_config.png new file mode 100644 index 0000000000..cd3097237d Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/deployment_create_config.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/env_set.png b/tutorials/ai-core-orchestration-consumption/img/env_set.png new file mode 100644 index 0000000000..9925274fc1 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/env_set.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/get_resource_group.png b/tutorials/ai-core-orchestration-consumption/img/get_resource_group.png new file mode 100644 index 0000000000..1c94b79957 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/get_resource_group.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/get_token.png b/tutorials/ai-core-orchestration-consumption/img/get_token.png new file mode 100644 index 0000000000..c0f10d0fb1 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/get_token.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/image014.png b/tutorials/ai-core-orchestration-consumption/img/image014.png index 17cd6c899d..bc23035516 100644 Binary files a/tutorials/ai-core-orchestration-consumption/img/image014.png and b/tutorials/ai-core-orchestration-consumption/img/image014.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img001.png b/tutorials/ai-core-orchestration-consumption/img/img001.png new file mode 100644 index 0000000000..2e618699f0 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img001.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img003.png b/tutorials/ai-core-orchestration-consumption/img/img003.png new file mode 100644 index 0000000000..cd6fbd079f Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img003.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img005.png b/tutorials/ai-core-orchestration-consumption/img/img005.png new file mode 100644 index 0000000000..e30d1053e2 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img005.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img007.png b/tutorials/ai-core-orchestration-consumption/img/img007.png new file mode 100644 index 0000000000..92d04ebe37 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img007.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img009.png b/tutorials/ai-core-orchestration-consumption/img/img009.png new file mode 100644 index 0000000000..12da0cce86 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img009.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img011.png b/tutorials/ai-core-orchestration-consumption/img/img011.png new file mode 100644 index 0000000000..60d6bab3df Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img011.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img013.png b/tutorials/ai-core-orchestration-consumption/img/img013.png new file mode 100644 index 0000000000..eefe403658 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img013.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img017.png b/tutorials/ai-core-orchestration-consumption/img/img017.png new file mode 100644 index 0000000000..0643ec1bbb Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img017.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img019.png b/tutorials/ai-core-orchestration-consumption/img/img019.png new file mode 100644 index 0000000000..bbc782b5b2 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img019.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img021.png b/tutorials/ai-core-orchestration-consumption/img/img021.png new file mode 100644 index 0000000000..5ffdb91ce5 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img021.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img023.png b/tutorials/ai-core-orchestration-consumption/img/img023.png new file mode 100644 index 0000000000..8812fa545e Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img023.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img025.png b/tutorials/ai-core-orchestration-consumption/img/img025.png new file mode 100644 index 0000000000..00484604c7 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img025.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img027.png b/tutorials/ai-core-orchestration-consumption/img/img027.png new file mode 100644 index 0000000000..8bb8624ecb Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img027.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img029.png b/tutorials/ai-core-orchestration-consumption/img/img029.png new file mode 100644 index 0000000000..b65221f571 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img029.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/img031.png b/tutorials/ai-core-orchestration-consumption/img/img031.png new file mode 100644 index 0000000000..24a0e44e88 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/img031.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/no_env.png b/tutorials/ai-core-orchestration-consumption/img/no_env.png new file mode 100644 index 0000000000..9d8632c8a9 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/no_env.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/resource_group.png b/tutorials/ai-core-orchestration-consumption/img/resource_group.png new file mode 100644 index 0000000000..bfefb499a3 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/resource_group.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/service_update_creds.png b/tutorials/ai-core-orchestration-consumption/img/service_update_creds.png new file mode 100644 index 0000000000..e6d9f77d67 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/service_update_creds.png differ diff --git a/tutorials/ai-core-orchestration-consumption/img/tut_1_result.png b/tutorials/ai-core-orchestration-consumption/img/tut_1_result.png new file mode 100644 index 0000000000..9b89885847 Binary files /dev/null and b/tutorials/ai-core-orchestration-consumption/img/tut_1_result.png differ diff --git a/tutorials/ai-core-orchestration-grounding/ai-core-orchestration-Grounding.md b/tutorials/ai-core-orchestration-grounding/ai-core-orchestration-Grounding.md new file mode 100644 index 0000000000..d05af57f89 --- /dev/null +++ b/tutorials/ai-core-orchestration-grounding/ai-core-orchestration-Grounding.md @@ -0,0 +1,962 @@ +--- +parser: v2 +auto_validation: true +time: 45 +primary_tag: software-product>sap-business-technology-platform +tags: [ tutorial>beginner, topic>artificial-intelligence, topic>machine-learning, software-product>sap-business-technology-platform ] +author_name: Smita Naik +author_profile: https://github.com/I321506 +--- + +# Orchestration with Grounding Capabilities in SAP AI Core + This tutorial provides a step-by-step guide to setting up document grounding, creating pipelines, and utilizing vector APIs for facility management. In our use case, we use facility management emails uploaded to Microsoft SharePoint as grounding documents. This enables precise retrieval of relevant information, supporting efficient query resolution and service request handling. Follow this guide to streamline facility-related insights and response processes. + +## You will learn +- How to set up orchestration pipelines, enable document grounding, and perform vector retrieval using SAP AI Core's grounding capabilities + +## Prerequisites + +- A BTP global account. +- If you are an external developer, customer, or partner, refer to this [tutorial](https://developers.sap.com/tutorials/btp-cockpit-entitlements.html). +- If you are an SAP Developer or SAP employee, refer to the following links (for internal SAP stakeholders only): + - [How to create a BTP Account (internal)](https://me.sap.com/notes/3493139) + - [SAP AI Core Documentation](https://help.sap.com/docs/sap-ai-core?version=INTERNAL&locale=en-US&state=PRODUCTION) +- AI Core setup and basic knowledge: [Link to documentation](https://developers.sap.com/tutorials/ai-core-setup.html). +- An AI Core instance with a Standard Plan or Extended Plan. +- Access to Microsoft SharePoint for grounding capabilities. + +### 1. Create service key for AI Core instance + +[OPTION BEGIN [Bruno]] + +This step enables the foundational setup of the AI Core instance by creating a service key, which is crucial for accessing and managing the AI Core services in the development environment. + +• You can follow steps in https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/enabling-service-in-cloud-foundry?locale=en-US to create an AI Core instance and service key in development environment + +[OPTION END] + +[OPTION BEGIN [SAP Cloud SDK]] + +To interact with SAP AI Core using SAP Cloud SDK, you first need to create a service key that grants secure access to your AI Core instance. Follow the step Set Up Your Environment and Configure Access in the [tutorial] (https://developers.sap.com/tutorials/ai-core-orchestration-consumption.html) to establish your connection. + +```javascript + +import dotenv from "dotenv"; +dotenv.config(); + +const serviceKey = JSON.parse(process.env.AICORE_SERVICE_KEY); + +const AI_API_URL = serviceKey.serviceurls.AI_API_URL; +const clientid = serviceKey.clientid; +const clientsecret = serviceKey.clientsecret; +const authUrl = serviceKey.url; + +console.log("AI API URL:", AI_API_URL); + +``` +[OPTION END] + +[OPTION BEGIN [Gen AI SDK]] + +To interact with SAP AI Core using Gen AI SDK, you first need to create a service key that grants secure access to your AI Core instance. Follow the step Set Up Your Environment and Configure Access in the [tutorial] (https://developers.sap.com/tutorials/ai-core-orchestration-consumption.html) to establish your connection. + +[OPTION END] + +### 2. Download and import Bruno collection + +[OPTION BEGIN [Bruno]] + +This step prepares the workspace by importing pre-configured requests for easy interaction with AI Core services using Bruno collections. + +• Download [Bruno_config.json](img/Bruno_config.json) + +• Navigate to Bruno Collections and upload the .json file to import collections + +![img](img/image001.png) + +![img](img/image002.png) + +![img](img/image003.png) + +[OPTION END] + +### 3. Set env variables + +[OPTION BEGIN [Bruno]] + +Environment variables centralize configuration settings required for seamless integration between your service key and the imported collection. + +• Select the getToken query in the imported collection, click on **No Environment**, and configure the environment as canary-test. + +![img](img/image004.png) + +![img](img/image005.png) + +• Set the values inside environment canary-test + +- Populate values from the service key into the following variables: + - **ai_auth_url** + - **ai_api_url** + - **client_id** + - **client_secret** + +![img](img/image006.png) + +• Add a resource group name at **resource_group** + +• Save the configuration and set the active environment to canary-test. + +![img](img/image007.png) + +[OPTION END] + +### 4. Generate token + +[OPTION BEGIN [Bruno]] + +- This step generates an access token, required for authenticating API requests during the process. + - Select the get_token request and execute it. + - **Note**: Regenerate the token if it expires during execution. + +[OPTION END] + +[OPTION BEGIN [SAP Cloud SDK]] + +This step generates an access token, required for authenticating API requests during the process. + +```javascript + +const getToken = async () => { + const headers = { + "Content-Type": "application/x-www-form-urlencoded", + }; + const data = new URLSearchParams({ + grant_type: "client_credentials", + client_id: clientid, + client_secret: clientsecret + }); + try { + const response = await fetch(`${authUrl}/oauth/token`, { + method: "POST", + headers: headers, + body: data.toString() + }); + if (!response.ok) throw new Error(`Token Request Failed: ${response.statusText}`); + const result = await response.json(); + console.log("Access Token:", result.access_token); + return result.access_token; + } catch (error) { + console.error("Error getting token:", error); + } +}; +// Fetch the token +const token = await getToken(); + +``` + +![img](img/image055.png) + +[OPTION END] + +[OPTION BEGIN [Gen AI SDK]] + +This step generates an access token, required for authenticating API requests during the process. + +```python + +import json +import requests + +key = json.load(open('key.json')) +AI_API_URL= key['serviceurls']['AI_API_URL'] +clientid= key['clientid'] +clientsecret= key['clientsecret'] +url= key['url'] +resource_group = "default" + +headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'content-type': 'application/x-www-form-urlencoded', +} + +data = f'grant_type=client_credentials&client_id={clientid}&client_secret={clientsecret}' + +response = requests.post(f'{url}/oauth/token', headers=headers, data=data) + +token = response.json()['access_token'] + +print(token) + +``` +![img](img/image060.png) + +[OPTION END] + +### 5. Create resource group + +[OPTION BEGIN [Bruno]] + +- Resource groups segment workloads and manage resources for specific AI Core services. + - Expand **01_resource_group** and execute the create request to create a resource group. + +![img](img/image008.png) + +• Verify the group status using the **get_by_id** request to ensure it is **PROVISIONED**. + +![img](img/image009.png) + +[OPTION END] + +[OPTION BEGIN [AI Launchpad]] + +• In the **Workspaces** app, choose the **AI API connection**. + +• Open the **SAP AI Core Administration** app and choose **Resource Groups**. + +• The **Resource Groups** screen appears with a tile for each existing **resource group**. + +• Choose Create to create reference details for a new resource group. + +• Complete the fields in the Create **Resource Group** dialog box. + +![img](img/image042.png) + +• Enter a **resource group ID**. + +**Note:** Ensure that the resource group ID is unique. If the ID is not unique and is currently in use, then the new resource group and its details will overwrite the existing resource group. + +• Choose the **subaccount_id** label key and enter a value. + +• Choose the **zone_id** label key and enter a value. + +• Choose the **instance_id** label key and enter a value. + +• Enter the **document-grounding** label key and enter the value true. + +• If additional labels are required, enter their keys and corresponding values. + +• Choose **Create** to create the **resource group**. + +• The All Resource Groups screen appears and shows the **new resource group**. + +[OPTION END] + +[OPTION BEGIN [SAP Cloud SDK]] + +Create a resource group in SAP AI Core by defining its ID and quota, ensuring efficient resource allocation for AI workloads. + +```javascript + +const createResourceGroup = async (token, resource_group) => { + const headers = { + "Authorization": `Bearer ${token}`, + "Content-Type": "application/json" + }; + + const jsonData = { + resourceGroupId: resource_group, + labels: [ + { + key: "ext.ai.sap.com/document-grounding", + value: "true", + }, + ], + }; + + try { + const response = await fetch(`${AI_API_URL}/v2/admin/resourceGroups`, { + method: "POST", + headers: headers, + body: JSON.stringify(jsonData) + }); + + if (!response.ok) throw new Error(`Resource Group Creation Failed: ${response.statusText}`); + + const result = await response.json(); + console.log("Resource Group Created:", result); + } catch (error) { + console.error("Error creating resource group:", error); + } +}; + +// Create resource group +const resource_group = "default"; // Modify this as needed +await createResourceGroup(token, resource_group); + +``` + +![img](img/image056.png) + +[OPTION END] + +[OPTION BEGIN [Gen AI SDK]] + +Create a resource group in SAP AI Core by defining its ID and quota, ensuring efficient resource allocation for AI workloads. + +```python + +headers = { + 'Authorization': f'Bearer {token}', +} + +json_data = { + 'resourceGroupId': resource_group, + 'labels': [ + { + 'key': 'ext.ai.sap.com/document-grounding', + 'value': 'true', + }, + ], +} + +resource = requests.post(f'{AI_API_URL}/v2/admin/resourceGroups', headers=headers, json=json_data) + +resource.json() + +``` + +![img](img/image061.png) + +[OPTION END] + +### 6. Create generic secret + +[OPTION BEGIN [Bruno]] + +Generic secrets securely store SharePoint credentials required for document access + +• Expand **03_generic_secret** and select create request + +![img](img/image013.png) + +• Please refer to point 2 under https://help.sap.com/docs/joule/integrating-joule-with-sap/configure-access-from-sap-btp?locale=en-US for reference values of MS SharePoint credentials + +• Update **clientId**, **tokenServiceURL**, **password**, **url**, **user** and **clientSecret** according MS SharePoint credentials + +• To prepare your own SharePoint Create SharePoint Site (optional, you can re-use an existing site if you have one) + + 1. Create a Group and a Technical User (optional, existing can be reused) + 2. Register an Application, Generate a Client Secret, & Expose the application using web API + 3. Validate the SharePoint access with the Technical User + +• All values needs to be provided as base 64 encoded values + +[OPTION END] + +[OPTION BEGIN [AI Launchpad]] + +1. In the **Workspaces** app, choose the AI API connection. + +2. If you want to add your secret at the resource group level, choose the resource group. Alternatively you can use the toggles in the header or dialog box, where you will be prompted to specify a resource group. + +3. Open the **SAP AI Core Administration app** and choose **Generic Secrets**. The Generic Secrets screen appears with a tile for each existing secret. + +4. Choose **Add** to enter reference details for a new secret. + +5. Complete the fields in the Add Generic Secret dialog box as follows: + + - Switch between tenant-level secrets and resource-group-level secrets + + - If your secret is at the resource-group level: confirm the resource group. To change the resource group, choose  (Change Value). Enter a name for the secret. Secret names must comply with the following criteria: + + - Contain only lowercase alphanumeric characters, hyphens (-), or numbers + + - Do not start or end with a hyphen (-) + + ![img](img/image054.png) + + • Enter the secret in JSON format. For example: + + ```CODE + { + + "type": "SFRUUA==", + + "description": "", + + "clientId": "", + + "authentication": "", + + "tokenServiceURL": "", + + "password": "", + + "proxyType": "", + + "url": "", + + "tokenServiceURLType": "", + + "user": "", + + "clientSecret": "", + + "scope": "SCOPE", + + "labels": [ + + { + + "key": "ext.ai.sap.com/document-grounding", + + "value": "true" + + } + + ] + + } + + ``` + +[OPTION END] + +[OPTION BEGIN [SAP Cloud SDK]] + +Generic secrets securely store SharePoint credentials required for document access + +```javascript + +import axios from 'axios'; // ES Module import + +const options = { + method: 'POST', + url: 'https://api.ai.prodeuonly.eu-central-1.aws.ml.hana.ondemand.com/v2/admin/secrets', + headers: { + "Authorization": `Bearer ${token}`, + "Content-Type": "application/json", + "AI-Resource-Group": "default" + }, + data: { + name: 'canary-rg1-secret', + data: { + type: 'SFRUUA==', + description: '', + clientId: '', + authentication: '', + tokenServiceURL: '', + password: '', + proxyType: '', + url: '', + tokenServiceURLType: '', + user: '', + clientSecret: '', + scope: 'SCOPE', + }, + labels: [ + { + key: 'ext.ai.sap.com/document-grounding', + value: 'true', + }, + ], + }, +}; + +try { + const { data } = await axios.request(options); + console.log('Secret Created:', data); +} catch (error) { + console.error('Error creating secret:', error.response ? error.response.data : error.message); +} + +``` +![img](img/image057.png) + +[OPTION END] + +[OPTION BEGIN [Gen AI SDK]] + +Generic secrets securely store SharePoint credentials required for document access + +```python + +headers = { + 'AI-Resource-Group': resource.json()['resourceGroupId'], + 'Authorization': f'Bearer {token}', + "content-type": "application/json" +} + +json_data = { + 'name': 'canary-rg1-secret', + 'data': { + 'type': 'SFRUUA==', + 'description': ', + 'clientId': '', + 'authentication': '', + 'tokenServiceURL': '', + 'password': '', + 'proxyType': '', + 'url': '', + 'tokenServiceURLType': '', + 'user': '', + 'clientSecret': '', + 'scope': '', + }, + 'labels': [ + { + 'key': 'ext.ai.sap.com/document-grounding', + 'value': 'true', + }, + ], +} + +secret = requests.post(f'{AI_API_URL}/v2/admin/secrets', headers=headers, json=json_data) + +secret.json() + +``` + +![img](img/image062.png) + +[OPTION END] + +### 7. Prepare knowledge base and verification + +[OPTION BEGIN [Bruno]] + +#### Create Pipeline + +- Pipelines define the process for grounding and retrieving content from SharePoint repositories. + +In this use case, we have added facility management emails as grounding documents, uploading them to the designated SharePoint folder. I’m attaching the sample email folder [sample_emails] (img/sample_emails) used in this scenario. For practice, you can also use these emails if needed. + +• **Expand 04_pipeline** and select **create_pipeline** request + +• Replace value **generic_secret_name** with generic secret name created in step 6. + +• Replace value **sharepoint_site_name** with site name of MS SharePoint. + +• Replace value **folder_name** with the name of the folder from which the documents have to be taken.Multiple folder names can be specified. + +![img](img/image014.png) + +#### Get All Pipelines + +This request retrieves a list of all existing pipelines within the resource group. It helps in managing and monitoring available pipelines for orchestration. + +![img](img/image031.png) + +#### Get Pipeline by Pipeline ID + +This request fetches details of a specific pipeline using its unique ID. It is useful for verifying the configuration and settings of a particular pipeline. + +![img](img/image032.png) + +#### Get Pipeline Status by Pipeline ID + +This request checks the current status of a specific pipeline, such as whether it is running, completed, or failed. It helps in tracking the execution progress. + +![img](img/image033.png) + +Once the pipeline is successfully created, documents uploaded in SharePoint are converted into vectors via APIs. The conversion process can be validated upon successful pipeline execution. + +#### Verifying Vector Processing (Optional) + +These steps help inspect vector collections and documents to confirm successful processing. + + • **get_all_collections** – Lists all existing vector collections for validation. + +![img](img/image034.png) + + • **get_collection_creation_status_by_id** – Checks whether the collection was created successfully. + +![img](img/image035.png) + + • **get_collection_by_id** – Retrieves detailed information about a specific collection + +![img](img/image036.png) + + • **get_all_documents_by_collection_id** – Lists all stored documents to ensure correct ingestion. + +![img](img/image037.png) + + • **get_documents_by_id** – Fetches specific documents within a collection for debugging + +![img](img/image038.png) + + • **get_collection_deletion_status_by_id** – Confirms successful deletion of a collection if needed. + +![img](img/image039.png) + +#### Ensuring Data Retrieval for AI Processing (Optional) + +These steps confirm that data repositories are accessible for AI-powered searches and retrieval. + + • **dataRrepositories** – Lists all available repositories to ensure accessibility. + +![img](img/image040.png) + + • **dataRepositories by id** – Fetches details of a specific repository for targeted debugging. + +![img](img/image041.png) + +[OPTION END] + +[OPTION BEGIN [AI Launchpad]] + +Grounding is a crucial step in orchestration that ensures responses are enriched with relevant and accurate data from predefined sources. This section explains how grounding works in the AI Launchpad. + +**Input Variables** + +Input variables are parameters sent to the grounding service to facilitate data retrieval. These variables can be referenced in the template definition, allowing dynamic data incorporation based on user inputs. + +**Output Variable** + +The output variable holds the retrieved data from the grounding service. This data can then be utilized in the template definition to generate contextual and informed responses. + +**Selected Sources** + +You can specify the repositories from which the grounding module retrieves information. If no specific repositories are selected, grounding will include all available sources by default. Selecting relevant sources ensures precise and domain-specific data retrieval for improved orchestration outcomes. + +![img](img/image047.png) + +[OPTION END] + +[OPTION BEGIN [SAP Cloud SDK]] + +we are creating a document-grounding pipeline using SAP AI Core. The pipeline is configured to integrate with Microsoft SharePoint as a data source, enabling AI-driven document processing. This setup allows seamless ingestion of documents from a specified SharePoint site, ensuring efficient data retrieval and processing. + +```javascript + +const jsonData = { + type: 'MSSharePoint', + configuration: { + destination: '', + sharePoint: { + site: { + name: '', + includePaths: [ + "/" + ] + } + } + } +}; + +const headers = { + "Authorization": `Bearer ${token}`, // Use your actual token + "Content-Type": "application/json", + "AI-Resource-Group": "default" // Replace with your resource group +}; + +async function createPipeline() { + try { + while (true) { + const response = await axios.post( + `${AI_API_URL}/v2/lm/document-grounding/pipelines`, + jsonData, + { headers: headers } + ); + + if (response.status === 201) { + console.log('Pipeline Created:', response.data); + return response.data.pipelineId; + } + } + } catch (error) { + console.error('Error creating pipeline:', error.response ? error.response.data : error.message); + } +} + +createPipeline().then(pipelineId => { + console.log('Pipeline ID:', pipelineId); +}); + +``` +![img](img/image058.png) + +[OPTION END] + +[OPTION BEGIN [Gen AI SDK]] + +we are creating a document-grounding pipeline using SAP AI Core. The pipeline is configured to integrate with Microsoft SharePoint as a data source, enabling AI-driven document processing. This setup allows seamless ingestion of documents from a specified SharePoint site, ensuring efficient data retrieval and processing. + +```python + +json_data = { + 'type': 'MSSharePoint', + 'configuration': { + 'destination': '', + 'sharePoint': { + 'site': { + 'name': '', + "includePaths": [ + "/" + ] + }, + }, + }, +} + +while True: + pipeline = requests.post(f'{AI_API_URL}/v2/lm/document-grounding/pipelines', headers=headers, json=json_data) + if(pipeline.status_code == 201): + break + +pipeline.json()['pipelineId'] + +``` + +![img](img/image063.png) + +[OPTION END] + +### 8. Ensuring Accurate Responses with Grounding + +In the previous steps, we have completed the data preparation for grounding. Before initiating model inference or orchestration, ensure that there is an active orchestration deployment (**scenario ID: orchestration**). To verify the available orchestration deployments and their status, use the **get_deployment** API under the **"Deployments"** section in the **Bruno collection**. Additionally, update the **orchestration_service_url** in the environment. + +**NOTE:** If no deployments are found, please refer to this tutorial for guidance [tutorial] (https://developers.sap.com/tutorials/ai-core-orchestration-consumption.html). + +[OPTION BEGIN [Bruno]] + +This step uses the orchestration service to query grounded documents and retrieve content based on a specified prompt and grounding query. It integrates document grounding configurations and filters to provide precise results. + +• Expand **05_orchestration** and select **completion request** + +**Note:** Refer to the screenshots below for guidance on configuring the prompt and grounding query. + +![img](img/image051.png) + +![img](img/image052.png) + +#### Responses Without External Knowledge Base + +![img](img/image053.png) + +[OPTION END] + +[OPTION BEGIN [AI Launchpad]] + +**Templating** + +Templating enables you to define structured prompts and system messages for the generative AI model. Using placeholders like {{?groundingRequest}} and {{?groundingOutput}}, you can dynamically customize inputs for grounding-based data retrieval. These placeholders must follow naming rules and can have default values for testing. If no default value is set, the workflow prompts for input during execution. + +![img](img/image048.png) + +**Model configuration** + +Model configuration allows you to select the AI model for your workflow. If no model is selected, the default model is used. You can specify additional parameters in JSON format, such as setting the n parameter to receive multiple responses. You can see which models are available within an orchestration deployment by selecting the deployment ID. + +![img](img/image049.png) + +**Orchestration Workflow** + +After you have built your orchestration workflow, you can test it to generate output from your chosen model. + +1. Change the mode from Build to Test. + +2. Check the orchestration deployment and change it if necessary. + +3. If you have included placeholders in the template, enter the values that you want to be passed to the model. + +4. Optional: As the context, give the model additional instructions to further refine the output.You can also provide sample queries and responses here. Choose **Run**. + +![img](img/image050.png) + +[OPTION END] + +[OPTION BEGIN [SAP Cloud SDK]] + +We are configuring an AI Orchestration Pipeline using SAP AI Core. The pipeline integrates multiple AI modules to process and refine inputs efficiently. This setup enables **document grounding, LLM processing, templating, and content filtering**, ensuring accurate and safe AI-generated responses. + +The configuration defines a document grounding module that retrieves relevant context from a vector-based repository, a GPT-4o model for response generation, a templating module to structure responses, and Azure Content Safety filters to ensure compliance and content moderation. This orchestration streamlines AI-driven summarization while maintaining reliability and security. + +```javascript + +const jsonData = { + orchestration_config: { + module_configurations: { + grounding_module_config: { + type: "document_grounding_service", + config: { + filters: [ + { + id: "filter1", + data_repositories: ["23c**********************5ed6"], // Replace the value with your data repository ID + search_config: { + max_chunk_count: 10 + }, + data_repository_type: "vector" + } + ], + input_params: ["groundingRequest"], + output_param: "groundingOutput" + } + }, + llm_module_config: { + model_name: "gpt-4o", + model_params: {}, + model_version: "latest" + }, + templating_module_config: { + template: [ + { + role: "user", + content: "You are a precise and reliable assistant. Using only the provided context, generate a concise and accurate summary relevant to the request. Do not infer or generate information beyond the given context. If the requested information is not available in the context, clearly state that. Request: {{ ?groundingRequest }} Context: {{ ?groundingOutput }}" + } + ], + defaults: {} + }, + filtering_module_config: { + input: { + filters: [ + { + type: "azure_content_safety", + config: { + Hate: 2, + SelfHarm: 2, + Sexual: 2, + Violence: 2 + }}] + }, + output: { + filters: [ + { + type: "azure_content_safety", + config: { + Hate: 2, + SelfHarm: 2, + Sexual: 2, + Violence: 2 + }}]}}} + }, + input_params: { + groundingRequest: "Is there any complaint?" + } +}; + +const deploymentUrl = "https://api.ai.prodeuonly.**********************************.ondemand.com/v2/inference/deployments/db************3"; +const orchestrationUrl = `${deploymentUrl}/completion`; // Define the orchestration API URL + +async function callOrchestration() { + try { + const response = await axios.post(orchestrationUrl, jsonData, { headers: headers }); + + if (response.status === 200) { + const result = response.data; // Parse the JSON response + console.log(result); + } else { + console.error(`Error: ${response.status}, ${response.statusText}`); + } + } catch (error) { + console.error('Error:', error.response ? error.response.data : error.message); + } +} + +callOrchestration(); + +``` +![img](img/image059.png) + + +[OPTION END] + +[OPTION BEGIN [Gen AI SDK]] + +We are configuring an AI Orchestration Pipeline using SAP AI Core. The pipeline integrates multiple AI modules to process and refine inputs efficiently. This setup enables **document grounding, LLM processing, templating, and content filtering**, ensuring accurate and safe AI-generated responses. + +The configuration defines a document grounding module that retrieves relevant context from a vector-based repository, a GPT-4o model for response generation, a templating module to structure responses, and Azure Content Safety filters to ensure compliance and content moderation. This orchestration streamlines AI-driven summarization while maintaining reliability and security. + +```python + +#JSON from Docuemnt grounding API +json_data = { + "orchestration_config": { + "module_configurations": { + "grounding_module_config": { + "type": "document_grounding_service", + "config": { + "filters": [ + { + "id": "filter1", + "data_repositories": [ + "23c9*********************55ed6" // Replace the value with your data repository ID + ], + "search_config": { + "max_chunk_count": 10 + }, + "data_repository_type": "vector" + } + ], + "input_params": [ + "groundingRequest" + ], + "output_param": "groundingOutput" + } + }, + "llm_module_config": { + "model_name": "gpt-4o", + "model_params": {}, + "model_version": "latest" + }, + "templating_module_config": { + "template": [ + { + "role": "user", + "content": "You are a precise and reliable assistant. Using only the provided context, generate a concise and accurate summary relevant to the request. Do not infer or generate information beyond the given context. If the requested information is not available in the context, clearly state that. Request: {{ ?groundingRequest }} Context: {{ ?groundingOutput }}" + } + ], + "defaults": {} + }, + "filtering_module_config": { + "input": { + "filters": [ + { + "type": "azure_content_safety", + "config": { + "Hate": 2, + "SelfHarm": 2, + "Sexual": 2, + "Violence": 2 + } + } + ] + }, + "output": { + "filters": [ + { + "type": "azure_content_safety", + "config": { + "Hate": 2, + "SelfHarm": 2, + "Sexual": 2, + "Violence": 2 + } + } + ] + } + } + } + }, + "input_params": { + "groundingRequest": "Is there any complaint?" + } +} + +deploymentUrl = "https://api.ai.prodeuonly.***************************************fb3" +orchestration = requests.post(f'{deploymentUrl}/completion', headers=headers, json=json_data) #call the orchestration completion api + +# Get the response JSON +if orchestration.status_code == 200: + result = orchestration.json() # Parse JSON response + print(result) +else: + print(f"Error: {orchestration.status_code}, {orchestration.text}") + +``` + +![img](img/image064.png) + +[OPTION END] + +### Conclusion + +**Adding Grounding significantly enhances the model's ability to provide Accurate and Context-specific responses. Without Grounding, the model generates generic replies, while with grounding, it retrieves precise information from the uploaded document. Screenshots showcasing both responses are provided for comparison.** + + + + + + + diff --git a/tutorials/ai-core-orchestration-grounding/img/Bruno_config.json b/tutorials/ai-core-orchestration-grounding/img/Bruno_config.json new file mode 100644 index 0000000000..b9d53b1635 --- /dev/null +++ b/tutorials/ai-core-orchestration-grounding/img/Bruno_config.json @@ -0,0 +1,1698 @@ +{ + "name": "bruno_config", + "version": "1", + "items": [ + { + "type": "http", + "name": "get_token", + "seq": 1, + "request": { + "url": "{{ai_auth_url}}/oauth/token", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/x-www-form-urlencoded", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "formUrlEncoded", + "formUrlEncoded": [ + { + "name": "grant_type", + "value": "client_credentials", + "enabled": true + }, + { + "name": "client_id", + "value": "{{client_id}}", + "enabled": true + }, + { + "name": "client_secret", + "value": "{{client_secret}}", + "enabled": true + } + ], + "multipartForm": [] + }, + "script": { + "res": "if (res.getStatus() == 200) {\n bru.setEnvVar(\"access_token\", res.body.access_token);\n}" + }, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "none" + } + } + }, + { + "type": "http", + "name": "health", + "seq": 2, + "request": { + "url": "{{ai_api_url}}/api/v1/healthz", + "method": "GET", + "headers": [], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "folder", + "name": "01_resource_group", + "items": [ + { + "type": "http", + "name": "create", + "seq": 1, + "request": { + "url": "{{ai_api_url}}/v2/admin/resourceGroups", + "method": "POST", + "headers": [], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"resourceGroupId\": \"{{resource_group}}\",\n \"labels\": [\n {\n \"key\": \"ext.ai.sap.com/document-grounding\",\n \"value\": \"true\"\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete_by_id", + "seq": 4, + "request": { + "url": "{{ai_api_url}}/v2/admin/resourceGroups/{{resource_group}}", + "method": "DELETE", + "headers": [], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get", + "seq": 2, + "request": { + "url": "{{ai_api_url}}/v2/admin/resourceGroups", + "method": "GET", + "headers": [], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_by_id", + "seq": 3, + "request": { + "url": "{{ai_api_url}}/v2/admin/resourceGroups/{{resource_group}}", + "method": "GET", + "headers": [], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "02_deployments", + "items": [ + { + "type": "http", + "name": "create_configuration", + "seq": 3, + "request": { + "url": "{{ai_api_url}}/v2/lm/configurations", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"name\": \"orchestration-config\",\n \"executableId\": \"orchestration\",\n \"scenarioId\": \"orchestration\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "create_deployment", + "seq": 5, + "request": { + "url": "{{ai_api_url}}/v2/lm/deployments", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"ttl\": \"24H\",\n \"configurationId\": \"\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete_deployment_id", + "seq": 9, + "request": { + "url": "{{ai_api_url}}/v2/lm/deployments/", + "method": "DELETE", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "json": "{\n \"ttl\": \"24H\",\n \"configurationId\": \"\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_configuration", + "seq": 4, + "request": { + "url": "{{ai_api_url}}/v2/lm/configurations", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_deployment", + "seq": 6, + "request": { + "url": "{{ai_api_url}}/v2/lm/deployments", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "json": "{\n \"ttl\": \"24H\",\n \"configurationId\": \"\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_deployment_id", + "seq": 7, + "request": { + "url": "{{ai_api_url}}/v2/lm/deployments/", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "json": "{\n \"ttl\": \"24H\",\n \"configurationId\": \"\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_scenario", + "seq": 1, + "request": { + "url": "{{ai_api_url}}/v2/lm/scenarios", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_scenario_executable", + "seq": 2, + "request": { + "url": "{{ai_api_url}}/v2/lm/scenarios/orchestration/executables", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "stop_deployment_id", + "seq": 8, + "request": { + "url": "{{ai_api_url}}/v2/lm/deployments/", + "method": "PATCH", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"targetStatus\": \"STOPPED\"\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "04_pipeline", + "items": [ + { + "type": "http", + "name": "create_pipeline", + "seq": 1, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/pipelines", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json", + "enabled": true + }, + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"type\": \"MSSharePoint\",\n \"configuration\": {\n \"destination\": \"canary-rg1-secret\",\n \"sharePoint\": {\n \"site\": {\n \"name\": \"\",\n \"includePaths\": [\n \"Shared%20Documents/\"\n ]\n }\n }\n }\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete_pipeline_by_pipeline_id", + "seq": 5, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/pipelines/", + "method": "DELETE", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_all_pipelines", + "seq": 2, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/pipelines", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_pipeline_by_pipeline_id", + "seq": 3, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/pipelines/", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_pipeline_status_by_pipeline_id", + "seq": 4, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/pipelines//status", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "05_orchestration", + "items": [ + { + "type": "http", + "name": "completion", + "seq": 1, + "request": { + "url": "{{orchestration_service_url}}/completion", + "method": "POST", + "headers": [ + { + "name": "ai-resource-group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"orchestration_config\": {\n \"module_configurations\": {\n \"grounding_module_config\": {\n \"type\": \"document_grounding_service\",\n \"config\": {\n \"filters\": [\n {\n \"id\": \"filter1\",\n \"data_repositories\": [\n \"*\"\n ],\n \"search_config\": {\n \"max_chunk_count\": 10\n },\n \"data_repository_type\": \"vector\"\n }\n ],\n \"input_params\": [\n \"groundingRequest\"\n ],\n \"output_param\": \"groundingOutput\"\n }\n },\n \"llm_module_config\": {\n \"model_name\": \"gpt-35-turbo\",\n \"model_params\": {},\n \"model_version\": \"latest\"\n },\n \"templating_module_config\": {\n \"template\": [\n {\n \"role\": \"user\",\n \"content\": \"You are a precise and reliable assistant. Using only the provided context, generate a concise and accurate summary relevant to the request.Do not infer or generate information beyond the given context.If the requested information is not available in the context, clearly state that.Request: {{ ?groundingRequest }}Context: {{ ?groundingOutput }}\"\n }\n ],\n \"defaults\": {}\n },\n \"filtering_module_config\": {\n \"input\": {\n \"filters\": [\n {\n \"type\": \"azure_content_safety\",\n \"config\": {\n \"Hate\": 2,\n \"SelfHarm\": 2,\n \"Sexual\": 2,\n \"Violence\": 2\n }\n }\n ]\n },\n \"output\": {\n \"filters\": [\n {\n \"type\": \"azure_content_safety\",\n \"config\": {\n \"Hate\": 2,\n \"SelfHarm\": 2,\n \"Sexual\": 2,\n \"Violence\": 2\n }\n }\n ]\n }\n }\n }\n },\n \"input_params\": {\n \"groundingRequest\": \"please provide New Tools Released in Gen AI Hub?\"\n }\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "completion_help", + "seq": 2, + "request": { + "url": "{{orchestration_service_url}}/completion", + "method": "POST", + "headers": [ + { + "name": "ai-resource-group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"orchestration_config\": {\n \"module_configurations\": {\n \"grounding_module_config\": {\n \"type\": \"document_grounding_service\",\n \"config\": {\n \"filters\": [\n {\n \"id\": \"filter1\",\n \"data_repositories\": [\n \"*\"\n ],\n \"search_config\": {},\n \"data_repository_type\": \"help.sap.com\"\n }\n ],\n \"input_params\": [\n \"groundingRequest\"\n ],\n \"output_param\": \"groundingOutput\"\n }\n },\n \"llm_module_config\": {\n \"model_name\": \"gemini-1.5-pro\",\n \"model_params\": {},\n \"model_version\": \"001\"\n },\n \"templating_module_config\": {\n \"template\": [\n {\n \"role\": \"user\",\n \"content\": \"You are a helpful assistant for any queries for SAP Teched 2024.\\\\nAnswer the grounding request by providing relevant answers that fit to the request. \\\\n\\\\nRequest: {{ ?groundingRequest }}\\\\n\\\\nReports:{{ ?groundingOutput }}\"\n }\n ],\n \"defaults\": {}\n },\n \"filtering_module_config\": {\n \"input\": {\n \"filters\": [\n {\n \"type\": \"azure_content_safety\",\n \"config\": {\n \"Hate\": 2,\n \"SelfHarm\": 2,\n \"Sexual\": 2,\n \"Violence\": 2\n }\n }\n ]\n },\n \"output\": {\n \"filters\": [\n {\n \"type\": \"azure_content_safety\",\n \"config\": {\n \"Hate\": 2,\n \"SelfHarm\": 2,\n \"Sexual\": 2,\n \"Violence\": 2\n }\n }\n ]\n }\n }\n }\n },\n \"input_params\": {\n \"groundingRequest\": \"what is joule?\"\n }\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_foundation_models", + "seq": 3, + "request": { + "url": "{{ai_api_url}}/v2/lm/scenarios/foundation-models/models", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "06_vector", + "items": [ + { + "type": "http", + "name": "create_collections", + "seq": 2, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"title\": \"test-canary-collection\",\n \"embeddingConfig\": {\n \"modelName\": \"text-embedding-ada-002-v2\"\n },\n \"metadata\": [\n {\n \"key\": \"purpose\",\n \"value\": [\n \"demonstration\"\n ]\n },\n {\n \"key\": \"a-random-key\",\n \"value\": [\n \"hello world!\"\n ]\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "create_documents", + "seq": 5, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//documents", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"documents\": [\n {\n \"metadata\": [\n {\n \"key\": \"url\",\n \"value\": [\n \"http://hello.com\",\n \"123\"\n ]\n }\n ],\n \"chunks\": [\n {\n \"content\": \"Joule is the AI copilot that truly understands your business. Joule revolutionizes how you interact with your SAP business systems, making every touchpoint count and every task simpler.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"1\"\n ]\n }\n ]\n },\n {\n \"content\": \"It enables the companion of the Intelligent Enterprise, guiding you through content discovery within SAP Ecosystem, and giving a transparent role-based access to the relevant processes from everywhere. This is the one assistant experience, a unified and delightful user experience across SAP’s Ǯ solution portfolio.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"2\"\n ]\n }\n ]\n }\n ]\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete_collection_by_id", + "seq": 12, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections/", + "method": "DELETE", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete_documents_by_id", + "seq": 11, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//documents/", + "method": "DELETE", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_all_collections", + "seq": 1, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_all_documents_by_collection_id", + "seq": 6, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//documents", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_collection_by_id", + "seq": 4, + "request": { + "url": "{{ai_api_url}}/v2/lm/document-grounding/vector/collections/", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_collection_creation_status_by_id", + "seq": 3, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//creationStatus", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_collection_deletion_status_by_id", + "seq": 13, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//deletionStatus", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_documents_by_id", + "seq": 7, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//documents/", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "insert_documents", + "seq": 9, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections/COLLECTION_ID/documents", + "method": "PATCH", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"documents\": [\n {\n \"id\": \"DOCUMENT_ID\",\n \"metadata\": [\n {\n \"key\": \"url\",\n \"value\": [\"http://hello1.com\"]\n },\n {\n \"key\": \"test-insert\",\n \"value\": [\"123\"]\n }\n ],\n \"chunks\": [\n {\n \"content\": \"Joule is not the AI copilot that truly understands your business. Joule revolutionizes how you interact with your SAP business systems, making every touchpoint count and every task simpler.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"1\"\n ]\n }\n ]\n },\n {\n \"content\": \"It enables the companion of the Intelligent Enterprise, guiding you through content discovery within SAP Ecosystem, and giving a transparent role-based access to the relevant processes from everywhere. This is the one assistant experience, a unified and delightful user experience across SAP’s Ǯ solution portfolio.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"2\"\n ]\n }\n ]\n }\n ]\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "search", + "seq": 10, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/search", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"query\": \"is Joule an AI Copilot?\",\n \"filters\": [\n {\n \"id\": \"string\",\n \"collectionIds\": [\n \"\"\n ],\n \"configuration\": {},\n \"collectionMetadata\": [],\n \"documentMetadata\": [\n {\n \"key\": \"url\",\n \"value\": [\n \"http://hello1.com\"\n ],\n \"selectMode\": [\"ignoreIfKeyAbsent\"]\n }\n ],\n \"chunkMetadata\": []\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "update_documents", + "seq": 8, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/vector/collections//documents", + "method": "PATCH", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"documents\": [\n {\n \"id\": \"\",\n \"metadata\": [\n {\n \"key\": \"url\",\n \"value\": [\"http://hello1.com\"]\n }\n ],\n \"chunks\": [\n {\n \"content\": \"Joule is not the AI copilot that truly understands your business. Joule revolutionizes how you interact with your SAP business systems, making every touchpoint count and every task simpler.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"1\"\n ]\n }\n ]\n },\n {\n \"content\": \"It enables the companion of the Intelligent Enterprise, guiding you through content discovery within SAP Ecosystem, and giving a transparent role-based access to the relevant processes from everywhere. This is the one assistant experience, a unified and delightful user experience across SAP’s Ǯ solution portfolio.\",\n \"metadata\": [\n {\n \"key\": \"index\",\n \"value\": [\n \"2\"\n ]\n }\n ]\n }\n ]\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "03_generic_secret", + "items": [ + { + "type": "http", + "name": "create", + "seq": 2, + "request": { + "url": "{{ai_api_url}}/v2/admin/secrets", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"name\": \"canary-rg1-secret\",\n \"data\": {\n \"type\": \"SFRUUA==\",\n \"description\": \"<>DESCRIPTION\",\n \"clientId\": \"<>CLIENT_ID\",\n \"authentication\": \"\",\n \"tokenServiceURL\": \"\",\n \"password\": \"\",\n \"proxyType\": \"\",\n \"url\": \"\",\n \"tokenServiceURLType\": \"\",\n \"user\": \"\",\n \"clientSecret\": \"\",\n \"scope\": \"\"\n },\n \"labels\": [\n {\n \"key\": \"ext.ai.sap.com/document-grounding\",\n \"value\": \"true\"\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "delete", + "seq": 3, + "request": { + "url": "{{ai_api_url}}/v2/admin/secrets/canary-rg1-secret", + "method": "DELETE", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "get_all", + "seq": 1, + "request": { + "url": "{{ai_api_url}}/v2/admin/secrets", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "update", + "seq": 4, + "request": { + "url": "{{ai_api_url}}/v2/admin/secrets/canary-rg-secret", + "method": "PATCH", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"data\": {\n \"clientId\": \"\"\n }\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "07_retrieval", + "items": [ + { + "type": "http", + "name": "dataRepositories by id", + "seq": 2, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/retrieval/dataRepositories/", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "dataRepositories", + "seq": 1, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/retrieval/dataRepositories", + "method": "GET", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "none", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "retrieval_pipeline", + "seq": 3, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/retrieval/search", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + }, + { + "name": "Content-Type", + "value": "application/json", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"query\": \"what is AI106 about and who are the presenters?\",\n \"filters\": [\n {\n \"id\": \"string\",\n \"searchConfiguration\": {},\n \"dataRepositories\": [\n \"\"\n ],\n \"dataRepositoryType\": \"vector\",\n \"dataRepositoryMetadata\": [],\n \"documentMetadata\": [],\n \"chunkMetadata\": []\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + }, + { + "type": "http", + "name": "retrieval_vector", + "seq": 4, + "request": { + "url": "{{ai_api_url}}{{common_endpoint}}/retrieval/search", + "method": "POST", + "headers": [ + { + "name": "AI-Resource-Group", + "value": "{{resource_group}}", + "enabled": true + }, + { + "name": "Content-Type", + "value": "application/json", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{\n \"query\": \"is joule an ai copilot?\",\n \"filters\": [\n {\n \"id\": \"string\",\n \"searchConfiguration\": {\n \"maxChunkCount\": 1\n },\n \"dataRepositories\": [\n \"\"\n ],\n \"dataRepositoryType\": \"vector\",\n \"dataRepositoryMetadata\": [],\n \"documentMetadata\": [],\n \"chunkMetadata\": []\n }\n ]\n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + }, + { + "type": "folder", + "name": "08_consume_model", + "items": [ + { + "type": "http", + "name": "direct_model_usage", + "seq": 2, + "request": { + "url": "{{orchestration_service_url}}/completion", + "method": "POST", + "headers": [ + { + "name": "ai-resource-group", + "value": "{{resource_group}}", + "enabled": true + }, + { + "name": "Content-Type", + "value": "application/json", + "enabled": true + } + ], + "params": [], + "body": { + "mode": "json", + "json": "{ \n \"orchestration_config\": { \n \"module_configurations\": { \n \"templating_module_config\": { \n \"template\": [ \n { \n \"role\": \"system\", \n \"content\": \"You are an AI assistant designed to screen resumes for HR purposes. Please assess the candidate qualifications based on the provided resume.\" \n }, \n { \n \"role\": \"user\", \n \"content\": \"Candidate Resume:\\n{{candidate_resume}}\" \n } \n ] \n }, \n \"llm_module_config\": { \n \"model_name\": \"gpt-35-turbo-16k\", \n \"model_params\": { \n \"max_tokens\": 300, \n \"temperature\": 0.1, \n \"frequency_penalty\": 0, \n \"presence_penalty\": 0 \n } \n }, \n \"masking_module_config\": { \n \"masking_providers\": [ \n { \n \"type\": \"sap_data_privacy_integration\", \n \"method\": \"anonymization\", \n \"entities\": [ \n { \n \"type\": \"profile-email\" \n }, \n { \n \"type\": \"profile-person\" \n }, \n { \n \"type\": \"profile-phone\" \n }, \n { \n \"type\": \"profile-org\" \n }, \n { \n \"type\": \"profile-location\" \n } \n ] \n } \n ] \n }, \n \"filtering_module_config\": { \n \"input\": { \n \"filters\": [ \n { \n \"type\": \"azure_content_safety\", \n \"config\": { \n \"Hate\": 2, \n \"SelfHarm\": 2, \n \"Sexual\": 2, \n \"Violence\": 2 \n } \n } \n ] \n }, \n \"output\": { \n \"filters\": [ \n { \n \"type\": \"azure_content_safety\", \n \"config\": { \n \"Hate\": 2, \n \"SelfHarm\": 2, \n \"Sexual\": 2, \n \"Violence\": 2 \n } \n } \n ] \n } \n } \n } \n }, \n \"defaults\": { \n \"candidate_resume\": \"John Doe\\n1234 Data St, San Francisco, CA 94101\\n(123) 456-7890\\njohndoe@email.com\\nLinkedIn Profile\\nGitHub Profile\\n\\nObjective\\nDetail-oriented Data Scientist with 3+ years of experience in data analysis, statistical modeling, and machine learning. Seeking to leverage expertise in predictive modeling and data visualization to help drive data-informed decision-making at [Company Name].\\n\\nEducation\\nMaster of Science in Data Science\\nUniversity of California, Berkeley\\nGraduated: May 2021\\n\\nBachelor of Science in Computer Science\\nUniversity of California, Los Angeles\\nGraduated: May 2019\\n\\nTechnical Skills\\n\\nProgramming Languages: Python, R, SQL, Java\\nData Analysis & Visualization: Pandas, NumPy, Matplotlib, Seaborn, Tableau\\nMachine Learning: Scikit-learn, TensorFlow, Keras, XGBoost\\nBig Data Technologies: Hadoop, Spark\\nDatabases: MySQL, PostgreSQL\\nVersion Control: Git\\n\\nProfessional Experience\\n\\nData Scientist\\nDataCorp Inc., San Francisco, CA\\nJune 2021 – Present\\n\\nDeveloped predictive models to optimize marketing campaigns, which increased ROI by 20%.\\nConducted in-depth data analysis using Python and SQL to identify trends and patterns in large datasets.\\nCollaborated with cross-functional teams to implement data-driven strategies that improved customer satisfaction scores by 15%.\\n Created interactive dashboards using Tableau to visualize KPIs for stakeholders.\\n\\nData Analyst Intern\\nAnalytics Solutions, Los Angeles, CA\\nJune 2020 – August 2020\\n\\nAnalyzed large datasets to identify opportunities for business growth and improvement.\\nAssisted in the development of automated reporting tools using Python and Excel.\\nWorked with data visualization tools to create insightful reports for management.\\n\\nProjects\\n\\nCustomer Segmentation Analysis\\nConducted K-means clustering on customer data to segment the customer base into distinct groups, enabling targeted marketing strategies.\\n\\nPredictive Stock Price Modeling\\nBuilt a predictive model using time series analysis to forecast stock prices, achieving an accuracy rate of 85%.\\n\\nSentiment Analysis on Social Media\\nImplemented natural language processing techniques to analyze sentiment from tweets, providing insights into public opinion on various topics.\\n\\nCertifications\\n\\nCertified Data Scientist (CDS) – Data Science Council of America\\nMachine Learning Specialization – Coursera by Stanford University\\n\\nProfessional Affiliations\\n\\nMember, Association for Computing Machinery (ACM)\\nMember, Data Science Society\\n\\nReferences\\nAvailable upon request.\\n\\nPersonal Interests\\n- I absolutely love exploring new technologies and working on innovative projects.\\n- I enjoy reading books, especially on artificial intelligence and machine learning.\\n- I hate people who are dishonest and unreliable.\" \n } \n}", + "formUrlEncoded": [], + "multipartForm": [] + }, + "script": {}, + "vars": {}, + "assertions": [], + "tests": "", + "docs": "", + "auth": { + "mode": "bearer", + "bearer": { + "token": "{{access_token}}" + } + } + } + } + ] + } + ], + "activeEnvironmentUid": "xzgrLWFRoL3RVdKrGm4SH", + "environments": [ + { + "variables": [ + { + "name": "ai_auth_url", + "value": "https://*************************.ondemand.com", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "ai_api_url", + "value": "https://*******************.hana.ondemand.com", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "client_id", + "value": "", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "client_secret", + "value": "", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "resource_group", + "value": "default", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "common_endpoint", + "value": "/v2/lm/document-grounding", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "orchestration_service_url", + "value": "https://***************.hana.ondemand.com/v2/inference/deployments/", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "access_token", + "value": "", + "enabled": true, + "secret": true, + "type": "text" + } + ], + "name": "eu11-canary1" + }, + { + "variables": [ + { + "name": "ai_auth_url", + "value": "https://*************.hana.ondemand.com", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "ai_api_url", + "value": "https://*******************.hana.ondemand.com", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "client_id", + "value": "", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "client_secret", + "value": "", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "resource_group", + "value": "default", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "common_endpoint", + "value": "/v2/lm/document-grounding", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "orchestration_service_url", + "value": "https://****************.hana.ondemand.com/v2/inference/deployments/", + "enabled": true, + "secret": false, + "type": "text" + }, + { + "name": "access_token", + "value": "", + "enabled": true, + "secret": true, + "type": "text" + } + ], + "name": "Grounding-test" + } + ], + "brunoConfig": { + "version": "1", + "name": "bruno_config", + "type": "collection", + "ignore": [ + "node_modules", + ".git" + ] + } +} \ No newline at end of file diff --git a/tutorials/ai-core-orchestration-grounding/img/image001.png b/tutorials/ai-core-orchestration-grounding/img/image001.png new file mode 100644 index 0000000000..85e1028228 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image001.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image002.png b/tutorials/ai-core-orchestration-grounding/img/image002.png new file mode 100644 index 0000000000..ad23de5e77 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image002.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image003.png b/tutorials/ai-core-orchestration-grounding/img/image003.png new file mode 100644 index 0000000000..33fdae4632 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image003.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image004.png b/tutorials/ai-core-orchestration-grounding/img/image004.png new file mode 100644 index 0000000000..b194f09222 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image004.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image005.png b/tutorials/ai-core-orchestration-grounding/img/image005.png new file mode 100644 index 0000000000..9e6b51ff37 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image005.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image006.png b/tutorials/ai-core-orchestration-grounding/img/image006.png new file mode 100644 index 0000000000..91d3c2f5b6 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image006.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image007.png b/tutorials/ai-core-orchestration-grounding/img/image007.png new file mode 100644 index 0000000000..d46ae27ba6 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image007.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image008.png b/tutorials/ai-core-orchestration-grounding/img/image008.png new file mode 100644 index 0000000000..4fc0a116f0 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image008.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image009.png b/tutorials/ai-core-orchestration-grounding/img/image009.png new file mode 100644 index 0000000000..10337babc3 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image009.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image010.png b/tutorials/ai-core-orchestration-grounding/img/image010.png new file mode 100644 index 0000000000..7a56bb9918 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image010.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image011.png b/tutorials/ai-core-orchestration-grounding/img/image011.png new file mode 100644 index 0000000000..ece9f2b710 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image011.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image012.png b/tutorials/ai-core-orchestration-grounding/img/image012.png new file mode 100644 index 0000000000..3ed3f71789 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image012.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image013.png b/tutorials/ai-core-orchestration-grounding/img/image013.png new file mode 100644 index 0000000000..b826d3bd1c Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image013.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image014.png b/tutorials/ai-core-orchestration-grounding/img/image014.png new file mode 100644 index 0000000000..53032e6cdd Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image014.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image015.png b/tutorials/ai-core-orchestration-grounding/img/image015.png new file mode 100644 index 0000000000..1629a0a8c5 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image015.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image016.png b/tutorials/ai-core-orchestration-grounding/img/image016.png new file mode 100644 index 0000000000..503a671789 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image016.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image017.png b/tutorials/ai-core-orchestration-grounding/img/image017.png new file mode 100644 index 0000000000..e9bdd425f7 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image017.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image018.png b/tutorials/ai-core-orchestration-grounding/img/image018.png new file mode 100644 index 0000000000..160be85834 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image018.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image019.png b/tutorials/ai-core-orchestration-grounding/img/image019.png new file mode 100644 index 0000000000..2f883e9f77 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image019.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image020.png b/tutorials/ai-core-orchestration-grounding/img/image020.png new file mode 100644 index 0000000000..ac43cc04a6 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image020.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image021.png b/tutorials/ai-core-orchestration-grounding/img/image021.png new file mode 100644 index 0000000000..6d59ab25d7 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image021.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image022.png b/tutorials/ai-core-orchestration-grounding/img/image022.png new file mode 100644 index 0000000000..2610b8e73b Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image022.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image023.png b/tutorials/ai-core-orchestration-grounding/img/image023.png new file mode 100644 index 0000000000..1460eff6ff Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image023.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image024.png b/tutorials/ai-core-orchestration-grounding/img/image024.png new file mode 100644 index 0000000000..f6a20c9971 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image024.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image025.png b/tutorials/ai-core-orchestration-grounding/img/image025.png new file mode 100644 index 0000000000..2e636dd7b5 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image025.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image026.png b/tutorials/ai-core-orchestration-grounding/img/image026.png new file mode 100644 index 0000000000..be88ad8f7f Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image026.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image027.png b/tutorials/ai-core-orchestration-grounding/img/image027.png new file mode 100644 index 0000000000..1decd05a73 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image027.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image028.png b/tutorials/ai-core-orchestration-grounding/img/image028.png new file mode 100644 index 0000000000..3ee2fcc3c5 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image028.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image029.png b/tutorials/ai-core-orchestration-grounding/img/image029.png new file mode 100644 index 0000000000..56e7e22458 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image029.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image030.png b/tutorials/ai-core-orchestration-grounding/img/image030.png new file mode 100644 index 0000000000..2b68e2349d Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image030.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image031.png b/tutorials/ai-core-orchestration-grounding/img/image031.png new file mode 100644 index 0000000000..5ba92f918b Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image031.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image032.png b/tutorials/ai-core-orchestration-grounding/img/image032.png new file mode 100644 index 0000000000..8e0a3ef5ec Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image032.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image033.png b/tutorials/ai-core-orchestration-grounding/img/image033.png new file mode 100644 index 0000000000..18303f0905 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image033.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image034.png b/tutorials/ai-core-orchestration-grounding/img/image034.png new file mode 100644 index 0000000000..5596c464b8 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image034.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image035.png b/tutorials/ai-core-orchestration-grounding/img/image035.png new file mode 100644 index 0000000000..422e543522 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image035.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image036.png b/tutorials/ai-core-orchestration-grounding/img/image036.png new file mode 100644 index 0000000000..e23ea6be93 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image036.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image037.png b/tutorials/ai-core-orchestration-grounding/img/image037.png new file mode 100644 index 0000000000..cac17b8dc2 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image037.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image038.png b/tutorials/ai-core-orchestration-grounding/img/image038.png new file mode 100644 index 0000000000..d44ee6bf12 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image038.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image039.png b/tutorials/ai-core-orchestration-grounding/img/image039.png new file mode 100644 index 0000000000..eb70743d8a Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image039.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image040.png b/tutorials/ai-core-orchestration-grounding/img/image040.png new file mode 100644 index 0000000000..9d8c0e4072 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image040.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image041.png b/tutorials/ai-core-orchestration-grounding/img/image041.png new file mode 100644 index 0000000000..b605b38bba Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image041.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image042.png b/tutorials/ai-core-orchestration-grounding/img/image042.png new file mode 100644 index 0000000000..850063c3e4 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image042.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image043.png b/tutorials/ai-core-orchestration-grounding/img/image043.png new file mode 100644 index 0000000000..370224328a Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image043.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image044.png b/tutorials/ai-core-orchestration-grounding/img/image044.png new file mode 100644 index 0000000000..8157429b19 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image044.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image045.png b/tutorials/ai-core-orchestration-grounding/img/image045.png new file mode 100644 index 0000000000..74a213a3e9 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image045.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image046.png b/tutorials/ai-core-orchestration-grounding/img/image046.png new file mode 100644 index 0000000000..899b09c81a Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image046.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image047.png b/tutorials/ai-core-orchestration-grounding/img/image047.png new file mode 100644 index 0000000000..4b46971da1 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image047.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image048.png b/tutorials/ai-core-orchestration-grounding/img/image048.png new file mode 100644 index 0000000000..0895a49f1b Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image048.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image049.png b/tutorials/ai-core-orchestration-grounding/img/image049.png new file mode 100644 index 0000000000..256e1dfabd Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image049.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image050.png b/tutorials/ai-core-orchestration-grounding/img/image050.png new file mode 100644 index 0000000000..d76c4522bb Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image050.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image051.png b/tutorials/ai-core-orchestration-grounding/img/image051.png new file mode 100644 index 0000000000..7f15b44945 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image051.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image052.png b/tutorials/ai-core-orchestration-grounding/img/image052.png new file mode 100644 index 0000000000..d770fd35a7 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image052.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image053.png b/tutorials/ai-core-orchestration-grounding/img/image053.png new file mode 100644 index 0000000000..67b3c1a60d Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image053.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image054.png b/tutorials/ai-core-orchestration-grounding/img/image054.png new file mode 100644 index 0000000000..14b06ea603 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image054.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image055.png b/tutorials/ai-core-orchestration-grounding/img/image055.png new file mode 100644 index 0000000000..e605d5343f Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image055.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image056.png b/tutorials/ai-core-orchestration-grounding/img/image056.png new file mode 100644 index 0000000000..7fc0af1dcb Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image056.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image057.png b/tutorials/ai-core-orchestration-grounding/img/image057.png new file mode 100644 index 0000000000..92a5f92943 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image057.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image058.png b/tutorials/ai-core-orchestration-grounding/img/image058.png new file mode 100644 index 0000000000..04b8e00a62 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image058.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image059.png b/tutorials/ai-core-orchestration-grounding/img/image059.png new file mode 100644 index 0000000000..c8b0dccd59 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image059.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image060.png b/tutorials/ai-core-orchestration-grounding/img/image060.png new file mode 100644 index 0000000000..9e20d031bd Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image060.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image061.png b/tutorials/ai-core-orchestration-grounding/img/image061.png new file mode 100644 index 0000000000..b17c15cf62 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image061.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image062.png b/tutorials/ai-core-orchestration-grounding/img/image062.png new file mode 100644 index 0000000000..0e51145e42 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image062.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image063.png b/tutorials/ai-core-orchestration-grounding/img/image063.png new file mode 100644 index 0000000000..9848a004ee Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image063.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/image064.png b/tutorials/ai-core-orchestration-grounding/img/image064.png new file mode 100644 index 0000000000..517d708675 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/image064.png differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_1.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_1.docx new file mode 100644 index 0000000000..428d530080 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_1.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_10.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_10.docx new file mode 100644 index 0000000000..3a315b9eb8 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_10.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_11.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_11.docx new file mode 100644 index 0000000000..f5bcc56a07 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_11.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_12.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_12.docx new file mode 100644 index 0000000000..97165e4c49 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_12.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_13.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_13.docx new file mode 100644 index 0000000000..bb8a5b174a Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_13.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_14.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_14.docx new file mode 100644 index 0000000000..5f74009e1f Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_14.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_15.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_15.docx new file mode 100644 index 0000000000..876c86373a Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_15.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_16.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_16.docx new file mode 100644 index 0000000000..3af2284e33 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_16.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_17.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_17.docx new file mode 100644 index 0000000000..5685b7c3c8 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_17.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_18.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_18.docx new file mode 100644 index 0000000000..2958832033 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_18.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_19.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_19.docx new file mode 100644 index 0000000000..aa8c5842b1 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_19.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_2.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_2.docx new file mode 100644 index 0000000000..be9753f155 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_2.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_20.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_20.docx new file mode 100644 index 0000000000..5f786e63ac Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_20.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_21.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_21.docx new file mode 100644 index 0000000000..32dc0b0692 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_21.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_22.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_22.docx new file mode 100644 index 0000000000..00a55b1739 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_22.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_23.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_23.docx new file mode 100644 index 0000000000..292d2b1236 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_23.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_24.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_24.docx new file mode 100644 index 0000000000..45d54c5b58 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_24.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_25.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_25.docx new file mode 100644 index 0000000000..fb6b3f25f7 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_25.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_26.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_26.docx new file mode 100644 index 0000000000..0c3757e2fd Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_26.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_27.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_27.docx new file mode 100644 index 0000000000..5521be32fd Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_27.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_28.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_28.docx new file mode 100644 index 0000000000..d2f483b33f Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_28.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_29.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_29.docx new file mode 100644 index 0000000000..6e9854dd9e Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_29.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_3.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_3.docx new file mode 100644 index 0000000000..2b9acdd5dd Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_3.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_30.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_30.docx new file mode 100644 index 0000000000..54c9cf5eac Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_30.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_31.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_31.docx new file mode 100644 index 0000000000..08698727e7 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_31.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_4.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_4.docx new file mode 100644 index 0000000000..d46239cae6 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_4.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_5.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_5.docx new file mode 100644 index 0000000000..6fccb028d8 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_5.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_6.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_6.docx new file mode 100644 index 0000000000..fcae916ae3 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_6.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_7.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_7.docx new file mode 100644 index 0000000000..a2b08661b0 Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_7.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_8.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_8.docx new file mode 100644 index 0000000000..40ef9ef66a Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_8.docx differ diff --git a/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_9.docx b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_9.docx new file mode 100644 index 0000000000..f48742aeaa Binary files /dev/null and b/tutorials/ai-core-orchestration-grounding/img/sample_emails/email_9.docx differ