omp packages

@fitchmultz/pi-verbosity-control0.6.6

Per-model OpenAI verbosity control for Pi with optional native footer status

GitHub Actions Published 3 hours ago MIT ~602 downloads/mo

Untested on omp

This is a pi package. No one has reported whether it works on omp yet. If you try it, add your result below.

Did it work for you?

Result

One report per person. A new report replaces your old one.

Reports 0

No reports yet.

Readme

pi-verbosity-control

Apply per-model OpenAI text.verbosity overrides and cycle the current model's setting from the keyboard.

Install

Requires Node.js and a supported Pi release. See the compatibility requirements. Install this maintained fork from its owned npm scope:

pi install npm:@fitchmultz/pi-verbosity-control

The unscoped npm package pi-verbosity-control is NOT this project. It belongs to the original ferologics project. This maintained fork retains its attribution and version history, and publishes only @fitchmultz/pi-verbosity-control.

Git remains supported, including existing tags and commits:

pi install git:github.com/fitchmultz/pi-verbosity-control

When switching an existing Git installation to npm, replace its package source instead of loading both copies; keep any resource filters. Both sources use the same active agent directory and verbosity.json; no configuration migration is needed.

On current Pi, /reload refreshes extension code. Start a fresh Pi process after changing dependencies.

What it does

  • Reads verbosity.json from Pi's active agent directory: ~/.pi/agent by default, or PI_CODING_AGENT_DIR when set.
  • Supports overrides by bare model id (gpt-5.4) or exact provider/model (openai-codex/gpt-5.4). Exact entries win.
  • Applies text.verbosity immediately before supported requests are sent, preserving other payload and text fields.
  • Cycles the current model's verbosity and saves it back to the same file.
  • Optionally publishes 🗣 <level> through Pi's native verbosity status key.

Supported APIs: openai-responses, openai-codex-responses, and azure-openai-responses. OpenAI and Azure GPT-4 and o1/o3/o4 models accept only medium; the extension leaves them unchanged and warns when cycling. Other APIs, including Anthropic, are left unchanged. Effort/thinking controls are separate from verbosity.

Shortcuts

Action macOS Other platforms
Cycle verbosity Alt+V Ctrl+Alt+V
Toggle indicator Alt+Shift+V Ctrl+Alt+Shift+V

The cycle is low → medium → high → low. An unconfigured supported model starts at low. Codex already sends low by default, so its first press selects medium.

Shortcut saves use a cross-process file lock and re-read the configuration before changing it, preserving concurrent changes from other updated Pi sessions. They replace the file only after a complete write, so failed writes leave the previous config intact. If the file cannot be read or parsed, the shortcut reports an error and leaves it unchanged. Manual editors do not participate in this lock.

Config

Example verbosity.json:

{
    "showIndicator": false,
    "models": {
        "gpt-5.4": "low",
        "openai/gpt-5.4": "medium"
    }
}

showIndicator defaults to false. Hiding the indicator does not disable request overrides. The indicator is absent when the selected model is unsupported or has no configured override.

The controller owns both the request setting and its displayed status. It watches the agent directory for edits and atomic file replacements, and refreshes at startup, model changes, requests, and shortcuts. Unreadable files or syntactically invalid JSON retain the last good settings until corrected; a missing file restores defaults. If directory watching is unavailable, native event boundaries still refresh the configuration; /reload also retries the watcher.

The stock footer displays the native status in its extension-status row. Custom footers can read footerData.getExtensionStatuses().get("verbosity"); they should not read the config themselves. The extension does not replace or patch any footer. Shutdown and reload clear its status and close its watcher.

Pi lifecycle

Both supported hosts use the public request/model/session lifecycle. Removed fork checkpoint APIs are not registered; settings remain in verbosity.json, with native shutdown cleanup and reload restoration.

Tests

Acceptance runs every gate independently through scripts/run-gates.ts, so one failure cannot hide another:

npm ci --ignore-scripts
npm run check:compat

check:compat runs policy conformance (policy:check), the format check (format:check), type-aware lint (lint, Oxlint through oxlint-tsgolint), the compiler (typecheck), and the test suite. npm run check adds the package (pack:check) gate for local pre-push runs. The suite covers config normalization, a nondefault agent directory, model precedence and API eligibility, shortcuts, shared request/status updates, watcher cleanup, and native extension loading, stock-footer rendering, model selection, and reload. No removed fork-only APIs are required.

The repository follows the Strict Oxlint and Oxfmt Engineering Standard v5.1.2; the adoption record and recorded exceptions live in docs/quality/, and the qualification harness (npm run quality:probes) exercises the lint configuration's protections and exception boundaries through the committed diagnostic fixtures in tests/probes/.

npm ci uses the locked development snapshot; release qualification instead resolves the latest stable official Pi and maintained fork main once per run, freezes their version/SHA, and installs each complete SDK cohort before running the same command.

Tests use temporary config directories and synthetic request payloads; they do not contact OpenAI or dispatch terminal keystrokes. To isolate the command environment as well (Bash):

fixture=$(mktemp -d /tmp/verbosity-ci.XXXXXX)
trap 'rm -rf "$fixture"' EXIT
mkdir -p "$fixture/home" "$fixture/agent" "$fixture/tmp"
env -i PATH="$PATH" HOME="$fixture/home" USERPROFILE="$fixture/home" \
    TMPDIR="$fixture/tmp" PI_CODING_AGENT_DIR="$fixture/agent" \
    PI_OFFLINE=1 PI_TELEMETRY=0 PI_COMPAT_HOST=official \
    npm run check:compat

Releases

When NPM_RELEASE_ENABLED is true, each main merge enters the automatic version queue. Its version PR must pass current-head compatibility and reviews before the main-only pipeline publishes matching npm and GitHub releases. The plan freezes the latest official version and fork SHA and requires both-host compatibility and package/install checks. The upstream unscoped package is never a publication target.