chore(typing): clear basedpyright Any errors in video, responses, and HTTP handler paths

Replaces Any seams with real types across the highest reportAny/reportExplicitAny
files: extra_headers/extra_query/extra_body/litellm_metadata payload dicts get
concrete value types, Coroutine[Any, Any, T] annotations become
Coroutine[None, None, T], and pydantic models built by dict-unpacking untyped
JSON or model dumps are constructed with model_validate instead.

Whole-tree basedpyright: reportAny 21328 -> 20914, reportExplicitAny 7259 -> 6794,
total errors 152721 -> 151787, with no rule regressing anywhere in the repo.

Also fixes the multipart filename for POST /videos/characters: a video opened
from a raw file descriptor exposes an int name, which used to be forwarded into
mimetypes.guess_type() and raise, and now falls back to the default filename.
This commit is contained in:
mateo-berri 2026-08-01 02:36:30 +00:00
parent eb4f33e920
commit cd191b3da1
No known key found for this signature in database
14 changed files with 538 additions and 476 deletions

View file

@ -1,9 +1,9 @@
{
"reportAny": {
"limit": 31903
"limit": 31293
},
"reportArgumentType": {
"limit": 2645
"limit": 2627
},
"reportAssignmentType": {
"limit": 329
@ -18,13 +18,13 @@
"limit": 59
},
"reportDeprecated": {
"limit": 325
"limit": 313
},
"reportDuplicateImport": {
"limit": 42
},
"reportExplicitAny": {
"limit": 10214
"limit": 9749
},
"reportFunctionMemberAccess": {
"limit": 11
@ -60,7 +60,7 @@
"limit": 15861
},
"reportMissingTypeStubs": {
"limit": 41
"limit": 0
},
"reportOperatorIssue": {
"limit": 0
@ -84,7 +84,7 @@
"limit": 77
},
"reportPrivateUsage": {
"limit": 2437
"limit": 2429
},
"reportRedeclaration": {
"limit": 12
@ -114,7 +114,7 @@
"limit": 32047
},
"reportUnnecessaryCast": {
"limit": 177
"limit": 176
},
"reportUnnecessaryComparison": {
"limit": 1021
@ -123,7 +123,7 @@
"limit": 7
},
"reportUnnecessaryIsInstance": {
"limit": 1205
"limit": 1202
},
"reportUntypedBaseClass": {
"limit": 165

View file

@ -131,8 +131,8 @@ class CustomStreamWrapper:
self.sent_last_chunk = False
self._stream_created_time: float = time.time()
litellm_params: GenericLiteLLMParams = GenericLiteLLMParams(
**self.logging_obj.model_call_details.get("litellm_params", {})
litellm_params: GenericLiteLLMParams = GenericLiteLLMParams.model_validate(
dict(self.logging_obj.model_call_details.get("litellm_params", {}))
)
self.merge_reasoning_content_in_choices: bool = litellm_params.merge_reasoning_content_in_choices or False
self.sent_first_thinking_block = False

View file

@ -208,13 +208,9 @@ class AzureAssistantsAPI(BaseAzureLLM):
**message_data, # type: ignore
)
response_obj: Optional[OpenAIMessage] = None
if getattr(thread_message, "status", None) is None:
thread_message.status = "completed"
response_obj = OpenAIMessage(**thread_message.dict())
else:
response_obj = OpenAIMessage(**thread_message.dict())
return response_obj
return OpenAIMessage.model_validate(thread_message.model_dump())
# fmt: off
@ -297,13 +293,9 @@ class AzureAssistantsAPI(BaseAzureLLM):
**message_data, # type: ignore
)
response_obj: Optional[OpenAIMessage] = None
if getattr(thread_message, "status", None) is None:
thread_message.status = "completed"
response_obj = OpenAIMessage(**thread_message.dict())
else:
response_obj = OpenAIMessage(**thread_message.dict())
return response_obj
return OpenAIMessage.model_validate(thread_message.model_dump())
async def async_get_messages(
self,
@ -442,7 +434,7 @@ class AzureAssistantsAPI(BaseAzureLLM):
message_thread = await openai_client.beta.threads.create(**data) # type: ignore
return Thread(**message_thread.dict())
return Thread.model_validate(message_thread.model_dump())
# fmt: off
@ -538,7 +530,7 @@ class AzureAssistantsAPI(BaseAzureLLM):
message_thread = azure_openai_client.beta.threads.create(**data) # type: ignore
return Thread(**message_thread.dict())
return Thread.model_validate(message_thread.model_dump())
async def async_get_thread(
self,
@ -565,7 +557,7 @@ class AzureAssistantsAPI(BaseAzureLLM):
response = await openai_client.beta.threads.retrieve(thread_id=thread_id)
return Thread(**response.dict())
return Thread.model_validate(response.model_dump())
# fmt: off
@ -641,7 +633,7 @@ class AzureAssistantsAPI(BaseAzureLLM):
response = openai_client.beta.threads.retrieve(thread_id=thread_id)
return Thread(**response.dict())
return Thread.model_validate(response.model_dump())
# def delete_thread(self):
# pass

File diff suppressed because it is too large Load diff

View file

@ -2680,7 +2680,7 @@ class OpenAIAssistantsAPI(BaseLLM):
message_thread = await openai_client.beta.threads.create(**data) # type: ignore
return Thread(**message_thread.dict())
return Thread.model_validate(message_thread.model_dump())
# fmt: off
@ -2766,7 +2766,7 @@ class OpenAIAssistantsAPI(BaseLLM):
message_thread = openai_client.beta.threads.create(**data) # type: ignore
return Thread(**message_thread.dict())
return Thread.model_validate(message_thread.model_dump())
async def async_get_thread(
self,
@ -2789,7 +2789,7 @@ class OpenAIAssistantsAPI(BaseLLM):
response = await openai_client.beta.threads.retrieve(thread_id=thread_id)
return Thread(**response.dict())
return Thread.model_validate(response.model_dump())
# fmt: off
@ -2855,7 +2855,7 @@ class OpenAIAssistantsAPI(BaseLLM):
response = openai_client.beta.threads.retrieve(thread_id=thread_id)
return Thread(**response.dict())
return Thread.model_validate(response.model_dump())
def delete_thread(self):
pass

View file

@ -4,6 +4,8 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union, cast
from urllib.parse import quote
import httpx
from httpx._types import FileContent as HttpxFileContent
from httpx._types import FileTypes as HttpxFileTypes
from httpx._types import RequestFiles
import litellm
@ -128,7 +130,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
# Handle input_reference parameter if provided
_input_reference = video_create_optional_request_params.get("input_reference")
data_without_files = {k: v for k, v in request_dict.items() if k not in ["input_reference"]}
files_list: List[Tuple[str, Any]] = []
files_list: List[Tuple[str, HttpxFileTypes]] = []
# Handle input_reference parameter
if _input_reference is not None:
@ -177,9 +179,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
request_data: Optional[Dict] = None,
) -> VideoObject:
"""Transform the OpenAI video creation response."""
response_data = raw_response.json()
video_obj = VideoObject(**response_data) # type: ignore[arg-type]
video_obj = VideoObject.model_validate(raw_response.json())
if custom_llm_provider and video_obj.id:
video_obj.id = encode_video_id_with_provider(video_obj.id, custom_llm_provider, model)
@ -223,7 +223,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
url = f"{url}?variant={quote(variant, safe='')}"
# No additional data needed for GET content request
data: Dict[str, Any] = {}
data: Dict[str, object] = {}
return url, data
@ -234,7 +234,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
api_base: str,
litellm_params: GenericLiteLLMParams,
headers: dict,
extra_body: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, object]] = None,
) -> Tuple[str, Dict]:
"""
Transform the video remix request for OpenAI API.
@ -249,7 +249,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
url = f"{api_base.rstrip('/')}/{encoded_video_id}/remix"
# Prepare the request data
data = {"prompt": prompt}
data: dict[str, object] = {"prompt": prompt}
# Add any extra body parameters
if extra_body:
@ -274,10 +274,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
"""
Transform the OpenAI video remix response.
"""
response_data = raw_response.json()
# Transform the response data
video_obj = VideoObject(**response_data) # type: ignore[arg-type]
video_obj = VideoObject.model_validate(raw_response.json())
if custom_llm_provider and video_obj.id:
video_obj.id = encode_video_id_with_provider(video_obj.id, custom_llm_provider, None)
@ -304,7 +301,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
after: Optional[str] = None,
limit: Optional[int] = None,
order: Optional[str] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, str]] = None,
) -> Tuple[str, Dict]:
"""
Transform the video list request for OpenAI API.
@ -316,7 +313,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
url = api_base
# Prepare query parameters
params = {}
params: dict[str, str] = {}
if after is not None:
# Decode the wrapped video ID back to the original provider ID
params["after"] = extract_original_video_id(after)
@ -392,7 +389,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
url = f"{api_base.rstrip('/')}/{encoded_video_id}"
# No data needed for DELETE request
data: Dict[str, Any] = {}
data: Dict[str, object] = {}
return url, data
@ -404,10 +401,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
"""
Transform the OpenAI video delete response.
"""
response_data = raw_response.json()
# Transform the response data
video_obj = VideoObject(**response_data) # type: ignore[arg-type] # type: ignore[arg-type]
video_obj = VideoObject.model_validate(raw_response.json())
return video_obj
@ -429,7 +423,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
url = f"{api_base.rstrip('/')}/{encoded_video_id}"
# No additional data needed for GET request
data: Dict[str, Any] = {}
data: Dict[str, object] = {}
return url, data
@ -442,9 +436,7 @@ class OpenAIVideoConfig(BaseVideoConfig):
"""
Transform the OpenAI video retrieve response.
"""
response_data = raw_response.json()
# Transform the response data
video_obj = VideoObject(**response_data) # type: ignore[arg-type]
video_obj = VideoObject.model_validate(raw_response.json())
if custom_llm_provider and video_obj.id:
video_obj.id = encode_video_id_with_provider(video_obj.id, custom_llm_provider, None)
@ -465,22 +457,22 @@ class OpenAIVideoConfig(BaseVideoConfig):
def transform_video_create_character_request(
self,
name: str,
video: Any,
video: HttpxFileContent,
api_base: str,
litellm_params: GenericLiteLLMParams,
headers: dict,
) -> Tuple[str, list]:
url = f"{api_base.rstrip('/')}/characters"
files_list: List[Tuple[str, Any]] = [("name", (None, name))]
files_list: List[Tuple[str, HttpxFileTypes]] = [("name", (None, name))]
self._add_video_to_files(files_list, video, "video")
return url, files_list
def transform_video_create_character_response(
self,
raw_response: httpx.Response,
logging_obj: Any,
logging_obj: LiteLLMLoggingObj,
) -> CharacterObject:
return CharacterObject(**raw_response.json())
return CharacterObject.model_validate(raw_response.json())
def transform_video_get_character_request(
self,
@ -497,9 +489,9 @@ class OpenAIVideoConfig(BaseVideoConfig):
def transform_video_get_character_response(
self,
raw_response: httpx.Response,
logging_obj: Any,
logging_obj: LiteLLMLoggingObj,
) -> CharacterObject:
return CharacterObject(**raw_response.json())
return CharacterObject.model_validate(raw_response.json())
def transform_video_edit_request(
self,
@ -508,12 +500,12 @@ class OpenAIVideoConfig(BaseVideoConfig):
api_base: str,
litellm_params: GenericLiteLLMParams,
headers: dict,
extra_body: Optional[Dict[str, Any]] = None,
prefetched_source_data: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, object]] = None,
prefetched_source_data: Optional[Dict[str, object]] = None,
) -> Tuple[str, Dict]:
original_video_id = extract_original_video_id(video_id)
url = f"{api_base.rstrip('/')}/edits"
data: Dict[str, Any] = {"prompt": prompt, "video": {"id": original_video_id}}
data: Dict[str, object] = {"prompt": prompt, "video": {"id": original_video_id}}
if extra_body:
data.update(extra_body)
return url, data
@ -521,11 +513,11 @@ class OpenAIVideoConfig(BaseVideoConfig):
def transform_video_edit_response(
self,
raw_response: httpx.Response,
logging_obj: Any,
logging_obj: LiteLLMLoggingObj,
custom_llm_provider: Optional[str] = None,
request_data: Optional[Dict] = None,
) -> VideoObject:
video_obj = VideoObject(**raw_response.json())
video_obj = VideoObject.model_validate(raw_response.json())
if custom_llm_provider and video_obj.id:
video_obj.id = encode_video_id_with_provider(video_obj.id, custom_llm_provider, None)
return video_obj
@ -538,11 +530,11 @@ class OpenAIVideoConfig(BaseVideoConfig):
api_base: str,
litellm_params: GenericLiteLLMParams,
headers: dict,
extra_body: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, object]] = None,
) -> Tuple[str, Dict]:
original_video_id = extract_original_video_id(video_id)
url = f"{api_base.rstrip('/')}/extensions"
data: Dict[str, Any] = {
data: Dict[str, object] = {
"prompt": prompt,
"seconds": seconds,
"video": {"id": original_video_id},
@ -554,10 +546,10 @@ class OpenAIVideoConfig(BaseVideoConfig):
def transform_video_extension_response(
self,
raw_response: httpx.Response,
logging_obj: Any,
logging_obj: LiteLLMLoggingObj,
custom_llm_provider: Optional[str] = None,
) -> VideoObject:
video_obj = VideoObject(**raw_response.json())
video_obj = VideoObject.model_validate(raw_response.json())
if custom_llm_provider and video_obj.id:
video_obj.id = encode_video_id_with_provider(video_obj.id, custom_llm_provider, None)
return video_obj
@ -578,8 +570,8 @@ class OpenAIVideoConfig(BaseVideoConfig):
def _add_video_to_files(
self,
files_list: List[Tuple[str, Any]],
video: Any,
files_list: List[Tuple[str, HttpxFileTypes]],
video: HttpxFileContent,
field_name: str,
) -> None:
"""
@ -588,11 +580,12 @@ class OpenAIVideoConfig(BaseVideoConfig):
This path is used by POST /videos/characters and must send video/mp4,
not image/* content types.
"""
filename = getattr(video, "name", None) or "input_video.mp4"
raw_filename = getattr(video, "name", None)
filename = raw_filename if isinstance(raw_filename, str) and raw_filename else "input_video.mp4"
content_type = self._get_video_content_type(video=video, filename=filename)
files_list.append((field_name, (filename, video, content_type)))
def _get_video_content_type(self, video: Any, filename: str) -> str:
def _get_video_content_type(self, video: HttpxFileContent, filename: str) -> str:
guessed_content_type, _ = mimetypes.guess_type(filename)
if guessed_content_type and guessed_content_type.startswith("video/"):
return guessed_content_type

View file

@ -575,7 +575,7 @@ def ocr(
custom_llm_provider: str | None = None,
extra_headers: dict[str, object] | None = None,
**kwargs: object,
) -> OCRResponse | Coroutine[object, object, OCRResponse]:
) -> OCRResponse | Coroutine[None, None, OCRResponse]:
"""
Synchronous OCR function.

View file

@ -3132,12 +3132,12 @@ class SSOAuthenticationHandler:
_team_request = deepcopy(default_team_params)
_team_request["team_id"] = litellm_team_id
_team_request["team_alias"] = litellm_team_name
team_request = NewTeamRequest(**_team_request)
team_request = NewTeamRequest.model_validate(_team_request)
elif isinstance(litellm.default_team_params, DefaultTeamSSOParams):
_default_team_params = deepcopy(litellm.default_team_params)
_new_team_request = team_request.model_dump()
_new_team_request.update(_default_team_params)
team_request = NewTeamRequest(**_new_team_request)
team_request = NewTeamRequest.model_validate(_new_team_request)
return team_request
@staticmethod

View file

@ -159,9 +159,9 @@ async def aresponses_api_with_mcp(
user: Optional[str] = None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
# LiteLLM specific params,
custom_llm_provider: Optional[str] = None,
@ -427,9 +427,9 @@ async def aresponses(
safety_identifier: Optional[str] = None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
# LiteLLM specific params,
custom_llm_provider: Optional[str] = None,
@ -738,9 +738,9 @@ def _responses_try_dispatch_mcp_gateway(
top_p: Optional[float],
truncation: Optional[Literal["auto", "disabled"]],
user: Optional[str],
extra_headers: Optional[Dict[str, Any]],
extra_query: Optional[Dict[str, Any]],
extra_body: Optional[Dict[str, Any]],
extra_headers: Optional[Dict[str, str]],
extra_query: Optional[Dict[str, str]],
extra_body: Optional[Dict[str, object]],
timeout: Optional[Union[float, httpx.Timeout]],
custom_llm_provider: Optional[str],
kwargs: Dict[str, Any],
@ -814,9 +814,9 @@ def _responses_try_dispatch_emulated_file_search(
safety_identifier: Optional[str],
text_format: Optional[Union[Type[BaseModel], dict]],
allowed_openai_params: Optional[List[str]],
extra_headers: Optional[Dict[str, Any]],
extra_query: Optional[Dict[str, Any]],
extra_body: Optional[Dict[str, Any]],
extra_headers: Optional[Dict[str, str]],
extra_query: Optional[Dict[str, str]],
extra_body: Optional[Dict[str, object]],
timeout: Optional[Union[float, httpx.Timeout]],
custom_llm_provider: Optional[str],
kwargs: Dict[str, Any],
@ -906,9 +906,9 @@ def responses(
safety_identifier: Optional[str] = None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
# LiteLLM specific params,
allowed_openai_params: Optional[List[str]] = None,
@ -1163,9 +1163,9 @@ async def adelete_responses(
response_id: str,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
# LiteLLM specific params,
custom_llm_provider: Optional[str] = None,
@ -1224,14 +1224,14 @@ def delete_responses(
response_id: str,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
# LiteLLM specific params,
custom_llm_provider: Optional[str] = None,
**kwargs,
) -> Union[DeleteResponseResult, Coroutine[Any, Any, DeleteResponseResult]]:
) -> Union[DeleteResponseResult, Coroutine[None, None, DeleteResponseResult]]:
"""
Synchronous version of the DELETE Responses API
@ -1314,9 +1314,9 @@ async def aget_responses(
response_id: str,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
# LiteLLM specific params,
custom_llm_provider: Optional[str] = None,
@ -1389,14 +1389,14 @@ def get_responses(
response_id: str,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
# LiteLLM specific params,
custom_llm_provider: Optional[str] = None,
**kwargs,
) -> Union[ResponsesAPIResponse, Coroutine[Any, Any, ResponsesAPIResponse]]:
) -> Union[ResponsesAPIResponse, Coroutine[None, None, ResponsesAPIResponse]]:
"""
Fetch a response by its ID.
@ -1496,7 +1496,7 @@ async def alist_input_items(
include: Optional[List[str]] = None,
limit: int = 20,
order: Literal["asc", "desc"] = "desc",
extra_headers: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
custom_llm_provider: Optional[str] = None,
**kwargs,
@ -1552,11 +1552,11 @@ def list_input_items(
include: Optional[List[str]] = None,
limit: int = 20,
order: Literal["asc", "desc"] = "desc",
extra_headers: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
custom_llm_provider: Optional[str] = None,
**kwargs,
) -> Union[Dict, Coroutine[Any, Any, Dict]]:
) -> Union[Dict, Coroutine[None, None, Dict]]:
"""List input items for a response"""
local_vars = locals()
try:
@ -1627,9 +1627,9 @@ async def acancel_responses(
response_id: str,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
# LiteLLM specific params,
custom_llm_provider: Optional[str] = None,
@ -1688,14 +1688,14 @@ def cancel_responses(
response_id: str,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
# LiteLLM specific params,
custom_llm_provider: Optional[str] = None,
**kwargs,
) -> Union[ResponsesAPIResponse, Coroutine[Any, Any, ResponsesAPIResponse]]:
) -> Union[ResponsesAPIResponse, Coroutine[None, None, ResponsesAPIResponse]]:
"""
Synchronous version of the POST Responses API
@ -1781,9 +1781,9 @@ async def acompact_responses(
previous_response_id: Optional[str] = None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
# LiteLLM specific params,
custom_llm_provider: Optional[str] = None,
@ -1859,14 +1859,14 @@ def compact_responses(
previous_response_id: Optional[str] = None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
timeout: Optional[Union[float, httpx.Timeout]] = None,
# LiteLLM specific params,
custom_llm_provider: Optional[str] = None,
**kwargs,
) -> Union[ResponsesAPIResponse, Coroutine[Any, Any, ResponsesAPIResponse]]:
) -> Union[ResponsesAPIResponse, Coroutine[None, None, ResponsesAPIResponse]]:
"""
Synchronous version of the POST Compact Responses API

View file

@ -8613,9 +8613,9 @@ class Router:
deployment = self.get_deployment(model_id=model_id)
if deployment is None or self._is_deployment_blocked(deployment):
return None
return CredentialLiteLLMParams(**deployment.litellm_params.model_dump(exclude_none=True)).model_dump(
exclude_none=True
)
return CredentialLiteLLMParams.model_validate(
deployment.litellm_params.model_dump(exclude_none=True)
).model_dump(exclude_none=True)
def get_deployment_by_model_group_name(self, model_group_name: str) -> Optional[Deployment]:
"""
@ -8755,9 +8755,9 @@ class Router:
return None
# Get basic credentials
credentials = CredentialLiteLLMParams(**deployment.litellm_params.model_dump(exclude_none=True)).model_dump(
exclude_none=True
)
credentials = CredentialLiteLLMParams.model_validate(
deployment.litellm_params.model_dump(exclude_none=True)
).model_dump(exclude_none=True)
# Resolve litellm_credential_name to actual credentials
if deployment.litellm_params.litellm_credential_name is not None:

View file

@ -40,9 +40,9 @@ async def avideo_generation(
custom_llm_provider=None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> VideoObject:
"""
@ -57,9 +57,9 @@ async def avideo_generation(
- `user` (Optional[str]): A unique identifier representing your end-user
- `timeout` (int): Request timeout in seconds
- `custom_llm_provider` (Optional[str]): The LLM provider to use
- `extra_headers` (Optional[Dict[str, Any]]): Additional headers
- `extra_query` (Optional[Dict[str, Any]]): Additional query parameters
- `extra_body` (Optional[Dict[str, Any]]): Additional body parameters
- `extra_headers` (Optional[Dict[str, str]]): Additional headers
- `extra_query` (Optional[Dict[str, str]]): Additional query parameters
- `extra_body` (Optional[Dict[str, object]]): Additional body parameters
- `kwargs` (dict): Additional keyword arguments
Returns:
@ -126,13 +126,13 @@ def video_generation(
user: Optional[str] = None,
timeout: int = 600,
custom_llm_provider: Optional[str] = None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
*,
avideo_generation: Literal[True],
**kwargs: Any,
) -> Coroutine[Any, Any, VideoObject]:
**kwargs: object,
) -> Coroutine[None, None, VideoObject]:
...
@ -146,12 +146,12 @@ def video_generation(
user: Optional[str] = None,
timeout: int = 600,
custom_llm_provider: Optional[str] = None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
*,
avideo_generation: Literal[False] = False,
**kwargs: Any,
**kwargs: object,
) -> VideoObject:
...
@ -170,13 +170,13 @@ def video_generation(
custom_llm_provider=None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> Union[
VideoObject,
Coroutine[Any, Any, VideoObject],
Coroutine[None, None, VideoObject],
]:
"""
Maps the https://api.openai.com/v1/videos endpoint.
@ -277,13 +277,13 @@ def video_content(
variant: Optional[str] = None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> Union[
bytes,
Coroutine[Any, Any, bytes],
Coroutine[None, None, bytes],
]:
"""
Download video content from OpenAI's video API.
@ -295,9 +295,9 @@ def video_content(
timeout (Optional[float]): The timeout for the request in seconds.
custom_llm_provider (Optional[str]): The LLM provider to use. If not provided, will be auto-detected.
variant (Optional[str]): Which downloadable asset to return. Defaults to the MP4 video.
extra_headers (Optional[Dict[str, Any]]): Additional headers to include in the request.
extra_query (Optional[Dict[str, Any]]): Additional query parameters.
extra_body (Optional[Dict[str, Any]]): Additional body parameters.
extra_headers (Optional[Dict[str, str]]): Additional headers to include in the request.
extra_query (Optional[Dict[str, str]]): Additional query parameters.
extra_body (Optional[Dict[str, object]]): Additional body parameters.
Returns:
bytes: The raw video content as bytes.
@ -390,9 +390,9 @@ async def avideo_content(
variant: Optional[str] = None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> bytes:
"""
@ -402,9 +402,9 @@ async def avideo_content(
- `video_id` (str): The identifier of the video whose content to download
- `timeout` (Optional[float]): The timeout for the request in seconds
- `custom_llm_provider` (Optional[str]): The LLM provider to use
- `extra_headers` (Optional[Dict[str, Any]]): Additional headers
- `extra_query` (Optional[Dict[str, Any]]): Additional query parameters
- `extra_body` (Optional[Dict[str, Any]]): Additional body parameters
- `extra_headers` (Optional[Dict[str, str]]): Additional headers
- `extra_query` (Optional[Dict[str, str]]): Additional query parameters
- `extra_body` (Optional[Dict[str, object]]): Additional body parameters
- `kwargs` (dict): Additional keyword arguments
Returns:
@ -461,9 +461,9 @@ async def avideo_remix(
custom_llm_provider=None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> VideoObject:
"""
@ -474,9 +474,9 @@ async def avideo_remix(
- `prompt` (str): Updated text prompt that directs the remix generation
- `timeout` (int): Request timeout in seconds
- `custom_llm_provider` (Optional[str]): The LLM provider to use
- `extra_headers` (Optional[Dict[str, Any]]): Additional headers
- `extra_query` (Optional[Dict[str, Any]]): Additional query parameters
- `extra_body` (Optional[Dict[str, Any]]): Additional body parameters
- `extra_headers` (Optional[Dict[str, str]]): Additional headers
- `extra_query` (Optional[Dict[str, str]]): Additional query parameters
- `extra_body` (Optional[Dict[str, object]]): Additional body parameters
- `kwargs` (dict): Additional keyword arguments
Returns:
@ -528,13 +528,13 @@ def video_remix(
prompt: str,
timeout: int = 600,
custom_llm_provider: Optional[str] = None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
*,
avideo_remix: Literal[True],
**kwargs: Any,
) -> Coroutine[Any, Any, VideoObject]:
**kwargs: object,
) -> Coroutine[None, None, VideoObject]:
...
@ -544,12 +544,12 @@ def video_remix(
prompt: str,
timeout: int = 600,
custom_llm_provider: Optional[str] = None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
*,
avideo_remix: Literal[False] = False,
**kwargs: Any,
**kwargs: object,
) -> VideoObject:
...
@ -564,13 +564,13 @@ def video_remix(
custom_llm_provider=None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> Union[
VideoObject,
Coroutine[Any, Any, VideoObject],
Coroutine[None, None, VideoObject],
]:
"""
Maps the https://api.openai.com/v1/videos/{video_id}/remix endpoint.
@ -668,9 +668,9 @@ async def avideo_list(
custom_llm_provider=None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> List[VideoObject]:
"""
@ -683,9 +683,9 @@ async def avideo_list(
- `api_key` (Optional[str]): The API key to use for authentication
- `timeout` (int): Request timeout in seconds
- `custom_llm_provider` (Optional[str]): The LLM provider to use
- `extra_headers` (Optional[Dict[str, Any]]): Additional headers
- `extra_query` (Optional[Dict[str, Any]]): Additional query parameters
- `extra_body` (Optional[Dict[str, Any]]): Additional body parameters
- `extra_headers` (Optional[Dict[str, str]]): Additional headers
- `extra_query` (Optional[Dict[str, str]]): Additional query parameters
- `extra_body` (Optional[Dict[str, object]]): Additional body parameters
- `kwargs` (dict): Additional keyword arguments
Returns:
@ -744,13 +744,13 @@ def video_list(
order: Optional[str] = None,
timeout: int = 600,
custom_llm_provider: Optional[str] = None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
*,
avideo_list: Literal[True],
**kwargs: Any,
) -> Coroutine[Any, Any, List[VideoObject]]:
**kwargs: object,
) -> Coroutine[None, None, List[VideoObject]]:
...
@ -761,12 +761,12 @@ def video_list(
order: Optional[str] = None,
timeout: int = 600,
custom_llm_provider: Optional[str] = None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
*,
avideo_list: Literal[False] = False,
**kwargs: Any,
**kwargs: object,
) -> List[VideoObject]:
...
@ -782,13 +782,13 @@ def video_list(
custom_llm_provider=None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> Union[
List[VideoObject],
Coroutine[Any, Any, List[VideoObject]],
Coroutine[None, None, List[VideoObject]],
]:
"""
Maps the https://api.openai.com/v1/videos endpoint.
@ -882,9 +882,9 @@ async def avideo_status(
custom_llm_provider=None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> VideoObject:
"""
@ -895,9 +895,9 @@ async def avideo_status(
- `model` (Optional[str]): The model to use. If not provided, will be auto-detected
- `timeout` (int): Request timeout in seconds
- `custom_llm_provider` (Optional[str]): The LLM provider to use
- `extra_headers` (Optional[Dict[str, Any]]): Additional headers
- `extra_query` (Optional[Dict[str, Any]]): Additional query parameters
- `extra_body` (Optional[Dict[str, Any]]): Additional body parameters
- `extra_headers` (Optional[Dict[str, str]]): Additional headers
- `extra_query` (Optional[Dict[str, str]]): Additional query parameters
- `extra_body` (Optional[Dict[str, object]]): Additional body parameters
- `kwargs` (dict): Additional keyword arguments
Returns:
@ -947,13 +947,13 @@ def video_status(
video_id: str,
timeout: int = 600,
custom_llm_provider: Optional[str] = None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
*,
avideo_status: Literal[True],
**kwargs: Any,
) -> Coroutine[Any, Any, VideoObject]:
**kwargs: object,
) -> Coroutine[None, None, VideoObject]:
...
# Overload for when avideo_status=False (returns VideoObject)
@ -962,12 +962,12 @@ def video_status(
video_id: str,
timeout: int = 600,
custom_llm_provider: Optional[str] = None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
*,
avideo_status: Literal[False] = False,
**kwargs: Any,
**kwargs: object,
) -> VideoObject:
...
@ -981,13 +981,13 @@ def video_status(
custom_llm_provider=None,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> Union[
VideoObject,
Coroutine[Any, Any, VideoObject],
Coroutine[None, None, VideoObject],
]:
"""
Retrieve video status from OpenAI's video API.
@ -996,9 +996,9 @@ def video_status(
video_id (str): The identifier of the video whose status to retrieve.
timeout (int): The timeout for the request in seconds.
custom_llm_provider (Optional[str]): The LLM provider to use. If not provided, will be auto-detected.
extra_headers (Optional[Dict[str, Any]]): Additional headers to include in the request.
extra_query (Optional[Dict[str, Any]]): Additional query parameters.
extra_body (Optional[Dict[str, Any]]): Additional body parameters.
extra_headers (Optional[Dict[str, str]]): Additional headers to include in the request.
extra_query (Optional[Dict[str, str]]): Additional query parameters.
extra_body (Optional[Dict[str, object]]): Additional body parameters.
Returns:
VideoObject: The video status information.
@ -1100,9 +1100,9 @@ async def avideo_create_character(
video: Any,
timeout=600,
custom_llm_provider=None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> CharacterObject:
"""
@ -1155,11 +1155,11 @@ def video_create_character(
video: Any,
timeout=600,
custom_llm_provider=None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> Union[CharacterObject, Coroutine[Any, Any, CharacterObject]]:
) -> Union[CharacterObject, Coroutine[None, None, CharacterObject]]:
"""
Create a character from an uploaded video file.
Maps to POST /v1/videos/characters
@ -1230,9 +1230,9 @@ async def avideo_get_character(
character_id: str,
timeout=600,
custom_llm_provider=None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> CharacterObject:
"""
@ -1280,11 +1280,11 @@ def video_get_character(
character_id: str,
timeout=600,
custom_llm_provider=None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> Union[CharacterObject, Coroutine[Any, Any, CharacterObject]]:
) -> Union[CharacterObject, Coroutine[None, None, CharacterObject]]:
"""
Retrieve a character by ID.
Maps to GET /v1/videos/characters/{character_id}
@ -1355,9 +1355,9 @@ async def avideo_edit(
prompt: str,
timeout=600,
custom_llm_provider=None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> VideoObject:
"""
@ -1407,11 +1407,11 @@ def video_edit(
prompt: str,
timeout=600,
custom_llm_provider=None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> Union[VideoObject, Coroutine[Any, Any, VideoObject]]:
) -> Union[VideoObject, Coroutine[None, None, VideoObject]]:
"""
Create a video edit job.
Maps to POST /v1/videos/edits
@ -1486,9 +1486,9 @@ async def avideo_extension(
seconds: str,
timeout=600,
custom_llm_provider=None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> VideoObject:
"""
@ -1540,11 +1540,11 @@ def video_extension(
seconds: str,
timeout=600,
custom_llm_provider=None,
extra_headers: Optional[Dict[str, Any]] = None,
extra_query: Optional[Dict[str, Any]] = None,
extra_body: Optional[Dict[str, Any]] = None,
extra_headers: Optional[Dict[str, str]] = None,
extra_query: Optional[Dict[str, str]] = None,
extra_body: Optional[Dict[str, object]] = None,
**kwargs,
) -> Union[VideoObject, Coroutine[Any, Any, VideoObject]]:
) -> Union[VideoObject, Coroutine[None, None, VideoObject]]:
"""
Create a video extension.
Maps to POST /v1/videos/extensions

View file

@ -24,7 +24,7 @@
"limit": 130
},
"ANN401": {
"limit": 2010
"limit": 1995
},
"ASYNC230": {
"limit": 14
@ -363,6 +363,6 @@
"limit": 105
},
"UP045": {
"limit": 17805
"limit": 17803
}
}

View file

@ -1,3 +1,8 @@
import io
import os
import httpx
from litellm.llms.openai.videos.transformation import OpenAIVideoConfig
from litellm.types.router import GenericLiteLLMParams
from litellm.types.videos.utils import encode_character_id_with_provider
@ -68,3 +73,75 @@ def test_wrapped_character_id_is_decoded_then_encoded_as_path_segment():
== "https://api.openai.com/v1/videos/characters/..%2F..%2Fcharacters%3Fx%3D1%23frag"
)
assert params == {}
def test_create_character_request_falls_back_when_video_name_is_not_a_string():
"""A file opened from a raw descriptor exposes an ``int`` ``name``. That value
used to be forwarded straight into ``mimetypes.guess_type()``, which raises,
so the multipart filename now falls back to the default whenever ``name`` is
not a usable string."""
config = OpenAIVideoConfig()
fd = os.open(__file__, os.O_RDONLY)
video = io.open(fd, "rb")
try:
assert not isinstance(video.name, str)
_, files_list = config.transform_video_create_character_request(
name="hero",
video=video,
api_base="https://api.openai.com/v1/videos",
litellm_params=GenericLiteLLMParams(),
headers={},
)
finally:
video.close()
video_entry = next(entry for entry in files_list if entry[0] == "video")
filename, payload, content_type = video_entry[1]
assert filename == "input_video.mp4"
assert payload is video
assert content_type == "video/mp4"
def test_create_character_request_uses_file_name_when_available(tmp_path):
config = OpenAIVideoConfig()
video_path = tmp_path / "clip.mp4"
video_path.write_bytes(b"\x00\x00\x00\x18ftypmp42")
with open(video_path, "rb") as video:
_, files_list = config.transform_video_create_character_request(
name="hero",
video=video,
api_base="https://api.openai.com/v1/videos",
litellm_params=GenericLiteLLMParams(),
headers={},
)
video_entry = next(entry for entry in files_list if entry[0] == "video")
assert video_entry[1][0] == str(video_path)
assert video_entry[1][2] == "video/mp4"
def test_video_create_response_parses_payload_with_unknown_fields():
config = OpenAIVideoConfig()
raw_response = httpx.Response(
200,
json={
"id": "video_123",
"object": "video",
"status": "completed",
"seconds": "8",
"unexpected_upstream_field": {"nested": True},
},
request=httpx.Request("POST", "https://api.openai.com/v1/videos"),
)
video_obj = config.transform_video_create_response(
model="sora-2",
raw_response=raw_response,
logging_obj=None,
)
assert video_obj.id == "video_123"
assert video_obj.seconds == "8"
assert video_obj.usage == {"duration_seconds": 8.0}

View file

@ -24,6 +24,6 @@
"limit": 1004
},
"LIT009": {
"limit": 2474
"limit": 2470
}
}