«Outcome» (результат) сообщает сессии, как должен выглядеть конечный итог и как измерять его качество. Агент работает над достижением этой цели, самостоятельно оценивая себя и итерируя, пока результат не будет достигнут.
Когда вы определяете результат, обвязка (harness) автоматически создаёт grader (оценщик) для оценки артефакта по рубрике. Оценщик использует отдельное «context window» (контекстное окно), чтобы на него не влияли решения основного агента по реализации.
Оценщик возвращает объяснение, в котором кратко указано, какие критерии пройдены или не пройдены, либо подтверждается, что артефакт удовлетворяет рубрике. Эта обратная связь передаётся обратно агенту для следующей итерации.
«Rubric» (рубрика) — это документ в формате 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. Агент немедленно приступает к работе. Дополнительное событие с сообщением пользователя не требуется.
# Создать сеанс
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/ внутри песочницы. Когда сессия перейдёт в состояние idle, получите их через Files API с областью видимости, ограниченной сессией.
# Список файлов, созданных этим сеансом
# фильтрация по 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?