Агенты часто выдают результат, который движется в правильном направлении, но не достигает цели с первой попытки. Для решения этой проблемы представили RubricMiddleware — механизм, который задаёт агенту критерии завершённости задачи и заставляет его повторять попытки, пока критерии не будут выполнены или не будет достигнут заданный лимит итераций.
Механизм работает так: перед завершением работы агента отдельный субагент-оценщик (grader) проверяет результат по заданному рубрикатору (rubric). Если все критерии соблюдены — работа завершается. Если есть недочёты — оценщик возвращает агенту обратную связь по каждому критерию, и агент выполняет задачу заново. Цикл завершается, когда все критерии рубрикатора удовлетворены, либо достигнут лимит итераций, либо произошла ошибка.
Чтобы настроить механизм, нужно выполнить три шага:
1. Определить RubricMiddleware — он добавит цикл оценщика поверх базового агента. При настройке оценщика указывают:
- модель LLM, которая будет использоваться для оценки (часто менее ресурсоёмкая, чем основная модель агента);
- systemprompt — инструкции, которые определяют роль оценщика и критерии «хорошего» результата;
- инструменты, которые оценщик может использовать для сбора доказательств (например, запуск тестов, проверка кода, валидация результатов);
- максимальное число циклов исправления и повторной оценки.
2. Передать RubricMiddleware агенту. У агента тоже должны быть свои инструкции (systemprompt) — они определяют, как выполнять задачу, а рубрикатор задаёт критерии оценки результата.
3. Вызвать механизм с сообщением от пользователя и рубрикатором. При вызове нужно предоставить сообщения (запрос пользователя и, при необходимости, предыдущие шаги диалога) и рубрикатор — список критериев, которые оценщик должен проверить.
Например, при генерации кода первая попытка агента могла выглядеть корректно, но не пройти один тест. Оценщик вернул сообщение: «Один тест не пройден: test_unhashable. Функция выдаёт ошибку TypeError при встрече с нехешируемыми типами, например, со списками внутри входного списка». Агент исправил реализацию и прошёл все тесты со второй попытки. Обратная связь не сводится к общему «попробуйте ещё раз»: по каждому критерию даётся отдельный вердикт, поэтому агент точно понимает, что нужно исправить.
Механизм особенно полезен для задач с чёткими, проверяемыми критериями успеха: например, когда нужно пройти набор тестов, избежать запрещённых шаблонов кода или включить в отчёт все обязательные разделы.
RubricMiddleware пока в бета‑версии, API может измениться. Подробнее о настройке, отслеживании работы и сохранении рубрикаторов можно узнать в документации.
Go back to blog
Create agents
RubricMiddleware
Deep Agents
Claude Code
sub-agent
middleware
tools
from deepagents import RubricMiddleware
rubric_middleware = RubricMiddleware(
model="anthropic:claude-haiku-4-5",
system_prompt="You are a code reviewer grading generated code against a rubric.",
tools=[run_test_suite],
max_iterations=5,
)
deep agent
middleware
from deepagents import create_deep_agent
agent = create_deep_agent(
model="anthropic:claude-sonnet-4-6",
system_prompt=(
"You are a careful Python engineer. Write correct, readable code. "
"Follow the user’s instructions exactly."
),
middleware=[rubric_middleware],
)
from langchain.messages import HumanMessage
result = agent.invoke(
{
"messages": [
HumanMessage(
content=(
"Write a Python function `find_duplicates(lst)` that returns a list of "
"all elements that appear more than once in the input list, in the order "
"they first appear."
)
)
],
"rubric": (
"- All tests pass in run_test_suite\n"
"- The function is named `find_duplicates` and accepts a single list argument\n"
),
},
config={"configurable": {"thread_id": "code-generation-session"}},
)
print(result"messages".text)
this trace
the documentation