{"record":{"id":"6ad329d36f708db2","repo":"microsoft/qlib","slug":"no-valid-experiment-has-been-found-please-make-su","errorCode":null,"errorMessage":"No valid experiment has been found, please make sure the input experiment id is correct.","messagePattern":"No valid experiment has been found, please make sure the input experiment id is correct\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"qlib/workflow/expm.py","lineNumber":383,"sourceCode":"    def _get_exp(self, experiment_id=None, experiment_name=None):\n        \"\"\"\n        Method for getting or creating an experiment. It will try to first get a valid experiment, if exception occurs, it will\n        raise errors.\n        \"\"\"\n        assert (\n            experiment_id is not None or experiment_name is not None\n        ), \"Please input at least one of experiment/recorder id or name before retrieving experiment/recorder.\"\n        if experiment_id is not None:\n            try:\n                # NOTE: the mlflow's experiment_id must be str type...\n                # https://www.mlflow.org/docs/latest/python_api/mlflow.tracking.html#mlflow.tracking.MlflowClient.get_experiment\n                exp = self.client.get_experiment(experiment_id)\n                if exp.lifecycle_stage.upper() == \"DELETED\":\n                    raise MlflowException(\"No valid experiment has been found.\")\n                experiment = MLflowExperiment(exp.experiment_id, exp.name, self.uri)\n                return experiment\n            except MlflowException as e:\n                raise ValueError(\n                    \"No valid experiment has been found, please make sure the input experiment id is correct.\"\n                ) from e\n        elif experiment_name is not None:\n            try:\n                exp = self.client.get_experiment_by_name(experiment_name)\n                if exp is None or exp.lifecycle_stage.upper() == \"DELETED\":\n                    raise MlflowException(\"No valid experiment has been found.\")\n                experiment = MLflowExperiment(exp.experiment_id, experiment_name, self.uri)\n                return experiment\n            except MlflowException as e:\n                raise ValueError(\n                    \"No valid experiment has been found, please make sure the input experiment name is correct.\"\n                ) from e\n\n    def search_records(self, experiment_ids=None, **kwargs):\n        filter_string = \"\" if kwargs.get(\"filter_string\") is None else kwargs.get(\"filter_string\")\n        run_view_type = 1 if kwargs.get(\"run_view_type\") is None else kwargs.get(\"run_view_type\")\n        max_results = 100000 if kwargs.get(\"max_results\") is None else kwargs.get(\"max_results\")","sourceCodeStart":365,"sourceCodeEnd":401,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/workflow/expm.py#L365-L401","documentation":"Raised by MLflowExpManager._get_exp when MlflowClient.get_experiment(experiment_id) fails or returns a DELETED experiment; the MlflowException is chained into this ValueError. The id does not map to a live experiment in the tracking store reachable at the current URI.","triggerScenarios":"R.get_exp(experiment_id='7') where experiment 7 does not exist, was soft-deleted by delete_exp, or lives under a different tracking URI; passing an experiment NAME string where the numeric id is expected; reading the id as int instead of str (MLflow requires str).","commonSituations":"URI switched between file stores after experiments were created; retrying an id captured before R.delete_exp(); parsing experiment ids from logs with type coercion to int.","solutions":["Check what exists: R.list_experiments() shows live name->experiment mappings with ids.","Confirm the tracking URI (R.get_uri()) matches the store where the experiment was created.","Pass experiment_id as a string; if you have a name, use experiment_name instead.","If soft-deleted in MLflow, restore the experiment before querying it."],"exampleFix":"# before\nexp = R.get_exp(experiment_id=3)  # ValueError: no valid experiment\n\n# after\nexps = R.list_experiments()\nexp = R.get_exp(experiment_name=next(iter(exps)))  # verified name lookup","handlingStrategy":"validation","validationCode":"exps = R.list_experiments()  # {name: Experiment}\nif str(experiment_id) not in {str(e.id) for e in exps.values()}:\n    raise KeyError(f'experiment {experiment_id} not live; live ids: {[e.id for e in exps.values()]}')\nexp = R.get_exp(experiment_id=str(experiment_id))","typeGuard":"def experiment_id_live(mgr, exp_id) -> bool:\n    e = mgr.client.get_experiment(str(exp_id))\n    return e is not None and e.lifecycle_stage.upper() != 'DELETED'","tryCatchPattern":"try:\n    exp = R.get_exp(experiment_id=str(exp_id))\nexcept ValueError:\n    exps = R.list_experiments()\n    exp = next(iter(exps.values()))  # recover via a live experiment","preventionTips":["Take experiment ids from R.list_experiments()/get_exp() output, not from memory or logs.","Pass ids as strings; MLflow treats experiment_id as str.","Keep the tracking URI fixed, and remember delete_exp soft-deletes (id stays but unusable)."],"tags":["qlib","mlflow","experiment-not-found","value-error","exp-manager"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}