agentic-python-coder 3.0.0__py3-none-any.whl → 3.2.0__py3-none-any.whl

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.
@@ -43,7 +43,7 @@ def get_api_key() -> str:
43
43
  api_key = os.getenv("OPENROUTER_API_KEY")
44
44
 
45
45
  if not api_key:
46
- print("Warning: No API key found. Set up with:", file=sys.stderr)
46
+ print("Error: No API key found. Set up with:", file=sys.stderr)
47
47
  print(" mkdir -p ~/.config/coder", file=sys.stderr)
48
48
  print(
49
49
  " echo 'OPENROUTER_API_KEY=sk-or-...' > ~/.config/coder/.env",
@@ -62,6 +62,8 @@ def _load_json_file(path: Path, model: str) -> dict[str, Any]:
62
62
  config = json.load(f)
63
63
  except json.JSONDecodeError as e:
64
64
  raise ValueError(f"Invalid JSON in model config '{model}': {e}") from e
65
+ except OSError as e:
66
+ raise FileNotFoundError(f"Cannot read model config '{model}': {e}") from e
65
67
 
66
68
  if "path" not in config:
67
69
  raise ValueError(f"Model config '{model}' missing required key: 'path'")
@@ -95,7 +97,7 @@ def load_model_config(model: str) -> dict[str, Any]:
95
97
  return _load_json_file(path, model)
96
98
 
97
99
  # Local override: ./{model}.json
98
- local_path = Path(f"./{model}.json")
100
+ local_path = Path(f"{model}.json")
99
101
  if local_path.exists():
100
102
  return _load_json_file(local_path, model)
101
103
 
@@ -107,9 +109,8 @@ def load_model_config(model: str) -> dict[str, Any]:
107
109
 
108
110
  # List available models for error message
109
111
  available = list_available_models()
110
- raise FileNotFoundError(
111
- f"Model '{model}' not found. Available: {', '.join(available)}"
112
- )
112
+ suffix = f" Available: {', '.join(available)}" if available else ""
113
+ raise FileNotFoundError(f"Model '{model}' not found.{suffix}")
113
114
 
114
115
 
115
116
  def list_available_models() -> list[str]:
@@ -146,10 +147,10 @@ def get_openrouter_llm(
146
147
  """
147
148
  # Load config from JSON
148
149
  config = load_model_config(model)
149
- model_path = config["path"]
150
+ model_id = config["path"]
150
151
 
151
152
  if verbose:
152
- print(f"Using model: {model_path}")
153
+ print(f"Using model: {model_id}")
153
154
  if os.getenv("CODER_VERBOSE"):
154
155
  for key, value in config.items():
155
156
  if key != "path":
@@ -194,7 +195,14 @@ def get_openrouter_llm(
194
195
  if key in config:
195
196
  api_params[key] = config[key]
196
197
  if "top_k" in config:
197
- # OpenRouter supports top_k via extra_body
198
- api_params["extra_body"] = {"top_k": config["top_k"]}
198
+ api_params.setdefault("extra_body", {})["top_k"] = config["top_k"]
199
199
 
200
- return LLMConfig(client=client, model=model_path, api_params=api_params)
200
+ # Provider routing works for all models (including no_sampling_params)
201
+ if "provider" in config:
202
+ api_params.setdefault("extra_body", {})["provider"] = config["provider"]
203
+
204
+ # Reasoning/thinking tokens (e.g. Gemini 3 Flash thinking levels)
205
+ if "reasoning" in config:
206
+ api_params.setdefault("extra_body", {})["reasoning"] = config["reasoning"]
207
+
208
+ return LLMConfig(client=client, model=model_id, api_params=api_params)
@@ -0,0 +1,7 @@
1
+ {
2
+ "path": "google/gemini-3.1-pro-preview",
3
+ "temperature": 0.0,
4
+ "max_tokens": 16384,
5
+ "streaming": true,
6
+ "request_timeout": 120
7
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "path": "google/gemini-3-flash-preview",
3
+ "temperature": 0.3,
4
+ "max_tokens": 16384
5
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "path": "anthropic/claude-sonnet-4.6",
3
+ "temperature": 0.0,
4
+ "max_tokens": 16384,
5
+ "streaming": true
6
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-python-coder
3
- Version: 3.0.0
3
+ Version: 3.2.0
4
4
  Summary: A lightweight Python coding agent that writes, executes, and iterates on code through natural language instructions
5
5
  Author: Stefan Szeider
6
6
  License: Apache-2.0
@@ -14,13 +14,13 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
15
15
  Classifier: Topic :: Software Development :: Code Generators
16
16
  Requires-Python: <3.14,>=3.13
17
- Requires-Dist: ipykernel>=7.1.0
17
+ Requires-Dist: ipykernel>=7.2.0
18
18
  Requires-Dist: jupyter-client>=8.8.0
19
19
  Requires-Dist: mcp>=1.26.0
20
- Requires-Dist: openai>=2.16.0
20
+ Requires-Dist: openai>=2.21.0
21
21
  Requires-Dist: python-dotenv>=1.2.1
22
22
  Requires-Dist: pyyaml>=6.0.3
23
- Requires-Dist: rich>=14.3.1
23
+ Requires-Dist: rich>=14.3.2
24
24
  Provides-Extra: dev
25
25
  Requires-Dist: mypy>=1.19.1; extra == 'dev'
26
26
  Requires-Dist: ruff>=0.14.14; extra == 'dev'
@@ -152,8 +152,9 @@ coder --model deepseek31 "task" # DeepSeek v3.1
152
152
  coder --model grok41 "task" # X.AI Grok 4.1
153
153
  coder --model qwen3 "task" # Qwen3 Coder
154
154
  coder --model gemini25 "task" # Gemini Pro 2.5
155
- coder --model gemini3pro "task" # Gemini 3 Pro Preview
156
- coder --model gpt52 "task" # GPT-5.2
155
+ coder --model gemini3pro "task" # Gemini 3 Pro Preview
156
+ coder --model gemini3flash "task" # Gemini 3 Flash Preview (fast, low-cost)
157
+ coder --model gpt52 "task" # GPT-5.2
157
158
 
158
159
  # Custom model (JSON file)
159
160
  coder --model ./mymodel.json "task"
@@ -259,7 +260,7 @@ from agentic_python_coder import get_openrouter_llm, list_available_models
259
260
 
260
261
  llm = get_openrouter_llm(model="sonnet45")
261
262
  print(list_available_models())
262
- # ['deepseek31', 'gemini25', 'gemini3pro', 'gpt52', 'grok41', 'opus45', 'qwen3', 'sonnet45']
263
+ # ['deepseek31', 'gemini25', 'gemini3flash', 'gemini3pro', 'gpt52', 'grok41', 'opus45', 'qwen3', 'sonnet45']
263
264
  ```
264
265
 
265
266
  ---
@@ -2,7 +2,7 @@ agentic_python_coder/__init__.py,sha256=AE7tDIivH7H0BBwhrR9C64rY6pO1d6AWDQYGAvGj
2
2
  agentic_python_coder/agent.py,sha256=Z7I0zvh3XEouPgt9hvkSIKYuZyHfsTrsTEFiJjsK4hk,12821
3
3
  agentic_python_coder/cli.py,sha256=pjmKHwLmC41wJ4Z6tQPFNeS2VwC-HCvtXklmv__xOco,14349
4
4
  agentic_python_coder/kernel.py,sha256=Xjqsl-Rzb6JBqWMTE4JBsxNsy1eRVUL5FvtfT1OFLD4,20541
5
- agentic_python_coder/llm.py,sha256=bmC6zh_JKIod9zuZ2G94qnrsUy4gGJ0_B5ka8d9hz30,5883
5
+ agentic_python_coder/llm.py,sha256=gfuJElwStUVmr3f26pjU4hW2C8jYZeVFX21-Zct2E48,6341
6
6
  agentic_python_coder/mcp_server.py,sha256=U_YfjeUvaVJ4poCsIqkzOx70J190RYH2Ln_H5tDc6Zg,18508
7
7
  agentic_python_coder/project_md.py,sha256=c4A-rbsc3ryqUkCJLGOKBHH8QJL5kAqvTSsM0tDeD4Y,3041
8
8
  agentic_python_coder/runner.py,sha256=AtdtRusD5ThTlsdL2SDjYk73jD0fYRWkJ4vmpeIWBl4,12683
@@ -26,16 +26,19 @@ agentic_python_coder/examples/regex/sample_tasks/phone_validation.md,sha256=yoij
26
26
  agentic_python_coder/examples/regex/sample_tasks/url_parsing.md,sha256=C2E6ze-AeIXbzM-gB0aJ3_QSiaJB3c2MbMTNJXzuYhA,1683
27
27
  agentic_python_coder/models/deepseek31.json,sha256=m3h2-rieY23gTXj9AOFoWxnrYUfqNpDpyNpPW0SMqVE,125
28
28
  agentic_python_coder/models/gemini25.json,sha256=Z9qJrIUNel366A3hSdg3qQixTh-EU8lehXKebW-XEUY,144
29
+ agentic_python_coder/models/gemini31.json,sha256=C7IZ3-6H0zKStftTAc6dTaXUSEDgeqecy-VaLjACPIo,138
30
+ agentic_python_coder/models/gemini3flash.json,sha256=S0AMVpzi3O5CQk68Q3Hi8iCHXMQQFnM4NbSh23x0qIM,91
29
31
  agentic_python_coder/models/gemini3pro.json,sha256=ptozne-ZwpmuXzpt2x0ZApMIvb5VsWskqI36XscCsrg,152
30
32
  agentic_python_coder/models/gpt52.json,sha256=rGYoD83_yioSDJvO3o4FSFhi0B2yTaOpCgr_XpRaPWk,105
31
33
  agentic_python_coder/models/grok41.json,sha256=bUFtp2orkBmfiLH7mE8SaS0YEe2kJFF1Ex2jb03p9SA,117
32
34
  agentic_python_coder/models/opus45.json,sha256=ujBiZiA-6YNbQxd3xWlGT7YGtEtbWMC8e2TP0I8Gtho,108
33
35
  agentic_python_coder/models/qwen3.json,sha256=Lj39r787EcfUcKXfO52aplYurkpM9mG1qg71UkaqVfQ,115
34
36
  agentic_python_coder/models/sonnet45.json,sha256=SXDBHwSRMlqG77i4OhvNDlHL7fESnCoqmEplXm3gP4k,110
37
+ agentic_python_coder/models/sonnet46.json,sha256=vQBYeKZUmHkfpYrSCMEJp6gZnxoMUXpne-UNQx5aR4Q,110
35
38
  agentic_python_coder/prompts/system.md,sha256=hREDVAhJXwCBAgJ3AE9JD6j-JRHREUPlkRSvThOvM3A,3807
36
39
  agentic_python_coder/prompts/system_todo.md,sha256=TuNeeUNS9KqyF62Da6t2mlUCYhKsgzwGe5ic_vFPDqw,5054
37
- agentic_python_coder-3.0.0.dist-info/METADATA,sha256=s6DmD-QG8F24bFfapraLMiQjcpx26k-ftboi0D6deRY,11467
38
- agentic_python_coder-3.0.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
39
- agentic_python_coder-3.0.0.dist-info/entry_points.txt,sha256=XIW3nZzL4kJ-Igohilj_mTvBcCyHBouDq2jmGzDILrk,107
40
- agentic_python_coder-3.0.0.dist-info/licenses/LICENSE,sha256=R9-M_V-SPdN71IphOVzM7kCNpUYs_hwj7rtroTwDhs0,11362
41
- agentic_python_coder-3.0.0.dist-info/RECORD,,
40
+ agentic_python_coder-3.2.0.dist-info/METADATA,sha256=n1Sonp0YG8x2A7ONGO0TKN5lALfFiwNPT_ZZQOMtgQc,11564
41
+ agentic_python_coder-3.2.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
42
+ agentic_python_coder-3.2.0.dist-info/entry_points.txt,sha256=XIW3nZzL4kJ-Igohilj_mTvBcCyHBouDq2jmGzDILrk,107
43
+ agentic_python_coder-3.2.0.dist-info/licenses/LICENSE,sha256=R9-M_V-SPdN71IphOVzM7kCNpUYs_hwj7rtroTwDhs0,11362
44
+ agentic_python_coder-3.2.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.28.0
2
+ Generator: hatchling 1.29.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any