Um "outcome" (resultado) 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 atingido.
Quando você define um resultado, o harness provisiona automaticamente um grader (avaliador) para avaliar o artefato em relação a uma rubrica. O avaliador usa uma "context window" (janela de contexto) separada para evitar ser influenciado pelas escolhas de implementação do agente principal.
O avaliador retorna uma explicação resumindo quais critérios foram aprovados ou reprovados, ou confirmando que o artefato satisfaz a rubrica. Esse feedback é devolvido ao agente para a próxima iteração.
Uma rubrica é um documento markdown que descreve 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 Criar uma sessão com um resultado) ou faça o upload dela por meio 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, em seguida, enviam um evento user.define_outcome. O agente começa a trabalhar imediatamente. Nenhum evento adicional de mensagem do usuário é necessário.
# Criar uma sessão
session = client.beta.sessions.create(
agent=agent.id,
environment_id=environment.id,
title="Financial analysis on Costco",
)
# Definir o resultado — o agente começa a trabalhar ao receber
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},
# ou: "rubric": {"type": "file", "file_id": rubric.id},
"max_iterations": 5, # optional; default 3, max 20
}
],
)O progresso em uma sessão orientada a resultados é 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 resultados e mostram o número de ciclos de iteração e o processo de feedback do avaliador.user.message para uma sessão orientada a resultados para direcionar o trabalho do agente à medida que ele avança, 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 ao ser recebido, 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 avaliador inicia uma avaliação sobre um ciclo de iteração. O campo iteration é um contador de revisões 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 avaliador está em execução. O raciocínio interno do avaliador é 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: depois que o avaliador conclui 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 transita para idle. |
needs_revision | O agente inicia um novo ciclo de iteração. |
max_iterations_reached | Segue-se um turno final de confirmação antes de a sessão transitar para idle. Nenhuma avaliação adicional é executada. |
failed | A sessão transita 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 tiver sido disparado antes da interrupção, outcome_evaluation_start_id será 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 o stream de eventos aguardando 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 informa 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 por meio da Files API com escopo na sessão.
# Listar arquivos produzidos por esta sessão
# A filtragem por scope_id requer o beta managed-agents na requisição de 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)
# Baixar um arquivo
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 durante a execução.
Faça upload de arquivos e monte-os no seu sandbox para leitura e processamento.
Was this page helpful?