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