From 932979072e03be87004bd75d1ae10f2f5ae8fcc6 Mon Sep 17 00:00:00 2001 From: jsonbailey Date: Fri, 24 Oct 2025 20:59:54 +0000 Subject: [PATCH 1/2] fix: Fix default configs always being disabled --- .../__tests__/LDAIClientImpl.test.ts | 26 ++++++++++--- packages/sdk/server-ai/src/LDAIClientImpl.ts | 37 +++++++++++++++---- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/packages/sdk/server-ai/__tests__/LDAIClientImpl.test.ts b/packages/sdk/server-ai/__tests__/LDAIClientImpl.test.ts index 31ca3dd0ed..6badffd94a 100644 --- a/packages/sdk/server-ai/__tests__/LDAIClientImpl.test.ts +++ b/packages/sdk/server-ai/__tests__/LDAIClientImpl.test.ts @@ -127,7 +127,14 @@ it('passes the default value to the underlying client', async () => { enabled: true, }; - mockLdClient.variation.mockResolvedValue(defaultValue); + const expectedLDFlagValue = { + _ldMeta: { enabled: true }, + model: defaultValue.model, + messages: defaultValue.messages, + provider: defaultValue.provider, + }; + + mockLdClient.variation.mockResolvedValue(expectedLDFlagValue); const result = await client.config(key, testContext, defaultValue); @@ -136,11 +143,11 @@ it('passes the default value to the underlying client', async () => { messages: defaultValue.messages, provider: defaultValue.provider, tracker: expect.any(Object), - enabled: false, + enabled: defaultValue.enabled, toVercelAISDK: expect.any(Function), }); - expect(mockLdClient.variation).toHaveBeenCalledWith(key, testContext, defaultValue); + expect(mockLdClient.variation).toHaveBeenCalledWith(key, testContext, expectedLDFlagValue); }); // New agent-related tests @@ -253,7 +260,14 @@ it('passes the default value to the underlying client for single agent', async ( enabled: true, }; - mockLdClient.variation.mockResolvedValue(defaultValue); + const expectedLDFlagValue = { + _ldMeta: { enabled: defaultValue.enabled }, + model: defaultValue.model, + provider: defaultValue.provider, + instructions: defaultValue.instructions, + }; + + mockLdClient.variation.mockResolvedValue(expectedLDFlagValue); const result = await client.agent(key, testContext, defaultValue); @@ -262,10 +276,10 @@ it('passes the default value to the underlying client for single agent', async ( instructions: defaultValue.instructions, provider: defaultValue.provider, tracker: expect.any(Object), - enabled: false, + enabled: defaultValue.enabled, }); - expect(mockLdClient.variation).toHaveBeenCalledWith(key, testContext, defaultValue); + expect(mockLdClient.variation).toHaveBeenCalledWith(key, testContext, expectedLDFlagValue); }); it('returns multiple agents config with interpolated instructions', async () => { diff --git a/packages/sdk/server-ai/src/LDAIClientImpl.ts b/packages/sdk/server-ai/src/LDAIClientImpl.ts index 4a4c5e0d23..fadfb95783 100644 --- a/packages/sdk/server-ai/src/LDAIClientImpl.ts +++ b/packages/sdk/server-ai/src/LDAIClientImpl.ts @@ -69,12 +69,31 @@ export class LDAIClientImpl implements LDAIClient { return Mustache.render(template, variables, undefined, { escape: (item: any) => item }); } + private _toLDFlagValue(defaultValue: LDAIDefaults | LDAIAgentDefaults): { + _ldMeta: { enabled: boolean }; + model?: LDModelConfig; + messages?: LDMessage[]; + provider?: LDProviderConfig; + instructions?: string; + } { + return { + _ldMeta: { enabled: defaultValue.enabled ?? false }, + model: defaultValue.model, + messages: 'messages' in defaultValue ? defaultValue.messages : undefined, + provider: defaultValue.provider, + instructions: 'instructions' in defaultValue ? defaultValue.instructions : undefined, + }; + } + private async _evaluate( key: string, context: LDContext, defaultValue: LDAIDefaults, ): Promise { - const value: VariationContent = await this._ldClient.variation(key, context, defaultValue); + // Convert default value to LDFlagValue format + const ldFlagValue = this._toLDFlagValue(defaultValue); + + const value: VariationContent = await this._ldClient.variation(key, context, ldFlagValue); const tracker = new LDAIConfigTrackerImpl( this._ldClient, @@ -109,11 +128,13 @@ export class LDAIClientImpl implements LDAIClient { defaultValue: LDAIAgentDefaults, variables?: Record, ): Promise { - const { tracker, enabled, model, provider, instructions } = await this._evaluate( - key, - context, - defaultValue, - ); + const { + tracker, + enabled, + model, + provider: configProvider, + instructions, + } = await this._evaluate(key, context, defaultValue); const agent: LDAIAgent = { tracker, @@ -126,8 +147,8 @@ export class LDAIClientImpl implements LDAIClient { agent.model = { ...model }; } - if (provider) { - agent.provider = { ...provider }; + if (configProvider) { + agent.provider = { ...configProvider }; } const allVariables = { ...variables, ldctx: context }; From 4be19fa2747aeebcad9b9f7eba87d8bf6548da7a Mon Sep 17 00:00:00 2001 From: jsonbailey Date: Fri, 24 Oct 2025 21:56:50 +0000 Subject: [PATCH 2/2] make method static --- packages/sdk/server-ai/src/LDAIClientImpl.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/sdk/server-ai/src/LDAIClientImpl.ts b/packages/sdk/server-ai/src/LDAIClientImpl.ts index fadfb95783..edac548100 100644 --- a/packages/sdk/server-ai/src/LDAIClientImpl.ts +++ b/packages/sdk/server-ai/src/LDAIClientImpl.ts @@ -69,7 +69,7 @@ export class LDAIClientImpl implements LDAIClient { return Mustache.render(template, variables, undefined, { escape: (item: any) => item }); } - private _toLDFlagValue(defaultValue: LDAIDefaults | LDAIAgentDefaults): { + private static _toLDFlagValue(defaultValue: LDAIDefaults | LDAIAgentDefaults): { _ldMeta: { enabled: boolean }; model?: LDModelConfig; messages?: LDMessage[]; @@ -91,7 +91,8 @@ export class LDAIClientImpl implements LDAIClient { defaultValue: LDAIDefaults, ): Promise { // Convert default value to LDFlagValue format - const ldFlagValue = this._toLDFlagValue(defaultValue); + // eslint-disable-next-line no-underscore-dangle + const ldFlagValue = LDAIClientImpl._toLDFlagValue(defaultValue); const value: VariationContent = await this._ldClient.variation(key, context, ldFlagValue);