@senomas/proxy-provider
v0.1.4
Published
A [pi-coding-agent](https://github.com/earendil-works/pi-coding-agent) extension that registers a **deepseek** provider via a configurable AI proxy.
Readme
@senomas/proxy-provider
A pi-coding-agent extension that registers a deepseek provider via a configurable AI proxy.
What it does
This package extends pi with a "deepseek" provider (always registered). On every session:
- Discovers
.pi-project.json: walks up from the current directory; if not found, checks the main git worktree root (so linked worktrees work); if still not found, fails with a descriptive error - Reads the
project,proxy, and optionalprovidersfields from that file - Fetches model definitions from
${proxy}/static/providers/deepseek.jsonand registers the default"deepseek"provider - If a
providersmap is present, fetches and registers each additional provider - All providers get the proxy as
baseUrland the project name as theAI-Proxy-Projectheader
Prerequisites
- Node.js 18+ (for global
fetch) - pi-coding-agent installed (
npm install -g @earendil-works/pi-coding-agent)
Installation
pi install npm:@senomas/proxy-providerConfiguration
Create a .pi-project.json file in your project root:
{
"project": "my-project",
"proxy": "https://proxy.example.com"
}| Field | Type | Description |
|-------|------|-------------|
| project | string | Project name sent as the AI-Proxy-Project header |
| proxy | string | Base URL of the AI proxy server |
| providers | object (optional) | Map of provider names→config filenames served by the proxy at {proxy}/static/providers/ |
Multiple providers
You can register additional providers by adding a providers map. Each entry registers a provider with the same baseUrl and AI-Proxy-Project header as the default "deepseek".
{
"project": "my-project",
"proxy": "https://proxy.example.com",
"providers": {
"deepseek-work": "deepseek.json",
"deepseek-chat": "deepseek-chat.json"
}
}Behavior details:
| Aspect | Detail |
|--------|--------|
| Default | "deepseek" from deepseek.json is always registered |
| Override | If you include a key named "deepseek" in providers, it overrides the default (last registerProvider wins) |
| Empty {} | Treated as "no additional providers" — default "deepseek" is still registered |
| Config files | Each value must be a non-empty JSON filename served by the proxy under {proxy}/static/providers/ |
| Validation | Keys and values must be non-empty strings. Invalid entries throw a descriptive error at startup |
| Fail-fast | If fetching any config file fails, the entire extension throws — no partial registration |
Config file content — each referenced JSON file contains the provider's model definitions, which are merged with baseUrl and headers.AI-Proxy-Project before registration. The exact format depends on your proxy server's provider schema (typically a list of models with their capabilities).
Server-side dependency
This extension requires a running AI proxy server that exposes provider configuration files under /static/providers/.
Refer to the ai-team-proxy project for the reference proxy implementation and deployment instructions.
Verification
After installation, list available models to confirm the provider is registered:
pi --list-models | grep deepseekYou should see the deepseek models exposed by your proxy.
How it works
The extension exports an async default function that:
- Finds
.pi-project.jsonin two steps:- Walks up from the current directory (
process.cwd()) looking for.pi-project.json - If not found, resolves the main git worktree root via
git rev-parse --path-format=absolute --git-common-dir(falling back to parsinggit worktree list --porcelainfor git < 2.31) and checks<root>/.pi-project.json— so a config kept only in the main worktree is found from any linked worktree. Outside a git repo this step is skipped, and if no config exists anywhere the extension fails with a descriptive error.
- Walks up from the current directory (
- Parses the file with
fs.readFileSync/JSON.parseand validates theproject,proxy, and optionalprovidersfields - Calls
fetch()to retrieve the default"deepseek"provider metadata from the proxy - If a
providersmap is present, fetches and registers each additional provider in the same way - Calls
pi.registerProvider(name, config)for each provider with the fetched models, proxybaseUrl, andAI-Proxy-Projectheader
Testing
npm install
npm testRuns the unit/integration tests (Node's built-in test runner via tsx) against test/*.test.ts.
License
MIT
