Com a API, você pode gerar e editar imagens a partir de prompts de texto usando gpt-image-2.5-sunburst e gpt-image-2.5-flare. Escolha o Sunburst para fluxos de trabalho em que a precisão na edição é a prioridade e o Flare para gerar imagens de alta qualidade com rapidez no dia a dia. Duas APIs oferecem recursos de geração de imagens:
API de imagens
A API de imagens oferece dois endpoints com funções distintas:
Geração: Gere imagens do zero a partir de um prompt de texto.
A API de respostas permite gerar imagens em conversas ou fluxos com várias etapas. Ela oferece a geração de imagens como ferramenta integrada e aceita imagens de entrada e de saída no contexto da conversa.
Em relação à API de imagens, ela oferece dois recursos adicionais:
Edição em várias interações: Use prompts sucessivos para editar imagens com alta fidelidade.
Entradas flexíveis: Além de enviar os bytes das imagens de entrada, você pode fornecer os IDs dos arquivos de imagem.
Para saber quais modelos principais podem chamar a ferramenta de geração de imagens, consulte os modelos compatíveis.
Como escolher a API
Se você precisa apenas gerar ou editar uma imagem a partir de um único prompt, a API de imagens é a melhor opção.
Se você quer criar uma experiência em que o usuário possa gerar e editar imagens durante uma conversa com o GPT Image, use a API de respostas.
Na API de imagens, defina model diretamente como gpt-image-2.5-sunburst ou gpt-image-2.5-flare. Na API de respostas, selecione um modelo principal compatível no nível superior da solicitação e especifique gpt-image-2.5-sunburst ou gpt-image-2.5-flare no campo model da ferramenta de geração de imagens.
As duas APIs permitem personalizar a saída ajustando a qualidade, o tamanho, o formato e a compressão.
O GPT-Image-2.6 inclui o Sunburst para trabalhos visuais detalhados e o Flare para testar variações rapidamente. Na API de imagens, ambos permitem controlar a complexidade, orientar edições com anotações e gerar arquivos SVG e GIFs animados. Os exemplos já existentes abaixo usam o GPT-Image-2.5.
Definir a complexidade da imagem
Use o campo complexity da solicitação para controlar quanto planejamento o modelo faz antes de renderizar a imagem. Uma complexidade menor pode ser adequada para edições pontuais, como trocar o fundo ou alterar uma placa. Uma complexidade maior pode ajudar em imagens com muito texto, layouts complexos ou relações entre objetos. Aumentar a complexidade também pode aumentar a latência e introduzir alterações indesejadas. Compare os resultados para a sua tarefa.
O Sunburst e o Flare aceitam os níveis de complexidade low, medium e high. Se você omitir complexity, ambos usarão high. O parâmetro quality controla a qualidade da renderização separadamente.
O ajuste de complexidade não tem custo adicional.
O Sunburst gerou estas cenas de futebol em estilo de recorte de papel usando o mesmo prompt e qualidade média. Compare o troféu, os uniformes e a posição do letreiro “CHAMPIONS” nos diferentes níveis de complexidade.
Complexidade baixa
Complexidade média
Complexidade alta
Identificadores de segurança
Se o seu aplicativo atende usuários finais individuais, inclua um safety_identifier estável que preserve a privacidade em cada solicitação de geração de imagens ou edição de imagens. Use um hash do nome de usuário ou do endereço de e-mail em vez de enviar informações de identificação. O identificador deve ter no máximo 128 caracteres. O uso de identificadores de segurança é recomendado, mas opcional.
O parâmetro user da API de imagens está obsoleto. Passe o mesmo identificador em safety_identifier. A API continua aceitando solicitações que usam user. Um safety_identifier não vazio tem prioridade sobre user. Se safety_identifier for omitido, tiver o valor null ou for uma string vazia, a API usará user se estiver disponível.
Para saber como personalizar o tamanho, a qualidade, o formato e a compressão, consulte a seção Personalizar a imagem de saída abaixo.
Defina o parâmetro n para gerar várias imagens em uma única solicitação. Por padrão, a API retorna uma imagem.
API de imagens
Gerar uma imagem
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import OpenAI from "openai";import fs from "fs";const openai = new OpenAI();const prompt = `A children's book drawing of a veterinarian using a stethoscope tolisten to the heartbeat of a baby otter.`;const result = await openai.images.generate({ model: "gpt-image-2.5-sunburst", prompt,});// Save the image to a fileconst image_base64 = result.data[0].b64_json;const image_bytes = Buffer.from(image_base64, "base64");fs.writeFileSync("otter.png", image_bytes);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18from openai import OpenAIimport base64client = OpenAI()prompt ="""A children's book drawing of a veterinarian using a stethoscope tolisten to the heartbeat of a baby otter."""result = client.images.generate(model="gpt-image-2.5-sunburst", prompt=prompt)image_base64 = result.data[0].b64_jsonimage_bytes = base64.b64decode(image_base64)# Save the image to a filewithopen("otter.png", "wb") as f: f.write(image_bytes)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28package mainimport ( "context" "encoding/base64" "os" "github.com/openai/openai-go/v3")func main() { client := openai.NewClient() result, err := client.Images.Generate(context.Background(), openai.ImageGenerateParams{ Model: openai.ImageModel("gpt-image-2.5-sunburst"), Prompt: "A children's book drawing of a veterinarian using a stethoscope to " + "listen to the heartbeat of a baby otter.", }) if err != nil { panic(err) } image, err := base64.StdEncoding.DecodeString(result.Data[0].B64JSON) if err != nil { panic(err) } if err := os.WriteFile("otter.png", image, 0o600); err != nil { panic(err) }}
1
2
3
4
5
6
7
8
9
10
11
12using OpenAI.Images;string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;string model = "gpt-image-2.5-sunburst";ImageClient client = new(model, key);GeneratedImage image = await client.GenerateImageAsync( "A children's book drawing of a veterinarian using a stethoscope to " + "listen to the heartbeat of a baby otter.");await File.WriteAllBytesAsync("otter.png", image.ImageBytes.ToArray());
1
2
3
4
5
6
7
8
9
10
11
12
13require "base64"require "openai"client = OpenAI::Client.newresult = client.images.generate( model: "gpt-image-2.5-sunburst", prompt: "A watercolor robot reading in a library")generated_image = result.data&.first or raise "No image returned"File.binwrite( "generated-image.png", Base64.strict_decode64(generated_image.b64_json))
1
2
3
4
5
6
7curl -X POST "https://api.openai.com/v1/images/generations" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -H "Content-type: application/json" \ -d '{ "model": "gpt-image-2.5-sunburst", "prompt": "A children'\''s book drawing of a veterinarian using a stethoscope to listen to the heartbeat of a baby otter." }' | jq -r '.data[0].b64_json' | base64 --decode > otter.png
1
2
3
4
5openai images generate \ --model gpt-image-2.5-sunburst \ --prompt "A children's book drawing of a veterinarian using a stethoscope to listen to the heartbeat of a baby otter." \ --raw-output \ --transform 'data.0.b64_json' | base64 --decode > otter.png
API de respostas
Gerar uma imagem
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20import OpenAI from "openai";const openai = new OpenAI();const response = await openai.responses.create({ model: "gpt-6-astra", input: "Generate an image of gray tabby cat hugging an otter with an orange scarf", tools: [{ type: "image_generation", model: "gpt-image-2.5-sunburst" }],});// Save the image to a fileconst imageData = response.output .filter((output) => output.type === "image_generation_call") .map((output) => output.result);if (imageData.length > 0) { const imageBase64 = imageData[0]; const fs = await import("fs"); fs.writeFileSync("otter.png", Buffer.from(imageBase64, "base64"));}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22from openai import OpenAIimport base64client = OpenAI()response = client.responses.create(model="gpt-6-astra",input="Generate an image of gray tabby cat hugging an otter with an orange scarf",tools=[{"type": "image_generation", "model": "gpt-image-2.5-sunburst"}],)# Save the image to a fileimage_data = [ output.resultfor output in response.outputif output.type =="image_generation_call"]if image_data: image_base64 = image_data[0]withopen("otter.png", "wb") as f: f.write(base64.b64decode(image_base64))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42package mainimport ( "context" "encoding/base64" "os" "github.com/openai/openai-go/v3" "github.com/openai/openai-go/v3/responses")func main() { client := openai.NewClient() response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{ Model: "gpt-6-astra", Input: responses.ResponseNewParamsInputUnion{ OfString: openai.String("Generate an image of gray tabby cat hugging an otter with an orange scarf"), }, Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{Model: "gpt-image-2.5-sunburst"}}}, }) if err != nil { panic(err) } saveFirstGeneratedImage(response, "otter.png")}func saveFirstGeneratedImage(response *responses.Response, filename string) { for _, output := range response.Output { if output.Type != "image_generation_call" { continue } image, err := base64.StdEncoding.DecodeString(output.AsImageGenerationCall().Result) if err != nil { panic(err) } if err := os.WriteFile(filename, image, 0o600); err != nil { panic(err) } return } panic("response did not include an image generation call")}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20using OpenAI.Responses;#pragma warning disable OPENAI001string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;ResponsesClient client = new(key);CreateResponseOptions options = new() { Model = "gpt-6-astra" };options.InputItems.Add( ResponseItem.CreateUserMessageItem( "Generate an image of a gray tabby cat hugging an otter with an orange scarf." ));options.Tools.Add(ResponseTool.CreateImageGenerationTool(model: "gpt-image-2.5-sunburst"));ResponseResult response = await client.CreateResponseAsync(options);ImageGenerationCallResponseItem image = response .OutputItems.OfType<ImageGenerationCallResponseItem>() .FirstOrDefault() ?? throw new InvalidOperationException("No generated image was returned.");await File.WriteAllBytesAsync("otter.png", image.ImageResultBytes.ToArray());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24require "base64"require "openai"client = OpenAI::Client.newresponse = client.responses.create( model: "gpt-6-astra", input: "Generate an image of a gray tabby cat hugging an otter with an orange scarf.", tools: [ { type: :image_generation, model: "gpt-image-2.5-sunburst" } ])image_call = response.output.find do |item| item.is_a?(OpenAI::Models::Responses::ResponseOutputItem::ImageGenerationCall)endunless image_call.is_a?(OpenAI::Models::Responses::ResponseOutputItem::ImageGenerationCall) raise "No image generation call returned"endencoded_image = image_call.result or raise "No image returned"File.binwrite("otter.png", Base64.strict_decode64(encoded_image))
Geração de imagens em várias interações
Com a API de respostas, você pode gerar imagens ao longo de uma conversa. Para isso, inclua no contexto os resultados das chamadas de geração de imagens (também é possível usar apenas o ID da imagem) ou use o parâmetro previous_response_id.
Assim, a cada interação, você pode refinar os prompts, aplicar novas instruções e ajustar o resultado visual conforme a conversa avança.
Na ferramenta de geração de imagens da API de respostas, os modelos compatíveis podem decidir se vão gerar uma nova imagem ou editar uma que já esteja na conversa. O parâmetro opcional action controla esse comportamento. Mantenha action: "auto" para deixar o modelo decidir, use action: "generate" para sempre criar uma nova imagem ou defina action: "edit" para forçar a edição quando houver uma imagem no contexto.
Forçar a criação de uma imagem com action
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import OpenAI from "openai";const openai = new OpenAI();const response = await openai.responses.create({ model: "gpt-6-astra", input: "Generate an image of gray tabby cat hugging an otter with an orange scarf", tools: [ { type: "image_generation", model: "gpt-image-2.5-sunburst", action: "generate" }, ],});// Save the image to a fileconst imageData = response.output .filter((output) => output.type === "image_generation_call") .map((output) => output.result);if (imageData.length > 0) { const imageBase64 = imageData[0]; const fs = await import("fs"); fs.writeFileSync("otter.png", Buffer.from(imageBase64, "base64"));}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24from openai import OpenAIimport base64client = OpenAI()response = client.responses.create(model="gpt-6-astra",input="Generate an image of gray tabby cat hugging an otter with an orange scarf",tools=[ {"type": "image_generation", "model": "gpt-image-2.5-sunburst", "action": "generate"} ],)# Save the image to a fileimage_data = [ output.resultfor output in response.outputif output.type =="image_generation_call"]if image_data: image_base64 = image_data[0]withopen("otter.png", "wb") as f: f.write(base64.b64decode(image_base64))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38package mainimport ( "context" "encoding/base64" "os" "github.com/openai/openai-go/v3" "github.com/openai/openai-go/v3/responses")func main() { client := openai.NewClient() response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{ Model: "gpt-6-astra", Input: responses.ResponseNewParamsInputUnion{ OfString: openai.String("Generate an image of gray tabby cat hugging an otter with an orange scarf"), }, Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{Model: "gpt-image-2.5-sunburst", Action: "generate"}}}, }) if err != nil { panic(err) } for _, output := range response.Output { if output.Type != "image_generation_call" { continue } image, err := base64.StdEncoding.DecodeString(output.AsImageGenerationCall().Result) if err != nil { panic(err) } if err := os.WriteFile("otter.png", image, 0o600); err != nil { panic(err) } return } panic("response did not include an image generation call")}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25using OpenAI.Responses;#pragma warning disable OPENAI001string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;ResponsesClient client = new(key);CreateResponseOptions options = new() { Model = "gpt-6-astra" };options.InputItems.Add( ResponseItem.CreateUserMessageItem( "Generate an image of a gray tabby cat hugging an otter with an orange scarf." ));options.Tools.Add( ResponseTool.CreateImageGenerationTool( model: "gpt-image-2.5-sunburst", action: ImageGenerationToolAction.Generate ));ResponseResult response = await client.CreateResponseAsync(options);ImageGenerationCallResponseItem image = response .OutputItems.OfType<ImageGenerationCallResponseItem>() .FirstOrDefault() ?? throw new InvalidOperationException("No generated image was returned.");await File.WriteAllBytesAsync("otter.png", image.ImageResultBytes.ToArray());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27require "base64"require "openai"client = OpenAI::Client.newresponse = client.responses.create( model: "gpt-6-astra", input: "Generate an image of a gray tabby cat hugging an otter with an orange scarf.", tools: [ { type: :image_generation, model: "gpt-image-2.5-sunburst", action: :generate } ])image_call = response.output.find do |item| item.is_a?(OpenAI::Models::Responses::ResponseOutputItem::ImageGenerationCall)endunless image_call.is_a?(OpenAI::Models::Responses::ResponseOutputItem::ImageGenerationCall) raise "No image generation call returned"endencoded_image = image_call.result or raise "No image returned"output_path = ENV.fetch("OPENAI_EXAMPLE_OUTPUT_PATH", "otter.png")File.binwrite(output_path, Base64.decode64(encoded_image))puts(output_path)
Se você forçar edit sem fornecer uma imagem no contexto, a chamada retornará um erro. Mantenha action como auto para que o modelo decida quando gerar ou editar uma imagem.
“Gere uma imagem de um gato cinza rajado abraçando uma lontra que usa um cachecol laranja”
“Agora deixe a imagem realista”
Streaming
A API de respostas e a API de imagens permitem gerar imagens com streaming. Você pode receber imagens parciais à medida que as APIs as geram, o que torna a experiência mais interativa.
Ajuste o parâmetro partial_images para receber de 0 a 3 imagens parciais.
Se você definir partial_images como 0, receberá apenas a imagem final.
Para valores maiores que zero, você poderá receber menos imagens parciais do que solicitou se a imagem final ficar pronta antes.
API de respostas
Receber uma imagem por streaming
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33import OpenAI from "openai";import fs from "fs";const openai = new OpenAI();function saveBase64Image(filename, imageBase64) { const imageBuffer = Buffer.from(imageBase64, "base64"); fs.writeFileSync(filename, imageBuffer);}const stream = await openai.responses.create({ model: "gpt-6-astra", input: "Draw a gorgeous image of a river made of white owl feathers, snaking its way through a serene winter landscape", stream: true, tools: [ { type: "image_generation", model: "gpt-image-2.5-sunburst", partial_images: 2 }, ],});for await (const event of stream) { if (event.type === "response.image_generation_call.partial_image") { const idx = event.partial_image_index; saveBase64Image(`river-partial-${idx}.png`, event.partial_image_b64); } else if (event.type === "response.completed") { const imageData = event.response.output .filter((output) => output.type === "image_generation_call") .map((output) => output.result); if (imageData.length > 0) { saveBase64Image("river-final.png", imageData[0]); } }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34from openai import OpenAIimport base64client = OpenAI()defsave_base64_image(filename, image_base64): image_bytes = base64.b64decode(image_base64)withopen(filename, "wb") as f: f.write(image_bytes)stream = client.responses.create(model="gpt-6-astra",input="Draw a gorgeous image of a river made of white owl feathers, snaking its way through a serene winter landscape",stream=True,tools=[ {"type": "image_generation", "model": "gpt-image-2.5-sunburst", "partial_images": 2} ],)for event in stream:if event.type =="response.image_generation_call.partial_image": idx = event.partial_image_index save_base64_image(f"river-partial-{idx}.png", event.partial_image_b64)elif event.type =="response.completed": image_data = [ output.resultfor output in event.response.outputif output.type =="image_generation_call" ]if image_data: save_base64_image("river-final.png", image_data[0])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49package mainimport ( "context" "encoding/base64" "fmt" "os" "github.com/openai/openai-go/v3" "github.com/openai/openai-go/v3/responses")func main() { client := openai.NewClient() stream := client.Responses.NewStreaming(context.Background(), responses.ResponseNewParams{ Model: "gpt-6-astra", Input: responses.ResponseNewParamsInputUnion{ OfString: openai.String("Draw a gorgeous image of a river made of white owl feathers, snaking its way through a serene winter landscape"), }, Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{Model: "gpt-image-2.5-sunburst", PartialImages: openai.Int(2)}}}, }) for stream.Next() { event := stream.Current() if event.Type == "response.image_generation_call.partial_image" { partial := event.AsResponseImageGenerationCallPartialImage() saveImage(fmt.Sprintf("river-partial-%d.png", partial.PartialImageIndex), partial.PartialImageB64) } if event.Type == "response.completed" { for _, output := range event.AsResponseCompleted().Response.Output { if output.Type == "image_generation_call" { saveImage("river-final.png", output.AsImageGenerationCall().Result) } } } } if err := stream.Err(); err != nil { panic(err) }}func saveImage(filename, encoded string) { image, err := base64.StdEncoding.DecodeString(encoded) if err != nil { panic(err) } if err := os.WriteFile(filename, image, 0o600); err != nil { panic(err) }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33require "base64"require "openai"client = OpenAI::Client.newstream = client.responses.stream( model: "gpt-6-astra", input: "Generate an image of a river made of white owl feathers.", tools: [ { type: :image_generation, model: "gpt-image-2.5-sunburst", partial_images: 2 } ])stream.each do |event| case event when OpenAI::Models::Responses::ResponseImageGenCallPartialImageEvent image = Base64.strict_decode64(event.partial_image_b64) File.binwrite("river-partial-#{event.partial_image_index}.png", image) when OpenAI::Models::Responses::ResponseCompletedEvent image_call = event.response.output.find do |item| item.is_a?(OpenAI::Models::Responses::ResponseOutputItem::ImageGenerationCall) end next unless image_call.is_a?(OpenAI::Models::Responses::ResponseOutputItem::ImageGenerationCall) File.binwrite( "river-final.png", Base64.strict_decode64(image_call.result) ) endend
API de imagens
Receber uma imagem por streaming
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import fs from "fs";import OpenAI from "openai";const openai = new OpenAI();const prompt = "Draw a gorgeous image of a river made of white owl feathers, snaking its way through a serene winter landscape";const stream = await openai.images.generate({ prompt: prompt, model: "gpt-image-2.5-sunburst", stream: true, partial_images: 2,});for await (const event of stream) { if (event.type === "image_generation.partial_image") { const idx = event.partial_image_index; const imageBase64 = event.b64_json; const imageBuffer = Buffer.from(imageBase64, "base64"); fs.writeFileSync(`river${idx}.png`, imageBuffer); }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19from openai import OpenAIimport base64client = OpenAI()stream = client.images.generate(prompt="Draw a gorgeous image of a river made of white owl feathers, snaking its way through a serene winter landscape",model="gpt-image-2.5-sunburst",stream=True,partial_images=2,)for event in stream:if event.type =="image_generation.partial_image": idx = event.partial_image_index image_base64 = event.b64_json image_bytes = base64.b64decode(image_base64)withopen(f"river{idx}.png", "wb") as f: f.write(image_bytes)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40package mainimport ( "context" "encoding/base64" "fmt" "os" "github.com/openai/openai-go/v3")func main() { client := openai.NewClient() stream := client.Images.GenerateStreaming(context.Background(), openai.ImageGenerateParams{ Model: openai.ImageModel("gpt-image-2.5-sunburst"), Prompt: "Draw a gorgeous image of a river made of white owl feathers, snaking its way through a serene winter landscape", PartialImages: openai.Int(2), }) for stream.Next() { event := stream.Current() if event.Type != "image_generation.partial_image" { continue } partial := event.AsImageGenerationPartialImage() saveImage(fmt.Sprintf("river%d.png", partial.PartialImageIndex), partial.B64JSON) } if err := stream.Err(); err != nil { panic(err) }}func saveImage(filename, encoded string) { image, err := base64.StdEncoding.DecodeString(encoded) if err != nil { panic(err) } if err := os.WriteFile(filename, image, 0o600); err != nil { panic(err) }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import com.openai.client.okhttp.OpenAIOkHttpClient;import com.openai.models.images.ImageGenerateParams;import java.nio.file.Files;import java.nio.file.Path;import java.util.Base64;var params = ImageGenerateParams.builder() .prompt( "Draw a gorgeous image of a river made of white owl feathers, snaking its way through a serene winter landscape") .model("gpt-image-2.5-sunburst") .partialImages(2) .build();try (var stream = client.images().generateStreaming(params)) { var events = stream.stream().iterator(); while (events.hasNext()) { var event = events.next(); if (event.generationPartialImage().isPresent()) { var partial = event.generationPartialImage().orElseThrow(); Files.write( Path.of("river" + partial.partialImageIndex() + ".png"), Base64.getDecoder().decode(partial.b64Json())); } }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16require "base64"require "openai"client = OpenAI::Client.newstream = client.images.generate_stream_raw( model: "gpt-image-2.5-sunburst", prompt: "A river made of white owl feathers in a winter landscape", partial_images: 2)stream.each do |event| next unless event.is_a?(OpenAI::Models::ImageGenPartialImageEvent) image = Base64.strict_decode64(event.b64_json) File.binwrite("river#{event.partial_image_index}.png", image)end
Resultado
Parcial 1
Parcial 2
Imagem final
Prompt: Desenhe uma bela imagem de um rio feito de penas brancas de coruja, serpenteando por uma paisagem tranquila de inverno
Prompt revisado
Quando você usa a ferramenta de geração de imagens na API de respostas, o modelo principal (por exemplo, gpt-5.5) revisa automaticamente o prompt para melhorar os resultados.
O prompt revisado fica disponível no campo revised_prompt da chamada de geração de imagens:
Resposta com o prompt revisado
1
2
3
4
5
6
7{"id": "ig_123","type": "image_generation_call","status": "completed","revised_prompt": "A gray tabby cat hugging an otter. The otter is wearing an orange scarf. Both animals are cute and friendly, depicted in a warm, heartwarming style.","result": "..."}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58require "base64"require "openai"require "pathname"client = OpenAI::Client.newbase64_images = ["body-lotion.png", "soap.png"].map do |path| Base64.strict_encode64(File.binread(path))endfile_ids = [ client.files.create(file: Pathname("bath-bomb.png"), purpose: :vision).id, client.files.create(file: Pathname("incense-kit.png"), purpose: :vision).id]prompt = <<~PROMPT Generate a photorealistic image of a gift basket on a white background labeled 'Relax & Unwind' with a ribbon and handwriting-like font, containing all the items in the reference pictures.PROMPTresponse = client.responses.create( model: "gpt-6-astra", input: [ { role: :user, content: [ { type: :input_text, text: prompt }, *base64_images.map do |image| { type: :input_image, image_url: "data:image/png;base64,#{image}" } end, *file_ids.map do |file_id| { type: :input_image, file_id: file_id } end ] } ], tools: [ { type: :image_generation, model: "gpt-image-2.5-sunburst" } ])image_call = response.output.find do |item| item.is_a?(OpenAI::Models::Responses::ResponseOutputItem::ImageGenerationCall)endunless image_call.is_a?(OpenAI::Models::Responses::ResponseOutputItem::ImageGenerationCall) raise "No image generation call returned"endFile.binwrite("gift-basket.png", Base64.strict_decode64(image_call.result))
API de imagens
Editar uma imagem
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37import fs from "fs";import OpenAI, { toFile } from "openai";const client = new OpenAI();const prompt = `Generate a photorealistic image of a gift basket on a white backgroundlabeled 'Relax & Unwind' with a ribbon and handwriting-like font,containing all the items in the reference pictures.`;const imageFiles = [ "fixtures/bath-bomb.png", "fixtures/body-lotion.png", "fixtures/incense-kit.png", "fixtures/soap.png",];const images = await Promise.all( imageFiles.map( async (file) => await toFile(fs.createReadStream(file), null, { type: "image/png", }) ));const response = await client.images.edit({ model: "gpt-image-2.5-sunburst", image: images, prompt,});// Save the image to a fileconst image_base64 = response.data[0].b64_json;const image_bytes = Buffer.from(image_base64, "base64");fs.writeFileSync("basket.png", image_bytes);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28import base64from openai import OpenAIclient = OpenAI()prompt ="""Generate a photorealistic image of a gift basket on a white backgroundlabeled 'Relax & Unwind' with a ribbon and handwriting-like font,containing all the items in the reference pictures."""result = client.images.edit(model="gpt-image-2.5-sunburst",image=[open("body-lotion.png", "rb"),open("bath-bomb.png", "rb"),open("incense-kit.png", "rb"),open("soap.png", "rb"), ],prompt=prompt,)image_base64 = result.data[0].b64_jsonimage_bytes = base64.b64decode(image_base64)# Save the image to a filewithopen("gift-basket.png", "wb") as f: f.write(image_bytes)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65package mainimport ( "context" "encoding/base64" "io" "os" "github.com/openai/openai-go/v3")func main() { client := openai.NewClient() files, closeFiles := openImages( "bath-bomb.png", "body-lotion.png", "incense-kit.png", "soap.png", ) defer closeFiles() response, err := client.Images.Edit(context.Background(), openai.ImageEditParams{ Model: openai.ImageModel("gpt-image-2.5-sunburst"), Image: openai.ImageEditParamsImageUnion{OfFileArray: files}, Prompt: "Generate a photorealistic image of a gift basket on a white background " + "labeled 'Relax & Unwind' with a ribbon and handwriting-like font, containing all the items in the reference pictures.", }) if err != nil { panic(err) } saveImage("basket.png", response.Data[0].B64JSON)}func openImages(names ...string) ([]io.Reader, func()) { images := make([]io.Reader, 0, len(names)) files := make([]*os.File, 0, len(names)) for _, name := range names { file, err := os.Open(name) if err != nil { closeFiles(files) panic(err) } images = append(images, openai.File(file, name, "image/png")) files = append(files, file) } return images, func() { closeFiles(files) }}func closeFiles(files []*os.File) { for _, file := range files { if err := file.Close(); err != nil { panic(err) } }}func saveImage(filename, encoded string) { image, err := base64.StdEncoding.DecodeString(encoded) if err != nil { panic(err) } if err := os.WriteFile(filename, image, 0o600); err != nil { panic(err) }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45import com.openai.client.OpenAIClient;import com.openai.client.okhttp.OpenAIOkHttpClient;import com.openai.core.MultipartField;import com.openai.models.images.ImageEditParams;import java.io.IOException;import java.io.InputStream;import java.nio.file.Files;import java.nio.file.Path;import java.util.Base64;import java.util.List;Path lotion = Path.of(System.getenv("OPENAI_EXAMPLE_IMAGE_PATH"));Path soap = Path.of(System.getenv("OPENAI_EXAMPLE_IMAGE_PATH_2"));Path bathBomb = Path.of(System.getenv("OPENAI_EXAMPLE_IMAGE_PATH_3"));Path incense = Path.of(System.getenv("OPENAI_EXAMPLE_IMAGE_PATH_4"));try (InputStream lotionImage = Files.newInputStream(lotion); InputStream bathBombImage = Files.newInputStream(bathBomb); InputStream incenseImage = Files.newInputStream(incense); InputStream soapImage = Files.newInputStream(soap)) { var images = client .images() .edit( ImageEditParams.builder() .model("gpt-image-2.5-sunburst") .image( MultipartField.<ImageEditParams.Image>builder() .value( ImageEditParams.Image.ofInputStreams( List.of(lotionImage, bathBombImage, incenseImage, soapImage))) .contentType("image/png") .filename("gift-basket-reference.png") .build()) .prompt( """ Generate a photorealistic image of a gift basket on a white background labeled 'Relax & Unwind' with a ribbon and handwriting-like font, containing all the items in the reference pictures. """) .build()); Files.write( Path.of("gift-basket.png"), Base64.getDecoder().decode(images.data().orElseThrow().get(0).b64Json().orElseThrow()));}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19require "base64"require "openai"require "pathname"client = OpenAI::Client.newimages = %w[body-lotion.png bath-bomb.png incense-kit.png soap.png].map do |path| OpenAI::FilePart.new(Pathname(path), content_type: "image/png")endresult = client.images.edit( image: images, model: "gpt-image-2.5-sunburst", prompt: <<~PROMPT Generate a photorealistic image of a gift basket on a white background labeled 'Relax & Unwind' with a ribbon and handwriting-like font, containing all the items in the reference pictures. PROMPT)generated_image = result.data&.first or raise "No image returned"File.binwrite("gift-basket.png", Base64.strict_decode64(generated_image.b64_json))
1
2
3
4
5
6
7
8
9
10curl -s -D >(grep -i x-request-id >&2) \ -o >(jq -r '.data[0].b64_json' | base64 --decode > gift-basket.png) \ -X POST "https://api.openai.com/v1/images/edits" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -F "model=gpt-image-2.5-sunburst" \ -F "image[]=@body-lotion.png" \ -F "image[]=@bath-bomb.png" \ -F "image[]=@incense-kit.png" \ -F "image[]=@soap.png" \ -F 'prompt=Generate a photorealistic image of a gift basket on a white background labeled "Relax & Unwind" with a ribbon and handwriting-like font, containing all the items in the reference pictures'
1
2
3
4
5
6
7
8
9openai images edit \ --model gpt-image-2.5-sunburst \ --image body-lotion.png \ --image bath-bomb.png \ --image incense-kit.png \ --image soap.png \ --prompt 'Generate a photorealistic image of a gift basket on a white background labeled "Relax & Unwind" with a ribbon and handwriting-like font, containing all the items in the reference pictures' \ --raw-output \ --transform 'data.0.b64_json' | base64 --decode > gift-basket.png
Orientar uma edição com anotações
Use o endpoint POST /v1/images/edits da API de imagens para orientar edições com anotações nos modelos GPT-Image-2.5 e GPT-Image-2.6 compatíveis. Para editar uma região da imagem com a API de respostas, use uma máscara. Use uma camada de anotações para indicar onde fazer a alteração e descreva a alteração em prompt.
Por exemplo, baixe a foto da cozinha e a camada transparente no mesmo diretório. Na camada transparente, um círculo indica o vaso cuja cor deve mudar.
Editar o vaso circulado com a API de imagens
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21import base64from pathlib import Pathfrom openai import OpenAIclient = OpenAI()overlay = Path("markup-vase-overlay-gpt-image-2-6.png")withopen("kitchen.webp", "rb") as image, overlay.open("rb") as markup: result = client.images.edit(model="gpt-image-2.6-flare",image=("kitchen.webp", image, "image/webp"),markup=(overlay.name, markup, "image/png"),quality="medium",prompt=("Recolor the striped vase inside the red circle to solid cobalt blue ceramic. ""Keep its shape, the dried stems, and the rest of the kitchen unchanged. ""Remove the red circle from the finished photo." ), )Path("vase.png").write_bytes(base64.b64decode(result.data[0].b64_json))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31client := openai.NewClient()image, err := os.Open("kitchen.webp")if err != nil { panic(err)}defer image.Close()markup, err := os.Open("markup-vase-overlay-gpt-image-2-6.png")if err != nil { panic(err)}defer markup.Close()response, err := client.Images.Edit(context.Background(), openai.ImageEditParams{ Model: openai.ImageModel("gpt-image-2.6-flare"), Image: openai.ImageEditParamsImageUnion{OfFile: openai.File(image, "kitchen.webp", "image/webp")}, Markup: openai.File(markup, "markup-vase-overlay-gpt-image-2-6.png", "image/png"), Quality: "medium", Prompt: "Recolor the striped vase inside the red circle to solid cobalt blue ceramic. " + "Keep its shape, the dried stems, and the rest of the kitchen unchanged. " + "Remove the red circle from the finished photo.",})if err != nil { panic(err)}result, err := base64.StdEncoding.DecodeString(response.Data[0].B64JSON)if err != nil { panic(err)}if err := os.WriteFile("vase.png", result, 0o600); err != nil { panic(err)}
1
2
3
4
5
6
7
8
9
10set -euo pipefailcurl --fail --silent --show-error https://api.openai.com/v1/images/edits \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -F model=gpt-image-2.6-flare \ -F quality=medium \ -F 'image=@kitchen.webp;type=image/webp' \ -F 'markup=@markup-vase-overlay-gpt-image-2-6.png;type=image/png' \ -F 'prompt=Recolor the striped vase inside the red circle to solid cobalt blue ceramic. Keep its shape, the dried stems, and the rest of the kitchen unchanged. Remove the red circle from the finished photo.' | jq -er '.data[0].b64_json' | base64 --decode > vase.png
Foto com a camada de anotações
Resultado do Flare
Mantenha a imagem original como a primeira imagem de entrada.
Crie um PNG transparente separado com os círculos, esboços ou outras anotações. Depois de aplicar a orientação das imagens, a camada de anotações e a primeira imagem devem ter a mesma largura e a mesma altura. O PNG deve conter pixels transparentes. Não mescle essa camada com a imagem original.
Envie a camada de anotações no campo markup. Solicitações multipart aceitam o envio de um arquivo. Em solicitações JSON, envie um objeto com exatamente um dos campos image_url ou file_id. O campo image_url aceita uma URL HTTPS ou uma URL de dados em base64. Nas solicitações de edição em JSON, use images para enviar o array de imagens de entrada.
Descreva a alteração desejada e os detalhes que você quer preservar. Revise o resultado antes de usá-lo.
As anotações se aplicam à primeira imagem de entrada. As demais imagens servem de referência. Tanto a primeira imagem quanto a camada de anotações podem conter, cada uma, no máximo 16.777.216 pixels. O arquivo de anotações também tem um limite de 50 MB. Não combine markup com mask.
Editar uma imagem com uma máscara
Você pode fornecer uma máscara para indicar qual parte da imagem deve ser editada.
Quando você usa uma máscara com o GPT Image, o modelo recebe instruções adicionais para orientar a edição de acordo com a máscara.
O GPT Image usa apenas prompts para orientar a edição com máscaras. A máscara serve de referência para o modelo, que pode não seguir seu contorno com exatidão.
Se você fornecer várias imagens de entrada, a máscara será aplicada à primeira.
API de respostas
Editar uma imagem com uma máscara
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54import fs from "fs";import OpenAI from "openai";const openai = new OpenAI();async function createFile(filePath) { const result = await openai.files.create({ file: fs.createReadStream(filePath), purpose: "vision", }); return result.id;}const fileId = await createFile("fixtures/sunlit_lounge.png");const maskId = await createFile("fixtures/mask.png");const response = await openai.responses.create({ model: "gpt-6-astra", input: [ { role: "user", content: [ { type: "input_text", text: "generate an image of the same sunlit indoor lounge area with a pool but the pool should contain a flamingo", }, { type: "input_image", file_id: fileId, detail: "auto", }, ], }, ], tools: [ { type: "image_generation", model: "gpt-image-2.5-sunburst", quality: "high", input_image_mask: { file_id: maskId, }, }, ],});const imageData = response.output .filter((output) => output.type === "image_generation_call") .map((output) => output.result);if (imageData.length > 0) { const imageBase64 = imageData[0]; fs.writeFileSync("lounge.png", Buffer.from(imageBase64, "base64"));}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54from openai import OpenAIimport base64client = OpenAI()defcreate_file(file_path):withopen(file_path, "rb") as file_content: result = client.files.create(file=file_content, purpose="vision")return result.idfileId = create_file("sunlit_lounge.png")maskId = create_file("mask.png")response = client.responses.create(model="gpt-6-astra",input=[ {"role": "user","content": [ {"type": "input_text","text": "generate an image of the same sunlit indoor lounge area with a pool but the pool should contain a flamingo", }, {"type": "input_image","file_id": fileId, }, ], }, ],tools=[ {"type": "image_generation","model": "gpt-image-2.5-sunburst","quality": "high","input_image_mask": {"file_id": maskId, }, }, ],)image_data = [ output.resultfor output in response.outputif output.type =="image_generation_call"]if image_data: image_base64 = image_data[0]withopen("lounge.png", "wb") as f: f.write(base64.b64decode(image_base64))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67package mainimport ( "context" "encoding/base64" "os" "github.com/openai/openai-go/v3" "github.com/openai/openai-go/v3/responses")func main() { client := openai.NewClient() imageID := uploadImage(client, "sunlit_lounge.png") maskID := uploadImage(client, "mask.png") response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{ Model: "gpt-6-astra", Input: responses.ResponseNewParamsInputUnion{OfInputItemList: responses.ResponseInputParam{ responses.ResponseInputItemParamOfMessage( responses.ResponseInputMessageContentListParam{ responses.ResponseInputContentParamOfInputText("Generate an image of the same sunlit indoor lounge area with a pool, but the pool should contain a flamingo."), {OfInputImage: &responses.ResponseInputImageParam{FileID: openai.String(imageID), Detail: responses.ResponseInputImageDetailAuto}}, }, responses.EasyInputMessageRoleUser, ), }}, Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{ Model: "gpt-image-2.5-sunburst", Quality: "high", InputImageMask: responses.ToolImageGenerationInputImageMaskParam{FileID: openai.String(maskID)}, }}}, }) if err != nil { panic(err) } saveFirstGeneratedImage(response, "lounge.png")}func uploadImage(client openai.Client, filename string) string { file, err := os.Open(filename) if err != nil { panic(err) } defer file.Close() uploaded, err := client.Files.New(context.Background(), openai.FileNewParams{File: file, Purpose: openai.FilePurposeVision}) if err != nil { panic(err) } return uploaded.ID}func saveFirstGeneratedImage(response *responses.Response, filename string) { for _, output := range response.Output { if output.Type != "image_generation_call" { continue } image, err := base64.StdEncoding.DecodeString(output.AsImageGenerationCall().Result) if err != nil { panic(err) } if err := os.WriteFile(filename, image, 0o600); err != nil { panic(err) } return } panic("response did not include an image generation call")}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15require "openai"require "pathname"require "base64"client = OpenAI::Client.newimage = OpenAI::FilePart.new(Pathname("sunlit_lounge.png"), content_type: "image/png")mask = OpenAI::FilePart.new(Pathname("mask.png"), content_type: "image/png")result = client.images.edit( image: image, mask: mask, model: "gpt-image-2.5-sunburst", prompt: "A sunlit indoor lounge area with a pool containing a flamingo")generated_image = result.data&.first or raise "No image returned"File.binwrite("lounge.png", Base64.strict_decode64(generated_image.b64_json))
1
2
3
4
5
6
7
8curl -s -D >(grep -i x-request-id >&2) \ -o >(jq -r '.data[0].b64_json' | base64 --decode > lounge.png) \ -X POST "https://api.openai.com/v1/images/edits" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -F "model=gpt-image-2.5-sunburst" \ -F "mask=@mask.png" \ -F "image[]=@sunlit_lounge.png" \ -F 'prompt=A sunlit indoor lounge area with a pool containing a flamingo'
1
2
3
4
5
6
7openai images edit \ --model gpt-image-2.5-sunburst \ --image sunlit_lounge.png \ --mask mask.png \ --prompt "A sunlit indoor lounge area with a pool containing a flamingo" \ --raw-output \ --transform 'data.0.b64_json' | base64 --decode > out.png
Imagem
Máscara
Resultado
Prompt: uma área de descanso interna iluminada pelo sol, com um flamingo dentro da piscina
Requisitos da máscara
A imagem a editar e a máscara devem ter o mesmo formato e as mesmas dimensões. Cada arquivo deve ter menos de 50 MB.
A imagem da máscara também precisa conter um canal alfa. Se você criar a máscara em um editor de imagens, salve-a com um canal alfa.
Você pode adicionar um canal alfa a uma imagem em preto e branco por meio de código.
Adicionar um canal alfa a uma máscara em preto e branco
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21fromPILimport Imagefrom io import BytesIO# 1. Load your black & white mask as a grayscale imagemask = Image.open("mask.png").convert("L")# 2. Convert it to RGBA so it has space for an alpha channelmask_rgba = mask.convert("RGBA")# 3. Then use the mask itself to fill that alpha channelmask_rgba.putalpha(mask)# 4. Convert the mask into bytesbuf = BytesIO()mask_rgba.save(buf, format="PNG")mask_bytes = buf.getvalue()# 5. Save the resulting fileimg_path_mask_alpha ="mask_alpha.png"withopen(img_path_mask_alpha, "wb") as f: f.write(mask_bytes)
Você pode configurar as seguintes opções de saída:
Tamanho: Dimensões da imagem (por exemplo, 1024x1024, 1024x1536)
Qualidade: Qualidade de renderização (por exemplo, low, medium, high)
Formato: Formato do arquivo de saída
Compressão: Nível de compressão (de 0 a 100%) para os formatos JPEG e WebP
Fundo: Transparente, opaco ou automático
Os parâmetros size, quality e background aceitam a opção auto. Com ela, o modelo seleciona automaticamente a melhor opção com base no prompt.
Opções de tamanho e qualidade
Os modelos gpt-image-2.5-sunburst e gpt-image-2.5-flare acrescentam os níveis de qualidade xhigh e max. Nos dois modelos, o padrão é auto. Nos modelos GPT Image anteriores, o nível mais alto disponível é high.
Os dois modelos também aceitam dimensões personalizadas em strings no formato WIDTHxHEIGHT, como 1536x864. A largura e a altura devem ser múltiplas de 16, a proporção deve ficar entre 1:3 e 3:1 e nenhum dos lados pode ultrapassar 3.840 pixels. O total de pixels deve ficar entre 655.360 e 8.294.400 (4K). Resoluções acima de 2560x1440 são experimentais.
Para gerar um fundo transparente em qualquer um dos dois modelos, defina background: "transparent" e use output_format: "png" ou "webp".
Use quality: "low" para gerar rascunhos rapidamente. Para imagens finais, compare os níveis de qualidade mais altos para encontrar o equilíbrio adequado entre nível de detalhe, latência e custo.
Formato de saída
A API de imagens retorna os dados da imagem codificados em base64.
O formato padrão é png, mas você também pode solicitar jpeg ou webp.
Ao usar jpeg ou webp, você também pode especificar o parâmetro output_compression para controlar o nível de compressão (de 0 a 100%). Por exemplo, output_compression=50 aplica uma compressão de 50% à imagem.
Usar jpeg é mais rápido do que usar png. Priorize o JPEG se a latência for importante para o seu aplicativo.
Gerar imagens em SVG
Defina output_format: "svg" em POST /v1/images/generations. Use SVG para elementos gráficos que precisam de caminhos, formas e cores editáveis, como ícones e ilustrações.
Defina n como 1. A saída em SVG não oferece suporte a streaming, imagens parciais ou output_compression. O endpoint de edição de imagens não gera arquivos SVG nem aceita SVG como imagem raster de entrada para edição.
A API cria uma imagem de referência e a usa para produzir o SVG. O parâmetro quality controla a qualidade dessa imagem de referência. Decodifique data[0].b64_json de base64 e salve os bytes resultantes, que contêm XML em UTF-8, em um arquivo com a extensão .svg. O documento retornado contém elementos vetoriais estáticos e não oferece suporte a scripts, recursos externos ou imagens raster incorporadas.
O Flare e o Sunburst geraram estes logotipos em SVG a partir do mesmo prompt, que pedia um logotipo para a padaria Field & Flour.
GPT-Image-2.6 Flare
GPT-Image-2.6 Sunburst
Gerar GIFs animados
Defina output_format: "gif" em POST /v1/images/generations ou POST /v1/images/edits. No prompt, descreva o que deve aparecer na animação, como deve se mover e como o ciclo deve se repetir. Para orientar a animação com imagens estáticas de referência, envie-as ao endpoint de edição de imagens.
Use os campos de solicitação a seguir para gerar GIFs em qualquer um dos dois endpoints:
Campo
Valores
Padrão
frame_count
De 2 a 16 quadros
9
frame_duration_ms
De 20 a 2.000 milissegundos por quadro, com arredondamento para o múltiplo de 10 ms mais próximo
200
size
auto ou WIDTHxHEIGHT com dimensões positivas e múltiplas de 16
auto
O campo size define o tamanho de cada quadro da animação final. A quantidade de quadros, as dimensões de cada quadro e o número de animações devem respeitar os limites de tamanho do modelo e o limite total de pixels da solicitação. Se a solicitação exceder esses limites, reduza frame_count, as dimensões dos quadros ou n. Use auto para que a API escolha um tamanho de quadro dentro dos limites do modelo.
A resposta contém a animação pronta. Decodifique o valor de b64_json de cada resultado de base64 e salve os bytes em um arquivo com a extensão .gif. A saída em GIF não oferece suporte a streaming, imagens parciais ou valores personalizados de output_compression. Use frame_count e frame_duration_ms apenas para saída em GIF.
O Sunburst gerou esta animação da lanterna com frame_count=9 e frame_duration_ms=200. O macaco volta à posição inicial após 1,8 segundo.
Limitações
Os modelos GPT Image são poderosos e versáteis, mas apresentam algumas limitações na geração de imagens:
Latência: O processamento de prompts complexos pode levar até 2 minutos.
Renderização de texto: Apesar das melhorias significativas, o modelo ainda pode ter dificuldade para posicionar o texto com precisão e garantir sua legibilidade.
Consistência: O modelo consegue gerar imagens consistentes, mas às vezes tem dificuldade para manter a aparência de personagens recorrentes ou elementos de marca em várias gerações.
Controle da composição: Embora siga melhor as instruções, o modelo pode ter dificuldade para posicionar elementos com precisão em composições estruturadas ou que dependem de uma disposição específica.
Moderação de conteúdo
Todos os prompts e imagens geradas passam por filtros de acordo com nossa política de conteúdo.
Ao gerar imagens com os modelos GPT Image, você pode ajustar o rigor da moderação com o parâmetro moderation. Ele aceita dois valores:
auto (padrão): Aplica a filtragem padrão, que busca limitar a criação de determinadas categorias de conteúdo potencialmente inadequado para certas faixas etárias.
low: Aplica uma filtragem menos restritiva.
Como lidar com solicitações bloqueadas e outros erros
Trate falhas na geração de imagens como os demais erros da API. Verifique o status HTTP ou o tipo de exceção do SDK, registre o ID da solicitação e consulte o guia de códigos de erro para diagnosticar falhas de autenticação, cota, limite de taxa ou servidor. Em caso de falhas temporárias de limite de taxa ou de servidor, faça novas tentativas com intervalos progressivamente maiores. Não repita automaticamente solicitações que falharam por erro de cota ou por erro do usuário na geração de imagens que exija alterar a solicitação.
Quando o usuário pode corrigir uma falha na geração de imagens, a API pode retornar error.type = "image_generation_user_error". Nesses casos, não repita a solicitação automaticamente sem alterar o prompt ou as imagens de entrada. Para tratar esses erros no código, use error.code como identificador estável do tipo de falha.
Quando error.code = "moderation_blocked", o erro também pode incluir o objeto opcional error.moderation_details:
O objeto moderation_details fornece informações gerais para depuração sem expor os rótulos ou as pontuações dos classificadores internos.
O campo moderation_stage pode assumir os seguintes valores:
input: O prompt ou os dados de entrada da solicitação causaram o bloqueio.
output: O bloqueio ocorreu por causa de uma imagem gerada ou em uma etapa posterior de moderação da saída.
unknown: Valor usado nos raros casos em que é difícil determinar a origem do bloqueio.
O campo categories contém rótulos públicos de categorias gerais. Por exemplo, você pode encontrar valores como harassment, self-harm, sexual ou violence.
Na maioria dos aplicativos, mantenha genérica a mensagem principal exibida ao usuário final. Use moderation_details em logs para desenvolvedores, fluxos de suporte, análises e sugestões simples de como corrigir o problema.
Tratar erros de bloqueio por moderação na geração de imagens
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42import OpenAI from"openai";constopenai=newOpenAI();try {// The same error handling pattern applies to image generation requests,// image edits, and Responses API tool calls that generate images.await openai.images.generate({ model: "gpt-image-2.5-sunburst", prompt: "Create a poster humiliating my coworker with insulting captions", });} catch (error) {if (error?.code !=="moderation_blocked") {throw error; }constmoderationDetails= error.error?.moderation_details;constcategories= moderationDetails?.categories ?? [];conststage= moderationDetails?.moderation_stage;let hint ="This request could not be completed because it did not meet safety requirements.";if (categories.includes("harassment")) { hint ="Try removing abusive or targeting language and focus on neutral visual details instead."; } elseif (stage ==="input") { hint ="Try revising the prompt or input images and submit the request again."; } elseif (stage ==="output") { hint ="The generated result was blocked by a safety check. Try changing the prompt and generating again."; } console.error("Image generation blocked", { request_id: error?.requestID, code: error?.code, moderation_details: moderationDetails, }); console.log(hint);}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40import openaifrom openai import OpenAIclient = OpenAI()try: # The same error handling pattern applies to image generation requests, # image edits, and Responses API tool calls that generate images. client.images.generate( model="gpt-image-2.5-sunburst", prompt="Create a poster humiliating my coworker with insulting captions", )except openai.BadRequestError as error: if error.code != "moderation_blocked": raise error_body = error.body if isinstance(error.body, dict) else {} moderation_details = error_body.get("moderation_details") or {} categories = moderation_details.get("categories") or [] stage = moderation_details.get("moderation_stage") hint = "This request could not be completed because it did not meet safety requirements." if "harassment" in categories: hint = "Try removing abusive or targeting language and focus on neutral visual details instead." elif stage == "input": hint = "Try revising the prompt or input images and submit the request again." elif stage == "output": hint = "The generated result was blocked by a safety check. Try changing the prompt and generating again." print( "Image generation blocked", { "request_id": error.request_id, "code": error.code, "moderation_details": moderation_details, }, ) print(hint)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48package mainimport ( "context" "encoding/json" "errors" "fmt" "slices" "github.com/openai/openai-go/v3")func main() { client := openai.NewClient() _, err := client.Images.Generate(context.Background(), openai.ImageGenerateParams{ Model: openai.ImageModel("gpt-image-2.5-sunburst"), Prompt: "Create a poster humiliating my coworker with insulting captions", }) if err == nil { return } var apiError *openai.Error if !errors.As(err, &apiError) || apiError.Code != "moderation_blocked" { panic(err) } var body struct { ModerationDetails struct { Categories []string `json:"categories"` ModerationStage string `json:"moderation_stage"` } `json:"moderation_details"` } if err := json.Unmarshal([]byte(apiError.RawJSON()), &body); err != nil { panic(err) } hint := "This request could not be completed because it did not meet safety requirements." if slices.Contains(body.ModerationDetails.Categories, "harassment") { hint = "Try removing abusive or targeting language and focus on neutral visual details instead." } else if body.ModerationDetails.ModerationStage == "input" { hint = "Try revising the prompt or input images and submit the request again." } else if body.ModerationDetails.ModerationStage == "output" { hint = "The generated result was blocked by a safety check. Try changing the prompt and generating again." } fmt.Printf("Image generation blocked (%s): %s\n", apiError.Code, hint)}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38import com.openai.client.OpenAIClient;import com.openai.client.okhttp.OpenAIOkHttpClient;import com.openai.errors.BadRequestException;import com.openai.models.images.ImageGenerateParams;import java.util.List;import java.util.Map;try { var images = client .images() .generate( ImageGenerateParams.builder() .model("gpt-image-2.5-sunburst") .prompt("Create a poster humiliating my coworker with insulting captions") .build()); System.out.println(images.data().orElseThrow().get(0).b64Json().orElseThrow());} catch (BadRequestException error) { if (!error.code().orElse("").equals("moderation_blocked")) { throw error; } Map<?, ?> body = error.body().convert(Map.class); Object detailsValue = body.get("moderation_details"); Map<?, ?> details = detailsValue instanceof Map<?, ?> values ? values : Map.of(); Object categories = details.get("categories"); Object stage = details.get("moderation_stage"); String hint = "This request did not meet safety requirements."; if (categories instanceof List<?> values && values.contains("harassment")) { hint = "Remove abusive or targeting language and focus on neutral visual details."; } else if ("input".equals(stage)) { hint = "Revise the prompt or input images, then submit the request again."; } else if ("output".equals(stage)) { hint = "Change the prompt and generate again; the generated result was blocked."; } System.err.println("Image generation blocked (" + error.code().orElseThrow() + "): " + hint);}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28require "openai"client = OpenAI::Client.newbegin client.images.generate( model: "gpt-image-2.5-sunburst", prompt: "Create a poster humiliating my coworker with insulting captions" )rescue OpenAI::Errors::BadRequestError => error raise unless error.code == "moderation_blocked" body = Hash.try_convert(error.body) || {} body = Hash.try_convert(body[:error] || body["error"]) || body moderation_details = body[:moderation_details] || body["moderation_details"] || {} categories = moderation_details[:categories] || moderation_details["categories"] || [] stage = moderation_details[:moderation_stage] || moderation_details["moderation_stage"] hint = "This request did not meet safety requirements." if categories.include?("harassment") hint = "Remove abusive or targeting language and focus on neutral visual details." elsif stage == "input" hint = "Revise the prompt or input images, then submit the request again." elsif stage == "output" hint = "Change the prompt and generate again; the generated result was blocked." end warn("Image generation blocked (#{error.code}): #{hint}")end
Modelos compatíveis
Na API de respostas, o gpt-5 e os modelos mais recentes devem oferecer suporte à ferramenta de geração de imagens. Consulte a página de detalhes do modelo para confirmar se o modelo desejado pode usar a ferramenta.
Custo e latência
Custos do GPT-Image-2.6
A saída de imagem custa US$ 30 por milhão de tokens faturáveis. Use a calculadora para estimar o custo de saída de uma imagem.
As edições orientadas por anotações têm os mesmos preços por token que as demais edições, sem cobrança adicional. Para a saída em SVG, você paga pela imagem de referência conforme o preço do modelo de imagem. Pelos tokens usados para produzir o SVG, você paga o preço do modelo que gera o documento. O total depende da quantidade de tokens que cada modelo usa.
Custos do GPT-Image-2.5
Além do custo da geração de imagens, as solicitações à API de respostas incluem o consumo de tokens do modelo principal.
Os dois modelos GPT-Image-2.5 têm os mesmos preços por milhão de tokens: US$ 8 para imagens de entrada, US$ 2 para imagens de entrada em cache, US$ 30 para imagens de saída, US$ 5 para texto de entrada e US$ 1,25 para texto de entrada em cache. Consulte a tabela de preços.
Use o campo usage da resposta para medir o consumo de tokens com os prompts, tamanhos e níveis de qualidade que você escolher. Mesmo com preços idênticos por token, o custo por imagem pode variar, pois o consumo depende do modelo e do nível de qualidade. Para ver exemplos de preços de modelos anteriores, consulte Modelos GPT Image anteriores.
Preços de entradas em cache
Para o GPT-Image-2 e o GPT-Image-2.5, os preços de entradas em cache se aplicam apenas à ferramenta de geração de imagens da API de respostas. Eles não se aplicam a solicitações feitas diretamente à API de imagens, inclusive a /v1/images/edits.
A cobrança leva em conta as entradas de geração de imagens em cache, mas a API de respostas não inclui a contagem desses tokens na saída. Por isso, o campo usage da resposta não permite confirmar se essas entradas foram recuperadas do cache.
Cálculo de custos
Selecione o modelo, a qualidade e o tamanho para estimar a quantidade de tokens de saída e o custo da imagem de saída.
Para os modelos Sunburst e Flare, tanto no GPT-Image-2.6 quanto no GPT-Image-2.5, as opções de qualidade são low, medium, high, xhigh e max.
Para gpt-image-2, as opções são low, medium e high.
Os modelos podem consumir quantidades diferentes de tokens no mesmo nível de qualidade, mas o preço por token de imagem de saída é o mesmo.
Use valores explícitos de qualidade e tamanho para a estimativa. Com auto, o consumo depende da imagem gerada.
ModeloModeloGPT-Image-2.6 (Sunburst and Flare)
Qualidade
Tokens de saída
823
Custo estimado por imagem gerada
US$ 0,02469
Custo por imagem, calculado a US$ 30 por milhão de tokens de saída de imagem. O cálculo exclui os tokens de entrada de texto e de imagem e o envio de imagens parciais por streaming.
As informações a seguir se aplicam aos modelos anteriores e não abrangem o Sunburst nem o Flare. Em novas integrações, use GPT-Image-2.6 Sunburst ou Flare.
Configurações do GPT-Image-2 e fidelidade das imagens de entrada
O gpt-image-2 aceita qualquer resolução no parâmetro size, desde que ela atenda às restrições abaixo. Em geral, as imagens quadradas são as mais rápidas de gerar.
Tamanhos comuns
1024x1024 (quadrado)
1536x1024 (paisagem)
1024x1536 (retrato)
2048x2048 (quadrado em 2K)
2048x1152 (paisagem em 2K)
3840x2160 (paisagem em 4K)
2160x3840 (retrato em 4K)
auto (padrão)
Restrições de tamanho
O lado mais longo deve medir no máximo
3840px
O comprimento de cada lado deve ser múltiplo de 16px
A razão entre o lado mais longo e o mais curto não pode ultrapassar 3:1
O total de pixels deve ser de no mínimo 655,360 e no máximo
8,294,400
Opções de qualidade
low
medium
high
auto (padrão)
Fidelidade das imagens de entrada
O parâmetro input_fidelity controla o grau de preservação dos detalhes das imagens de entrada em edições e em fluxos que usam imagens de referência. Para gpt-image-2, omita esse parâmetro. A API não permite alterá-lo porque o modelo processa automaticamente todas as imagens de entrada com alta fidelidade.
Como o gpt-image-2 sempre processa imagens de entrada com alta fidelidade, as solicitações de edição que incluem imagens de referência podem consumir mais tokens de imagem de entrada. Para entender o impacto no custo, consulte a seção sobre custos de visão.
Exemplos de preços dos modelos anteriores
Modelos anteriores ao gpt-image-2
Para gerar imagens, os modelos GPT Image anteriores ao gpt-image-2 primeiro produzem tokens específicos para imagens. Tanto a latência quanto o custo final são proporcionais ao número de tokens necessários para renderizar a imagem. Imagens maiores e níveis de qualidade mais altos exigem mais tokens.
O número de tokens gerados depende das dimensões e da qualidade da imagem:
Qualidade
Quadrado (1024×1024)
Retrato (1024×1536)
Paisagem (1536×1024)
Baixa
272 tokens
408 tokens
400 tokens
Média
1.056 tokens
1.584 tokens
1.568 tokens
Alta
4.160 tokens
6.240 tokens
6.208 tokens
Você também precisa considerar os tokens de entrada: os tokens de texto do prompt e, em caso de edição, os tokens das imagens de entrada.
Como o gpt-image-2 sempre processa imagens de entrada com alta fidelidade, solicitações de edição que incluem imagens de referência podem consumir mais tokens de entrada.
Consulte a página de preços para ver os preços atuais dos tokens de texto e de imagem. Use a seção Cálculo de custos para estimar o custo das imagens de saída.
O custo final é a soma dos custos de:
tokens de texto de entrada
tokens de imagem de entrada, se você usar o endpoint de edição
tokens de imagem de saída
Custos históricos de saída
O gpt-image-2 aceita milhares de resoluções válidas. Para facilitar a comparação, a tabela abaixo mostra os mesmos tamanhos usados nos modelos GPT Image anteriores. Ela também inclui os preços históricos de saída por imagem do GPT-Image-1.5, do GPT-Image-1 e do GPT-Image-1 Mini. Ao estimar o custo total de uma solicitação, inclua também os tokens de texto e de imagem de entrada.
O gpt-image-1 foi desativado em 23 de outubro de 2026. Os preços desse modelo foram mantidos abaixo para comparação histórica. Consulte o aviso de descontinuação para ver os modelos que podem substituí-lo.
No mesmo nível de qualidade, uma imagem maior e não quadrada pode, em alguns casos, gerar menos tokens de saída do que uma imagem menor ou quadrada.