Skip to content

原文(日本語に翻訳)

WebSocketの再接続等による重複した control_response メッセージが、会話に重複したアシスタントメッセージをプッシュしてAPI 400エラーを引き起こす可能性があったバグを修正しました。

原文(英語)

Fixed a bug where duplicate control_response messages (e.g. from WebSocket reconnects) could cause API 400 errors by pushing duplicate assistant messages into the conversation.

概要

WebSocket接続が切断・再接続された際に、control_response メッセージが重複して処理される問題が修正されました。この重複により、会話履歴に同一のアシスタントメッセージが複数回追加され、APIの400エラー(不正なリクエスト)が発生することがありました。この修正により、不安定なネットワーク環境やWebSocket再接続が発生する状況でも、会話が正常に継続されるようになります。

基本的な使い方

この修正はバグフィックスのため、通常の使用に変更はありません。ネットワークが不安定な環境でもClaude Codeが正常に動作するようになります。

bash
# 不安定なネットワーク環境でも安定して動作するようになった
claude "長時間かかるタスクを実行してください"

実践例

影響を受けていたシナリオ

**修正前(v2.1.50以前)**に問題が発生していた状況:

1. WebSocket接続が確立される
2. Claudeがレスポンスを生成中にネットワークが不安定になる
3. WebSocketが再接続される
4. control_responseメッセージが重複して処理される
5. 会話履歴に同一のアシスタントメッセージが2回追加される
6. API 400エラー: "messages: roles must alternate between 'user' and 'assistant'"

修正後(v2.1.51以降)

  • 重複した control_response メッセージは検出されて無視される
  • 会話履歴の整合性が保たれる
  • 再接続後も会話が正常に継続される

SDK統合での影響

Claude Code SDKを使って外部システムと統合している場合、この修正は特に重要です:

typescript
import Anthropic from "@anthropic-ai/sdk";

// WebSocket再接続が発生しても、このコードは正常に動作するようになった
const client = new Anthropic();

// 長時間のストリーミング処理中に接続が切れても大丈夫
const stream = await client.messages.stream({
  model: "claude-opus-4-5",
  max_tokens: 4096,
  messages: [
    {
      role: "user",
      content: "大きなコードベースを分析して詳細なレポートを作成してください",
    },
  ],
});

// 以前はWebSocket再接続時にエラーになることがあった
for await (const event of stream) {
  // イベントを処理
}

エラーが発生していた症状の確認

bash
# 以前発生していたエラーの例
# Error: 400 {"type":"error","error":{"type":"invalid_request_error",
#   "message":"messages: roles must alternate between 'user' and 'assistant'"}}

# v2.1.51以降はこのエラーが発生しなくなる

注意点

  • この修正は主に不安定なネットワーク環境やWebSocket再接続が発生するシナリオで効果があります。
  • 安定したネットワーク環境では以前から問題は発生していませんでした。
  • SDK呼び出しを行うシステムインテグレーターには特に重要な修正です。
  • エラーが発生した際は念のためClaude Codeを最新版に更新することを推奨します。

関連情報