CLAUDE LABEN
VERSION — 8月10日に v2.1.227 が出ていました。新機能はなく、プラン判定と CI まわりの不具合修正が中心ですAUTO — 8月14日の既定化まで残り2日です。Pro・Max・Team で Claude Code の auto モードが既定で有効になりますCI — claude-code-action で allowed_non_write_users を指定すると GitHub ホストランナー上の Bash が全て失敗していた問題が直りましたBILLING — 期限切れトークンで開始したセッションが加入プランを取り違え、Max 利用者に使用クレジットの有効化を促していた不具合も解消していますSUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は8月17日で、残り5日ですPRICE — Sonnet 5 のプロモ価格 $2/$10 per Mtok は8月31日までで、9月1日から $3/$15 per Mtok になりますVERSION — 8月10日に v2.1.227 が出ていました。新機能はなく、プラン判定と CI まわりの不具合修正が中心ですAUTO — 8月14日の既定化まで残り2日です。Pro・Max・Team で Claude Code の auto モードが既定で有効になりますCI — claude-code-action で allowed_non_write_users を指定すると GitHub ホストランナー上の Bash が全て失敗していた問題が直りましたBILLING — 期限切れトークンで開始したセッションが加入プランを取り違え、Max 利用者に使用クレジットの有効化を促していた不具合も解消していますSUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は8月17日で、残り5日ですPRICE — Sonnet 5 のプロモ価格 $2/$10 per Mtok は8月31日までで、9月1日から $3/$15 per Mtok になります
記事一覧/API & SDK
API & SDK/2026-06-23上級

思考が常時オンのモデルに移すと、プレフィルが静かに効かなくなる — Fable 5 でストリーミングとトークン予算を直した記録

Fable 5 は思考が常時オンです。プレフィルが使えない・ストリーミングの先頭ブロックがテキストではない・max_tokens に思考分の余白が要る、という三つの前提崩れを、自分の自動投稿パイプラインで直した実装メモです。

Claude API116Fable 53extended thinkingstreaming16migration7

プレミアム記事

自動投稿パイプラインの一工程を Fable 5 に差し替えた翌朝、これまで JSON を返していた処理が空文字を返していました。エラーは出ません。stop_reasonend_turn です。それでも本文が空でした。原因は単純で、私がその工程で長年使っていた「アシスタント側のプレフィル」が、思考が常時オンのモデルでは無視されていたためです。

Fable 5 は 6 月 9 日に一般提供となり、常時オンのアダプティブ思考を特徴としています。これは「考える前提で動く」ことを意味し、思考をオプトインで足していた頃のコードがいくつかの場所で静かに前提を失います。個人開発で 4 サイトの生成を一人で回している身としては、止まってエラーになるより、止まらず空を返す方がよほど厄介でした。この記事は、私自身がその移行で踏んだ三つの前提崩れと、それぞれの直し方をコードで残すものです。

何が変わったのか — 三つの前提崩れ

思考が常時オンになると、出力の「形」と「会計」が変わります。私が実際に直した順に並べると次の三つでした。

崩れた前提従来の挙動思考オンでの挙動
アシスタントのプレフィル続きから書かせて出力形を固定できたプレフィルは併用できず、形を固定できない
ストリーミングの先頭ブロック最初の content block = テキスト最初は thinking ブロック。テキストは後続
max_tokens の意味ほぼ本文の上限思考+本文の合計上限。本文前に尽きうる

どれも「例外で気づく」ものではなく、「出力が薄くなる・空になる・たまに途切れる」という形で表れます。だからこそ厄介で、ログを見ても一見正常に見えてしまいます。

前提崩れ1: プレフィルが効かない

JSON を必ず通したいとき、私はアシスタント側に { を置いて続きから書かせるプレフィルを使っていました。思考オンのモデルでは、これは使えません。モデルは出力の前にまず思考ブロックを生成するため、「アシスタントの続き」という地点が成立しないからです。

無理に併用すると、API がリクエストを弾くか、プレフィルが黙って無視されます。私の工程では後者が起きて、空文字が返っていました。

直し方は、プレフィルではなく強制ツール呼び出しで出力の形を縛ることです。tool_choice で特定ツールを必須にし、その入力スキーマを出力スキーマとして使います。思考はそのまま走らせつつ、最終出力だけは構造を保証できます。

import anthropic
 
client = anthropic.Anthropic()
 
# 実際のモデルIDは公式リリースノートで確認してください
MODEL = "claude-fable-5"
 
# 出力させたい構造を「ツールの入力スキーマ」として定義する
EXTRACT_TOOL = {
    "name": "emit_article_meta",
    "description": "記事のメタデータを構造化して返す",
    "input_schema": {
        "type": "object",
        "properties": {
            "title": {"type": "string"},
            "tags": {"type": "array", "items": {"type": "string"}},
            "is_premium": {"type": "boolean"},
        },
        "required": ["title", "tags", "is_premium"],
    },
}
 
def extract_meta(source_text: str) -> dict:
    msg = client.messages.create(
        model=MODEL,
        max_tokens=8000,  # 思考分の余白を含める(後述)
        tools=[EXTRACT_TOOL],
        # このツールを必ず使わせる = プレフィルの代わりに形を縛る
        tool_choice={"type": "tool", "name": "emit_article_meta"},
        messages=[{"role": "user", "content": source_text}],
    )
    # 思考ブロックは飛ばし、tool_use ブロックだけを拾う
    for block in msg.content:
        if block.type == "tool_use":
            return block.input  # 既にスキーマ準拠の dict
    raise RuntimeError("tool_use ブロックが見つかりません")

ポイントは tool_choice{"type": "tool", "name": ...} にすることです。これでモデルは必ずそのツールを呼び、入力は宣言したスキーマに従います。プレフィルのように「先頭文字を固定する」のではなく「出力の構造そのものを保証する」ので、思考が前に挟まっても結果は崩れません。プレフィルに依存していた既存設計を見直す際は、JSON を通すための多層防御を扱ったClaude API プレフィルで JSON 出力を必ず通す4層防御も、組み合わせる前提が変わる点で読み直す価値があります。

なお、思考オンのときは temperature をカスタム指定できません(既定の挙動になります)。低温で決定性を上げる運用をしていた場合は、決定性の担保を temperature ではなくツールスキーマと検証ループ側へ移す必要があります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
プレフィルが効かない原因を理解し、思考オンのモデルでも構造化出力を安定させる代替(強制ツール呼び出し)を実装できるようになる
ストリーミングの content block を type で振り分けるハンドラを手に入れ、先頭が thinking ブロックでも壊れない描画ができるようになる
思考トークンを織り込んだ max_tokens の決め方と、途中で打ち切られたときの検知・再試行を運用に組み込めるようになる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-07-05
Fable 5 が全世界に戻り、Sonnet 5 が既定になった — 個人運用の自動化スタックで3モデルをどの層に置くか
Fable 5 の全世界提供再開と Sonnet 5 の既定化で、個人運用の自動化に使える上位モデルが一気に3つ揃いました。優劣で選ぶのではなく、タスクの持ち場でモデルを割り当てる方針オブジェクトを、フォールバック梯子と記録つきの実装でまとめます。
API & SDK2026-06-14
応答したモデルを記録する — headless パイプラインでモデル実体とコストを突き合わせる
API 応答が返す model フィールドと usage を毎回記録し、要求モデルと実際に応答したモデルのズレを検出する設計です。6/15 の usage credits 移行に向けたモデル別コスト照合まで実装します。
API & SDK2026-05-28
Claude API のストリーミングで tool_use の引数が JSON パースに失敗する原因と対処
Claude API のストリーミングで tool_use を受け取ると、なぜか JSON.parse が SyntaxError を返す。input_json_delta の正しい組み立て手順と、再接続時の取りこぼし対策をまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →