mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-05 02:41:56 +00:00
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:
parent
eb4f33e920
commit
cd191b3da1
14 changed files with 538 additions and 476 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,6 @@
|
|||
"limit": 1004
|
||||
},
|
||||
"LIT009": {
|
||||
"limit": 2474
|
||||
"limit": 2470
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue