calesthio/OpenMontage · error · AtlasError

Atlas Cloud did not return a prediction id: {str(data)[:500]

Error message

Atlas Cloud did not return a prediction id: {str(data)[:500]}

What it means

Raised by submit when the parsed Atlas envelope succeeds (HTTP ok, code 200 or absent) but the data object contains no id field. The prediction id is required to poll for the result, so the flow cannot continue. The truncated payload is included to show what the server actually returned.

Source

Thrown at tools/atlas_client.py:123

def submit(endpoint: str, payload: dict[str, Any], api_key: str, timeout: int = 60) -> str:
    """Submit a generation request and return its prediction id."""
    import requests

    try:
        response = requests.post(
            endpoint, headers=_headers(api_key), json=payload, timeout=timeout
        )
    except AtlasError:
        raise
    except Exception as exc:  # noqa: BLE001
        raise AtlasError(f"Could not reach Atlas Cloud at {endpoint}: {exc}") from exc

    _raise_for_status(response, "Atlas Cloud submission")
    data = _payload_of(response)

    prediction_id = data.get("id")
    if not prediction_id:
        raise AtlasError(f"Atlas Cloud did not return a prediction id: {str(data)[:500]}")
    return str(prediction_id)


def poll(
    prediction_id: str,
    api_key: str,
    interval: float = 3.0,
    timeout: float = 600.0,
    request_timeout: int = 30,
) -> dict[str, Any]:
    """Poll a prediction until it terminates. Returns the final `data` object.

    Raises AtlasError on reported failure or when `timeout` seconds elapse.
    """
    import requests

    url = f"{PREDICTION_ENDPOINT}/{prediction_id}"
    elapsed = 0.0

View on GitHub (pinned to 95e1c3d0ab)

Solutions

  1. Log the included payload snippet and check where the id lives (renamed or nested field)
  2. Confirm the endpoint argument matches the documented generation endpoint for the exact model
  3. If the model runs synchronously, use the direct response handling instead of submit+poll
  4. Update the client for the current API version if the field was renamed
Defensive patterns

Strategy: validation

Type guard

def submit_response_has_id(data: dict) -> bool:
    return bool(data.get("id"))

Prevention

When it happens

Trigger: Submitting to an endpoint that returns a different shape (e.g. a synchronous result with outputs but no queued prediction); an endpoint URL typo landing on a non-generation route; Atlas contract drift renaming id to prediction_id or nesting it.

Common situations: Using a documentation example endpoint string that differs from the real generate endpoint; copy-pasting between image and video API versions with different envelopes; model routes that execute synchronously and skip the queue.

Related errors


AI-assisted analysis of calesthio/OpenMontage@95e1c3d0ab (2026-08-15). Data as JSON: /api/errors/4fae25381669e195. Report an issue: GitHub.