{"record":{"id":"ee9178d834515035","repo":"langchain-ai/deepagents","slug":"rubricmiddleware-model-is-required","errorCode":null,"errorMessage":"RubricMiddleware: `model` is required.","messagePattern":"RubricMiddleware: `model` is required\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"libs/deepagents/deepagents/middleware/rubric.py","lineNumber":572,"sourceCode":"    state_schema = RubricState\n\n    def __init__(  # noqa: D107\n        self,\n        *,\n        model: str | BaseChatModel,\n        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","sourceCodeStart":554,"sourceCodeEnd":590,"githubUrl":"https://github.com/langchain-ai/deepagents/blob/a1af029e6e73cb17c36bff823d227747b28e91e1/libs/deepagents/deepagents/middleware/rubric.py#L554-L590","documentation":"RubricMiddleware requires a `model` (the LLM used to grade against the rubric). An empty/None/falsy model raises ValueError in `__init__` because the middleware cannot perform evaluations without one.","triggerScenarios":"RubricMiddleware(model=None), RubricMiddleware(model=\"\") or omitting the model argument entirely.","commonSituations":"Model loaded conditionally from env/config that resolved to None (missing API key path), or refactoring that dropped the model parameter.","solutions":["Pass a model instance or model string, e.g. RubricMiddleware(model=\"openai:gpt-4o\") or init_chat_model(...)","Check that the config/env providing the model is actually set and non-empty","Fail fast earlier in your setup code if no model is configured"],"exampleFix":"// before\nmw = RubricMiddleware(rubric=my_rubric)  # model missing\n// after\nmw = RubricMiddleware(rubric=my_rubric, model=\"openai:gpt-4o\")","handlingStrategy":"validation","validationCode":"def build_rubric_middleware(**kw):\n    if not kw.get(\"model\"):\n        raise ValueError(\"RubricMiddleware: `model` is required.\")\n    return RubricMiddleware(**kw)","typeGuard":"def has_model(cfg) -> bool:\n    return bool(cfg.get(\"model\"))","tryCatchPattern":"try:\n    mw = RubricMiddleware(rubric=rubric, model=model)\nexcept ValueError as e:\n    if \"model` is required\" in str(e):\n        model = default_model()  # e.g. init_chat_model(\"openai:gpt-4o\")\n        mw = RubricMiddleware(rubric=rubric, model=model)\n    else:\n        raise","preventionTips":["Fail fast at config load when the model entry is missing/empty","Avoid falsy defaults like model=os.environ.get(\"MODEL\") without a fallback","Centralize model resolution in one helper that raises a clear error early"],"tags":["python","validation","rubric","config","llm"],"backgroundTag":"missing-required-parameter","analyzedSha":"a1af029e6e73cb17c36bff823d227747b28e91e1","analyzedAt":"2026-08-29T11:43:24.718Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}