@@ -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