From 9c769959adeb60fe49e8c3ed67515dddac772af8 Mon Sep 17 00:00:00 2001 From: Firehose Bot Date: Wed, 29 Apr 2026 17:07:38 +0100 Subject: [PATCH] Add pi.dev tag to Pi-related engineering posts --- .claude/settings.local.json | 7 ++ .gitignore | 1 + .pi/llm-metrics.log | 10 +++ ...ding-agent-generates-its-own-extensions.md | 2 +- .../2026/04-20-a-pair-pomodoro-with-pi.md | 2 +- ...arted-with-the-pi-coding-agent-on-a-vps.md | 2 +- .../04-29-my-local-agentic-dev-setup-today.md | 61 +++++++++++++++++- app/priv/static/images/blog/.DS_Store | Bin 0 -> 6148 bytes .../blog/2026/motorcycle-without-engine.svg | 60 +++++++++++++++++ 9 files changed, 139 insertions(+), 6 deletions(-) create mode 100644 .claude/settings.local.json create mode 100644 .pi/llm-metrics.log create mode 100644 app/priv/static/images/blog/.DS_Store create mode 100644 app/priv/static/images/blog/2026/motorcycle-without-engine.svg diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..5707c58 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,7 @@ +{ + "permissions": { + "allow": [ + "Bash(git add:*)" + ] + } +} diff --git a/.gitignore b/.gitignore index d6df0f9..fe8ad6b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ dokku-setup.sh /output/ .claude/worktrees +app/priv/blog/engineering/2026/04-24-what-it-takes-to-get-started-with-the-pi-coding-agent.md diff --git a/.pi/llm-metrics.log b/.pi/llm-metrics.log new file mode 100644 index 0000000..cae0564 --- /dev/null +++ b/.pi/llm-metrics.log @@ -0,0 +1,10 @@ +{"timestamp":"2026-04-29T13:29:50.834Z","provider":"llama.cpp","model":"unsloth/Qwen3.6-27B-GGUF:Q4_K_M","turnCount":1,"inputTokens":3898,"outputTokens":60,"totalTokens":3958,"prefillTokensPerSec":162.25,"generationTokensPerSec":61.04,"combinedTokensPerSec":158.27,"totalDurationMs":25008,"timeToFirstTokenMs":24025,"rawTimestamps":{"ttftMs":24025,"allTtftMs":[24025],"generationDurationMs":983,"turns":[{"turnId":"turn-0","durationMs":25008,"ttftMs":24025}]}} +{"timestamp":"2026-04-29T13:41:50.149Z","provider":"llama.cpp","model":"unsloth/Qwen3.6-27B-GGUF:Q4_K_M","turnCount":7,"inputTokens":5667,"outputTokens":960,"totalTokens":6627,"prefillTokensPerSec":500.44,"generationTokensPerSec":11.09,"combinedTokensPerSec":67.69,"totalDurationMs":97903,"timeToFirstTokenMs":11324,"rawTimestamps":{"ttftMs":11324,"allTtftMs":[11324],"generationDurationMs":86579,"turns":[{"turnId":"turn-0","durationMs":6146},{"turnId":"turn-1","durationMs":2996},{"turnId":"turn-2","durationMs":4988},{"turnId":"turn-3","durationMs":5554},{"turnId":"turn-4","durationMs":29939},{"turnId":"turn-5","durationMs":3521},{"turnId":"turn-6","durationMs":44759,"ttftMs":11324}]}} +{"timestamp":"2026-04-29T15:50:22.720Z","provider":"llama.cpp","model":"unsloth/Qwen3.6-27B-GGUF:Q4_K_M","turnCount":1,"inputTokens":3895,"outputTokens":81,"totalTokens":3976,"prefillTokensPerSec":165.89,"generationTokensPerSec":37.09,"combinedTokensPerSec":154.93,"totalDurationMs":25664,"timeToFirstTokenMs":23480,"rawTimestamps":{"ttftMs":23480,"allTtftMs":[23480],"generationDurationMs":2184,"turns":[{"turnId":"turn-0","durationMs":25664,"ttftMs":23480}]}} +{"timestamp":"2026-04-29T15:52:02.780Z","provider":"llama.cpp","model":"unsloth/Qwen3.6-27B-GGUF:Q4_K_M","turnCount":3,"inputTokens":61,"outputTokens":381,"totalTokens":442,"prefillTokensPerSec":8.43,"generationTokensPerSec":21.42,"combinedTokensPerSec":17.66,"totalDurationMs":25023,"timeToFirstTokenMs":7240,"rawTimestamps":{"ttftMs":7240,"allTtftMs":[7240,1429],"generationDurationMs":17783,"turns":[{"turnId":"turn-0","durationMs":15773,"ttftMs":7240},{"turnId":"turn-1","durationMs":7547,"ttftMs":1429},{"turnId":"turn-2","durationMs":1703}]}} +{"timestamp":"2026-04-29T15:54:09.944Z","provider":"llama.cpp","model":"unsloth/Qwen3.6-27B-GGUF:Q4_K_M","turnCount":6,"inputTokens":3978,"outputTokens":1388,"totalTokens":5366,"prefillTokensPerSec":924.04,"generationTokensPerSec":12.1,"combinedTokensPerSec":45.09,"totalDurationMs":119004,"timeToFirstTokenMs":4305,"rawTimestamps":{"ttftMs":4305,"allTtftMs":[4305,8638,7219,29433,6874],"generationDurationMs":114699,"turns":[{"turnId":"turn-0","durationMs":12420,"ttftMs":4305},{"turnId":"turn-1","durationMs":12723,"ttftMs":8638},{"turnId":"turn-2","durationMs":23125,"ttftMs":7219},{"turnId":"turn-3","durationMs":50368,"ttftMs":29433},{"turnId":"turn-4","durationMs":5165},{"turnId":"turn-5","durationMs":15203,"ttftMs":6874}]}} +{"timestamp":"2026-04-29T15:57:10.210Z","provider":"llama.cpp","model":"unsloth/Qwen3.6-27B-GGUF:Q4_K_M","turnCount":1,"inputTokens":33,"outputTokens":318,"totalTokens":351,"prefillTokensPerSec":2.19,"generationTokensPerSec":28.27,"combinedTokensPerSec":13.35,"totalDurationMs":26294,"timeToFirstTokenMs":15045,"rawTimestamps":{"ttftMs":15045,"allTtftMs":[15045],"generationDurationMs":11249,"turns":[{"turnId":"turn-0","durationMs":26294,"ttftMs":15045}]}} +{"timestamp":"2026-04-29T15:58:56.626Z","provider":"llama.cpp","model":"unsloth/Qwen3.6-27B-GGUF:Q4_K_M","turnCount":4,"inputTokens":2132,"outputTokens":1231,"totalTokens":3363,"prefillTokensPerSec":376.28,"generationTokensPerSec":12.52,"combinedTokensPerSec":32.34,"totalDurationMs":103985,"timeToFirstTokenMs":5666,"rawTimestamps":{"ttftMs":5666,"allTtftMs":[5666,39799,19167],"generationDurationMs":98319,"turns":[{"turnId":"turn-0","durationMs":6587},{"turnId":"turn-1","durationMs":11102,"ttftMs":5666},{"turnId":"turn-2","durationMs":54948,"ttftMs":39799},{"turnId":"turn-3","durationMs":31348,"ttftMs":19167}]}} +{"timestamp":"2026-04-29T16:05:02.148Z","provider":"llama.cpp","model":"unsloth/Qwen3.6-27B-GGUF:Q4_K_M","turnCount":2,"inputTokens":205,"outputTokens":571,"totalTokens":776,"prefillTokensPerSec":74.49,"generationTokensPerSec":15.29,"combinedTokensPerSec":19.35,"totalDurationMs":40104,"timeToFirstTokenMs":2752,"rawTimestamps":{"ttftMs":2752,"allTtftMs":[2752],"generationDurationMs":37352,"turns":[{"turnId":"turn-0","durationMs":30227},{"turnId":"turn-1","durationMs":9877,"ttftMs":2752}]}} +{"timestamp":"2026-04-29T16:07:50.115Z","provider":"llama.cpp","model":"unsloth/Qwen3.6-27B-GGUF:Q4_K_M","turnCount":2,"inputTokens":234,"outputTokens":199,"totalTokens":433,"prefillTokensPerSec":36.8,"generationTokensPerSec":25.9,"combinedTokensPerSec":30.84,"totalDurationMs":14042,"timeToFirstTokenMs":6358,"rawTimestamps":{"ttftMs":6358,"allTtftMs":[6358],"generationDurationMs":7684,"turns":[{"turnId":"turn-0","durationMs":4488},{"turnId":"turn-1","durationMs":9554,"ttftMs":6358}]}} +{"timestamp":"2026-04-29T20:33:28.606Z","provider":"llama.cpp","model":"unsloth/Qwen3.6-27B-GGUF:Q4_K_M","turnCount":4,"inputTokens":313,"outputTokens":377,"totalTokens":690,"prefillTokensPerSec":97.48,"generationTokensPerSec":15.28,"combinedTokensPerSec":24.75,"totalDurationMs":27880,"timeToFirstTokenMs":3211,"rawTimestamps":{"ttftMs":3211,"allTtftMs":[3211],"generationDurationMs":24669,"turns":[{"turnId":"turn-0","durationMs":8848},{"turnId":"turn-1","durationMs":9567},{"turnId":"turn-2","durationMs":4669},{"turnId":"turn-3","durationMs":4796,"ttftMs":3211}]}} diff --git a/app/priv/blog/engineering/2026/04-19-coding-agent-generates-its-own-extensions.md b/app/priv/blog/engineering/2026/04-19-coding-agent-generates-its-own-extensions.md index dc1826e..4bcd2c3 100644 --- a/app/priv/blog/engineering/2026/04-19-coding-agent-generates-its-own-extensions.md +++ b/app/priv/blog/engineering/2026/04-19-coding-agent-generates-its-own-extensions.md @@ -1,7 +1,7 @@ %{ title: "Coding agent generates its' own extensions", author: "Willem van den Ende", - tags: ~w(ai loops), + tags: ~w(pi.dev ai loops), description: "Handwritten note about generating extensions for the coding agent you are in a session with on something else. Engineer solutions in the moment.", published: true } diff --git a/app/priv/blog/engineering/2026/04-20-a-pair-pomodoro-with-pi.md b/app/priv/blog/engineering/2026/04-20-a-pair-pomodoro-with-pi.md index 0fd8599..a317d6e 100644 --- a/app/priv/blog/engineering/2026/04-20-a-pair-pomodoro-with-pi.md +++ b/app/priv/blog/engineering/2026/04-20-a-pair-pomodoro-with-pi.md @@ -1,7 +1,7 @@ %{ title: "A pair pomodoro with Pi", author: "Willem van den Ende", - tags: ~w(ai kata), + tags: ~w(pi.dev ai kata), description: "A brief experiment in working in short cycles with a coding agent. Human very much in the loop.", published: true } diff --git a/app/priv/blog/engineering/2026/04-24-how-to-get-started-with-the-pi-coding-agent-on-a-vps.md b/app/priv/blog/engineering/2026/04-24-how-to-get-started-with-the-pi-coding-agent-on-a-vps.md index a0821cd..462cd8b 100644 --- a/app/priv/blog/engineering/2026/04-24-how-to-get-started-with-the-pi-coding-agent-on-a-vps.md +++ b/app/priv/blog/engineering/2026/04-24-how-to-get-started-with-the-pi-coding-agent-on-a-vps.md @@ -1,7 +1,7 @@ %{ title: "How to get started with the Pi coding agent (on a VPS)", author: "Willem", - tags: ~w(agentic-engeeringing getting-started how-to), + tags: ~w(pi.dev agentic-engeeringing getting-started how-to), description: "Setting up Pi on a VPS is easier than I thought. Open source with a great unboxing experience. Follow along and enjoy!", published: true } diff --git a/app/priv/blog/engineering/2026/04-29-my-local-agentic-dev-setup-today.md b/app/priv/blog/engineering/2026/04-29-my-local-agentic-dev-setup-today.md index 7606007..246cc5d 100644 --- a/app/priv/blog/engineering/2026/04-29-my-local-agentic-dev-setup-today.md +++ b/app/priv/blog/engineering/2026/04-29-my-local-agentic-dev-setup-today.md @@ -16,21 +16,76 @@ You may note the absence of an IDE in the above. I was an early adopter of eXtre # Inference: LLamaCPP -blog/engineering/how-to-get-started-with-the-pi-coding-agent-on-a-vps +I got started with `ollama` and it looks like Hugging Face has a strong 'easy entry' as well. I run llama.cpp because it is quite fast, and more importantly, stable on MacOs. Model makers often support llamacpp in getting changes in to get their models out - the way inference works is still evolving, quite rapidly. + +I try `mlx` - mac native inference, occasionally, because sometimes it is faster than llamacpp. Often works for chat, but less so for agentic coding. + # Models : Qwen3.6 , 35B-A3B and 27B + + These came out last week. I ran the 3.5 models before, and they were good enough to tinker with over the easter holiday. 35B is a Mixture of Experts (MoE) model. While these cost more memory, they run much faster - for each token only 3B parameters are active, against 27B parameters for the 'dense' model. The dense model can be more cohesive. In 3.5 the difference was notable in planning and summarisation, 27B is more detailed. But here too, "good enough" counts - the 35B model is often good enough for what I do, and runs much faster. Between 30 and 80 tokens per second as far as I can tell, 27B peaks out at 19 tokens per second at the moment. This makes a big difference when I'm having a chat, less so when I run it in the background while doing something else. + + # Sandbox: Nono +Never run a coding agent outside a sandbox. That goes for claude code, that has some blocks, but is open to interpretation, and even more for Pi (see below), that runs in You Only Live Once Mode by design. Unless you want your home directory to be deleted for instance. + +I use Nono on my mac instead of Docker or devcontainers (also Docker). On Mac Docker needs to run in a VM, that costs me about 9GB of RAM that I needed for LLMs. I also can reuse installed packages over projects, and since I do many experiments, that makes it more fluid. + +The sandbox has access to a number of directories on the host, and the current working directory. Nono prompts for permission, you can override that with the `--allow-cwd` flag. + +Invocation: + +``` +nono run --profile pi -- pi +``` + +Configuration in `$HOME/.config/nono/profiles/pi.json` +```json +{ + "meta": { + "name": "pi", + "version": "1.0.0", + "description": "Auto-generated profile for pi" + }, + "filesystem": { + "allow": [ + "$HOME/Library/caches/elixir_make", + "$HOME/.hex", + "$HOME/.local/share/mise/", + "$HOME/.local/state/mise/", + "$HOME/Library/Caches/mise/", + "$HOME/Library/Caches/deno", + "$HOME/.pi/agent/", + "$HOME/dev/spikes/llm/monotonic-pi-extensions/packages/", + "$HOME/Users/willem/.config/git/" + ], + "read": [ + ], + "read_file": [ + "$HOME/.gitconfig" + ], + "write": [] + }, + "network": { + "block": false + }, + "workdir": { + "access": "readwrite" + } +} + +``` + # Coding agent: Pi.dev I covered the general setup with a hosted model in [how to get started with the pi coding agent on a vps](/blog/engineering/how-to-get-started-with-the-pi-coding-agent-on-a-vps) the other day. Pi will point you to the installation documentation as soon as you start it. - -`~/.pi/agent/models.json` +Configuration in `~/.pi/agent/models.json`: ```json { diff --git a/app/priv/static/images/blog/.DS_Store b/app/priv/static/images/blog/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e94f36de2119ad6fa06b00319b2646b117d92558 GIT binary patch literal 6148 zcmeHK&2AGh5S~c`BrVWQo0JxT6p;&3F99KLs7okYY@F@Fb{*|*63Qu0 zzyt6AJOf8A9C-mQyZ{HzoS0cVv>_mILWp{#@i(3yTmG!I*8qT(Vebln1ppaR#`GdJ zzYvbI&Phsp7?H>DoYA1`%Pw_4&Se{iVZbo(uQ9;iZW^vane_V6@3%Yfy(li1KU)^2 z7Sbn9p2}nwmrkEKyKLoFR&)7Wp-@;mx4v7i@qU_d$fLq{^!oluD2u^W25TE8EOxOv2GwXNmI38nAX zW#q-43|dd3Jvpw%V!s;nCCxbU#JD!#Q1noQ5#d}-bJy>5grum@v!4R7Eryn_$$3BJHLOye3}!cDw}H*gE@Vig~ugFW={xvEdmA)LrX zjT$f_UCpjtK*L`!h?&WW8pYh5^ICpEJPcLy?rx);Lj^939l~ z?*qrvj4WjHTY|Bu(bhOoND&fLrG%;!^%DbCIr)n^&(=6msLBD8nQ0t7GwK%#CbN^j zn4|;R3QcPmFbvExu%NmY-~YFN|NfsXGCjk9Vc@@F0Mpxz?FubP->q|t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +