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
- 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.