"""13: Introspection: init metadata, context usage, MCP status, server info, dynamic model switch.""" import asyncio from claude_agent_sdk import AssistantMessage, ClaudeAgentOptions, ClaudeSDKClient, ResultMessage, SystemMessage from demo_util import PROJECT async def main(): options = ClaudeAgentOptions( cwd=PROJECT, allowed_tools=["Read"], mcp_servers={"claude-code-docs": {"type": "http", "url": "https://code.claude.com/docs/mcp"}}, max_turns=2, ) async with ClaudeSDKClient(options) as client: await client.query("Reply with exactly: ready") model_turn_1 = None async for message in client.receive_response(): if isinstance(message, SystemMessage) and message.subtype == "init": d = message.data print("init.claude_code_version:", d.get("claude_code_version")) print("init.model:", d.get("model")) print("init.permissionMode:", d.get("permissionMode")) print("init.tools:", d.get("tools")) print("init.slash_commands:", d.get("slash_commands")) print("init.skills:", d.get("skills")) print("init.mcp_servers:", d.get("mcp_servers")) if isinstance(message, AssistantMessage): model_turn_1 = message.model usage = await client.get_context_usage() print(f"\nget_context_usage: {usage['totalTokens']}/{usage['maxTokens']} tokens " f"({usage['percentage']:.1f}%), model={usage['model']}, autocompact={usage['isAutoCompactEnabled']}") print(" categories:", [(c['name'], c['tokens']) for c in usage['categories']][:8]) status = await client.get_mcp_status() for s in status["mcpServers"]: print(f"get_mcp_status: {s['name']} -> {s['status']} tools={len(s.get('tools') or [])}") info = await client.get_server_info() print("get_server_info keys:", sorted(info.keys()) if info else None) await client.set_model("claude-haiku-5-5") await client.query("Reply with exactly: done") model_turn_2 = None async for message in client.receive_response(): if isinstance(message, AssistantMessage): model_turn_2 = message.model print(f"\nTurn 1 model: {model_turn_1}\nTurn 2 model (after set_model): {model_turn_2}") asyncio.run(main())