@ssweens/pi-image-gen

extension

Provider-agnostic image generation for Pi coding agent

by · v0.2.0 · published 5mo ago

$ pi install npm:@ssweens/pi-image-gen
downloads/mo
82
stars
last push
open issues

Signals

license: MITtestspi manifest: missinginstall size: —deps: 0peer deps: 0

Download trend

237 downloads · last 12 weeks (weekly)

README

pi-image-gen

pi-image-gen model selector

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-model command — 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.

ProviderModelsAPI KeyAPI Type
openaigpt-image-1, dall-e-3, dall-e-2OPENAI_API_KEY/v1/images/generations
googlegemini-2.0-flash-preview-image-generation, imagen-3.0-generate-002GEMINI_API_KEYGemini generateContent
openrouteropenai/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 moreOPENROUTER_API_KEYChat completions

Resolution Order

When generating an image, the model is resolved in this order:

  1. Session selection/image-model command
  2. Settings filedefaultProvider / defaultModel in pi-image-gen.json
  3. 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

TypeUsed ByEndpoint
openai-imagesOpenAI directPOST /v1/images/generations
openai-chat-imageOpenRouterPOST /v1/chat/completions with modalities: ["image"]
google-generative-ai-imageGoogle GeminiPOST /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

ModeLocation
noneDon't save (default)
project<repo>/.pi/generated-images/
global~/.pi/agent/generated-images/
customsaveDir param or PI_IMAGE_SAVE_DIR

Tool Parameters

The generate_image tool accepts:

ParameterTypeDefaultDescription
promptstringrequiredDescription of the image to generate
aspectRatiostring1:11:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9
imageSizestring1K1K, 2K, 4K (OpenRouter models only)
qualitystringautoauto, low, medium, high (OpenAI direct only)
savestringnonenone, project, global, custom
saveDirstringDirectory for save=custom
timeoutnumber600Generation 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:

LayerPi (text)pi-image-gen
Build-time discoverygenerate-models.tsmodels.generated.tsgenerate-image-models.tsimage-models.generated.ts
Runtime discoveryNoneOpenRouter /v1/models on startup (24h cache)
Sourcesmodels.dev, OpenRouter, AI GatewayOpenRouter (output_modalities: ["image"]), static catalog
Custom modelsmodels.json providerssettings/pi-image-gen.json (preferred) + legacy models.json
API key resolutionModelRegistry.getApiKeyForProvider()Same
Model selectionCtrl+P / model selector/image-model command

Model Priority (lowest → highest)

  1. Built-in generatedimage-models.generated.ts (baked into package)
  2. Runtime discovered — OpenRouter API fetch, cached at ~/.pi/agent/cache/pi-image-gen-discovered.json (24h TTL)
  3. Legacy models.jsonproviders.<name>.models[] entries with output: ["image"]
  4. Settings providersproviders in pi-image-gen.json settings file
  5. Session selection/image-model command or tool params

Adding Providers

  1. Add static models to scripts/generate-image-models.ts
  2. Or add a new dynamic fetch function (like fetchOpenRouterImageModels)
  3. Run npm run generate-models
  4. Add generation logic in extensions/image-gen.ts if a new API type is needed

License

MIT