{"record":{"id":"57afbb0a8fbfe857","repo":"mvanhorn/last30days-skill","slug":"xai-selected-but-xai-api-key-is-not-configured","errorCode":null,"errorMessage":"xAI selected but XAI_API_KEY is not configured.","messagePattern":"xAI selected but XAI_API_KEY is not configured\\.","errorType":"validation","errorClass":"RuntimeError","httpStatus":null,"severity":"critical","filePath":"skills/last30days/scripts/lib/providers.py","lineNumber":292,"sourceCode":"        return runtime, GeminiClient(google_key)\n\n    if provider_name == \"openai\":\n        if not openai_token or config.get(\"OPENAI_AUTH_STATUS\") != env.AUTH_STATUS_OK:\n            raise RuntimeError(\"OpenAI selected but no valid OpenAI auth is configured.\")\n        runtime = schema.ProviderRuntime(\n            reasoning_provider=\"openai\",\n            planner_model=planner_model,\n            rerank_model=rerank_model,\n    \n            x_search_backend=_resolve_x_backend(config),\n        )\n        return runtime, OpenAIClient(\n            openai_token\n        )\n\n    if provider_name == \"xai\":\n        if not xai_key:\n            raise RuntimeError(\"xAI selected but XAI_API_KEY is not configured.\")\n        runtime = schema.ProviderRuntime(\n            reasoning_provider=\"xai\",\n            planner_model=planner_model,\n            rerank_model=rerank_model,\n    \n            x_search_backend=_resolve_x_backend(config),\n        )\n        return runtime, XAIClient(xai_key)\n\n    if provider_name == \"openrouter\":\n        openrouter_key = config.get(\"OPENROUTER_API_KEY\")\n        if not openrouter_key:\n            raise RuntimeError(\"OpenRouter selected but OPENROUTER_API_KEY is not configured.\")\n        runtime = schema.ProviderRuntime(\n            reasoning_provider=\"openrouter\",\n            planner_model=planner_model,\n            rerank_model=rerank_model,\n            x_search_backend=_resolve_x_backend(config),","sourceCodeStart":274,"sourceCodeEnd":310,"githubUrl":"https://github.com/mvanhorn/last30days-skill/blob/c7460f6114449ddfe6ea3fc2f23c3d910c0e740c/skills/last30days/scripts/lib/providers.py#L274-L310","documentation":"RuntimeError raised in resolve_runtime when provider is 'xai' but the XAI_API_KEY environment/config entry is falsy. Straightforward missing-credential gate mirroring the Gemini and OpenAI branches.","triggerScenarios":"LAST30DAYS_REASONING_PROVIDER=xai with XAI_API_KEY unset, empty string, or only defined in a shell the agent subprocess does not inherit.","commonSituations":"xAI key created in the xAI console but never exported; key name typo (XAI_KEY, XAI_TOKEN); CI jobs missing the secret; .env not on the engine's load path.","solutions":["Set XAI_API_KEY in ~/.config/last30days/.env or the process environment","Confirm the exact variable name is XAI_API_KEY (no typos)","In CI, add XAI_API_KEY as a masked secret on the job"],"exampleFix":"# before\nLAST30DAYS_REASONING_PROVIDER=xai\n# XAI_API_KEY missing\n\n# after\nLAST30DAYS_REASONING_PROVIDER=xai\nXAI_API_KEY=xai-your-key","handlingStrategy":"validation","validationCode":"if (os.environ.get(\"LAST30DAYS_REASONING_PROVIDER\") or \"\").lower() == \"xai\":\n    if not os.environ.get(\"XAI_API_KEY\"):\n        raise SystemExit(\"Set XAI_API_KEY before selecting the xai provider\")","typeGuard":"def xai_ready(config: dict) -> bool:\n    provider = (config.get(\"LAST30DAYS_REASONING_PROVIDER\") or \"gemini\").lower()\n    return provider != \"xai\" or bool(config.get(\"XAI_API_KEY\"))","tryCatchPattern":"try:\n    runtime, client = resolve_runtime(config, depth)\nexcept RuntimeError as e:\n    if \"XAI_API_KEY\" in str(e):\n        set_key_via_setup(\"XAI_API_KEY\")","preventionTips":["Use the exact variable name XAI_API_KEY","Add the key to ~/.config/last30days/.env so every harness subprocess sees it","Preflight provider/credential pairs before starting runs"],"tags":["providers","xai","credentials","configuration"],"backgroundTag":null,"analyzedSha":"c7460f6114449ddfe6ea3fc2f23c3d910c0e740c","analyzedAt":"2026-08-15T03:34:49.540Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}