{"record":{"id":"7bd7077113fa8922","repo":"langchain-ai/deepagents","slug":"rubricmiddleware-max-iterations-must-be-positiv","errorCode":null,"errorMessage":"RubricMiddleware: `max_iterations` must be positive, got {max_iterations}.","messagePattern":"RubricMiddleware: `max_iterations` must be positive, got (.+?)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"libs/deepagents/deepagents/middleware/rubric.py","lineNumber":578,"sourceCode":"        system_prompt: str | None = None,\n        tools: Sequence[BaseTool] | None = None,\n        grader_middleware: Sequence[AgentMiddleware[Any, Any, Any]] | None = None,\n        grader_context_schema: type[Any] | None = None,\n        grader_state_schema: type[AgentState[Any]] | None = None,\n        prepare_messages_for_grader: Callable[[list[AnyMessage]], list[AnyMessage]] | None = None,\n        build_grader_state: Callable[[RubricState, int], Mapping[str, Any]] | None = None,\n        max_iterations: int = 3,\n        on_evaluation: Callable[[RubricEvaluation], None] | None = None,\n    ) -> None:\n        if not model:\n            msg = \"RubricMiddleware: `model` is required.\"\n            raise ValueError(msg)\n        if not isinstance(max_iterations, int) or isinstance(max_iterations, bool):\n            msg = f\"RubricMiddleware: `max_iterations` must be an int, got {type(max_iterations).__name__}.\"\n            raise TypeError(msg)\n        if max_iterations < 1:\n            msg = f\"RubricMiddleware: `max_iterations` must be positive, got {max_iterations}.\"\n            raise ValueError(msg)\n        if grader_state_schema is None and build_grader_state is not None:\n            msg = \"RubricMiddleware: `grader_state_schema` is required with `build_grader_state`.\"\n            raise ValueError(msg)\n        for name, callback in (\n            (\"prepare_messages_for_grader\", prepare_messages_for_grader),\n            (\"build_grader_state\", build_grader_state),\n        ):\n            if callback is not None and not callable(callback):\n                msg = f\"RubricMiddleware: `{name}` must be callable.\"\n                raise TypeError(msg)\n\n        self.max_iterations = max_iterations\n        self._model = model\n        self._model_label = _configured_model_label(model)\n        self._system_prompt = system_prompt or GRADER_SYSTEM_PROMPT\n        self._tools: list[BaseTool] = list(tools) if tools else []\n        self._grader_middleware = grader_middleware or ()\n        self._grader_context_schema = grader_context_schema","sourceCodeStart":560,"sourceCodeEnd":596,"githubUrl":"https://github.com/langchain-ai/deepagents/blob/a1af029e6e73cb17c36bff823d227747b28e91e1/libs/deepagents/deepagents/middleware/rubric.py#L560-L596","documentation":"RubricMiddleware requires `max_iterations >= 1` because the rubric loop must run the grader at least once. Zero or negative values would produce a loop that never grades, so construction fails fast with ValueError.","triggerScenarios":"RubricMiddleware(model=..., max_iterations=0) or max_iterations=-1 — an int that is < 1.","commonSituations":"Config defaulting to 0 ('disabled') to turn grading off; subtracting from a counter computed elsewhere; a miscomputed env-derived value.","solutions":["Pass at least 1: max_iterations=1 for a single grading pass.","If grading should be optional, don't instantiate the middleware at all instead of passing 0.","Clamp the config value: max_iterations=max(1, int(raw)).","Check the config source for sentinel 0/-1 defaults."],"exampleFix":"// before\nRubricMiddleware(model=model, max_iterations=0)\n// after\nRubricMiddleware(model=model, max_iterations=max(1, int(config.get(\"max_iterations\", 3))))","handlingStrategy":"validation","validationCode":"mi = int(config.get(\"max_iterations\", 3))\nif mi < 1:\n    raise ValueError(f\"max_iterations must be >= 1, got {mi}\")","typeGuard":"def is_positive_int(v: object) -> TypeGuard[int]:\n    return isinstance(v, int) and not isinstance(v, bool) and v >= 1","tryCatchPattern":"try:\n    mw = RubricMiddleware(model=model, max_iterations=mi)\nexcept ValueError as e:\n    if \"must be positive\" in str(e):\n        mw = RubricMiddleware(model=model, max_iterations=1)\n    else:\n        raise","preventionTips":["Clamp config values with max(1, value) at the config boundary.","Don't use 0 as a 'disabled' sentinel; gate middleware construction instead.","Validate config with a schema before wiring the middleware.","Document the minimum in your config templates."],"tags":["python","validation","constructor","value-error"],"backgroundTag":"invalid-parameter-value","analyzedSha":"a1af029e6e73cb17c36bff823d227747b28e91e1","analyzedAt":"2026-08-29T11:43:24.718Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}