Skip to content

Commit 6617b9e

Browse files
fix: pass --thinking flag for adaptive/disabled instead of budget tokens (#796)
## Summary `thinking={"type":"adaptive"}` was being lowered to `--max-thinking-tokens 32000`, which puts the CLI into fixed-budget mode rather than adaptive mode. `disabled` similarly mapped to `--max-thinking-tokens 0`. The CLI exposes an explicit `--thinking <adaptive|enabled|disabled>` flag that takes precedence over `--max-thinking-tokens`. The TypeScript SDK already uses it. This change mirrors that behavior: - `adaptive` → `--thinking adaptive` - `disabled` → `--thinking disabled` - `enabled` → `--max-thinking-tokens <budget_tokens>` - deprecated `max_thinking_tokens` is only emitted when `thinking` is unset ## Test plan - `pytest tests/test_transport.py` (59 passed) - New parametrized test for all three `thinking` types - New precedence test: `thinking` overrides `max_thinking_tokens`
1 parent 841ee87 commit 6617b9e

File tree

2 files changed

+46
-8
lines changed

2 files changed

+46
-8
lines changed

src/claude_agent_sdk/_internal/transport/subprocess_cli.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -300,20 +300,20 @@ def _build_command(self) -> list[str]:
300300
# Flag with value
301301
cmd.extend([f"--{flag}", str(value)])
302302

303-
# Resolve thinking config --max-thinking-tokens
303+
# Resolve thinking config -> --thinking / --max-thinking-tokens
304304
# `thinking` takes precedence over the deprecated `max_thinking_tokens`
305-
resolved_max_thinking_tokens = self._options.max_thinking_tokens
306305
if self._options.thinking is not None:
307306
t = self._options.thinking
308307
if t["type"] == "adaptive":
309-
if resolved_max_thinking_tokens is None:
310-
resolved_max_thinking_tokens = 32_000
308+
cmd.extend(["--thinking", "adaptive"])
311309
elif t["type"] == "enabled":
312-
resolved_max_thinking_tokens = t["budget_tokens"]
310+
cmd.extend(["--max-thinking-tokens", str(t["budget_tokens"])])
313311
elif t["type"] == "disabled":
314-
resolved_max_thinking_tokens = 0
315-
if resolved_max_thinking_tokens is not None:
316-
cmd.extend(["--max-thinking-tokens", str(resolved_max_thinking_tokens)])
312+
cmd.extend(["--thinking", "disabled"])
313+
elif self._options.max_thinking_tokens is not None:
314+
cmd.extend(
315+
["--max-thinking-tokens", str(self._options.max_thinking_tokens)]
316+
)
317317

318318
if self._options.effort is not None:
319319
cmd.extend(["--effort", self._options.effort])

tests/test_transport.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,44 @@ def test_build_command_with_max_thinking_tokens(self):
233233
assert "--max-thinking-tokens" in cmd
234234
assert "5000" in cmd
235235

236+
@pytest.mark.parametrize(
237+
("thinking", "expected", "absent"),
238+
[
239+
({"type": "adaptive"}, ["--thinking", "adaptive"], "--max-thinking-tokens"),
240+
(
241+
{"type": "enabled", "budget_tokens": 5000},
242+
["--max-thinking-tokens", "5000"],
243+
"--thinking",
244+
),
245+
({"type": "disabled"}, ["--thinking", "disabled"], "--max-thinking-tokens"),
246+
],
247+
)
248+
def test_build_command_with_thinking(self, thinking, expected, absent):
249+
"""Test building CLI command with thinking option."""
250+
transport = SubprocessCLITransport(
251+
prompt="test",
252+
options=make_options(thinking=thinking),
253+
)
254+
255+
cmd = transport._build_command()
256+
idx = cmd.index(expected[0])
257+
assert cmd[idx : idx + 2] == expected
258+
assert absent not in cmd
259+
260+
def test_build_command_thinking_precedence_over_max_thinking_tokens(self):
261+
"""thinking takes precedence over deprecated max_thinking_tokens."""
262+
transport = SubprocessCLITransport(
263+
prompt="test",
264+
options=make_options(
265+
thinking={"type": "adaptive"}, max_thinking_tokens=9999
266+
),
267+
)
268+
269+
cmd = transport._build_command()
270+
idx = cmd.index("--thinking")
271+
assert cmd[idx : idx + 2] == ["--thinking", "adaptive"]
272+
assert "--max-thinking-tokens" not in cmd
273+
236274
def test_build_command_with_add_dirs(self):
237275
"""Test building CLI command with add_dirs option."""
238276
from pathlib import Path

0 commit comments

Comments
 (0)