diff --git a/packages/ai-api/src/index.ts b/packages/ai-api/src/index.ts index f186b697..8d082418 100644 --- a/packages/ai-api/src/index.ts +++ b/packages/ai-api/src/index.ts @@ -2,7 +2,7 @@ export * from './client/AI_CORE_API/index.js'; export type { ModelDeployment, - DeploymentIdConfiguration, - ModelConfiguration, - ResourceGroupConfiguration + DeploymentIdConfig, + ModelConfig, + ResourceGroupConfig } from './utils/index.js'; diff --git a/packages/ai-api/src/utils/deployment-resolver.ts b/packages/ai-api/src/utils/deployment-resolver.ts index 4c515b07..8a4c1dda 100644 --- a/packages/ai-api/src/utils/deployment-resolver.ts +++ b/packages/ai-api/src/utils/deployment-resolver.ts @@ -9,7 +9,7 @@ import { extractModel, type FoundationModel } from './model.js'; * The model deployment configuration when using a model. * @typeParam ModelNameT - String literal type representing the name of the model. */ -export interface ModelConfiguration { +export interface ModelConfig { /** * The name of the model. */ @@ -23,7 +23,7 @@ export interface ModelConfiguration { /** * The deployment configuration when using a deployment ID. */ -export interface DeploymentIdConfiguration { +export interface DeploymentIdConfig { /** * The deployment ID. */ @@ -33,7 +33,7 @@ export interface DeploymentIdConfiguration { /** * The deployment configuration when using a resource group. */ -export interface ResourceGroupConfiguration { +export interface ResourceGroupConfig { /** * The resource group of the deployment. */ @@ -46,17 +46,16 @@ export interface ResourceGroupConfiguration { */ export type ModelDeployment = | ModelNameT - | ((ModelConfiguration | DeploymentIdConfiguration) & - ResourceGroupConfiguration); + | ((ModelConfig | DeploymentIdConfig) & ResourceGroupConfig); /** * Type guard to check if the given deployment configuration is a deployment ID configuration. * @param modelDeployment - Configuration to check. * @returns `true` if the configuration is a deployment ID configuration, `false` otherwise. */ -function isDeploymentIdConfiguration( +function isDeploymentIdConfig( modelDeployment: ModelDeployment -): modelDeployment is DeploymentIdConfiguration { +): modelDeployment is DeploymentIdConfig { return ( typeof modelDeployment === 'object' && 'deploymentId' in modelDeployment ); @@ -156,7 +155,7 @@ export async function getDeploymentId( modelDeployment: ModelDeployment, executableId: string ): Promise { - if (isDeploymentIdConfiguration(modelDeployment)) { + if (isDeploymentIdConfig(modelDeployment)) { return modelDeployment.deploymentId; } @@ -173,9 +172,7 @@ export async function getDeploymentId( }); } -function translateToFoundationModel( - modelConfig: ModelConfiguration -): FoundationModel { +function translateToFoundationModel(modelConfig: ModelConfig): FoundationModel { if (typeof modelConfig === 'string') { return { name: modelConfig }; } diff --git a/packages/core/src/http-client.test.ts b/packages/core/src/http-client.test.ts index 037ed9e4..8511b725 100644 --- a/packages/core/src/http-client.test.ts +++ b/packages/core/src/http-client.test.ts @@ -9,9 +9,11 @@ describe('http-client', () => { beforeEach(() => { mockClientCredentialsGrantCall(); }); + afterEach(() => { nock.cleanAll(); }); + it('should execute a request to the AI Core service', async () => { const mockPrompt = { prompt: 'some test prompt' }; const mockPromptResponse = { completion: 'some test completion' }; diff --git a/packages/core/src/http-client.ts b/packages/core/src/http-client.ts index 059ebc72..08077bd7 100644 --- a/packages/core/src/http-client.ts +++ b/packages/core/src/http-client.ts @@ -6,25 +6,6 @@ import { } from '@sap-cloud-sdk/http-client'; import { getAiCoreDestination } from './context.js'; -/** - * Input parameters with Deployment ID. - */ -export interface BaseLlmParametersWithDeploymentId { - /** - * Deployment ID of the model to use. - */ - deploymentId: string; -} -/** - * Base LLM Input Parameters. - */ -export interface BaseLlmParameters { - /** - * Deployment configuration. - */ - deploymentConfiguration: BaseLlmParametersWithDeploymentId; -} - /** * The type for parameters in custom request configuration. */ diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 3f7f55ac..aaf1e0af 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,9 +1,4 @@ -export type { - BaseLlmParametersWithDeploymentId, - BaseLlmParameters, - CustomRequestConfig, - EndpointOptions -} from './http-client.js'; +export type { CustomRequestConfig, EndpointOptions } from './http-client.js'; export { executeRequest } from './http-client.js'; export { getAiCoreDestination } from './context.js'; export { OpenApiRequestBuilder } from './openapi-request-builder.js'; diff --git a/packages/orchestration/src/index.ts b/packages/orchestration/src/index.ts index 232594ac..98de0331 100644 --- a/packages/orchestration/src/index.ts +++ b/packages/orchestration/src/index.ts @@ -30,7 +30,7 @@ export type { export type { OrchestrationModuleConfig, - LlmConfig, + LlmModuleConfig, Prompt } from './orchestration-types.js'; diff --git a/packages/orchestration/src/orchestration-client.test.ts b/packages/orchestration/src/orchestration-client.test.ts index 9e4527f9..99852fe5 100644 --- a/packages/orchestration/src/orchestration-client.test.ts +++ b/packages/orchestration/src/orchestration-client.test.ts @@ -12,6 +12,7 @@ import { } from './orchestration-client.js'; import { azureContentFilter } from './orchestration-filter-utility.js'; import { OrchestrationResponse } from './orchestration-response.js'; +import { OrchestrationModuleConfig } from './orchestration-types.js'; describe('orchestration service client', () => { beforeEach(() => { @@ -24,12 +25,12 @@ describe('orchestration service client', () => { }); it('calls chatCompletion with minimum configuration', async () => { - const config = { - llmConfig: { + const config: OrchestrationModuleConfig = { + llm: { model_name: 'gpt-35-turbo-16k', model_params: { max_tokens: 50, temperature: 0.1 } }, - templatingConfig: { + templating: { template: [{ role: 'user', content: 'Hello!' }] } }; @@ -61,12 +62,12 @@ describe('orchestration service client', () => { }); it('calls chatCompletion with filter configuration supplied using convenience function', async () => { - const config = { - llmConfig: { + const config: OrchestrationModuleConfig = { + llm: { model_name: 'gpt-35-turbo-16k', model_params: { max_tokens: 50, temperature: 0.1 } }, - templatingConfig: { + templating: { template: [ { role: 'user', @@ -74,7 +75,7 @@ describe('orchestration service client', () => { } ] }, - filterConfig: { + filtering: { input: azureContentFilter({ Hate: 4, SelfHarm: 2 }), output: azureContentFilter({ Sexual: 0, Violence: 4 }) } @@ -106,12 +107,12 @@ describe('orchestration service client', () => { }); it('calls chatCompletion with filtering configuration', async () => { - const config = { - llmConfig: { + const config: OrchestrationModuleConfig = { + llm: { model_name: 'gpt-35-turbo-16k', model_params: { max_tokens: 50, temperature: 0.1 } }, - templatingConfig: { + templating: { template: [ { role: 'user', @@ -119,7 +120,7 @@ describe('orchestration service client', () => { } ] }, - filterConfig: { + filtering: { input: { filters: [ { @@ -169,12 +170,12 @@ describe('orchestration service client', () => { }); it('sends message history together with templating config', async () => { - const config = { - llmConfig: { + const config: OrchestrationModuleConfig = { + llm: { model_name: 'gpt-35-turbo-16k', model_params: { max_tokens: 50, temperature: 0.1 } }, - templatingConfig: { + templating: { template: [{ role: 'user', content: "What's my name?" }], messages_history: [ { diff --git a/packages/orchestration/src/orchestration-client.ts b/packages/orchestration/src/orchestration-client.ts index 1bfafe02..51745cc8 100644 --- a/packages/orchestration/src/orchestration-client.ts +++ b/packages/orchestration/src/orchestration-client.ts @@ -1,7 +1,7 @@ import { executeRequest, CustomRequestConfig } from '@sap-ai-sdk/core'; import { resolveDeploymentId, - ResourceGroupConfiguration + ResourceGroupConfig } from '@sap-ai-sdk/ai-api/internal.js'; import { CompletionPostRequest } from './client/api/schema/index.js'; import { OrchestrationModuleConfig, Prompt } from './orchestration-types.js'; @@ -18,7 +18,7 @@ export class OrchestrationClient { */ constructor( private config: OrchestrationModuleConfig, - private deploymentConfig?: ResourceGroupConfiguration + private deploymentConfig?: ResourceGroupConfig ) {} /** @@ -60,11 +60,11 @@ export function constructCompletionPostRequest( orchestration_config: { module_configurations: { templating_module_config: { - template: config.templatingConfig.template + template: config.templating.template }, - llm_module_config: config.llmConfig, - ...(Object.keys(config?.filterConfig || {}).length && { - filtering_module_config: config.filterConfig + llm_module_config: config.llm, + ...(Object.keys(config?.filtering || {}).length && { + filtering_module_config: config.filtering }) } }, diff --git a/packages/orchestration/src/orchestration-completion-post-request.test.ts b/packages/orchestration/src/orchestration-completion-post-request.test.ts index 5ac7db39..c2a9d353 100644 --- a/packages/orchestration/src/orchestration-completion-post-request.test.ts +++ b/packages/orchestration/src/orchestration-completion-post-request.test.ts @@ -5,11 +5,11 @@ import { OrchestrationModuleConfig } from './orchestration-types.js'; describe('constructCompletionPostRequest()', () => { const defaultConfig: OrchestrationModuleConfig = { - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: { max_tokens: 50, temperature: 0.1 } }, - templatingConfig: { + templating: { template: [{ role: 'user', content: 'Hi' }] } }; @@ -18,8 +18,8 @@ describe('constructCompletionPostRequest()', () => { const expectedCompletionPostRequest: CompletionPostRequest = { orchestration_config: { module_configurations: { - templating_module_config: defaultConfig.templatingConfig, - llm_module_config: defaultConfig.llmConfig + templating_module_config: defaultConfig.templating, + llm_module_config: defaultConfig.llm } } }; @@ -30,12 +30,15 @@ describe('constructCompletionPostRequest()', () => { // TODO: Adapt the test after Cloud SDK fix for: https://github.com/SAP/cloud-sdk-backlog/issues/1234 it('with model configuration and empty template', async () => { - const config = { ...defaultConfig, templatingConfig: { template: [] } }; + const config: OrchestrationModuleConfig = { + ...defaultConfig, + templating: { template: [] } + }; const expectedCompletionPostRequest: CompletionPostRequest = { orchestration_config: { module_configurations: { - templating_module_config: config.templatingConfig, - llm_module_config: config.llmConfig + templating_module_config: config.templating, + llm_module_config: config.llm } } }; @@ -45,9 +48,9 @@ describe('constructCompletionPostRequest()', () => { }); it('with model configuration, prompt template and template params', async () => { - const config = { + const config: OrchestrationModuleConfig = { ...defaultConfig, - templatingConfig: { + templating: { template: [ { role: 'user', @@ -60,8 +63,8 @@ describe('constructCompletionPostRequest()', () => { const expectedCompletionPostRequest: CompletionPostRequest = { orchestration_config: { module_configurations: { - templating_module_config: config.templatingConfig, - llm_module_config: config.llmConfig + templating_module_config: config.templating, + llm_module_config: config.llm } }, input_params: inputParams @@ -72,9 +75,9 @@ describe('constructCompletionPostRequest()', () => { }); it('with model configuration, prompt template and empty template params', async () => { - const config = { + const config: OrchestrationModuleConfig = { ...defaultConfig, - templatingConfig: { + templating: { template: [ { role: 'user', @@ -87,8 +90,8 @@ describe('constructCompletionPostRequest()', () => { const expectedCompletionPostRequest: CompletionPostRequest = { orchestration_config: { module_configurations: { - templating_module_config: config.templatingConfig, - llm_module_config: config.llmConfig + templating_module_config: config.templating, + llm_module_config: config.llm } }, input_params: inputParams @@ -99,19 +102,19 @@ describe('constructCompletionPostRequest()', () => { }); it('with model name, empty model parameters and prompt template', async () => { - const config = { + const config: OrchestrationModuleConfig = { ...defaultConfig, - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: {} }, - filterConfig: {} + filtering: {} }; const expectedCompletionPostRequest: CompletionPostRequest = { orchestration_config: { module_configurations: { - templating_module_config: config.templatingConfig, - llm_module_config: config.llmConfig + templating_module_config: config.templating, + llm_module_config: config.llm } } }; @@ -121,9 +124,9 @@ describe('constructCompletionPostRequest()', () => { }); it('with model configuration, prompt template and message history', async () => { - const config = { + const config: OrchestrationModuleConfig = { ...defaultConfig, - templatingConfig: { + templating: { template: [{ role: 'user', content: "What's my name?" }] } }; @@ -146,8 +149,8 @@ describe('constructCompletionPostRequest()', () => { const expectedCompletionPostRequest: CompletionPostRequest = { orchestration_config: { module_configurations: { - templating_module_config: config.templatingConfig, - llm_module_config: config.llmConfig + templating_module_config: config.templating, + llm_module_config: config.llm } }, messages_history: messagesHistory @@ -158,18 +161,18 @@ describe('constructCompletionPostRequest()', () => { }); it('with model configuration, prompt template and filter configuration', async () => { - const config = { + const config: OrchestrationModuleConfig = { ...defaultConfig, - filterConfig: { + filtering: { input: azureContentFilter({ Hate: 4, SelfHarm: 0 }) } }; const expectedCompletionPostRequest: CompletionPostRequest = { orchestration_config: { module_configurations: { - templating_module_config: config.templatingConfig, - llm_module_config: config.llmConfig, - filtering_module_config: config.filterConfig + templating_module_config: config.templating, + llm_module_config: config.llm, + filtering_module_config: config.filtering } } }; @@ -180,12 +183,15 @@ describe('constructCompletionPostRequest()', () => { // TODO: Adapt the test after Cloud SDK fix for: https://github.com/SAP/cloud-sdk-backlog/issues/1234 it('with model configuration, prompt template empty filter configuration', async () => { - const config = { ...defaultConfig, filterConfig: {} }; + const config: OrchestrationModuleConfig = { + ...defaultConfig, + filtering: {} + }; const expectedCompletionPostRequest: CompletionPostRequest = { orchestration_config: { module_configurations: { - templating_module_config: config.templatingConfig, - llm_module_config: config.llmConfig + templating_module_config: config.templating, + llm_module_config: config.llm } } }; diff --git a/packages/orchestration/src/orchestration-filter-utility.test.ts b/packages/orchestration/src/orchestration-filter-utility.test.ts index 28f70421..3e0198e1 100644 --- a/packages/orchestration/src/orchestration-filter-utility.test.ts +++ b/packages/orchestration/src/orchestration-filter-utility.test.ts @@ -8,11 +8,11 @@ import { OrchestrationModuleConfig } from './orchestration-types.js'; describe('filter utility', () => { const config: OrchestrationModuleConfig = { - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: { max_tokens: 50, temperature: 0.1 } }, - templatingConfig: { + templating: { template: [ { role: 'user', content: 'Create {number} paraphrases of {phrase}' } ] @@ -22,11 +22,11 @@ describe('filter utility', () => { const prompt = { inputParams: { phrase: 'I hate you.', number: '3' } }; afterEach(() => { - config.filterConfig = undefined; + config.filtering = undefined; }); it('constructs filter configuration with only input', async () => { - const filterConfig: FilteringModuleConfig = { + const filtering: FilteringModuleConfig = { input: azureContentFilter({ Hate: 4, SelfHarm: 0 }) }; const expectedFilterConfig: FilteringModuleConfig = { @@ -42,7 +42,7 @@ describe('filter utility', () => { ] } }; - config.filterConfig = filterConfig; + config.filtering = filtering; const completionPostRequest: CompletionPostRequest = constructCompletionPostRequest(config, prompt); expect( @@ -52,7 +52,7 @@ describe('filter utility', () => { }); it('constructs filter configuration with only output', async () => { - const filterConfig: FilteringModuleConfig = { + const filtering: FilteringModuleConfig = { output: azureContentFilter({ Sexual: 2, Violence: 6 }) }; const expectedFilterConfig: FilteringModuleConfig = { @@ -68,7 +68,7 @@ describe('filter utility', () => { ] } }; - config.filterConfig = filterConfig; + config.filtering = filtering; const completionPostRequest: CompletionPostRequest = constructCompletionPostRequest(config, prompt); expect( @@ -78,7 +78,7 @@ describe('filter utility', () => { }); it('constructs filter configuration with both input and output', async () => { - const filterConfig: FilteringModuleConfig = { + const filtering: FilteringModuleConfig = { input: azureContentFilter({ Hate: 4, SelfHarm: 0, @@ -113,7 +113,7 @@ describe('filter utility', () => { ] } }; - config.filterConfig = filterConfig; + config.filtering = filtering; const completionPostRequest: CompletionPostRequest = constructCompletionPostRequest(config, prompt); expect( @@ -123,11 +123,11 @@ describe('filter utility', () => { }); it('omits filters if not set', async () => { - const filterConfig: FilteringModuleConfig = { + const filtering: FilteringModuleConfig = { input: azureContentFilter(), output: azureContentFilter() }; - config.filterConfig = filterConfig; + config.filtering = filtering; const completionPostRequest: CompletionPostRequest = constructCompletionPostRequest(config, prompt); const expectedFilterConfig: FilteringModuleConfig = { @@ -153,8 +153,8 @@ describe('filter utility', () => { }); it('omits filter configuration if not set', async () => { - const filterConfig: FilteringModuleConfig = {}; - config.filterConfig = filterConfig; + const filtering: FilteringModuleConfig = {}; + config.filtering = filtering; const completionPostRequest: CompletionPostRequest = constructCompletionPostRequest(config, prompt); expect( diff --git a/packages/orchestration/src/orchestration-types.ts b/packages/orchestration/src/orchestration-types.ts index ef6332d7..27b75830 100644 --- a/packages/orchestration/src/orchestration-types.ts +++ b/packages/orchestration/src/orchestration-types.ts @@ -24,7 +24,7 @@ export interface Prompt { /** * LLMModule configuration. */ -export type LlmConfig = LLMModuleConfig & { +export type LlmModuleConfig = LLMModuleConfig & { /** */ model_name: ChatModel; }; @@ -33,17 +33,16 @@ export type LlmConfig = LLMModuleConfig & { * Orchestration module configuration. */ export interface OrchestrationModuleConfig { - // TODO: remove "config" for all the configs below /** - * Templating configuration options. + * Templating module configuration. */ - templatingConfig: TemplatingModuleConfig; + templating: TemplatingModuleConfig; /** - * Llm configuration options. + * LLM module configuration. */ - llmConfig: LlmConfig; + llm: LlmModuleConfig; /** - * Filter configuration options. + * Filtering module configuration. */ - filterConfig?: FilteringModuleConfig; + filtering?: FilteringModuleConfig; } diff --git a/sample-code/src/orchestration.ts b/sample-code/src/orchestration.ts index f2c0f2c4..3984644e 100644 --- a/sample-code/src/orchestration.ts +++ b/sample-code/src/orchestration.ts @@ -9,11 +9,11 @@ import { */ export async function orchestrationCompletion(): Promise { const orchestrationClient = new OrchestrationClient({ - llmConfig: { + llm: { model_name: 'gpt-4-32k', model_params: {} }, - templatingConfig: { + templating: { template: [{ role: 'user', content: 'What is the capital of France?' }] } }); diff --git a/tests/e2e-tests/src/orchestration.test.ts b/tests/e2e-tests/src/orchestration.test.ts index 72456791..16fdce50 100644 --- a/tests/e2e-tests/src/orchestration.test.ts +++ b/tests/e2e-tests/src/orchestration.test.ts @@ -11,11 +11,11 @@ dotenv.config({ path: path.resolve(__dirname, '../.env') }); describe('orchestration', () => { it('should complete a chat', async () => { const response = await new OrchestrationClient({ - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: { max_tokens: 50, temperature: 0.1 } }, - templatingConfig: { + templating: { template: [ { role: 'user', diff --git a/tests/type-tests/test/http-client.test-d.ts b/tests/type-tests/test/http-client.test-d.ts index dce14b09..15a88dbb 100644 --- a/tests/type-tests/test/http-client.test-d.ts +++ b/tests/type-tests/test/http-client.test-d.ts @@ -3,10 +3,7 @@ import { expectError, expectType } from 'tsd'; import { executeRequest } from '@sap-ai-sdk/core'; expectType>( - executeRequest( - { url: 'https://example.com', apiVersion: 'v1' }, - { deploymentConfiguration: { deploymentId: 'test-id' } } - ) + executeRequest({ url: 'https://example.com', apiVersion: 'v1' }, {}) ); expectError(executeRequest({}, { prompt: 'test prompt' })); @@ -14,7 +11,7 @@ expectError(executeRequest({}, { prompt: 'test prompt' })); expectType>( executeRequest( { url: 'https://example.com', apiVersion: 'v1' }, - { deploymentConfiguration: { deploymentId: 'test-id' } }, + {}, { headers: { 'Content-Type': 'application/json' } } ) ); diff --git a/tests/type-tests/test/orchestration.test-d.ts b/tests/type-tests/test/orchestration.test-d.ts index 1ef64037..0dbfd84b 100644 --- a/tests/type-tests/test/orchestration.test-d.ts +++ b/tests/type-tests/test/orchestration.test-d.ts @@ -12,10 +12,10 @@ import { */ expectType>( new OrchestrationClient({ - templatingConfig: { + templating: { template: [{ role: 'user', content: 'Hello!' }] }, - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: {} } @@ -25,10 +25,10 @@ expectType>( expectType( ( await new OrchestrationClient({ - templatingConfig: { + templating: { template: [{ role: 'user', content: 'Hello!' }] }, - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: {} } @@ -39,10 +39,10 @@ expectType( expectType( ( await new OrchestrationClient({ - templatingConfig: { + templating: { template: [{ role: 'user', content: 'Hello!' }] }, - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: {} } @@ -53,10 +53,10 @@ expectType( expectType( ( await new OrchestrationClient({ - templatingConfig: { + templating: { template: [{ role: 'user', content: 'Hello!' }] }, - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: {} } @@ -67,10 +67,10 @@ expectType( expectType( ( await new OrchestrationClient({ - templatingConfig: { + templating: { template: [{ role: 'user', content: 'Hello!' }] }, - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: {} } @@ -83,14 +83,14 @@ expectType( */ expectType>( new OrchestrationClient({ - templatingConfig: { + templating: { template: [{ role: 'user', content: 'Hello!' }] }, - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: { max_tokens: 50, temperature: 0.1 } }, - filterConfig: { + filtering: { input: { filters: [ { @@ -153,7 +153,7 @@ expectError(new OrchestrationClient({}).chatCompletion()); */ expectError( new OrchestrationClient({ - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: {} } @@ -165,10 +165,10 @@ expectError( */ expectError( new OrchestrationClient({ - templatingConfig: { + templating: { template: [{ role: 'user', content: 'Hello!' }] }, - llmConfig: { + llm: { model_params: {} } }).chatCompletion() @@ -179,10 +179,10 @@ expectError( */ expectType>( new OrchestrationClient({ - templatingConfig: { + templating: { template: [{ role: 'user', content: 'Hello!' }] }, - llmConfig: { + llm: { model_name: 'gpt-35-turbo-16k', model_params: { max_tokens: 50,