Skip to content

Commit d63ceb6

Browse files
authored
Refactor: use SecretStr for StochasticAI llms (langchain-ai#15118)
1 parent 674fde8 commit d63ceb6

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

libs/community/langchain_community/llms/stochasticai.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import requests
66
from langchain_core.callbacks import CallbackManagerForLLMRun
77
from langchain_core.language_models.llms import LLM
8-
from langchain_core.pydantic_v1 import Extra, Field, root_validator
9-
from langchain_core.utils import get_from_dict_or_env
8+
from langchain_core.pydantic_v1 import Extra, Field, SecretStr, root_validator
9+
from langchain_core.utils import convert_to_secret_str, get_from_dict_or_env
1010

1111
from langchain_community.llms.utils import enforce_stop_tokens
1212

@@ -33,7 +33,7 @@ class StochasticAI(LLM):
3333
"""Holds any model parameters valid for `create` call not
3434
explicitly specified."""
3535

36-
stochasticai_api_key: Optional[str] = None
36+
stochasticai_api_key: Optional[SecretStr] = None
3737

3838
class Config:
3939
"""Configuration for this pydantic object."""
@@ -61,8 +61,8 @@ def build_extra(cls, values: Dict[str, Any]) -> Dict[str, Any]:
6161
@root_validator()
6262
def validate_environment(cls, values: Dict) -> Dict:
6363
"""Validate that api key exists in environment."""
64-
stochasticai_api_key = get_from_dict_or_env(
65-
values, "stochasticai_api_key", "STOCHASTICAI_API_KEY"
64+
stochasticai_api_key = convert_to_secret_str(
65+
get_from_dict_or_env(values, "stochasticai_api_key", "STOCHASTICAI_API_KEY")
6666
)
6767
values["stochasticai_api_key"] = stochasticai_api_key
6868
return values
@@ -107,7 +107,7 @@ def _call(
107107
url=self.api_url,
108108
json={"prompt": prompt, "params": params},
109109
headers={
110-
"apiKey": f"{self.stochasticai_api_key}",
110+
"apiKey": f"{self.stochasticai_api_key.get_secret_value()}",
111111
"Accept": "application/json",
112112
"Content-Type": "application/json",
113113
},
@@ -119,7 +119,7 @@ def _call(
119119
response_get = requests.get(
120120
url=response_post_json["data"]["responseUrl"],
121121
headers={
122-
"apiKey": f"{self.stochasticai_api_key}",
122+
"apiKey": f"{self.stochasticai_api_key.get_secret_value()}",
123123
"Accept": "application/json",
124124
"Content-Type": "application/json",
125125
},
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from langchain_core.pydantic_v1 import SecretStr
2+
from pytest import CaptureFixture
3+
4+
from langchain_community.llms.stochasticai import StochasticAI
5+
6+
7+
def test_api_key_is_string() -> None:
8+
llm = StochasticAI(stochasticai_api_key="secret-api-key")
9+
assert isinstance(llm.stochasticai_api_key, SecretStr)
10+
11+
12+
def test_api_key_masked_when_passed_via_constructor(
13+
capsys: CaptureFixture,
14+
) -> None:
15+
llm = StochasticAI(stochasticai_api_key="secret-api-key")
16+
print(llm.stochasticai_api_key, end="")
17+
captured = capsys.readouterr()
18+
19+
assert captured.out == "**********"

0 commit comments

Comments
 (0)