原文(日本語に翻訳)
- JSON出力フックが毎ターンno-op(無操作)のsystem-reminderメッセージをモデルのコンテキストに挿入する問題を修正しました
原文(英語)
- Fixed JSON-output hooks injecting no-op system-reminder messages into the model's context on every turn
概要
JSON形式で出力を返すフック(hooks)が、毎ターン(会話の各やり取り)ごとに無意味な(no-op)system-reminderメッセージをモデルのコンテキストウィンドウに挿入していた問題がありました。これにより、コンテキストウィンドウが不必要に消費され、長い会話でパフォーマンスが低下する可能性がありました。バージョン2.1.73でこの問題が修正され、不要なメッセージの挿入が行われなくなりました。
基本的な使い方
JSON出力を返すフックの設定例:
json
// .claude/settings.json
{
"hooks": {
"PreToolUse": [
{
"command": "python3 /path/to/my-hook.py",
"timeout": 5000
}
]
}
}python
# my-hook.py - JSON出力を返すフック
import json
import sys
# フックの処理結果をJSONで返す
result = {"decision": "allow"}
print(json.dumps(result))実践例
権限制御フックの使用
json
// .claude/settings.json
{
"hooks": {
"PreToolUse": [
{
"command": "node /path/to/permission-check.js",
"timeout": 3000
}
]
}
}javascript
// permission-check.js
// v2.1.73以降、このフックのJSON出力がコンテキストを汚染しなくなった
const input = JSON.parse(process.argv[2] || '{}');
if (input.tool === 'Bash' && input.command?.includes('rm -rf')) {
console.log(JSON.stringify({ decision: 'block', reason: '危険なコマンドをブロックしました' }));
} else {
console.log(JSON.stringify({ decision: 'allow' }));
}長時間セッションでのコンテキスト節約
bash
# 修正前: 100ターンの会話 → 100個の無意味なsystem-reminderメッセージがコンテキストに蓄積
# 修正後: 不要なメッセージが挿入されず、コンテキストウィンドウを有効活用
# 長時間のコーディングセッションでもコンテキストの浪費が減少
claudeHTTPフックでの使用
json
// .claude/settings.json
{
"hooks": {
"PreToolUse": [
{
"url": "http://localhost:8080/hook",
"timeout": 5000
}
]
}
}注意点
- この修正はJSON形式で出力を返すすべてのフック(コマンドフック、HTTPフック)に適用されます
- 修正前は、フックが動作するたびにコンテキストウィンドウが少しずつ消費されていたため、長い会話ほど影響が大きくなっていました
- コンテキストウィンドウの使用状況は会話中に確認でき、不要な消費が減ったことで、より長い会話が可能になります
- フック自体の機能には変更はなく、JSON出力の処理方法が改善されたのみです