{"record":{"id":"a16e91a27ae68b2c","repo":"zylon-ai/private-gpt","slug":"invalid-toolvalidationmode-mode-str","errorCode":null,"errorMessage":"Invalid ToolValidationMode: {mode_str}","messagePattern":"Invalid ToolValidationMode: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"private_gpt/components/tools/types.py","lineNumber":20,"sourceCode":"\n\nclass ToolValidationMode(enum.StrEnum):\n    EAGER = \"eager\"\n    LAZY = \"lazy\"\n\n    def __str__(self) -> str:\n        return self.value\n\n    @classmethod\n    def from_str(cls, mode_str: str) -> \"ToolValidationMode\":\n        \"\"\"Create a ToolValidationMode from a string.\"\"\"\n        mode_str = mode_str.lower()\n        if mode_str == \"eager\":\n            return cls.EAGER\n        elif mode_str == \"lazy\":\n            return cls.LAZY\n        else:\n            raise ValueError(f\"Invalid ToolValidationMode: {mode_str}\")\n","sourceCodeStart":2,"sourceCodeEnd":21,"githubUrl":"https://github.com/zylon-ai/private-gpt/blob/4a030776a31a901ad80b1bf4d7faa2c1a367efbb/private_gpt/components/tools/types.py#L2-L21","documentation":"ValueError raised by ToolValidationMode.from_str when the input string (lowercased) is neither 'eager' nor 'lazy'. It is a strict parser for the tool validation mode enum.","triggerScenarios":"Calling ToolValidationMode.from_str with values like 'none', 'off', 'strict', 'true', or an empty string; feeding an unvalidated user/UI string straight into the parser; config field tool_config.validation_mode set to an unsupported word.","commonSituations":"API clients sending arbitrary strings for validation mode; older configs using a previous name for the same mode; boolean-ish values ('on'/'off') used where the enum expects eager/lazy.","solutions":["Use exactly 'eager' or 'lazy' (case-insensitive) as the validation mode string","Normalize/whitelist user input before calling from_str: value.lower().strip() and check membership in {'eager','lazy'}","Send the enum value directly in typed clients instead of free-form strings"],"exampleFix":"# before\nmode = ToolValidationMode.from_str(user_input)\n# after\n_normalized = user_input.strip().lower()\nif _normalized not in {\"eager\", \"lazy\"}:\n    raise ValueError(f\"validation_mode must be 'eager' or 'lazy', got {user_input!r}\")\nmode = ToolValidationMode.from_str(_normalized)","handlingStrategy":"validation","validationCode":"_ALLOWED = {\"eager\", \"lazy\"}\n\ndef parse_validation_mode(raw: str) -> \"ToolValidationMode\":\n    normalized = raw.strip().lower()\n    if normalized not in _ALLOWED:\n        raise ValueError(f\"validation mode must be one of {sorted(_ALLOWED)}, got {raw!r}\")\n    return ToolValidationMode.from_str(normalized)","typeGuard":"def is_valid_validation_mode(raw: str) -> bool:\n    return isinstance(raw, str) and raw.strip().lower() in {\"eager\", \"lazy\"}","tryCatchPattern":"try:\n    mode = ToolValidationMode.from_str(mode_str)\nexcept ValueError:\n    # default to a safe mode or return a 4xx to the caller with allowed values","preventionTips":["Whitelist validation mode strings at the API boundary (eager/lazy only)","Normalize input (strip + lower) before parsing","Return the allowed set in error responses so clients self-correct"],"tags":["validation","enum","configuration","user-input"],"backgroundTag":null,"analyzedSha":"4a030776a31a901ad80b1bf4d7faa2c1a367efbb","analyzedAt":"2026-08-15T03:51:26.951Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}