Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand Down Expand Up @@ -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',
Expand Down Expand Up @@ -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',
],
},
],
})
]
};

```
Expand Down Expand Up @@ -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).');
Expand Down Expand Up @@ -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]
}
};

Expand All @@ -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: '<RESOURCE GROUP>',
Expand Down Expand Up @@ -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) {
Expand All @@ -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();
Expand All @@ -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'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand All @@ -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',
Expand Down Expand Up @@ -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
Expand All @@ -904,22 +904,24 @@ 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 }
);

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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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: '<generic secret name>',
Expand Down Expand Up @@ -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: [
{
Expand All @@ -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'
})
]
}
Expand All @@ -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?'
}
Expand Down