修正:stream-json/SDK セッションでターン開始直後の Esc が無視される問題
原文(日本語に翻訳)
stream-json/SDK セッションでターン開始の直後に送られた割り込み(Esc)が無音で無視される問題を修正しました。ターンは「Interrupted」フィードバックなしで実行され続けていました。
原文(英語)
Fixed an interrupt (Esc) sent at the very start of a turn being silently dropped in stream-json/SDK sessions, leaving the turn running with no "Interrupted" feedback
概要
stream-json モードや SDK を使用したセッションで、ターンの開始直後に Esc キーで割り込みを送っても無視され、ターンがそのまま継続する問題がありました。さらに「Interrupted」というフィードバックも表示されないため、割り込みが届いているかどうか判断できない状態でした。v2.1.162 でこの問題が修正され、ターン開始直後の割り込みも正しく処理されます。
基本的な使い方
SDK での割り込み
python
import anthropic
client = anthropic.Anthropic()
# ストリーミングセッション
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "長いタスクを実行して"}]
) as stream:
for text in stream.text_stream:
# 必要に応じて割り込み
if should_interrupt():
stream.close() # 修正後は確実に割り込める
break実践例
stream-json モードでの制御
bash
# stream-json モードで実行
claude --output-format stream-json "長時間かかるタスクを実行して"
# 別ターミナルから Ctrl+C や Esc で割り込み
# → 修正後は "Interrupted" が表示されてターンが停止するSDK でのタイムアウト制御
python
import asyncio
import anthropic
async def run_with_timeout(prompt: str, timeout: float):
client = anthropic.AsyncAnthropic()
try:
async with asyncio.timeout(timeout):
async with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=2048,
messages=[{"role": "user", "content": prompt}]
) as stream:
async for text in stream.text_stream:
print(text, end="", flush=True)
except asyncio.TimeoutError:
# 修正後はタイムアウト時の割り込みが正しく処理される
print("\n[タイムアウトによる割り込み]")自動化スクリプトでの安全な割り込み
python
import subprocess
import signal
# Claude Code を stream-json モードで起動
proc = subprocess.Popen(
["claude", "--output-format", "stream-json", "-p", "タスクを実行して"],
stdout=subprocess.PIPE
)
# タイムアウトで割り込み
try:
proc.wait(timeout=30)
except subprocess.TimeoutExpired:
proc.send_signal(signal.SIGINT) # 修正後は確実に反映される
proc.wait()注意点
- この修正は
--output-format stream-jsonや SDK ストリーミングセッション特有の問題の修正です - 通常の対話モードでは以前から Esc が正しく処理されていました
- 割り込み後は「Interrupted」メッセージが表示されるようになります
- SDK を使用している場合は、クライアントライブラリのバージョンも最新にすることを推奨します