Skip to content

Conversation

@ishaan-jaff
Copy link
Contributor

[Feat] A2a Gateway - allow using bedrock agentcore, langgraph agents with A2a Gateway

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
✅ Test

Changes

@vercel
Copy link

vercel bot commented Dec 10, 2025

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

Project Deployment Preview Comments Updated (UTC)
litellm Error Error Dec 10, 2025 8:56pm

if "thread_id" in optional_params:
payload["thread_id"] = optional_params["thread_id"]

verbose_logger.debug(f"LangGraph request payload: {payload}")

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 (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 (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 (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 expressi

Copilot Autofix

AI 1 day ago

To fix this issue, we must avoid logging sensitive fields (such as any kind of API key, tokens, or likely-secret values) as part of the raw payload. The proper way is to sanitize the payload before logging by removing or masking sensitive information. Specifically, prior to logging, we should create a sanitized copy of the payload dictionary with potentially sensitive fields either removed or replaced with a placeholder (e.g., "***"). This includes, at a minimum, theoretically sensitive standard fields such as "api_key" (if present) and any other field known to possibly contain secrets (e.g., "Authorization", "assistant_id" if it can be secret, or any user-defined metadata/config fields as appropriate). The replacement should only apply to the logger call, returning the original payload object normally.
Edits should occur directly in the transform_request method (around line 220) in litellm/llms/langgraph/chat/transformation.py, possibly adding a small utility method in this file for clarity if multiple log sanitizations are needed, or just inlining it for one-off use. This change does not require new imports or definitions from outside the provided snippet.


Suggested changeset 1
litellm/llms/langgraph/chat/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/langgraph/chat/transformation.py b/litellm/llms/langgraph/chat/transformation.py
--- a/litellm/llms/langgraph/chat/transformation.py
+++ b/litellm/llms/langgraph/chat/transformation.py
@@ -217,7 +217,12 @@
         if "thread_id" in optional_params:
             payload["thread_id"] = optional_params["thread_id"]
 
-        verbose_logger.debug(f"LangGraph request payload: {payload}")
+        # Sanitize payload before logging to avoid leaking secrets
+        sanitized_payload = dict(payload)
+        for sensitive_field in ["api_key", "Authorization", "assistant_id"]:
+            if sensitive_field in sanitized_payload:
+                sanitized_payload[sensitive_field] = "***"
+        verbose_logger.debug(f"LangGraph request payload: {sanitized_payload}")
         return payload
 
     def _extract_content_from_response(self, response_json: dict) -> str:
EOF
@@ -217,7 +217,12 @@
if "thread_id" in optional_params:
payload["thread_id"] = optional_params["thread_id"]

verbose_logger.debug(f"LangGraph request payload: {payload}")
# Sanitize payload before logging to avoid leaking secrets
sanitized_payload = dict(payload)
for sensitive_field in ["api_key", "Authorization", "assistant_id"]:
if sensitive_field in sanitized_payload:
sanitized_payload[sensitive_field] = "***"
verbose_logger.debug(f"LangGraph request payload: {sanitized_payload}")
return payload

def _extract_content_from_response(self, response_json: dict) -> str:
Copilot is powered by AI and may make mistakes. Always verify output.
if client is None or not isinstance(client, HTTPHandler):
client = _get_httpx_client(params={})

verbose_logger.debug(f"Making sync streaming request to: {api_base}")

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 (secret)
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 (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 (secret)
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 (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 (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 (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 log

Copilot Autofix

AI 1 day ago

To resolve the issue, avoid logging sensitive data (such as API endpoints that could include credentials or secrets) as clear text.

  • General approach: Never log full endpoints or URL values which could, in some deployments, contain sensitive query string parameters, credentials, tokens, or keys.
  • Best practice: If you need to log requests for debugging purposes, you should sanitize any user/configuration-derived values before logging, or alternatively, omit these values from logs altogether.
  • Specific fix for this code:
    • In litellm/llms/langgraph/chat/transformation.py, within the get_sync_custom_stream_wrapper method, remove or sanitize the verbose_logger.debug(f"Making sync streaming request to: {api_base}") logging statement.
    • If you still want to log activity for observability, replace it with a generic message, e.g., "Making sync streaming request," without exposing the endpoint.
    • No new methods or complex imports are required; only edit the logging statement.
Suggested changeset 1
litellm/llms/langgraph/chat/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/langgraph/chat/transformation.py b/litellm/llms/langgraph/chat/transformation.py
--- a/litellm/llms/langgraph/chat/transformation.py
+++ b/litellm/llms/langgraph/chat/transformation.py
@@ -293,7 +293,7 @@
         if client is None or not isinstance(client, HTTPHandler):
             client = _get_httpx_client(params={})
 
-        verbose_logger.debug(f"Making sync streaming request to: {api_base}")
+        verbose_logger.debug("Making sync streaming request.")
 
         # Make streaming request
         response = client.post(
EOF
@@ -293,7 +293,7 @@
if client is None or not isinstance(client, HTTPHandler):
client = _get_httpx_client(params={})

verbose_logger.debug(f"Making sync streaming request to: {api_base}")
verbose_logger.debug("Making sync streaming request.")

# Make streaming request
response = client.post(
Copilot is powered by AI and may make mistakes. Always verify output.
llm_provider=cast(Any, "langgraph"), params={}
)

verbose_logger.debug(f"Making async streaming request to: {api_base}")

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 (secret)
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 (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 (secret)
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 (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 (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 (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 log

Copilot Autofix

AI 1 day ago

To remediate this vulnerability, we should avoid logging the complete api_base value, as it may contain embedded secrets or sensitive keys. Instead, log only generic information, or completely omit logging sensitive connection endpoints. In this context, replacing:

verbose_logger.debug(f"Making async streaming request to: {api_base}")

with:

verbose_logger.debug("Making async streaming request to LangGraph endpoint.")

or, at most, logging only the scheme and domain (i.e. stripping path and query). This guarantees sensitive information is not printed.
Make the same change for similar sync handler (line 296), for complete coverage.

No new imports are needed, and existing logger usage remains unchanged. Only the log statement context string needs to be changed.

Suggested changeset 1
litellm/llms/langgraph/chat/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/langgraph/chat/transformation.py b/litellm/llms/langgraph/chat/transformation.py
--- a/litellm/llms/langgraph/chat/transformation.py
+++ b/litellm/llms/langgraph/chat/transformation.py
@@ -293,7 +293,7 @@
         if client is None or not isinstance(client, HTTPHandler):
             client = _get_httpx_client(params={})
 
-        verbose_logger.debug(f"Making sync streaming request to: {api_base}")
+        verbose_logger.debug("Making sync streaming request to LangGraph endpoint.")
 
         # Make streaming request
         response = client.post(
@@ -358,7 +358,7 @@
                 llm_provider=cast(Any, "langgraph"), params={}
             )
 
-        verbose_logger.debug(f"Making async streaming request to: {api_base}")
+        verbose_logger.debug("Making async streaming request to LangGraph endpoint.")
 
         # Make async streaming request
         response = await client.post(
EOF
@@ -293,7 +293,7 @@
if client is None or not isinstance(client, HTTPHandler):
client = _get_httpx_client(params={})

verbose_logger.debug(f"Making sync streaming request to: {api_base}")
verbose_logger.debug("Making sync streaming request to LangGraph endpoint.")

# Make streaming request
response = client.post(
@@ -358,7 +358,7 @@
llm_provider=cast(Any, "langgraph"), params={}
)

verbose_logger.debug(f"Making async streaming request to: {api_base}")
verbose_logger.debug("Making async streaming request to LangGraph endpoint.")

# Make async streaming request
response = await client.post(
Copilot is powered by AI and may make mistakes. Always verify output.
@ishaan-jaff ishaan-jaff merged commit 7ad2a58 into main Dec 10, 2025
40 of 59 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.

2 participants