ATH-MaaS/Pixelle-Video · error · RuntimeError

DashScope image edit returned no image URLs. output=

Error message

DashScope image edit returned no image URLs. output={getattr(response, 'output', None)}

What it means

Mirrors error 46 for the edit path: DashScope returns status 200 but no image URLs can be extracted from response.output, so edit_image raises this RuntimeError.

Solutions

  1. Inspect and log response.output for the actual payload
  2. Retry with backoff to allow async task completion
  3. Update the dashscope SDK and re-check _extract_image_urls parsing
  4. Validate input image URLs are publicly reachable and supported formats

Example fix

// before
res = gen.edit_image(prompt=p, image_urls=[local_path])
// after
res = gen.edit_image(prompt=p, image_urls=["https:// publicly-reachable/img.png"])
Defensive patterns

Strategy: retry

Validate before calling

for url in image_urls:
    assert url.startswith(("http://", "https://")), f"unreachable image url: {url}"

Try / catch

for attempt in range(3):
    try:
        return gen.edit_image(prompt=p, image_urls=urls)
    except RuntimeError as e:
        if "returned no image URLs" in str(e) and attempt < 2:
            time.sleep(2 ** attempt)
            continue
        raise

Prevention

When it happens

Trigger: Calling edit_image where the provider acknowledges the request (200) but output contains no image URLs — e.g. async task not finished, schema mismatch, or zero successful edits.

Common situations: Polling an async edit task too early; DashScope SDK/API schema drift; images rejected silently; account limits yielding empty results.

Understand the failure class

Background: "empty response", "returned no data", "empty embeddings": what HTTP 200-with-empty-body errors mean across libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of ATH-MaaS/Pixelle-Video@848b054e4f (2026-08-30). Data as JSON: /api/errors/6a3ec6055154b8d9. Report an issue: GitHub.

Appendix: source

Thrown at pixelle_video/services/api_services/image_dashscope.py:171

            }
        ]

        try:
            # Use ImageGeneration.call with messages, same as generate_image
            with self._proxy_env():
                response = ImageGeneration.call(
                    model=model,
                    api_key=self.api_key,
                    messages=messages,
                    n=n,
                    size=size,
                    watermark=False,
                )

            if response.status_code == 200:
                results = self._extract_image_urls(getattr(response, "output", None))
                if not results:
                    raise RuntimeError(f"DashScope image edit returned no image URLs. output={getattr(response, 'output', None)}")

                # Check if we should download
                if save_dir:
                    os.makedirs(save_dir, exist_ok=True)
                    local_files = []
                    for i, url in enumerate(results):
                        file_name = f"ds_{session_id if session_id else 'nosess'}_{int(time.time())}_{i}_{uuid.uuid4().hex[:6]}.png"
                        file_path = os.path.join(save_dir, file_name)
                        if self.image_processor.download_image(url, file_path):
                            local_files.append(file_path)
                    return local_files

                return results
            else:
                raise RuntimeError(f"Image edit failed: {response.code}, {response.message}, status={response.status_code}")
        except Exception as e:
            logging.error(f"Error in edit_image: {e}")
            raise

View on GitHub (pinned to 848b054e4f)