seedream_image_task.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import logging
  2. import time
  3. from app.config import settings
  4. from app.service.task.base_task import BaseTask
  5. from app.service.task.task_param import TaskParam
  6. from app.service.task.task_result import TaskResult
  7. from app.util.http_util import logged_client
  8. from app.util.retry_util import retry_on_failure
  9. logger = logging.getLogger(__name__)
  10. class SeedreamImageTask(BaseTask):
  11. def get_type(self) -> str:
  12. return "seedream_image"
  13. def _headers(self) -> dict[str, str]:
  14. return {
  15. "Content-Type": "application/json",
  16. "Authorization": f"Bearer {settings.seed_api_key}",
  17. }
  18. def _submit(self, url: str, inputs: dict) -> dict:
  19. with logged_client(timeout=60) as client:
  20. resp = client.post(url, headers=self._headers(), json=inputs)
  21. logger.info("[seedream_image] Submit response: status=%d", resp.status_code)
  22. if not resp.is_success:
  23. raise RuntimeError(f"HTTP {resp.status_code}: {resp.text}")
  24. data = resp.json()
  25. if "error" in data:
  26. err = data["error"]
  27. code = err.get("code", "")
  28. msg = err.get("message", "")
  29. raise RuntimeError(f"API error [{code}]: {msg}")
  30. return data
  31. def execute(self, param: TaskParam) -> TaskResult:
  32. url = settings.seedream_image_url
  33. logger.info("[seedream_image] Calling API: POST %s", url)
  34. t0 = time.time()
  35. try:
  36. data = retry_on_failure(
  37. lambda: self._submit(url, param.inputs),
  38. task_name="seedream_image",
  39. )
  40. images: list[str] = []
  41. for item in data.get("data", []):
  42. url_val = item.get("url")
  43. if url_val:
  44. images.append(url_val)
  45. logger.info("[seedream_image] Completed: model=%s, %d images, elapsed=%.2fs",
  46. data.get("model"), len(images), time.time() - t0)
  47. return TaskResult.success({"images": images})
  48. except Exception as e:
  49. elapsed = time.time() - t0
  50. logger.error("[seedream_image] Failed in %.2fs: %s", elapsed, e, exc_info=True)
  51. return TaskResult.failure(f"Failed to execute task: {e}")