From d67b120a4110b6ea8f5ee345f1184e6275fe1924 Mon Sep 17 00:00:00 2001 From: Joshua Sundance Bailey <84336755+joshuasundance-swca@users.noreply.github.com> Date: Fri, 22 Sep 2023 22:06:20 -0400 Subject: [PATCH] Make anthropic_api_key a secret str (#10724) This PR makes `ChatAnthropic.anthropic_api_key` a `pydantic.SecretStr` to avoid inadvertently exposing API keys when the `ChatAnthropic` object is represented as a str. --- libs/langchain/langchain/llms/anthropic.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libs/langchain/langchain/llms/anthropic.py b/libs/langchain/langchain/llms/anthropic.py index 78de75091b..c75074d64c 100644 --- a/libs/langchain/langchain/llms/anthropic.py +++ b/libs/langchain/langchain/llms/anthropic.py @@ -7,7 +7,7 @@ from langchain.callbacks.manager import ( CallbackManagerForLLMRun, ) from langchain.llms.base import LLM -from langchain.pydantic_v1 import Field, root_validator +from langchain.pydantic_v1 import Field, SecretStr, root_validator from langchain.schema.language_model import BaseLanguageModel from langchain.schema.output import GenerationChunk from langchain.schema.prompt import PromptValue @@ -45,7 +45,7 @@ class _AnthropicCommon(BaseLanguageModel): anthropic_api_url: Optional[str] = None - anthropic_api_key: Optional[str] = None + anthropic_api_key: Optional[SecretStr] = None HUMAN_PROMPT: Optional[str] = None AI_PROMPT: Optional[str] = None @@ -64,8 +64,8 @@ class _AnthropicCommon(BaseLanguageModel): @root_validator() def validate_environment(cls, values: Dict) -> Dict: """Validate that api key and python package exists in environment.""" - values["anthropic_api_key"] = get_from_dict_or_env( - values, "anthropic_api_key", "ANTHROPIC_API_KEY" + values["anthropic_api_key"] = SecretStr( + get_from_dict_or_env(values, "anthropic_api_key", "ANTHROPIC_API_KEY") ) # Get custom api url from environment. values["anthropic_api_url"] = get_from_dict_or_env( @@ -81,12 +81,12 @@ class _AnthropicCommon(BaseLanguageModel): check_package_version("anthropic", gte_version="0.3") values["client"] = anthropic.Anthropic( base_url=values["anthropic_api_url"], - api_key=values["anthropic_api_key"], + api_key=values["anthropic_api_key"].get_secret_value(), timeout=values["default_request_timeout"], ) values["async_client"] = anthropic.AsyncAnthropic( base_url=values["anthropic_api_url"], - api_key=values["anthropic_api_key"], + api_key=values["anthropic_api_key"].get_secret_value(), timeout=values["default_request_timeout"], ) values["HUMAN_PROMPT"] = anthropic.HUMAN_PROMPT