From 5bf34b51660fa628fc0646b1a165d2c07b6f04f2 Mon Sep 17 00:00:00 2001 From: KavithaSiva <32287936+KavithaSiva@users.noreply.github.com> Date: Tue, 13 Aug 2024 10:28:35 +0200 Subject: [PATCH] feat: Add content filtering with convenience functions (#58) * chore:add generated content filtering schema * chore: Initial API design * chore:minor API adjustments * chore:add test * feat:initial implementation * chore: fix build failure * chore: cleanup * chore: fix build * feat: switch to adding filter config in OrchestrationCompletionParameters * chore:simplify implementation * fix: pipeline * chore:switch to varargs * chore: cleanup API proposal Co-authored-by: Kuhr, Matthias * chore: enhance test * chore: fix build issues * chore:add additional tests * chore: cleanup * chore: minor fixes * fix: Changes from lint * chore: address review comments * chore: address review comments * fix: Changes from lint * chore: address review comments * chore: regenerate client * chore: remove non-relevant generated files * chore: cleanup function * chore: improve JSDoc * chore: make input_params optional again * Update packages/gen-ai-hub/src/orchestration/orchestration-client.ts Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> * Update packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.test.ts Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> * fix: Changes from lint * Update packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.ts Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> * Update packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.ts Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> * Update packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.ts Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> * fix: typo * Update packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.test.ts Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> * Update packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.test.ts Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> * fix: test * chore: address review comments --------- Co-authored-by: Kuhr, Matthias Co-authored-by: cloud-sdk-js Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> --- .../azure-content-safety-filter-config.ts | 19 ++ .../client/api/schema/azure-content-safety.ts | 4 +- .../api/schema/completion-post-request.ts | 2 +- .../client/api/schema/filter-config.ts | 10 + .../orchestration/client/api/schema/filter.ts | 16 -- .../client/api/schema/filtering-config.ts | 7 +- .../orchestration/client/api/schema/index.ts | 4 +- .../client/api/schema/llm-module-config.ts | 2 +- .../client/api/schema/provider-type.ts | 10 - .../gen-ai-hub/src/orchestration/index.ts | 1 + .../orchestration-client.test.ts | 107 ++++++++++- .../src/orchestration/orchestration-client.ts | 26 +-- .../orchestration-filter-utility.test.ts | 178 ++++++++++++++++++ .../orchestration-filter-utility.ts | 22 +++ .../src/orchestration/orchestration-types.ts | 7 +- .../src/orchestration/spec/api.yaml | 30 +-- ...enaihub-chat-completion-filter-config.json | 71 +++++++ 17 files changed, 452 insertions(+), 64 deletions(-) create mode 100644 packages/gen-ai-hub/src/orchestration/client/api/schema/azure-content-safety-filter-config.ts create mode 100644 packages/gen-ai-hub/src/orchestration/client/api/schema/filter-config.ts delete mode 100644 packages/gen-ai-hub/src/orchestration/client/api/schema/filter.ts delete mode 100644 packages/gen-ai-hub/src/orchestration/client/api/schema/provider-type.ts create mode 100644 packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.test.ts create mode 100644 packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.ts create mode 100644 packages/gen-ai-hub/src/test-util/mock-data/orchestration/genaihub-chat-completion-filter-config.json diff --git a/packages/gen-ai-hub/src/orchestration/client/api/schema/azure-content-safety-filter-config.ts b/packages/gen-ai-hub/src/orchestration/client/api/schema/azure-content-safety-filter-config.ts new file mode 100644 index 00000000..453e6bd2 --- /dev/null +++ b/packages/gen-ai-hub/src/orchestration/client/api/schema/azure-content-safety-filter-config.ts @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024 SAP SE or an SAP affiliate company. All rights reserved. + * + * This is a generated file powered by the SAP Cloud SDK for JavaScript. + */ +import type { AzureContentSafety } from './azure-content-safety.js'; +/** + * Representation of the 'AzureContentSafetyFilterConfig' schema. + */ +export type AzureContentSafetyFilterConfig = { + /** + * String represents name of the filter provider. + */ + type: 'azure_content_safety'; + /** + * Filter configuration for Azure Content Azure Content Safety. + */ + config?: AzureContentSafety; +} & Record; diff --git a/packages/gen-ai-hub/src/orchestration/client/api/schema/azure-content-safety.ts b/packages/gen-ai-hub/src/orchestration/client/api/schema/azure-content-safety.ts index f8c22cac..dc8dc26e 100644 --- a/packages/gen-ai-hub/src/orchestration/client/api/schema/azure-content-safety.ts +++ b/packages/gen-ai-hub/src/orchestration/client/api/schema/azure-content-safety.ts @@ -7,9 +7,9 @@ import type { AzureThreshold } from './azure-threshold.js'; /** * Representation of the 'AzureContentSafety' schema. */ -export type AzureContentSafety = { +export interface AzureContentSafety { Hate?: AzureThreshold; SelfHarm?: AzureThreshold; Sexual?: AzureThreshold; Violence?: AzureThreshold; -} & Record; +} diff --git a/packages/gen-ai-hub/src/orchestration/client/api/schema/completion-post-request.ts b/packages/gen-ai-hub/src/orchestration/client/api/schema/completion-post-request.ts index a1a7b6b1..4ba5bdae 100644 --- a/packages/gen-ai-hub/src/orchestration/client/api/schema/completion-post-request.ts +++ b/packages/gen-ai-hub/src/orchestration/client/api/schema/completion-post-request.ts @@ -11,6 +11,6 @@ import type { ChatMessages } from './chat-messages.js'; */ export type CompletionPostRequest = { orchestration_config: OrchestrationConfig; - input_params: Record; + input_params?: Record; messages_history?: ChatMessages; } & Record; diff --git a/packages/gen-ai-hub/src/orchestration/client/api/schema/filter-config.ts b/packages/gen-ai-hub/src/orchestration/client/api/schema/filter-config.ts new file mode 100644 index 00000000..4528aa1f --- /dev/null +++ b/packages/gen-ai-hub/src/orchestration/client/api/schema/filter-config.ts @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2024 SAP SE or an SAP affiliate company. All rights reserved. + * + * This is a generated file powered by the SAP Cloud SDK for JavaScript. + */ +import type { AzureContentSafetyFilterConfig } from './azure-content-safety-filter-config.js'; +/** + * Representation of the 'FilterConfig' schema. + */ +export type FilterConfig = AzureContentSafetyFilterConfig; diff --git a/packages/gen-ai-hub/src/orchestration/client/api/schema/filter.ts b/packages/gen-ai-hub/src/orchestration/client/api/schema/filter.ts deleted file mode 100644 index d2785b85..00000000 --- a/packages/gen-ai-hub/src/orchestration/client/api/schema/filter.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) 2024 SAP SE or an SAP affiliate company. All rights reserved. - * - * This is a generated file powered by the SAP Cloud SDK for JavaScript. - */ -import type { ProviderType } from './provider-type.js'; -/** - * Representation of the 'Filter' schema. - */ -export type Filter = { - type: ProviderType; - /** - * Filters classifiers to be used. - */ - config?: Record; -} & Record; diff --git a/packages/gen-ai-hub/src/orchestration/client/api/schema/filtering-config.ts b/packages/gen-ai-hub/src/orchestration/client/api/schema/filtering-config.ts index 000349b8..343418f8 100644 --- a/packages/gen-ai-hub/src/orchestration/client/api/schema/filtering-config.ts +++ b/packages/gen-ai-hub/src/orchestration/client/api/schema/filtering-config.ts @@ -3,13 +3,14 @@ * * This is a generated file powered by the SAP Cloud SDK for JavaScript. */ -import type { Filter } from './filter.js'; +import type { FilterConfig } from './filter-config.js'; /** * Representation of the 'FilteringConfig' schema. */ export type FilteringConfig = { /** - * Filters to be used. + * Configuration for content filtering services that should be used for the given filtering step (input filtering or output filtering). + * Min Items: 1. */ - filters: Filter[]; + filters: FilterConfig[]; } & Record; diff --git a/packages/gen-ai-hub/src/orchestration/client/api/schema/index.ts b/packages/gen-ai-hub/src/orchestration/client/api/schema/index.ts index 6674436a..c4eec0e9 100644 --- a/packages/gen-ai-hub/src/orchestration/client/api/schema/index.ts +++ b/packages/gen-ai-hub/src/orchestration/client/api/schema/index.ts @@ -20,9 +20,9 @@ export * from './token-usage.js'; export * from './templating-module-config.js'; export * from './filtering-module-config.js'; export * from './filtering-config.js'; -export * from './filter.js'; +export * from './filter-config.js'; +export * from './azure-content-safety-filter-config.js'; export * from './azure-content-safety.js'; -export * from './provider-type.js'; export * from './azure-threshold.js'; export * from './masking-module-config.js'; export * from './masking-config.js'; diff --git a/packages/gen-ai-hub/src/orchestration/client/api/schema/llm-module-config.ts b/packages/gen-ai-hub/src/orchestration/client/api/schema/llm-module-config.ts index 22cf0ea7..a6da100c 100644 --- a/packages/gen-ai-hub/src/orchestration/client/api/schema/llm-module-config.ts +++ b/packages/gen-ai-hub/src/orchestration/client/api/schema/llm-module-config.ts @@ -19,7 +19,7 @@ export type LLMModuleConfig = { model_params: Record; /** * Version of the model to use. - * @example "2024-08-08T14:36:04.617Z" + * @example "2024-08-12T10:11:17.042Z" * Default: "latest". */ model_version?: string; diff --git a/packages/gen-ai-hub/src/orchestration/client/api/schema/provider-type.ts b/packages/gen-ai-hub/src/orchestration/client/api/schema/provider-type.ts deleted file mode 100644 index 3e23bc23..00000000 --- a/packages/gen-ai-hub/src/orchestration/client/api/schema/provider-type.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright (c) 2024 SAP SE or an SAP affiliate company. All rights reserved. - * - * This is a generated file powered by the SAP Cloud SDK for JavaScript. - */ - -/** - * Representation of the 'ProviderType' schema. - */ -export type ProviderType = 'azure_content_safety'; diff --git a/packages/gen-ai-hub/src/orchestration/index.ts b/packages/gen-ai-hub/src/orchestration/index.ts index e5107e4e..d34ac339 100644 --- a/packages/gen-ai-hub/src/orchestration/index.ts +++ b/packages/gen-ai-hub/src/orchestration/index.ts @@ -1,3 +1,4 @@ export * from './client/api/index.js'; export * from './orchestration-client.js'; export * from './orchestration-types.js'; +export * from './orchestration-filter-utility.js'; diff --git a/packages/gen-ai-hub/src/orchestration/orchestration-client.test.ts b/packages/gen-ai-hub/src/orchestration/orchestration-client.test.ts index e78712c3..2c067c06 100644 --- a/packages/gen-ai-hub/src/orchestration/orchestration-client.test.ts +++ b/packages/gen-ai-hub/src/orchestration/orchestration-client.test.ts @@ -6,6 +6,7 @@ import { mockInference, parseMockResponse } from '../test-util/mock-http.js'; import { BaseLlmParametersWithDeploymentId } from '../core/index.js'; import { CompletionPostResponse } from './client/api/index.js'; import { GenAiHubCompletionParameters } from './orchestration-types.js'; +import { azureContentFilter } from './orchestration-filter-utility.js'; jest.unstable_mockModule('../core/context.js', () => ({ getAiCoreDestination: jest.fn(() => Promise.resolve(mockGetAiCoreDestination()) @@ -34,7 +35,7 @@ describe('GenAiHubClient', () => { jest.restoreAllMocks(); }); - it('calls chatCompletion with minimum configuration and parses response', async () => { + it('calls chatCompletion with minimum configuration', async () => { const request: GenAiHubCompletionParameters = { deploymentConfiguration, llmConfig: { @@ -70,6 +71,110 @@ describe('GenAiHubClient', () => { expect(client.chatCompletion(request)).resolves.toEqual(mockResponse); }); + it('calls chatCompletion with filter configuration supplied using convenience function', async () => { + const request: GenAiHubCompletionParameters = { + deploymentConfiguration, + llmConfig: { + model_name: 'gpt-35-turbo-16k', + model_params: { max_tokens: 50, temperature: 0.1 } + }, + prompt: { + template: [ + { role: 'user', content: 'Create {number} paraphrases of {phrase}' } + ], + template_params: { phrase: 'I hate you.', number: 3 } + }, + filterConfig: { + input: azureContentFilter({ Hate: 4, SelfHarm: 2 }), + output: azureContentFilter({ Sexual: 0, Violence: 4 }) + } + }; + const mockResponse = parseMockResponse( + 'orchestration', + 'genaihub-chat-completion-filter-config.json' + ); + + mockInference( + { + data: { + deploymentConfiguration, + ...constructCompletionPostRequest(request) + } + }, + { + data: mockResponse, + status: 200 + }, + destination, + { + url: 'completion' + } + ); + expect(client.chatCompletion(request)).resolves.toEqual(mockResponse); + }); + + it('calls chatCompletion with filtering configuration', async () => { + const request: GenAiHubCompletionParameters = { + deploymentConfiguration, + llmConfig: { + model_name: 'gpt-35-turbo-16k', + model_params: { max_tokens: 50, temperature: 0.1 } + }, + prompt: { + template: [ + { role: 'user', content: 'Create {number} paraphrases of {phrase}' } + ], + template_params: { phrase: 'I hate you.', number: 3 } + }, + filterConfig: { + input: { + filters: [ + { + type: 'azure_content_safety', + config: { + Hate: 4, + SelfHarm: 2 + } + } + ] + }, + output: { + filters: [ + { + type: 'azure_content_safety', + config: { + Sexual: 0, + Violence: 4 + } + } + ] + } + } + }; + const mockResponse = parseMockResponse( + 'orchestration', + 'genaihub-chat-completion-filter-config.json' + ); + + mockInference( + { + data: { + deploymentConfiguration, + ...constructCompletionPostRequest(request) + } + }, + { + data: mockResponse, + status: 200 + }, + destination, + { + url: 'completion' + } + ); + expect(client.chatCompletion(request)).resolves.toEqual(mockResponse); + }); + it('sends message history together with templating config', async () => { const request: GenAiHubCompletionParameters = { deploymentConfiguration, diff --git a/packages/gen-ai-hub/src/orchestration/orchestration-client.ts b/packages/gen-ai-hub/src/orchestration/orchestration-client.ts index 3a31a20d..78c5ed57 100644 --- a/packages/gen-ai-hub/src/orchestration/orchestration-client.ts +++ b/packages/gen-ai-hub/src/orchestration/orchestration-client.ts @@ -39,22 +39,24 @@ export class GenAiHubClient { export function constructCompletionPostRequest( input: GenAiHubCompletionParameters ): CompletionPostRequest { - return { - // TODO: Properly implement input params - input_params: {}, + const result: CompletionPostRequest = { orchestration_config: { module_configurations: { templating_module_config: { template: input.prompt.template }, - llm_module_config: input.llmConfig - }, - ...(input.prompt.template_params && { - input_params: input.prompt.template_params - }), - ...(input.prompt.messages_history && { - messages_history: input.prompt.messages_history - }) - } + llm_module_config: input.llmConfig, + ...(Object.keys(input?.filterConfig || {}).length && { + filtering_module_config: input.filterConfig + }) + } + }, + ...(input.prompt.template_params && { + input_params: input.prompt.template_params + }), + ...(input.prompt.messages_history && { + messages_history: input.prompt.messages_history + }) }; + return result; } diff --git a/packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.test.ts b/packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.test.ts new file mode 100644 index 00000000..087837bd --- /dev/null +++ b/packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.test.ts @@ -0,0 +1,178 @@ +import { + CompletionPostRequest, + FilteringModuleConfig +} from './client/api/index.js'; +import { constructCompletionPostRequest } from './orchestration-client.js'; +import { azureContentFilter } from './orchestration-filter-utility.js'; +import { GenAiHubCompletionParameters } from './orchestration-types.js'; + +describe('Filter utility', () => { + const genaihubCompletionParameters: GenAiHubCompletionParameters = { + deploymentConfiguration: { + deploymentId: 'deployment-id' + }, + llmConfig: { + model_name: 'gpt-35-turbo-16k', + model_params: { max_tokens: 50, temperature: 0.1 } + }, + prompt: { + template: [ + { role: 'user', content: 'Create {number} paraphrases of {phrase}' } + ], + template_params: { phrase: 'I hate you.', number: 3 } + } + }; + + afterEach(() => { + genaihubCompletionParameters.filterConfig = undefined; + }); + + it('constructs filter configuration with only input', async () => { + const filterConfig: FilteringModuleConfig = { + input: azureContentFilter({ Hate: 4, SelfHarm: 0 }) + }; + const expectedFilterConfig: FilteringModuleConfig = { + input: { + filters: [ + { + type: 'azure_content_safety', + config: { + Hate: 4, + SelfHarm: 0 + } + } + ] + } + }; + genaihubCompletionParameters.filterConfig = filterConfig; + const completionPostRequest: CompletionPostRequest = + constructCompletionPostRequest(genaihubCompletionParameters); + expect( + completionPostRequest.orchestration_config.module_configurations + .filtering_module_config + ).toEqual(expectedFilterConfig); + }); + + it('constructs filter configuration with only output', async () => { + const filterConfig: FilteringModuleConfig = { + output: azureContentFilter({ Sexual: 2, Violence: 6 }) + }; + const expectedFilterConfig: FilteringModuleConfig = { + output: { + filters: [ + { + type: 'azure_content_safety', + config: { + Sexual: 2, + Violence: 6 + } + } + ] + } + }; + genaihubCompletionParameters.filterConfig = filterConfig; + const completionPostRequest: CompletionPostRequest = + constructCompletionPostRequest(genaihubCompletionParameters); + expect( + completionPostRequest.orchestration_config.module_configurations + .filtering_module_config + ).toEqual(expectedFilterConfig); + }); + + it('constructs filter configuration with both input and ouput', async () => { + const filterConfig: FilteringModuleConfig = { + input: azureContentFilter({ + Hate: 4, + SelfHarm: 0, + Sexual: 2, + Violence: 6 + }), + output: azureContentFilter({ Sexual: 2, Violence: 6 }) + }; + const expectedFilterConfig: FilteringModuleConfig = { + input: { + filters: [ + { + type: 'azure_content_safety', + config: { + Hate: 4, + SelfHarm: 0, + Sexual: 2, + Violence: 6 + } + } + ] + }, + output: { + filters: [ + { + type: 'azure_content_safety', + config: { + Sexual: 2, + Violence: 6 + } + } + ] + } + }; + genaihubCompletionParameters.filterConfig = filterConfig; + const completionPostRequest: CompletionPostRequest = + constructCompletionPostRequest(genaihubCompletionParameters); + expect( + completionPostRequest.orchestration_config.module_configurations + .filtering_module_config + ).toEqual(expectedFilterConfig); + }); + + it('omits filters if not set', async () => { + const filterConfig: FilteringModuleConfig = { + input: azureContentFilter(), + output: azureContentFilter() + }; + genaihubCompletionParameters.filterConfig = filterConfig; + const completionPostRequest: CompletionPostRequest = + constructCompletionPostRequest(genaihubCompletionParameters); + const expectedFilterConfig: FilteringModuleConfig = { + input: { + filters: [ + { + type: 'azure_content_safety' + } + ] + }, + output: { + filters: [ + { + type: 'azure_content_safety' + } + ] + } + }; + expect( + completionPostRequest.orchestration_config.module_configurations + .filtering_module_config + ).toEqual(expectedFilterConfig); + }); + + it('omits filter configuration if not set', async () => { + const filterConfig: FilteringModuleConfig = {}; + genaihubCompletionParameters.filterConfig = filterConfig; + const completionPostRequest: CompletionPostRequest = + constructCompletionPostRequest(genaihubCompletionParameters); + expect( + completionPostRequest.orchestration_config.module_configurations + .filtering_module_config + ).toBeUndefined(); + }); + + it('throw error when configuring empty filter', async () => { + const createFilterConfig = () => { + { + azureContentFilter({}); + } + }; + expect(createFilterConfig).toThrow( + 'Filter property cannot be an empty object' + ); + }); +}); diff --git a/packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.ts b/packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.ts new file mode 100644 index 00000000..e657c2d1 --- /dev/null +++ b/packages/gen-ai-hub/src/orchestration/orchestration-filter-utility.ts @@ -0,0 +1,22 @@ +import { AzureContentSafety, FilteringConfig } from './client/api/index.js'; + +/** + * Convenience function to create Azure filters. + * @param filter - Filtering configuration for Azure filter. If skipped, the default Azure filter configuration is used. + * @returns An object with the Azure filtering configuration. + */ +export function azureContentFilter( + filter?: AzureContentSafety +): FilteringConfig { + if (filter && !Object.keys(filter).length) { + throw new Error('Filter property cannot be an empty object'); + } + return { + filters: [ + { + type: 'azure_content_safety', + ...(filter && { config: filter }) + } + ] + }; +} diff --git a/packages/gen-ai-hub/src/orchestration/orchestration-types.ts b/packages/gen-ai-hub/src/orchestration/orchestration-types.ts index 0a3b0a95..3e18b366 100644 --- a/packages/gen-ai-hub/src/orchestration/orchestration-types.ts +++ b/packages/gen-ai-hub/src/orchestration/orchestration-types.ts @@ -2,6 +2,7 @@ import { BaseLlmParameters } from '../core/index.js'; import { ChatMessages, CompletionPostResponse, + FilteringModuleConfig, InputParamsEntry, LLMModuleConfig } from './client/api/index.js'; @@ -44,11 +45,15 @@ export type LlmConfig = LLMModuleConfig; */ export interface OrchestrationCompletionParameters { /** - * Prompt options. + * Prompt configuration options. */ prompt: PromptConfig; /** * Llm configuration options. */ llmConfig: LlmConfig; + /** + * Filter configuration options. + */ + filterConfig?: FilteringModuleConfig; } diff --git a/packages/gen-ai-hub/src/orchestration/spec/api.yaml b/packages/gen-ai-hub/src/orchestration/spec/api.yaml index c4eaaf5c..43a7fb6a 100644 --- a/packages/gen-ai-hub/src/orchestration/spec/api.yaml +++ b/packages/gen-ai-hub/src/orchestration/spec/api.yaml @@ -64,7 +64,6 @@ components: type: object required: - orchestration_config - - input_params properties: orchestration_config: $ref: '#/components/schemas/OrchestrationConfig' @@ -159,8 +158,6 @@ components: $ref: '#/components/schemas/GenericModuleResult' TemplatingModuleResult: - type: object - additionalProperties: false $ref: '#/components/schemas/ChatMessages' # --- LLM MODULE --- @@ -305,26 +302,34 @@ components: - filters properties: filters: + description: Configuration for content filtering services that should be used for the given filtering step (input filtering or output filtering). type: array + minItems: 1 items: - $ref: '#/components/schemas/Filter' - description: Filters to be used + $ref: '#/components/schemas/FilterConfig' + + FilterConfig: + oneOf: + - $ref: '#/components/schemas/AzureContentSafetyFilterConfig' - Filter: + AzureContentSafetyFilterConfig: + type: object required: - type properties: type: - description: Type of filtering service provider - $ref: '#/components/schemas/ProviderType' + description: String represents name of the filter provider + type: string + enum: + - azure_content_safety config: - description: Filters classifiers to be used - type: object + description: Filter configuration for Azure Content Azure Content Safety oneOf: - $ref: '#/components/schemas/AzureContentSafety' AzureContentSafety: type: object + additionalProperties: false properties: 'Hate': $ref: '#/components/schemas/AzureThreshold' @@ -335,11 +340,6 @@ components: 'Violence': $ref: '#/components/schemas/AzureThreshold' - ProviderType: - type: string - enum: - - azure_content_safety - AzureThreshold: type: integer enum: diff --git a/packages/gen-ai-hub/src/test-util/mock-data/orchestration/genaihub-chat-completion-filter-config.json b/packages/gen-ai-hub/src/test-util/mock-data/orchestration/genaihub-chat-completion-filter-config.json new file mode 100644 index 00000000..b749e1a6 --- /dev/null +++ b/packages/gen-ai-hub/src/test-util/mock-data/orchestration/genaihub-chat-completion-filter-config.json @@ -0,0 +1,71 @@ +{ + "request_id": "anonymized-request-id", + "module_results": { + "templating": [ + { + "role": "user", + "content": "Create {number} paraphrases of {phrase}" + } + ], + "input_filtering": { + "message": "Input filter passed successfully.", + "data": { + "original_service_response": { + "Hate": 0, + "SelfHarm": 0 + } + } + }, + "llm": { + "id": "anonymized-id", + "object": "chat.completion", + "created": 0, + "model": "gpt-35-turbo-16k", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "I'm sorry, but I cannot generate a specific number of paraphrases without knowing the phrase you would like me to paraphrase. Could you please provide the phrase you would like me to work with?" + }, + "finish_reason": "stop" + } + ], + "usage": { + "completion_tokens": 40, + "prompt_tokens": 17, + "total_tokens": 57 + } + }, + "output_filtering": { + "message": "Output filter passed successfully.", + "data": { + "original_service_response": { + "Sexual": 0, + "Violence": 0 + } + } + } + }, + "orchestration_result": { + "id": "anonymized-id", + "object": "chat.completion", + "created": 0, + "model": "gpt-35-turbo-16k", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "I'm sorry, but I cannot generate a specific number of paraphrases without knowing the phrase you would like me to paraphrase. Could you please provide the phrase you would like me to work with?" + }, + "finish_reason": "stop" + } + ], + "usage": { + "completion_tokens": 40, + "prompt_tokens": 17, + "total_tokens": 57 + } + } +}