Skip to content

Conversation

Sameerlite
Copy link
Collaborator

@Sameerlite Sameerlite commented Oct 22, 2025

Title

Add Azure Video Generation Support with Sora Integration

Relevant issues

Pre-Submission checklist

Please complete all items before asking a LiteLLM maintainer to review your PR

  • I have Added testing in the tests/litellm/ directory, Adding at least 1 test is a hard requirement - see details
  • I have added a screenshot of my new test passing locally
  • My PR passes all unit tests on make test-unit
  • My PR's scope is as isolated as possible, it only solves 1 specific problem

Type

🆕 New Feature

Changes

Key Features Added

1. Type-Safe Parameter Definitions

  • Added InpaintItem TypedDict for image/video inpainting parameters
  • Added AzureCreateVideoRequest TypedDict with Azure-specific parameters
  • Full IDE autocomplete and runtime type validation support

2. Azure Video Transformation Configuration

  • Complete AzureVideoConfig class implementation
  • Smart parameter mapping from OpenAI to Azure format:
    • secondsn_seconds
    • size ("WxH") → separate width and height fields
    • input_referenceinpaint_items (with helper methods)
  • Correct URL construction: /openai/v1/video/generations/jobs?api-version=preview
  • Multipart form-data support for inpainting with file uploads

Usage Examples

Basic Video Generation

import litellm

response = litellm.video_generation(
    model="azure/sora-2",
    prompt="A cat playing piano",
    seconds="8",
    size="720x1280",
    api_base="https://resource.openai.azure.com",
    api_key="your-api-key"
)

With Image Reference (Auto-converted to inpaint_items)

response = litellm.video_generation(
    model="azure/sora-2",
    prompt="Enhanced version of this image",
    input_reference="my_image.jpg",  # Automatically converted to inpaint_items
    api_base="https://resource.openai.azure.com"
)

Advanced Inpainting

inpaint_items = [
    {
        "type": "image",
        "file_name": "reference.jpg",
        "frame_index": 0,
        "crop_bounds": {
            "left_fraction": 0.1,
            "top_fraction": 0.1,
            "right_fraction": 0.9,
            "bottom_fraction": 0.9
        }
    }
]

response = litellm.video_generation(
    model="azure/sora-2",
    prompt="Enhanced scene",
    inpaint_items=inpaint_items,
    api_base="https://resource.openai.azure.com"
)

Parameter Conversion

Input (OpenAI format):

{
  "prompt": "A cat playing piano",
  "seconds": "8",
  "size": "720x1280",
  "input_reference": "image.jpg"
}

Output (Azure format):

{
  "prompt": "A cat playing piano",
  "n_seconds": "8",
  "width": 720,
  "height": 1280,
  "inpaint_items": [
    {
      "type": "image",
      "file_name": "image.jpg",
      "frame_index": 0,
      "crop_bounds": {
        "left_fraction": 0.0,
        "top_fraction": 0.0,
        "right_fraction": 1.0,
        "bottom_fraction": 1.0
      }
    }
  ]
}

@vercel
Copy link

vercel bot commented Oct 22, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
litellm Ready Ready Preview Comment Oct 22, 2025 3:21pm

@Sameerlite Sameerlite changed the base branch from main to litellm_videos_openai_retrieval_2 October 22, 2025 12:07
("files", ("input_reference.png", _input_reference, "image/png"))
)

verbose_logger.debug(f"Azure video request data: {data_dict}")

Check failure

Code scanning / CodeQL

Clear-text logging of sensitive information High

This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression logs
sensitive data (secret)
as clear text.
This expression logs
sensitive data (password)
as clear text.
This expression

Copilot Autofix

AI 1 day ago

To fix the logging of sensitive information, we should ensure that no sensitive data (such as API keys, secrets, passwords, or credentials) are logged in cleartext. The best way to do this is by sanitizing data_dict before logging: specifically, by removing (or redacting) any known sensitive keys (e.g., api_key, api_key_secret) and potentially filtering out values matching certain patterns (like "key" or "token"). This can be accomplished by making a shallow copy of the dictionary, checking for sensitive keys, and replacing their values with placeholders before sending them to the logger.

Implementation:

  • Insert a utility function to sanitize/filter sensitive fields from a dict before logging. This should redact (replace with '[REDACTED]') the value of any keys matching a sensitive list or pattern.
  • Use this sanitization function just prior to logging data_dict on line 313.
  • Add the utility function in this file if not available from the utility module.

All changes occur in litellm/llms/azure/videos/transformation.py at/around line 313.

Suggested changeset 1
litellm/llms/azure/videos/transformation.py

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/litellm/llms/azure/videos/transformation.py b/litellm/llms/azure/videos/transformation.py
--- a/litellm/llms/azure/videos/transformation.py
+++ b/litellm/llms/azure/videos/transformation.py
@@ -310,7 +310,19 @@
                         ("files", ("input_reference.png", _input_reference, "image/png"))
                     )
         
-        verbose_logger.debug(f"Azure video request data: {data_dict}")
+        # Sanitize potentially sensitive fields before logging
+        def _sanitize_for_logging(input_dict):
+            SENSITIVE_KEYS = {"api_key", "api_key_secret", "authorization", "access_token", "token"}
+            sanitized = {}
+            for k, v in input_dict.items():
+                # Redact sensitive keys
+                if k.lower() in SENSITIVE_KEYS or "key" in k.lower() or "token" in k.lower():
+                    sanitized[k] = "[REDACTED]"
+                else:
+                    sanitized[k] = v
+            return sanitized
+
+        verbose_logger.debug(f"Azure video request data: {_sanitize_for_logging(data_dict)}")
         verbose_logger.debug(f"Azure video request files: {[f[0] for f in files_list]}")
         
         return data_dict, files_list
EOF
@@ -310,7 +310,19 @@
("files", ("input_reference.png", _input_reference, "image/png"))
)

verbose_logger.debug(f"Azure video request data: {data_dict}")
# Sanitize potentially sensitive fields before logging
def _sanitize_for_logging(input_dict):
SENSITIVE_KEYS = {"api_key", "api_key_secret", "authorization", "access_token", "token"}
sanitized = {}
for k, v in input_dict.items():
# Redact sensitive keys
if k.lower() in SENSITIVE_KEYS or "key" in k.lower() or "token" in k.lower():
sanitized[k] = "[REDACTED]"
else:
sanitized[k] = v
return sanitized

verbose_logger.debug(f"Azure video request data: {_sanitize_for_logging(data_dict)}")
verbose_logger.debug(f"Azure video request files: {[f[0] for f in files_list]}")

return data_dict, files_list
Copilot is powered by AI and may make mistakes. Always verify output.
@Sameerlite Sameerlite changed the title Litellm videos azure retrieval Add Azure Video Generation Support with Sora Integration Oct 22, 2025
@Sameerlite Sameerlite changed the base branch from litellm_videos_openai_retrieval_2 to litellm_sameer_oct_staging October 23, 2025 03:53
@Sameerlite Sameerlite merged commit e5fa283 into litellm_sameer_oct_staging Oct 23, 2025
38 of 43 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant