Tutorials · Claude Agent SDK · examples / python / 13_introspection.pyExample code

Example code · python

13_introspection.py

Introspection: init metadata, context usage, MCP status, server info, dynamic model switch.

Raw fileDownload all examples (zip)See its output →

Used in Part 3 §3 · Looking inside a running session

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

54 lines · Back to the folder