2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude CodeのCustom Agentなどでmodel: fableは使えるのか検証

2
Last updated at Posted at 2026-06-12

tl;dr

Claude Fable 5が使える環境であれば、ローカルのClaude CodeでもClaude Agent SDKでも model: fable 指定してもちゃんと動きます

以降、ただの検証です。興味ある方だけどうぞ

はじめに

こんにちは、ふくちです。皆様Agentic Codingされていらっしゃいますでしょうか、プロとして────

Claude CodeのCustom AgentやSkillsでは、frontmatter(冒頭メタデータのこと)において使用するmodelを設定できます。

---
name: some-agent
description: Something useful
model: sonnet
---

ここで気になったのが、2026年6月10日に公開された上位モデルのaliasである fable を指定できるのか、という点です。

実務で使っているものだけに以下3点が気になるところだったので、検証してみました。

  1. Skillのfrontmatterで model: fable が効くのか
  2. Custom Agentのfrontmatterで model: fable が効くのか

結論

手元の環境では、3つとも動きました。

検証したClaude Codeのバージョンは以下です。

$ claude --version
2.1.172 (Claude Code)

確認結果は以下です。

検証対象 結果
Skill frontmatter model: fable 親transcriptに claude-fable-5 と記録された
Custom Agent frontmatter model: fable subagent transcriptに claude-fable-5 と記録された

確認する手段として、モデルの自己申告ではなく、Claude Codeが保存するtranscript JSONLの message.model を見ました。

Claude Code CLIでのテスト内容と結果確認

サンプル一式は以下の構成です。

.claude/
├── agents/
│   ├── fable-smoke.md
├── skills/
│   ├── fable-skill-model-smoke/
│   │   └── SKILL.md
│   └── fable-smoke/
│   │   └── SKILL.md
└── tools/
    └── fable-smoke-observe.mjs

1. Skillでの model: fable を試す

Skillのfrontmatterにも model はあります。
公式ドキュメントでは、そのSkillを使用する会話ターンにおいて適用され、次のプロンプトを受け取る際にはセッションのメインモデルに戻る、という扱いです。

Skill単体の検証用には、subagentを起動しないSkillを作りました。そこで model: fable を指定しています。

.claude/skills/fable-skill-model-smoke/SKILL.md
---
description: Smoke-test only the active model of a Claude Code skill with model:fable, without launching a subagent.
model: fable
allowed-tools: Bash Write
disable-model-invocation: true
---

# /fable-skill-model-smoke - skill model:fable smoke test

1. Create a unique marker:

```bash
MARKER="FABLE_SKILL_MODEL_SMOKE_$(date -u +%Y%m%dT%H%M%SZ)_$RANDOM"
mkdir -p ".claude/tmp/fable-smoke/$MARKER"
printf '%s\n' "$MARKER" > ".claude/tmp/fable-smoke/$MARKER/marker.txt"
```

2. Write `.claude/tmp/fable-smoke/$MARKER/skill-result.json` with valid JSON:

```json
{
  "marker": "<MARKER>",
  "skill": "fable-skill-model-smoke",
  "frontmatter_model": "fable",
  "status": "skill_completed",
  "timestamp_utc": "<ISO-8601 UTC timestamp>",
  "note": "Runtime model must be verified from Claude Code transcript metadata, not from model self-report."
}
```

3. Run the observer:

```bash
node .claude/tools/fable-smoke-observe.mjs --marker "$MARKER"
```

2. Custom Agentでの model: fable を試す

続いてCustom Agentのがfableで動くかを確認します。
ここではfrontmatterに直接 model: fable を書きます。

.claude/agents/fable-smoke.md
---
name: fable-smoke
description: Smoke-test subagent for checking whether Claude Code accepts model:fable.
model: fable
tools: Bash, Write
---

# Fable Smoke Test Agent

You are a smoke-test subagent used only to verify whether Claude Code accepts
`model: fable` for custom agents.

When invoked, the caller will provide a marker string that starts with
`FABLE_SMOKE_`.

Create `.claude/tmp/fable-smoke/<marker>/agent-result.json` and return:

```text
FABLE_SMOKE_AGENT_DONE marker=<marker> result=.claude/tmp/fable-smoke/<marker>/agent-result.json
```

Skill側でも fable を設定し、中身としてはユニークなマーカーを作ってagentへ渡します。

.claude/skills/fable-smoke/SKILL.md
---
description: Smoke-test whether a Claude Code skill can run with model:fable and launch a model:fable custom agent.
model: fable
allowed-tools: Bash Agent
disable-model-invocation: true
---

# /fable-smoke - model:fable smoke test

1. Create a unique marker:

```bash
MARKER="FABLE_SMOKE_$(date -u +%Y%m%dT%H%M%SZ)_$RANDOM"
mkdir -p ".claude/tmp/fable-smoke/$MARKER"
printf '%s\n' "$MARKER" > ".claude/tmp/fable-smoke/$MARKER/marker.txt"
```

2. Launch the `fable-smoke` subagent with this prompt:

```text
Run the fable smoke test with marker: <MARKER>
Create the required result file and return only the required completion line.
```

3. Run the observer:

```bash
node .claude/tools/fable-smoke-observe.mjs --marker "$MARKER"
```

3. 結果確認方法

上記の実行結果は、Claude Codeの会話履歴として ~/.claude/projects/ 配下のJSONLに保存されます。

そのため、そのJSONLの中からmarkerを含む行を探し、その近傍にある message.model フィールドを拾って結果を確認します。

このやり方だと、少なくとも以下を分けて見られます。

  • 親セッションのモデル
  • Skillがactiveなturnのモデル
  • subagentのモデル
  • Agent tool callに渡した model input
  • sidechainとして実行されたかどうか

Skill単体の実行は親transcriptに isSidechain: false として出ます。
一方、subagentは isSidechain: true として別JSONLに出るので、親セッションやSkill自身のモデルと混ぜないのが大事です。

.claude/tools/fable-smoke-observe.mjs
#!/usr/bin/env node

import fs from "node:fs";
import os from "node:os";
import path from "node:path";

const marker = process.argv[process.argv.indexOf("--marker") + 1];
const projectsDir = path.join(os.homedir(), ".claude", "projects");

if (!marker) {
  console.error("Usage: node .claude/tools/fable-smoke-observe.mjs --marker FABLE_SMOKE_...");
  process.exit(2);
}

for (const file of listJsonl(projectsDir)) {
  const lines = fs.readFileSync(file, "utf8").split(/\r?\n/);
  lines.forEach((line, index) => {
    if (!line.includes(marker)) return;

    const start = Math.max(0, index - 8);
    const end = Math.min(lines.length - 1, index + 8);
    console.log(`\n${file}:${index + 1}`);

    for (let i = start; i <= end; i++) {
      if (!lines[i].trim()) continue;
      try {
        const event = JSON.parse(lines[i]);
        const models = collectModelFields(event);
        for (const model of models) {
          console.log(`line ${i + 1}: ${model.path}=${model.value} sidechain=${event.isSidechain}`);
        }
      } catch {
        // ignore non-JSON lines
      }
    }
  });
}

function listJsonl(root) {
  const files = [];
  const stack = [root];

  while (stack.length) {
    const current = stack.pop();
    for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
      const fullPath = path.join(current, entry.name);
      if (entry.isDirectory()) stack.push(fullPath);
      if (entry.isFile() && entry.name.endsWith(".jsonl")) files.push(fullPath);
    }
  }

  return files;
}

function collectModelFields(value, currentPath = "$") {
  const found = [];

  if (!value || typeof value !== "object") return found;
  if (Array.isArray(value)) {
    value.forEach((item, index) => {
      found.push(...collectModelFields(item, `${currentPath}[${index}]`));
    });
    return found;
  }

  for (const [key, child] of Object.entries(value)) {
    const childPath = `${currentPath}.${key}`;
    if (key === "model" && typeof child === "string") {
      found.push({ path: childPath, value: child });
    }
    found.push(...collectModelFields(child, childPath));
  }

  return found;
}

実行結果

Skillでの model: fable 実行結果

このSkillはsubagentを起動しないので、isSidechain=false の親transcriptを見ます。
marker近傍には以下が残りました。

line 12  $.message.model=claude-fable-5  sidechain=false  attributionSkill=fable-skill-model-smoke
line 13  $.message.model=claude-fable-5  sidechain=false  attributionSkill=fable-skill-model-smoke
line 14  $.message.model=claude-fable-5  sidechain=false  attributionSkill=fable-skill-model-smoke

また、Skillが作る結果ファイルも作成されていました。
上記結果を踏まえ、Skillのfrontmatter model: fableclaude-fable-5 として有効化されていました。

{
  "marker": "FABLE_SKILL_MODEL_SMOKE_20260611T022558Z_6848",
  "skill": "fable-skill-model-smoke",
  "frontmatter_model": "fable",
  "status": "skill_completed"
}

Custom Agentでの model: fable 実行結果

サブエージェントを起動したところ、subagent transcriptに以下が残りました。

line 2  model=claude-fable-5  isSidechain=true  attributionAgent=fable-smoke
line 4  model=claude-fable-5  isSidechain=true  attributionAgent=fable-smoke
line 6  model=claude-fable-5  isSidechain=true  attributionAgent=fable-smoke

つまり、Custom Agentのfrontmatterに書いた model: fable は、実際に claude-fable-5 として実行されていました。

使いどころ

この検証は、単にClaude Fable 5が動くかを見るだけでなく、Skillやagent設計の回帰テストにも使えます。

例えば、以下のような場面です。

  • 高コストモデルへの昇格条件を設計している
  • Skillの model frontmatterが本当に効いているか確認したい
  • Custom Agentの model frontmatterが本当に効いているか確認したい
  • orchestratorからAgent起動時にモデルを切り替えたい
  • Claude Codeのバージョンアップで挙動が変わっていないか見たい

モデル選択はコストにも品質にも効くので、プロンプト上の「指定したつもり」で済ませず、実行ログで確認できるようにしておくと安心です。

Claude Agent SDKでの実行結果

Claude Agent SDK経由でも同じことができるかを追加で試しました。

結論から言うと、2026-06-12時点の手元環境では、local Claude Code認証ならTypeScript版/Python版のどちらでも model: "fable" は動きました。

一方で、Bedrock経路では同じ指定は通りませんでした。
少なくとも今回の ap-northeast-1 のBedrock設定では、model: "fable" はinvalid modelになりました。

ただこれは私のAWSアカウントのClaude Fable 5が軒並みクォータ0になっていて使えないからだと思われるので、また別途試してみます。
image.png

検証環境はこんな感じです。

date: 2026-06-12
claude-agent-sdk(TypeScript): 0.3.175
claude-agent-sdk(Python): 0.2.99
Claude Code: 2.1.175

local Claude Code認証の確認では、Bedrock系の環境変数を外しました。

CLAUDE_CODE_USE_BEDROCK unset
ANTHROPIC_MODEL unset
BEDROCK_MODEL_ID unset
AWS_PROFILE unset
AWS_REGION unset
AWS_DEFAULT_REGION unset

Bedrock経路では、手元の既存設定を使いました。

CLAUDE_CODE_USE_BEDROCK=1
AWS_REGION=ap-northeast-1
ANTHROPIC_MODEL=jp.anthropic.claude-sonnet-4-5-20250929-v1:0

Claude Agent SDK - TypeScript

v0.3.175の型定義では、AgentInput.modelfable が入っていました。

model?: "sonnet" | "opus" | "haiku" | "fable";

local Claude Code認証で、Agent tool inputに model: "fable" を入れる検証コードを実行しました。

env \
  -u CLAUDE_CODE_USE_BEDROCK \
  -u ANTHROPIC_MODEL \
  -u BEDROCK_MODEL_ID \
  -u AWS_PROFILE \
  -u AWS_REGION \
  -u AWS_DEFAULT_REGION \
  CLAUDE_AGENT_PROBE_AUTH_MODE=local \
  CLAUDE_AGENT_PROBE_MAX_BUDGET_USD=1 \
  npx tsx src/index.ts --check-agent-model fable

結果は成功でした。
transcript上でも、Agent tool inputと解決後モデルが確認できました。

entrypoint=sdk-ts
version=2.1.175
Agent tool input model=fable
toolUseResult.resolvedModel=claude-fable-5
subagent message.model=claude-fable-5

top-levelの options.model = "fable" も成功し、transcriptの message.modelclaude-fable-5 でした。

env \
  -u CLAUDE_CODE_USE_BEDROCK \
  -u ANTHROPIC_MODEL \
  -u BEDROCK_MODEL_ID \
  -u AWS_PROFILE \
  -u AWS_REGION \
  -u AWS_DEFAULT_REGION \
  CLAUDE_AGENT_PROBE_AUTH_MODE=local \
  CLAUDE_AGENT_PROBE_MAX_BUDGET_USD=1 \
  npx tsx src/index.ts --check-model fable

Claude Agent SDK - Python

v0.2.99で、local Claude Code認証で、Agent tool inputに model: "fable" を入れる検証コードを実行しました。

env \
  -u CLAUDE_CODE_USE_BEDROCK \
  -u ANTHROPIC_MODEL \
  -u BEDROCK_MODEL_ID \
  -u AWS_PROFILE \
  -u AWS_REGION \
  -u AWS_DEFAULT_REGION \
  CLAUDE_AGENT_PROBE_AUTH_MODE=local \
  CLAUDE_AGENT_PROBE_TIMEOUT_SECONDS=90 \
  CLAUDE_AGENT_PROBE_MAX_BUDGET_USD=1 \
  uv run claudeagent-python-probe check-agent-model fable

結果は成功でした。
検証コード実行も、Agent tool inputに model=fable が入った状態でsubagentが完了しました。

[claudeagent-python] Agent tool model=fable auth=local
[claudeagent-python] toolInput={"description": "Probe test", "prompt": "Answer only: subagent ok", "model": "fable"}

top-levelの ClaudeAgentOptions.model = "fable" も、local Claude Code認証では応答が返りました。

env \
  -u CLAUDE_CODE_USE_BEDROCK \
  -u ANTHROPIC_MODEL \
  -u BEDROCK_MODEL_ID \
  -u AWS_PROFILE \
  -u AWS_REGION \
  -u AWS_DEFAULT_REGION \
  CLAUDE_AGENT_PROBE_AUTH_MODE=local \
  CLAUDE_AGENT_PROBE_TIMEOUT_SECONDS=90 \
  CLAUDE_AGENT_PROBE_MAX_BUDGET_USD=1 \
  uv run claudeagent-python-probe check-model fable

Bedrock経路

同じ model: "fable" をBedrock経路でも試しました。

TypeScript SDK 0.3.175、Python SDK 0.2.99のどちらも、手元のBedrock設定では失敗しました。

CLAUDE_CODE_USE_BEDROCK=1
AWS_REGION=ap-northeast-1
ANTHROPIC_MODEL=jp.anthropic.claude-sonnet-4-5-20250929-v1:0

エラーはinvalid modelで、jp.anthropic.claude-opus-4-8 への切り替えを示唆していました。

これはクォータ的に使えるようになったらまた試してみます。

まとめ

Claude Codeで model: fable の指定はできるぜ!
SDKはまだドキュメント更新されてないので、適宜確認してくれよな!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?