Um resultado (outcome) informa à sessão como deve ser o resultado final e como medir sua qualidade. O agente trabalha em direção a esse alvo, autoavaliando-se e iterando até que o resultado seja alcançado.
Quando você define um resultado, o harness provisiona automaticamente um grader (avaliador) para avaliar o artefato em relação a uma rubrica. O grader usa uma "context window" (janela de contexto) separada para evitar ser influenciado pelas escolhas de implementação do agente principal.
O grader retorna uma explicação resumindo quais critérios passaram ou falharam, ou confirmando que o artefato satisfaz a rubrica. Esse feedback é devolvido ao agente para a próxima iteração.
Uma rubrica é um documento markdown descrevendo a pontuação por critério. A rubrica é obrigatória.
Exemplo de rubrica:
# 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 includedPasse a rubrica como texto inline em user.define_outcome (consulte Crie uma sessão com um resultado), ou faça upload dela através da Files API para reutilização entre sessões.
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}")Os exemplos a seguir criam uma sessão para um agente e um ambiente existentes (ambos criados separadamente), e então enviam um evento user.define_outcome. O agente começa a trabalhar imediatamente. Nenhum evento adicional de mensagem do usuário é necessário.
# 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
}
],
)O progresso em uma sessão orientada a resultado é exibido no stream de eventos.
agent.* (como mensagens e uso de ferramentas) mostram o progresso em direção ao resultado.span.outcome_evaluation_* são emitidos apenas para sessões orientadas a resultado e mostram o número de ciclos de iteração e o processo de feedback do grader.user.message para uma sessão orientada a resultado para direcionar o trabalho do agente conforme ele progride, mas isso não é obrigatório: o agente trabalha em direção ao resultado por conta própria, iterando até ter sucesso ou esgotar as iterações.user.interrupt pausa o trabalho no resultado atual e marca o span.outcome_evaluation_end.result como interrupted, permitindo que você inicie um novo resultado.Este é o evento que você envia para iniciar um resultado. Ele é ecoado de volta no recebimento, incluindo um timestamp processed_at e um 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
}Emitido quando o grader inicia uma avaliação em um ciclo de iteração. O campo iteration é um contador de revisão indexado a partir de 0: 0 é a primeira avaliação, 1 é a reavaliação após a primeira revisão, e assim por diante.
{
"type": "span.outcome_evaluation_start",
"id": "sevt_01def...",
"outcome_id": "outc_01a...",
"iteration": 0,
"processed_at": "2026-03-25T14:01:45Z"
}Heartbeat emitido enquanto o grader é executado. O raciocínio interno do grader é opaco: você vê que ele está trabalhando, não o que ele está pensando.
{
"type": "span.outcome_evaluation_ongoing",
"id": "sevt_01ghi...",
"outcome_id": "outc_01a...",
"iteration": 0,
"processed_at": "2026-03-25T14:02:10Z"
}Emitido quando um ciclo de avaliação de resultado termina: após o grader concluir a avaliação de uma iteração, ou quando a sessão é interrompida enquanto um resultado está ativo. O campo result indica o que acontece em seguida.
| Resultado | Próximo passo |
|---|---|
satisfied | A sessão transiciona para idle. |
needs_revision | O agente inicia um novo ciclo de iteração. |
max_iterations_reached | Um turno final de reconhecimento ocorre antes de a sessão transicionar para idle. Nenhuma avaliação adicional é executada. |
failed | A sessão transiciona para idle. Retornado quando a rubrica não se aplica aos entregáveis, por exemplo, se a descrição e a rubrica se contradizem. |
interrupted | Emitido quando a sessão é interrompida enquanto um resultado está ativo, mesmo que a avaliação ainda não tenha começado. Se nenhum outcome_evaluation_start foi disparado antes da interrupção, outcome_evaluation_start_id é uma string vazia. |
{
"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"
}Você pode escutar no stream de eventos por span.outcome_evaluation_end, ou fazer polling em GET /v1/sessions/{session_id} e ler outcome_evaluations[].result. Até que uma avaliação seja concluída, result reporta pending, running ou evaluating:
session = client.beta.sessions.retrieve(session.id)
for outcome in session.outcome_evaluations:
print(f"{outcome.outcome_id}: {outcome.result}")
# outc_01a...: satisfiedO agente grava os arquivos de saída em /mnt/session/outputs/ dentro do sandbox. Quando a sessão estiver ociosa, busque-os através da Files API com escopo na sessão.
# 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")Registre credenciais por usuário ao criar sessões.
Envie eventos, faça streaming de respostas e interrompa ou redirecione sua sessão no meio da execução.
Faça upload de arquivos e monte-os em seu sandbox para leitura e processamento.
Was this page helpful?