gac 1.11.0__tar.gz → 1.12.0__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.

Potentially problematic release.


This version of gac might be problematic. Click here for more details.

Files changed (39) hide show
  1. {gac-1.11.0 → gac-1.12.0}/PKG-INFO +3 -3
  2. {gac-1.11.0 → gac-1.12.0}/README.md +2 -2
  3. {gac-1.11.0 → gac-1.12.0}/src/gac/__version__.py +1 -1
  4. {gac-1.11.0 → gac-1.12.0}/src/gac/ai.py +2 -0
  5. {gac-1.11.0 → gac-1.12.0}/src/gac/ai_utils.py +1 -0
  6. {gac-1.11.0 → gac-1.12.0}/src/gac/init_cli.py +3 -1
  7. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/__init__.py +2 -0
  8. gac-1.12.0/src/gac/providers/deepseek.py +38 -0
  9. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/minimax.py +8 -8
  10. {gac-1.11.0 → gac-1.12.0}/.gitignore +0 -0
  11. {gac-1.11.0 → gac-1.12.0}/LICENSE +0 -0
  12. {gac-1.11.0 → gac-1.12.0}/pyproject.toml +0 -0
  13. {gac-1.11.0 → gac-1.12.0}/src/gac/__init__.py +0 -0
  14. {gac-1.11.0 → gac-1.12.0}/src/gac/cli.py +0 -0
  15. {gac-1.11.0 → gac-1.12.0}/src/gac/config.py +0 -0
  16. {gac-1.11.0 → gac-1.12.0}/src/gac/config_cli.py +0 -0
  17. {gac-1.11.0 → gac-1.12.0}/src/gac/constants.py +0 -0
  18. {gac-1.11.0 → gac-1.12.0}/src/gac/diff_cli.py +0 -0
  19. {gac-1.11.0 → gac-1.12.0}/src/gac/errors.py +0 -0
  20. {gac-1.11.0 → gac-1.12.0}/src/gac/git.py +0 -0
  21. {gac-1.11.0 → gac-1.12.0}/src/gac/main.py +0 -0
  22. {gac-1.11.0 → gac-1.12.0}/src/gac/preprocess.py +0 -0
  23. {gac-1.11.0 → gac-1.12.0}/src/gac/prompt.py +0 -0
  24. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/anthropic.py +0 -0
  25. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/cerebras.py +0 -0
  26. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/chutes.py +0 -0
  27. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/fireworks.py +0 -0
  28. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/gemini.py +0 -0
  29. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/groq.py +0 -0
  30. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/lmstudio.py +0 -0
  31. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/ollama.py +0 -0
  32. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/openai.py +0 -0
  33. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/openrouter.py +0 -0
  34. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/streamlake.py +0 -0
  35. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/synthetic.py +0 -0
  36. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/together.py +0 -0
  37. {gac-1.11.0 → gac-1.12.0}/src/gac/providers/zai.py +0 -0
  38. {gac-1.11.0 → gac-1.12.0}/src/gac/security.py +0 -0
  39. {gac-1.11.0 → gac-1.12.0}/src/gac/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gac
3
- Version: 1.11.0
3
+ Version: 1.12.0
4
4
  Summary: LLM-powered Git commit message generator with multi-provider support
5
5
  Project-URL: Homepage, https://github.com/cellwebb/gac
6
6
  Project-URL: Documentation, https://github.com/cellwebb/gac#readme
@@ -91,8 +91,8 @@ gac
91
91
 
92
92
  ### 🌐 **Supported Providers**
93
93
 
94
- - **Anthropic** • **Cerebras** • **Chutes.ai** • **Fireworks** • **Gemini**
95
- - **Groq** • **LM Studio** • **Minimax** • **Ollama** • **OpenAI** • **OpenRouter**
94
+ - **Anthropic** • **Cerebras** • **Chutes.ai** • **DeepSeek** • **Fireworks** • **Gemini**
95
+ - **Groq** • **LM Studio** • **MiniMax** • **Ollama** • **OpenAI** • **OpenRouter**
96
96
  - **Streamlake** • **Synthetic.new** • **Together AI** • **Z.AI** • **Z.AI Coding**
97
97
 
98
98
  ### 🧠 **Smart LLM Analysis**
@@ -50,8 +50,8 @@ gac
50
50
 
51
51
  ### 🌐 **Supported Providers**
52
52
 
53
- - **Anthropic** • **Cerebras** • **Chutes.ai** • **Fireworks** • **Gemini**
54
- - **Groq** • **LM Studio** • **Minimax** • **Ollama** • **OpenAI** • **OpenRouter**
53
+ - **Anthropic** • **Cerebras** • **Chutes.ai** • **DeepSeek** • **Fireworks** • **Gemini**
54
+ - **Groq** • **LM Studio** • **MiniMax** • **Ollama** • **OpenAI** • **OpenRouter**
55
55
  - **Streamlake** • **Synthetic.new** • **Together AI** • **Z.AI** • **Z.AI Coding**
56
56
 
57
57
  ### 🧠 **Smart LLM Analysis**
@@ -1,3 +1,3 @@
1
1
  """Version information for gac package."""
2
2
 
3
- __version__ = "1.11.0"
3
+ __version__ = "1.12.0"
@@ -13,6 +13,7 @@ from gac.providers import (
13
13
  call_anthropic_api,
14
14
  call_cerebras_api,
15
15
  call_chutes_api,
16
+ call_deepseek_api,
16
17
  call_fireworks_api,
17
18
  call_gemini_api,
18
19
  call_groq_api,
@@ -83,6 +84,7 @@ def generate_commit_message(
83
84
  "anthropic": call_anthropic_api,
84
85
  "cerebras": call_cerebras_api,
85
86
  "chutes": call_chutes_api,
87
+ "deepseek": call_deepseek_api,
86
88
  "fireworks": call_fireworks_api,
87
89
  "gemini": call_gemini_api,
88
90
  "groq": call_groq_api,
@@ -96,6 +96,7 @@ def generate_with_retries(
96
96
  "anthropic",
97
97
  "cerebras",
98
98
  "chutes",
99
+ "deepseek",
99
100
  "fireworks",
100
101
  "gemini",
101
102
  "groq",
@@ -35,16 +35,18 @@ def init() -> None:
35
35
  ("Anthropic", "claude-haiku-4-5"),
36
36
  ("Cerebras", "qwen-3-coder-480b"),
37
37
  ("Chutes", "zai-org/GLM-4.6-FP8"),
38
+ ("DeepSeek", "deepseek-chat"),
38
39
  ("Fireworks", "accounts/fireworks/models/gpt-oss-20b"),
39
40
  ("Gemini", "gemini-2.5-flash"),
40
41
  ("Groq", "meta-llama/llama-4-maverick-17b-128e-instruct"),
41
42
  ("LM Studio", "gemma3"),
42
- ("Minimax", "MiniMax-M2"),
43
+ ("MiniMax", "MiniMax-M2"),
43
44
  ("Ollama", "gemma3"),
44
45
  ("OpenAI", "gpt-4.1-mini"),
45
46
  ("OpenRouter", "openrouter/auto"),
46
47
  ("Streamlake", ""),
47
48
  ("Synthetic", "hf:zai-org/GLM-4.6"),
49
+ ("Together AI", "openai/gpt-oss-20B"),
48
50
  ("Z.AI", "glm-4.5-air"),
49
51
  ("Z.AI Coding", "glm-4.6"),
50
52
  ]
@@ -3,6 +3,7 @@
3
3
  from .anthropic import call_anthropic_api
4
4
  from .cerebras import call_cerebras_api
5
5
  from .chutes import call_chutes_api
6
+ from .deepseek import call_deepseek_api
6
7
  from .fireworks import call_fireworks_api
7
8
  from .gemini import call_gemini_api
8
9
  from .groq import call_groq_api
@@ -20,6 +21,7 @@ __all__ = [
20
21
  "call_anthropic_api",
21
22
  "call_cerebras_api",
22
23
  "call_chutes_api",
24
+ "call_deepseek_api",
23
25
  "call_fireworks_api",
24
26
  "call_gemini_api",
25
27
  "call_groq_api",
@@ -0,0 +1,38 @@
1
+ """DeepSeek API provider for gac."""
2
+
3
+ import os
4
+
5
+ import httpx
6
+
7
+ from gac.errors import AIError
8
+
9
+
10
+ def call_deepseek_api(model: str, messages: list[dict], temperature: float, max_tokens: int) -> str:
11
+ """Call DeepSeek API directly."""
12
+ api_key = os.getenv("DEEPSEEK_API_KEY")
13
+ if not api_key:
14
+ raise AIError.authentication_error("DEEPSEEK_API_KEY not found in environment variables")
15
+
16
+ url = "https://api.deepseek.com/v1/chat/completions"
17
+ headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
18
+
19
+ data = {"model": model, "messages": messages, "temperature": temperature, "max_tokens": max_tokens}
20
+
21
+ try:
22
+ response = httpx.post(url, headers=headers, json=data, timeout=120)
23
+ response.raise_for_status()
24
+ response_data = response.json()
25
+ content = response_data["choices"][0]["message"]["content"]
26
+ if content is None:
27
+ raise AIError.model_error("DeepSeek API returned null content")
28
+ if content == "":
29
+ raise AIError.model_error("DeepSeek API returned empty content")
30
+ return content
31
+ except httpx.HTTPStatusError as e:
32
+ if e.response.status_code == 429:
33
+ raise AIError.rate_limit_error(f"DeepSeek API rate limit exceeded: {e.response.text}") from e
34
+ raise AIError.model_error(f"DeepSeek API error: {e.response.status_code} - {e.response.text}") from e
35
+ except httpx.TimeoutException as e:
36
+ raise AIError.timeout_error(f"DeepSeek API request timed out: {str(e)}") from e
37
+ except Exception as e:
38
+ raise AIError.model_error(f"Error calling DeepSeek API: {str(e)}") from e
@@ -1,4 +1,4 @@
1
- """Minimax API provider for gac."""
1
+ """MiniMax API provider for gac."""
2
2
 
3
3
  import os
4
4
 
@@ -8,7 +8,7 @@ from gac.errors import AIError
8
8
 
9
9
 
10
10
  def call_minimax_api(model: str, messages: list[dict], temperature: float, max_tokens: int) -> str:
11
- """Call Minimax API directly."""
11
+ """Call MiniMax API directly."""
12
12
  api_key = os.getenv("MINIMAX_API_KEY")
13
13
  if not api_key:
14
14
  raise AIError.authentication_error("MINIMAX_API_KEY not found in environment variables")
@@ -24,15 +24,15 @@ def call_minimax_api(model: str, messages: list[dict], temperature: float, max_t
24
24
  response_data = response.json()
25
25
  content = response_data["choices"][0]["message"]["content"]
26
26
  if content is None:
27
- raise AIError.model_error("Minimax API returned null content")
27
+ raise AIError.model_error("MiniMax API returned null content")
28
28
  if content == "":
29
- raise AIError.model_error("Minimax API returned empty content")
29
+ raise AIError.model_error("MiniMax API returned empty content")
30
30
  return content
31
31
  except httpx.HTTPStatusError as e:
32
32
  if e.response.status_code == 429:
33
- raise AIError.rate_limit_error(f"Minimax API rate limit exceeded: {e.response.text}") from e
34
- raise AIError.model_error(f"Minimax API error: {e.response.status_code} - {e.response.text}") from e
33
+ raise AIError.rate_limit_error(f"MiniMax API rate limit exceeded: {e.response.text}") from e
34
+ raise AIError.model_error(f"MiniMax API error: {e.response.status_code} - {e.response.text}") from e
35
35
  except httpx.TimeoutException as e:
36
- raise AIError.timeout_error(f"Minimax API request timed out: {str(e)}") from e
36
+ raise AIError.timeout_error(f"MiniMax API request timed out: {str(e)}") from e
37
37
  except Exception as e:
38
- raise AIError.model_error(f"Error calling Minimax API: {str(e)}") from e
38
+ raise AIError.model_error(f"Error calling MiniMax API: {str(e)}") from e
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
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes