Skip to content

Commit fa9a7f8

Browse files
evcyencursoragent
authored andcommitted
Fix #142: treat blank API keys in .env as unset
- Normalize any env var ending in _API_KEY (or HF_TOKEN) when value is blank/whitespace - Add tests for blank, whitespace-only, and generic *_API_KEY behavior Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 024ebf1 commit fa9a7f8

2 files changed

Lines changed: 44 additions & 0 deletions

File tree

safetytooling/utils/utils.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@ def setup_environment(
6464
os.environ["ANTHROPIC_API_KEY"] = os.environ[anthropic_tag]
6565
if openrouter_tag in os.environ:
6666
os.environ["OPENROUTER_API_KEY"] = os.environ[openrouter_tag]
67+
68+
# Blank values in .env are loaded as ""; treat any var ending in _API_KEY or HF_TOKEN as unset.
69+
_other_secret_env_vars = ("HF_TOKEN",)
70+
for key in list(os.environ):
71+
if (key.endswith("_API_KEY") or key in _other_secret_env_vars) and (
72+
(os.environ[key] or "").strip() == ""
73+
):
74+
del os.environ[key]
75+
6776
# warn if we do not have an openai api key
6877
if "OPENAI_API_KEY" not in os.environ:
6978
LOGGER.warning("OPENAI_API_KEY not found in environment, OpenAI API will not be available")

tests/test_utils.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import os
2+
from unittest.mock import patch
3+
4+
from safetytooling.utils import utils
5+
6+
7+
def test_setup_environment_treats_blank_api_keys_as_unset():
8+
with patch("safetytooling.utils.utils.dotenv.load_dotenv", return_value=True):
9+
os.environ["TOGETHER_API_KEY"] = ""
10+
try:
11+
utils.setup_environment()
12+
# Should be removed so downstream code gets None, not ""
13+
assert "TOGETHER_API_KEY" not in os.environ
14+
finally:
15+
os.environ.pop("TOGETHER_API_KEY", None)
16+
17+
18+
def test_setup_environment_treats_whitespace_only_api_keys_as_unset():
19+
with patch("safetytooling.utils.utils.dotenv.load_dotenv", return_value=True):
20+
os.environ["TOGETHER_API_KEY"] = " \t "
21+
try:
22+
utils.setup_environment()
23+
assert "TOGETHER_API_KEY" not in os.environ
24+
finally:
25+
os.environ.pop("TOGETHER_API_KEY", None)
26+
27+
28+
def test_setup_environment_normalizes_any_var_ending_in_api_key():
29+
with patch("safetytooling.utils.utils.dotenv.load_dotenv", return_value=True):
30+
os.environ["SOME_FUTURE_API_KEY"] = ""
31+
try:
32+
utils.setup_environment()
33+
assert "SOME_FUTURE_API_KEY" not in os.environ
34+
finally:
35+
os.environ.pop("SOME_FUTURE_API_KEY", None)

0 commit comments

Comments
 (0)