Skip to content

修正: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 を使用している場合は、クライアントライブラリのバージョンも最新にすることを推奨します

関連情報