v1-images-generations API の Ruby クイックスタートガイド
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2025年01月27日(月)
Table of Contents
Heroku Managed Inference and Agent アドオンは現在パイロット段階です。パイロットの一環として提供される製品は本番環境での使用を目的としたものではなく、ベータサービスとみなされています。また、https://www.salesforce.com/company/legal/agreements.jsp のベータサービス条件が適用されます。
Stability AI Stable Image Ultra (stability-image-ultra
) モデルを使用すると、説明的なテキストプロンプトから高品質かつ精細な画像を生成できます。このガイドでは、Ruby を使用して v1-images-generations API にアクセスする方法について説明します。
前提条件
リクエストを行う前に、選択したモデルへのアクセスをプロビジョニングします。
まだインストールされていない場合は、Heroku CLI をインストールします。次に、Heroku AI プラグインをインストールします。
heroku plugins:install @heroku/plugin-ai
画像モデルをアプリにアタッチします。
# 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
Ruby のサンプルコード
# frozen_string_literal: true
require 'net/http'
require 'json'
require 'uri'
require 'base64'
DIFFUSION_URL = ENV.fetch('DIFFUSION_URL') do
raise <<~ERROR
Environment variable 'DIFFUSION_URL' is missing.
Set it using:
export DIFFUSION_URL=$(heroku config:get -a $APP_NAME DIFFUSION_URL)
ERROR
end
DIFFUSION_KEY = ENV.fetch('DIFFUSION_KEY') do
raise <<~ERROR
Environment variable 'DIFFUSION_KEY' is missing.
Set it using:
export DIFFUSION_KEY=$(heroku config:get -a $APP_NAME DIFFUSION_KEY)
ERROR
end
DIFFUSION_MODEL_ID = ENV.fetch('DIFFUSION_MODEL_ID') do
raise <<~ERROR
Environment variable 'DIFFUSION_MODEL_ID' is missing.
Set it using:
export DIFFUSION_MODEL_ID=$(heroku config:get -a $APP_NAME DIFFUSION_MODEL_ID)
ERROR
end
##
# Opens an image file using the default image viewer based on the operating system.
#
# @param filename [String] The name of the file to open.
def open_image_file(filename)
case RUBY_PLATFORM
when /darwin/ then system('open', filename) # macOS
when /linux/ then system('xdg-open', filename) # Linux
when /mingw|mswin/
system('start', filename) # Windows
else
puts 'Automatic image opening is not supported on this platform.'
end
end
##
# Parses and processes the API response for the image generation request.
#
# @param response [Net::HTTPResponse] The response from the API.
# @param payload [Hash] The original request payload.
# @param open_image [Boolean] Flag to automatically open the image after creation.
# @param filename [String, nil] Filename to save. If not provided, a default is generated.
def parse_image_output(response, payload, open_image: false, filename: nil)
if response.is_a?(Net::HTTPSuccess)
result = JSON.parse(response.body)
if payload[:response_format] == 'base64'
# Generate a default filename if none is provided, based on the prompt
filename ||= payload[:prompt][0..19].gsub(' ', '_').downcase + '.png'
File.open(filename, 'wb') do |file|
file.write(Base64.decode64(result.dig('data', 0, 'b64_json')))
end
puts "Image saved as #{filename}"
open_image_file(filename) if open_image
else
puts "Download the image from: #{result.dig('data', 0, 'url')}"
end
else
puts "Request failed: #{response.code}, #{response.body}"
end
end
##
# Generates an image using the Stability AI Stable Image Ultra model and saves it to a file.
#
# @param payload [Hash] The parameters for the image generation.
# @param open_image [Boolean] Flag to open the image automatically after generation.
# @param filename [String, nil] Name of the saved file. Defaults to a truncated version of the prompt.
def generate_image(payload, open_image: false, filename: nil)
uri = URI.join(DIFFUSION_URL, '/v1/images/generations')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{DIFFUSION_KEY}"
request['Content-Type'] = 'application/json'
request.body = payload.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(request)
end
parse_image_output(response, payload, open_image: open_image, filename: filename)
end
# Example payload
payload = {
model: 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',
response_format: 'base64' # Add this key if you want the base64 variant
}
# Generate the image with the given payload
generate_image(payload, open_image: true)