chemgraph-loop / src /chemgraph /models /anthropic.py
rockyaaos's picture
ChemGraph Loop: guarded real-agent API (EMT/TBLite single-point energy)
c509967 verified
Raw
History Blame Contribute Delete
2.94 kB
"""Load Anthropic models using LangChain."""
import os
from getpass import getpass
from langchain_anthropic import ChatAnthropic
from chemgraph.models.supported_models import supported_anthropic_models
from chemgraph.utils.logging_config import setup_logger
logger = setup_logger(__name__)
def load_anthropic_model(
model_name: str, temperature: float, api_key: str = None, prompt: str = None
) -> ChatAnthropic:
"""
Load an Anthropic chat model into LangChain.
Parameters
----------
model_name : str
The name of the Anthropic chat model to load. See supported_anthropic_models for list
of supported models.
temperature : float
Controls the randomness of the generated text. A higher temperature results
in more random outputs, while a lower temperature results in more deterministic outputs.
api_key : str, optional
The Anthropic API key. If not provided, the function will attempt to retrieve it
from the environment variable `ANTHROPIC_API_KEY`.
Returns
-------
ChatAnthropic
An instance of LangChain's ChatAnthropic model.
Raises
------
ValueError
If the API key is not provided and cannot be retrieved from the environment.
Notes
-----
Ensure the model_name provided is one of the supported models. Unsupported models
will result in an exception.
"""
if api_key is None:
api_key = os.getenv("ANTHROPIC_API_KEY")
if not api_key:
logger.info("Anthropic API key not found in environment variables.")
api_key = getpass("Please enter your Anthropic API key: ")
os.environ["ANTHROPIC_API_KEY"] = api_key
if model_name not in supported_anthropic_models:
raise ValueError(
f"Unsupported model '{model_name}'. Supported models are: {supported_anthropic_models}."
)
try:
logger.info(f"Loading Anthropic model: {model_name}")
llm = ChatAnthropic(
model=model_name,
temperature=temperature,
api_key=api_key,
max_tokens=6000,
)
# No guarantee that api_key is valid, authentication happens only during invocation
logger.info(f"Requested model: {model_name}")
logger.info("Anthropic model loaded successfully")
return llm
except Exception as e:
# Can remove this since authentication happens only during invocation
if "AuthenticationError" in str(e) or "invalid_api_key" in str(e):
logger.warning("Invalid Anthropic API key.")
api_key = getpass("Please enter a valid Anthropic API key: ")
os.environ["ANTHROPIC_API_KEY"] = api_key
# Retry with new API key
return load_anthropic_model(model_name, temperature, api_key, prompt)
else:
logger.error(f"Error loading Anthropic model: {str(e)}")
raise