Comfy-Org/ComfyUI · error · KeyError

Unknown user:

Error message

Unknown user: 

What it means

UserManager.get_request_user_id rejects any 'comfy-user' request header whose value starts with the reserved system prefix (folder_paths.SYSTEM_USER_PREFIX, '__'). The same generic 'Unknown user: <id>' KeyError is used both here and for unknown users on purpose, so callers cannot probe which IDs exist. System-prefixed directories are reserved for ComfyUI's own files (built-in workflows, etc.).

Source

Thrown at app/user_manager.py:65

        if args.multi_user:
            if os.path.isfile(self.get_users_file()):
                with open(self.get_users_file()) as f:
                    self.users = json.load(f)
            else:
                self.users = {}
        else:
            self.users = {"default": "default"}

    def get_users_file(self):
        return os.path.join(folder_paths.get_user_directory(), "users.json")

    def get_request_user_id(self, request):
        user = "default"
        if args.multi_user and "comfy-user" in request.headers:
            user = request.headers["comfy-user"]
            # Block System Users (use same error message to prevent probing)
            if user.startswith(folder_paths.SYSTEM_USER_PREFIX):
                raise KeyError("Unknown user: " + user)

        if user not in self.users:
            raise KeyError("Unknown user: " + user)

        return user

    def get_request_user_filepath(self, request, file, type="userdata", create_dir=True):
        if type == "userdata":
            root_dir = folder_paths.get_user_directory()
        else:
            raise KeyError("Unknown filepath type:" + type)

        user = self.get_request_user_id(request)
        user_root = folder_paths.get_public_user_directory(user)
        if user_root is None:
            return None
        path = user_root

View on GitHub (pinned to 1c6d8d45b3)

Solutions

  1. Send a normal user id in the comfy-user header — one created via the users API (it never starts with '__').
  2. If you manage user records yourself, filter out ids starting with folder_paths.SYSTEM_USER_PREFIX before issuing requests.
  3. Verify --multi-user is actually intended; without it the header is ignored and 'default' is used.

Example fix

# before
headers = {"comfy-user": "__built_in"}
requests.get(url, headers=headers)

# after
headers = {"comfy-user": "a1b2c3d4-..."}  # real id from users.json
requests.get(url, headers=headers)
Defensive patterns

Strategy: validation

Validate before calling

import folder_paths
user = request.headers.get("comfy-user", "default")
if user.startswith(folder_paths.SYSTEM_USER_PREFIX):
    raise HTTPException(400, "Unknown user")  # reject before calling user manager

Type guard

import folder_paths
def is_valid_user_id(user_id: str) -> bool:
    return not user_id.startswith(folder_paths.SYSTEM_USER_PREFIX)

Try / catch

try:
    uid = user_manager.get_request_user_id(request)
except KeyError as e:
    return web.Response(status=400, text=str(e))  # do not distinguish probe vs unknown

Prevention

When it happens

Trigger: Sending a request with header comfy-user: __foo while --multi-user is enabled; a client or custom node routing requests on behalf of a user id that begins with '__'.

Common situations: Custom frontends or scripts constructing user ids from file names; attempting to read/write another user's userdata by guessing reserved ids; a stale client holding a system user id returned by an older/other component.

Related errors


AI-assisted analysis of Comfy-Org/ComfyUI@1c6d8d45b3 (2026-08-14). Data as JSON: /api/errors/1382307a8c0329dd. Report an issue: GitHub.