Module adcp.compat.legacy.v2_5.preview_creative

v2.5 → v3 adapter for preview_creative.

  • Request shape: identical between v2.5 and v3 — pass-through.
  • Response shape: v2.5 emits output_id / output_role on each preview render; v3 renames these to render_id / role. The normalizer accepts either set (preferring v3 names when both are present so a half-migrated server doesn't double-translate).

Handles both single-response {previews: [...]} and batch-response {results: [{success, response: {previews: [...]}}, ...]} shapes.

Direct port of src/lib/utils/preview-normalizer.ts / src/lib/adapters/legacy/v2-5/preview_creative.ts.

Functions

def normalize_response(response: dict[str, Any]) ‑> dict[str, typing.Any]
Expand source code
def normalize_response(response: dict[str, Any]) -> dict[str, Any]:
    """Normalize a v2.5 ``preview_creative`` response.

    Two shapes are handled:

    * **Single:** ``{previews: [...], ...}`` — each preview's renders
      are normalized.
    * **Batch:** ``{results: [{success: bool, response: {previews: [...]}}, ...]}``
      — successful entries get their nested previews normalized;
      failures pass through.
    """
    previews = response.get("previews")
    if isinstance(previews, list):
        return {
            **response,
            "previews": [_normalize_preview(p) if isinstance(p, dict) else p for p in previews],
        }

    results = response.get("results")
    if isinstance(results, list):
        new_results: list[Any] = []
        for entry in results:
            if not isinstance(entry, dict):
                new_results.append(entry)
                continue
            if entry.get("success") and isinstance(entry.get("response"), dict):
                inner = entry["response"]
                inner_previews = inner.get("previews")
                if isinstance(inner_previews, list):
                    new_results.append(
                        {
                            **entry,
                            "response": {
                                **inner,
                                "previews": [
                                    _normalize_preview(p) if isinstance(p, dict) else p
                                    for p in inner_previews
                                ],
                            },
                        }
                    )
                    continue
            new_results.append(entry)
        return {**response, "results": new_results}

    return response

Normalize a v2.5 preview_creative response.

Two shapes are handled:

  • Single: {previews: [...], ...} — each preview's renders are normalized.
  • Batch: {results: [{success: bool, response: {previews: [...]}}, ...]} — successful entries get their nested previews normalized; failures pass through.