{"record":{"id":"118c3cadc9149c71","repo":"xai-org/x-algorithm","slug":"invalid-config-option-kv-r-expected-format-key","errorCode":null,"errorMessage":"Invalid config option {kv!r}, expected format 'key=value'","messagePattern":"Invalid config option (.+?), expected format 'key=value'","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"phoenix/python/common/xai-configlib/src/xai_configlib/__init__.py","lineNumber":547,"sourceCode":"\ndef _coerce_enums_from_hint(vtype: Any, value: Any) -> Any:\n    inner = _unwrap_optional(vtype)\n    if isinstance(inner, enum.EnumMeta):\n        return _coerce_enum_value(inner, value)\n    if is_list(inner) and isinstance(value, list):\n        elem_args = get_args(inner)\n        if len(elem_args) == 1 and isinstance(elem_args[0], enum.EnumMeta):\n            enum_cls = elem_args[0]\n            if value and all(isinstance(x, enum_cls) for x in value):\n                return value\n            return [_coerce_enum_value(enum_cls, x) for x in value]\n    return value\n\n\ndef parse_kv(kv: str) -> tuple[str, str]:\n    parts = kv.split(\"=\", 1)\n    if len(parts) < 2:\n        raise ValueError(f\"Invalid config option {kv!r}, expected format 'key=value'\")\n    return tuple(parts)\n\n\ndef get_module(mod_path: str) -> ModuleType:\n    try:\n        return importlib.import_module(mod_path)\n    except ModuleNotFoundError as e:\n        raise type(e)(\n            f\"No module found {mod_path!r}, \"\n            f\"or {mod_path!r} has another import issue: {traceback.format_exc()}\"\n        ) from e\n\n\ndef get_configs_from_mod(\n    mod: ModuleType,\n) -> dict[str, Config] | None:\n    if \"CONFIGS\" not in dir(mod):\n        return None","sourceCodeStart":529,"sourceCodeEnd":565,"githubUrl":"https://github.com/xai-org/x-algorithm/blob/24c60942c5c5fdad3a6addffb4c6e6d2f228f04f/phoenix/python/common/xai-configlib/src/xai_configlib/__init__.py#L529-L565","documentation":"parse_kv splits each override string on the first '='; a string with no '=' cannot produce a (key, value) pair and raises this ValueError.","triggerScenarios":"Passing a bare token like 'verbose' or '--flag' into parse_kv via replace_cli_subs; also an empty string argument.","commonSituations":"Attempting to use boolean-flag style CLI arguments with a key=value config system, or leftover shell glob expansions producing '='-less tokens.","solutions":["Convert flags to explicit key=value ('verbose=True')","Filter empty strings out of the args list before calling","Check for unexpanded shell variables (\"$VAR\" empty) producing malformed args"],"exampleFix":"# before\nparse_kv(\"verbose\")\n# after\nparse_kv(\"verbose=True\")","handlingStrategy":"validation","validationCode":"kvs = [kv for kv in kvs if kv.strip()]\nassert all(\"=\" in kv for kv in kvs), f\"Malformed overrides: {[kv for kv in kvs if '=' not in kv]}\"","typeGuard":"def is_kv(s: str) -> bool:\n    return isinstance(s, str) and \"=\" in s","tryCatchPattern":null,"preventionTips":["Quote overrides in shell","Filter empty args from variable expansions"],"tags":["config","cli","parsing","validation"],"backgroundTag":"invalid-cli-argument","analyzedSha":"24c60942c5c5fdad3a6addffb4c6e6d2f228f04f","analyzedAt":"2026-08-28T11:40:14.686Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}