AIに「完成条件」を渡して自己採点させる|Managed Agents Outcomes実装ガイド【2026年7月】

Claude
AIエージェント実装

AIに「完成条件」を渡して自己採点させる|Managed Agents Outcomes実装ガイド【2026年7月】

「まだ足りない、もう一度」と人間が何度も差し戻す作業を、仕組みに置き換えます。Anthropic公式のOutcomesは、採点基準(ルーブリック)を渡すと専用の採点役AIが成果物を評価し、合格するまでエージェントが自動で作り直す機能です。実装コードと、成否を分けるルーブリックの書き方をまとめました。

「差し戻しループ」を人間から外す

AIに資料やコードを作らせるとき、多くの人が同じことをしています。出てきたものを見て、足りない点を指摘して、直させる。また見て、また指摘する。この往復が3回も続くと、自分でやったほうが早かったのではないかという気分になります。

この往復が発生する根本原因は、「完成の定義」がAIに渡っていないことです。人間の頭の中にはチェックリストがあるのに、それを言語化せずに「いい感じにやって」と投げているから、何度も戻ってくる。

Outcomesは、そのチェックリストを最初に渡してしまう仕組みです。Anthropicの Managed Agents に用意された機能で、次のように動きます。

  1. あなたが「達成したいこと」と「採点基準(ルーブリック)」を渡す
  2. エージェントが作業して成果物を作る
  3. 採点役のAI(グレーダー)が、ルーブリックの各項目を独立に採点する
  4. 不合格なら、どの項目が足りないかがエージェントに戻され、作り直す
  5. 合格するか、回数上限に達するまで2〜4を繰り返す
グレーダーは別の頭で採点する

採点役は、作業したエージェントとは別のコンテキストウィンドウで動きます。これは「自分の書いたものを自分で採点すると甘くなる」問題への設計上の対策です。実装の途中経過や言い訳を見ずに、成果物とルーブリックだけを突き合わせて判定します。

Managed Agentsを知らない人向けの1段落

Managed Agentsは、AIエージェントの実行ループとサンドボックス環境の両方をAnthropicがホストするサービスです。APIで「エージェント設定」と「実行環境」を登録して「セッション」を作ると、Anthropic側のコンテナ内でbashやファイル操作を伴う作業が走ります。Outcomesは、そのセッションに対して「完成条件」を与える機能です。

成否の9割はルーブリックの書き方で決まる

実装は数十行で終わります。難しいのはルーブリックです。ここが曖昧だと、採点が毎回ブレて、ループが無駄に回るだけになります。

原則はひとつ、「各項目を独立に、機械的に判定できるか」です。グレーダーは項目ごとに個別採点するため、判断が主観に依存する書き方をすると評価が安定しません。

悪い書き方なぜダメか良い書き方
データが正しく整形されている 「正しく」の基準が採点のたびに揺れる CSVに price 列があり、全行が数値である
読みやすいレポートになっている 主観。合格ラインが定まらない 冒頭に3行以内の結論があり、各数値に集計期間が併記されている
適切にテストされている 「適切」が測れない 新規追加した各関数に対して、正常系と異常系のテストが1つ以上ある
エラーハンドリングがされている どこまでやれば足りるか不明 外部API呼び出し箇所すべてでタイムアウトと接続エラーを捕捉している

ルーブリックの実例

Markdownで書きます。見出しでカテゴリを分け、箇条書きで判定項目を並べる形式が扱いやすいです。

# 月次売上レポート ルーブリック

## データの正確性
- 集計期間が明記されており、指定された月と一致している
- 各数値に集計元のテーブル名またはファイル名が併記されている
- 合計値が個別項目の合算と一致している

## 構成
- 冒頭に3行以内の結論セクションがある
- 前月比・前年同月比の両方が記載されている
- 数値が悪化している項目には、推定原因が1つ以上添えられている

## 出力形式
- 単一の .xlsx ファイルとして出力されている
- 「サマリ」「明細」「前提条件」の3シートに分かれている
- 前提条件シートに、使用した為替レートと集計ルールが記載されている
ルーブリックが思いつかないときの裏技

公式が推奨している方法です。「これは良い」と言える過去の成果物をClaudeに渡し、「なぜこれが良いのかを分析して」と頼み、その分析結果をルーブリックに変換します。ゼロから基準を書き出すより、はるかに実用的なものができます。

暗黙知になっている「うちの会社のレポートはこうあるべき」を言語化する作業でもあるので、AIを使わない場面でも役立ちます。

ルーブリックは必須です。省略はできません。インラインのテキストとして渡すか、Files APIでアップロードして複数セッションで使い回すこともできます。

実装:セッションを作って完成条件を送る

前提

Managed Agentsはベータ機能で、ANTHROPIC_API_KEY が必須です。Claude CodeやClaude.aiのサブスクリプションログインでは利用できません。Managed Agentsのリクエストには managed-agents-2026-04-01 ベータヘッダーが必要ですが、公式SDKなら自動付与されます。

エージェントと環境はあらかじめ作成済みとします(作り方は定期実行の記事のステップ1が同じ内容です)。

from anthropic import Anthropic

client = Anthropic()

RUBRIC = """# 月次売上レポート ルーブリック

## データの正確性
- 集計期間が明記されており、指定された月と一致している
- 各数値に集計元のテーブル名またはファイル名が併記されている

## 出力形式
- 単一の .xlsx ファイルとして出力されている
- 「サマリ」「明細」「前提条件」の3シートに分かれている
"""

# 1. セッションを作る
session = client.beta.sessions.create(
    agent=agent.id,
    environment_id=environment.id,
    title="2026年6月の売上レポート",
)

# 2. 完成条件を送る(これだけでエージェントは作業を開始する)
client.beta.sessions.events.send(
    session_id=session.id,
    events=[
        {
            "type": "user.define_outcome",
            "description": "2026年6月の月次売上レポートを .xlsx で作成する",
            "rubric": {"type": "text", "content": RUBRIC},
            "max_iterations": 5,       # 省略可。デフォルト3、最大20
        }
    ],
)
user.message を追加で送らないこと

user.define_outcome を受け取った時点で、エージェントは作業を開始します。「じゃあ始めて」という user.message を追加で送る必要はありませんし、送ると余計な指示として解釈される可能性があります。description がそのまま作業依頼になります。

セッション作成と完成条件の送信は、1回のAPIコールにまとめることもできます。sessions.createinitial_eventsuser.define_outcome を1つ渡すだけです。定期実行のデプロイメントと組み合わせれば、「毎月1日に、ルーブリックを満たすレポートが自動生成されるまで作り直す」という構成が作れます。

max_iterations の決め方

デフォルトは3回、最大20回です。1回のイテレーションは「作業+採点」なので、上限を上げるほどトークン消費が増えます。

回数向いている状況
3(デフォルト)ルーブリックが検証済みで、だいたい1〜2回で通ることがわかっている
5前後実運用の標準。項目数が10前後の複合的な成果物
10以上試行錯誤が前提の難タスク。コストを許容できる場合のみ

実務上は、まず3回で回してみて、毎回上限に達するならルーブリックが厳しすぎるか曖昧すぎるかを疑うのが健全な使い方です。回数を上げる前に基準を見直してください。

進捗の読み方:3つのイベントと5つの結果

採点の進行はイベントストリームに流れます。通常の agent.* イベント(作業内容)に加えて、Outcomes専用のイベントが3種類あります。

イベント意味
span.outcome_evaluation_start採点が始まった。iteration は0始まりの周回カウンタ
span.outcome_evaluation_ongoing採点中のハートビート。採点役の思考内容は見えない
span.outcome_evaluation_end採点が終わった。resultexplanation が入る

肝心なのは span.outcome_evaluation_endresult です。ここで次に何が起きるかが決まります。

result意味次に起きること
satisfied 全項目合格 セッションがidleへ。正常終了
needs_revision 不合格項目あり エージェントが次の周回を始める(まだ終わっていない)
max_iterations_reached 上限到達 最後に1回だけ確認ターンが入り、idleへ。以降の採点はなし
failed ルーブリックが成果物に適用できない idleへ。依頼文とルーブリックが矛盾しているサイン
interrupted 途中で中断された idleへ。採点開始前の中断でも発生する

explanation には「12項目すべて合格。売上予測は5年分の実績を使用し…」のように、どの項目がなぜ合否だったかの要約が入ります。これがそのままエージェントへのフィードバックになり、次の周回の改善指示として使われます。

ループを抜ける判定を間違えやすい

span.outcome_evaluation_end が来ただけで「終わった」と判断してはいけません。needs_revision の場合、セッションはまだ動き続けます。

正しい終了判定は、session.status_idle イベントを見て、その stop_reason.typerequires_action 以外であることです。requires_action はツール承認などの入力待ちなので、そこで抜けるとセッションが宙に浮きます。

ポーリングで状態を見る

ストリームを常時つないでおけない場合は、セッションを取得して確認できます。

session = client.beta.sessions.retrieve(session.id)

for outcome in session.outcome_evaluations:
    print(f"{outcome.outcome_id}: {outcome.result}")
    # outc_01a...: satisfied

採点が完了するまでの間、resultpending / running / evaluating のいずれかを返します。これらは「まだ途中」を意味するので、終了判定に使う値(前掲の5つ)と混同しないよう注意してください。

成果物を受け取る

エージェントはサンドボックス内の /mnt/session/outputs/ に出力ファイルを書きます。セッションがidleになったら、Files APIをセッションIDでスコープして取得します。

# scope_id での絞り込みには managed-agents ベータの明示指定が必要
files = client.beta.files.list(
    scope_id=session.id,
    betas=["managed-agents-2026-04-01"],
)
for file in files:
    print(file.id, file.filename)

if files.data:
    content = client.beta.files.download(files.data[0].id)
    content.write_to_file("/tmp/report.xlsx")
ベータヘッダーの明示指定が必要な例外

SDKのFiles APIメソッドは通常、Files用のベータヘッダーだけを自動付与します。scope_id はManaged Agents側のパラメータなので、betas=["managed-agents-2026-04-01"] を明示的に渡さないと弾かれます。Managed Agentsまわりで唯一この指定が要る箇所なので、覚えておくとハマりません。

また、idleになった直後はファイルのインデックスに1〜3秒の遅延があります。一覧が空だった場合は少し待ってから再試行してください。

運用ルール:知らないと詰まる4点

1. 同時に扱えるOutcomeは1つだけ

複数の完成条件を並行して走らせることはできません。順番につなぐ(チェーンする)ことは可能で、その場合は前のOutcomeの終端イベント(satisfied / max_iterations_reached / failed / interrupted のいずれか)を待ってから次の user.define_outcome を送ります。セッションの履歴は引き継がれます。

2. 途中で口を出すことはできるが、必要ない

作業中に user.message で方向修正を送ることは可能です。ただし「そのまま続けて」といった催促は不要です。エージェントは終端に達するまで自律的に回り続ける設計なので、催促のメッセージはトークンを消費するだけになります。

3. 中断は「一時停止」ではなく「そのOutcomeの終了」

user.interrupt を送ると、進行中のOutcomeは result: "interrupted" として終了し、セッションはidleになります。再開ではなく、新しいOutcomeを定義し直すか、通常の会話として続けることになります。

なお、採点が始まる前に中断した場合、outcome_evaluation_start_id が空文字列になります。この値をキーにして何かを引くコードを書いていると落ちるので、空チェックを入れてください。

4. failed が出たら回数ではなく設計を疑う

failed は「頑張ったけど届かなかった」ではありません。ルーブリックが成果物に対して適用不能という判定です。典型的には、description で頼んだものとルーブリックの採点対象が食い違っているケースです。

たとえば「CSVを作って」と依頼しているのに、ルーブリックが「.xlsxの3シート構成であること」を求めている、といった矛盾です。max_iterations を増やしても解決しません。

Outcomesが向く仕事・向かない仕事

タスク向き不向き理由
定型フォーマットのレポート・資料作成 非常に向く 「あるべき形」が既に決まっており、機械的に判定できる
データ変換・集計処理 非常に向く 列の存在、型、件数など検証可能な条件に落としやすい
テストを伴うコード実装 向く 「全テストが通る」「各関数にテストがある」を基準にできる
調査・リサーチ 条件付き 「出典が3件以上」「各主張に出典が紐づく」など形式面なら判定可能。内容の妥当性は測れない
企画の発想・アイデア出し 向かない 良し悪しを機械的に判定できない。ループが無意味に回る
デザイン・文章のトーン調整 向かない 主観的評価。人間のレビューに戻したほうが速い

判断基準はシンプルで、「合格・不合格を、人が見なくても判定できる条件に書き下せるか」です。書き下せないタスクにOutcomesを使うと、採点がブレて回数を消費するだけになります。

Vertex AI・Bedrock経由のClaudeでは使えない

「うちはGoogle CloudのVertex AI(Agent Platform)でClaudeを使っている」「AWSのBedrock経由で契約している」というケースは多いはずです。結論から書くと、Managed Agentsはこれらのプラットフォームでは利用できません。Anthropicの公式ドキュメントに、サポート対象外として明記されています。

提供経路推論基盤の運営Managed Agents
Claude API(Anthropic直接)Anthropic使える(ベータ)
Claude Platform on AWSAnthropic使える(ベータ・差異あり)
Amazon BedrockAWS使えない
Google Cloud(Vertex AI / Agent Platform)Google使えない
Microsoft FoundryAnthropic(Azure上)使えない
「Claude Platform on AWS」と「Amazon Bedrock」は別物

ここが最も紛らわしい点です。同じAWS経由でも、Amazon BedrockはAWSが推論基盤を運用する形態で、Managed Agentsは使えません。一方Claude Platform on AWSはAnthropicが運用し、AWSは認証(SigV4またはAPIキー)・IAMによるアクセス制御・AWS Marketplace経由の課金を担当する形態で、こちらならManaged Agentsが使えます。

「AWSでClaudeを使っている」だけでは判別できません。エンドポイントが bedrock-mantle.{リージョン}.api.aws ならAmazon Bedrock、aws-external-anthropic.{リージョン}.api.aws ならClaude Platform on AWSです。

なぜ使えないのか

Managed Agentsが「モデルを呼び出すAPI」ではなく、エージェントの実行ループとサンドボックス環境そのものをAnthropicがホストするサービスだからです。Vertex AIやBedrockが提供しているのは推論(Messages API)であって、Anthropic側のコンテナやスケジューラではありません。

同じ理由で、これらのプラットフォームではFiles API・コード実行・Agent Skills・MCPコネクタ・Message Batchesなども対象外です。Vertex AI・Amazon Bedrock・Microsoft Foundryそれぞれの公式ドキュメントに、いずれも「サポートされない機能」の一覧としてClaude Managed Agentsが挙げられています。

コンプライアンス要件が理由なら、そもそも要件と合わない可能性

Vertex AIやBedrockを選んでいる理由が「データ保持やコンプライアンスの要件」である場合、注意が必要です。Managed Agentsは設計上ステートフルで、会話履歴・サンドボックスの状態・成果物をサーバー側に保存します。そのためAnthropicは、Managed Agentsをゼロデータ保持(ZDR)とHIPAA BAAの対象外と明記しています。

ただしセッションおよびアップロードしたファイルは、APIからいつでも削除できます。要件次第では運用でカバーできる場合もあるため、法務・情報システム部門と確認してください。

Claude Platform on AWSを選ぶ場合の差異

Claude Platform on AWSでもManaged Agentsは使えますが、セッションの挙動が1点だけ異なります。ユーザーからのイベントが一切ない状態で自律実行できるのは最大6時間までで、それを超えると継続に再認証が必要です(任意のユーザーイベントを送れば再認証されます)。Claude API直接の場合、この自律実行時間の上限はありません。

Vertex AI・Bedrockのままで近いことを実現するには

「基準を渡して自己採点させる」という考え方自体は、Messages APIだけで再現できます。構造化出力(structured outputs)はVertex AI・Amazon Bedrockでも利用できるため、次の3段構えを自分で組む形になります。

  1. 作業用の呼び出しで成果物を作らせる
  2. 別の呼び出しで、ルーブリックと成果物を渡して採点させる。構造化出力で合否と理由をJSONで返させる
  3. 不合格なら理由を添えて1に戻る。合格または上限回数で終了
GRADER_SCHEMA = {
    "type": "object",
    "properties": {
        "passed": {"type": "boolean"},
        "failed_criteria": {"type": "array", "items": {"type": "string"}},
        "explanation": {"type": "string"},
    },
    "required": ["passed", "failed_criteria", "explanation"],
    "additionalProperties": False,
}

# 採点は「作業とは別の呼び出し」にするのが肝心。
# 同じ会話の続きで採点させると、自分の実装意図に引きずられて甘くなる。
verdict = client.messages.create(
    model="claude-opus-5",
    max_tokens=4096,
    system="あなたは採点者です。提示されたルーブリックの各項目を独立に判定してください。",
    messages=[{
        "role": "user",
        "content": f"# ルーブリック\n{RUBRIC}\n\n# 成果物\n{artifact}",
    }],
    output_config={"format": {"type": "json_schema", "schema": GRADER_SCHEMA}},
)

失われるのは「採点役が自動で用意される」「別コンテキストであることが保証される」「イテレーション管理が自動」の3点です。特に2つ目は自分で気をつける必要があります。作業した会話の続きで採点させると、実装の経緯が文脈に残っているぶん判定が甘くなるため、採点は必ず新しい呼び出しとして分離してください

一方で利点もあります。採点ロジックを自分で握れるため、AIによる判定だけでなく、機械的な検証を採点に組み込めます。テストの実行結果、リンターの出力、JSONスキーマ検証などを先に走らせ、それらを通ったものだけAIに渡す構成にすれば、採点の安定性はManaged Agentsより高くなることさえあります。

よくある質問

Q. Claude CodeやClaude.aiで同じことはできますか?

Outcomes機能そのものはManaged Agents(API)専用です。ただし考え方は流用できます。Claude Codeで作業させる際、依頼と同時に「完成条件」をチェックリスト形式で渡し、「全項目を満たすまで自分で確認して直してから報告して」と指示するだけでも、差し戻し回数はかなり減ります。仕組みとして自動化されるか、プロンプトでお願いするかの違いです。

Q. 採点役はなぜ不合格にしたのか、詳しく見られますか?

span.outcome_evaluation_endexplanation に判定理由の要約が入ります。ただし採点役の内部的な思考プロセスは公開されません(ongoing イベントは「動いている」ことを示すだけです)。判定がおかしいと感じた場合は、ルーブリックの該当項目の書き方を具体化するのが対処になります。

Q. コストはどれくらい増えますか?

採点は独立したAI呼び出しなので、そのぶん課金されます。span.outcome_evaluation_endusage フィールドに、その採点で使ったトークン数(入力・出力・キャッシュ)が入るので、実測できます。イテレーションが回るほど「作業+採点」が積み重なるため、max_iterations を無闇に上げないことがコスト管理の基本です。

Q. ルーブリックは毎回書き直す必要がありますか?

いいえ。Files APIにアップロードしておけば、{"type": "file", "file_id": "..."} の形で複数セッションから参照できます。定期実行と組み合わせる場合は、この方式にしておくとルーブリックの改訂が1箇所で済みます。

Q. 上限に達したとき、成果物は捨てられますか?

捨てられません。max_iterations_reached の場合も、最後に確認ターンが1回入ってからセッションがidleになり、それまでに作られたファイルは /mnt/session/outputs/ に残っています。「完璧ではないが8割できている成果物」として回収し、人間が仕上げる運用は十分成立します。

まとめ

Outcomesの要点
  • Vertex AI・Amazon Bedrock・Microsoft Foundry経由では利用できない(Claude APIまたはClaude Platform on AWSが必要)
  • 完成条件(ルーブリック)を渡すと、別コンテキストの採点役AIが評価し、合格まで自動で作り直す
  • 成否の9割はルーブリックが機械的に判定できる書き方になっているかで決まる
  • ルーブリックが書けないときは、良い成果物をAIに分析させて基準に変換する
  • user.define_outcome を送った時点で作業が始まる。追加の user.message は不要
  • needs_revision はまだ途中。終了判定は session.status_idle かつ stop_reasonrequires_action 以外
  • failed は回数不足ではなく、依頼文とルーブリックの矛盾を疑う
  • 成果物取得時のみ betas=["managed-agents-2026-04-01"] の明示指定が必要
  • 合否を機械的に判定できないタスク(発想・トーン)には使わない

今日やれる最初の一歩は、「直近で3回以上差し戻したAIの成果物を1つ思い出し、その3回で自分が指摘した内容を箇条書きにする」ことです。それがそのままルーブリックの原型になります。指摘が「なんとなく違う」だったなら、まだ言語化が足りないというサインです。

タイトルとURLをコピーしました