{"record":{"id":"3c859ef5b1a4ddb8","repo":"BerriAI/litellm","slug":"dynamoai-api-key-is-required-set-dynamoai-api-key","errorCode":null,"errorMessage":"DynamoAI API key is required. Set DYNAMOAI_API_KEY environment variable or pass api_key parameter.","messagePattern":"DynamoAI API key is required\\. Set DYNAMOAI_API_KEY environment variable or pass api_key parameter\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"critical","filePath":"litellm/proxy/guardrails/guardrail_hooks/dynamoai/dynamoai.py","lineNumber":57,"sourceCode":"\n    Provides content moderation and policy enforcement using DynamoAI's guardrail API.\n    \"\"\"\n\n    def __init__(\n        self,\n        guardrail_name: str = \"litellm_test\",\n        api_key: str | None = None,\n        api_base: str | None = None,\n        model_id: str = \"\",\n        policy_ids: list[str] = [],\n        **kwargs,\n    ):\n        self.async_handler = get_async_httpx_client(llm_provider=httpxSpecialProvider.GuardrailCallback)\n\n        # Set API configuration\n        self.api_key = api_key or os.getenv(\"DYNAMOAI_API_KEY\")\n        if not self.api_key:\n            raise ValueError(\n                \"DynamoAI API key is required. Set DYNAMOAI_API_KEY environment variable or pass api_key parameter.\"\n            )\n\n        self.api_base = api_base or os.getenv(\"DYNAMOAI_API_BASE\", \"https://api.dynamo.ai\")\n        self.api_url = f\"{self.api_base}/v1/moderation/analyze/\"\n\n        # Model ID for tracking/logging purposes\n        self.model_id = model_id or os.getenv(\"DYNAMOAI_MODEL_ID\", \"\")\n\n        # Policy IDs - get from parameter, env var, or use empty list\n        env_policy_ids: Final = os.getenv(\"DYNAMOAI_POLICY_IDS\", \"\")\n        self.policy_ids = policy_ids or (env_policy_ids.split(\",\") if env_policy_ids else [])\n        self.guardrail_name = guardrail_name\n        self.guardrail_provider = \"dynamoai\"\n\n        # store kwargs as optional_params\n        self.optional_params = kwargs\n","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/guardrails/guardrail_hooks/dynamoai/dynamoai.py#L39-L75","documentation":"ValueError raised in DynamoAIGuardrail.__init__ when neither the api_key parameter nor the DYNAMOAI_API_KEY environment variable yields a key. LiteLLM constructs the guardrail when loading guardrails-config (or on first use), so this fails proxy startup or guardrail initialization before any request is moderated.","triggerScenarios":"A dynamoai entry in guardrails-config with no api_key in litellm_params while DYNAMOAI_API_KEY is unset in the proxy process environment; deploying with docker/systemd where the env var was not passed into the container/unit.","commonSituations":"Env var set in an interactive shell but not in the deployed environment (docker-compose env, Kubernetes secret, systemd Environment=); renamed or missing variable after a config refactor; CI pipelines running the proxy without the secret injected.","solutions":["Export DYNAMOAI_API_KEY in the environment the proxy runs in (docker-compose environment:, K8s secret env, systemd Environment=).","Or pass the key explicitly in the guardrail config: litellm_params: { guardrail: dynamoai, api_key: os.environ/DYNAMOAI_API_KEY }.","Restart the proxy after setting the variable — the check runs at guardrail construction, not per request.","Verify with a quick print of os.getenv('DYNAMOAI_API_KEY') in the same process context."],"exampleFix":"# before\nlitellm_params:\n  guardrail: dynamoai\n  api_base: https://api.dynamo.ai\n\n# after\nlitellm_params:\n  guardrail: dynamoai\n  api_base: https://api.dynamo.ai\n  api_key: os.environ/DYNAMOAI_API_KEY","handlingStrategy":"validation","validationCode":"import os\n\nif not (os.getenv('DYNAMOAI_API_KEY') or cfg.litellm_params.get('api_key')):\n    raise SystemExit('DYNAMOAI_API_KEY not set — refusing to start proxy with dynamoai guardrail')","typeGuard":null,"tryCatchPattern":"try:\n    guardrail = DynamoAIGuardrail(litellm_params=cfg)\nexcept ValueError as e:\n    if 'DYNAMOAI_API_KEY' in str(e):\n        logger.error('deploy misconfigured: %s', e)\n        raise\n    raise","preventionTips":["Add the key to your secret manager and inject it as an env var in every environment that loads the guardrail config.","Run a config-lint step at deploy time that fails when a dynamoai entry lacks a resolvable key.","Never commit keys inline; use os.environ/DYNAMOAI_API_KEY references."],"tags":["dynamoai","guardrail","api-key","config","startup"],"backgroundTag":"missing-env-var","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}