{"record":{"id":"3cbcf0d5321dfc31","repo":"fishaudio/fish-speech","slug":"logger-config-must-be-a-dictconfig","errorCode":null,"errorMessage":"Logger config must be a DictConfig!","messagePattern":"Logger config must be a DictConfig!","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"fish_speech/utils/instantiators.py","lineNumber":43,"sourceCode":"    for _, cb_conf in callbacks_cfg.items():\n        if isinstance(cb_conf, DictConfig) and \"_target_\" in cb_conf:\n            log.info(f\"Instantiating callback <{cb_conf._target_}>\")\n            callbacks.append(hydra.utils.instantiate(cb_conf))\n\n    return callbacks\n\n\ndef instantiate_loggers(logger_cfg: DictConfig) -> List[Logger]:\n    \"\"\"Instantiates loggers from config.\"\"\"\n\n    logger: List[Logger] = []\n\n    if not logger_cfg:\n        log.warning(\"No logger configs found! Skipping...\")\n        return logger\n\n    if not isinstance(logger_cfg, DictConfig):\n        raise TypeError(\"Logger config must be a DictConfig!\")\n\n    for _, lg_conf in logger_cfg.items():\n        if isinstance(lg_conf, DictConfig) and \"_target_\" in lg_conf:\n            log.info(f\"Instantiating logger <{lg_conf._target_}>\")\n            logger.append(hydra.utils.instantiate(lg_conf))\n\n    return logger\n","sourceCodeStart":25,"sourceCodeEnd":51,"githubUrl":"https://github.com/fishaudio/fish-speech/blob/befe4001745417f8c42131739d862b8a6fdbd15a/fish_speech/utils/instantiators.py#L25-L51","documentation":"instantiate_loggers mirrors the callbacks instantiator: the loggers config must be a DictConfig or a TypeError is raised. Each entry with a _target_ is instantiated via hydra.utils.instantiate.","triggerScenarios":"Calling train() with cfg.logger that is a plain python dict or list (e.g. WandbLogger/TensorBoard config after to_container conversion).","commonSituations":"Custom training scripts assembling the logger section from dicts; overriding logger configs programmatically; copying configs from tutorials that use dict literals.","solutions":["Keep the logger section as DictConfig (OmegaConf.create / OmegaConf.merge)","Structure it as name -> {_target_: ...} pairs","Set logger to null/empty to skip rather than passing a wrong-typed value"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"from omegaconf import DictConfig, OmegaConf\nif logger_cfg is not None and not isinstance(logger_cfg, DictConfig):\n    logger_cfg = OmegaConf.create(logger_cfg)","typeGuard":"def is_dict_config(x):\n    from omegaconf import DictConfig\n    return x is None or isinstance(x, DictConfig)","tryCatchPattern":null,"preventionTips":["Keep cfg as a composed DictConfig end-to-end","Set logger: null to disable rather than passing dicts"],"tags":["hydra","config","logging","type-error"],"backgroundTag":"config-type-mismatch","analyzedSha":"befe4001745417f8c42131739d862b8a6fdbd15a","analyzedAt":"2026-08-27T21:31:45.703Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}