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