Repository navigation
fix(claudex): [1m] を外し compact 窓をバックエンドのキャップ内に収める - #811
Conversation
gpt-5.6-sol は API では 1.05M context だが、claudex が経由する ChatGPT/Codex バックエンドでは実効 ~353K(raw 372K)にキャップされ、regression で 258K まで 下がることもある(openai/codex#31860, #32806)。 従来 model に付けていた [1m] が CC に「1M ある」と誤認させ、auto-compact が 早期に焚かれなかった。安全弁として入れていた AUTO_COMPACT_WINDOW=272000 も [1m] に 上書きされ死んでいた。結果、コンテキストが ~372K の壁に激突し、そこからの compact は 全 context を要約に送るため同じ上限を超えて失敗、デッドロックしていた (実セッションで 370288 tokens / "Context limit reached" を確認)。 - model / small model から [1m] を除去 - AUTO_COMPACT_WINDOW を 272000 → 220000 に下げ、regression(258K)でも壁の手前で 必ず compact させる。CLAUDEX_COMPACT_WINDOW で上書き可能 Claude-Session: https://claude.ai/code/session_01NqfvJkL7QkYwXqXvhg5fjB
前コミットは OS 環境変数で AUTO_COMPACT_WINDOW を渡していたが、settings ファイルの env は OS 環境変数に勝つため、プロジェクトの .claude/settings.json が env.CLAUDE_CODE_AUTO_COMPACT_WINDOW を設定していると負けて無効化される(実際 layerone プロジェクトが 750000 を設定しており、claudex の値が握り潰されて デッドロックの一因になっていた)。 優先順位は Managed > Command-line > Local > Project > User(settings.md)なので、 --settings(CLI 引数)で渡せば project 設定にも勝てる。これに切り替える。 値は観測済みの 372K キャップに合わせて 360000(compact は ~331K で焚かれ、summary 呼び出しが 372K の壁の内側で完了する)。backend が 272K に巻き戻った日にデッドロックが 再発したら CLAUDEX_COMPACT_WINDOW=250000 のように下げる。 Claude-Session: https://claude.ai/code/session_01NqfvJkL7QkYwXqXvhg5fjB
| ANTHROPIC_AUTH_TOKEN="unused" \ | ||
| ANTHROPIC_SMALL_FAST_MODEL="${CLAUDEX_SMALL_MODEL:-gpt-5.6-luna[1m]}" \ | ||
| ANTHROPIC_SMALL_FAST_MODEL="${CLAUDEX_SMALL_MODEL:-gpt-5.6-luna}" \ | ||
| CLAUDE_CODE_SUBAGENT_MODEL="${model%\[*}" \ |
There was a problem hiding this comment.
📝 Info: CLAUDE_CODE_SUBAGENT_MODEL のパターンマッチが実質 no-op になっている
CLAUDE_CODE_SUBAGENT_MODEL="${model%\[*}" (dot_zsh/functions/claudex.zsh:93) は [ 以降を除去するパターンだが、model の既定値から [1m] が除去されたため、通常のケースでは何も除去しない no-op になっている。ユーザーが CLAUDEX_MODEL='gpt-5.6-sol-fast[1m]' のようにブラケット付きで指定した場合の防御としては機能するが、ヘッダーコメント(16行目)の例示が gpt-5.6-sol-fast(ブラケットなし)になっているため、このパターンが必要になるケースは実質的にない。削除しても動作に影響はないが、防御的コードとして残す判断も妥当。
Was this helpful? React with 👍 or 👎 to provide feedback.
| local compact_settings="{\"env\":{\"CLAUDE_CODE_AUTO_COMPACT_WINDOW\":\"${CLAUDEX_COMPACT_WINDOW:-360000}\"}}" | ||
|
|
||
| # CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC は settings.jsonnet と同様に設定しない | ||
| # (remote-control の eligibility チェックがブロックされるため)。無駄なモデル呼び出し自体は | ||
| # settings.jsonnet の DISABLE_NON_ESSENTIAL_MODEL_CALLS で既に止まっている | ||
| ANTHROPIC_BASE_URL="http://127.0.0.1:${CLAUDEX_PORT:-18765}" \ | ||
| ANTHROPIC_AUTH_TOKEN="unused" \ | ||
| ANTHROPIC_SMALL_FAST_MODEL="${CLAUDEX_SMALL_MODEL:-gpt-5.6-luna[1m]}" \ | ||
| ANTHROPIC_SMALL_FAST_MODEL="${CLAUDEX_SMALL_MODEL:-gpt-5.6-luna}" \ | ||
| CLAUDE_CODE_SUBAGENT_MODEL="${model%\[*}" \ | ||
| CLAUDE_CODE_AUTO_COMPACT_WINDOW=272000 \ | ||
| CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY=3 \ | ||
| CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK=1 \ | ||
| ENABLE_TOOL_SEARCH=false \ | ||
| command claude --model "$model" "$@" | ||
| command claude --model "$model" --settings "$compact_settings" "$@" |
There was a problem hiding this comment.
📝 Info: dot_zshenv.tmpl の 500000 と --settings の 360000 の優先順位が正しく機能するか
dot_zshenv.tmpl:31 で CLAUDE_CODE_AUTO_COMPACT_WINDOW=500000 が OS 環境変数として export される。素の claude 実行時はこの値が使われる(Opus の 1M context に適切)。claudex 実行時は --settings で {"env":{"CLAUDE_CODE_AUTO_COMPACT_WINDOW":"360000"}} が渡される。Claude Code の設定優先順位は Managed > Command-line > Local > Project > User > OS env であるため、Command-line レベルの --settings が OS env の 500000 に勝ち、360000 が適用される。この優先順位はコミットメッセージで言及されている settings.md に基づいている。ただし、もしプロジェクトの .claude/settings.json が Managed レベルで CLAUDE_CODE_AUTO_COMPACT_WINDOW を設定している場合は Managed が勝つ。コミットメッセージでは layerone プロジェクトが 750000 を Project レベルで設定していたケースに言及しており、Command-line > Project なので今回の修正で解決する。
Was this helpful? React with 👍 or 👎 to provide feedback.
## Why #811 で `[1m]` を外したが、これは statusline を悪化させる判断ミスだった。`[1m]` を外すと statusline の分母がモデル既定(~200K)になり、Sol は 200K を超える(実効 372K まで到達)ためゲージが 100% を振り切って読めなくなる。実キャップ 372K に一番近い表示は `[1m]` の `/1000k` なので、付けた方が良い。 また #811 の前提「デッドロックは `[1m]` のせい」は実は証明できていなかった。当時のセッションは `[1m]` と project の `settings.json` の `CLAUDE_CODE_AUTO_COMPACT_WINDOW: 750000` が両方あり、どちらも 372K の壁より上(920K と 690K)だったので、どちらが compaction 基準を握っていたかは区別できない。 ## What `dot_zsh/functions/claudex.zsh`: - **model / small model に `[1m]` を復活**(`gpt-5.6-sol[1m]` / `gpt-5.6-luna[1m]`)。statusline を `/1000k` に戻す - auto-compact のガードは #811 で入れた `--settings` の `CLAUDE_CODE_AUTO_COMPACT_WINDOW=360000`(compact を ~331K で焚く)を維持 - `[1m]` が明示 `AUTO_COMPACT_WINDOW` を上書きして 372K で詰む場合に備え、`CLAUDEX_MODEL='gpt-5.6-sol'`(`[1m]` 無し)へのフォールバック例をコメントに残した 狙いは「statusline `/1000k`(実キャップ 372K に最も近い表示)+ `--settings` 360000 による壁手前 compact」の両取り。これが成立するかは `[1m]` が明示 `AUTO_COMPACT_WINDOW` を上書きしないことに依存する。 ## 検証 - `zsh -n` 構文チェック - claude をスタブし、`--model gpt-5.6-sol[1m] --settings {"env":{"CLAUDE_CODE_AUTO_COMPACT_WINDOW":"360000"}}` が渡ること、subagent は `[1m]` を剥がした `gpt-5.6-sol` になること、`CLAUDEX_MODEL='gpt-5.6-sol'` フォールバックが効くことを確認 **要実測(nested claude 禁止で机上検証不可)**: `[1m]` 付きで context を伸ばし、compact が 1M 手前ではなく 360000 基準の ~331K で焚かれること。331K 付近で焚ければ両取り成立。372K まで行って詰むなら `[1m]` が `AUTO_COMPACT_WINDOW` を上書きするということなので、`CLAUDEX_MODEL='gpt-5.6-sol'` にフォールバックする。 # 実測コマンド(既存コードでも CLAUDEX_MODEL 上書きで試せる) CLAUDEX_MODEL='gpt-5.6-sol[1m]' claudex https://claude.ai/code/session_01NqfvJkL7QkYwXqXvhg5fjB
Why
claudex(#807)で GPT-5.6 Sol を実タスクに使ったところ、
Context limit reached · /compact or /clear to continueが出てセッションがデッドロックした(実セッションで 370288 tokens を確認)。原因は2つの設定不整合:
[1m]サフィックスによる context 誤認: claudex は--model gpt-5.6-sol[1m]を渡していた。[1m]は CC に「context は 1M」と信じさせるが、claudex が経由する ChatGPT/Codex バックエンドの Sol は実測 ~372K でキャップされる(API の Sol は 1.05M だが、サブスク経由は別。OpenAI は課金都合で Codex default を 272K↔372K で動かしている — thsottiaux / openai/codex#31860, #32806)。CC は「1M ある」と思って auto-compact を焚かず、~372K の壁に激突。壁に当たってからの compact は現 context 全量を要約に送るため同じ上限を超えて失敗し、デッドロックする。OS 環境変数がプロジェクト設定に負ける: 安全弁として入れていた
CLAUDE_CODE_AUTO_COMPACT_WINDOWを OS 環境変数で注入していたが、settings ファイルのenvは OS 環境変数に勝つ(env-vars.md)。実際 work プロジェクトの.claude/settings.jsonがenv.CLAUDE_CODE_AUTO_COMPACT_WINDOW: '750000'(Opus 用)を設定しており、claudex の値が握り潰されていた。What
dot_zsh/functions/claudex.zsh:[1m]を除去(gpt-5.6-sol/gpt-5.6-luna)。CC に嘘の 1M を信じさせない--settings(CLI 引数)で渡す。優先順位は Managed > Command-line > Local > Project > User(settings.md)なので、project のsettings.json(750000)にも勝てるCLAUDEX_COMPACT_WINDOWで上書き可能(backend が 272K に巻き戻った日はこれで下げる)検証
zsh -n構文チェック--model gpt-5.6-sol --settings {"env":{"CLAUDE_CODE_AUTO_COMPACT_WINDOW":"360000"}}が正しく渡ること、CLAUDEX_COMPACT_WINDOW上書きが効くことを確認--settings(CLI 引数)が project settings.json を上書きすることは settings.md の precedence(Command-line > Project)で確認。※ nested claude 実行がサンドボックスで禁止のため live 実測は未実施未検証: 実際に claudex セッションで 360K 付近まで伸ばして compact が壁の手前で成功することは、実タスクでの確認が必要。
https://claude.ai/code/session_01NqfvJkL7QkYwXqXvhg5fjB