{"record":{"id":"8c6c47c0cca6ba5a","repo":"invoke-ai/InvokeAI","slug":"error-getting-client-state","errorCode":null,"errorMessage":"Error getting client state","messagePattern":"Error getting client state","errorType":"http","errorClass":"HTTPException","httpStatus":500,"severity":"error","filePath":"invokeai/app/api/routers/client_state.py","lineNumber":26,"sourceCode":"client_state_router = APIRouter(prefix=\"/v1/client_state\", tags=[\"client_state\"])\n\n\n@client_state_router.get(\n    \"/{queue_id}/get_by_key\",\n    operation_id=\"get_client_state_by_key\",\n    response_model=str | None,\n)\ndef get_client_state_by_key(\n    current_user: CurrentUserOrDefault,\n    queue_id: str = Path(description=\"The queue id (ignored, kept for backwards compatibility)\"),\n    key: str = Query(..., description=\"Key to get\"),\n) -> str | None:\n    \"\"\"Gets the client state for the current user (or system user if not authenticated)\"\"\"\n    try:\n        return ApiDependencies.invoker.services.client_state_persistence.get_by_key(current_user.user_id, key)\n    except Exception as e:\n        logging.error(f\"Error getting client state: {e}\")\n        raise HTTPException(status_code=500, detail=\"Error getting client state\")\n\n\n@client_state_router.post(\n    \"/{queue_id}/set_by_key\",\n    operation_id=\"set_client_state\",\n    response_model=str,\n)\ndef set_client_state(\n    current_user: CurrentUserOrDefault,\n    queue_id: str = Path(description=\"The queue id (ignored, kept for backwards compatibility)\"),\n    key: str = Query(..., description=\"Key to set\"),\n    value: str = Body(..., description=\"Stringified value to set\"),\n) -> str:\n    \"\"\"Sets the client state for the current user (or system user if not authenticated)\"\"\"\n    try:\n        return ApiDependencies.invoker.services.client_state_persistence.set_by_key(current_user.user_id, key, value)\n    except Exception as e:\n        logging.error(f\"Error setting client state: {e}\")","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/api/routers/client_state.py#L8-L44","documentation":"HTTP 500 raised by get_client_state_by_key when the client_state_persistence service throws while fetching the value for (current_user.user_id, key). The original exception is logged server-side and replaced with a generic 500 detail.","triggerScenarios":"GET /client_state/{queue_id}/get_by_key where the persistence backend (DB table for client state) is unavailable, corrupted, or the service is misconfigured in ApiDependencies.","commonSituations":"Database migration missing the client-state table; DB connection pool exhausted; Redis/SQLite backend down; user row missing in a multi-user setup after restore from backup.","solutions":["Check server logs for 'Error getting client state' with the underlying exception","Verify the client state persistence backend (database) is reachable and migrated","Re-run InvokeAI database migrations (e.g. alembic upgrade head) to ensure the client state table exists","Retry the request after backend recovery"],"exampleFix":"// before\nconst state = await getClientStateByKey(queueId, key); // throws on 500\n// after\nlet state = null;\ntry {\n  state = await getClientStateByKey(queueId, key);\n} catch {\n  state = null; // fall back to default client state\n}","handlingStrategy":"fallback","validationCode":"// no reliable client-side pre-check; ensure backend reachable\nconst healthy = await fetch('/health').then(r => r.ok).catch(() => false);","typeGuard":"const isClientStateFetchError = (e) =>\n  e?.response?.status === 500 && e?.response?.data?.detail === 'Error getting client state';","tryCatchPattern":"try {\n  state = await api.get(`/client_state/${queueId}/get_by_key`, { params: { key } });\n} catch (e) {\n  if (isClientStateFetchError(e)) state = DEFAULT_CLIENT_STATE; // fallback value\n  else throw e;\n}","preventionTips":["Monitor the InvokeAI database backend health","Keep migrations applied after upgrades (alembic upgrade head)","Fall back to default client state so UI survives persistence outages"],"tags":["http-500","client-state","persistence","database"],"backgroundTag":"server-internal-error","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}