{"_id":"@audsiui/pi-keenable","_rev":"2-c4422ebc414e240eba776dec6263be8d","name":"@audsiui/pi-keenable","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@audsiui/pi-keenable","version":"0.1.0","keywords":["pi-package","keenable","search","web-search"],"license":"MIT","_id":"@audsiui/pi-keenable@0.1.0","maintainers":[{"name":"audsiui","email":"audsiui@outlook.com"}],"pi":{"extensions":["./extensions"]},"dist":{"shasum":"89d9cc336db5413cd66dec70977487486b9d3a03","tarball":"https://registry.npmjs.org/@audsiui/pi-keenable/-/pi-keenable-0.1.0.tgz","fileCount":4,"integrity":"sha512-ptOrHY0J+PdlLWG8ug1ZmEOM8HA3vgse9xsQegaz3EucsuO/Yw4DfiVaRv3wUtkijPcQcZ4V5vy5Ps3thaZVVA==","signatures":[{"sig":"MEYCIQCj6ugaTLrsD3V04qqi6JBJAmFOu9viQi14n04Dh2h5bAIhALsPuLmUNvUUHX7OKQJZymEKs6nHRePOGev0prPqZoPp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12854},"type":"module","gitHead":"43fb9958eaa1a27a783a4b492f30875b0401bc58","_npmUser":{"name":"audsiui","email":"audsiui@outlook.com"},"_npmVersion":"12.0.1","description":"Web search and page fetch tools for pi, powered by the Keenable API","directories":{},"_nodeVersion":"24.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-keenable_0.1.0_1787731737302_0.822878061615917","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@audsiui/pi-keenable","version":"0.1.1","description":"Web search and page fetch tools for pi, powered by the Keenable API","keywords":["pi-package","keenable","search","web-search"],"publishConfig":{"access":"public"},"license":"MIT","type":"module","peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*","typebox":"*"},"pi":{"extensions":["./extensions"],"skills":["./skills"]},"gitHead":"5e3769d56df80161e1b5b109b469aa50e40741ec","_id":"@audsiui/pi-keenable@0.1.1","_nodeVersion":"24.17.0","_npmVersion":"12.0.1","dist":{"integrity":"sha512-SEe9M4+AGZqbK89fY3bHdQVC4eTg5iS6jevF4rd/uCZNg8judQ0u84+8fVjkVIxhgW7kddU1QuMjpq6Z2SKGAg==","shasum":"19b473e050012297f66bc133a713b4014cd2997f","tarball":"https://registry.npmjs.org/@audsiui/pi-keenable/-/pi-keenable-0.1.1.tgz","fileCount":5,"unpackedSize":25436,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDFCuIw/KZ5xwAmFUvY5WqeypR1nzS911VMqK437waokgIgHsJhWCcATQl3OgvhNVccNyuaC53Q6itmZLuMV05deF4="}]},"_npmUser":{"name":"audsiui","email":"audsiui@outlook.com"},"directories":{},"maintainers":[{"name":"audsiui","email":"audsiui@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-keenable_0.1.1_1787733069192_0.6029202913726368"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-26T08:08:56.926Z","modified":"2026-08-26T08:31:09.503Z","0.1.0":"2026-08-26T08:08:57.428Z","0.1.1":"2026-08-26T08:31:09.336Z"},"license":"MIT","keywords":["pi-package","keenable","search","web-search"],"description":"Web search and page fetch tools for pi, powered by the Keenable API","maintainers":[{"name":"audsiui","email":"audsiui@outlook.com"}],"readme":"# pi-keenable\n\nWeb search and page fetch tools for [pi](https://pi.dev), powered by the [Keenable API](https://docs.keenable.ai/api-reference).\n\nRegisters two tools the model can call, plus a skill documenting the search workflow:\n\n- `keenable_search` — search the web, returns ranked results with title, URL, description, snippet and dates\n- `keenable_fetch` — fetch a page as markdown (title, description, author, content; refuses private/internal hosts)\n- `keenable-web-search` skill — workflow guidance loaded into the model context\n\nBoth tools appear in the system prompt's `Available tools` section, with usage guidelines injected into `Guidelines` while active.\n\n## Install\n\n```bash\npi install npm:@audsiui/pi-keenable\n```\n\nOr project-local: `pi install -l npm:@audsiui/pi-keenable`\n\n## API key\n\nKeenable offers keyless public endpoints (rate limited per IP, consume no credits) and keyed endpoints (no IP rate limit, require an API key from [keenable.ai](https://keenable.ai)).\n\nLogin stores the key in `~/.pi/agent/keenable.json`:\n\n```\n/keenable login          # prompts for the key\n/keenable login keen_xxx # or pass it inline\n/keenable logout         # removes the stored key\n```\n\nAuth resolution order: stored key → `KEENABLE_API_KEY` environment variable → keyless public endpoints.\n\nBase URL (for proxies/gateways):\n\n```\n/keenable base-url           # show the effective base URL\n/keenable base-url https://proxy.example.com   # store one (https enforced)\n/keenable base-url clear     # remove the stored override\n```\n\nBase URL resolution order: `KEENABLE_API_URL` environment variable wins, then the stored value, then `https://api.keenable.ai` (plain http only for localhost).\n\n\n## Usage\n\nThe model decides when to use the tools (e.g. \"搜索一下最近 Rust 的稳定版本\" or \"用 keenable_fetch 读一下 https://example.com 的内容\"). Recommended workflow: search → `keenable_fetch` promising results → cite the opened page, never a snippet alone.\n\nTool features:\n\n- `keenable_search`: `query` (natural-language description), `mode` (pro), `site` (one domain), `max_results` (1–50), `snippet_max_length` (180–10000), `query_time`, `published_after`/`published_before` and `acquired_after`/`acquired_before` (YYYY-MM-DD, ISO timestamp, or relative deltas like `7d`, `6mo`, `1y`)\n- `keenable_fetch`: `url`, `max_chars` (default 50000), `live` (fetch from source instead of Keenable's index), `prompt` (LLM extraction instruction, up to 2000 chars — content contains only the answer)\n\n## Development\n\n```bash\n# try it without installing\npi -e ./extensions/keenable.ts\n\n# install from local path\npi install /path/to/pi-keenable\n```\n\n## License\n\nMIT","readmeFilename":"README.md"}