生成图片(生成器,支持 SSE 流式返回) 优化版本:先生成封面,然后并发生成其他页面 Args: pages: 页面列表 task_id: 任务 ID(可选) full_outline: 完整的大纲文本(用于保持风格一致) user_images: 用户上传的参考图片列表(可选) user_topic: 用户原始输入(用于保持意图一致) Yields: 进度事件字典
(
self,
pages: list,
task_id: str = None,
full_outline: str = "",
user_images: Optional[List[bytes]] = None,
user_topic: str = "",
record_id: Optional[str] = None,
force: bool = False
)
| 245 | return (index, False, None, error_msg) |
| 246 | |
| 247 | def generate_images( |
| 248 | self, |
| 249 | pages: list, |
| 250 | task_id: str = None, |
| 251 | full_outline: str = "", |
| 252 | user_images: Optional[List[bytes]] = None, |
| 253 | user_topic: str = "", |
| 254 | record_id: Optional[str] = None, |
| 255 | force: bool = False |
| 256 | ) -> Generator[Dict[str, Any], None, None]: |
| 257 | """ |
| 258 | 生成图片(生成器,支持 SSE 流式返回) |
| 259 | 优化版本:先生成封面,然后并发生成其他页面 |
| 260 | |
| 261 | Args: |
| 262 | pages: 页面列表 |
| 263 | task_id: 任务 ID(可选) |
| 264 | full_outline: 完整的大纲文本(用于保持风格一致) |
| 265 | user_images: 用户上传的参考图片列表(可选) |
| 266 | user_topic: 用户原始输入(用于保持意图一致) |
| 267 | |
| 268 | Yields: |
| 269 | 进度事件字典 |
| 270 | """ |
| 271 | if record_id and not force: |
| 272 | cached_events = self.get_cached_generation_events(record_id, pages) |
| 273 | if cached_events: |
| 274 | for event in cached_events: |
| 275 | yield event |
| 276 | return |
| 277 | |
| 278 | if task_id is None and record_id: |
| 279 | record = self.history_service.get_record(record_id, sync_images=True) |
| 280 | task_id = record.get("images", {}).get("task_id") if record else None |
| 281 | |
| 282 | if task_id is None: |
| 283 | task_id = f"task_{uuid.uuid4().hex[:8]}" |
| 284 | |
| 285 | logger.info(f"开始图片生成任务: task_id={task_id}, pages={len(pages)}") |
| 286 | |
| 287 | # 创建任务专属目录 |
| 288 | self.current_task_dir = os.path.join(self.history_root_dir, task_id) |
| 289 | os.makedirs(self.current_task_dir, exist_ok=True) |
| 290 | logger.debug(f"任务目录: {self.current_task_dir}") |
| 291 | |
| 292 | total = len(pages) |
| 293 | generated_images = [""] * total |
| 294 | failed_pages = [] |
| 295 | cover_image_data = None |
| 296 | |
| 297 | # 压缩用户上传的参考图到200KB以内(减少内存和传输开销) |
| 298 | compressed_user_images = None |
| 299 | if user_images: |
| 300 | compressed_user_images = [compress_image(img, max_size_kb=200) for img in user_images] |
| 301 | |
| 302 | # 初始化任务状态 |
| 303 | self._task_states[task_id] = { |
| 304 | "pages": pages, |
no test coverage detected