git-cai-cli 0.7.2__tar.gz → 0.7.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.github/cd/.SRCINFO +1 -2
  2. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.github/cd/PKGBUILD +1 -2
  3. {git_cai_cli-0.7.2/src/git_cai_cli.egg-info → git_cai_cli-0.7.3}/PKG-INFO +1 -2
  4. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/pyproject.toml +0 -1
  5. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/_version.py +3 -3
  6. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/core/llm.py +32 -17
  7. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3/src/git_cai_cli.egg-info}/PKG-INFO +1 -2
  8. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli.egg-info/requires.txt +0 -1
  9. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/unit/test_llm.py +47 -11
  10. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/uv.lock +0 -30
  11. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.caiignore +0 -0
  12. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.gitattributes +0 -0
  13. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.github/ci/_version.py +0 -0
  14. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.github/ci/cai_config.ci.yml +0 -0
  15. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.github/ci/tokens.ci.yml +0 -0
  16. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.github/workflows/python-tests.yml +0 -0
  17. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.github/workflows/release.yml +0 -0
  18. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.github/workflows/release_aur.yml +0 -0
  19. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.gitignore +0 -0
  20. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/.bandit.yml +0 -0
  21. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/.checkov.yml +0 -0
  22. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/.flake8 +0 -0
  23. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/.ls-lint.yml +0 -0
  24. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/.markdown-link-check.json +0 -0
  25. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/.markdownlint.json +0 -0
  26. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/.proselintrc +0 -0
  27. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/.pylintrc +0 -0
  28. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/.yamllint.yml +0 -0
  29. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/check_git_branch_name.sh +0 -0
  30. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/lychee.toml +0 -0
  31. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.linters/pyrightconfig.json +0 -0
  32. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.mega-linter.yml +0 -0
  33. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.semgrepignore +0 -0
  34. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/.trivyignore +0 -0
  35. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/LICENSE +0 -0
  36. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/Makefile +0 -0
  37. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/README.md +0 -0
  38. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/docs/git-cai.txt +0 -0
  39. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/docs/man/git-cai.1 +0 -0
  40. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/setup.cfg +0 -0
  41. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/__init__.py +0 -0
  42. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/cli/__init__.py +0 -0
  43. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/cli/cli.py +0 -0
  44. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/cli/helptext.py +0 -0
  45. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/cli/modes.py +0 -0
  46. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/core/__init__.py +0 -0
  47. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/core/config.py +0 -0
  48. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/core/editors.py +0 -0
  49. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/core/gitutils.py +0 -0
  50. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/core/languages.py +0 -0
  51. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/core/options.py +0 -0
  52. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/core/squash.py +0 -0
  53. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/core/validate.py +0 -0
  54. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli/main.py +0 -0
  55. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli.egg-info/SOURCES.txt +0 -0
  56. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli.egg-info/dependency_links.txt +0 -0
  57. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli.egg-info/entry_points.txt +0 -0
  58. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/src/git_cai_cli.egg-info/top_level.txt +0 -0
  59. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/integration/test_cli_integration.py +0 -0
  60. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/integration/test_config_integration.py +0 -0
  61. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/integration/test_gitutils_integration.py +0 -0
  62. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/integration/test_modes_integration.py +0 -0
  63. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/integration/test_options_integration.py +0 -0
  64. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/integration/test_squash_integration.py +0 -0
  65. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/unit/test_cli.py +0 -0
  66. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/unit/test_config.py +0 -0
  67. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/unit/test_gitutils.py +0 -0
  68. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/unit/test_helptext.py +0 -0
  69. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/unit/test_modes.py +0 -0
  70. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/unit/test_options.py +0 -0
  71. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/unit/test_squash.py +0 -0
  72. {git_cai_cli-0.7.2 → git_cai_cli-0.7.3}/tests/unit/test_validate.py +0 -0
@@ -1,5 +1,5 @@
1
1
  pkgbase = cai
2
- pkgdesc = Use LLM to create git commit messages.
2
+ pkgdesc = CLI tool that generates concise git commit messages from diffs or commit history using large language models
3
3
  pkgver = Y.Y.Y
4
4
  pkgrel = 1
5
5
  url = https://github.com/thorstenfoltz/cai
@@ -17,7 +17,6 @@ pkgbase = cai
17
17
  depends = python-requests
18
18
  depends = python-typer
19
19
  depends = python-groq
20
- depends = python-anthropic
21
20
  depends = git
22
21
  source = cai-Y.Y.Y.tar.gz::https://github.com/thorstenfoltz/cai/archive/refs/tags/Y.Y.Y.tar.gz
23
22
  sha256sums = YYYYYY
@@ -3,7 +3,7 @@
3
3
  pkgname=cai
4
4
  pkgver=X.X.X
5
5
  pkgrel=1
6
- pkgdesc="Use LLM to create git commit messages."
6
+ pkgdesc="CLI tool that generates concise git commit messages from diffs or commit history using large language models"
7
7
  arch=('any')
8
8
  url="https://github.com/thorstenfoltz/cai"
9
9
  license=('MIT')
@@ -15,7 +15,6 @@ depends=(
15
15
  python-requests
16
16
  python-typer
17
17
  python-groq
18
- python-anthropic
19
18
  git
20
19
  )
21
20
  makedepends=(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: git-cai-cli
3
- Version: 0.7.2
3
+ Version: 0.7.3
4
4
  Summary: Use LLM to create git commit messages
5
5
  Author-email: Thorsten Foltz <thorsten.foltz@live.com>
6
6
  License-Expression: MIT
@@ -26,7 +26,6 @@ Requires-Dist: openai>=1.0
26
26
  Requires-Dist: google-genai>=1.39
27
27
  Requires-Dist: typer>=0.19.2
28
28
  Requires-Dist: requests>=2.32.5
29
- Requires-Dist: anthropic>=0.75.0
30
29
  Requires-Dist: groq>=0.37.0
31
30
  Dynamic: license-file
32
31
 
@@ -12,7 +12,6 @@ dependencies = [
12
12
  "google-genai>=1.39",
13
13
  "typer>=0.19.2",
14
14
  "requests>=2.32.5",
15
- "anthropic>=0.75.0",
16
15
  "groq>=0.37.0",
17
16
  ]
18
17
  license = "MIT"
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.7.2'
32
- __version_tuple__ = version_tuple = (0, 7, 2)
31
+ __version__ = version = '0.7.3'
32
+ __version_tuple__ = version_tuple = (0, 7, 3)
33
33
 
34
- __commit_id__ = commit_id = 'g474d0e433'
34
+ __commit_id__ = commit_id = 'g546a71775'
@@ -7,7 +7,6 @@ from collections.abc import Callable
7
7
  from typing import Any, Dict, Optional, Type
8
8
 
9
9
  import requests
10
- from anthropic import Anthropic
11
10
  from git_cai_cli.core.languages import LANGUAGE_MAP
12
11
  from google import genai # type: ignore[reportUnknownImport]
13
12
  from google.genai import types # type: ignore[reportUnknownImport]
@@ -131,34 +130,50 @@ class CommitMessageGenerator:
131
130
  def generate_anthropic(
132
131
  self,
133
132
  content: str,
134
- anthropic_cls: Type[Any] = Anthropic,
135
133
  system_prompt_override: Optional[str] = None,
136
134
  ) -> str:
137
135
  """
138
136
  Shared Anthropic call for commit generation or commit history summarization.
137
+ Uses direct HTTP API instead of the Anthropic SDK.
139
138
  """
140
- client = anthropic_cls(api_key=self.token)
139
+ url = "https://api.anthropic.com/v1/messages"
140
+ headers = {
141
+ "Content-Type": "application/json",
142
+ "x-api-key": self.token,
143
+ "anthropic-version": "2023-06-01",
144
+ }
145
+
141
146
  model = self.config["anthropic"]["model"]
142
147
  temperature = self.config["anthropic"]["temperature"]
143
148
 
144
- prompt = [
145
- {
146
- "role": "assistant",
147
- "content": system_prompt_override,
148
- },
149
+ messages = []
150
+
151
+ if system_prompt_override:
152
+ messages.append(
153
+ {
154
+ "role": "assistant",
155
+ "content": system_prompt_override,
156
+ }
157
+ )
158
+
159
+ messages.append(
149
160
  {
150
161
  "role": "user",
151
162
  "content": content,
152
- },
153
- ]
154
-
155
- response = client.messages.create(
156
- model=model,
157
- messages=prompt,
158
- temperature=temperature,
159
- max_tokens=4096, # this field is required by Anthropic API
163
+ }
160
164
  )
161
- return response.content[0].text.strip()
165
+
166
+ request = {
167
+ "model": model,
168
+ "max_tokens": 8192,
169
+ "temperature": temperature,
170
+ "messages": messages,
171
+ }
172
+
173
+ response = requests.post(url, json=request, headers=headers, timeout=30)
174
+ response.raise_for_status()
175
+
176
+ return response.json()["content"][0]["text"].strip()
162
177
 
163
178
  def generate_deepseek(
164
179
  self,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: git-cai-cli
3
- Version: 0.7.2
3
+ Version: 0.7.3
4
4
  Summary: Use LLM to create git commit messages
5
5
  Author-email: Thorsten Foltz <thorsten.foltz@live.com>
6
6
  License-Expression: MIT
@@ -26,7 +26,6 @@ Requires-Dist: openai>=1.0
26
26
  Requires-Dist: google-genai>=1.39
27
27
  Requires-Dist: typer>=0.19.2
28
28
  Requires-Dist: requests>=2.32.5
29
- Requires-Dist: anthropic>=0.75.0
30
29
  Requires-Dist: groq>=0.37.0
31
30
  Dynamic: license-file
32
31
 
@@ -3,5 +3,4 @@ openai>=1.0
3
3
  google-genai>=1.39
4
4
  typer>=0.19.2
5
5
  requests>=2.32.5
6
- anthropic>=0.75.0
7
6
  groq>=0.37.0
@@ -153,24 +153,60 @@ def test_generate_openai(generator):
153
153
 
154
154
 
155
155
  # test anthropic
156
- def test_generate_anthropic(generator):
156
+ def test_generate_anthropic():
157
157
  """
158
158
  Test that the generate_anthropic method returns the correct message text
159
159
  """
160
- mock_cls = MagicMock()
161
- mock_client = MagicMock()
160
+ config = {
161
+ "anthropic": {
162
+ "model": "claude-sonnet-4-5",
163
+ "temperature": 0.7,
164
+ }
165
+ }
162
166
 
163
- mock_response = MagicMock()
164
- mock_response.content = [MagicMock(text=" test ")]
167
+ gen = CommitMessageGenerator(
168
+ token="fake-token",
169
+ config=config,
170
+ default_model="anthropic",
171
+ )
165
172
 
166
- mock_client.messages.create.return_value = mock_response
167
- mock_cls.return_value = mock_client
173
+ module_path = CommitMessageGenerator.__module__
174
+
175
+ mock_post = MagicMock()
176
+ mock_post.return_value.json.return_value = {
177
+ "content": [{"text": " test "}],
178
+ }
179
+
180
+ with patch(f"{module_path}.requests.post", mock_post):
181
+ result = gen.generate_anthropic("abc", system_prompt_override="sys")
168
182
 
169
- result = generator.generate_anthropic(
170
- "abc", anthropic_cls=mock_cls, system_prompt_override="sys"
171
- )
172
183
  assert result == "test"
173
- mock_client.messages.create.assert_called_once()
184
+ mock_post.assert_called_once()
185
+
186
+ # --- Extract call details ---
187
+ args, kwargs = mock_post.call_args
188
+
189
+ # Positional arg 0 = URL
190
+ called_url = args[0]
191
+ assert called_url == "https://api.anthropic.com/v1/messages"
192
+
193
+ assert kwargs["timeout"] == 30
194
+
195
+ assert kwargs["headers"] == {
196
+ "Content-Type": "application/json",
197
+ "x-api-key": "fake-token",
198
+ "anthropic-version": "2023-06-01",
199
+ }
200
+
201
+ assert kwargs["json"] == {
202
+ "model": "claude-sonnet-4-5",
203
+ "max_tokens": 8192,
204
+ "temperature": 0.7,
205
+ "messages": [
206
+ {"role": "assistant", "content": "sys"},
207
+ {"role": "user", "content": "abc"},
208
+ ],
209
+ }
174
210
 
175
211
 
176
212
  # test gemini
@@ -11,25 +11,6 @@ wheels = [
11
11
  { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
12
12
  ]
13
13
 
14
- [[package]]
15
- name = "anthropic"
16
- version = "0.75.0"
17
- source = { registry = "https://pypi.org/simple" }
18
- dependencies = [
19
- { name = "anyio" },
20
- { name = "distro" },
21
- { name = "docstring-parser" },
22
- { name = "httpx" },
23
- { name = "jiter" },
24
- { name = "pydantic" },
25
- { name = "sniffio" },
26
- { name = "typing-extensions" },
27
- ]
28
- sdist = { url = "https://files.pythonhosted.org/packages/04/1f/08e95f4b7e2d35205ae5dcbb4ae97e7d477fc521c275c02609e2931ece2d/anthropic-0.75.0.tar.gz", hash = "sha256:e8607422f4ab616db2ea5baacc215dd5f028da99ce2f022e33c7c535b29f3dfb", size = 439565, upload-time = "2025-11-24T20:41:45.28Z" }
29
- wheels = [
30
- { url = "https://files.pythonhosted.org/packages/60/1c/1cd02b7ae64302a6e06724bf80a96401d5313708651d277b1458504a1730/anthropic-0.75.0-py3-none-any.whl", hash = "sha256:ea8317271b6c15d80225a9f3c670152746e88805a7a61e14d4a374577164965b", size = 388164, upload-time = "2025-11-24T20:41:43.587Z" },
31
- ]
32
-
33
14
  [[package]]
34
15
  name = "anyio"
35
16
  version = "4.12.1"
@@ -281,15 +262,6 @@ wheels = [
281
262
  { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" },
282
263
  ]
283
264
 
284
- [[package]]
285
- name = "docstring-parser"
286
- version = "0.17.0"
287
- source = { registry = "https://pypi.org/simple" }
288
- sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" }
289
- wheels = [
290
- { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" },
291
- ]
292
-
293
265
  [[package]]
294
266
  name = "docutils"
295
267
  version = "0.22.4"
@@ -315,7 +287,6 @@ wheels = [
315
287
  name = "git-cai-cli"
316
288
  source = { editable = "." }
317
289
  dependencies = [
318
- { name = "anthropic" },
319
290
  { name = "google-genai" },
320
291
  { name = "groq" },
321
292
  { name = "openai" },
@@ -334,7 +305,6 @@ dev = [
334
305
 
335
306
  [package.metadata]
336
307
  requires-dist = [
337
- { name = "anthropic", specifier = ">=0.75.0" },
338
308
  { name = "google-genai", specifier = ">=1.39" },
339
309
  { name = "groq", specifier = ">=0.37.0" },
340
310
  { name = "openai", specifier = ">=1.0" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes