この機能はZero Data Retention(ZDR)の対象です。組織がZDR契約を締結している場合、この機能を通じて送信されたデータは、APIレスポンスが返された後に保存されることはありません。
「task budget」(タスクバジェット)を使用すると、思考、ツール呼び出し、ツール結果、出力を含むエージェントループ全体でClaudeが使用できるトークン数を指定できます。モデルは進行中のカウントダウンを確認し、それを使用して作業の優先順位を決め、バジェットが消費されるにつれて適切に作業を完了させます。
タスクバジェットは、Claude Fable 5、Claude Mythos 5、Claude Opus 4.8、Claude Opus 4.7でベータ版として提供されています。オプトインするには、task-budgets-2026-03-13ベータヘッダーを設定してください。
タスクバジェットは、Claudeが次の人間の応答を待つ前に、複数のツール呼び出しと意思決定を行って出力を確定するエージェントワークフローに最適です。以下の場合に使用してください。
タスクバジェットはeffortパラメータを補完します。effortは各ステップでClaudeがどれだけ徹底的に推論するかを制御し、タスクバジェットはエージェントループ全体でClaudeが実行できる作業の総量を制限します。
output_configにtask_budgetを追加し、ベータヘッダーを含めます。
client = anthropic.Anthropic()
with client.beta.messages.stream(
model="claude-opus-4-8",
max_tokens=128000,
output_config={
"effort": "high",
"task_budget": {"type": "tokens", "total": 64000},
},
messages=[
{"role": "user", "content": "Review the codebase and propose a refactor plan."}
],
betas=["task-budgets-2026-03-13"],
) as stream:
response = stream.get_final_message()
print(response.usage)task_budgetオブジェクトには3つのフィールドがあります。
type: 常に"tokens"です。total: 思考、ツール呼び出し、ツール結果、出力を含む、エージェントループ全体でClaudeが使用できるトークン数。remaining(オプション): 前のリクエストから引き継がれたバジェットの残量。省略した場合のデフォルトはtotalです。Claudeは、会話全体を通してサーバー側で挿入されるバジェットカウントダウンマーカーを確認します。このマーカーは、現在のエージェントループに残っているトークン数を示し、モデルが思考、ツール呼び出し、出力を生成するとき、およびツール結果を処理するときに更新されます。Claudeはこのシグナルを使用してペースを調整し、バジェットが消費されるにつれて適切に作業を完了させます。
カウントダウンはモデルにのみ表示されます。 APIレスポンスには残りバジェットのフィールドは含まれません。レスポンスのusageオブジェクトにはtask_budgetの情報はなく、SDKにもそのためのアクセサはありません。クライアント側で消費を追跡するには、現在の使用量を測定するに示すようにループ内のリクエスト全体のトークン使用量を合計するか、コンパクション間でバジェットを引き継ぐ際にremainingで独自の数値を渡します。
カウントダウンは、現在のエージェントループでClaudeが処理したトークンを反映するものであり、ターン間で再送信するトークンではありません。 クライアントがフォローアップリクエストごとに会話履歴全体を送信する場合、クライアント側のトークン数はClaudeが追跡しているバジェットと異なる可能性があります。履歴全体を再送信しながらremainingも減算すると、モデルは過少報告されたバジェットを確認し、カウントダウンが本来よりも速く減少するため、Claudeはバジェットが実際に許容するよりも早く作業を切り上げてしまいます。クライアント側でカウントダウンを再現しようとするのではなく、余裕のあるバジェットを設定し、モデルにカウントダウンに対して自己調整させてください。
タスクバジェットは、リクエストペイロードの内容ではなく、Claudeが確認するもの(思考、ツール呼び出しと結果、テキスト)をカウントします。エージェントループでは、クライアントはリクエストごとに会話全体を再送信するため、ペイロードはターンごとに増加しますが、バジェットはこのターンでClaudeが確認するトークン分だけ減少します。
task_budget: {type: "tokens", total: 100000}と単一のbashツールを持つループを考えてみましょう。
ターン1。 最初のリクエストを送信します。
{
"messages": [
{ "role": "user", "content": "Audit this repo for security issues and report findings." }
]
}Claudeは思考し、ツール呼び出しを出力してstop_reason: "tool_use"で停止します。
{
"role": "assistant",
"content": [
{
"type": "thinking",
"thinking": "I'll start by listing dependencies to look for known-vulnerable packages..."
},
{
"type": "tool_use",
"id": "toolu_01",
"name": "bash",
"input": { "command": "cat package.json && npm audit --json" }
}
]
}このアシスタントターン(思考とツール呼び出し)の合計が5,000生成トークンだったとします。生成中にClaudeが確認したカウントダウンはremaining ≈ 95,000付近で終了しました。
ターン2。 クライアントはツールを実行し、ツール結果を追加して履歴全体を再送信します。
{
"messages": [
{ "role": "user", "content": "Audit this repo for security issues and report findings." },
{
"role": "assistant",
"content": [
{ "type": "thinking", "thinking": "I'll start by listing dependencies..." },
{
"type": "tool_use",
"id": "toolu_01",
"name": "bash",
"input": { "command": "cat package.json && npm audit --json" }
}
]
},
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "<2,800 tokens of npm audit output>"
}
]
}
]
}再送信されたターン1のユーザーメッセージとアシスタントメッセージは再度カウントされませんが、2,800トークンのツール結果はこのターンでClaudeが確認する新しいコンテンツであり、バジェットに対してカウントされます。Claudeは思考と2回目のツール呼び出し(grep -rn "eval(" src/)にさらに4,000トークンを消費します。カウントダウンはremaining ≈ 88,200付近で終了します。
ターン3。 2番目のツール結果(1,200トークンのgrep出力)を追加して、履歴全体が再度再送信されます。Claudeは6,000トークンの最終調査レポートを書き、stop_reason: "end_turn"で停止します。remaining ≈ 81,000。
3つのターンを並べると、ペイロードサイズとバジェット消費の違いが明確になります。
| ターン | リクエストペイロード(送信した概算入力トークン) | このターンでバジェットに対してカウントされたトークン | 後のバジェットremaining |
|---|---|---|---|
| 1 | 約20 | 5,000(思考 + tool_use) | 約95,000 |
| 2 | 約7,800(ターン1の履歴 + ツール結果) | 6,800(2,800のツール結果 + 4,000の思考とtool_use) | 約88,200 |
| 3 | 約13,000(履歴全体 + 2番目のツール結果) | 7,200(1,200のツール結果 + 6,000のtext) | 約81,000 |
| 合計 | リクエスト全体で約20,820送信 | バジェットに対して19,000カウント | N/A |
クライアントはターン1のユーザーメッセージを3回、ターン1のアシスタントメッセージを2回送信しましたが、それぞれ1回だけカウントされました。クライアントが送信した累積ペイロードはより大きく、ターン2と3でプロンプトキャッシュされた入力はさらに大きかったにもかかわらず、バジェットは100,000トークンのうち19,000トークンを消費しました。
remainingを使用してコンパクション間でバジェットを引き継ぐエージェントループがリクエスト間でコンテキストをコンパクション(圧縮)または書き換える場合(たとえば、以前のターンを要約するなど)、サーバーはコンパクション前にどれだけのバジェットが消費されたかを記憶していません。次のリクエストでremainingを渡すことで、カウントダウンがtotalにリセットされるのではなく、中断したところから継続されます。
output_config = {
"effort": "high",
"task_budget": {
"type": "tokens",
"total": 128000,
"remaining": 128000 - tokens_spent_so_far,
},
}毎ターン、コンパクションされていない履歴全体を再送信するループの場合は、remainingを省略し、サーバーにカウントダウンを追跡させてください。
タスクバジェットはソフトなヒントであり、ハードな上限ではありません。Claudeは、中断するよりも完了させる方が混乱が少ないアクションの途中にある場合、バジェットをわずかに超過することがあります。合計出力トークンに対する強制的な制限は引き続きmax_tokensであり、到達するとstop_reason: "max_tokens"でレスポンスが切り捨てられます。
コストまたはレイテンシに対するハードな上限を設けるには、タスクバジェットと適切なmax_tokens値を組み合わせてください。
task_budgetを使用して、Claudeにペース配分の目標を与えます。max_tokensを、暴走的な生成を防ぐ絶対的な上限として使用します。task_budgetはエージェントループ全体(複数のリクエストにまたがる可能性があります)を対象とし、max_tokensは個々のリクエストを制限するため、2つの値は独立しています。一方が他方以下である必要はありません。
タスクに対して小さすぎるバジェットは、拒否のような動作を引き起こす可能性があります。 要求されている作業に対して明らかに不十分なバジェット(たとえば、数時間かかるエージェントコーディングタスクに対する20,000トークンのバジェット)をClaudeが確認すると、タスクの試行自体を拒否したり、スコープを大幅に縮小したり、完了できない作業を開始するのではなく部分的な結果で早期に停止したりすることがあります。バジェットを設定した後に予期しない拒否や早期停止が発生した場合は、他のパラメータをデバッグする前にバジェットを引き上げてください。固定のデフォルト値ではなく、実際のタスク長の分布に基づいてバジェットのサイズを決定してください。バジェットの選択を参照してください。
適切なバジェットは、エージェントループが現在どれだけの作業を行っているかによって異なります。推測するのではなく、まず既存のトークン使用量を測定し、そこから調整してください。
task_budgetを設定せずに代表的なタスクのサンプルを実行し、タスクごとにClaudeが消費する合計トークン数を記録します。エージェントループの場合、ループ内のすべてのリクエストにわたってusage.output_tokensに思考トークンとツール結果トークンを加えて合計します。
def run_task_and_count_tokens(messages: list) -> int:
"""Runs an agentic loop to completion and returns total tokens spent."""
total_spend = 0
while True:
with client.beta.messages.stream(
model="claude-opus-4-8",
max_tokens=128000,
messages=messages,
tools=tools,
betas=["task-budgets-2026-03-13"],
) as stream:
response = stream.get_final_message()
# このターンでClaudeが生成した分をカウントします(出力はテキスト + 思考 + ツール呼び出しを含みます)。
# ツール結果のトークンも予算にカウントされます。クライアント側の追跡を
# サーバー側のカウントダウンと一致させたい場合は、以下で追加する
# tool_resultブロックのトークン数を加算してください。
total_spend += response.usage.output_tokens
if response.stop_reason == "end_turn":
return total_spend
# アシスタントのターンとツール結果を追加し、ループを続行します。
messages += [
{"role": "assistant", "content": response.content},
{"role": "user", "content": run_tools(response.content)},
]これを代表的なタスクセット全体で実行し、分布を記録します。タスクごとのトークン消費のp99から始めて、モデルにタスクバジェットを提供することでモデルの動作がどのように変化するかを理解し、必要に応じて上下にテストしてください。
task_budget.totalの最小許容値は20,000トークンです。最小値を下回る値は400エラーを返します。
max_tokens: タスクバジェットとは直交しています。max_tokensは生成トークンに対するリクエストごとのハードな上限であり、task_budgetはエージェントループ全体(複数のリクエストにまたがる可能性があります)に対する助言的な上限です。xhighまたはmaxのeffortでは、各リクエストでClaudeが思考し行動する余地を与えるために、max_tokensを少なくとも64kに設定してください。task_budget.remainingを減算すると、変更された値がそれを含むキャッシュプレフィックスを無効化します。キャッシングを維持するには、最初のリクエストで一度だけバジェットを設定し、クライアント側でバジェットを変更するのではなく、サーバー側のカウントダウンに対してモデルに自己調整させてください。| モデル | サポート |
|---|---|
| Claude Fable 5 | ベータ(task-budgets-2026-03-13ヘッダーを設定) |
| Claude Mythos 5 | ベータ(task-budgets-2026-03-13ヘッダーを設定) |
| Claude Sonnet 5 | 非対応 |
| Claude Opus 4.8 | ベータ(task-budgets-2026-03-13ヘッダーを設定) |
| Claude Opus 4.7 | ベータ(task-budgets-2026-03-13ヘッダーを設定) |
| Claude Opus 4.6 | 非対応 |
| Claude Sonnet 4.6 | 非対応 |
| Claude Haiku 4.5 | 非対応 |
タスクバジェットは、Claude CodeまたはCoworkのサーフェスではサポートされていません。サポートされているモデルでMessages APIを通じて直接タスクバジェットを使用してください。
Was this page helpful?