outcome meningkatkan sebuah sesi dari sekadar percakapan menjadi pekerjaan. Anda mendefinisikan seperti apa hasil akhir yang diharapkan dan bagaimana mengukur kualitasnya. Agen bekerja menuju target tersebut, melakukan evaluasi mandiri dan iterasi hingga hasil tercapai.
Ketika Anda mendefinisikan sebuah outcome, harness secara otomatis menyediakan grader (penilai) untuk mengevaluasi artefak terhadap sebuah rubrik. Grader menggunakan jendela konteks terpisah agar tidak terpengaruh oleh 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.
Semua permintaan Managed Agents API memerlukan beta header managed-agents-2026-04-01. SDK menetapkan beta header tersebut secara otomatis.
Rubrik adalah dokumen markdown yang menjelaskan penilaian per kriteria. Rubrik bersifat wajib.
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 includedKirimkan rubrik sebagai teks inline pada user.define_outcome (lihat bagian berikutnya), atau unggah melalui Files API untuk digunakan kembali di berbagai sesi.
Mengunggah melalui Files API memerlukan kedua header beta managed-agents-2026-04-01 dan files-api-2025-04-14.
rubric = client.beta.files.upload(file=Path("/tmp/rubric.md"))
print(f"Uploaded rubric: {rubric.id}")Setelah membuat sesi, kirim event user.define_outcome. Agen segera mulai bekerja; tidak diperlukan event pesan pengguna tambahan.
# Buat sesi
session = client.beta.sessions.create(
agent=agent.id,
environment_id=environment.id,
title="Financial analysis on Costco",
)
# Definisikan hasil — agen mulai bekerja saat menerimanya
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},
# atau: "rubric": {"type": "file", "file_id": rubric.id},
"max_iterations": 5, # optional; default 3, max 20
}
],
)Progres pada sesi berorientasi outcome ditampilkan pada stream event.
agent.* (seperti pesan dan penggunaan alat) menunjukkan progres menuju outcome.span.outcome_evaluation_* hanya dipancarkan untuk sesi berorientasi outcome dan menunjukkan jumlah loop iterasi serta proses umpan balik grader.user.message ke sesi berorientasi outcome untuk mengarahkan pekerjaan agen selama berlangsung, tetapi ini tidak wajib: agen bekerja menuju outcome secara mandiri, melakukan iterasi hingga berhasil atau kehabisan iterasi.user.interrupt menjeda pekerjaan pada outcome saat ini dan menandai span.outcome_evaluation_end.result sebagai interrupted, memungkinkan Anda memulai outcome baru.Hanya satu outcome yang didukung dalam satu waktu, tetapi Anda dapat merangkai outcome secara berurutan. Untuk melakukannya, kirim event user.define_outcome baru setelah event terminal dari outcome sebelumnya.
Ini adalah event yang Anda kirim untuk memulai sebuah outcome. Event ini dipantulkan 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 begitu grader memulai evaluasi pada satu loop iterasi. Field iteration adalah penghitung revisi berbasis indeks 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 selama 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...",
"processed_at": "2026-03-25T14:02:10Z"
}Dipancarkan setelah grader selesai mengevaluasi satu iterasi. Field result menunjukkan apa yang terjadi selanjutnya.
| Result | Selanjutnya |
|---|---|
satisfied | Sesi bertransisi ke idle. |
needs_revision | Agen memulai siklus iterasi baru. |
max_iterations_reached | Tidak ada siklus evaluasi lebih lanjut. Agen dapat menjalankan satu revisi terakhir sebelum sesi bertransisi ke idle. |
failed | Sesi bertransisi ke idle. Dikembalikan ketika rubrik secara fundamental tidak cocok dengan tugas, misalnya jika deskripsi dan rubrik saling bertentangan. |
interrupted | Hanya dipancarkan jika outcome_evaluation_start sudah terpicu sebelum interupsi. |
{
"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 pada event stream untuk span.outcome_evaluation_end, atau melakukan polling GET /v1/sessions/:id dan membaca outcome_evaluations[].result:
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 berada dalam status idle, ambil file tersebut melalui Files API yang dicakupkan ke sesi:
# Daftar file yang dihasilkan oleh sesi ini
files = client.beta.files.list(scope_id=session.id)
for f in files:
print(f.id, f.filename)
# Unduh sebuah file
if files.data:
content = client.beta.files.download(files.data[0].id)
content.write_to_file("/tmp/output.txt")Was this page helpful?