Bug description:
Calling interrupt() immediately (less than roughly 2 seconds) after query() has no observable effect. Claude continues generating a full response as if interrupt() was never called. The issue disappears if there is a slight delay between the two calls, suggesting a race condition.
Steps to reproduce:
import time
from claude_agent_sdk import ClaudeAgentOptions, ClaudeSDKClient
from claude_agent_sdk.types import ResultMessage, StreamEvent
options = ClaudeAgentOptions(
cli_path="/path/to/claude",
include_partial_messages=True,
)
ts = lambda: time.strftime("%H:%M:%S")
async with ClaudeSDKClient(options=options) as client:
await client.query("Write a 300 word essay on machine learning")
print(f"[{ts()}] query sent")
await client.interrupt()
print(f"[{ts()}] interrupt acknowledged")
t0 = time.monotonic()
chars_after = 0
async for msg in client.receive_response():
if isinstance(msg, StreamEvent):
d = msg.event.get("delta", {})
chars_after += len(d.get("text", "") + d.get("thinking", ""))
elif isinstance(msg, ResultMessage):
dt = time.monotonic() - t0
verdict = "BUG" if chars_after else "OK"
print(
f"{verdict}: {chars_after} chars in {dt:.1f}s after interrupt (stop_reason={msg.stop_reason})"
)
break
The output shows:
[15:20:49] query sent
[15:20:49] interrupt acknowledged
BUG: 2464 chars in 23.6s after interrupt (stop_reason=end_turn)
Even after interrupt() resolves without errors, Claude continues to generate the full response. The stop_reason is end_turn, not a signal indicating early termination. Adding a time.sleep() of a few seconds before the interrupt() call causes the interrupt to work correctly.
Bug description:
Calling
interrupt()immediately (less than roughly 2 seconds) afterquery()has no observable effect. Claude continues generating a full response as ifinterrupt()was never called. The issue disappears if there is a slight delay between the two calls, suggesting a race condition.Steps to reproduce:
The output shows:
Even after
interrupt()resolves without errors, Claude continues to generate the full response. Thestop_reasonisend_turn, not a signal indicating early termination. Adding atime.sleep()of a few seconds before theinterrupt()call causes the interrupt to work correctly.