Skip to content

Commit 730c0cb

Browse files
committed
Hardcode the imports so that tree shaking doesn't remove needed packages
1 parent 6063c13 commit 730c0cb

File tree

1 file changed

+37
-30
lines changed

1 file changed

+37
-30
lines changed

packages/sdk/server-ai/src/api/providers/AIProviderFactory.ts

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -94,70 +94,77 @@ export class AIProviderFactory {
9494
aiConfig: LDAIConfigKind,
9595
logger?: LDLogger,
9696
): Promise<AIProvider | undefined> {
97+
let getProviderClass: () => Promise<typeof AIProvider | undefined>;
98+
9799
switch (providerType) {
98100
case 'openai':
99-
return this._createProvider(
100-
'@launchdarkly/server-sdk-ai-openai',
101-
'OpenAIProvider',
102-
aiConfig,
103-
logger,
104-
);
101+
// Lambda with hardcoded import - webpack can statically analyze this
102+
getProviderClass = async () => {
103+
// eslint-disable-next-line import/no-extraneous-dependencies
104+
const module = await import('@launchdarkly/server-sdk-ai-openai');
105+
return module.OpenAIProvider as unknown as typeof AIProvider;
106+
};
107+
break;
105108
case 'langchain':
106-
return this._createProvider(
107-
'@launchdarkly/server-sdk-ai-langchain',
108-
'LangChainProvider',
109-
aiConfig,
110-
logger,
111-
);
109+
// Lambda with hardcoded import - webpack can statically analyze this
110+
getProviderClass = async () => {
111+
// eslint-disable-next-line import/no-extraneous-dependencies
112+
const module = await import('@launchdarkly/server-sdk-ai-langchain');
113+
return module.LangChainProvider as unknown as typeof AIProvider;
114+
};
115+
break;
112116
case 'vercel':
113-
return this._createProvider(
114-
'@launchdarkly/server-sdk-ai-vercel',
115-
'VercelProvider',
116-
aiConfig,
117-
logger,
118-
);
117+
// Lambda with hardcoded import - webpack can statically analyze this
118+
getProviderClass = async () => {
119+
// eslint-disable-next-line import/no-extraneous-dependencies
120+
const module = await import('@launchdarkly/server-sdk-ai-vercel');
121+
return module.VercelProvider as unknown as typeof AIProvider;
122+
};
123+
break;
119124
default:
120125
return undefined;
121126
}
127+
128+
return this._createProvider(getProviderClass, providerType, aiConfig, logger);
122129
}
123130

124131
/**
125132
* Create a provider instance dynamically.
133+
* @param getProviderClass Lambda function that imports the module and returns the provider class
134+
* @param providerType Provider type name for error messages
135+
* @param aiConfig The AI configuration
136+
* @param logger Optional logger
126137
*/
127138
private static async _createProvider(
128-
packageName: string,
129-
providerClassName: string,
139+
getProviderClass: () => Promise<typeof AIProvider | undefined>,
140+
providerType: SupportedAIProvider,
130141
aiConfig: LDAIConfigKind,
131142
logger?: LDLogger,
132143
): Promise<AIProvider | undefined> {
133144
try {
134-
// Use dynamic import to load the provider module
135-
// This uses ESM resolution which can find packages in the user's node_modules
136-
// eslint-disable-next-line import/no-extraneous-dependencies
137-
const module = await import(packageName);
138-
const ProviderClass = module[providerClassName];
145+
const ProviderClass = await getProviderClass();
139146

140147
if (!ProviderClass) {
141-
logger?.warn(`Provider class ${providerClassName} not found in package ${packageName}`);
148+
logger?.warn(`Provider class not found for provider ${providerType}`);
142149
return undefined;
143150
}
144151

145152
const provider = await ProviderClass.create(aiConfig, logger);
146153
logger?.debug(
147-
`Successfully created AIProvider for: ${aiConfig.provider?.name} with package ${packageName}`,
154+
`Successfully created AIProvider for: ${aiConfig.provider?.name} with provider ${providerType}`,
148155
);
149156
return provider;
150157
} catch (error) {
151158
// Provide helpful error message if module is not found
152159
const err = error as Error & { code?: string };
153160
if (err.code === 'ERR_MODULE_NOT_FOUND' || err.message?.includes('Cannot find module')) {
154161
logger?.warn(
155-
`Error creating AIProvider for: ${aiConfig.provider?.name} with package ${packageName}: ${err.message}. ` +
156-
`Please install the ${packageName} package with your preferred package manager.`,
162+
`Error creating AIProvider for: ${aiConfig.provider?.name} with provider ${providerType}: ${err.message}. ` +
163+
`Please install the required package with your preferred package manager.`,
157164
);
158165
} else {
159166
logger?.warn(
160-
`Error creating AIProvider for: ${aiConfig.provider?.name} with package ${packageName}: ${error}`,
167+
`Error creating AIProvider for: ${aiConfig.provider?.name} with provider ${providerType}: ${error}`,
161168
);
162169
}
163170
return undefined;

0 commit comments

Comments
 (0)