From 6c94cbb46f9ed50d184d79fdd000ac2ba82caf8d Mon Sep 17 00:00:00 2001 From: InjunPark-sap Date: Fri, 26 Jun 2026 12:42:42 +0200 Subject: [PATCH] fix(js-sdk): update JS SDK code samples to current @sap-ai-sdk API --- .../ai-core-orchestration-consumption-opt.md | 103 ++++++++++-------- .../ai-core-orchestration-consumption.md | 28 ++--- .../ai-core-orchestration-grounding.md | 42 +++---- 3 files changed, 95 insertions(+), 78 deletions(-) diff --git a/tutorials/ai-core-orchestration-consumption-opt/ai-core-orchestration-consumption-opt.md b/tutorials/ai-core-orchestration-consumption-opt/ai-core-orchestration-consumption-opt.md index f5d6f5e98..816bb4b90 100644 --- a/tutorials/ai-core-orchestration-consumption-opt/ai-core-orchestration-consumption-opt.md +++ b/tutorials/ai-core-orchestration-consumption-opt/ai-core-orchestration-consumption-opt.md @@ -120,7 +120,7 @@ For more information, refer to the official [documentation](https://sap.github.i ```javascript -import { readFile } from 'fs/promises'; +import { readFile } from 'node:fs/promises'; const cvContent = await readFile('path/to/support-request.txt', 'utf-8'); @@ -255,9 +255,9 @@ models = [ ```javascript -import type { TemplatingModuleConfig } from '@sap-ai-sdk/orchestration'; +import type { PromptTemplate } from '@sap-ai-sdk/orchestration'; -const templating: TemplatingModuleConfig = { +const templating: PromptTemplate = { template: [ { role: 'system', @@ -384,23 +384,22 @@ For this tutorial, we use anonymization: ```javascript -import type { MaskingModuleConfig } from '@sap-ai-sdk/orchestration'; +import { buildDpiMaskingProvider } from '@sap-ai-sdk/orchestration'; // Define the data masking configuration -const masking: MaskingModuleConfig = { - masking_providers: [ - { - type: 'sap_data_privacy_integration', +const masking = { + masking_providers: [ + buildDpiMaskingProvider({ method: 'anonymization', entities: [ - { type: 'profile-email' }, - { type: 'profile-person' }, - { type: 'profile-phone' }, - { type: 'profile-org' }, - { type: 'profile-location' }, + 'profile-email', + 'profile-person', + 'profile-phone', + 'profile-org', + 'profile-location', ], - }, - ], + }) + ] }; ``` @@ -513,20 +512,20 @@ Use the buildTranslationConfig helper to configure translation. import { buildTranslationConfig } from "@sap-ai-sdk/orchestration"; // Build input translation config: German -> English -const inputTranslationConfig = buildTranslationConfig({ +const inputTranslationConfig = buildTranslationConfig('input', { sourceLanguage: 'de-DE', targetLanguage: 'en-US', }); // Build output translation config: English -> German -const outputTranslationConfig = buildTranslationConfig({ +const outputTranslationConfig = buildTranslationConfig('output', { sourceLanguage: 'en-US', targetLanguage: 'de-DE', }); const translationModuleConfig = { - inputTranslation: inputTranslationConfig, - outputTranslation: outputTranslationConfig, + input: inputTranslationConfig, + output: outputTranslationConfig, }; console.log('✅ Translation configuration defined successfully (with buildTranslationConfig).'); @@ -722,26 +721,34 @@ for model in models: ```javascript -import { buildAzureContentSafetyFilter, buildLlamaGuardFilter, OrchestrationClient } from "https://esm.sh/@sap-ai-sdk/orchestration@latest"; +import { buildAzureContentSafetyFilter, buildLlamaGuard38BFilter, OrchestrationClient } from '@sap-ai-sdk/orchestration'; // Define Azure content filtering rules -const azureFilter = buildAzureContentSafetyFilter({ - Hate: 'ALLOW_SAFE_LOW', - Violence: 'ALLOW_SAFE_LOW_MEDIUM', - SelfHarm: 'ALLOW_SAFE', - Sexual: 'ALLOW_ALL' +const azureInputFilter = buildAzureContentSafetyFilter('input', { + hate: 'ALLOW_SAFE_LOW', + violence: 'ALLOW_SAFE_LOW_MEDIUM', + self_harm: 'ALLOW_SAFE', + sexual: 'ALLOW_ALL' +}); + +const azureOutputFilter = buildAzureContentSafetyFilter('output', { + hate: 'ALLOW_SAFE_LOW', + violence: 'ALLOW_SAFE_LOW_MEDIUM', + self_harm: 'ALLOW_SAFE', + sexual: 'ALLOW_ALL' }); // Define Llama Guard filtering rules -const llamaGuardFilter = buildLlamaGuardFilter('hate', 'violent_crimes'); +const llamaGuardInputFilter = buildLlamaGuard38BFilter('input', ['hate', 'violent_crimes']); +const llamaGuardOutputFilter = buildLlamaGuard38BFilter('output', ['hate', 'violent_crimes']); // Configure filtering with both filters applied const filteringModuleConfig = { input: { - filters: [azureFilter, llamaGuardFilter] // Multiple filters applied for input + filters: [azureInputFilter, llamaGuardInputFilter] }, output: { - filters: [azureFilter, llamaGuardFilter] // Multiple filters applied for output + filters: [azureOutputFilter, llamaGuardOutputFilter] } }; @@ -755,17 +762,21 @@ const filteringModuleConfig = { // Function to create configuration for each model const createModelConfig = (modelName) => ({ - llm: { - model_name: modelName, - model_params: { - max_tokens: 1000, - temperature: 0.6, - }, - }, - ...templateConfig, - ...dataMaskingConfig, - filtering_module_config: filteringModuleConfig, - ...translationModuleConfig + promptTemplating: { + prompt: { + template: templating.template, + }, + model: { + name: modelName, + params: { + max_tokens: 1000, + temperature: 0.6, + }, + }, + }, + masking: masking, + filtering: filteringModuleConfig, + translation: translationModuleConfig, }); const deploymentConfig = { resourceGroup: '', @@ -952,7 +963,7 @@ with open("model_responses.txt", "w") as file: ```javascript import { OrchestrationClient } from '@sap-ai-sdk/orchestration'; -import { writeFileStrSync } from "https://deno.land/std@0.52.0/fs/mod.ts"; +import { writeFile } from 'node:fs/promises'; // Function to generate responses from multiple models async function generateResponsesForModels(support_request) { @@ -962,14 +973,14 @@ async function generateResponsesForModels(support_request) { const modelConfig = createModelConfig(modelName); - const orchestrationClient = new OrchestrationClient({ - ...deploymentConfig, - ...modelConfig, - }); + const orchestrationClient = new OrchestrationClient( + modelConfig, + deploymentConfig + ); try { const response = await orchestrationClient.chatCompletion({ - inputParams: { input_text: support_request }, + placeholderValues: { input_text: support_request }, }); const content = response.getContent(); @@ -984,7 +995,7 @@ async function generateResponsesForModels(support_request) { } } - await writeFileStrSync( + await writeFile( 'model_responses_js.txt', responses.map(res => `Response from model ${res.model}:\n${res.response}\n${'-'.repeat(80)}\n`).join(''), 'utf-8' 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 95df4b867..3f17895f7 100644 --- a/tutorials/ai-core-orchestration-consumption/ai-core-orchestration-consumption.md +++ b/tutorials/ai-core-orchestration-consumption/ai-core-orchestration-consumption.md @@ -838,7 +838,7 @@ In this step, we will consume the orchestration service using the [`@sap-ai-sdk/ ```javascript -import { readFile } from 'fs/promises'; +import { readFile } from 'node:fs/promises'; const cvContent = await readFile('path/to/cv.txt', 'utf-8'); @@ -851,10 +851,10 @@ The next step involves creating a template that specifies how the AI should hand • `user`: Represents the user's input to be processed. ```javascript -import type { TemplatingModuleConfig } from '@sap-ai-sdk/orchestration'; +import type { PromptTemplate } from '@sap-ai-sdk/orchestration'; // Define the system and user messages -const templatingConfig: TemplatingModuleConfig = { +const promptTemplate: PromptTemplate = { template: [ { role: 'system', @@ -894,7 +894,7 @@ Query Execution: Uses `OrchestrationClient` to generate responses for each query ```javascript -import { writeFile } from 'fs/promises'; +import { writeFile } from 'node:fs/promises'; import { OrchestrationClient } from '@sap-ai-sdk/orchestration'; // Generate responses from multiple models using OrchestrationClient @@ -904,14 +904,16 @@ async function generateResponsesForModels(cvContent: string) { models.map(async (model) => { const orchestrationClient = new OrchestrationClient( { - llm: { - model_name: model, - model_params: { - max_tokens: 1000, - temperature: 0.6, - }, - }, - templating: templatingConfig + promptTemplating: { + prompt: promptTemplate, + model: { + name: model, + params: { + max_tokens: 1000, + temperature: 0.6, + }, + }, + } }, { resourceGroup: RESOURCE_GROUP } ); @@ -919,7 +921,7 @@ async function generateResponsesForModels(cvContent: string) { try { // Run orchestration with the provided input (candidate resume content) const response = await orchestrationClient.chatCompletion({ - inputParams: { candidate_resume: cvContent }, + placeholderValues: { candidate_resume: cvContent }, }); // Extract the response content and return it diff --git a/tutorials/ai-core-orchestration-grounding/ai-core-orchestration-grounding.md b/tutorials/ai-core-orchestration-grounding/ai-core-orchestration-grounding.md index a6367ef1a..10718a341 100644 --- a/tutorials/ai-core-orchestration-grounding/ai-core-orchestration-grounding.md +++ b/tutorials/ai-core-orchestration-grounding/ai-core-orchestration-grounding.md @@ -482,7 +482,7 @@ Generic secrets securely store SharePoint credentials required for document acce ```javascript -import { SecretApi } from from '@sap-ai-sdk/ai-api'; +import { SecretApi } from '@sap-ai-sdk/ai-api'; // Create Secret using SecretApi async function createGenericSecret() { @@ -823,7 +823,7 @@ We are creating a document-grounding pipeline using SAP AI Core. The pipeline is ```javascript // Request body for pipeline creation request -const pipelineRequest: PipelinePostRequst = { +const pipelineRequest = { type: 'MSSharePoint', configuration: { destination: '', @@ -936,13 +936,17 @@ The configuration defines a document grounding module that retrieves relevant co ```javascript // Create an orchestration module config for the model gpt-4o with grounding and filtering -const orchestrationModuleConfig: OrchestrationModuleConfig = { - llm: { - model_name: 'gpt-4o' +const orchestrationModuleConfig = { + promptTemplating: { + model: { + name: 'gpt-4o' + } }, grounding: buildDocumentGroundingConfig({ - input_params: ['groundingRequest'], - output_param: 'groundingOutput', + placeholders: { + input: ['groundingRequest'], + output: 'groundingOutput', + }, // Create a database filter used for the grounding configuration filters: [ { @@ -955,25 +959,25 @@ const orchestrationModuleConfig: OrchestrationModuleConfig = { } ] }), - // Create input and ouput content filters + // Create input and output content filters filtering: { input: { filters: [ - buildAzureContentSafetyFilter({ - Hate: 'ALLOW_SAFE_LOW', - SelfHarm: 'ALLOW_SAFE_LOW', - Sexual: 'ALLOW_SAFE_LOW', - Violence: 'ALLOW_SAFE_LOW' + buildAzureContentSafetyFilter('input', { + hate: 'ALLOW_SAFE_LOW', + self_harm: 'ALLOW_SAFE_LOW', + sexual: 'ALLOW_SAFE_LOW', + violence: 'ALLOW_SAFE_LOW' }) ] }, output: { filters: [ - buildAzureContentSafetyFilter({ - Hate: 'ALLOW_SAFE_LOW', - SelfHarm: 'ALLOW_SAFE_LOW', - Sexual: 'ALLOW_SAFE_LOW', - Violence: 'ALLOW_SAFE_LOW' + buildAzureContentSafetyFilter('output', { + hate: 'ALLOW_SAFE_LOW', + self_harm: 'ALLOW_SAFE_LOW', + sexual: 'ALLOW_SAFE_LOW', + violence: 'ALLOW_SAFE_LOW' }) ] } @@ -992,7 +996,7 @@ const groundingResult = await new OrchestrationClient( 'UserQuestion: {{?groundingRequest}} Context: {{?groundingOutput}}' } ], - inputParams: { + placeholderValues: { // Create a grounding prompt which will combine the provided user message with the grounding output groundingRequest: 'Is there any complaint?' }