Python Quick Start Guide for v1-images-generations API
Last updated January 24, 2025
This article is a work in progress, or documents a feature that is not yet released to all users. This article is unlisted. Only those with the link can access it.
Table of Contents
The Heroku Managed Inference and Agent add-on is currently in pilot. The products offered as part of the pilot aren’t intended for production use and are considered as a Beta Service and are subject to the Beta Services terms at https://www.salesforce.com/company/legal/agreements.jsp.
The Stability AI Stable Image Ultra (stability-image-ultra
) model allows you to generate high-quality, detailed images from descriptive text prompts. This guide shows how to access the v1-images-generations API using Python.
Prerequisites
Before making requests, provision access to the model of your choice.
If it’s not already installed, install the Heroku CLI. Then install the Heroku AI plugin:
heroku plugins:install @heroku/plugin-ai
Attach the image model to an app of yours:
# If you don't have an app yet, you can create one with: heroku create $APP_NAME # specify the name you want for your app (or skip this step to use an existing app you have!) # Create and attach the image model to your app, $APP_NAME. heroku ai:models:create -a $APP_NAME stability-image-ultra --as DIFFUSION
Install the necessary
requests
package:pip install requests
Python Example Code
import requests
import json
import os
import base64
import subprocess
import sys
# Global variables for API endpoint, authorization key, and model ID from Heroku config variables
ENV_VARS = {
"DIFFUSION_URL": None,
"DIFFUSION_KEY": None,
"DIFFUSION_MODEL_ID": None
}
# Assert the existence of required environment variables, with helpful messages if they're missing.
for env_var in ENV_VARS.keys():
value = os.environ.get(env_var)
assert value is not None, (
f"Environment variable '{env_var}' is missing. Set it using:\n"
f"export {env_var}=$(heroku config:get -a $APP_NAME {env_var})"
)
ENV_VARS[env_var] = value
def open_image_file(filename):
"""
Opens an image file using the default image viewer based on the operating system.
"""
try:
if sys.platform == "darwin": # macOS
subprocess.run(["open", filename], check=True)
elif sys.platform == "win32": # Windows
subprocess.run(["start", filename], shell=True, check=True)
elif sys.platform == "linux": # Linux
subprocess.run(["xdg-open", filename], check=True)
else:
print("Automatic image opening is not supported on this platform.")
except Exception as e:
print(f"Failed to open image: {e}")
def parse_image_output(response, payload, open_image=False, filename=None):
if response.status_code == 200:
result = response.json()
if payload.get("response_format", "url") == "base64":
# Generate a default filename if none provided, based on the prompt
if not filename:
filename = payload["prompt"][:20].replace(" ", "_").lower() + ".png"
with open(filename, "wb") as f:
f.write(base64.b64decode(result["data"][0]["b64_json"]))
print(f"Image saved as {filename}")
# Open the image if flag is set
if open_image:
open_image_file(filename)
else:
print("Download the image from:", result["data"][0]["url"])
else:
print(f"Request failed: {response.status_code}, {response.text}")
def generate_image(payload, open_image=False, filename=None):
"""
Generates an image using the Stability AI Stable Image Ultra model and saves it to a file.
Parameters:
- payload (dict): dictionary containing parameters for the image generation
- open_image (bool): flag to open the image automatically after generation
- filename (str): name of the saved file (defaults to a truncated version of the prompt)
Returns:
- saves the generated image to a file and optionally opens it
"""
# Set headers using the global API key
HEADERS = {
"Authorization": f"Bearer {ENV_VARS['DIFFUSION_KEY']}",
"Content-Type": "application/json"
}
endpoint_url = ENV_VARS['DIFFUSION_URL'] + "/v1/images/generations"
response = requests.post(endpoint_url, headers=HEADERS, data=json.dumps(payload))
parse_image_output(response=response, payload=payload, open_image=open_image, filename=filename)
# Example payload
payload = {
"model": ENV_VARS["DIFFUSION_MODEL_ID"],
"prompt": "A surreal landscape with glowing mushrooms under a night sky.",
"aspect_ratio": "16:9",
"output_format": "png",
"seed": 123,
"negative_prompt": "crowded, noisy, chaotic"
}
# Generate the image with the given payload
generate_image(payload, open_image=True)