Результат (outcome) сообщает сессии, как должен выглядеть конечный результат и как измерять его качество. Агент работает над достижением этой цели, самостоятельно оценивая и итерируя, пока результат не будет достигнут.
Когда вы определяете результат, harness (оболочка) автоматически создаёт grader (оценщика) для оценки артефакта по рубрике. Оценщик использует отдельное контекстное окно, чтобы избежать влияния решений по реализации, принятых основным агентом.
Оценщик возвращает объяснение, суммирующее, какие критерии были выполнены или не выполнены, либо подтверждающее, что артефакт удовлетворяет рубрике. Эта обратная связь передаётся обратно агенту для следующей итерации.
Рубрика — это markdown-документ, описывающий оценку по каждому критерию. Рубрика обязательна.
Пример рубрики:
# 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. Агент начинает работу немедленно. Дополнительное событие пользовательского сообщения не требуется.
# Create a session
session = client.beta.sessions.create(
agent=agent.id,
environment_id=environment.id,
title="Financial analysis on Costco",
)
# Define the outcome — agent starts working on receipt
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},
# or: "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/ внутри песочницы. Как только сессия перейдёт в состояние idle, получите их через Files API с областью действия, ограниченной сессией.
# List files produced by this session
# scope_id filtering requires the managed-agents beta on the files request
files = client.beta.files.list(scope_id=session.id, betas=["managed-agents-2026-04-01"])
for file in files:
print(file.id, file.filename)
# Download a file
if files.data:
content = client.files.download(files.data[0].id)
content.write_to_file("/tmp/output.txt")Регистрируйте учётные данные для каждого пользователя при создании сессий.
Отправляйте события, получайте ответы в потоковом режиме, прерывайте или перенаправляйте сессию во время выполнения.
Загружайте файлы и монтируйте их в песочницу для чтения и обработки.
Was this page helpful?