"""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