Skip to content

Conversation

@krrishdholakia
Copy link
Contributor

@krrishdholakia krrishdholakia commented Oct 29, 2025

Title

(feat) audio transcriptions cost tracking (for azure/other non-openai models)

Includes Response Duration

Screenshot 2025-10-29 at 4 53 22 PM

Includes Cost

Screenshot 2025-10-29 at 4 55 15 PM

Relevant issues

Fixes #11846
Closes #13939
Fixes issue where unified guardrails weren't working with audio transcription due to call type issue

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

  • introduces new dependency on soundfile pkg - this is used to calculate the duration for any input audio, enabling accurate cost tracking

@vercel
Copy link

vercel bot commented Oct 29, 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 30, 2025 2:01am

verbose_logger.debug(
f"Looking up cost for video model: {base_model_name}"
)
verbose_logger.debug(f"Looking up cost for video model: {base_model_name}")

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

Copilot Autofix

AI about 15 hours ago

To fix the issue, we should mask or redact any potentially sensitive information from the value logged at line 1471 in litellm/cost_calculator.py. The logging statement should only output the part of the model name that is safe and appropriate to expose. In this context, we can:

  • Use an existing utility function or create a simple helper to sanitize the model name, ensuring no secrets or API keys are included before logging.
  • If there is no function available for masking, we can modify the logging line to prevent sensitive provider-prefixed portions (such as API keys) from being displayed; for example, by removing or replacing the provider prefix if it matches a sensitive value pattern.
  • The change should only affect the verbose_logger.debug call at line 1471 and use a masking/redaction strategy that does not otherwise affect functionality.
  • Preferably, use a function such as _get_masked_values or a pattern that redacts/masks substrings that match the API key or other known secrets.

File/Region to edit:

  • litellm/cost_calculator.py, line 1471: logging statement.

Methods/Imports needed:

  • If available, use a utility function to mask/redact sensitive values (e.g. _get_masked_values from related utils).
  • If not, include a simple masking logic inline (e.g., replace sensitive substrings with ***).

Suggested changeset 1
litellm/cost_calculator.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/cost_calculator.py b/litellm/cost_calculator.py
--- a/litellm/cost_calculator.py
+++ b/litellm/cost_calculator.py
@@ -1468,7 +1468,16 @@
             f"{custom_llm_provider}/{model_name_without_custom_llm_provider}"
         )
 
-    verbose_logger.debug(f"Looking up cost for video model: {base_model_name}")
+    # Mask potentially sensitive values in base_model_name before logging
+    safe_base_model_name = base_model_name
+    if isinstance(safe_base_model_name, str):
+        # Mask content after known provider prefix (e.g. if api_key present)
+        parts = safe_base_model_name.split("/")
+        if len(parts) > 2:
+            # If the provider part could contain sensitive info, mask it
+            parts[1] = "***"
+            safe_base_model_name = "/".join(parts)
+    verbose_logger.debug(f"Looking up cost for video model: {safe_base_model_name}")
 
     model_without_provider = model.split("/")[-1]
 
EOF
@@ -1468,7 +1468,16 @@
f"{custom_llm_provider}/{model_name_without_custom_llm_provider}"
)

verbose_logger.debug(f"Looking up cost for video model: {base_model_name}")
# Mask potentially sensitive values in base_model_name before logging
safe_base_model_name = base_model_name
if isinstance(safe_base_model_name, str):
# Mask content after known provider prefix (e.g. if api_key present)
parts = safe_base_model_name.split("/")
if len(parts) > 2:
# If the provider part could contain sensitive info, mask it
parts[1] = "***"
safe_base_model_name = "/".join(parts)
verbose_logger.debug(f"Looking up cost for video model: {safe_base_model_name}")

model_without_provider = model.split("/")[-1]

Copilot is powered by AI and may make mistakes. Always verify output.
aligns response to openai spec and improves cost tracking accuracy
…on to use image response instead of hidden params
@krrishdholakia krrishdholakia changed the title (feat) audio transcriptions cost tracking (for azure/other non-openai models) (feat) audio transcriptions cost tracking (for azure/other non-openai models) + (fix) image generations - accurate cost tracking for dalle3/gpt-image-1 - uses the correct max image quality Oct 30, 2025
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.

[Bug]: audio transcription cost is always 0

2 participants