通过 /v1/images/generations 端点生成图片
(
self,
prompt: str,
aspect_ratio: str,
model: str,
reference_image: Optional[bytes] = None,
reference_images: Optional[List[bytes]] = None
)
| 89 | return self._generate_via_images_api(prompt, aspect_ratio, model, reference_image, reference_images) |
| 90 | |
| 91 | def _generate_via_images_api( |
| 92 | self, |
| 93 | prompt: str, |
| 94 | aspect_ratio: str, |
| 95 | model: str, |
| 96 | reference_image: Optional[bytes] = None, |
| 97 | reference_images: Optional[List[bytes]] = None |
| 98 | ) -> bytes: |
| 99 | """通过 /v1/images/generations 端点生成图片""" |
| 100 | headers = { |
| 101 | "Authorization": f"Bearer {self.api_key}", |
| 102 | "Content-Type": "application/json" |
| 103 | } |
| 104 | |
| 105 | payload = { |
| 106 | "model": model, |
| 107 | "prompt": prompt, |
| 108 | "aspect_ratio": aspect_ratio, |
| 109 | "image_size": self.image_size |
| 110 | } |
| 111 | |
| 112 | # 收集所有参考图片 |
| 113 | all_reference_images = [] |
| 114 | if reference_images and len(reference_images) > 0: |
| 115 | all_reference_images.extend(reference_images) |
| 116 | if reference_image and reference_image not in all_reference_images: |
| 117 | all_reference_images.append(reference_image) |
| 118 | |
| 119 | # 如果有参考图片,添加到 image 数组 |
| 120 | if all_reference_images: |
| 121 | logger.debug(f" 添加 {len(all_reference_images)} 张参考图片") |
| 122 | image_uris = [] |
| 123 | for idx, img_data in enumerate(all_reference_images): |
| 124 | compressed_img = compress_image(img_data, max_size_kb=200) |
| 125 | logger.debug(f" 参考图 {idx}: {len(img_data)} -> {len(compressed_img)} bytes") |
| 126 | base64_image = base64.b64encode(compressed_img).decode('utf-8') |
| 127 | data_uri = f"data:image/png;base64,{base64_image}" |
| 128 | image_uris.append(data_uri) |
| 129 | |
| 130 | payload["image"] = image_uris |
| 131 | |
| 132 | ref_count = len(all_reference_images) |
| 133 | enhanced_prompt = f"""参考提供的 {ref_count} 张图片的风格(色彩、光影、构图、氛围),生成一张新图片。 |
| 134 | |
| 135 | 新图片内容:{prompt} |
| 136 | |
| 137 | 要求: |
| 138 | 1. 保持相似的色调和氛围 |
| 139 | 2. 使用相似的光影处理 |
| 140 | 3. 保持一致的画面质感 |
| 141 | 4. 如果参考图中有人物或产品,可以适当融入""" |
| 142 | payload["prompt"] = enhanced_prompt |
| 143 | |
| 144 | return self.client.generate_via_images(payload) |
| 145 | |
| 146 | def _generate_via_chat_api( |
| 147 | self, |
no test coverage detected