TradingAgents/tradingagents/llm_clients/bedrock_client.py

57 lines
2.0 KiB
Python

from typing import Any, Optional
from langchain_aws import ChatBedrockConverse
from .base_client import BaseLLMClient
class BedrockClient(BaseLLMClient):
"""Client for Amazon Bedrock models.
Supports any model available on Bedrock via IAM Role (no API key needed),
including Claude, Amazon Nova, Kimi, Qwen, GLM, DeepSeek, MiniMax, and more.
Authentication:
Uses boto3 default credential chain: IAM Role (EC2/Lambda), environment
variables (AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY), or ~/.aws/credentials.
Model ID formats:
- Cross-region inference profile (recommended):
``global.anthropic.claude-sonnet-4-6``
``eu.anthropic.claude-3-5-sonnet-20240620-v1:0``
- Direct on-demand (us-east-1 default region only):
``amazon.nova-lite-v1:0``
``moonshotai.kimi-k2.5``
``qwen.qwen3-32b-v1:0``
``zai.glm-4.7-flash``
``deepseek.v3.2``
Note:
When specifying a non-default ``region_name``, use region-specific
inference profile IDs (e.g. ``us-west-2.anthropic.claude-...``),
as direct model IDs only support on-demand throughput in us-east-1.
Example::
config["llm_provider"] = "bedrock"
config["deep_think_llm"] = "global.anthropic.claude-sonnet-4-6"
config["quick_think_llm"] = "amazon.nova-micro-v1:0"
"""
def __init__(self, model: str, base_url: Optional[str] = None, **kwargs):
super().__init__(model, base_url, **kwargs)
def get_llm(self) -> Any:
"""Return configured ChatBedrockConverse instance."""
llm_kwargs: dict = {"model_id": self.model}
for key in ("region_name", "max_tokens", "callbacks", "timeout"):
if key in self.kwargs:
llm_kwargs[key] = self.kwargs[key]
return ChatBedrockConverse(**llm_kwargs)
def validate_model(self) -> bool:
"""Bedrock model IDs are dynamic; skip static validation."""
return True