{"record":{"id":"d87dec78486c4e2b","repo":"DayuanJiang/next-ai-draw-io","slug":"requiredvar-environment-variable-is-required-fo","errorCode":null,"errorMessage":"${requiredVar} environment variable is required for ${provider} provider. Please set it in your .env.local file.","messagePattern":"(.+?) environment variable is required for (.+?) provider\\. Please set it in your \\.env\\.local file\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"lib/ai-providers.ts","lineNumber":666,"sourceCode":"        return\n    }\n\n    // Anthropic accepts ANTHROPIC_AUTH_TOKEN (Bearer auth) as alternative to ANTHROPIC_API_KEY\n    if (provider === \"anthropic\" && !customApiKeyEnv) {\n        const hasCredential = !!(\n            process.env.ANTHROPIC_API_KEY || process.env.ANTHROPIC_AUTH_TOKEN\n        )\n        if (!hasCredential) {\n            throw new Error(\n                `Either ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN environment variable is required for anthropic provider. ` +\n                    `Please set one in your .env.local file.`,\n            )\n        }\n    } else {\n        // Use custom env var name if provided, otherwise use default\n        const requiredVar = customApiKeyEnv || PROVIDER_ENV_VARS[provider]\n        if (requiredVar && !process.env[requiredVar]) {\n            throw new Error(\n                `${requiredVar} environment variable is required for ${provider} provider. ` +\n                    `Please set it in your .env.local file.`,\n            )\n        }\n    }\n\n    // Azure requires either AZURE_BASE_URL or AZURE_RESOURCE_NAME in addition to API key\n    if (provider === \"azure\") {\n        const hasBaseUrl = !!process.env.AZURE_BASE_URL\n        const hasResourceName = !!process.env.AZURE_RESOURCE_NAME\n        if (!hasBaseUrl && !hasResourceName) {\n            throw new Error(\n                `Azure requires either AZURE_BASE_URL or AZURE_RESOURCE_NAME to be set. ` +\n                    `Please set one in your .env.local file.`,\n            )\n        }\n    }\n}","sourceCodeStart":648,"sourceCodeEnd":684,"githubUrl":"https://github.com/DayuanJiang/next-ai-draw-io/blob/155ef4f7acd29c9d46fb6fc35c92e6e6955a6ce1/lib/ai-providers.ts#L648-L684","documentation":"Generic single-env-var credential check: for any provider, the required var (customApiKeyEnv or PROVIDER_ENV_VARS[provider]) must be set or getAIModel throws.","triggerScenarios":"Provider set to e.g. openai without OPENAI_API_KEY, or a custom var name configured but unset.","commonSituations":"Switching providers in .env.local without adding the matching key, deployment env not injected, renamed custom var.","solutions":["Set the exact variable named in the error (e.g. OPENAI_API_KEY=...) in .env.local","Restart/redeploy so the environment is re-read","If using a custom var name, ensure customApiKeyEnv matches what you actually set"],"exampleFix":"# before\nAI_PROVIDER=openai\n\n# after\nAI_PROVIDER=openai\nOPENAI_API_KEY=sk-...","handlingStrategy":"validation","validationCode":"const requiredVar = PROVIDER_ENV_VARS[provider]\nif (requiredVar && !process.env[requiredVar]) throw new Error(`Missing ${requiredVar}`)","typeGuard":null,"tryCatchPattern":"try { getAIModel() } catch (e) { const m = (e as Error).message; if (m.includes('is required for') && m.includes('provider')) mapToEnvSetupUI(m) }","preventionTips":["Maintain a provider→env var map and validate at startup","Restart after .env.local changes","Never assume defaults for credentials"],"tags":["env-var","provider","credentials","configuration"],"backgroundTag":"missing-api-key","analyzedSha":"155ef4f7acd29c9d46fb6fc35c92e6e6955a6ce1","analyzedAt":"2026-08-27T11:40:38.297Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}