Skip to content

Commit e8ffda2

Browse files
committed
🚨 test(commit): add tests for reasoning effort handling and implement helper
1 parent 3fdc8f1 commit e8ffda2

4 files changed

Lines changed: 52 additions & 5 deletions

File tree

tests/unit/test_commit.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ def test_generate_commit_with_ai_failure(self, mock_console, mock_create_client,
449449
@patch("tgit.commit.commit_prompt_template")
450450
@patch("tgit.commit.settings")
451451
def test_generate_commit_with_ai_reasoning_model(self, mock_settings, mock_template, mock_console, mock_create_client, mock_check):
452-
"""Test reasoning effort is added for reasoning-capable models."""
452+
"""Test legacy reasoning models keep the existing effort value."""
453453
mock_client = Mock()
454454
mock_create_client.return_value = mock_client
455455
mock_template.render.return_value = "system prompt"
@@ -468,6 +468,33 @@ def test_generate_commit_with_ai_reasoning_model(self, mock_settings, mock_templ
468468
_, kwargs = mock_client.responses.parse.call_args
469469
assert kwargs["reasoning"] == {"effort": "minimal"}
470470

471+
@patch("tgit.commit._check_openai_availability")
472+
@patch("tgit.commit._create_openai_client")
473+
@patch("tgit.commit.console")
474+
@patch("tgit.commit.commit_prompt_template")
475+
@patch("tgit.commit.settings")
476+
def test_generate_commit_with_ai_gpt5_reasoning_model_uses_low_effort(
477+
self, mock_settings, mock_template, mock_console, mock_create_client, mock_check
478+
):
479+
"""Test GPT-5 reasoning models use a supported effort value."""
480+
mock_client = Mock()
481+
mock_create_client.return_value = mock_client
482+
mock_template.render.return_value = "system prompt"
483+
mock_settings.model = "gpt-5.4-mini"
484+
485+
mock_response = Mock()
486+
mock_commit_data = CommitData(type="fix", scope=None, msg="correct bug", is_breaking=False, secrets=[])
487+
mock_response.output_parsed = mock_commit_data
488+
mock_client.responses.parse.return_value = mock_response
489+
490+
result = _generate_commit_with_ai("diff content", None, "main")
491+
492+
assert result == mock_commit_data
493+
mock_check.assert_called_once()
494+
mock_create_client.assert_called_once()
495+
_, kwargs = mock_client.responses.parse.call_args
496+
assert kwargs["reasoning"] == {"effort": "low"}
497+
471498

472499
class TestGetAICommand:
473500
"""Test get_ai_command function."""

tests/unit/test_commit_coverage.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pytest
44
from tgit.commit import (
55
CommitArgs,
6+
_get_reasoning_effort,
67
_supports_reasoning,
78
get_ai_command,
89
get_file_change_sizes,
@@ -18,6 +19,14 @@ def test_supports_reasoning_empty(self):
1819
assert _supports_reasoning("") is False
1920
assert _supports_reasoning(None) is False
2021

22+
def test_get_reasoning_effort_for_gpt5(self):
23+
"""Test GPT-5 models use a supported reasoning effort."""
24+
assert _get_reasoning_effort("gpt-5.4-mini") == "low"
25+
26+
def test_get_reasoning_effort_for_legacy_reasoning_model(self):
27+
"""Test legacy reasoning models keep the previous effort."""
28+
assert _get_reasoning_effort("o1-mini") == "minimal"
29+
2130
def test_get_file_change_sizes_value_error(self):
2231
"""Test get_file_change_sizes with invalid numstat."""
2332
repo = Mock()

tgit/commit.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,17 @@ def _supports_reasoning(model: str) -> bool:
9393
return any(hint in model_lower for hint in REASONING_MODEL_HINTS)
9494

9595

96+
def _get_reasoning_effort(model: str) -> str:
97+
"""Return a model-compatible default reasoning effort."""
98+
model_lower = model.lower()
99+
100+
# GPT-5 family models reject "minimal" and require the newer effort values.
101+
if "gpt-5" in model_lower:
102+
return "low"
103+
104+
return "minimal"
105+
106+
96107
def get_changed_files_from_status(repo: git.Repo) -> set[str]:
97108
"""获取所有变更的文件,包括重命名/移动的文件"""
98109
diff_name_status = repo.git.diff("--cached", "--name-status", "-M")
@@ -254,7 +265,7 @@ def _generate_commit_with_ai(diff: str, specified_type: str | None, current_bran
254265
"text_format": CommitData,
255266
}
256267
if _supports_reasoning(model_name):
257-
request_kwargs["reasoning"] = {"effort": "minimal"}
268+
request_kwargs["reasoning"] = {"effort": _get_reasoning_effort(model_name)}
258269

259270
chat_completion = client.responses.parse(
260271
**request_kwargs,

uv.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)