Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pi-web-lite

Lightweight web access package for Pi. It registers only two tools:

  • web_search — search with Exa, Tavily, Brave Search, and Doubao Search
  • fetch — fetch URL content directly

No curator UI, no browser cookie access, no Gemini/Perplexity, no video analysis, no background servers, no storage cache, and no package runtime dependencies.

Architecture

flowchart LR
    Agent[Pi agent] --> Search[web_search]
    Agent --> Fetch[fetch]
    Config[web-search.json] --> Router[Provider/key routing]
    Search --> Router
    Router --> Exa[Exa]
    Router --> Tavily[Tavily]
    Router --> Brave[Brave]
    Router --> Doubao[Doubao]
    Exa --> Normalize[Normalize and format results]
    Tavily --> Normalize
    Brave --> Normalize
    Doubao --> Normalize
    Normalize --> Agent
    Fetch --> GitHub[GitHub API for GitHub URLs]
    Fetch --> HTTP[Direct HTTP fetch]
    GitHub --> Agent
    HTTP --> Agent
Loading

balanced mode shuffles every provider/key pair in one pool. auto preserves provider priority while rotating keys inside each provider. Failed targets fall through to the next target in the generated plan.

Configuration

pi-web-lite reads only the new format at ~/.pi/web-search.json:

{
  "provider": "balanced",
  "providers": ["exa", "tavily", "brave", "doubao"],
  "apiKeys": {
    "exa": ["exa-key-1"],
    "tavily": ["tavily-key-1", "tavily-key-2"],
    "brave": ["brave-key-1", "brave-key-2"],
    "doubao": ["doubao-key-1"]
  },
  "search": {
    "numResults": 5,
    "timeoutMs": 20000
  },
  "fetch": {
    "timeoutMs": 20000,
    "maxChars": 30000
  }
}

Legacy fields are intentionally rejected:

  • exaApiKey, exaApiKeys
  • tavilyApiKey, tavilyApiKeys
  • braveApiKey, braveApiKeys
  • doubaoApiKey, doubaoApiKeys
  • loadBalancing, workflow, geminiApiKey, perplexityApiKey

Provider modes

balanced

Flattens every provider+key pair into one pool and shuffles it per search.

Example:

{
  "provider": "balanced",
  "providers": ["exa", "tavily", "brave", "doubao"],
  "apiKeys": {
    "exa": ["exa1"],
    "tavily": ["tvly1", "tvly2"],
    "brave": ["brave1", "brave2"],
    "doubao": ["doubao1"]
  }
}

Targets:

exa:exa1
tavily:tvly1
tavily:tvly2
brave:brave1
brave:brave2
doubao:doubao1

Each target has equal probability.

auto

Uses providers as the priority order. Keys within the same provider are shuffled.

{
  "provider": "auto",
  "providers": ["tavily", "exa", "brave", "doubao"]
}

This tries all Tavily keys first, then Exa keys, then Brave keys.

Direct provider

{ "provider": "brave" }

Only Brave keys are used. No fallback to other providers.

Tools

web_search

{
  "query": "React 19 compiler pitfalls"
}

or:

{
  "queries": [
    "React 19 compiler performance",
    "React 19 compiler migration pitfalls"
  ]
}

Provider, key, and result count are chosen by config only. The result includes a hashed keyId such as tavily#12ab34cd so you can verify balancing without leaking API keys.

fetch

{
  "url": "https://github.com/GATE"
}

or:

{
  "urls": ["https://example.com", "https://github.com/owner/repo"]
}

fetch is plain fetch: no prompt, no AI analysis.

GitHub URLs use the GitHub API for stable extraction:

  • https://github.com/org — organization/user repositories
  • https://github.com/org/repo — repo metadata + README
  • https://github.com/org/repo/blob/ref/path — raw file content

Install

Install from npm:

pi install npm:pi-web-lite

Git and local development alternatives:

pi install git:github.com/smithyyang/pi-web-lite
pi -e ./src/index.ts

Disable/remove the old pi-web-access package first if both register web_search.

License

MIT — see LICENSE.

About

Lightweight Pi web_search and fetch extension with Exa, Tavily, Brave, Doubao, routing, failover, and tests.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages