defmodule Aigptimage do @moduledoc """ Small helpers for linking to AI GPT Image and building public API requests. [AI GPT Image](https://aigptimage.com/) provides AI image generation, editing, API, and MCP workflows, including GPT Image 2 style image generation helpers for creators and developers. """ @base_url "https://aigptimage.com" @default_image_model "gpt-image-2-text-to-image" @doc """ Returns the AI GPT Image homepage URL. ## Examples iex> Aigptimage.homepage_url() "https://aigptimage.com/" """ def homepage_url do @base_url <> "/" end @doc """ Returns public metadata for AI GPT Image. ## Examples iex> Aigptimage.metadata().default_image_model "gpt-image-2-text-to-image" """ def metadata do %{ name: "AI GPT Image", slug: "aigptimage", url: homepage_url(), description: "AI image generation and editing helpers for GPT Image 2 style workflows, prompt examples, API automation, and MCP integrations.", category: "AI Image Generator", contact_email: "support@aigptimage.com", default_image_model: @default_image_model } end @doc """ Returns the public createTask API URL. ## Examples iex> Aigptimage.api_create_task_url() "https://aigptimage.com/api/v1/jobs/createTask" """ def api_create_task_url(base_url \\ @base_url) when is_binary(base_url) do clean_base_url(base_url) <> "/api/v1/jobs/createTask" end @doc """ Returns the public recordInfo API URL for a task id. ## Examples iex> Aigptimage.api_record_info_url("task 123") "https://aigptimage.com/api/v1/jobs/recordInfo?taskId=task%20123" """ def api_record_info_url(task_id, base_url \\ @base_url) when is_binary(task_id) and is_binary(base_url) do id = String.trim(task_id) if id == "" do raise ArgumentError, "task_id is required" end clean_base_url(base_url) <> "/api/v1/jobs/recordInfo?taskId=" <> URI.encode(id) end @doc """ Returns the MCP endpoint URL. ## Examples iex> Aigptimage.mcp_url() "https://aigptimage.com/api/mcp" """ def mcp_url(base_url \\ @base_url) when is_binary(base_url) do clean_base_url(base_url) <> "/api/mcp" end @doc """ Builds a createTask request body for GPT Image 2 style image generation. ## Examples iex> Aigptimage.build_create_task_body("A clean ecommerce product photo") %{model: "gpt-image-2-text-to-image", input: %{prompt: "A clean ecommerce product photo"}} """ def build_create_task_body(prompt, opts \\ []) when is_binary(prompt) and is_list(opts) do text = String.trim(prompt) if text == "" do raise ArgumentError, "prompt is required" end model = Keyword.get(opts, :model, @default_image_model) input = Keyword.get(opts, :input, %{}) |> Map.put(:prompt, text) body = %{model: model, input: input} case Keyword.get(opts, :call_back_url) do nil -> body url -> Map.put(body, :callBackUrl, url) end end @doc """ Returns Bearer authorization headers for API requests. ## Examples iex> Aigptimage.bearer_headers("key").authorization "Bearer key" """ def bearer_headers(api_key) when is_binary(api_key) do key = String.trim(api_key) if key == "" do raise ArgumentError, "api_key is required" end %{ authorization: "Bearer " <> key, content_type: "application/json" } end @doc """ Returns a Markdown link to AI GPT Image. ## Examples iex> Aigptimage.markdown_link() "[AI GPT Image](https://aigptimage.com/)" """ def markdown_link(label \\ "AI GPT Image") when is_binary(label) do "[#{String.trim(label)}](#{homepage_url()})" end defp clean_base_url(base_url) do String.trim_trailing(base_url, "/") end end