Skip to main content

Stability AI Provider

The current Go provider exposes Stability text-to-image generation through the shared ai.GenerateImage API.

Setup​

Installation​

import (
"context"
"github.com/digitallysavvy/go-ai/pkg/ai"
"github.com/digitallysavvy/go-ai/pkg/providers/stability"
)

Configuration​

provider := stability.New(stability.Config{
APIKey: os.Getenv("STABILITY_API_KEY"),
})

model, err := provider.ImageModel("stable-diffusion-xl-1024-v1-0")

Get API Key​

export STABILITY_API_KEY=sk-...

Available Models​

provider.ImageModel(modelID) calls the legacy Stability v1 REST API — POST /v1/generation/{modelID}/text-to-image — so modelID must be a v1 "engine" ID. Stability's newer SD3/Stable Image v2beta models (sd3-large, sd3-medium, core, ultra, etc.) are not reachable through this provider, since they live under a different endpoint (/v2beta/stable-image/...) that this package does not implement.

Image Generation​

Model IDOutputBest For
stable-diffusion-xl-1024-v1-0PNG bytesHigh quality text-to-image generation
stable-diffusion-v1-6PNG bytesFast text-to-image generation

Provider-Specific Features​

Text-to-Image​

result, err := ai.GenerateImage(ctx, ai.GenerateImageOptions{
Model: model,
Prompt: "A serene landscape",
Size: "1024x1024",
})

Examples​

Basic Image Generation​

package main

import (
"context"
"fmt"
"log"
"os"

"github.com/digitallysavvy/go-ai/pkg/ai"
"github.com/digitallysavvy/go-ai/pkg/providers/stability"
)

func main() {
provider := stability.New(stability.Config{
APIKey: os.Getenv("STABILITY_API_KEY"),
})

model, err := provider.ImageModel("stable-diffusion-xl-1024-v1-0")
if err != nil {
log.Fatal(err)
}

result, err := ai.GenerateImage(context.Background(), ai.GenerateImageOptions{
Model: model,
Prompt: "A futuristic cityscape at sunset, photorealistic",
Size: "1024x1024",
})
if err != nil {
log.Fatal(err)
}

// Save image
imageData := result.Images[0].Data
err = os.WriteFile("output.png", imageData, 0644)
if err != nil {
log.Fatal(err)
}

fmt.Println("Image saved to output.png")
}

Batch Generation​

prompts := []string{
"A red sports car",
"A blue sports car",
"A green sports car",
}

for i, prompt := range prompts {
result, err := ai.GenerateImage(ctx, ai.GenerateImageOptions{
Model: model,
Prompt: prompt,
})
if err != nil {
log.Printf("Failed to generate %d: %v", i, err)
continue
}

filename := fmt.Sprintf("car_%d.png", i)
os.WriteFile(filename, result.Images[0].Data, 0644)
}

Multiple Images​

n := 4
result, err := ai.GenerateImage(ctx, ai.GenerateImageOptions{
Model: model,
Prompt: "A set of colorful product concept images",
N: &n,
Size: "1024x1024",
})
if err != nil {
log.Fatal(err)
}

for i, image := range result.Images {
filename := fmt.Sprintf("concept_%d.png", i)
os.WriteFile(filename, image.Data, 0644)
}

Best Practices​

  1. Prompt Engineering

    • Be specific and detailed
    • Include style keywords
    • Mention quality (4k, detailed, etc)
  2. Cost Optimization

    • Start with one image before increasing N
    • Batch similar requests
    • Cache generated images
  3. Performance

    • Use appropriate model for task
    • Parallelize generations

Rate Limits & Pricing​

Rate Limits​

Varies by plan - typical limits:

  • 150 images/min (standard)
  • 500 images/min (premium)

Cost Management​

func estimateImageCost(model string, count int) float64 {
prices := map[string]float64{
"stable-diffusion-xl-1024-v1-0": 0.04,
"stable-diffusion-v1-6": 0.02,
}

return prices[model] * float64(count)
}

See Also​