{"record":{"id":"07f9d27f2fa06701","repo":"zylon-ai/private-gpt","slug":"unknown-reasoning-effort-level-effort-str","errorCode":null,"errorMessage":"Unknown reasoning effort level: {effort_str}","messagePattern":"Unknown reasoning effort level: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"private_gpt/components/llm/models.py","lineNumber":17,"sourceCode":"import enum\n\n\nclass ReasoningEffort(enum.StrEnum):\n    NONE = \"none\"\n    LOW = \"low\"\n    MEDIUM = \"medium\"\n    HIGH = \"high\"\n    MAX = \"max\"\n    XHIGH = \"xhigh\"\n\n    @classmethod\n    def from_str(cls, effort_str: str) -> \"ReasoningEffort\":\n        effort_str = effort_str.lower()\n        if effort_str in cls._value2member_map_:\n            return cls(effort_str)\n        raise ValueError(f\"Unknown reasoning effort level: {effort_str}\")\n\n    @property\n    def is_thinking_enabled(self) -> bool:\n        return self != ReasoningEffort.NONE\n\n\ndef normalize_reasoning_effort(\n    reasoning_effort: ReasoningEffort | str | None,\n) -> ReasoningEffort:\n    \"\"\"Normalize values crossing untyped or serialized LLM boundaries.\"\"\"\n    if reasoning_effort is None:\n        return ReasoningEffort.NONE\n    if isinstance(reasoning_effort, ReasoningEffort):\n        return reasoning_effort\n    if isinstance(reasoning_effort, str):\n        return ReasoningEffort.from_str(reasoning_effort)\n    raise TypeError(\n        \"reasoning_effort must be a ReasoningEffort, string, or None; \"","sourceCodeStart":1,"sourceCodeEnd":35,"githubUrl":"https://github.com/zylon-ai/private-gpt/blob/4a030776a31a901ad80b1bf4d7faa2c1a367efbb/private_gpt/components/llm/models.py#L1-L35","documentation":"ValueError from ReasoningEffort.from_str: the lowercased input string is not one of the enum's values (none, low, medium, high, max, xhigh). The enum is the closed vocabulary for reasoning effort across the library; any other string is rejected rather than guessed.","triggerScenarios":"Calling from_str with e.g. \"OFF\", \"ultra\", \"minimal\", or a config/env value like 'reasoning_effort: aggressive'; also case is handled (it lowercases) but unknown words are not.","commonSituations":"Hand-written settings.yaml with an unsupported effort word; values from another provider's API (e.g. OpenAI's 'medium'/'high' subset works, but other vendors' labels like 'aggressive' do not); stale configs from versions before 'max'/'xhigh' existed or after a level was renamed.","solutions":["Use one of the exact values: none, low, medium, high, max, xhigh (any case; it is lowercased).","If 'off'/'disabled' was intended, use 'none'.","Validate free-text effort settings against this list at config-load time to fail with a clearer message."],"exampleFix":"# before\nreasoning_effort: aggressive\n\n# after\nreasoning_effort: high","handlingStrategy":"type-guard","validationCode":"VALID_EFFORTS = {\"none\", \"low\", \"medium\", \"high\", \"max\", \"xhigh\"}\n\ndef effort_is_valid(s: str) -> bool:\n    return s.lower() in VALID_EFFORTS","typeGuard":"from private_gpt.components.llm.models import ReasoningEffort\n\ndef is_reasoning_effort_str(value: object) -> bool:\n    return isinstance(value, str) and value.lower() in ReasoningEffort._value2member_map_","tryCatchPattern":"try:\n    effort = ReasoningEffort.from_str(raw)\nexcept ValueError:\n    log.warning('Unknown reasoning effort %r; defaulting to none', raw)\n    effort = ReasoningEffort.NONE","preventionTips":["Declare reasoning_effort as an Enum field in settings/request models so invalid values fail at parse time.","Offer only the documented levels in UI dropdowns and API docs.","Map other vendors' effort labels to this enum at the integration boundary."],"tags":["enum","reasoning","configuration","validation"],"backgroundTag":null,"analyzedSha":"4a030776a31a901ad80b1bf4d7faa2c1a367efbb","analyzedAt":"2026-08-15T03:51:26.951Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}