Tutorials · Claude Agent SDK · examples / python / 06_structured_output.pyExample code

Example code · python

06_structured_output.py

Structured output validated against a Pydantic schema.

Raw fileDownload all examples (zip)See its output →

Used in Part 1 · Typed JSON output

"""06: Structured output validated against a Pydantic schema."""

import asyncio
import json

from pydantic import BaseModel

from claude_agent_sdk import ClaudeAgentOptions, ResultMessage, query
from demo_util import PROJECT


class Finding(BaseModel):
    file: str
    line: int
    severity: str  # "low" | "medium" | "high"
    description: str


class SecurityReport(BaseModel):
    findings: list[Finding]
    total_count: int
    overall_risk: str


async def main():
    try:
        async for message in query(
            prompt="Audit every file under src/ for security problems and report them.",
            options=ClaudeAgentOptions(
                cwd=PROJECT,
                allowed_tools=["Read", "Glob", "Grep"],
                max_turns=8,
                output_format={"type": "json_schema", "schema": SecurityReport.model_json_schema()},
            ),
        ):
            if isinstance(message, ResultMessage):
                if message.subtype == "success" and message.structured_output:
                    report = SecurityReport.model_validate(message.structured_output)
                    print("Raw structured_output:")
                    print(json.dumps(message.structured_output, indent=2))
                    print(f"\nTyped access: {report.total_count} findings, risk={report.overall_risk}")
                    for f in report.findings:
                        print(f"  {f.file}:{f.line} [{f.severity}] {f.description}")
                else:
                    print("No structured output:", message.subtype, message.errors)
    except Exception as error:
        print(f"Session ended with an error: {error}")


asyncio.run(main())

51 lines · Back to the folder