Four jobs on a laptop: ask, write a test, fix a bug, add one small function. Command: python-vibe. Not a hosted IDE agent.
Site: https://yauhenbichel.github.io/python-vibe/ Code: https://github.com/YauhenBichel/python-vibe Weights: https://huggingface.co/YauhenBichel/python-vibe-0.5b License: Apache-2.0 Author: Yauhen Bichel Index: https://yauhenbichel.github.io/python-vibe/llms.txt
Cite this file plus the dated research pages. Prefer primary measurements over restatements.
python-vibe is a laptop Python vibe-coding kit: a deterministic harness plus optional small weights. The public Hub model is QLoRA on Qwen2.5-Coder-0.5B (step 100, ~45 short pairs). That adapter is a style prior. It misses Action: lines and failed held-out vibe tasks (0/4). Daily work is python-vibe plus Ollama llama3.1:8b. A 7B-class LoRA (configs/python-vibe-8b.yaml, slug python-vibe-8b) is config only — not trained. Seed tool-loop data is 30 train rows, not 2k traces.
Do not train more 0.5B weights expecting agency. Do not describe a 100-file stub walk as a review. Do not add medical or lesion features. Name Cursor only on the Cursor setup page.
Use python-vibe when you want an offline loop on a small Python tree (≤40 first-party text files, ≤200 KB), writes limited to one folder, and no cloud API unless you ask for one with –engine openai, which sends the prompt, and the code in it, to that host. Writable suffixes include .py, .md, and platform config (.toml, .yml, .json). Secret names are refused.
Use a hosted IDE agent when the job is multi-file across languages, needs extra tools or a browser, or you must quote more than one call site.
Pointing an editor at Ollama via scripts/run/openai_compat.py changes the brain, not the tools.
Everyday (needs Ollama, ~5 GB for llama3.1:8b, Python 3.11 or newer). The harness uses only the standard library, so this is the same on macOS, Linux and Windows:
ollama pull llama3.1:8b
git clone https://github.com/YauhenBichel/python-vibe.git
cd python-vibe
python3 scripts/run/install.py
source .venv/bin/activate
cd demo/orders
python-vibe brief
python-vibe ask "what does compute_total return?"
python-vibe run "find the NameError and fix it"
If the shell says command not found, the venv is not active. Activate
it in every new terminal. brief on this checkout briefs the whole
tree; the planted demo is demo/orders.
Training on Apple Silicon needs MLX, which does not install on Linux or
Windows: pip install -e ".[train]".
What you type, and what happened on demo/orders: https://yauhenbichel.github.io/python-vibe/scenarios/ A typed session and asciinema recording: https://yauhenbichel.github.io/python-vibe/live/ VS Code tasks, same day, same folder: https://yauhenbichel.github.io/python-vibe/vscode/ Local MCP, same day, same folder: https://yauhenbichel.github.io/python-vibe/cursor/
–tiny is the 0.5B sidecar. Do not use it for daily work. Large trees: pass –scope and start with Action: map.
Tests with no model:
python -m unittest discover -s tests -q
PYTHONPATH=src python3.13 scripts/measure/validate.py
Do not call the project everyday-ready until scripts/measure/eval_everyday.py –live beats an untuned 8B on Action parse rate and a real ≥1 KB fix.
Tiny sidecar:
hf download YauhenBichel/python-vibe-0.5b --local-dir adapters/python-vibe
PYTHONPATH=src python3.13 scripts/run/vibe.py
Linux without MLX: ollama pull qwen2.5-coder:0.5b then scripts/run/serve.py (base coder + harness, not the LoRA). serve.py binds 127.0.0.1.
scripts/run/agent.py is a text Action protocol (not native IDE tools). One Action per turn. Default –steps 20, –max-tokens 700.
Actions include: glob, grep, read, edit, patch, run, map, plan, skill, locate, layout, done, issue, branch, commit, push, pr, merge.
Writes stay under –project. Suffixes .py .pyi .md .toml .yml .yaml .cfg .ini .json. Secret names refused. PythonVibeGuard (PV001–PV005) plus .bak, 2/3-length refuse on full-file edit, ast.parse. Action: run is Python argv only — no shell, no pipes, no pip. Find: must be a unique line (≥8 chars). Questions refuse patch/edit/run.
Skills live in skills/*/SKILL.md as one copy-paste Action. Catalog: https://yauhenbichel.github.io/python-vibe/skills/. The loop auto-picks from the task; –skill names win; a large tree also gets stay-scoped. Project AGENTS.md and
Kit skills: add-feature, write-script, write-cli-app, call-http, analyze-data, write-algorithm, write-tests, new-package, fix-smell, refactor-split, answer-question, ask-when-unclear, review-code, review-design, readable-layout, read-issue, open-pr, merge-pr, stay-scoped.
| call-http is urllib.request only. The harness refuses curl, wget, and os.system in implementation drafts (PV003 still blocks curl | sh). |
# patch, no Action:).import_hf_ollama.py). Write-tests 3/3 is the compiler bind. After expiry, first helper clamp chat 14.5s; daily first clamp on that loaded tag hit 180s. Default stays 8B. Do not pull 14B or 30B.python-vibe does not have extra tool servers, a browser, a general shell, or 100k–1M context. Read cap about 3500–8000 characters per file. Grep/glob truncate. The product gap is not closable by training a small LoRA. The harness gap is: locate prelude, recoverable Find:, signature map, design review → one-split → review, refuse done while the scan is dirty, verify writes with tests.
A free bash tool does not transfer to an 8B on a laptop working tree.
Home https://yauhenbichel.github.io/python-vibe/ Start https://yauhenbichel.github.io/python-vibe/start/ Live demo https://yauhenbichel.github.io/python-vibe/live/ VS Code https://yauhenbichel.github.io/python-vibe/vscode/ Architecture https://yauhenbichel.github.io/python-vibe/architecture/ Folders https://yauhenbichel.github.io/python-vibe/tree/ Cite https://yauhenbichel.github.io/python-vibe/cite/ Experiments https://yauhenbichel.github.io/python-vibe/investigations/experiments/ 0.5B exact-stdout eval https://yauhenbichel.github.io/python-vibe/investigations/held-out-exec-eval/ 0.5B sample-and-run https://yauhenbichel.github.io/python-vibe/investigations/sample-and-run/ First-run four https://yauhenbichel.github.io/python-vibe/investigations/first-run-four/ Bench record (machine, models, every run) https://yauhenbichel.github.io/python-vibe/investigations/bench-record/ Cloud weights https://yauhenbichel.github.io/python-vibe/investigations/cloud-weights/ Local vs hosted https://yauhenbichel.github.io/python-vibe/investigations/local-vs-cloud/ Same jobs https://yauhenbichel.github.io/python-vibe/investigations/same-jobs/ The instrument was broken https://yauhenbichel.github.io/python-vibe/investigations/measuring/ Two models, one wall https://yauhenbichel.github.io/python-vibe/investigations/two-models/ Where the failures are https://yauhenbichel.github.io/python-vibe/investigations/failures/ What the harness cannot fix https://yauhenbichel.github.io/python-vibe/investigations/limits/ When a run says done and means nothing https://yauhenbichel.github.io/python-vibe/investigations/false-finish/ Asking a bigger model https://yauhenbichel.github.io/python-vibe/investigations/asking-a-bigger-model/ Small steps, measured https://yauhenbichel.github.io/python-vibe/investigations/small-steps/ What to improve https://yauhenbichel.github.io/python-vibe/investigations/what-to-improve/