Free lesson · GenAI Agent Engineering
ಸುರಕ್ಷಿತ API key ನಿರ್ವಹಣೆ
ನೀವು .env ಫೈಲ್ಗಳು + python-dotenv + .gitignore ಪ್ಯಾಟರ್ನ್ಗಳನ್ನು ಬಳಸಿ LLM API key ಗಳನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಸಂಗ್ರಹಿಸಬಹುದು, ಇದರಿಂದ ರಹಸ್ಯಗಳು (secrets) ಎಂದಿಗೂ version control ಗೆ ಪ್ರವೇಶಿಸುವುದಿಲ್ಲ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಬಹುದು.
Course: GenAI Agent Engineering · Chapter 1 · The Dev Environment
Free to read — no subscription required.
ಪರಿಚಯ
ನೀವು API ಕೀಯನ್ನು ಸೋರ್ಸ್ನಲ್ಲಿ ಹಾರ್ಡ್ಕೋಡ್ ಮಾಡಿ GitHub ಗೆ ಪುಶ್ ಮಾಡಿದಾಗ, ಸ್ವಯಂಚಾಲಿತ ಸ್ಕ್ಯಾನರ್ಗಳು ಸಾಮಾನ್ಯವಾಗಿ 30 ಸೆಕೆಂಡುಗಳೊಳಗೆ ಅದನ್ನು ಕಂಡುಹಿಡಿಯುತ್ತವೆ — ಮತ್ತು ಒಂದೇ ಒಂದು ಸೋರಿಕೆಯಾದ LLM ಕೀ, ಡೆವಲಪರ್ ಗಮನಿಸುವ ಮೊದಲೇ ಐದು-ಅಂಕಿಯ ಬಿಲ್ಗಳನ್ನು ಉಂಟುಮಾಡಿದೆ. ಏಜೆಂಟ್ ಕೋಡ್ ವಿಶೇಷವಾಗಿ ಅಪಾಯಕ್ಕೆ ಒಡ್ಡಿಕೊಂಡಿರುತ್ತದೆ, ಏಕೆಂದರೆ ಅದು ಸಾಮಾನ್ಯವಾಗಿ ಹಲವು ಪ್ರೊವೈಡರ್ ಕೀಗಳನ್ನು (OpenAI, Anthropic, Google) ಒಂದೇ ಸಮಯದಲ್ಲಿ ಹೊಂದಿರುತ್ತದೆ. ಈ ಪಾಠದ ಕೊನೆಯಲ್ಲಿ, ನೀವು ಆ ಕೀಗಳನ್ನು ಸೋರ್ಸ್ ಕಂಟ್ರೋಲ್ನಿಂದ ಹೊರಗಿಡಲು, python-dotenv ಬಳಸಿ ರನ್ಟೈಮ್ನಲ್ಲಿ ಸುರಕ್ಷಿತವಾಗಿ ಲೋಡ್ ಮಾಡಲು, ಮತ್ತು ಒಂದು ಕೀ ಕಾಣೆಯಾದಾಗ ಸ್ಟಾರ್ಟ್ಅಪ್ನಲ್ಲಿಯೇ ತಕ್ಷಣ ವಿಫಲಗೊಳಿಸಲು ಸಮರ್ಥರಾಗುತ್ತೀರಿ.
ಪ್ರಮುಖ ಪರಿಭಾಷೆ
- .env ಫೈಲ್ — ನಿಜವಾದ ರಹಸ್ಯಗಳನ್ನು ಹೊಂದಿರುವ
KEY=valueಜೋಡಿಗಳ ಸರಳ-ಪಠ್ಯ ಫೈಲ್; ಇದು ಡೆವಲಪರ್ನ ಯಂತ್ರದಲ್ಲಿ ಇರುತ್ತದೆ ಮತ್ತು Git ನಿಂದ ಹೊರಗಿಡಲಾಗಿರುತ್ತದೆ, ಇದೇ ಕೀಗಳನ್ನು ಖಾಸಗಿಯಾಗಿ ಇರಿಸುವುದು. - .env.example — ಪ್ಲೇಸ್ಹೋಲ್ಡರ್ ಮೌಲ್ಯಗಳೊಂದಿಗೆ ಅದೇ ಕೀಗಳ ಕಮಿಟ್ ಮಾಡಲಾದ ಟೆಂಪ್ಲೇಟ್; ಯಾವುದೇ ನಿಜವಾದ ಕ್ರೆಡೆನ್ಶಿಯಲ್ಗಳನ್ನು ಬಹಿರಂಗಪಡಿಸದೆ ಏಜೆಂಟ್ಗೆ ಯಾವ ವೇರಿಯಬಲ್ಗಳು ಬೇಕು ಎಂಬುದನ್ನು ಇದು ದಾಖಲಿಸುತ್ತದೆ.
- python-dotenv — ಸ್ಟಾರ್ಟ್ಅಪ್ನಲ್ಲಿ
.envಫೈಲ್ ಅನ್ನು ಓದಿ ಅದರ ಮೌಲ್ಯಗಳನ್ನುos.environಗೆ ಸೇರಿಸುವ ಲೈಬ್ರರಿ, ಇದರಿಂದ ಅಪ್ಲಿಕೇಶನ್ ಕೋಡ್ ಅವುಗಳನ್ನುos.getenv()ಮೂಲಕ ಓದಬಹುದು. - ಸ್ಟಾರ್ಟ್ಅಪ್ ವ್ಯಾಲಿಡೇಶನ್ — ಪ್ರೋಗ್ರಾಂ ಪ್ರಾರಂಭದಲ್ಲಿ ಪ್ರತಿ ಅಗತ್ಯ ವೇರಿಯಬಲ್ ಇದೆಯೇ ಎಂದು ಸ್ಪಷ್ಟವಾಗಿ ಪರಿಶೀಲಿಸುವುದು; ಇದು ಮೌನವಾದ ತಪ್ಪು-ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ತಕ್ಷಣದ, ಡೀಬಗ್ ಮಾಡಬಹುದಾದ ದೋಷವಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ.
- Pydantic
BaseSettings—.envನಿಂದ ವೇರಿಯಬಲ್ಗಳನ್ನು ಲೋಡ್ ಮಾಡಿ, ಘೋಷಿತ ಟೈಪ್ಗಳಿಗೆ ಪರಿವರ್ತಿಸಿ, ಮತ್ತು ಇನ್ಸ್ಟಾನ್ಶಿಯೇಶನ್ ಸಮಯದಲ್ಲಿ ಕಾಣೆಯಾದ ಅಥವಾ ತಪ್ಪಾದ ಮೌಲ್ಯಗಳನ್ನು ತಿರಸ್ಕರಿಸುವ ಟೈಪ್ ಮಾಡಿದ ಕಾನ್ಫಿಗರೇಶನ್ ಕಂಟೇನರ್.
ಪರಿಕಲ್ಪನೆಗಳು
ಹಾರ್ಡ್ಕೋಡ್ ಮಾಡಿದ ಕೀಗಳು ಏಕೆ ವಿಫಲವಾಗುತ್ತವೆ
ಸಾರ್ವಜನಿಕ Git ಇತಿಹಾಸ ಶಾಶ್ವತವಾದುದು — ಅಳಿಸಿದ ಕಮಿಟ್ ಕೂಡ reflog ಮತ್ತು ಫೋರ್ಕ್ಗಳ ಮೂಲಕ ತಲುಪಬಹುದಾಗಿರುತ್ತದೆ. ಸ್ಕ್ಯಾನರ್ ಬಾಟ್ಗಳು GitHub ನ ಈವೆಂಟ್ ಫೈರ್ಹೋಸ್ ಅನ್ನು ಗಮನಿಸುತ್ತಿರುತ್ತವೆ ಮತ್ತು ಸೋರಿಕೆಯಾದ ಪ್ರತಿ ಕೀಯನ್ನು ಸೆಕೆಂಡುಗಳೊಳಗೆ ಪ್ರಯತ್ನಿಸುತ್ತವೆ. ಹಲವು ಪ್ರೊವೈಡರ್ ಕೀಗಳನ್ನು ಹೊಂದಿರುವ ಏಜೆಂಟ್ಗಳಿಗೆ, ಒಂದು ಸೋರಿಕೆಯು ಎಲ್ಲಾ ಪ್ರೊವೈಡರ್ಗಳನ್ನು ಒಂದೇ ಬಾರಿಗೆ ಅಪಾಯಕ್ಕೆ ಸಿಲುಕಿಸುತ್ತದೆ.
.env / .env.example ವಿಭಜನೆ
ಎರಡು ಫೈಲ್ಗಳು, ಒಂದೇ ಉದ್ದೇಶ: .env.example ಕಮಿಟ್ ಮಾಡಲಾಗಿರುತ್ತದೆ ಮತ್ತು ಏಜೆಂಟ್ಗೆ ಬೇಕಾದ ಪ್ರತಿ ವೇರಿಯಬಲ್ ಅನ್ನು ಪ್ಲೇಸ್ಹೋಲ್ಡರ್ ಮೌಲ್ಯಗಳೊಂದಿಗೆ ಪಟ್ಟಿ ಮಾಡುತ್ತದೆ; .env ಅನ್ನು gitignore ಮಾಡಲಾಗಿರುತ್ತದೆ ಮತ್ತು ಅದು ನಿಜವಾದ ರಹಸ್ಯಗಳನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಹೊಸ ಕಾಂಟ್ರಿಬ್ಯೂಟರ್ಗಳು ಟೆಂಪ್ಲೇಟ್ ಅನ್ನು ನಕಲಿಸಿ, ತಮ್ಮದೇ ಕೀಗಳನ್ನು ಭರ್ತಿ ಮಾಡುತ್ತಾರೆ, ಮತ್ತು ಯಾವುದೇ ಕಮಿಟ್ಗೆ ಮೊದಲು git check-ignore .env ಆ ಫೈಲ್ ಹೊರಗಿಡಲಾಗಿದೆ ಎಂದು ದೃಢೀಕರಿಸುತ್ತದೆ.
ಒಮ್ಮೆ ಲೋಡ್ ಮಾಡಿ, ಸ್ಟಾರ್ಟ್ಅಪ್ನಲ್ಲಿ ವ್ಯಾಲಿಡೇಟ್ ಮಾಡಿ
python-dotenv .env ಅನ್ನು os.environ ಗೆ ಓದುತ್ತದೆ, ಇದರಿಂದ ಉಳಿದ ಕೋಡ್ ಕೇವಲ ಎನ್ವಿರಾನ್ಮೆಂಟ್ ವೇರಿಯಬಲ್ಗಳನ್ನು ಮಾತ್ರ ನೋಡುತ್ತದೆ — ಅದೇ ಕೋಡ್ ಪಾತ್ ಸ್ಥಳೀಯವಾಗಿ, CI ಯಲ್ಲಿ, ಮತ್ತು ಪ್ರೊಡಕ್ಷನ್ನಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ. ಲೋಡ್ ಜೊತೆಗೆ ಸ್ಪಷ್ಟವಾದ ಅಗತ್ಯ-ವೇರಿಯಬಲ್ ಪರಿಶೀಲನೆಯನ್ನು ಜೋಡಿಸುವುದು, ಕಾಣೆಯಾದ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ವಿನಂತಿಯ ಮಧ್ಯದಲ್ಲಿ ಗೊಂದಲಮಯ 401 ಆಗುವ ಬದಲು ಬೂಟ್ ಸಮಯದಲ್ಲಿ ಸ್ಪಷ್ಟ ವೈಫಲ್ಯವಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ (ಕೋಡ್ ವಾಕ್ಥ್ರೂ ನೋಡಿ).
Pydantic ಜೊತೆ ಟೈಪ್ ಮಾಡಿದ ಸೆಟ್ಟಿಂಗ್ಗಳು
ದೊಡ್ಡ ಏಜೆಂಟ್ಗಳಿಗೆ, pydantic_settings.BaseSettings ಟೈಪ್ ಪರಿವರ್ತನೆ (int, float, bool), ಅಗತ್ಯ-ಫೀಲ್ಡ್ ಜಾರಿ, ಮತ್ತು ಒಂದೇ ಕ್ಯಾಶ್ ಮಾಡಿದ Settings ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಸೇರಿಸುತ್ತದೆ. ಇದು ಚದುರಿದ os.getenv() ಕರೆಗಳನ್ನು ಒಂದೇ ವ್ಯಾಲಿಡೇಟ್ ಮಾಡಿದ ಆಬ್ಜೆಕ್ಟ್ನಿಂದ ಬದಲಾಯಿಸುತ್ತದೆ, ಯಾವುದೇ ಅಗತ್ಯ ಕೀ ಇಲ್ಲದಿದ್ದರೆ ಅಥವಾ ತಪ್ಪಾಗಿದ್ದರೆ ಅದು ಸ್ಟಾರ್ಟ್ಅಪ್ನಲ್ಲಿಯೇ ವಿಫಲವಾಗುತ್ತದೆ.
ಕೋಡ್ ವಾಕ್ಥ್ರೂ
ಈ ವಾಕ್ಥ್ರೂ ಮೂರು ರನ್ಟೈಮ್ ಪರಿಕಲ್ಪನೆಗಳನ್ನು — .env ಲೋಡ್ ಮಾಡುವುದು, ಅಗತ್ಯ ಕೀಗಳನ್ನು ವ್ಯಾಲಿಡೇಟ್ ಮಾಡುವುದು, ಮತ್ತು ಟೈಪ್ ಮಾಡಿದ ಸೆಟ್ಟಿಂಗ್ಗಳ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಒದಗಿಸುವುದು — ನಿಮ್ಮ ಏಜೆಂಟ್ನ ಎಂಟ್ರಿ ಪಾಯಿಂಟ್ ಇಂಪೋರ್ಟ್ ಮಾಡಬಹುದಾದ ಒಂದು ಸುಸಂಬದ್ಧ ಪ್ಯಾಟರ್ನ್ನಲ್ಲಿ ಸಂಯೋಜಿಸುತ್ತದೆ.
Code snippetpython
1import os 2from functools import lru_cache 3from dotenv import load_dotenv, find_dotenv 4from pydantic_settings import BaseSettings 5from pydantic import Field 6 7load_dotenv(find_dotenv()) 8 9def validate_environment() -> None: 10 required = ["OPENAI_API_KEY", "ANTHROPIC_API_KEY"] 11 missing = [v for v in required if not os.getenv(v)] 12 if missing: 13 raise EnvironmentError( 14 f"Missing required environment variables: {', '.join(missing)}. " 15 f"Copy .env.example to .env and fill in your values." 16 ) 17 18class Settings(BaseSettings): 19 openai_api_key: str = Field(..., alias="OPENAI_API_KEY") 20 anthropic_api_key: str = Field(..., alias="ANTHROPIC_API_KEY") 21 default_model: str = Field("gpt-4o", alias="DEFAULT_MODEL") 22 max_iterations: int = Field(10, alias="AGENT_MAX_ITERATIONS") 23 24 class Config: 25 env_file = ".env" 26 case_sensitive = False 27 28@lru_cache() 29def get_settings() -> Settings: 30 return Settings() 31 32if __name__ == "__main__": 33 validate_environment() 34 settings = get_settings() 35 print(f"Loaded config, default model: {settings.default_model}")
load_dotenv(find_dotenv())ಪ್ರಸ್ತುತ ಡೈರೆಕ್ಟರಿಯಿಂದ ಮೇಲಕ್ಕೆ.envಸಿಗುವವರೆಗೆ ಹುಡುಕುತ್ತದೆ, ಇದರಿಂದ ಅದೇ ಕೋಡ್ ಯಾವುದೇ ವರ್ಕಿಂಗ್ ಡೈರೆಕ್ಟರಿಯಿಂದ ಕೆಲಸ ಮಾಡುತ್ತದೆ.validate_environment()ಯಾವುದೇ API ಕರೆಗೆ ಮೊದಲು ರನ್ ಆಗುತ್ತದೆ; ಕಾಣೆಯಾದ ಕೀ ನಂತರ 401 ಆಗಿ ವಿಫಲವಾಗುವ ಬದಲು, ಸರಿಪಡಿಸುವ ಸುಳಿವಿನೊಂದಿಗೆ ತಕ್ಷಣವೇ ದೋಷವನ್ನು ಎಸೆಯುತ್ತದೆ.Settingsಪ್ರತಿ ವೇರಿಯಬಲ್ ಅನ್ನು ಅದರ ಟೈಪ್ ಮತ್ತು ಅಗತ್ಯ/ಐಚ್ಛಿಕ ಸ್ಥಿತಿಯೊಂದಿಗೆ ಘೋಷಿಸುತ್ತದೆ — PydanticAGENT_MAX_ITERATIONS="10"ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿintಗೆ ಪರಿವರ್ತಿಸುತ್ತದೆ ಮತ್ತು ಅಗತ್ಯ ಫೀಲ್ಡ್ ಇಲ್ಲದಿದ್ದರೆ ಇನ್ಸ್ಟಾನ್ಶಿಯೇಟ್ ಆಗಲು ನಿರಾಕರಿಸುತ್ತದೆ.get_settings()ಮೇಲಿನ@lru_cache()ಉಳಿದ ಕೋಡ್ಬೇಸ್ಗೆ ಒಂದೇ ಹಂಚಿಕೊಂಡSettingsಇನ್ಸ್ಟಾನ್ಸ್ ಅನ್ನು ನೀಡುತ್ತದೆ.
ಸಂಪೂರ್ಣ .env ಜೊತೆ ಸ್ಕ್ರಿಪ್ಟ್ ರನ್ ಮಾಡಿದಾಗ ಡೀಫಾಲ್ಟ್ ಮಾಡೆಲ್ ಪ್ರಿಂಟ್ ಆದರೆ, ಮತ್ತು OPENAI_API_KEY ತೆಗೆದು ರನ್ ಮಾಡಿದಾಗ ರನ್ಟೈಮ್ API ವೈಫಲ್ಯವಲ್ಲದೆ "Missing required environment variables" ದೋಷದೊಂದಿಗೆ ತಕ್ಷಣ ನಿರ್ಗಮಿಸಿದರೆ, ಅದು ಕೆಲಸ ಮಾಡುತ್ತಿದೆ ಎಂದು ನಿಮಗೆ ತಿಳಿಯುತ್ತದೆ.
ಗಾಗಿ ಪ್ರಾಯೋಗಿಕ ಅನ್ವಯ
ಮೇಲಿನ ವಾಕ್ಥ್ರೂ ಆಧಾರದ ಮೇಲೆ, ಅದೇ .env + ವ್ಯಾಲಿಡೇಶನ್ + ಟೈಪ್ ಮಾಡಿದ-ಸೆಟ್ಟಿಂಗ್ಗಳ ಪ್ಯಾಟರ್ನ್, ಪ್ರತಿ ವಿಭಾಗವು ತನ್ನದೇ ಸ್ಟ್ಯಾಕ್ನಲ್ಲಿ ರಹಸ್ಯಗಳನ್ನು ಹೇಗೆ ಸಂಘಟಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ರೂಪಿಸುತ್ತದೆ.
ಮಾಡಬೇಕಾದವು ಮತ್ತು ಮಾಡಬಾರದವು
ಮಾಡಬೇಕಾದವು
.env.exampleಕಮಿಟ್ ಮಾಡಿ ಮತ್ತು.envಅನ್ನು gitignore ಮಾಡಿ — ಟೆಂಪ್ಲೇಟ್ ನಿಜವಾದ ಕೀಗಳನ್ನು Git ಇತಿಹಾಸಕ್ಕೆ ಎಂದಿಗೂ ಸೇರಿಸದೆ ಅಗತ್ಯ ವೇರಿಯಬಲ್ಗಳನ್ನು ದಾಖಲಿಸುತ್ತದೆ.- ಅಗತ್ಯ ವೇರಿಯಬಲ್ಗಳನ್ನು ಸ್ಟಾರ್ಟ್ಅಪ್ನಲ್ಲಿ ವ್ಯಾಲಿಡೇಟ್ ಮಾಡಿ — ಕಾಣೆಯಾದ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಡೌನ್ಸ್ಟ್ರೀಮ್ 401 ಆಗುವ ಬದಲು ತಕ್ಷಣದ, ಹೆಸರಿಸಲಾದ ದೋಷವಾಗಿ ತೋರಿಸಿ.
- ಕಮಿಟ್ಗೆ ಸೇರಿದ ಯಾವುದೇ ಕೀಯನ್ನು ರೊಟೇಟ್ ಮಾಡಿ — ಫೋರ್ಸ್-ಪುಶ್ ಮಾಡಿದ ಸೋರಿಕೆ ಕೂಡ reflog ಮತ್ತು ಫೋರ್ಕ್ಗಳ ಮೂಲಕ ತಲುಪಬಹುದಾಗಿರುತ್ತದೆ; ಸ್ಕ್ಯಾನರ್ಗಳು ಈಗಾಗಲೇ ಅದನ್ನು ಪಡೆದಿವೆ ಎಂದು ಭಾವಿಸಿ.
ಮಾಡಬಾರದವು
- "ಕೇವಲ ತ್ವರಿತ ಪರೀಕ್ಷೆಗಾಗಿ" ಎಂದು ಕೀಗಳನ್ನು ಹಾರ್ಡ್ಕೋಡ್ ಮಾಡಬೇಡಿ — ಸ್ಕ್ಯಾನರ್ಗಳು ಸೋರಿಕೆಯಾದ ಕೀಗಳನ್ನು ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಕಂಡುಹಿಡಿಯುತ್ತವೆ, ಮತ್ತು ಕಮಿಟ್ ಅನ್ನು ಹಿಂತೆಗೆದುಕೊಂಡರೂ ಸೋರಿಕೆ ರದ್ದಾಗುವುದಿಲ್ಲ.
- ಕೋಡ್ನಾದ್ಯಂತ
os.getenv()ಅನ್ನು ಅಡ್-ಹಾಕ್ ಆಗಿ ಓದಬೇಡಿ — ಒಂದೇ ಟೈಪ್ ಮಾಡಿದ ಸೆಟ್ಟಿಂಗ್ಗಳ ಆಬ್ಜೆಕ್ಟ್ ಟೈಪೋಗಳನ್ನು ತಡೆಯುತ್ತದೆ ಮತ್ತು ವ್ಯಾಲಿಡೇಶನ್ ಅನ್ನು ಕೇಂದ್ರೀಕರಿಸುತ್ತದೆ. .envಅನ್ನು Slack ಅಥವಾ ಇಮೇಲ್ ಮೂಲಕ ಹಂಚಿಕೊಳ್ಳಬೇಡಿ — ಸೀಕ್ರೆಟ್ಸ್ ಮ್ಯಾನೇಜರ್ (1Password, Vault, GCP Secret Manager) ಬಳಸಿ, ಇದರಿಂದ ಪ್ರತಿ ಬಳಕೆದಾರರಿಗೂ ಪ್ರತ್ಯೇಕವಾಗಿ ಪ್ರವೇಶವನ್ನು ಹಿಂಪಡೆಯಬಹುದು.
A hands-on lab comes with this lesson — real code, in a cloud IDE. Create a free account to run it. No card.
Free account · no card · straight to the lab
Or get the full path — from
Listen to this lesson
Audio overviews of this lesson's labs and its chapter, from GenBodha Bytes.
- Implement secure API key management for LLM providersLab6 min
- The Dev EnvironmentChapter overview18 min