{"record":{"id":"e44f99e5671dbd04","repo":"Significant-Gravitas/AutoGPT","slug":"chat-transport-selection-required","errorCode":null,"errorMessage":"chat_transport_selection_required","messagePattern":"chat_transport_selection_required","errorType":"http","errorClass":"HTTPException","httpStatus":409,"severity":"warning","filePath":"autogpt_platform/backend/backend/api/features/chat/routes.py","lineNumber":626,"sourceCode":"                if auth_provider == \"codex\":\n                    raise HTTPException(\n                        status_code=404,\n                        detail=\"codex_credential_not_found\",\n                    )\n                raise HTTPException(\n                    status_code=503,\n                    detail=\"chat_transport_not_configured\",\n                )\n            return auth_provider, credential_id\n\n    default_route = next(\n        (transport for transport in transports if transport.default),\n        None,\n    )\n    if default_route is not None:\n        return default_route.auth_provider, default_route.credential_id\n    if any(transport.available for transport in transports):\n        raise HTTPException(\n            status_code=409,\n            detail=\"chat_transport_selection_required\",\n        )\n    raise HTTPException(\n        status_code=503,\n        detail=\"chat_transport_not_configured\",\n    )\n\n\n@router.post(\"/sessions\")\nasync def create_session(\n    user_id: Annotated[str, Security(auth.get_user_id)],\n    ctx: Annotated[auth.RequestContext, Security(auth.get_request_context)],\n    request: CreateSessionRequest | None = None,\n) -> CreateSessionResponse:\n    \"\"\"Create (or get-or-create) a chat session.\n\n    Two modes, selected by the request body:","sourceCodeStart":608,"sourceCodeEnd":644,"githubUrl":"https://github.com/Significant-Gravitas/AutoGPT/blob/9c8bb5550f446ba5d3046b78896578742495b3cf/autogpt_platform/backend/backend/api/features/chat/routes.py#L608-L644","documentation":"A 409 (conflict) from _resolve_new_session_llm_route's default-route fallback: the user specified no explicit routing fields, there is no default transport, but at least one transport is available. The backend refuses to silently pick among the user's multiple eligible routes, so it asks the client to disambiguate by explicitly selecting one.","triggerScenarios":"POST /chat/sessions with no llm_auth_provider/llm_credential_id when the user's transport list has available transports but none flagged default=true (e.g. user has several codex credentials and no default set, or a platform + codex mix with the default cleared).","commonSituations":"User added a second LLM credential without marking a default; a 'default' flag was unset by a credential deletion or settings change; first session creation after connecting multiple providers.","solutions":["Explicitly pass the route in the create request: {\"llm_auth_provider\": \"codex\", \"llm_credential_id\": X} or {\"llm_auth_provider\": \"platform\"}.","Better UX: on 409, prompt the user to pick a route (or set a default credential in settings), then retry with the selection.","To stop it recurring, have the user set one credential as default so the fallback path resolves."],"exampleFix":"// before\ncreateSession({})  // 409: multiple available routes, none default\n\n// after\nconst choice = await promptUserToSelectRoute();\ncreateSession(choice);  // e.g. {llm_auth_provider: 'codex', llm_credential_id: '...'}","handlingStrategy":"fallback","validationCode":"const transports = await listChatTransports(userId);\nconst hasDefault = transports.some(t => t.default);\nif (!hasDefault && transports.some(t => t.available)) {\n  const choice = await promptRouteSelection(transports.filter(t => t.available));\n  await createSession(choice);\n}","typeGuard":"function needsExplicitRoute(transports: Transport[]): boolean {\n  return !transports.some(t => t.default) && transports.some(t => t.available);\n}","tryCatchPattern":"try {\n  await createSession({});\n} catch (e) {\n  if (e.status === 409 && e.detail === 'chat_transport_selection_required') {\n    const choice = await promptRouteSelection();\n    await createSession(choice); // fallback: retry with explicit route\n    return;\n  }\n  throw e;\n}","preventionTips":["After 409, always send an explicit route on retry.","Encourage users to set a default credential so the fallback path resolves.","Model the 409 detail string in the client's error taxonomy."],"tags":["backend","chat","transport","codex","http-409"],"backgroundTag":null,"analyzedSha":"9c8bb5550f446ba5d3046b78896578742495b3cf","analyzedAt":"2026-08-14T17:17:21.957Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}