{"_id":"@danielmeneses/pi-llama-swap","_rev":"3-70013613c04f91dd47c56be1a4210e93","name":"@danielmeneses/pi-llama-swap","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@danielmeneses/pi-llama-swap","version":"0.1.0","keywords":["pi-extension","pi-package","pi"],"author":{"name":"Daniel Meneses"},"license":"Apache-2.0","_id":"@danielmeneses/pi-llama-swap@0.1.0","maintainers":[{"name":"danielmeneses","email":"pro.danielmeneses@gmail.com"}],"homepage":"https://github.com/danielmeneses/pi-llama-swap#readme","bugs":{"url":"https://github.com/danielmeneses/pi-llama-swap/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"e7ae5086da38ff1dad2e209e6f810cb3762aef3b","tarball":"https://registry.npmjs.org/@danielmeneses/pi-llama-swap/-/pi-llama-swap-0.1.0.tgz","fileCount":10,"integrity":"sha512-unT6EmGMeuYx+Nx2XAQNx9hSH6w+eL0XAdwy96CsrEnyf9e//0GrqkaBQeaah31/gFpTXIuoek/w2YeIje2eYw==","signatures":[{"sig":"MEQCIAXbT973sQMHrl4tg9PzfugjBtpRFPzjPhNSHIAr4RwxAiBWdD7dFlE1VJ4JwDqmMLedz+OeRf2Dt9VXutAmTGghtw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40684},"main":"index.ts","type":"module","gitHead":"662525294a7e87744ef4eeebcf40cb68d7f728cd","scripts":{"check":"tsc --noEmit"},"_npmUser":{"name":"danielmeneses","email":"pro.danielmeneses@gmail.com"},"repository":{"url":"git+https://github.com/danielmeneses/pi-llama-swap.git","type":"git"},"_npmVersion":"10.9.4","description":"Pi extension: llama-swap provider with dynamic model discovery","directories":{"lib":"lib"},"_nodeVersion":"22.22.1","dependencies":{"undici-types":"^6.21.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"^0.78.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-llama-swap_0.1.0_1780668227152_0.5899942698631775","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@danielmeneses/pi-llama-swap","version":"0.1.1","keywords":["pi-extension","pi-package","pi"],"author":{"name":"Daniel Meneses"},"license":"Apache-2.0","_id":"@danielmeneses/pi-llama-swap@0.1.1","maintainers":[{"name":"danielmeneses","email":"pro.danielmeneses@gmail.com"}],"homepage":"https://github.com/danielmeneses/pi-llama-swap#readme","bugs":{"url":"https://github.com/danielmeneses/pi-llama-swap/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"189f892002405fb3a9a1393fb0e3560f989ea973","tarball":"https://registry.npmjs.org/@danielmeneses/pi-llama-swap/-/pi-llama-swap-0.1.1.tgz","fileCount":10,"integrity":"sha512-5uhU6nrVzXwSwOGGvfNpajq0U5JAYfrMWRweeBzIQDhoaB/eB8U4MuHIKt/Kt3esfbEPpoirjfPsUlcr5zuRtw==","signatures":[{"sig":"MEUCIQC5wxuLNG1fAliBIkGqCbkbPBKgjgWsO/uW3e7hORm1RQIgScKIa7St4WJqvFpxRthhlCLvUR8iTJUT5x6EV3cBVcQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42418},"main":"index.ts","type":"module","gitHead":"915861a1fc2dfd01991720d1c8854bc974cb5322","scripts":{"check":"tsc --noEmit"},"_npmUser":{"name":"danielmeneses","email":"pro.danielmeneses@gmail.com"},"repository":{"url":"git+https://github.com/danielmeneses/pi-llama-swap.git","type":"git"},"_npmVersion":"10.9.4","description":"Pi extension: llama-swap provider with dynamic model discovery","directories":{"lib":"lib"},"_nodeVersion":"22.22.1","dependencies":{"undici-types":"^6.21.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0","@types/node":"^22.0.0","@earendil-works/pi-coding-agent":"^0.78.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-llama-swap_0.1.1_1782129861365_0.7450695690572742","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@danielmeneses/pi-llama-swap","version":"0.1.2","description":"Pi extension: llama-swap provider with dynamic model discovery","type":"module","scripts":{"check":"tsc --noEmit"},"pi":{"extensions":["./index.ts"]},"devDependencies":{"@earendil-works/pi-coding-agent":"^0.78.0","@types/node":"^22.0.0","typescript":"^5.7.0"},"main":"index.ts","directories":{"lib":"lib"},"dependencies":{"undici-types":"^6.21.0"},"repository":{"type":"git","url":"git+https://github.com/danielmeneses/pi-llama-swap.git"},"keywords":["pi-extension","pi-package","pi"],"author":{"name":"Daniel Meneses"},"license":"Apache-2.0","bugs":{"url":"https://github.com/danielmeneses/pi-llama-swap/issues"},"homepage":"https://github.com/danielmeneses/pi-llama-swap#readme","_id":"@danielmeneses/pi-llama-swap@0.1.2","gitHead":"994e45db099df127aebe4022a6a404fdb0f6b1ef","_nodeVersion":"22.22.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-Z3sawsEW0OzBbYwwFpvo8Lbfv4Njy7qf68Y7pBSAVPez/3ZqNlnCH0U99qxkyBl/deVnw/gfLnoq9FX9gRvAzQ==","shasum":"c013dfe2d0207ec6ec1a297a9adb409da9fd7cb8","tarball":"https://registry.npmjs.org/@danielmeneses/pi-llama-swap/-/pi-llama-swap-0.1.2.tgz","fileCount":10,"unpackedSize":42427,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC1S0VPU916ezqwx6pjCbgocKrps6ekKpnbavb8zie/xgIgV7pCehnVIBDmAF7qF7mUiaUxwejbjt2MSU9MaJLoKd8="}]},"_npmUser":{"name":"danielmeneses","email":"pro.danielmeneses@gmail.com"},"maintainers":[{"name":"danielmeneses","email":"pro.danielmeneses@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-llama-swap_0.1.2_1786543162029_0.3878230383900054"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-05T14:03:47.000Z","modified":"2026-08-12T13:59:22.437Z","0.1.0":"2026-06-05T14:03:47.302Z","0.1.1":"2026-06-22T12:04:21.494Z","0.1.2":"2026-08-12T13:59:22.160Z"},"bugs":{"url":"https://github.com/danielmeneses/pi-llama-swap/issues"},"author":{"name":"Daniel Meneses"},"license":"Apache-2.0","homepage":"https://github.com/danielmeneses/pi-llama-swap#readme","keywords":["pi-extension","pi-package","pi"],"repository":{"type":"git","url":"git+https://github.com/danielmeneses/pi-llama-swap.git"},"description":"Pi extension: llama-swap provider with dynamic model discovery","maintainers":[{"name":"danielmeneses","email":"pro.danielmeneses@gmail.com"}],"readme":"# pi-llama-swap\n\nPi coding agent extension that registers a **llama-swap** provider and discovers models from a running [llama-swap](https://github.com/mostlygeek/llama-swap) instance.\n\n## What it does\n\n- Injects provider `llama-swap` with models from `GET /v1/models`\n- Resolves per-model context from llama-swap APIs (`/v1/models`, `/running`) with 256K default — see [Context window](#context-window-per-model)\n- Uses OpenAI Chat Completions API (`openai-completions`) for streaming\n- Reads optional config from `~/.pi/agent/pi-llama-swap.json` to override defaults\n\n## Requirements\n\n- [pi](https://github.com/badlogic/pi-mono) coding agent (`@earendil-works/pi-coding-agent`)\n- [llama-swap](https://github.com/mostlygeek/llama-swap) running and reachable\n- Node.js 18+ (for `fetch`)\n\n## Quick start\n\n```bash\n# Terminal 1: start llama-swap (example)\nllama-swap --config ~/llama-swap/config.yaml --listen 127.0.0.1:8080\n\n# Terminal 2: load extension\ncd /path/to/pi-llama-swap\npi -e .\n```\n\nIn pi: `/model` → pick `llama-swap/your-model-id`.\n\n### Commands\n\n| Command | Args | Description |\n|---------|------|-------------|\n| `/llama-swap-set-context-length` | `<number>` or `auto` | Override context window for the current model (`auto` removes override and uses auto-detection) |\n\nVerify from CLI:\n\n```bash\npi -e . --list-models | grep llama-swap\ncurl http://127.0.0.1:8080/v1/models\n```\n\n## Configuration\n\n### Defaults\n\n| Setting | Default |\n|---------|---------|\n| Origin | `http://127.0.0.1` |\n| Port | `8080` |\n| Base URL | `http://127.0.0.1:8080/v1` |\n\nNo config file needed when llama-swap runs on the defaults above.\n\n### Config file\n\nCreate `~/.pi/agent/pi-llama-swap.json` to override defaults:\n\n```json\n{\n  \"origin\": \"http://127.0.0.1\",\n  \"port\": 8080,\n  \"apiKey\": \"optional-key\",\n  \"contextOverrides\": {\n    \"my-model\": 32768\n  }\n}\n```\n\n| Field | Description |\n|-------|-------------|\n| `origin` | Scheme + host (e.g. `http://192.168.1.10`) |\n| `port` | TCP port (1–65535) |\n| `basePath` | API path prefix (default `/v1`; normalized to end with `/v1`) |\n| `apiKey` | Bearer token when llama-swap uses `apiKeys` |\n| `contextOverrides` | Per-model context overrides (model id → tokens). Use `/llama-swap-set-context-length` instead of editing manually. |\n\nLoad order: **defaults → `~/.pi/agent/pi-llama-swap.json` → environment variables**.\n\n### Context window (per model)\n\nContext size is auto-detected from llama-swap's `/v1/models` and `/running` endpoints at startup, with a default of **256K** when nothing reports a value. User overrides set via `/llama-swap-set-context-length` take precedence over all auto-detected values.\n\n```bash\n# Restrict permissions when storing API keys\nchmod 600 ~/.pi/agent/pi-llama-swap.json\n```\n\n### Environment variables\n\nOptional runtime overrides (highest precedence):\n\n| Variable | Purpose |\n|----------|---------|\n| `LLAMA_SWAP_URL` | Origin URL (scheme + host, optional port/path) |\n| `LLAMA_SWAP_PORT` | Port override |\n| `LLAMA_SWAP_API_KEY` | API key override |\n\n## Auth\n\nIf llama-swap uses `apiKeys` in its config, set `\"apiKey\"` in `pi-llama-swap.json` or `LLAMA_SWAP_API_KEY`.\n\nWithout a key, extension uses placeholder `local-no-auth` so models appear in `/model`. Pi may send `Authorization: Bearer local-no-auth`; most unsecured local installs ignore it.\n\n## Troubleshooting\n\n| Symptom | What to try |\n|---------|-------------|\n| `Cannot reach llama-swap` | Start llama-swap; check `origin`/`port` in config file |\n| HTTP 401 | Set `apiKey` in config or `LLAMA_SWAP_API_KEY` |\n| 0 models | Ensure models in llama-swap config; `curl http://127.0.0.1:8080/v1/models` |\n| Extension loads but chat fails | Confirm model id; first request may load model (slow) |\n| Config ignored | File must be `~/.pi/agent/pi-llama-swap.json`; restart pi after edits |\n\n## Project layout\n\n```\npi-llama-swap/\n├── index.ts          # Extension entry\n├── lib/\n│   ├── config.ts     # Load ~/.pi/agent/pi-llama-swap.json\n│   ├── url.ts        # URL building\n│   ├── client.ts     # GET /v1/models\n│   ├── context.ts    # Context window from llama-swap APIs\n│   ├── provider.ts   # registerProvider\n│   └── types.ts\n├── package.json\n└── README.md\n```\n\n## License\n\nMIT (see repository if published).\n","readmeFilename":"README.md"}