11"""LangChain implementation of AIProvider for LaunchDarkly AI SDK."""
22
3+ from tokenize import Token
34from typing import Any , Dict , List , Optional , Union
45
56from langchain_core .language_models .chat_models import BaseChatModel
@@ -107,11 +108,10 @@ async def invoke_structured_model(
107108 if raw_response is not None :
108109 if hasattr (raw_response , 'content' ):
109110 structured_response .raw_response = raw_response .content
110- structured_response .metrics = LangChainProvider .get_ai_metrics_from_response (raw_response )
111+ structured_response .metrics . usage = LangChainProvider .get_ai_usage_from_response (raw_response )
111112
112113 if response .get ('parsing_error' ):
113114 log .warning (f'LangChain structured model invocation had a parsing error' )
114- structured_response .metrics .success = False
115115 return structured_response
116116
117117 structured_response .metrics .success = True
@@ -147,24 +147,14 @@ def map_provider(ld_provider_name: str) -> str:
147147 'bedrock' : 'bedrock_converse' ,
148148 }
149149 return mapping .get (lowercased_name , lowercased_name )
150-
150+
151151 @staticmethod
152- def get_ai_metrics_from_response (response : BaseMessage ) -> LDAIMetrics :
152+ def get_ai_usage_from_response (response : BaseMessage ) -> TokenUsage :
153153 """
154- Get AI metrics from a LangChain provider response.
155-
156- This method extracts token usage information and success status from LangChain responses
157- and returns a LaunchDarkly AIMetrics object.
154+ Get token usage from a LangChain provider response.
158155
159156 :param response: The response from the LangChain model
160- :return: LDAIMetrics with success status and token usage
161-
162- Example:
163- # Use with tracker.track_metrics_of for automatic tracking
164- response = await tracker.track_metrics_of(
165- lambda: llm.ainvoke(messages),
166- LangChainProvider.get_ai_metrics_from_response
167- )
157+ :return: TokenUsage with success status and token usage
168158 """
169159 # Extract token usage if available
170160 usage : Optional [TokenUsage ] = None
@@ -183,6 +173,29 @@ def get_ai_metrics_from_response(response: BaseMessage) -> LDAIMetrics:
183173 output = token_usage .get ('completionTokens' , 0 ) or token_usage .get ('completion_tokens' , 0 ),
184174 )
185175
176+ return usage
177+
178+ @staticmethod
179+ def get_ai_metrics_from_response (response : BaseMessage ) -> LDAIMetrics :
180+ """
181+ Get AI metrics from a LangChain provider response.
182+
183+ This method extracts token usage information and success status from LangChain responses
184+ and returns a LaunchDarkly AIMetrics object.
185+
186+ :param response: The response from the LangChain model
187+ :return: LDAIMetrics with success status and token usage
188+
189+ Example:
190+ # Use with tracker.track_metrics_of for automatic tracking
191+ response = await tracker.track_metrics_of(
192+ lambda: llm.ainvoke(messages),
193+ LangChainProvider.get_ai_metrics_from_response
194+ )
195+ """
196+ # Extract token usage if available
197+ usage = LangChainProvider .get_ai_usage_from_response (response )
198+
186199 return LDAIMetrics (success = True , usage = usage )
187200
188201 @staticmethod
@@ -238,7 +251,7 @@ def create_langchain_model(ai_config: AIConfigKind) -> BaseChatModel:
238251 # Bedrock requires the foundation provider (e.g. Bedrock:Anthropic) passed in
239252 # parameters separately from model_provider, which is used for LangChain routing.
240253 if mapped_provider == 'bedrock_converse' and 'provider' not in parameters :
241- parameters ['provider' ] = provider
254+ parameters ['provider' ] = provider . removeprefix ( 'bedrock:' )
242255 return init_chat_model (
243256 model_name ,
244257 model_provider = mapped_provider ,
0 commit comments