diff --git a/packages/gen-ai-hub/src/utils/deployment-cache.ts b/packages/gen-ai-hub/src/utils/deployment-cache.ts index b1f85bef..3689f0a8 100644 --- a/packages/gen-ai-hub/src/utils/deployment-cache.ts +++ b/packages/gen-ai-hub/src/utils/deployment-cache.ts @@ -1,5 +1,6 @@ import { Cache } from '@sap-cloud-sdk/connectivity/internal.js'; import { type AiDeployment } from '@sap-ai-sdk/ai-core'; +import { unique } from '@sap-cloud-sdk/util'; import { type DeploymentResolutionOptions } from './deployment-resolver.js'; import { extractModel, type FoundationModel } from './model.js'; @@ -55,28 +56,46 @@ function createDeploymentCache(cache: Cache) { deployments: AiDeployment[] ): void => { // go backwards to cache the first deployment ID for each model - [...deployments].reverse().forEach(deployment => { - const model = extractModel(deployment); - const entry = transformDeploymentForCache(deployment); - cache.set(getCacheKey({ ...opts, model }), { + const cacheEntries = [...deployments] + .reverse() + .map(deployment => transformDeploymentForCache(deployment)); + + [ + ...cacheEntries, + ...getCacheEntriesForModelsWithoutVersion(cacheEntries), + ...getCacheEntriesForNoModel(cacheEntries) + ].forEach(entry => { + cache.set(getCacheKey({ ...opts, model: entry.model }), { entry }); - - if (model) { - cache.set(getCacheKey({ ...opts, model: undefined }), { entry }); - if (model.version) { - cache.set( - getCacheKey({ ...opts, model: { ...model, version: undefined } }), - { entry } - ); - } - } }); }, clear: () => cache.clear() }; } +function getCacheEntriesForModelsWithoutVersion( + cacheEntries: Deployment[] +): Deployment[] { + const modelNames = unique( + cacheEntries + .filter(({ model }) => model?.name && model.version) + .map(({ model }) => model?.name as string) + ); + + return modelNames.map(modelName => ({ + // cannot be undefined + id: cacheEntries.find(({ model }) => model?.name === modelName)!.id, + model: { name: modelName, version: undefined } + })); +} + +function getCacheEntriesForNoModel(cacheEntries: Deployment[]): Deployment[] { + return cacheEntries[0].model + ? [{ ...cacheEntries[0], model: undefined }] + : []; +} + function transformDeploymentForCache(deployment: AiDeployment): Deployment { return { id: deployment.id,