{"record":{"id":"8194e3a36ffffc7d","repo":"xai-org/x-algorithm","slug":"module-base-module-name-is-not-a-package-conta","errorCode":null,"errorMessage":"Module '{base_module_name}' is not a package containing configs.","messagePattern":"Module '(.+?)' is not a package containing configs\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"phoenix/python/common/xai-configlib/src/xai_configlib/__init__.py","lineNumber":612,"sourceCode":"\n    if ver not in configs:\n        avail = \", \".join(configs.keys())\n        raise ValueError(f\"Config module {mod_name!r} has no key {ver!r}. Available keys: {avail}\")\n    return configs[ver]\n\n\nclass DiscoveredConfigsInModule(NamedTuple):\n    configs: dict[str, Config]\n    failing_modules: list[str]\n\n\ndef get_all_configs_from_module(\n    base_module_name: str,\n    ignore_loading_errors: bool = False,\n) -> DiscoveredConfigsInModule:\n    mod = get_module(base_module_name)\n    if not hasattr(mod, \"__path__\"):\n        raise ValueError(f\"Module '{base_module_name}' is not a package containing configs.\")\n\n    configs: dict[str, Config] = {}\n    failing_modules: list[str] = []\n    for _, name, _is_pkg in pkgutil.iter_modules(mod.__path__):\n        try:\n            child_mod = get_module(f\"{base_module_name}.{name}\")\n        except Exception:\n            failing_modules.append(f\"{base_module_name}.{name}\")\n            logger.warning(\n                f\"Failed to load eval config module {base_module_name}.{name}\",\n                exc_info=True,\n            )\n            if ignore_loading_errors:\n                continue\n            raise\n        child_mod_configs = get_configs_from_mod(child_mod)\n        if child_mod_configs is None:\n            continue","sourceCodeStart":594,"sourceCodeEnd":630,"githubUrl":"https://github.com/xai-org/x-algorithm/blob/24c60942c5c5fdad3a6addffb4c6e6d2f228f04f/phoenix/python/common/xai-configlib/src/xai_configlib/__init__.py#L594-L630","documentation":"get_all_configs_from_module discovers configs by iterating a package's __path__. If the imported base module is a plain module (no __path__), it cannot contain child config modules, so this ValueError is raised.","triggerScenarios":"Passing a module name that resolves to a single-file module (e.g. 'xrex.configs.base') instead of a package directory; or the package lost its __init__.py so it imports as a namespace-less module.","commonSituations":"Reorganizing configs from a package into a flat module, missing __init__.py after a refactor, or passing a dotted config name where a package name is expected.","solutions":["Pass the package name (directory with __init__.py), not a leaf module","Ensure the configs directory has an __init__.py","Check sys.path/imports so the intended package, not a same-named module, is imported"],"exampleFix":"# before\nget_all_configs_from_module(\"xrex.configs.my_cfg\")\n# after\nget_all_configs_from_module(\"xrex.configs\")","handlingStrategy":"validation","validationCode":"import importlib\nmod = importlib.import_module(base_module_name)\nassert hasattr(mod, \"__path__\"), f\"{base_module_name} is not a package\"","typeGuard":"def is_package(mod) -> bool:\n    return hasattr(mod, \"__path__\")","tryCatchPattern":null,"preventionTips":["Pass package dirs, keep __init__.py in config packages"],"tags":["config","module-resolution","package","validation"],"backgroundTag":"module-not-a-package","analyzedSha":"24c60942c5c5fdad3a6addffb4c6e6d2f228f04f","analyzedAt":"2026-08-28T11:40:14.686Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}