Nebius Token Factory provider extension for pi coding agent.
Fetches the current model catalog from the Token Factory API on startup and registers all tool-capable text models. No pi core changes required.
# Install pi coding agent globally (required)
npm install -g --ignore-scripts @earendil-works/pi-coding-agent# Install the extension using pi's built-in package manager
pi install npm:tokenfactory-pi# Get an API key from https://tokenfactory.nebius.com/
export NEBIUS_API_KEY=your-key-here
# Optional: override catalog context metadata for all Nebius models
export NEBIUS_MODEL_CONTEXT=1048576Some public model endpoints can contain broken metadata values, such as an 8K
context length for a model with a 1M-token window. Set NEBIUS_MODEL_CONTEXT
to a positive integer token count to override the catalog's context_length
for models that do not have a saved per-model override.
# List available models to verify installation
pi --list-models | grep nebiusOnce running in interactive mode, use Pi's built-in /model command to select a Nebius model.
Run the interactive submenu inside pi:
/nebius-model
You can also open a specific model directly:
/nebius-model moonshotai/Kimi-K3
The submenu provides these actions:
- Edit context window — override the model's total context size
- Edit max output tokens — override its maximum response size
- Edit supported features — inherit, enable, or disable
toolsandreasoningindependently - Edit reasoning effort — force
reasoning_efforttonone,minimal,low,medium,high,xhigh, ormax - Edit temperature — force a value from
0through2; submit a blank value to inherit the request default - Reset saved overrides — remove every saved value for the model
- Back to model list — choose another model
Models that the catalog does not mark as tool-capable appear as hidden in the submenu. Setting Tools to Enabled registers such a text-output model with pi. Setting it to Disabled removes the model from pi's Nebius model list; switch away from an active model before disabling it.
Reasoning effort and temperature are applied to matching Nebius requests as
top-level reasoning_effort and temperature fields. These are raw Nebius API
values, not additional pi thinking levels. They are forced values: saved fields
replace values generated by pi, so a saved reasoning effort takes precedence
over /thinking. Choose the reasoning inherit option or submit a blank
temperature to restore pi and provider defaults.
Changes are applied immediately and saved across restarts in:
~/.pi/agent/extensions/tokenfactory-pi.json
The path follows PI_CODING_AGENT_DIR when that environment variable is set.
The file stores sparse per-model overrides:
{
"version": 1,
"models": {
"moonshotai/Kimi-K3": {
"contextWindow": 1048576,
"maxTokens": 32768,
"supportedFeatures": {
"tools": true,
"reasoning": true
},
"reasoningEffort": "high",
"temperature": 0.2
}
}
}The file is sparse: only fields changed in the menu are saved. Per-model
context values take precedence over NEBIUS_MODEL_CONTEXT, which takes
precedence over the model catalog. Feature booleans take precedence over the
catalog's supported_features. Use Reset saved overrides to remove every
saved field for one model.
For local development, export NEBIUS_API_KEY, then run:
# Build the TypeScript
npm run build
# Test locally from the project directory
cd path/to/tokenfactory-pi
./node_modules/.bin/pi --no-extensions -e . --provider nebius
# Then enter /nebius-model in piFor a disposable interactive test that does not touch your normal pi settings:
PI_CODING_AGENT_DIR=/tmp/tokenfactory-pi-test \
./node_modules/.bin/pi --no-extensions -e . --provider nebiusThis stores menu changes under
/tmp/tokenfactory-pi-test/extensions/tokenfactory-pi.json.
On startup the extension:
- Reads
NEBIUS_API_KEYfrom environment (no-op if missing) - Fetches
GET /v1/models?verbose=truefrom the Token Factory API - Loads saved model overrides from the pi agent directory
- Applies per-model and
NEBIUS_MODEL_CONTEXToverrides - Filters for text-output models with effective
toolssupport - Registers them as the
nebiusprovider viapi.registerProvider() - Applies saved reasoning-effort and temperature values to matching requests
All models use the openai-completions API with
compat: { supportsDeveloperRole: false, maxTokensField: "max_tokens" }.
The registered provider resolves auth from $NEBIUS_API_KEY, matching pi's current custom-provider config syntax.
This is important: a literal NEBIUS_API_KEY value would be sent as the bearer token and Token Factory returns 401.