{"record":{"id":"62a68ce6e2b73098","repo":"microsoft/qlib","slug":"user-has-been-loaded","errorCode":null,"errorMessage":"User {} has been loaded","messagePattern":"User (.+?) has been loaded","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/contrib/online/manager.py","lineNumber":68,"sourceCode":"        self.users = {}\n        self.user_record = pd.read_csv(self.users_file, index_col=0)\n        for user_id in self.user_record.index:\n            self.users[user_id] = self.load_user(user_id)\n\n    def load_user(self, user_id):\n        \"\"\"\n        return a instance of User() represents a user to be processed\n            Parameter\n                user_id : string\n            :return\n                user : User()\n        \"\"\"\n        account_path = self.data_path / user_id\n        strategy_file = self.data_path / user_id / \"strategy_{}.pickle\".format(user_id)\n        model_file = self.data_path / user_id / \"model_{}.pickle\".format(user_id)\n        cur_user_list = list(self.users)\n        if user_id in cur_user_list:\n            raise ValueError(\"User {} has been loaded\".format(user_id))\n        else:\n            trade_account = Account(0)\n            trade_account.load_account(account_path)\n            strategy = load_instance(strategy_file)\n            model = load_instance(model_file)\n            user = User(account=trade_account, strategy=strategy, model=model)\n            return user\n\n    def save_user_data(self, user_id):\n        \"\"\"\n        save a instance of User() to user data path\n            Parameter\n                user_id : string\n        \"\"\"\n        if not user_id in self.users:\n            raise ValueError(\"Cannot find user {}\".format(user_id))\n        self.users[user_id].account.save_account(self.data_path / user_id)\n        save_instance(","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/contrib/online/manager.py#L50-L86","documentation":"Raised by UserManager.create_user (qlib/contrib/online/manager.py) when trying to load a user whose user_id is already present in the in-memory self.users dict. The manager refuses to load the same online-user twice to avoid duplicate accounts/strategies being tracked under one id.","triggerScenarios":"Calling um.load_users() (which loads all recorded users) and then um.create_user(user_id) for an id already in users_file; or calling create_user twice with the same user_id in one session.","commonSituations":"An online-serving script that both bulk-loads users and re-adds one explicitly; retrying a failed setup script without restarting the UserManager; id collisions because user ids are derived from timestamps or counters that repeat.","solutions":["Skip creation if the user already exists: check `user_id in um.users` before calling create_user.","Use a unique user_id for each new online user.","If the existing entry is stale, call um.remove_user(user_id) (and reload) before creating it again."],"exampleFix":"# before\num.load_users()\nuser = um.create_user(\"u1\")  # ValueError: User u1 has been loaded\n\n# after\num.load_users()\nif \"u1\" not in um.users:\n    user = um.create_user(\"u1\")","handlingStrategy":"validation","validationCode":"if user_id in um.users:\n    user = um.users[user_id]\nelse:\n    user = um.create_user(user_id)","typeGuard":"def user_loaded(um, user_id) -> bool:\n    return user_id in um.users","tryCatchPattern":null,"preventionTips":["Check membership in um.users before create_user.","Generate unique user ids (uuid or strict counters).","Keep load_users() and manual create_user calls in one coordinator function."],"tags":["qlib","online-manager","duplicate","user","state"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}