アウトカムを定義する
エージェントに「完了」の状態を伝え、そこに到達するまで反復させます。
「outcome」(アウトカム)は、最終結果がどのようなものであるべきか、そしてその品質をどのように測定するかをセッションに伝えます。エージェントはその目標に向かって作業し、アウトカムが満たされるまで自己評価と反復を繰り返します。
アウトカムを定義すると、「harness」(ハーネス)が自動的に「grader」(グレーダー)をプロビジョニングし、「rubric」(ルーブリック)に照らして「artifact」(成果物)を評価します。グレーダーは、メインエージェントの実装上の選択に影響されないよう、別の「context window」(コンテキストウィンドウ)を使用します。
グレーダーは、どの基準が合格または不合格だったかを要約した説明、または成果物がルーブリックを満たしていることを確認する説明を返します。そのフィードバックは、次の反復のためにエージェントに渡されます。
ルーブリックを作成する
ルーブリックは、基準ごとの採点方法を記述したMarkdownドキュメントです。ルーブリックは必須です。
ルーブリックは、「データが良さそうに見える」ではなく「CSVに数値を含むprice列がある」のように、明示的で採点可能な基準として構成してください。グレーダーは各基準を個別に採点するため、曖昧な基準はばらつきのある評価につながります。
手元にルーブリックがない場合は、良いことがわかっている成果物の例をClaudeに渡し、そのコンテンツの何が優れているのかを分析するよう依頼してから、その分析をルーブリックに変換してみてください。この中間的なアプローチは、基準をゼロから書くよりも良い結果を生むことがよくあります。
ルーブリックの例:
# 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イベントを送信します。エージェントはすぐに作業を開始します。追加のユーザーメッセージイベントは必要ありません。
# 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
}
],
)アウトカムイベント
アウトカム指向のセッションの進捗は、イベントストリーム上に表示されます。
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
}アウトカム評価の開始
グレーダーが1回の反復ループに対する評価を開始したときに発行されます。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"
}アウトカム評価の進行中
グレーダーの実行中に発行されるハートビートです。グレーダーの内部推論は不透明です。グレーダーが動作していることはわかりますが、何を考えているかはわかりません。
{
"type": "span.outcome_evaluation_ongoing",
"id": "sevt_01ghi...",
"outcome_id": "outc_01a...",
"iteration": 0,
"processed_at": "2026-03-25T14:02:10Z"
}アウトカム評価の終了
アウトカム評価サイクルが終了したとき、つまりグレーダーが1回の反復の評価を終えたとき、またはアウトカムがアクティブな間にセッションが中断されたときに発行されます。resultフィールドは次に何が起こるかを示します。
| 結果 | 次の動作 |
|---|---|
satisfied | セッションはidleに移行します。 |
needs_revision | エージェントが新しい反復サイクルを開始します。 |
max_iterations_reached | セッションがidleに移行する前に、最後の確認ターンが1回行われます。それ以上の評価は実行されません。 |
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/に出力ファイルを書き込みます。それらを取得するには、セッションIDをscope_idとしてFiles APIでファイルを一覧表示し、IDを指定してダウンロードします。scope_idによるフィルタリングには一覧リクエストにmanaged-agents-2026-04-01ベータヘッダーが必要なため、SDKとCLIの例ではbeta名前空間を通じてその呼び出しを行い、ヘッダーを明示的に渡しています。ファイルは、エージェントが書き込みを終えた直後に一覧に表示されますが、セッションがアイドル状態になってから数秒後になることもあります。期待するファイルがまだ一覧に表示されていない場合は、少し待ってから再度一覧を取得してください。一覧に表示されれば、そのアップロードは完了しています。
# 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")次のステップ
セッション作成時にユーザーごとの認証情報を登録します。
イベントを送信し、レスポンスをストリーミングし、実行中のセッションを中断またはリダイレクトします。
ファイルをアップロードし、読み取りと処理のためにサンドボックスにマウントします。
Was this page helpful?