Skip to content

Commit 9b72435

Browse files
committed
Fix LangChainHelper: add get_ai_usage_from_response, usage_metadata check, and Bedrock provider param
1 parent 61f825b commit 9b72435

1 file changed

Lines changed: 29 additions & 8 deletions

File tree

packages/ai-providers/server-ai-langchain/src/ldai_langchain/langchain_helper.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)