{"_id":"@2tle/pi-provider-manager","_rev":"3-0b097623d8259b072c930b0769535236","name":"@2tle/pi-provider-manager","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@2tle/pi-provider-manager","version":"0.1.0","keywords":["pi-package"],"license":"Apache-2.0","_id":"@2tle/pi-provider-manager@0.1.0","maintainers":[{"name":"2tle","email":"iam@2tle.io"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"d70c9ebd9eb1695dec3eb1009e5bbc8e3db185b4","tarball":"https://registry.npmjs.org/@2tle/pi-provider-manager/-/pi-provider-manager-0.1.0.tgz","fileCount":4,"integrity":"sha512-6GcqgHtVTcAEfU13pPtVxYdLRPCdPMfF2Bbk363EsoBTs9NdJT1zMVXB7/bEoASKm1zYLVhu5Gy9u/k/JBV1jA==","signatures":[{"sig":"MEUCIQC3OYGcCn6M+IkYrY9qNS0txyKUih4WoFvpVzdStHPypQIgGAyLFsQiqjJY0riZfpgS4uSxyNy7hoSsFy50l0WJ9nI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39103},"type":"module","gitHead":"3f941254f80e4842f036900c16f42d80efc163a1","_npmUser":{"name":"2tle","email":"iam@2tle.io"},"_npmVersion":"11.17.0","description":"Manage OpenAI-compatible providers and model catalogs in Pi Agent","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.1.0_1789229273800_0.3715597403599711","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@2tle/pi-provider-manager","version":"0.1.1","keywords":["pi-package"],"license":"Apache-2.0","_id":"@2tle/pi-provider-manager@0.1.1","maintainers":[{"name":"2tle","email":"iam@2tle.io"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"030a29e5620405815d4ea25f4c0305ed5fd1fc83","tarball":"https://registry.npmjs.org/@2tle/pi-provider-manager/-/pi-provider-manager-0.1.1.tgz","fileCount":4,"integrity":"sha512-OZnfeKnUKbLTMaGRnwQaRxS/FVd7VWAatTVJtm6AZR04rBSwVqiv8F8dWpQohFMRirqV13djRZ4zM8/WPOiCZg==","signatures":[{"sig":"MEYCIQDxMGI0vgpoV+5Q8TwxDqp1rXROPXxehkoMgJZ9aAXJJwIhAPkPDW4ux+8+ouIEhs2hCfLa5Iv0+umtIjtElSChU8/b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41906},"type":"module","gitHead":"19c9ce924b4e0db69e4d9477b3843ce550a8a4ef","_npmUser":{"name":"2tle","email":"iam@2tle.io"},"_npmVersion":"11.17.0","description":"Manage OpenAI-compatible providers and model catalogs in Pi Agent","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-provider-manager_0.1.1_1789230749282_0.3408997591280156","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@2tle/pi-provider-manager","version":"0.1.2","description":"Manage OpenAI-compatible providers and model catalogs in Pi Agent","license":"Apache-2.0","type":"module","keywords":["pi-package"],"pi":{"extensions":["./index.ts"]},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*","@earendil-works/pi-tui":"*"},"gitHead":"508c71f268617d31c8b7482bee8f4d0f0bb756e5","_id":"@2tle/pi-provider-manager@0.1.2","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-DEXN0az2ysHrl2/f7G5SkNteMGejThIbxzB9Me6gffgBYpwxTUCefL0pd4o/2iTkZQe3FlvL0rP24mHG9DW5/Q==","shasum":"bc98f1636512f5b2d180990173c6060371cbc05d","tarball":"https://registry.npmjs.org/@2tle/pi-provider-manager/-/pi-provider-manager-0.1.2.tgz","fileCount":10,"unpackedSize":67691,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDAREYFvw3duS/UU4X8XWN23s7KURNMpHPFrSPJHzm08wIhAKf7nBeu4IU08PKkebduK2Z3YT4fEtTD+C+kpA30Iqb0"}]},"_npmUser":{"name":"2tle","email":"iam@2tle.io"},"directories":{},"maintainers":[{"name":"2tle","email":"iam@2tle.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-provider-manager_0.1.2_1789356366054_0.6958382500101534"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-12T16:07:53.365Z","modified":"2026-09-14T03:26:06.357Z","0.1.0":"2026-09-12T16:07:54.100Z","0.1.1":"2026-09-12T16:32:29.417Z","0.1.2":"2026-09-14T03:26:06.171Z"},"license":"Apache-2.0","keywords":["pi-package"],"description":"Manage OpenAI-compatible providers and model catalogs in Pi Agent","maintainers":[{"name":"2tle","email":"iam@2tle.io"}],"readme":"# Pi Provider Manager\n\n[![npm version](https://img.shields.io/npm/v/%402tle%2Fpi-provider-manager)](https://www.npmjs.com/package/@2tle/pi-provider-manager)\n\nAn extension for registering and managing OpenAI-compatible API providers in Pi Agent.\n\nWhen working with local LLM servers, private gateways, proxies, or hosted APIs, managing each provider through `models.json` and restarting Pi can be cumbersome. This extension keeps managed providers and their model catalogs in one place.\n\n## Installation\n\nInstall the package from [npm](https://www.npmjs.com/package/@2tle/pi-provider-manager) and register it with Pi:\n\n```bash\npi install npm:@2tle/pi-provider-manager\n```\n\nTo try it without adding it to your settings:\n\n```bash\npi -e npm:@2tle/pi-provider-manager\n```\n\n## Features\n\n- Add OpenAI-compatible providers from the Pi TUI\n- List managed providers without exposing API keys\n- Edit a provider's display name, Base URL, or API key\n- Override missing or incorrect model context/output limits per provider\n- Refresh one provider's model catalog or every managed catalog\n- Delete a managed provider and its stored API key\n- Keep provider metadata and credentials in separate files\n\n## Commands\n\n### Add a provider\n\n```text\n/provider add\n```\n\nThe interactive flow requests:\n\n1. Provider ID — lowercase letters, numbers, `.`, `_`, and `-` only\n2. Provider display name\n3. OpenAI-compatible Base URL — for example, `http://localhost:1234/v1`\n4. API key — local servers can use a placeholder such as `local`\n\nAfter the provider is added, its `/models` endpoint is queried immediately.\n\n### List managed providers\n\n```text\n/provider list\n```\n\nDisplays each provider's ID, display name, Base URL, API key status, and the number of currently loaded models. API key values are never displayed.\n\n### Edit a provider\n\n```text\n/provider edit [provider_name]\n```\n\nWith no provider name, an interactive provider picker is shown. The provider editor now includes display name, Base URL, API key, per-model limits, and a guarded action to reset all model overrides.\n\nUse a provider ID (recommended) or a unique display name. Select the fields to change, then choose **Save changes**. The extension refreshes the provider's model catalog after saving.\n\nIn TUI mode, API key input is masked with `*` characters. In RPC mode, the connected client is responsible for secret masking.\n\n### Override a model's limits\n\n```text\n/provider model [provider_name] [model_id]\n```\n\nBoth arguments are optional. You can select the provider and model interactively, or pass them directly. The model picker displays the effective context/output limits and marks models with saved overrides. Existing override-only model IDs remain selectable even when a refresh no longer returns them.\n\nChoose a model discovered from the provider's catalog (or enter its exact model ID), then set its **context window** and/or **maximum output tokens**. Values accept readable suffixes such as `128k`, `1m`, and `2b`, as well as raw token counts. These values override the API catalog metadata after every refresh. You can clear either field independently, or choose **Remove all overrides for this model** followed by **Save changes** to return to the API-provided value or extension fallback.\n\nThis is useful for compatible gateways that omit model metadata. For example, to correct the OpenCodex Go DeepSeek V4.1 catalog row:\n\n```text\n/provider model opencodex\n# select: opencode-go/deepseek-v4.1-flash\n# set its context window to the gateway's documented value\n# Save changes\n```\n\nOverrides are persisted in the provider configuration, keyed by the exact model ID:\n\n```json\n{\n  \"providers\": [{\n    \"id\": \"opencodex\",\n    \"name\": \"opencodex\",\n    \"baseUrl\": \"http://127.0.0.1:10100/v1\",\n    \"modelOverrides\": {\n      \"opencode-go/deepseek-v4.1-flash\": {\n        \"contextWindow\": 1048576,\n        \"maxTokens\": 16384\n      }\n    }\n  }]\n}\n```\n\n### Refresh model catalogs\n\n```text\n/provider reload <provider_name>\n/provider reload --all\n```\n\nThe extension sends a request to `<baseUrl>/models` and accepts the OpenAI-style response shape:\n\n```json\n{\n  \"data\": [{ \"id\": \"model-name\" }]\n}\n```\n\nThis is different from Pi's `/reload`, which reloads extension code and resources.\n\n### Delete a provider\n\n```text\n/provider delete <provider_name>\n```\n\nAfter confirmation, the extension removes the managed provider and its stored API key. Built-in providers and providers owned by other extensions cannot be deleted.\n\n## Supported APIs\n\nThe extension targets OpenAI Chat Completions-compatible services that provide a model-listing endpoint and support Pi's OpenAI-compatible transport, including:\n\n- OpenAI-compatible gateways and proxies\n- vLLM\n- LM Studio\n- llama.cpp server\n- Ollama's OpenAI-compatible endpoint\n- Private or internal LLM gateways\n\nProvider implementations differ in support for developer roles, reasoning options, token fields, and streaming usage. This extension currently uses Pi's standard `openai-completions` transport.\n\n### Thinking / reasoning\n\nDuring each catalog refresh, the extension recognizes OpenAI-compatible reasoning metadata from either top-level fields or `capabilities`:\n\n- `supports_reasoning`, `supports_reasoning_effort`, or `capabilities.supports_reasoning`\n- `reasoning_efforts` or `capabilities.reasoning_effort` (an array of strings or `{ \"value\": \"...\" }` objects)\n\nReasoning-capable models are registered with Pi's `reasoning_effort` compatibility enabled. Supported effort values are exposed as Pi thinking levels; unavailable levels are hidden. An upstream `ultra` effort is mapped to Pi's highest available level, `max`.\n\nFor example, after `/provider reload opencodex`, select a discovered reasoning model with a thinking suffix:\n\n```text\n/provider reload opencodex\n# Then select: opencodex/gpt-5.6-sol:max\n```\n\nAn endpoint must actually accept the OpenAI Chat Completions `reasoning_effort` request field. Providers that use a different thinking protocol (for example, Qwen's `enable_thinking`) are outside this extension's OpenAI-compatible transport scope.\n\n## Stored configuration\n\nProvider metadata and API keys are stored separately:\n\n```text\n~/.pi/agent/pi-provider-manager.json\n~/.pi/agent/pi-provider-manager-secrets.json\n```\n\nThe first file contains provider IDs, display names, and Base URLs. The second contains API keys. The extension creates its directory with `0700` permissions and the secrets file with `0600` permissions. API keys are not included in model-list output or notifications.\n\n## Operational behavior\n\n- Provider IDs are stable identifiers. `/provider edit` changes the display name, Base URL, and API key, but does not rename the provider ID.\n- Cancelling the edit menu discards all unsaved changes.\n- Saving an edit persists the new settings first, then refreshes that provider's model catalog. A failed catalog refresh does not discard an otherwise valid saved edit.\n- `/provider list` reports the model count currently loaded in Pi and the number of saved model overrides. It can be `0` before a successful refresh.\n- Model overrides take precedence over model-list metadata for `contextWindow` and `maxTokens`; unset fields continue to use the API value or the extension fallback.\n- The extension starts by refreshing every managed provider with a 30-second timeout per refresh operation.\n\n## Development\n\nInstall dependencies from the repository root:\n\n```bash\nnpm install\n```\n\nRun only this local extension during development:\n\n```bash\npi -ne -e .\n```\n\nFor a single-file load:\n\n```bash\npi -ne -e ./index.ts\n```\n\nAfter changing code, run `/reload` in Pi or restart Pi. To refresh model catalogs without reloading the extension, use:\n\n```text\n/provider reload --all\n```\n\nTo register the package in Pi's user settings instead of passing `-e` every time:\n\n```bash\npi install \"$PWD\"\n```\n\n## Security\n\nPi extensions can run with full system permissions. Review source code and packages before installing them.\n\nProtect API keys, refresh tokens, custom authorization headers, and sensitive endpoint query parameters. The extension avoids printing raw API keys and sends only the credential required for model-list requests.\n\n## License\n\nLicensed under the [Apache License 2.0](LICENSE).\n","readmeFilename":"README.md"}