claude-agent-sdk の output_format を zod で指定して任意の出力形式にする

💠
note

@anthropic-ai/claude-agent-sdk を利用していて、その出力形式を自然言語形式ではなく特定の型の JSON にしたいケースがある。その場合 outputFormat で JSONSchema を指定することで任意の形式の出力を得ることができる。

query({
  prompt: '...',
  options: {
    outputFormat: {
      type: 'json_schema',
      schema
    }
  }
})

これと zod 4x 以降でサポートされた toJSONSchema を組み合わせると、 zod で定義した型の JSON を出力として指定することが可能となる。

しかし、 2026/02/04 時点では公式のドキュメント通りでは指定がうまく動作せず、自然言語で出力されてしまう。これは zod が吐き出す $schema フィールドが draft-2020-12 になっていることが原因のようで、draft-07 を指定することで動作するらしい。

つまり現状では以下のようなコードで期待した structured_output を得ることができる:

query({
  prompt: '...',
  options: {
    outputFormat: {
      type: 'json_schema',
      schema: z.toJSONSchema(schema, { target: 'draft-07' })
    }
  }
})
yaakai.to