|
18 | 18 | NAME = module.name(__file__, NAME) |
19 | 19 |
|
20 | 20 |
|
21 | | -class OpenAIImageGenerator: |
22 | | - def __init__( |
23 | | - self, |
24 | | - model="dall-e-3", |
25 | | - verbose: bool = False, |
26 | | - ): |
27 | | - assert env.OPENAI_API_KEY |
28 | | - |
29 | | - self.client = OpenAI(api_key=env.OPENAI_API_KEY) |
30 | | - self.verbose = verbose |
31 | | - self.model = model |
32 | | - logger.info( |
33 | | - "{}[{}]".format( |
34 | | - self.__class__.__name__, |
35 | | - self.model, |
36 | | - ) |
| 21 | +def generate_image( |
| 22 | + prompt: str, |
| 23 | + filename: str, |
| 24 | + object_name: str, |
| 25 | + model="dall-e-3", |
| 26 | + sign: bool = True, |
| 27 | + line_width: int = 80, |
| 28 | + quality: str = "standard", |
| 29 | + size: str = "1024x1024", |
| 30 | + sign_with_prompt: bool = True, |
| 31 | + footer: List[str] = [], |
| 32 | + verbose: bool = False, |
| 33 | +) -> Tuple[bool, Any]: |
| 34 | + assert env.OPENAI_API_KEY |
| 35 | + |
| 36 | + client = OpenAI(api_key=env.OPENAI_API_KEY) |
| 37 | + |
| 38 | + full_filename = objects.path_of( |
| 39 | + filename=filename, |
| 40 | + object_name=object_name, |
| 41 | + ) |
| 42 | + |
| 43 | + logger.info( |
| 44 | + "{}.generate_image: {} -> {}/{}".format( |
| 45 | + NAME, |
| 46 | + prompt, |
| 47 | + object_name, |
| 48 | + filename, |
37 | 49 | ) |
38 | | - |
39 | | - def generate( |
40 | | - self, |
41 | | - prompt: str, |
42 | | - filename: str = "", |
43 | | - sign: bool = True, |
44 | | - line_width: int = 80, |
45 | | - quality: str = "standard", |
46 | | - size: str = "1024x1024", |
47 | | - sign_with_prompt: bool = True, |
48 | | - footer: List[str] = [], |
49 | | - ) -> Tuple[bool, Any]: |
50 | | - object_name = path.name(file.path(filename)) |
51 | | - |
52 | | - logger.info( |
53 | | - "{}.generate: {} -> {}/{}".format( |
54 | | - self.__class__.__name__, |
55 | | - prompt, |
56 | | - object_name, |
57 | | - file.name_and_extension(filename), |
58 | | - ) |
| 50 | + ) |
| 51 | + |
| 52 | + response = client.images.generate( |
| 53 | + model=model, |
| 54 | + prompt=prompt, |
| 55 | + size=size, |
| 56 | + quality=quality, |
| 57 | + n=1, |
| 58 | + ) |
| 59 | + |
| 60 | + logger.info(json.dumps(response.model_dump(), indent=4)) |
| 61 | + |
| 62 | + success = file.download(response.data[0].url, full_filename) |
| 63 | + |
| 64 | + if success and sign: |
| 65 | + success, image = file.load_image(full_filename) |
| 66 | + |
| 67 | + if success and sign: |
| 68 | + success = sign_filename( |
| 69 | + filename=full_filename, |
| 70 | + header=[ |
| 71 | + " | ".join( |
| 72 | + objects.signature( |
| 73 | + info=filename, |
| 74 | + object_name=object_name, |
| 75 | + ) |
| 76 | + + [ |
| 77 | + string.pretty_shape_of_matrix(image), |
| 78 | + f"quality: {quality}", |
| 79 | + ] |
| 80 | + ), |
| 81 | + ], |
| 82 | + footer=[ |
| 83 | + " | ".join( |
| 84 | + footer |
| 85 | + + ([f"prompt: {prompt}"] if sign_with_prompt else []) |
| 86 | + + ( |
| 87 | + [f"revised prompt: {str(response.data[0].revised_prompt)}"] |
| 88 | + if verbose |
| 89 | + else [] |
| 90 | + ) |
| 91 | + + [f"model: {model}"] |
| 92 | + + signature() |
| 93 | + ), |
| 94 | + ], |
| 95 | + line_width=line_width, |
59 | 96 | ) |
60 | 97 |
|
61 | | - response = self.client.images.generate( |
62 | | - model=self.model, |
63 | | - prompt=prompt, |
64 | | - size=size, |
65 | | - quality=quality, |
66 | | - n=1, |
67 | | - ) |
| 98 | + if success and verbose and is_jupyter(): |
| 99 | + display(Image(filename=full_filename)) |
68 | 100 |
|
69 | | - logger.info(json.dumps(response.model_dump(), indent=4)) |
70 | | - |
71 | | - success = file.download(response.data[0].url, filename) if filename else True |
72 | | - |
73 | | - if success and sign: |
74 | | - success, image = file.load_image(filename) |
75 | | - |
76 | | - if success and sign: |
77 | | - success = sign_filename( |
78 | | - filename=filename, |
79 | | - header=[ |
80 | | - " | ".join( |
81 | | - objects.signature( |
82 | | - info=file.name_and_extension(filename), |
83 | | - object_name=object_name, |
84 | | - ) |
85 | | - + [ |
86 | | - string.pretty_shape_of_matrix(image), |
87 | | - f"quality: {quality}", |
88 | | - ] |
89 | | - ), |
90 | | - ], |
91 | | - footer=[ |
92 | | - " | ".join( |
93 | | - footer |
94 | | - + ([f"prompt: {prompt}"] if sign_with_prompt else []) |
95 | | - + ( |
96 | | - [f"revised prompt: {str(response.data[0].revised_prompt)}"] |
97 | | - if self.verbose |
98 | | - else [] |
99 | | - ) |
100 | | - + [ |
101 | | - f"model: {self.model}", |
102 | | - ] |
103 | | - + signature() |
104 | | - ), |
105 | | - ], |
106 | | - line_width=line_width, |
107 | | - ) |
108 | | - |
109 | | - if success and self.verbose and is_jupyter(): |
110 | | - display(Image(filename=filename)) |
111 | | - |
112 | | - return ( |
113 | | - success, |
114 | | - response, |
115 | | - ) |
| 101 | + return ( |
| 102 | + success, |
| 103 | + response, |
| 104 | + ) |
0 commit comments