BerriAI/litellm · error · HTTPException

expires_after[seconds] must be a valid integer, got '{expire

Error message

expires_after[seconds] must be a valid integer, got '{expires_after_seconds_str}': {e}

What it means

HTTPException(400) on file upload: expires_after[seconds] is a string but not a valid integer (int() raised), e.g. 'abc' or '1.5'. The offending value and parse error are embedded; the client must send whole seconds.

Source

Thrown at litellm/proxy/openai_files_endpoints/files_endpoints.py:435

                    },
                )
            # After this check, mypy knows expires_after_seconds_str is str
            expires_after_seconds_str_validated: Final[str] = expires_after_seconds_str

            # Validate anchor is "created_at"
            if expires_after_anchor != "created_at":
                raise HTTPException(
                    status_code=400,
                    detail={
                        "error": f"expires_after[anchor] must be 'created_at', got '{expires_after_anchor}'",
                    },
                )

            # Convert seconds to int
            try:
                expires_after_seconds: Final = int(expires_after_seconds_str_validated)
            except (ValueError, TypeError) as e:
                raise HTTPException(
                    status_code=400,
                    detail={
                        "error": f"expires_after[seconds] must be a valid integer, got '{expires_after_seconds_str}': {e}",
                    },
                )

            # Use literal "created_at" (not variable) for TypedDict to satisfy Literal type
            expires_after = FileExpiresAfter(
                anchor="created_at",  # Literal, not expires_after_anchor variable
                seconds=expires_after_seconds,
            )

        # Include original request and headers in the data
        data = await add_litellm_data_to_request(
            data=data,
            request=request,
            general_settings=general_settings,
            user_api_key_dict=user_api_key_dict,

View on GitHub (pinned to 77b7c6c40c)

Solutions

  1. Set expires_after[seconds] to a valid integer string.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at litellm/proxy/openai_files_endpoints/files_endpoints.py:435 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18). Data as JSON: /api/errors/e23f81318855073f. Report an issue: GitHub.