Files
Frank 02883d3ed2 docs: rebuild KB in OKF v0.1 with live-verified facts
Copy of the legacy ~/.pi/agent/docs tree rebuilt as the command-center
knowledge base: concept files promoted to path identity, index listings
stripped of frontmatter, all wikilinks/relative links resolved, every
checkable claim verified against the live fleet (Dankserver = Ryzen 7
7700X + RTX 3090; Strix Halo is Dankclaw), unverifiable claims tagged.
kb-lint exits 0.
2026-08-28 07:57:13 -07:00

142 lines
4.5 KiB
Markdown

---
type: reference
title: Pi Web Access
description: Web search, URL fetching, GitHub cloning, PDF extraction, and video understanding for Pi. Zero-config with Exa MCP.
tags:
- pi
- package
- web-search
- fetch
- youtube
- unverified
timestamp: 2026-08-28
---
# Pi Web Access
**Package:** `pi-web-access`
**Version:** 0.22.0
**Author:** Nico Bailon
Web search, content extraction, and video understanding for Pi. It calls your self-hosted SearXNG first when one is configured, and falls through to other providers.
> **Active setup:** `~/.pi/web-search.json` locks search to SearXNG at `http://192.168.0.143:8081` (dankclaw), permits LAN fetches via `ssrf.allowRanges`, and sets `maxInlineContentChars` to 50000. The config file is cached in memory per process — a changed file takes effect on the next Pi session.
---
## Install
```bash
pi install npm:pi-web-access
```
## Search Providers
Provider chain (in priority order, v0.22):
1. **SearXNG** (if configured) — Self-hosted, private search
2. **OpenAI** — Codex subscription or API key
3. **Exa** — Zero-config via MCP, or API key
4. **Brave** — API key
5. **Parallel** — API key
6. **TinyFish** — API key
7. **Search1API** — API key
8. **Searchinfinity** — API key
9. **Querit** — API key
10. **Tavily** — API key
11. **Jina** — API key
12. **SERPdive** — API key
13. **Kagi** — API key
14. **Bocha** — API key
15. **Ollama** — API key
16. **Perplexity** — API key
17. **Gemini API** — API key
18. **Gemini Web** — Browser-cookie access
A single-provider field (`provider` or `searchProvider`) pins the default and takes precedence over `searchRouting`. `searchRouting.providers` plus `fallbackOn` define an explicit ordered fallback over typed failures (`transient`, `quota`, `network`, `invalid-response`).
## Configuration
**Location:** `~/.pi/web-search.json`
```json
{
"searxngBaseUrl": "http://192.168.0.143:8081",
"searchProvider": "searxng",
"maxInlineContentChars": 50000,
"workflow": "none",
"ssrf": {
"allowRanges": ["192.168.0.0/24"]
},
"openaiApiKey": "sk-...",
"braveApiKey": "BSA_...",
"exaApiKey": "exa-...",
"perplexityApiKey": "pplx-...",
"geminiApiKey": "AIza..."
}
```
Key fields:
- `searxngBaseUrl` — the SearXNG instance to call. Env `SEARXNG_BASE_URL` wins over this file. The client calls `GET {base}/search?q=...&format=json` with a 30 s timeout; the base URL and its redirects stay subject to the SSRF guard.
- `searchProvider` — `searxng` locks the primary provider. `auto` picks the first available. A single-provider field wins over `searchRouting`.
- `maxInlineContentChars` — size of each `fetch_content` / `get_search_content` content slice. Default 30000, cap 200000. Full fetched content stays stored for later retrieval.
- `ssrf.allowRanges` — LAN CIDR ranges allowed through `fetch_content`. This blocks private IPs by default.
- `workflow` — `none` (raw results, no browser), `summary-review` (curator window with summary draft), or `auto-summary`.
## Capabilities
### Web Search
```typescript
web_search({ query: "TypeScript best practices 2025" })
```
### URL Fetching
```typescript
fetch_content({ url: "https://docs.example.com/guide" })
```
### GitHub Cloning
GitHub URLs are cloned locally. The agent gets real file contents, not rendered HTML.
```typescript
fetch_content({ url: "https://github.com/owner/repo" })
```
### Video Understanding
Point at a YouTube video or local screen recording and ask questions about visual content.
```typescript
// YouTube
fetch_content({ url: "https://youtube.com/watch?v=...", prompt: "What book is shown?" })
// Local video
fetch_content({ url: "/path/to/recording.mp4" })
```
### PDF Extraction
```typescript
fetch_content({ url: "https://example.com/paper.pdf" })
```
## Optional Dependencies
```bash
# Video frame extraction
sudo pacman -S ffmpeg yt-dlp
```
Without these, video analysis (transcripts, visual descriptions via Gemini) still works. Frame extraction requires ffmpeg and yt-dlp. Both are installed on dankware (verified 2026-08-28: ffmpeg n9.0.1, yt-dlp 2026.08.19).
GitHub URLs get special handling: `fetch_content` clones the repo locally instead of scraping HTML (root URL returns tree + README, `/blob/` returns file contents). Repos over 350 MB get an API-based view; `forceClone: true` overrides. Clones cache per session under `/tmp/pi-github-repos` and wipe on session change. Private repos need the `gh` CLI. Disable with `githubClone.enabled: false`.
## See Also
- [Pi Packages](index.md) — Package overview
- [Pi Configuration](../index.md) — Pi configuration