110 f.write(image_bytes)110 f.write(image_bytes)
111```111```
112 112
113```go
114package main
115
116import (
117 "context"
118 "encoding/base64"
119 "os"
120
121 "github.com/openai/openai-go/v3"
122)
123
124func main() {
125 client := openai.NewClient()
126 result, err := client.Images.Generate(context.Background(), openai.ImageGenerateParams{
127 Model: openai.ImageModel("gpt-image-2"),
128 Prompt: "A children's book drawing of a veterinarian using a stethoscope to " +
129 "listen to the heartbeat of a baby otter.",
130 })
131 if err != nil {
132 panic(err)
133 }
134 image, err := base64.StdEncoding.DecodeString(result.Data[0].B64JSON)
135 if err != nil {
136 panic(err)
137 }
138 if err := os.WriteFile("otter.png", image, 0o600); err != nil {
139 panic(err)
140 }
141}
142```
143
113```bash144```bash
114curl -X POST "https://api.openai.com/v1/images/generations" \145curl -X POST "https://api.openai.com/v1/images/generations" \
115 -H "Authorization: Bearer $OPENAI_API_KEY" \146 -H "Authorization: Bearer $OPENAI_API_KEY" \
185 f.write(base64.b64decode(image_base64))216 f.write(base64.b64decode(image_base64))
186```217```
187 218
219```go
220package main
221
222import (
223 "context"
224 "encoding/base64"
225 "os"
226
227 "github.com/openai/openai-go/v3"
228 "github.com/openai/openai-go/v3/responses"
229)
230
231func main() {
232 client := openai.NewClient()
233 response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
234 Model: "gpt-5.6",
235 Input: responses.ResponseNewParamsInputUnion{
236 OfString: openai.String("Generate an image of gray tabby cat hugging an otter with an orange scarf"),
237 },
238 Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{}}},
239 })
240 if err != nil {
241 panic(err)
242 }
243 saveFirstGeneratedImage(response, "otter.png")
244}
245
246func saveFirstGeneratedImage(response *responses.Response, filename string) {
247 for _, output := range response.Output {
248 if output.Type != "image_generation_call" {
249 continue
250 }
251 image, err := base64.StdEncoding.DecodeString(output.AsImageGenerationCall().Result)
252 if err != nil {
253 panic(err)
254 }
255 if err := os.WriteFile(filename, image, 0o600); err != nil {
256 panic(err)
257 }
258 return
259 }
260 panic("response did not include an image generation call")
261}
262```
263
188 264
189 265
190### Multi-turn image generation266### Multi-turn image generation
244 f.write(base64.b64decode(image_base64))320 f.write(base64.b64decode(image_base64))
245```321```
246 322
323```go
324package main
325
326import (
327 "context"
328 "encoding/base64"
329 "os"
330
331 "github.com/openai/openai-go/v3"
332 "github.com/openai/openai-go/v3/responses"
333)
334
335func main() {
336 client := openai.NewClient()
337 response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
338 Model: "gpt-5.6",
339 Input: responses.ResponseNewParamsInputUnion{
340 OfString: openai.String("Generate an image of gray tabby cat hugging an otter with an orange scarf"),
341 },
342 Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{Action: "generate"}}},
343 })
344 if err != nil {
345 panic(err)
346 }
347 for _, output := range response.Output {
348 if output.Type != "image_generation_call" {
349 continue
350 }
351 image, err := base64.StdEncoding.DecodeString(output.AsImageGenerationCall().Result)
352 if err != nil {
353 panic(err)
354 }
355 if err := os.WriteFile("otter.png", image, 0o600); err != nil {
356 panic(err)
357 }
358 return
359 }
360 panic("response did not include an image generation call")
361}
362```
363
247 364
248If you force `edit` without providing an image in context, the call will return an error. Leave `action` at `auto` to have the model decide when to generate or edit.365If you force `edit` without providing an image in context, the call will return an error. Leave `action` at `auto` to have the model decide when to generate or edit.
249 366
343 f.write(base64.b64decode(image_base64))460 f.write(base64.b64decode(image_base64))
344```461```
345 462
463```go
464package main
465
466import (
467 "context"
468 "encoding/base64"
469 "os"
470
471 "github.com/openai/openai-go/v3"
472 "github.com/openai/openai-go/v3/responses"
473)
474
475func main() {
476 client := openai.NewClient()
477 first, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
478 Model: "gpt-5.6",
479 Input: responses.ResponseNewParamsInputUnion{
480 OfString: openai.String("Generate an image of gray tabby cat hugging an otter with an orange scarf"),
481 },
482 Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{}}},
483 })
484 if err != nil {
485 panic(err)
486 }
487 saveFirstGeneratedImage(first, "cat_and_otter.png")
488
489 followUp, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
490 Model: "gpt-5.6",
491 PreviousResponseID: openai.String(first.ID),
492 Input: responses.ResponseNewParamsInputUnion{
493 OfString: openai.String("Now make it look realistic"),
494 },
495 Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{}}},
496 })
497 if err != nil {
498 panic(err)
499 }
500 saveFirstGeneratedImage(followUp, "cat_and_otter_realistic.png")
501}
502
503func saveFirstGeneratedImage(response *responses.Response, filename string) {
504 for _, output := range response.Output {
505 if output.Type != "image_generation_call" {
506 continue
507 }
508 image, err := base64.StdEncoding.DecodeString(output.AsImageGenerationCall().Result)
509 if err != nil {
510 panic(err)
511 }
512 if err := os.WriteFile(filename, image, 0o600); err != nil {
513 panic(err)
514 }
515 return
516 }
517 panic("response did not include an image generation call")
518}
519```
520
346 521
347 522
348 523
458 f.write(base64.b64decode(image_base64))633 f.write(base64.b64decode(image_base64))
459```634```
460 635
636```go
637package main
638
639import (
640 "context"
641 "encoding/base64"
642 "encoding/json"
643 "os"
644
645 "github.com/openai/openai-go/v3"
646 "github.com/openai/openai-go/v3/responses"
647)
648
649func main() {
650 client := openai.NewClient()
651 first, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
652 Model: "gpt-5.6",
653 Input: responses.ResponseNewParamsInputUnion{
654 OfString: openai.String("Generate an image of gray tabby cat hugging an otter with an orange scarf"),
655 },
656 Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{}}},
657 })
658 if err != nil {
659 panic(err)
660 }
661 call := firstImageGenerationCall(first)
662 saveImage("cat_and_otter.png", call.Result)
663 input := outputAsInput(first.Output)
664 input = append(input, responses.ResponseInputItemParamOfMessage(
665 responses.ResponseInputMessageContentListParam{responses.ResponseInputContentParamOfInputText("Now make it look realistic")},
666 responses.EasyInputMessageRoleUser,
667 ))
668
669 followUp, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
670 Model: "gpt-5.6",
671 Input: responses.ResponseNewParamsInputUnion{OfInputItemList: input},
672 Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{}}},
673 })
674 if err != nil {
675 panic(err)
676 }
677 saveImage("cat_and_otter_realistic.png", firstImageGenerationCall(followUp).Result)
678}
679
680func firstImageGenerationCall(response *responses.Response) responses.ResponseOutputItemImageGenerationCall {
681 for _, output := range response.Output {
682 if output.Type == "image_generation_call" {
683 return output.AsImageGenerationCall()
684 }
685 }
686 panic("response did not include an image generation call")
687}
688
689func outputAsInput(output []responses.ResponseOutputItemUnion) []responses.ResponseInputItemUnionParam {
690 input := make([]responses.ResponseInputItemUnionParam, 0, len(output))
691 for _, item := range output {
692 var converted responses.ResponseInputItemUnion
693 if err := json.Unmarshal([]byte(item.RawJSON()), &converted); err != nil {
694 panic(err)
695 }
696 input = append(input, converted.ToParam())
697 }
698 return input
699}
700
701func saveImage(filename, encoded string) {
702 image, err := base64.StdEncoding.DecodeString(encoded)
703 if err != nil {
704 panic(err)
705 }
706 if err := os.WriteFile(filename, image, 0o600); err != nil {
707 panic(err)
708 }
709}
710```
711
461 712
462 713
463#### Result714#### Result
584 save_base64_image("river-final.png", image_data[0])835 save_base64_image("river-final.png", image_data[0])
585```836```
586 837
838```go
839package main
840
841import (
842 "context"
843 "encoding/base64"
844 "fmt"
845 "os"
846
847 "github.com/openai/openai-go/v3"
848 "github.com/openai/openai-go/v3/responses"
849)
850
851func main() {
852 client := openai.NewClient()
853 stream := client.Responses.NewStreaming(context.Background(), responses.ResponseNewParams{
854 Model: "gpt-5.6",
855 Input: responses.ResponseNewParamsInputUnion{
856 OfString: openai.String("Draw a gorgeous image of a river made of white owl feathers, snaking its way through a serene winter landscape"),
857 },
858 Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{PartialImages: openai.Int(2)}}},
859 })
860 for stream.Next() {
861 event := stream.Current()
862 if event.Type == "response.image_generation_call.partial_image" {
863 partial := event.AsResponseImageGenerationCallPartialImage()
864 saveImage(fmt.Sprintf("river-partial-%d.png", partial.PartialImageIndex), partial.PartialImageB64)
865 }
866 if event.Type == "response.completed" {
867 for _, output := range event.AsResponseCompleted().Response.Output {
868 if output.Type == "image_generation_call" {
869 saveImage("river-final.png", output.AsImageGenerationCall().Result)
870 }
871 }
872 }
873 }
874 if err := stream.Err(); err != nil {
875 panic(err)
876 }
877}
878
879func saveImage(filename, encoded string) {
880 image, err := base64.StdEncoding.DecodeString(encoded)
881 if err != nil {
882 panic(err)
883 }
884 if err := os.WriteFile(filename, image, 0o600); err != nil {
885 panic(err)
886 }
887}
888```
889
587 890
588 891
589 892
640 f.write(image_bytes)943 f.write(image_bytes)
641```944```
642 945
946```go
947package main
948
949import (
950 "context"
951 "encoding/base64"
952 "fmt"
953 "os"
954
955 "github.com/openai/openai-go/v3"
956)
957
958func main() {
959 client := openai.NewClient()
960 stream := client.Images.GenerateStreaming(context.Background(), openai.ImageGenerateParams{
961 Model: openai.ImageModel("gpt-image-2"),
962 Prompt: "Draw a gorgeous image of a river made of white owl feathers, snaking its way through a serene winter landscape",
963 PartialImages: openai.Int(2),
964 })
965 for stream.Next() {
966 event := stream.Current()
967 if event.Type != "image_generation.partial_image" {
968 continue
969 }
970 partial := event.AsImageGenerationPartialImage()
971 saveImage(fmt.Sprintf("river%d.png", partial.PartialImageIndex), partial.B64JSON)
972 }
973 if err := stream.Err(); err != nil {
974 panic(err)
975 }
976}
977
978func saveImage(filename, encoded string) {
979 image, err := base64.StdEncoding.DecodeString(encoded)
980 if err != nil {
981 panic(err)
982 }
983 if err := os.WriteFile(filename, image, 0o600); err != nil {
984 panic(err)
985 }
986}
987```
988
643 989
644 990
645#### Result991#### Result
739 return result.id1085 return result.id
740```1086```
741 1087
1088```go
1089package main
1090
1091import (
1092 "context"
1093 "fmt"
1094 "os"
1095
1096 "github.com/openai/openai-go/v3"
1097)
1098
1099func main() {
1100 client := openai.NewClient()
1101 file, err := os.Open("image.png")
1102 if err != nil {
1103 panic(err)
1104 }
1105 defer file.Close()
1106
1107 uploaded, err := client.Files.New(context.Background(), openai.FileNewParams{
1108 File: file,
1109 Purpose: openai.FilePurposeVision,
1110 })
1111 if err != nil {
1112 panic(err)
1113 }
1114 fmt.Println(uploaded.ID)
1115}
1116```
1117
742 1118
743#### Create a base64 encoded image1119#### Create a base64 encoded image
744 1120
763 return base64_image1139 return base64_image
764```1140```
765 1141
1142```go
1143package main
1144
1145import (
1146 "encoding/base64"
1147 "fmt"
1148 "os"
1149)
1150
1151func main() {
1152 image, err := os.ReadFile("image.png")
1153 if err != nil {
1154 panic(err)
1155 }
1156 fmt.Println(base64.StdEncoding.EncodeToString(image))
1157}
1158```
1159
766 1160
767Edit an image1161Edit an image
768 1162
908 print(response.output_text)1302 print(response.output_text)
909```1303```
910 1304
1305```go
1306package main
1307
1308import (
1309 "context"
1310 "encoding/base64"
1311 "os"
1312
1313 "github.com/openai/openai-go/v3"
1314 "github.com/openai/openai-go/v3/responses"
1315)
1316
1317func main() {
1318 client := openai.NewClient()
1319 bathBombID := uploadImage(client, "bath-bomb.png")
1320 incenseKitID := uploadImage(client, "incense-kit.png")
1321
1322 response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
1323 Model: "gpt-5.6",
1324 Input: responses.ResponseNewParamsInputUnion{OfInputItemList: responses.ResponseInputParam{
1325 responses.ResponseInputItemParamOfMessage(
1326 responses.ResponseInputMessageContentListParam{
1327 responses.ResponseInputContentParamOfInputText("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."),
1328 {OfInputImage: &responses.ResponseInputImageParam{ImageURL: openai.String(dataURL("body-lotion.png")), Detail: responses.ResponseInputImageDetailAuto}},
1329 {OfInputImage: &responses.ResponseInputImageParam{ImageURL: openai.String(dataURL("soap.png")), Detail: responses.ResponseInputImageDetailAuto}},
1330 {OfInputImage: &responses.ResponseInputImageParam{FileID: openai.String(bathBombID), Detail: responses.ResponseInputImageDetailAuto}},
1331 {OfInputImage: &responses.ResponseInputImageParam{FileID: openai.String(incenseKitID), Detail: responses.ResponseInputImageDetailAuto}},
1332 },
1333 responses.EasyInputMessageRoleUser,
1334 ),
1335 }},
1336 Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{}}},
1337 })
1338 if err != nil {
1339 panic(err)
1340 }
1341 saveFirstGeneratedImage(response, "gift-basket.png")
1342}
1343
1344func uploadImage(client openai.Client, filename string) string {
1345 file, err := os.Open(filename)
1346 if err != nil {
1347 panic(err)
1348 }
1349 defer file.Close()
1350 uploaded, err := client.Files.New(context.Background(), openai.FileNewParams{File: file, Purpose: openai.FilePurposeVision})
1351 if err != nil {
1352 panic(err)
1353 }
1354 return uploaded.ID
1355}
1356
1357func dataURL(filename string) string {
1358 image, err := os.ReadFile(filename)
1359 if err != nil {
1360 panic(err)
1361 }
1362 return "data:image/png;base64," + base64.StdEncoding.EncodeToString(image)
1363}
1364
1365func saveFirstGeneratedImage(response *responses.Response, filename string) {
1366 for _, output := range response.Output {
1367 if output.Type != "image_generation_call" {
1368 continue
1369 }
1370 image, err := base64.StdEncoding.DecodeString(output.AsImageGenerationCall().Result)
1371 if err != nil {
1372 panic(err)
1373 }
1374 if err := os.WriteFile(filename, image, 0o600); err != nil {
1375 panic(err)
1376 }
1377 return
1378 }
1379 panic("response did not include an image generation call")
1380}
1381```
1382
911 1383
912 1384
913 1385
989 f.write(image_bytes)1461 f.write(image_bytes)
990```1462```
991 1463
1464```go
1465package main
1466
1467import (
1468 "context"
1469 "encoding/base64"
1470 "io"
1471 "os"
1472
1473 "github.com/openai/openai-go/v3"
1474)
1475
1476func main() {
1477 client := openai.NewClient()
1478 files, closeFiles := openImages(
1479 "bath-bomb.png",
1480 "body-lotion.png",
1481 "incense-kit.png",
1482 "soap.png",
1483 )
1484 defer closeFiles()
1485
1486 response, err := client.Images.Edit(context.Background(), openai.ImageEditParams{
1487 Model: openai.ImageModel("gpt-image-2"),
1488 Image: openai.ImageEditParamsImageUnion{OfFileArray: files},
1489 Prompt: "Generate a photorealistic image of a gift basket on a white background " +
1490 "labeled 'Relax & Unwind' with a ribbon and handwriting-like font, containing all the items in the reference pictures.",
1491 })
1492 if err != nil {
1493 panic(err)
1494 }
1495 saveImage("basket.png", response.Data[0].B64JSON)
1496}
1497
1498func openImages(names ...string) ([]io.Reader, func()) {
1499 images := make([]io.Reader, 0, len(names))
1500 files := make([]*os.File, 0, len(names))
1501 for _, name := range names {
1502 file, err := os.Open(name)
1503 if err != nil {
1504 closeFiles(files)
1505 panic(err)
1506 }
1507 images = append(images, openai.File(file, name, "image/png"))
1508 files = append(files, file)
1509 }
1510 return images, func() { closeFiles(files) }
1511}
1512
1513func closeFiles(files []*os.File) {
1514 for _, file := range files {
1515 if err := file.Close(); err != nil {
1516 panic(err)
1517 }
1518 }
1519}
1520
1521func saveImage(filename, encoded string) {
1522 image, err := base64.StdEncoding.DecodeString(encoded)
1523 if err != nil {
1524 panic(err)
1525 }
1526 if err := os.WriteFile(filename, image, 0o600); err != nil {
1527 panic(err)
1528 }
1529}
1530```
1531
992```bash1532```bash
993curl -s -D >(grep -i x-request-id >&2) \1533curl -s -D >(grep -i x-request-id >&2) \
994 -o >(jq -r '.data[0].b64_json' | base64 --decode > gift-basket.png) \1534 -o >(jq -r '.data[0].b64_json' | base64 --decode > gift-basket.png) \
1145 f.write(base64.b64decode(image_base64))1685 f.write(base64.b64decode(image_base64))
1146```1686```
1147 1687
1688```go
1689package main
1690
1691import (
1692 "context"
1693 "encoding/base64"
1694 "os"
1695
1696 "github.com/openai/openai-go/v3"
1697 "github.com/openai/openai-go/v3/responses"
1698)
1699
1700func main() {
1701 client := openai.NewClient()
1702 imageID := uploadImage(client, "sunlit_lounge.png")
1703 maskID := uploadImage(client, "mask.png")
1704 response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
1705 Model: "gpt-5.6",
1706 Input: responses.ResponseNewParamsInputUnion{OfInputItemList: responses.ResponseInputParam{
1707 responses.ResponseInputItemParamOfMessage(
1708 responses.ResponseInputMessageContentListParam{
1709 responses.ResponseInputContentParamOfInputText("Generate an image of the same sunlit indoor lounge area with a pool, but the pool should contain a flamingo."),
1710 {OfInputImage: &responses.ResponseInputImageParam{FileID: openai.String(imageID), Detail: responses.ResponseInputImageDetailAuto}},
1711 },
1712 responses.EasyInputMessageRoleUser,
1713 ),
1714 }},
1715 Tools: []responses.ToolUnionParam{{OfImageGeneration: &responses.ToolImageGenerationParam{
1716 Quality: "high",
1717 InputImageMask: responses.ToolImageGenerationInputImageMaskParam{FileID: openai.String(maskID)},
1718 }}},
1719 })
1720 if err != nil {
1721 panic(err)
1722 }
1723 saveFirstGeneratedImage(response, "lounge.png")
1724}
1725
1726func uploadImage(client openai.Client, filename string) string {
1727 file, err := os.Open(filename)
1728 if err != nil {
1729 panic(err)
1730 }
1731 defer file.Close()
1732 uploaded, err := client.Files.New(context.Background(), openai.FileNewParams{File: file, Purpose: openai.FilePurposeVision})
1733 if err != nil {
1734 panic(err)
1735 }
1736 return uploaded.ID
1737}
1738
1739func saveFirstGeneratedImage(response *responses.Response, filename string) {
1740 for _, output := range response.Output {
1741 if output.Type != "image_generation_call" {
1742 continue
1743 }
1744 image, err := base64.StdEncoding.DecodeString(output.AsImageGenerationCall().Result)
1745 if err != nil {
1746 panic(err)
1747 }
1748 if err := os.WriteFile(filename, image, 0o600); err != nil {
1749 panic(err)
1750 }
1751 return
1752 }
1753 panic("response did not include an image generation call")
1754}
1755```
1756
1148 1757
1149 1758
1150 1759
1198 f.write(image_bytes)1807 f.write(image_bytes)
1199```1808```
1200 1809
1810```go
1811package main
1812
1813import (
1814 "context"
1815 "encoding/base64"
1816 "os"
1817
1818 "github.com/openai/openai-go/v3"
1819)
1820
1821func main() {
1822 client := openai.NewClient()
1823 image, err := os.Open("sunlit_lounge.png")
1824 if err != nil {
1825 panic(err)
1826 }
1827 defer image.Close()
1828 mask, err := os.Open("mask.png")
1829 if err != nil {
1830 panic(err)
1831 }
1832 defer mask.Close()
1833
1834 response, err := client.Images.Edit(context.Background(), openai.ImageEditParams{
1835 Model: openai.ImageModel("gpt-image-2"),
1836 Image: openai.ImageEditParamsImageUnion{OfFile: openai.File(image, "sunlit_lounge.png", "image/png")},
1837 Mask: openai.File(mask, "mask.png", "image/png"),
1838 Prompt: "A sunlit indoor lounge area with a pool containing a flamingo",
1839 })
1840 if err != nil {
1841 panic(err)
1842 }
1843 result, err := base64.StdEncoding.DecodeString(response.Data[0].B64JSON)
1844 if err != nil {
1845 panic(err)
1846 }
1847 if err := os.WriteFile("lounge.png", result, 0o600); err != nil {
1848 panic(err)
1849 }
1850}
1851```
1852
1201```bash1853```bash
1202curl -s -D >(grep -i x-request-id >&2) \1854curl -s -D >(grep -i x-request-id >&2) \
1203 -o >(jq -r '.data[0].b64_json' | base64 --decode > lounge.png) \1855 -o >(jq -r '.data[0].b64_json' | base64 --decode > lounge.png) \
1271 f.write(mask_bytes)1923 f.write(mask_bytes)
1272```1924```
1273 1925
1926```go
1927package main
1928
1929import (
1930 "image"
1931 "image/color"
1932 "image/png"
1933 "os"
1934)
1935
1936func main() {
1937 file, err := os.Open("mask.png")
1938 if err != nil {
1939 panic(err)
1940 }
1941 defer file.Close()
1942
1943 mask, _, err := image.Decode(file)
1944 if err != nil {
1945 panic(err)
1946 }
1947 bounds := mask.Bounds()
1948 withAlpha := image.NewNRGBA(bounds)
1949 for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
1950 for x := bounds.Min.X; x < bounds.Max.X; x++ {
1951 gray := color.GrayModel.Convert(mask.At(x, y)).(color.Gray)
1952 withAlpha.SetNRGBA(x, y, color.NRGBA{R: gray.Y, G: gray.Y, B: gray.Y, A: gray.Y})
1953 }
1954 }
1955
1956 output, err := os.Create("mask_alpha.png")
1957 if err != nil {
1958 panic(err)
1959 }
1960 if err := png.Encode(output, withAlpha); err != nil {
1961 panic(err)
1962 }
1963 if err := output.Close(); err != nil {
1964 panic(err)
1965 }
1966}
1967```
1968
1274 1969
1275### Image input fidelity1970### Image input fidelity
1276 1971
1537 print(hint)2232 print(hint)
1538```2233```
1539 2234
2235```go
2236package main
2237
2238import (
2239 "context"
2240 "encoding/json"
2241 "errors"
2242 "fmt"
2243 "slices"
2244
2245 "github.com/openai/openai-go/v3"
2246)
2247
2248func main() {
2249 client := openai.NewClient()
2250 _, err := client.Images.Generate(context.Background(), openai.ImageGenerateParams{
2251 Model: openai.ImageModel("gpt-image-2"),
2252 Prompt: "Create a poster humiliating my coworker with insulting captions",
2253 })
2254 if err == nil {
2255 return
2256 }
2257
2258 var apiError *openai.Error
2259 if !errors.As(err, &apiError) || apiError.Code != "moderation_blocked" {
2260 panic(err)
2261 }
2262
2263 var body struct {
2264 ModerationDetails struct {
2265 Categories []string `json:"categories"`
2266 ModerationStage string `json:"moderation_stage"`
2267 } `json:"moderation_details"`
2268 }
2269 if err := json.Unmarshal([]byte(apiError.RawJSON()), &body); err != nil {
2270 panic(err)
2271 }
2272
2273 hint := "This request could not be completed because it did not meet safety requirements."
2274 if slices.Contains(body.ModerationDetails.Categories, "harassment") {
2275 hint = "Try removing abusive or targeting language and focus on neutral visual details instead."
2276 } else if body.ModerationDetails.ModerationStage == "input" {
2277 hint = "Try revising the prompt or input images and submit the request again."
2278 } else if body.ModerationDetails.ModerationStage == "output" {
2279 hint = "The generated result was blocked by a safety check. Try changing the prompt and generating again."
2280 }
2281
2282 fmt.Printf("Image generation blocked (%s): %s\n", apiError.Code, hint)
2283}
2284```
2285
1540 2286
1541### Supported models2287### Supported models
1542 2288