Sebuah outcome (hasil) memberi tahu sesi seperti apa hasil akhirnya seharusnya dan bagaimana mengukur kualitasnya. Agen bekerja menuju target tersebut, mengevaluasi diri sendiri dan melakukan iterasi hingga hasil tercapai.
Ketika Anda mendefinisikan sebuah hasil, harness secara otomatis menyediakan grader (penilai) untuk mengevaluasi artefak terhadap sebuah rubrik. Grader menggunakan "context window" (jendela konteks) terpisah untuk menghindari pengaruh dari pilihan implementasi agen utama.
Grader mengembalikan penjelasan yang merangkum kriteria mana yang lulus atau gagal, atau mengonfirmasi bahwa artefak memenuhi rubrik. Umpan balik tersebut diserahkan kembali ke agen untuk iterasi berikutnya.
Rubrik adalah dokumen markdown yang menjelaskan penilaian per kriteria. Rubrik ini wajib ada.
Contoh rubrik:
# 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 includedBerikan rubrik sebagai teks inline pada user.define_outcome (lihat Buat sesi dengan hasil), atau unggah melalui Files API untuk digunakan kembali di berbagai sesi.
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}")Contoh berikut membuat sebuah sesi untuk agen dan lingkungan yang sudah ada (keduanya dibuat secara terpisah), lalu mengirim event user.define_outcome. Agen langsung mulai bekerja. Tidak diperlukan event pesan pengguna tambahan.
# 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
}
],
)Kemajuan pada sesi yang berorientasi hasil ditampilkan pada stream event.
agent.* (seperti pesan dan penggunaan alat) menunjukkan kemajuan menuju hasil.span.outcome_evaluation_* hanya dipancarkan untuk sesi yang berorientasi hasil dan menunjukkan jumlah loop iterasi serta proses umpan balik grader.user.message ke sesi yang berorientasi hasil untuk mengarahkan pekerjaan agen saat berlangsung, tetapi ini tidak wajib: agen bekerja menuju hasil dengan sendirinya, melakukan iterasi hingga berhasil atau kehabisan iterasi.user.interrupt menjeda pekerjaan pada hasil saat ini dan menandai span.outcome_evaluation_end.result sebagai interrupted, memungkinkan Anda memulai hasil baru.Ini adalah event yang Anda kirim untuk memulai sebuah hasil. Event ini digemakan kembali saat diterima, termasuk timestamp processed_at dan 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
}Dipancarkan saat grader memulai evaluasi pada satu loop iterasi. Field iteration adalah penghitung revisi berindeks 0: 0 adalah evaluasi pertama, 1 adalah evaluasi ulang setelah revisi pertama, dan seterusnya.
{
"type": "span.outcome_evaluation_start",
"id": "sevt_01def...",
"outcome_id": "outc_01a...",
"iteration": 0,
"processed_at": "2026-03-25T14:01:45Z"
}Heartbeat yang dipancarkan saat grader berjalan. Penalaran internal grader bersifat tertutup: Anda melihat bahwa grader sedang bekerja, bukan apa yang sedang dipikirkannya.
{
"type": "span.outcome_evaluation_ongoing",
"id": "sevt_01ghi...",
"outcome_id": "outc_01a...",
"iteration": 0,
"processed_at": "2026-03-25T14:02:10Z"
}Dipancarkan ketika siklus evaluasi hasil berakhir: setelah grader selesai mengevaluasi satu iterasi, atau ketika sesi diinterupsi saat sebuah hasil sedang aktif. Field result menunjukkan apa yang terjadi selanjutnya.
| Result | Selanjutnya |
|---|---|
satisfied | Sesi bertransisi ke idle. |
needs_revision | Agen memulai siklus iterasi baru. |
max_iterations_reached | Satu giliran pengakuan terakhir mengikuti sebelum sesi bertransisi ke idle. Tidak ada evaluasi lebih lanjut yang dijalankan. |
failed | Sesi bertransisi ke idle. Dikembalikan ketika rubrik tidak berlaku untuk deliverable, misalnya jika deskripsi dan rubrik saling bertentangan. |
interrupted | Dipancarkan ketika sesi diinterupsi saat sebuah hasil sedang aktif, bahkan jika evaluasi belum dimulai. Jika tidak ada outcome_evaluation_start yang dipicu sebelum interupsi, outcome_evaluation_start_id adalah string kosong. |
{
"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"
}Anda dapat mendengarkan stream event untuk span.outcome_evaluation_end, atau melakukan polling GET /v1/sessions/{session_id} dan membaca outcome_evaluations[].result. Hingga evaluasi selesai, result melaporkan pending, running, atau evaluating:
session = client.beta.sessions.retrieve(session.id)
for outcome in session.outcome_evaluations:
print(f"{outcome.outcome_id}: {outcome.result}")
# outc_01a...: satisfiedAgen menulis file output ke /mnt/session/outputs/ di dalam sandbox. Setelah sesi idle, ambil file tersebut melalui Files API yang dicakup ke sesi tersebut.
# 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")Daftarkan kredensial per pengguna saat membuat sesi.
Kirim event, streaming respons, dan interupsi atau alihkan sesi Anda di tengah eksekusi.
Unggah file dan pasang di sandbox Anda untuk dibaca dan diproses.
Was this page helpful?