From 6c6764252221a94267327a7877e6278da09ecd11 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 20 May 2026 13:14:40 +0400 Subject: [PATCH] v2.2.1: fix compaction orphaning tool outputs causing Crof incomplete - Fix compaction cutting between function_call and function_call_output pairs - Orphaned tool results confused Crof models causing finish_reason=length - reasoning_effort=none now always sends enable_thinking=false too - Added Crof upstream debug logging --- CHANGELOG.md | 10 ++++++++++ codex-launcher_2.2.0_all.deb | Bin 24170 -> 0 bytes codex-launcher_2.2.1_all.deb | Bin 0 -> 24488 bytes src/codex-launcher-gui | 7 ++++++- src/translate-proxy.py | 28 ++++++++++++++++++++++++---- 5 files changed, 40 insertions(+), 5 deletions(-) delete mode 100644 codex-launcher_2.2.0_all.deb create mode 100644 codex-launcher_2.2.1_all.deb diff --git a/CHANGELOG.md b/CHANGELOG.md index 23ecd76..eefa18d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## v2.2.1 (2026-05-20) + +- **Fixed compaction orphaning function_call_output items** — root cause of Crof `incomplete` responses + - Compaction cut between function_call and its function_call_output, creating dangling tool results + - Crof model received orphaned `tool` messages with empty `tool_call_id`, causing confusion and token exhaustion + - Compaction now expands tail boundary to include matching function_call/function_call_output pairs +- **Fixed reasoning control**: `reasoning_effort=none` now always sends both `enable_thinking=false` AND `reasoning_effort=none` + - Crof API testing confirmed `reasoning_effort=none` is what actually suppresses reasoning, not `enable_thinking=false` +- Added upstream debug logging to `~/.cache/codex-proxy/crof-upstream.jsonl` + ## v2.2.0 (2026-05-20) - **Added per-provider Reasoning controls in endpoint editor** diff --git a/codex-launcher_2.2.0_all.deb b/codex-launcher_2.2.0_all.deb deleted file mode 100644 index 1a10bc3d077652556134f0c9fbf056925ca7b34b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24170 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 VtcW|~u5=znfnf{iiCodex Launcher v2.2.0") + lbl = Gtk.Label(label="Codex Launcher v2.2.1") lbl.set_use_markup(True) hdr.pack_start(lbl, False, False, 0) changelog_btn = Gtk.Button(label="Changelog") diff --git a/src/translate-proxy.py b/src/translate-proxy.py index bfcd59b..e3883ea 100755 --- a/src/translate-proxy.py +++ b/src/translate-proxy.py @@ -238,8 +238,16 @@ def _compact_input(input_data): break head = input_data[:head_end] - tail = input_data[-_COMPACT_KEEP_RECENT:] - body = input_data[head_end:-_COMPACT_KEEP_RECENT] + tail_start = len(input_data) - _COMPACT_KEEP_RECENT + while tail_start > head_end: + if input_data[tail_start].get("type") == "function_call_output": + tail_start -= 1 + elif input_data[tail_start].get("type") == "message" and input_data[tail_start].get("role") == "assistant": + tail_start -= 1 + else: + break + tail = input_data[tail_start:] + body = input_data[head_end:tail_start] if not body: return head + tail @@ -891,9 +899,11 @@ class Handler(http.server.BaseHTTPRequestHandler): if body.get("tool_choice"): chat_body["tool_choice"] = body["tool_choice"] chat_body["stream"] = stream - if not REASONING_ENABLED: + if not REASONING_ENABLED or REASONING_EFFORT == "none": chat_body["enable_thinking"] = False - chat_body["reasoning_effort"] = REASONING_EFFORT if REASONING_ENABLED else "none" + chat_body["reasoning_effort"] = "none" + else: + chat_body["reasoning_effort"] = REASONING_EFFORT target = upstream_target(TARGET_URL, "/chat/completions") fwd = forwarded_headers(self.headers, { @@ -901,6 +911,16 @@ class Handler(http.server.BaseHTTPRequestHandler): "Authorization": f"Bearer {API_KEY}", }, browser_ua=True) print(f"[translate-proxy] POST {target} model={model} stream={stream} ua={fwd.get('User-Agent','')[:50]}", file=sys.stderr) + _crof_debug_path = os.path.join(_LOG_DIR, "crof-upstream.jsonl") + with open(_crof_debug_path, "a") as _cdf: + _cdf.write(json.dumps({ + "ts": _ts, "model": model, "max_tokens": chat_body.get("max_tokens"), + "reasoning_enabled": REASONING_ENABLED, "reasoning_effort": chat_body.get("reasoning_effort"), + "enable_thinking": chat_body.get("enable_thinking", "NOT_SENT"), + "n_messages": len(chat_body.get("messages", [])), + "has_tools": bool(chat_body.get("tools")), + "messages_summary": [{"role": m.get("role"), "tc": len(m.get("tool_calls", [])), "content_len": len(str(m.get("content", "")))[:6], "tool_call_id": m.get("tool_call_id")} for m in chat_body.get("messages", [])], + }) + "\n") req = urllib.request.Request( target, data=json.dumps(chat_body).encode(),