Определение результатов
Сообщите агенту, как выглядит «готово», и позвольте ему итерировать, пока он этого не достигнет.
«Outcome» (результат) сообщает сессии, как должен выглядеть конечный итог и как измерять его качество. Агент работает над достижением этой цели, самостоятельно оценивая себя и итерируя, пока результат не будет достигнут.
Когда вы определяете результат, обвязка (harness) автоматически создаёт grader (оценщик) для оценки артефакта по рубрике. Оценщик использует отдельное «context window» (контекстное окно), чтобы на него не влияли решения основного агента по реализации.
Оценщик возвращает объяснение, в котором кратко указано, какие критерии пройдены или не пройдены, либо подтверждается, что артефакт удовлетворяет рубрике. Эта обратная связь передаётся обратно агенту для следующей итерации.
Создание рубрики
«Rubric» (рубрика) — это документ в формате markdown, описывающий оценку по каждому критерию. Рубрика обязательна.
Структурируйте рубрику в виде явных, поддающихся оценке критериев, например «CSV содержит столбец price с числовыми значениями», а не «Данные выглядят хорошо». Оценщик оценивает каждый критерий независимо, поэтому расплывчатые критерии дают зашумлённые оценки.
Если у вас нет готовой рубрики, попробуйте дать Claude пример заведомо хорошего артефакта и попросить его проанализировать, что делает это содержимое хорошим, а затем превратить этот анализ в рубрику. Такой промежуточный подход часто даёт лучшие результаты, чем написание критериев с нуля.
Пример рубрики:
# DCF Model Rubric
## Revenue Projections
- Uses historical revenue data from the last 5 fiscal years
- Projects revenue for at least 5 years forward
- Growth rate assumptions are explicitly stated and reasonable
## Cost Structure
- COGS and operating expenses are modeled separately
- Margins are consistent with historical trends or deviations are justified
## Discount Rate
- WACC is calculated with stated assumptions for cost of equity and cost of debt
- Beta, risk-free rate, and equity risk premium are sourced or justified
## Terminal Value
- Uses either perpetuity growth or exit multiple method (stated which)
- Terminal growth rate does not exceed long-term GDP growth
## Output Quality
- All figures are in a single .xlsx file with clearly labeled sheets
- Key assumptions are on a separate "Assumptions" sheet
- Sensitivity analysis on WACC and terminal growth rate is includedПередайте рубрику как встроенный текст в user.define_outcome (см. Создание сессии с результатом) или загрузите её через Files API для повторного использования в разных сессиях.
import time
from pathlib import Path
from anthropic import Anthropic
client = Anthropic()
RUBRIC = """# DCF Model Rubric
## Revenue Projections
- Uses historical revenue data from the last 5 fiscal years
- Projects revenue for at least 5 years forward
## Output Quality
- All figures are in a single .xlsx file with clearly labeled sheets
"""
Path("/tmp/rubric.md").write_text(RUBRIC)
rubric = client.files.upload(file=Path("/tmp/rubric.md"))
print(f"Uploaded rubric: {rubric.id}")Создание сессии с результатом
В следующих примерах создаётся сессия для существующих агента и окружения (оба создаются отдельно), а затем отправляется событие user.define_outcome. Агент немедленно приступает к работе. Дополнительное событие с сообщением пользователя не требуется.
# Создать сеанс
session = client.beta.sessions.create(
agent=agent.id,
environment_id=environment.id,
title="Financial analysis on Costco",
)
# Определить результат — агент начинает работу при получении
client.beta.sessions.events.send(
session_id=session.id,
events=[
{
"type": "user.define_outcome",
"description": "Build a DCF model for Costco in .xlsx",
"rubric": {"type": "text", "content": RUBRIC},
# или: "rubric": {"type": "file", "file_id": rubric.id},
"max_iterations": 5, # optional; default 3, max 20
}
],
)События результата
Прогресс сессии, ориентированной на результат, отображается в потоке событий.
- События
agent.*(такие как сообщения и использование инструментов) показывают прогресс в достижении результата. - События
span.outcome_evaluation_*генерируются только для сессий, ориентированных на результат, и показывают количество циклов итераций и процесс обратной связи оценщика. - Вы также можете отправлять события
user.messageв сессию, ориентированную на результат, чтобы направлять работу агента по мере её продвижения, но это не обязательно: агент работает над результатом самостоятельно, итерируя, пока не добьётся успеха или не исчерпает итерации. - Событие
user.interruptприостанавливает работу над текущим результатом и помечаетspan.outcome_evaluation_end.resultкакinterrupted, позволяя вам запустить новый результат. - После финальной оценки результата сессию можно продолжить как диалоговую сессию или начать новый результат. Сессия сохраняет историю предыдущего результата.
Пользовательское событие определения результата
Это событие, которое вы отправляете, чтобы инициировать результат. Оно возвращается эхом при получении, включая временную метку processed_at и outcome_id.
{
"type": "user.define_outcome",
"description": "Build a DCF model for Costco in .xlsx",
"rubric": { "type": "file", "file_id": "file_01..." },
"max_iterations": 5
}Начало оценки результата
Генерируется, когда оценщик начинает оценку одного цикла итерации. Поле iteration — это счётчик ревизий с индексацией от 0: 0 — первая оценка, 1 — повторная оценка после первой ревизии и так далее.
{
"type": "span.outcome_evaluation_start",
"id": "sevt_01def...",
"outcome_id": "outc_01a...",
"iteration": 0,
"processed_at": "2026-03-25T14:01:45Z"
}Оценка результата в процессе
Сигнал активности (heartbeat), генерируемый во время работы оценщика. Внутренние рассуждения оценщика непрозрачны: вы видите, что он работает, но не то, о чём он думает.
{
"type": "span.outcome_evaluation_ongoing",
"id": "sevt_01ghi...",
"outcome_id": "outc_01a...",
"iteration": 0,
"processed_at": "2026-03-25T14:02:10Z"
}Завершение оценки результата
Генерируется, когда цикл оценки результата завершается: после того как оценщик закончит оценку одной итерации, или когда сессия прерывается при активном результате. Поле result указывает, что произойдёт дальше.
| Результат | Далее |
|---|---|
satisfied | Сессия переходит в состояние idle. |
needs_revision | Агент начинает новый цикл итерации. |
max_iterations_reached | Следует один финальный ход подтверждения, после чего сессия переходит в состояние idle. Дальнейшие оценки не выполняются. |
failed | Сессия переходит в состояние idle. Возвращается, когда рубрика неприменима к итоговым материалам, например если описание и рубрика противоречат друг другу. |
interrupted | Генерируется, когда сессия прерывается при активном результате, даже если оценка ещё не началась. Если до прерывания не сработало ни одно событие outcome_evaluation_start, outcome_evaluation_start_id будет пустой строкой. |
{
"type": "span.outcome_evaluation_end",
"id": "sevt_01jkl...",
"outcome_evaluation_start_id": "sevt_01def...",
"outcome_id": "outc_01a...",
"result": "satisfied",
"explanation": "All 12 criteria met: revenue projections use 5 years of historical data, WACC assumptions are stated, sensitivity table is included...",
"iteration": 0,
"usage": {
"input_tokens": 2400,
"output_tokens": 350,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 1800
},
"processed_at": "2026-03-25T14:03:00Z"
}Проверка статуса результата
Вы можете либо слушать поток событий в ожидании span.outcome_evaluation_end, либо опрашивать GET /v1/sessions/{session_id} и читать outcome_evaluations[].result. Пока оценка не завершена, result сообщает pending, running или evaluating:
session = client.beta.sessions.retrieve(session.id)
for outcome in session.outcome_evaluations:
print(f"{outcome.outcome_id}: {outcome.result}")
# outc_01a...: satisfiedПолучение итоговых материалов
Агент записывает выходные файлы в /mnt/session/outputs/ внутри песочницы. Чтобы получить их, выведите список файлов через Files API, указав идентификатор сессии в качестве scope_id, а затем скачайте их по идентификатору. Фильтрация по scope_id требует бета-заголовка managed-agents-2026-04-01 в запросе списка, поэтому примеры для SDK и CLI выполняют этот вызов через пространство имён beta и передают заголовок явно. Файлы появляются в списке вскоре после того, как агент закончит их запись, иногда через несколько секунд после перехода сессии в состояние idle. Если ожидаемый файл ещё не отображается в списке, запросите список снова после небольшой задержки; как только файл появится в списке, его загрузка завершена.
# Список файлов, созданных этим сеансом
# фильтрация по scope_id требует бета-версии managed-agents в запросе к files
files = client.beta.files.list(scope_id=session.id, betas=["managed-agents-2026-04-01"])
for file in files:
print(file.id, file.filename)
# Скачать файл
if files.data:
content = client.files.download(files.data[0].id)
content.write_to_file("/tmp/output.txt")Следующие шаги
Регистрируйте учётные данные для каждого пользователя при создании сессий.
Отправляйте события, получайте ответы в режиме потоковой передачи, а также прерывайте или перенаправляйте сессию в процессе выполнения.
Загружайте файлы и монтируйте их в песочницу для чтения и обработки.
Was this page helpful?