patchling 0.8.0__tar.gz → 0.9.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.
- {patchling-0.8.0 → patchling-0.9.0}/PKG-INFO +22 -31
- {patchling-0.8.0 → patchling-0.9.0}/README.md +17 -18
- patchling-0.9.0/patchling/__init__.py +61 -0
- patchling-0.9.0/patchling/applydiff.py +1017 -0
- {patchling-0.8.0 → patchling-0.9.0}/patchling/core.py +438 -55
- patchling-0.9.0/patchling/env.py +35 -0
- {patchling-0.8.0 → patchling-0.9.0}/patchling/gptpatch.py +2 -2
- patchling-0.9.0/patchling/py.typed +0 -0
- patchling-0.9.0/patchling/relevance.py +1297 -0
- {patchling-0.8.0 → patchling-0.9.0}/patchling.egg-info/PKG-INFO +22 -31
- {patchling-0.8.0 → patchling-0.9.0}/patchling.egg-info/SOURCES.txt +13 -1
- patchling-0.9.0/pyproject.toml +60 -0
- patchling-0.9.0/setup.py +5 -0
- patchling-0.9.0/tests/test_argparse_interleaving.py +40 -0
- patchling-0.9.0/tests/test_extract_diff_blocks.py +218 -0
- patchling-0.9.0/tests/test_live_llm.py +77 -0
- patchling-0.9.0/tests/test_packaging.py +34 -0
- patchling-0.9.0/tests/test_public_api.py +216 -0
- patchling-0.9.0/tests/test_relevance.py +1631 -0
- patchling-0.9.0/tests/test_relevance_bench.py +329 -0
- patchling-0.9.0/tests/test_relevance_live.py +40 -0
- {patchling-0.8.0 → patchling-0.9.0}/tests/test_smartapply.py +7 -3
- patchling-0.9.0/tests/test_smartapply_bugs.py +364 -0
- patchling-0.8.0/patchling/__init__.py +0 -3
- patchling-0.8.0/patchling/applydiff.py +0 -327
- patchling-0.8.0/patchling/gptsummarize.py +0 -196
- patchling-0.8.0/setup.py +0 -46
- {patchling-0.8.0 → patchling-0.9.0}/LICENSE.txt +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/patchling.egg-info/dependency_links.txt +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/patchling.egg-info/entry_points.txt +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/patchling.egg-info/requires.txt +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/patchling.egg-info/top_level.txt +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/setup.cfg +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/tests/test_applydiff.py +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/tests/test_applydiff_edgecases.py +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/tests/test_diff_parse.py +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/tests/test_failing_case.py +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/tests/test_multidiff.py +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/tests/test_parse_diff_per_file.py +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/tests/test_strip_bad_ouput.py +0 -0
- {patchling-0.8.0 → patchling-0.9.0}/tests/test_swallow_reasoning.py +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: patchling
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Summary: Natural-language code transformation as a library: generate unified diffs with LLMs and apply them resiliently with smartapply. Formerly gptdiff.
|
|
5
|
-
Home-page: https://github.com/255BITS/patchling-py
|
|
6
5
|
Author: 255labs
|
|
7
|
-
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/255BITS/patchling-py
|
|
8
|
+
Project-URL: Documentation, https://255bits.github.io/patchling-py
|
|
8
9
|
Project-URL: Source, https://github.com/255BITS/patchling-py
|
|
9
10
|
Project-URL: Browser/Node runtime (npm), https://www.npmjs.com/package/patchling
|
|
10
11
|
Project-URL: Built with patchling (nanoodle), https://nanoodle.com
|
|
@@ -12,6 +13,7 @@ Keywords: patchling,smartapply,llm,diff,unified-diff,patch,code-transformation,a
|
|
|
12
13
|
Classifier: License :: OSI Approved :: MIT License
|
|
13
14
|
Classifier: Programming Language :: Python :: 3
|
|
14
15
|
Classifier: Operating System :: OS Independent
|
|
16
|
+
Requires-Python: >=3.10
|
|
15
17
|
Description-Content-Type: text/markdown
|
|
16
18
|
License-File: LICENSE.txt
|
|
17
19
|
Requires-Dist: openai>=1.0.0
|
|
@@ -23,17 +25,7 @@ Requires-Dist: pytest-mock; extra == "test"
|
|
|
23
25
|
Provides-Extra: docs
|
|
24
26
|
Requires-Dist: mkdocs; extra == "docs"
|
|
25
27
|
Requires-Dist: mkdocs-material; extra == "docs"
|
|
26
|
-
Dynamic: author
|
|
27
|
-
Dynamic: classifier
|
|
28
|
-
Dynamic: description
|
|
29
|
-
Dynamic: description-content-type
|
|
30
|
-
Dynamic: home-page
|
|
31
|
-
Dynamic: keywords
|
|
32
28
|
Dynamic: license-file
|
|
33
|
-
Dynamic: project-url
|
|
34
|
-
Dynamic: provides-extra
|
|
35
|
-
Dynamic: requires-dist
|
|
36
|
-
Dynamic: summary
|
|
37
29
|
|
|
38
30
|
# Patchling
|
|
39
31
|
|
|
@@ -54,15 +46,10 @@ print(updated["main.py"])
|
|
|
54
46
|
|
|
55
47
|
Files in, files out. No filesystem access required, no agent harness. The hard part — applying an LLM-generated diff that `git apply` would reject — is what `smartapply` solves: per-file, AI-assisted patch resolution that survives fuzzy hunks, renames, new files, and deletions.
|
|
56
48
|
|
|
57
|
-
📚 Full documentation at [
|
|
49
|
+
🌐 Project home: [patchling.app](https://patchling.app) — try it live in your browser · 📚 Full documentation at [255bits.github.io/patchling-py](https://255bits.github.io/patchling-py)
|
|
58
50
|
|
|
59
|
-
Prefer the browser? **[patchling](https://github.com/255BITS/patchling)**
|
|
60
|
-
`generateDiff` + `smartapply
|
|
61
|
-
|
|
62
|
-
> **The patchling family** —
|
|
63
|
-
> **patchling** (you are here) ·
|
|
64
|
-
> [**patchling**](https://github.com/255BITS/patchling) (browser-first JS port) ·
|
|
65
|
-
> [**patchling-examples**](https://github.com/255BITS/patchling-examples) (live browser demos)
|
|
51
|
+
Prefer the browser? The same primitive ships on npm as **[patchling for JS](https://github.com/255BITS/patchling)**
|
|
52
|
+
(`generateDiff` + `smartapply`, zero-dependency ESM) — try the **[live demos →](https://255bits.github.io/patchling-examples/)**.
|
|
66
53
|
|
|
67
54
|
---
|
|
68
55
|
|
|
@@ -72,12 +59,13 @@ The same primitive exists for every runtime, and it powers a real product:
|
|
|
72
59
|
|
|
73
60
|
| Project | What it is |
|
|
74
61
|
|---------|------------|
|
|
75
|
-
| **patchling** (this repo) | Python library + CLI tools — [PyPI](https://pypi.org/project/patchling/) |
|
|
76
|
-
| **[patchling](https://github.com/255BITS/patchling)** | Zero-dependency ESM
|
|
62
|
+
| **patchling for Python** (this repo) | Python library + CLI tools — [PyPI](https://pypi.org/project/patchling/) |
|
|
63
|
+
| **[patchling for JS](https://github.com/255BITS/patchling)** | Zero-dependency ESM package for browser and Node — `generateDiff` + `smartapply` on in-memory file maps — [npm](https://www.npmjs.com/package/patchling) |
|
|
64
|
+
| **[patchling.app](https://patchling.app)** | Project homepage with a live in-browser demo of the whole diff → smartapply loop |
|
|
77
65
|
| **[nanoodle.com](https://nanoodle.com)** | Visual AI workflow editor built on patchling — no server, no signup, bring your own key. See the primitive working in production |
|
|
78
66
|
| **[Live demos](https://255bits.github.io/patchling-examples/)** | Browser examples: LLM-edited games, 3D scenes, stream overlays, AI characters |
|
|
79
67
|
|
|
80
|
-
Building for the browser? Start with [patchling](https://github.com/255BITS/patchling). Building a Python backend, pipeline, or your own agent? You're in the right repo.
|
|
68
|
+
Building for the browser? Start with [patchling for JS](https://github.com/255BITS/patchling). Building a Python backend, pipeline, or your own agent? You're in the right repo.
|
|
81
69
|
|
|
82
70
|
---
|
|
83
71
|
|
|
@@ -128,10 +116,11 @@ See [examples/usage_example.py](examples/usage_example.py) for a runnable versio
|
|
|
128
116
|
|
|
129
117
|
- `generate_diff(environment: str, goal: str, model: str = ...) -> str` — generates a unified diff implementing the goal. `model` defaults to the `GPTDIFF_MODEL` env var.
|
|
130
118
|
- `smartapply(diff_text: str, files: dict[str, str], model: str = ...) -> dict[str, str]` — applies a diff with AI-powered conflict resolution. Handles new files, deletions, and hunks that standard patching rejects. Returns a new dict; input is not mutated.
|
|
131
|
-
- `build_environment(files: dict[str, str]) -> str` — serializes a files dict into the environment string `generate_diff` expects.
|
|
119
|
+
- `build_environment(files: dict[str, str]) -> str` — serializes a files dict into the environment string `generate_diff` expects. Pass `filter_relevant=True` and `task=` to drop files a cheap model marks irrelevant first.
|
|
120
|
+
- `filter_relevant(files, task, model=..., concurrency=..., cache=...) -> FilterRelevantResult` — opt-in relevance filter for large directories. Each file is sent, with the task, to a cheap OpenAI-compatible model that answers yes/no. Only the `yes` files are returned for `generate_diff` and `smartapply`. The default model is `xiaomi/mimo-v2.6-flash` (Flask recall 1.0 and ~0.8x overhead figures are UNVERIFIED). The JS counterpart is `filterRelevant`.
|
|
132
121
|
- `load_project_files(path, cwd) -> dict` / `save_files(files, base_dir)` — optional filesystem helpers for when you *do* want to read/write a real project (respects `.gitignore` and `.gptignore`).
|
|
133
122
|
|
|
134
|
-
Full signatures, error handling, and edge cases: [API Reference](https://
|
|
123
|
+
Full signatures, error handling, and edge cases: [API Reference](https://255bits.github.io/patchling-py/api).
|
|
135
124
|
|
|
136
125
|
**Pipeline example** — sequential transformations over an in-memory codebase:
|
|
137
126
|
|
|
@@ -176,6 +165,7 @@ export GPTDIFF_SMARTAPPLY_MODEL='gpt5-mini'
|
|
|
176
165
|
| `GPTDIFF_MODEL` | Model for diff generation | `gemini-3-pro-preview` |
|
|
177
166
|
| `GPTDIFF_SMARTAPPLY_MODEL` | Model for applying diffs | `GPTDIFF_MODEL` |
|
|
178
167
|
| `GPTDIFF_LLM_BASE_URL` | OpenAI-compatible endpoint | `https://nano-gpt.com/api/v1/` |
|
|
168
|
+
| `GPTDIFF_FILTER_MODEL` | Cheap model for `filter_relevant` | `xiaomi/mimo-v2.6-flash` (Flask recall 1.0 / ~0.8x overhead: UNVERIFIED) |
|
|
179
169
|
|
|
180
170
|
---
|
|
181
171
|
|
|
@@ -203,7 +193,7 @@ patchling "Add type hints to all functions" --apply
|
|
|
203
193
|
patchling "Add logging" src/api/ src/utils/helpers.py
|
|
204
194
|
```
|
|
205
195
|
|
|
206
|
-
Useful flags: `--model`, `--temperature`, `--prepend <file>` (custom instructions), `--image <path>` (visual context), `--nobeep`. Full list: [CLI Reference](https://
|
|
196
|
+
Useful flags: `--model`, `--temperature`, `--prepend <file>` (custom instructions), `--image <path>` (visual context), `--filter-relevant` (ask a cheap model which files to send; `--filter-model` picks that model), `--nobeep`. Full list: [CLI Reference](https://255bits.github.io/patchling-py/cli).
|
|
207
197
|
|
|
208
198
|
Because changes arrive as diffs, the CLI is git-native: review with `git diff`, keep with `git add -p`, discard with `git checkout .`.
|
|
209
199
|
|
|
@@ -216,7 +206,7 @@ patchling-apply path/to/diff.patch
|
|
|
216
206
|
patchling-apply --diff "<diff text>"
|
|
217
207
|
```
|
|
218
208
|
|
|
219
|
-
Options: `--project-dir`, `--model`, `--max_tokens`, `--nobeep`. Details: [patchling-apply docs](https://
|
|
209
|
+
Options: `--project-dir`, `--model`, `--max_tokens`, `--nobeep`. Details: [patchling-apply docs](https://255bits.github.io/patchling-py/patchling-apply).
|
|
220
210
|
|
|
221
211
|
### Agent loops
|
|
222
212
|
|
|
@@ -230,7 +220,7 @@ while true; do
|
|
|
230
220
|
done
|
|
231
221
|
```
|
|
232
222
|
|
|
233
|
-
One overnight test-coverage loop took a project from 18 to 127 test cases. Recipes and guardrails: [Automation Guide](https://
|
|
223
|
+
One overnight test-coverage loop took a project from 18 to 127 test cases. Recipes and guardrails: [Automation Guide](https://255bits.github.io/patchling-py/examples/automation).
|
|
234
224
|
|
|
235
225
|
---
|
|
236
226
|
|
|
@@ -243,7 +233,7 @@ pytest tests/
|
|
|
243
233
|
|
|
244
234
|
## Documentation
|
|
245
235
|
|
|
246
|
-
Docs live at [
|
|
236
|
+
Docs live at [255bits.github.io/patchling-py](https://255bits.github.io/patchling-py). To preview locally:
|
|
247
237
|
|
|
248
238
|
```bash
|
|
249
239
|
pip install .[docs]
|
|
@@ -252,7 +242,8 @@ mkdocs serve
|
|
|
252
242
|
|
|
253
243
|
## Related projects
|
|
254
244
|
|
|
255
|
-
- [patchling](https://
|
|
245
|
+
- [patchling.app](https://patchling.app) — project home, with a live in-browser demo
|
|
246
|
+
- [patchling for JS](https://github.com/255BITS/patchling) — the browser/Node package on [npm](https://www.npmjs.com/package/patchling)
|
|
256
247
|
- [nanoodle.com](https://nanoodle.com) — visual AI workflow editor built on patchling
|
|
257
248
|
- [patchling live demos](https://255bits.github.io/patchling-examples/)
|
|
258
249
|
- [AI Agent Toolbox](https://github.com/255BITS/ai-agent-toolbox) — powers Patchling's tool-call parsing across models
|
|
@@ -17,15 +17,10 @@ print(updated["main.py"])
|
|
|
17
17
|
|
|
18
18
|
Files in, files out. No filesystem access required, no agent harness. The hard part — applying an LLM-generated diff that `git apply` would reject — is what `smartapply` solves: per-file, AI-assisted patch resolution that survives fuzzy hunks, renames, new files, and deletions.
|
|
19
19
|
|
|
20
|
-
📚 Full documentation at [
|
|
20
|
+
🌐 Project home: [patchling.app](https://patchling.app) — try it live in your browser · 📚 Full documentation at [255bits.github.io/patchling-py](https://255bits.github.io/patchling-py)
|
|
21
21
|
|
|
22
|
-
Prefer the browser? **[patchling](https://github.com/255BITS/patchling)**
|
|
23
|
-
`generateDiff` + `smartapply
|
|
24
|
-
|
|
25
|
-
> **The patchling family** —
|
|
26
|
-
> **patchling** (you are here) ·
|
|
27
|
-
> [**patchling**](https://github.com/255BITS/patchling) (browser-first JS port) ·
|
|
28
|
-
> [**patchling-examples**](https://github.com/255BITS/patchling-examples) (live browser demos)
|
|
22
|
+
Prefer the browser? The same primitive ships on npm as **[patchling for JS](https://github.com/255BITS/patchling)**
|
|
23
|
+
(`generateDiff` + `smartapply`, zero-dependency ESM) — try the **[live demos →](https://255bits.github.io/patchling-examples/)**.
|
|
29
24
|
|
|
30
25
|
---
|
|
31
26
|
|
|
@@ -35,12 +30,13 @@ The same primitive exists for every runtime, and it powers a real product:
|
|
|
35
30
|
|
|
36
31
|
| Project | What it is |
|
|
37
32
|
|---------|------------|
|
|
38
|
-
| **patchling** (this repo) | Python library + CLI tools — [PyPI](https://pypi.org/project/patchling/) |
|
|
39
|
-
| **[patchling](https://github.com/255BITS/patchling)** | Zero-dependency ESM
|
|
33
|
+
| **patchling for Python** (this repo) | Python library + CLI tools — [PyPI](https://pypi.org/project/patchling/) |
|
|
34
|
+
| **[patchling for JS](https://github.com/255BITS/patchling)** | Zero-dependency ESM package for browser and Node — `generateDiff` + `smartapply` on in-memory file maps — [npm](https://www.npmjs.com/package/patchling) |
|
|
35
|
+
| **[patchling.app](https://patchling.app)** | Project homepage with a live in-browser demo of the whole diff → smartapply loop |
|
|
40
36
|
| **[nanoodle.com](https://nanoodle.com)** | Visual AI workflow editor built on patchling — no server, no signup, bring your own key. See the primitive working in production |
|
|
41
37
|
| **[Live demos](https://255bits.github.io/patchling-examples/)** | Browser examples: LLM-edited games, 3D scenes, stream overlays, AI characters |
|
|
42
38
|
|
|
43
|
-
Building for the browser? Start with [patchling](https://github.com/255BITS/patchling). Building a Python backend, pipeline, or your own agent? You're in the right repo.
|
|
39
|
+
Building for the browser? Start with [patchling for JS](https://github.com/255BITS/patchling). Building a Python backend, pipeline, or your own agent? You're in the right repo.
|
|
44
40
|
|
|
45
41
|
---
|
|
46
42
|
|
|
@@ -91,10 +87,11 @@ See [examples/usage_example.py](examples/usage_example.py) for a runnable versio
|
|
|
91
87
|
|
|
92
88
|
- `generate_diff(environment: str, goal: str, model: str = ...) -> str` — generates a unified diff implementing the goal. `model` defaults to the `GPTDIFF_MODEL` env var.
|
|
93
89
|
- `smartapply(diff_text: str, files: dict[str, str], model: str = ...) -> dict[str, str]` — applies a diff with AI-powered conflict resolution. Handles new files, deletions, and hunks that standard patching rejects. Returns a new dict; input is not mutated.
|
|
94
|
-
- `build_environment(files: dict[str, str]) -> str` — serializes a files dict into the environment string `generate_diff` expects.
|
|
90
|
+
- `build_environment(files: dict[str, str]) -> str` — serializes a files dict into the environment string `generate_diff` expects. Pass `filter_relevant=True` and `task=` to drop files a cheap model marks irrelevant first.
|
|
91
|
+
- `filter_relevant(files, task, model=..., concurrency=..., cache=...) -> FilterRelevantResult` — opt-in relevance filter for large directories. Each file is sent, with the task, to a cheap OpenAI-compatible model that answers yes/no. Only the `yes` files are returned for `generate_diff` and `smartapply`. The default model is `xiaomi/mimo-v2.6-flash` (Flask recall 1.0 and ~0.8x overhead figures are UNVERIFIED). The JS counterpart is `filterRelevant`.
|
|
95
92
|
- `load_project_files(path, cwd) -> dict` / `save_files(files, base_dir)` — optional filesystem helpers for when you *do* want to read/write a real project (respects `.gitignore` and `.gptignore`).
|
|
96
93
|
|
|
97
|
-
Full signatures, error handling, and edge cases: [API Reference](https://
|
|
94
|
+
Full signatures, error handling, and edge cases: [API Reference](https://255bits.github.io/patchling-py/api).
|
|
98
95
|
|
|
99
96
|
**Pipeline example** — sequential transformations over an in-memory codebase:
|
|
100
97
|
|
|
@@ -139,6 +136,7 @@ export GPTDIFF_SMARTAPPLY_MODEL='gpt5-mini'
|
|
|
139
136
|
| `GPTDIFF_MODEL` | Model for diff generation | `gemini-3-pro-preview` |
|
|
140
137
|
| `GPTDIFF_SMARTAPPLY_MODEL` | Model for applying diffs | `GPTDIFF_MODEL` |
|
|
141
138
|
| `GPTDIFF_LLM_BASE_URL` | OpenAI-compatible endpoint | `https://nano-gpt.com/api/v1/` |
|
|
139
|
+
| `GPTDIFF_FILTER_MODEL` | Cheap model for `filter_relevant` | `xiaomi/mimo-v2.6-flash` (Flask recall 1.0 / ~0.8x overhead: UNVERIFIED) |
|
|
142
140
|
|
|
143
141
|
---
|
|
144
142
|
|
|
@@ -166,7 +164,7 @@ patchling "Add type hints to all functions" --apply
|
|
|
166
164
|
patchling "Add logging" src/api/ src/utils/helpers.py
|
|
167
165
|
```
|
|
168
166
|
|
|
169
|
-
Useful flags: `--model`, `--temperature`, `--prepend <file>` (custom instructions), `--image <path>` (visual context), `--nobeep`. Full list: [CLI Reference](https://
|
|
167
|
+
Useful flags: `--model`, `--temperature`, `--prepend <file>` (custom instructions), `--image <path>` (visual context), `--filter-relevant` (ask a cheap model which files to send; `--filter-model` picks that model), `--nobeep`. Full list: [CLI Reference](https://255bits.github.io/patchling-py/cli).
|
|
170
168
|
|
|
171
169
|
Because changes arrive as diffs, the CLI is git-native: review with `git diff`, keep with `git add -p`, discard with `git checkout .`.
|
|
172
170
|
|
|
@@ -179,7 +177,7 @@ patchling-apply path/to/diff.patch
|
|
|
179
177
|
patchling-apply --diff "<diff text>"
|
|
180
178
|
```
|
|
181
179
|
|
|
182
|
-
Options: `--project-dir`, `--model`, `--max_tokens`, `--nobeep`. Details: [patchling-apply docs](https://
|
|
180
|
+
Options: `--project-dir`, `--model`, `--max_tokens`, `--nobeep`. Details: [patchling-apply docs](https://255bits.github.io/patchling-py/patchling-apply).
|
|
183
181
|
|
|
184
182
|
### Agent loops
|
|
185
183
|
|
|
@@ -193,7 +191,7 @@ while true; do
|
|
|
193
191
|
done
|
|
194
192
|
```
|
|
195
193
|
|
|
196
|
-
One overnight test-coverage loop took a project from 18 to 127 test cases. Recipes and guardrails: [Automation Guide](https://
|
|
194
|
+
One overnight test-coverage loop took a project from 18 to 127 test cases. Recipes and guardrails: [Automation Guide](https://255bits.github.io/patchling-py/examples/automation).
|
|
197
195
|
|
|
198
196
|
---
|
|
199
197
|
|
|
@@ -206,7 +204,7 @@ pytest tests/
|
|
|
206
204
|
|
|
207
205
|
## Documentation
|
|
208
206
|
|
|
209
|
-
Docs live at [
|
|
207
|
+
Docs live at [255bits.github.io/patchling-py](https://255bits.github.io/patchling-py). To preview locally:
|
|
210
208
|
|
|
211
209
|
```bash
|
|
212
210
|
pip install .[docs]
|
|
@@ -215,7 +213,8 @@ mkdocs serve
|
|
|
215
213
|
|
|
216
214
|
## Related projects
|
|
217
215
|
|
|
218
|
-
- [patchling](https://
|
|
216
|
+
- [patchling.app](https://patchling.app) — project home, with a live in-browser demo
|
|
217
|
+
- [patchling for JS](https://github.com/255BITS/patchling) — the browser/Node package on [npm](https://www.npmjs.com/package/patchling)
|
|
219
218
|
- [nanoodle.com](https://nanoodle.com) — visual AI workflow editor built on patchling
|
|
220
219
|
- [patchling live demos](https://255bits.github.io/patchling-examples/)
|
|
221
220
|
- [AI Agent Toolbox](https://github.com/255BITS/ai-agent-toolbox) — powers Patchling's tool-call parsing across models
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""Natural-language diffs and resilient patch application.
|
|
2
|
+
|
|
3
|
+
Public names mirror 255BITS/patchling (the JavaScript package) in snake_case.
|
|
4
|
+
Existing names such as ``generate_diff`` and ``smartapply`` stay in place.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .applydiff import apply_diff, extract_diff_blocks, parse_diff_per_file
|
|
8
|
+
from .core import (
|
|
9
|
+
SmartApplyError,
|
|
10
|
+
build_environment,
|
|
11
|
+
call_llm,
|
|
12
|
+
call_llm_for_diff,
|
|
13
|
+
color_code_diff,
|
|
14
|
+
generate_diff,
|
|
15
|
+
load_project_files,
|
|
16
|
+
resolve_api_key,
|
|
17
|
+
resolve_base_url,
|
|
18
|
+
save_files,
|
|
19
|
+
smartapply,
|
|
20
|
+
strip_bad_output,
|
|
21
|
+
strip_think_tags,
|
|
22
|
+
swallow_reasoning,
|
|
23
|
+
)
|
|
24
|
+
from .env import DEFAULT_BASE_URL, DEFAULT_MODEL, get_env, set_env
|
|
25
|
+
from .relevance import (
|
|
26
|
+
FilterRelevantResult,
|
|
27
|
+
RelevanceCache,
|
|
28
|
+
RelevanceDecision,
|
|
29
|
+
filter_relevant,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
__version__ = "0.9.0"
|
|
33
|
+
|
|
34
|
+
__all__ = [
|
|
35
|
+
"__version__",
|
|
36
|
+
"DEFAULT_BASE_URL",
|
|
37
|
+
"DEFAULT_MODEL",
|
|
38
|
+
"FilterRelevantResult",
|
|
39
|
+
"RelevanceCache",
|
|
40
|
+
"RelevanceDecision",
|
|
41
|
+
"SmartApplyError",
|
|
42
|
+
"apply_diff",
|
|
43
|
+
"build_environment",
|
|
44
|
+
"call_llm",
|
|
45
|
+
"call_llm_for_diff",
|
|
46
|
+
"color_code_diff",
|
|
47
|
+
"extract_diff_blocks",
|
|
48
|
+
"filter_relevant",
|
|
49
|
+
"generate_diff",
|
|
50
|
+
"get_env",
|
|
51
|
+
"load_project_files",
|
|
52
|
+
"parse_diff_per_file",
|
|
53
|
+
"resolve_api_key",
|
|
54
|
+
"resolve_base_url",
|
|
55
|
+
"save_files",
|
|
56
|
+
"set_env",
|
|
57
|
+
"smartapply",
|
|
58
|
+
"strip_bad_output",
|
|
59
|
+
"strip_think_tags",
|
|
60
|
+
"swallow_reasoning",
|
|
61
|
+
]
|