@@ -2,6 +2,7 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models';
22import { AIMessage , HumanMessage , SystemMessage } from '@langchain/core/messages' ;
33import { initChatModel } from 'langchain/chat_models/universal' ;
44
5+ import { LDLogger } from '@launchdarkly/js-server-sdk-common' ;
56import {
67 AIProvider ,
78 ChatResponse ,
@@ -18,8 +19,8 @@ import {
1819export class LangChainProvider extends AIProvider {
1920 private _llm : BaseChatModel ;
2021
21- constructor ( llm : BaseChatModel ) {
22- super ( ) ;
22+ constructor ( llm : BaseChatModel , logger ?: LDLogger ) {
23+ super ( logger ) ;
2324 this . _llm = llm ;
2425 }
2526
@@ -30,9 +31,9 @@ export class LangChainProvider extends AIProvider {
3031 /**
3132 * Static factory method to create a LangChain AIProvider from an AI configuration.
3233 */
33- static async create ( aiConfig : LDAIConfig ) : Promise < LangChainProvider > {
34+ static async create ( aiConfig : LDAIConfig , logger ?: LDLogger ) : Promise < LangChainProvider > {
3435 const llm = await LangChainProvider . createLangChainModel ( aiConfig ) ;
35- return new LangChainProvider ( llm ) ;
36+ return new LangChainProvider ( llm , logger ) ;
3637 }
3738
3839 // =============================================================================
@@ -44,26 +45,21 @@ export class LangChainProvider extends AIProvider {
4445 */
4546 async invokeModel ( messages : LDMessage [ ] ) : Promise < ChatResponse > {
4647 // Convert LDMessage[] to LangChain messages
47- const langchainMessages = LangChainProvider . convertMessagesToLangChain ( messages ) ;
48+ const langchainMessages = LangChainProvider . convertMessagesToLangChain ( messages , this . logger ) ;
4849
4950 // Get the LangChain response
5051 const response : AIMessage = await this . _llm . invoke ( langchainMessages ) ;
5152
52- // Handle different content types from LangChain
53- let content : string ;
53+ // Extract text content from the response
54+ let content : string = '' ;
5455 if ( typeof response . content === 'string' ) {
5556 content = response . content ;
56- } else if ( Array . isArray ( response . content ) ) {
57- // Handle complex content (e.g., with images)
58- content = response . content
59- . map ( ( item : any ) => {
60- if ( typeof item === 'string' ) return item ;
61- if ( item . type === 'text' ) return item . text ;
62- return '' ;
63- } )
64- . join ( '' ) ;
6557 } else {
66- content = String ( response . content ) ;
58+ // Log warning for non-string content (likely multimodal)
59+ this . logger ?. warn (
60+ `Multimodal response not supported, expecting a string. Content type: ${ typeof response . content } , Content:` ,
61+ JSON . stringify ( response . content , null , 2 ) ,
62+ ) ;
6763 }
6864
6965 // Create the assistant message
0 commit comments