Tutorials · Claude Agent SDK · examples / python / 17_streaming_input.pyExample code

Example code · python

17_streaming_input.py

Streaming input mode via an async generator, plus /compact and ConversationReset via /clear.

Raw fileDownload all examples (zip)See its output →

Used in Part 1 · Slash commands are just prompts

"""17: Streaming input mode via an async generator, plus /compact and ConversationReset via /clear."""

import asyncio

from claude_agent_sdk import (
    AssistantMessage,
    ClaudeAgentOptions,
    ClaudeSDKClient,
    ConversationResetMessage,
    ResultMessage,
    SystemMessage,
    TextBlock,
)
from demo_util import PROJECT


async def main():
    options = ClaudeAgentOptions(cwd=PROJECT, allowed_tools=["Read", "Glob"], max_turns=4)
    async with ClaudeSDKClient(options) as client:
        turns = [
            "Read README.md. Then reply only: ok",
            "In one sentence, what did you just read?",
            "/compact",
            "/clear",
            "What did we talk about before? Answer in one sentence.",
        ]
        for prompt in turns:
            print(f"\n>>> {prompt}")
            await client.query(prompt)
            async for message in client.receive_response():
                if isinstance(message, AssistantMessage):
                    for block in message.content:
                        if isinstance(block, TextBlock):
                            print(f"Claude: {block.text}")
                elif isinstance(message, SystemMessage) and message.subtype == "compact_boundary":
                    md = message.data.get("compact_metadata", {})
                    print(f"[compact_boundary] trigger={md.get('trigger')} pre_tokens={md.get('pre_tokens')}")
                elif isinstance(message, ConversationResetMessage):
                    print(f"[conversation reset] new_conversation_id={message.new_conversation_id}")
                elif isinstance(message, ResultMessage):
                    print(f"[result] {message.subtype} session={message.session_id} total=${message.total_cost_usd:.4f}")


asyncio.run(main())

45 lines · Back to the folder