Table of Contents [expand]
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2025年01月27日(月)
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)