@ivancavero/pi-verboo-provider

Verboo Code model provider for pi - OpenAI-compatible registration with a capability-rich live catalog and per-model thinking-level mapping

Packages

Package details

extension

Install @ivancavero/pi-verboo-provider from npm and Pi will load the resources declared by the package manifest.

$ pi install npm:@ivancavero/pi-verboo-provider
Package
@ivancavero/pi-verboo-provider
Version
0.1.1
Published
Sep 26, 2026
Downloads
348/mo · 19/wk
Author
ivancavero
License
MIT
Types
extension
Size
124.4 KB
Dependencies
0 dependencies · 2 peers
Pi manifest JSON
{
  "extensions": [
    "./src/index.ts"
  ]
}

Security note

Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.

README

pi-verboo-provider

English · Español

Verboo Code as a first-class pi provider — a live, capability-rich model catalog with per-model thinking levels and a documented error taxonomy, instead of a hand-maintained list of model IDs.

Pi ships a declarative Verboo integration (~/.pi/agent/models.json): you hardcode IDs and nothing validates them against your key, exposes reasoning-effort capability, or explains Verboo's structured errors. This package registers verboo programmatically and fills those gaps.

Install

  1. Official command (npm):

    pi install npm:@ivancavero/pi-verboo-provider
  2. No-npm alternative (installs straight from the git source):

    pi install git:github.com/ivan-cavero/pi-verboo-provider
  3. Project-local install (writes .pi/settings.json in the current project) — add -l:

    pi install -l npm:@ivancavero/pi-verboo-provider
  4. One-liners that install Pi when missing and then the package:

    macOS/Linux:

    curl -fsSL https://raw.githubusercontent.com/ivan-cavero/pi-verboo-provider/main/install.sh | sh

    Windows PowerShell:

    irm https://raw.githubusercontent.com/ivan-cavero/pi-verboo-provider/main/install.ps1 | iex
  5. The installers prefer the published npm package and fall back to the git source when npm is unavailable. Set VERBOO_PI_SOURCE to override the source the installer uses.

Installing the package is not enough to see models — authenticate first (next section).

Authenticate

The package alone is not enough: the provider must be authenticated before any model appears. With the package installed and no credentials, pi --list-models verboo prints:

No models available. Use /login to log into a provider via OAuth or API key.

Recommended: /login verboo (persistent)

  1. Start pi.
  2. Type /login verboo.
  3. Paste your Verboo API key when prompted.
  4. The key is stored for later sessions, and the models become available.

Alternative: VERBOO_API_KEY

Export the key in the environment where pi runs:

export VERBOO_API_KEY=...

Precedence

Source Precedence
VERBOO_API_KEY Used when no credential is stored
/login verboo Stored credential wins over the env var

An empty env var does not count as configured. The provider is unconfigured until one of the two sources yields a non-empty key.

How it is used

Install → authenticate → list the models → select one with /model.

# 1. Install (see above).
# 2. Authenticate: run /login verboo inside pi, or export VERBOO_API_KEY=...
pi --list-models verboo     # lists the models available to your key

Without authentication, the same command prints No models available. Use /login to log into a provider via OAuth or API key. Then run /model inside pi to pick one of the listed models.

What you get

Capability This package Verboo's declarative models.json pi-nan-provider
Model discovery Live /models capabilities × committed fallback IDs you type by hand Live IDs × models.dev
Per-model thinking levels Derived from each model's effort_levels You configure them manually Fixed per catalog
Context window / vision Read from Verboo itself You guess/type From models.dev
Error handling Documented status/code → cause + fix Raw provider text Opaque-400 overflow heuristic
Auth VERBOO_API_KEY + /login verboo (stored key wins) Env interpolation only Stored/env key

Deliberately out of scope: MCP bridges, a usage/quota command, and a payload sanitizer (the probe proved Verboo accepts every payload shape that broke Nan — see Provenance).

Models

The table below is the bundled baseline / example — the catalog committed in the package so pi can start without network. The live list is authoritative: the provider fetches it from GET /models, which "returns only models available to the authenticated key", so what you see depends on your account, plan and role. Your list may contain more, fewer, or different models than this baseline.

Thinking levels are the pi levels actually offered, derived from Verboo's declared efforts. maxTokens is 65536 for every model — see the caveat below.

Model id Context window Vision Supported pi thinking levels
deepseek-v4-flash 1,048,576 no high, max
deepseek-v4-flash-0731 1,048,576 no low, medium, high, xhigh, max
deepseek-v4.1-flash 1,048,576 yes low, high, xhigh, max
glm-5.3-flash 1,048,576 yes low, high, max
mimo-v2.5 1,048,576 yes off only
qwen3.8-27b 262,144 yes off, low, medium, xhigh

Notes recorded in the generated catalog: Verboo reports vision: true for deepseek-v4.1-flash (the pi/OpenCode config used to mark it text-only), and mimo-v2.5 declares no reasoning capability yet emits reasoning_content in responses.

maxTokens caveat

Verboo publishes no output-token cap. 65536 is a conservative envelope, not a published limit: the probe measured 262144 accepted on the 1M-context models and rejected upstream (502) on qwen3.8-27b, where 131072 was accepted. Override it per model when you need the headroom:

{
  "providers": {
    "verboo": {
      "modelOverrides": {
        "deepseek-v4-flash": { "maxTokens": 262144 }
      }
    }
  }
}

modelOverrides changes metadata for the extension-provided models without replacing the catalog. The same mechanism can pin contextWindow, thinkingLevelMap, input, or compat.

Model refresh

There is no periodic timer. The catalog refreshes only at these moments:

When Network refresh? Notes
pi interactive/RPC startup Yes, in background Baseline + cached catalog are shown first; the live refresh runs after, with a 15s timeout. Skipped with --offline / PI_OFFLINE=1.
Opening /model Yes, in background The current snapshot renders immediately; the refresh runs behind it.
After /login verboo succeeds Yes, that provider only
pi update --models Yes, forced The only explicit command to force a refresh.
Extension registration / credential change No (cache-only) No network call.
pi --list-models No Prints only the current snapshot (committed baseline + cache). It does not refresh.
  • Cache: ~/.pi/agent/models-store.json holds one entry per provider with the models plus a checkedAt timestamp. It is written only after a successful live fetch.
  • Fallback order: cached catalog → committed baseline. If the fetch fails or the network is disallowed, the cached catalog (then the baseline) is used; the previous catalog is not discarded.
  • No TTL/ETag for this provider: fetchModels has no freshness gate, so every network-triggering refresh performs a live GET /models. pi's built-in catalog instead uses a 4h window.
  • Auth is required for the live list: fetchModels is skipped entirely when no credential resolves (see Authenticate).
  • Consequence: a model added or changed on Verboo's side appears after the next refresh (startup, opening /model, or pi update --models) — never instantly. To pick up a new Verboo model now, run pi update --models or reopen /model.

Thinking levels

Each model's thinkingLevelMap comes from that model's Verboo effort_levels: none maps to pi off, same-named efforts pass through, and every unsupported pi level is an explicit null so pi does not offer it. The distinction matters because pi-ai treats an omitted level as supported.

Reasoning cannot be disabled on most models. Only qwen3.8-27b declares none, so it is the only model whose off is real. Elsewhere off is unsupported and pi clamps the request up to the nearest supported level (usually Verboo's own default_effort).

Error taxonomy

Verboo errors are documented and structured. The provider turns them into an actionable message — and a context overflow into pi's recognized overflow wording, so pi compacts and retries.

Verboo signal Classification What to do
413, or a 400 on an over-window request context overflow pi compacts and retries automatically
428 / terms_acceptance_required terms accept at the returned acceptUrl (version shown)
401 access check VERBOO_API_KEY is valid; a stale stored credential can also cause a 401, so re-run /login verboo
403 access check your plan includes the feature; list models with GET /models
402 balance add credit; the fix is balance, not the catalog
404 model refresh the catalog and pick a listed id
429 rate limit wait for the server's rate-limit window, then retry
500 / 502 / 503 transient retry shortly

A 400 that is not over the model window is left untouched — unrelated validation errors are never relabelled as overflow.

Development

bun install
bun run typecheck        # tsc --noEmit
bun test                 # no network; fetch is guarded in tests
bun run probe-verboo     # live compat/cap probes -> scripts/probe-report.json
bun run generate-catalog # rebuild src/catalog.generated.ts from /models

probe-verboo and generate-catalog need VERBOO_API_KEY; they fail loudly without it and never write the key anywhere. generate-catalog is byte-for-byte idempotent and refuses to guess capability data.

Maintainer: publishing

Published as @ivancavero/pi-verboo-provider@0.1.0 on npm (public) and listed in the Pi gallery at https://pi.dev/packages/@ivancavero/pi-verboo-provider. To publish a future version:

  1. Bump version in package.json.
  2. Log in to npm: npm login (you must own the @ivancavero scope).
  3. Publish publicly: npm publish --access public

The prepublishOnly script runs bun test and bun run typecheck, so a failing check blocks the publish.

Discovery: the pi-package keyword (already in package.json) makes the package eligible for the Pi package gallery at https://pi.dev/packages. There is no separate submission step. The optional pi.image and pi.video fields add gallery previews.

Provenance

Compat flags are measured, not assumed: scripts/probe-report.json records the live probes (stream usage with and without stream_options, reasoning_effort: "max", empty tools, unknown fields, replayed reasoning_content, and per-model output-cap attempts). The headers in src/catalog.generated.ts carry the fetch time and per-model notes. Pricing is zero because Verboo publishes none — unknown values are recorded, never invented.