Powered by AppSignal & Oban Pro

Image Generation Kino App

notebooks/images.livemd

Image Generation Kino App

Mix.install([
  {:openai_ex, "~> 0.9.22"},
  {:kino, "~> 0.19.0"}
])

alias OpenaiEx
alias OpenaiEx.Images

Simple Kino UI

Image generation regularly exceeds the 15 second default receive timeout, so we raise it.

openai =
  System.fetch_env!("LB_OPENAI_API_KEY")
  |> OpenaiEx.new()
  |> OpenaiEx.with_receive_timeout(120_000)

Set default parameters for image generation. The GPT image models return base64 image data directly, so there is nothing to download.

model = "gpt-image-1"
size = "1024x1024"
n = 2

Prompt / Response UI

text_input = Kino.Input.textarea("Describe Image")

form = Kino.Control.form([text: text_input], submit: "Generate")
frame = Kino.Frame.new()

Kino.listen(form, fn %{data: %{text: prompt}} ->
  Kino.Frame.render(frame, Kino.Text.new("Running..."))

  images =
    openai
    |> Images.generate!(%{
      model: model,
      prompt: prompt,
      n: n,
      size: size
    })
    #   |> IO.inspect()
    |> Map.get("data")
    |> Enum.map(fn x -> x["b64_json"] |> Base.decode64!() end)

  images
  |> Enum.map(fn x -> x |> Kino.Image.new("image/png") end)
  |> Kino.Layout.grid(columns: 2)
  |> then(&Kino.Frame.render(frame, &1))
end)

Kino.Layout.grid([form, frame], boxed: true, gap: 16)