{"record":{"id":"6265f3e7624d08e8","repo":"nexu-io/open-design","slug":"openai-selected-but-no-valid-openai-auth-is-config","errorCode":null,"errorMessage":"OpenAI selected but no valid OpenAI auth is configured.","messagePattern":"OpenAI selected but no valid OpenAI auth is configured\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"design-templates/last30days/scripts/lib/providers.py","lineNumber":299,"sourceCode":"            ), None\n\n    planner_model, rerank_model = _resolve_model_pins(config, depth, provider_name)\n\n    if provider_name == \"gemini\":\n        if not google_key:\n            raise RuntimeError(\"Gemini selected but no Google API key is configured.\")\n        runtime = schema.ProviderRuntime(\n            reasoning_provider=\"gemini\",\n            planner_model=planner_model,\n            rerank_model=rerank_model,\n\n            x_search_backend=_resolve_x_backend(config),\n        )\n        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            config.get(\"OPENAI_AUTH_SOURCE\") or env.AUTH_SOURCE_API_KEY,\n            config.get(\"OPENAI_CHATGPT_ACCOUNT_ID\"),\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\",","sourceCodeStart":281,"sourceCodeEnd":317,"githubUrl":"https://github.com/nexu-io/open-design/blob/5be4028344c2eb4c667c5a97bda8f750c5597ef7/design-templates/last30days/scripts/lib/providers.py#L281-L317","documentation":"Raised in resolve_runtime when provider_name is 'openai' but either OPENAI_API_KEY is empty or OPENAI_AUTH_STATUS != 'ok'. Unlike gemini, OpenAI requires BOTH a token and an explicit auth-status handshake (env.AUTH_STATUS_OK) because the runtime also supports ChatGPT-session auth, not just API keys.","triggerScenarios":"LAST30DAYS_REASONING_PROVIDER=openai with OPENAI_API_KEY set but OPENAI_AUTH_STATUS unset or set to a non-'ok' value. Also reached via auto-resolution when a key exists but the auth handshake failed.","commonSituations":"Setting OPENAI_API_KEY directly without also setting OPENAI_AUTH_STATUS=ok. Auth token expired (ChatGPT session refresh failed) so status flipped to a non-ok value. Auto-resolution picked openai because the key was present but the status check was skipped.","solutions":["Set OPENAI_API_KEY and OPENAI_AUTH_STATUS=ok together when using API-key auth.","Re-run the OpenAI login/handshake step so it stamps OPENAI_AUTH_STATUS=ok into config.","If you do not have valid OpenAI auth, switch LAST30DAYS_REASONING_PROVIDER to gemini/xai/openrouter/auto."],"exampleFix":"# before\nOPENAI_API_KEY=sk-...\n# OPENAI_AUTH_STATUS missing\n\n# after\nOPENAI_API_KEY=sk-...\nOPENAI_AUTH_STATUS=ok\nOPENAI_AUTH_SOURCE=api_key","handlingStrategy":"validation","validationCode":"from lib import env\n\ndef ensure_openai_auth(config):\n    token = config.get(\"OPENAI_API_KEY\")\n    status = config.get(\"OPENAI_AUTH_STATUS\")\n    if not token or status != env.AUTH_STATUS_OK:\n        raise RuntimeError(\n            \"OpenAI provider requires OPENAI_API_KEY and OPENAI_AUTH_STATUS=ok.\"\n        )\n    return token","typeGuard":"null","tryCatchPattern":"null","preventionTips":["When using API-key auth, always set OPENAI_API_KEY together with OPENAI_AUTH_STATUS=ok and OPENAI_AUTH_SOURCE=api_key.","Re-run the OpenAI auth handshake whenever the token is refreshed so the status field stays 'ok'.","Use 'auto' provider selection so an incomplete OpenAI auth falls through to another provider."],"tags":["config","credentials","openai","auth-status","provider"],"backgroundTag":null,"analyzedSha":"5be4028344c2eb4c667c5a97bda8f750c5597ef7","analyzedAt":"2026-08-12T12:03:58.812Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}