@@ -73,32 +73,53 @@ def create_langchain_model(ai_config: AIConfigKind) -> BaseChatModel:
7373
7474 model_name = model_dict .get ('name' , '' )
7575 provider = provider_dict .get ('name' , '' )
76- parameters = model_dict .get ('parameters' ) or {}
76+ parameters = dict (model_dict .get ('parameters' ) or {})
77+ mapped_provider = LangChainHelper .map_provider (provider )
78+
79+ # Bedrock requires the foundation provider (e.g. Bedrock:Anthropic) passed in
80+ # parameters separately from model_provider, which is used for LangChain routing.
81+ if mapped_provider == 'bedrock_converse' and 'provider' not in parameters :
82+ parameters ['provider' ] = provider .removeprefix ('bedrock:' )
7783
7884 return init_chat_model (
7985 model_name ,
80- model_provider = LangChainHelper . map_provider ( provider ) ,
86+ model_provider = mapped_provider ,
8187 ** parameters ,
8288 )
8389
8490 @staticmethod
85- def get_ai_metrics_from_response (response : Any ) -> LDAIMetrics :
91+ def get_ai_usage_from_response (response : Any ) -> Optional [ TokenUsage ] :
8692 """
87- Extract LaunchDarkly AI metrics from a LangChain response.
93+ Extract token usage from a LangChain response.
8894
8995 :param response: The response from a LangChain model (BaseMessage or similar)
90- :return: LDAIMetrics with success status and token usage
96+ :return: TokenUsage or None if unavailable
9197 """
92- usage : Optional [TokenUsage ] = None
98+ if hasattr (response , 'usage_metadata' ) and response .usage_metadata :
99+ return TokenUsage (
100+ total = response .usage_metadata .get ('total_tokens' , 0 ),
101+ input = response .usage_metadata .get ('input_tokens' , 0 ),
102+ output = response .usage_metadata .get ('output_tokens' , 0 ),
103+ )
93104 if hasattr (response , 'response_metadata' ) and response .response_metadata :
94105 token_usage = (
95106 response .response_metadata .get ('tokenUsage' )
96107 or response .response_metadata .get ('token_usage' )
97108 )
98109 if token_usage :
99- usage = TokenUsage (
110+ return TokenUsage (
100111 total = token_usage .get ('totalTokens' , 0 ) or token_usage .get ('total_tokens' , 0 ),
101112 input = token_usage .get ('promptTokens' , 0 ) or token_usage .get ('prompt_tokens' , 0 ),
102113 output = token_usage .get ('completionTokens' , 0 ) or token_usage .get ('completion_tokens' , 0 ),
103114 )
104- return LDAIMetrics (success = True , usage = usage )
115+ return None
116+
117+ @staticmethod
118+ def get_ai_metrics_from_response (response : Any ) -> LDAIMetrics :
119+ """
120+ Extract LaunchDarkly AI metrics from a LangChain response.
121+
122+ :param response: The response from a LangChain model (BaseMessage or similar)
123+ :return: LDAIMetrics with success status and token usage
124+ """
125+ return LDAIMetrics (success = True , usage = LangChainHelper .get_ai_usage_from_response (response ))
0 commit comments