Current section

Files

Jump to
qwen lib image.ex
Raw

lib/image.ex

defmodule Qwen.Image do
@moduledoc """
通义万相: 文生图模型
"""
alias Qwen.Client
alias Qwen.Config
@post_url "/api/v1/services/aigc/text2image/image-synthesis"
@get_url "/api/v1/tasks"
def post_url(), do: @post_url
def get_url(), do: @get_url
@doc """
根据`text`生成图片,存储到`image_path`并返回
"""
def text_to_image(text, image_path) do
text |> image_generation(image_path)
end
@doc """
根据`text`生成图片,返回`image_url`
"""
def text_to_image(text) do
text |> image_generation
end
def image_generation_save(params, image_path, config \\ %Config{}) do
# params -> task_id -> image_url -> image file path
image_generation(params, config)
|> save_image(image_path)
end
def image_generation(params, config \\ %Config{}) do
# params -> task_id -> image_url
post_async_generation_task(params, config)
|> parse_task_id()
|> get_task_status()
end
def post_async_generation_task(params, config \\ %Config{}) do
# 固定使用 enable,表明使用异步方式提交作业(文档要求必须使用异步方式)
dynamic_headers = [
{"X-DashScope-Async", "enable"}
]
post_url()
|> Client.api_post(params, config, dynamic_headers)
end
def get_task_status(params \\ [], config \\ %Config{}, task_id_string) do
(get_url() <> "/" <> task_id_string)
|> Client.api_get(params, config)
|> parse_image_url()
end
def parse_task_id({:ok, %{output: %{"task_id" => task_id}}}) do
task_id
end
def parse_task_id({:error, _} = raw_resp) do
raw_resp
end
defp parse_image_url(
{:ok, %{output: %{"task_status" => task_status, "task_id" => task_id}}} = resp
) do
case task_status do
"PENDING" ->
IO.puts("Pending...")
:timer.sleep(5000)
get_task_status(task_id)
"RUNNING" ->
IO.puts("Running...")
:timer.sleep(3000)
get_task_status(task_id)
"SUCCEEDED" ->
{:ok, %{output: %{"results" => [%{"url" => image_url} | _]}}} = resp
{:ok, image_url}
_ ->
{:error, resp}
end
end
defp parse_image_url({:error, _} = raw_resp) do
raw_resp
end
def save_image({:ok, image_url}, image_path) do
Client.image_download(image_url, image_path)
end
end