{"record":{"id":"85dfa40a6eb66a8a","repo":"remotion-dev/remotion","slug":"failed-to-serialize-progress-parameters-to-json","errorCode":null,"errorMessage":"Failed to serialize progress parameters to JSON: {e}","messagePattern":"Failed to serialize progress parameters to JSON: (.+?)","errorType":"exception","errorClass":"RemotionInvalidArgumentException","httpStatus":null,"severity":"error","filePath":"packages/lambda-python/remotion_lambda/remotionclient.py","lineNumber":600,"sourceCode":"            log_level (str): Log level (\"error\", \"warning\", \"info\", \"verbose\").\n            s3_output_provider (Optional[CustomCredentials]): Custom S3 credentials.\n\n        Returns:\n            str: JSON representation of the render progress request.\n        \"\"\"\n        progress_params = RenderProgressParams(\n            render_id=render_id,\n            bucket_name=bucket_name,\n            function_name=self.function_name,\n            region=self.region,\n            log_level=log_level,\n            s3_output_provider=s3_output_provider,\n        )\n        try:\n            # Ensure serialize_params method in models.py is typed to return Dict[str, Any]\n            return json.dumps(progress_params.serialize_params())\n        except (TypeError, OverflowError) as e:\n            raise RemotionInvalidArgumentException(\n                f\"Failed to serialize progress parameters to JSON: {e}\"\n            ) from e\n\n    def render_media_on_lambda(\n        self, render_params: RenderMediaParams\n    ) -> Optional[RenderMediaResponse]:\n        \"\"\"\n        Render media using AWS Lambda.\n\n        Args:\n            render_params (RenderMediaParams): Render parameters.\n\n        Returns:\n            Optional[RenderMediaResponse]: Response from the render operation, or None if no body object.\n        \"\"\"\n        params_json_str = self.construct_render_request(\n            render_params, render_type='video-or-audio' # Using Enum member\n        )","sourceCodeStart":582,"sourceCodeEnd":618,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/lambda-python/remotion_lambda/remotionclient.py#L582-L618","documentation":"Thrown by construct_render_progress_request when json.dumps(progress_params.serialize_params()) raises TypeError or OverflowError. Notably this call uses plain json.dumps WITHOUT the _custom_serializer default, so any Enum/dataclass/object field on RenderProgressParams that is not natively JSON-serializable will fail here even though the render-request path tolerates them.","triggerScenarios":"Passing a non-string log_level (e.g. a Python Enum) to get_render_progress; an s3_output_provider (CustomCredentials) whose fields are not JSON primitives; render_id or bucket_name containing non-string types that survived construction.","commonSituations":"Reusing an Enum for log_level='info' vs LogLevel.INFO; providing CustomCredentials with embedded datetime/Secret objects; passing integers or None where the serializer expects str.","solutions":["Pass plain strings for log_level (one of 'error','warning','info','verbose').","Ensure CustomCredentials fields are all JSON primitives before passing as s3_output_provider.","Confirm render_id and bucket_name are str, not bytes or Enum.","If you must use enums, resolve them to .value before calling get_render_progress."],"exampleFix":"// before\nget_render_progress(render_id=r.id, bucket_name=b, log_level=LogLevel.VERBOSE)\n// after\nget_render_progress(render_id=r.id, bucket_name=b, log_level='verbose')","handlingStrategy":"try-catch","validationCode":"import json\n# progress path uses plain json.dumps (no custom serializer) - so be strict.\ndef progress_is_serializable(render_id, bucket_name, log_level, s3_output_provider):\n    values = [render_id, bucket_name, log_level]\n    if s3_output_provider is not None:\n        values += list(vars(s3_output_provider).values())\n    return all(isinstance(v, str) for v in values)","typeGuard":"from typing import Any\ndef is_plain_str(v: Any) -> bool:\n    return isinstance(v, str)","tryCatchPattern":"from remotion_lambda.exceptions import RemotionInvalidArgumentException\ntry:\n    progress = client.get_render_progress(render_id=rid, bucket_name=bucket)\nexcept RemotionInvalidArgumentException as e:\n    logger.exception('Progress serialization failed')\n    raise","preventionTips":["Always pass log_level as a plain string literal, not an Enum.","Ensure CustomCredentials fields are all strings before assigning.","Note that unlike render-request path, the progress path does NOT use _custom_serializer.","Add a unit test that json.dumps(progress_params.serialize_params()) succeeds."],"tags":["python","lambda","serialization","render-progress","json"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}