@ssweens/pi-image-gen
Provider-agnostic image generation for Pi coding agent
Package details
Install @ssweens/pi-image-gen from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@ssweens/pi-image-gen- Package
@ssweens/pi-image-gen- Version
0.2.0- Published
- Feb 28, 2026
- Downloads
- 25/mo ยท 9/wk
- Author
- ssweens
- License
- MIT
- Types
- extension
- Size
- 827.9 KB
- Dependencies
- 0 dependencies ยท 5 peers
Pi manifest JSON
{
"extensions": [
"./extensions"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-image-gen

pi install @ssweens/pi-image-gen
Image generation extension for pi. Adds a generate_image tool and /image-model selector. Supports OpenAI, Google, and OpenRouter providers, with runtime discovery of new models from OpenRouter.
Features
- ๐จ 20+ built-in models โ OpenAI, Google Gemini, OpenRouter (FLUX, Seedream, Riverflow, and more)
- ๐ Runtime discovery โ Automatically finds new OpenRouter image models on startup
- โ๏ธ Custom providers โ Point at any compatible API via settings files
- ๐ผ๏ธ Aspect ratios & quality โ 1:1, 16:9, 9:16, 4:3, etc. with quality controls
- ๐พ Flexible save modes โ Project-local, global, or custom directory
- ๐ฏ
/image-modelcommand โ Interactive fuzzy-search model picker with session persistence
Install
pi install npm:@ssweens/pi-image-gen
# or from local path
pi install /path/to/pi-image-gen
Usage
Just ask the agent to generate an image:
> Generate an image of a sunset over mountains
> Create a 16:9 wallpaper of a cyberpunk city using dall-e-3
> Make me a logo for a coffee shop, save it to the project
Choosing a Model
Use /image-model โ works in both Pi terminal and Minapi:
/image-model # Interactive picker (fuzzy search)
/image-model openai/gpt-image-1 # Direct selection
/image-model openrouter/openai/gpt-5-image # OpenRouter model
Selection persists in the session and shows in the status bar as ๐จ provider/model.
Built-in Providers & Models
Models are auto-generated from OpenRouter's API and static catalogs. Run npm run generate-models to refresh.
| Provider | Models | API Key | API Type |
|---|---|---|---|
| openai | gpt-image-1, dall-e-3, dall-e-2 |
OPENAI_API_KEY |
/v1/images/generations |
gemini-2.0-flash-preview-image-generation, imagen-3.0-generate-002 |
GEMINI_API_KEY |
Gemini generateContent |
|
| openrouter | openai/gpt-5-image, openai/gpt-5-image-mini, google/gemini-2.5-flash-image, google/gemini-3-pro-image-preview, FLUX.2 variants, Seedream, Riverflow, and more |
OPENROUTER_API_KEY |
Chat completions |
Resolution Order
When generating an image, the model is resolved in this order:
- Session selection โ
/image-modelcommand - Settings file โ
defaultProvider/defaultModelinpi-image-gen.json - Default โ first available OpenRouter model, then OpenAI
Configuration
Custom Models via Settings
Define image providers in ~/.pi/agent/settings/pi-image-gen.json (global) or <project>/.pi/settings/pi-image-gen.json (project-local, overrides global):
{
"defaultProvider": "local-llm",
"defaultModel": "my-local-image-model",
"providers": {
"local-llm": {
"baseUrl": "http://192.168.1.51:9999/v1",
"apiKey": "MY_API_KEY",
"api": "openai-images",
"models": [
{
"id": "my-local-image-model",
"name": "My Local Image Model",
"cost": 0
}
]
}
}
}
Supported API Types
| Type | Used By | Endpoint |
|---|---|---|
openai-images |
OpenAI direct | POST /v1/images/generations |
openai-chat-image |
OpenRouter | POST /v1/chat/completions with modalities: ["image"] |
google-generative-ai-image |
Google Gemini | POST /models/{id}:generateContent |
Model-level api overrides provider-level api.
Legacy: models.json
pi-image-gen also reads providers.<name>.models[] entries in ~/.pi/agent/models.json that are tagged with output: ["image"]. This is lower priority than the settings file.
Save Modes
| Mode | Location |
|---|---|
none |
Don't save (default) |
project |
<repo>/.pi/generated-images/ |
global |
~/.pi/agent/generated-images/ |
custom |
saveDir param or PI_IMAGE_SAVE_DIR |
Tool Parameters
The generate_image tool accepts:
| Parameter | Type | Default | Description |
|---|---|---|---|
prompt |
string | required | Description of the image to generate |
aspectRatio |
string | 1:1 |
1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 |
imageSize |
string | 1K |
1K, 2K, 4K (OpenRouter models only) |
quality |
string | auto |
auto, low, medium, high (OpenAI direct only) |
save |
string | none |
none, project, global, custom |
saveDir |
string | โ | Directory for save=custom |
timeout |
number | 600 |
Generation timeout in seconds |
Pi Integration
- API keys โ Resolved via
ctx.modelRegistry.getApiKeyForProvider()(env vars, auth.json, OAuth) - Base URLs โ From model data, settings providers, or Pi's registry
- Custom providers โ Define in
~/.pi/agent/settings/pi-image-gen.json
Architecture
Mirrors Pi's text model pipeline:
| Layer | Pi (text) | pi-image-gen |
|---|---|---|
| Build-time discovery | generate-models.ts โ models.generated.ts |
generate-image-models.ts โ image-models.generated.ts |
| Runtime discovery | None | OpenRouter /v1/models on startup (24h cache) |
| Sources | models.dev, OpenRouter, AI Gateway | OpenRouter (output_modalities: ["image"]), static catalog |
| Custom models | models.json providers |
settings/pi-image-gen.json (preferred) + legacy models.json |
| API key resolution | ModelRegistry.getApiKeyForProvider() |
Same |
| Model selection | Ctrl+P / model selector | /image-model command |
Model Priority (lowest โ highest)
- Built-in generated โ
image-models.generated.ts(baked into package) - Runtime discovered โ OpenRouter API fetch, cached at
~/.pi/agent/cache/pi-image-gen-discovered.json(24h TTL) - Legacy
models.jsonโproviders.<name>.models[]entries withoutput: ["image"] - Settings providers โ
providersinpi-image-gen.jsonsettings file - Session selection โ
/image-modelcommand or tool params
Adding Providers
- Add static models to
scripts/generate-image-models.ts - Or add a new dynamic fetch function (like
fetchOpenRouterImageModels) - Run
npm run generate-models - Add generation logic in
extensions/image-gen.tsif a new API type is needed