From 234b67c24c5cf35d33230f75b5646442edc7b52d Mon Sep 17 00:00:00 2001 From: nileshpatil6 Date: Tue, 19 May 2026 23:48:11 +0530 Subject: [PATCH 1/2] fix(LiteLlm): recognize assistant- prefix as valid OpenAI file ID --- src/google/adk/models/lite_llm.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/google/adk/models/lite_llm.py b/src/google/adk/models/lite_llm.py index 4d4f93c88f..3ae69efddd 100644 --- a/src/google/adk/models/lite_llm.py +++ b/src/google/adk/models/lite_llm.py @@ -281,7 +281,7 @@ def _infer_mime_type_from_uri(uri: str) -> Optional[str]: def _looks_like_openai_file_id(file_uri: str) -> bool: """Returns True when file_uri resembles an OpenAI/Azure file id.""" - return file_uri.startswith("file-") + return file_uri.startswith(("file-", "assistant-")) def _is_http_url(uri: str) -> bool: @@ -299,6 +299,8 @@ def _redact_file_uri_for_log( """Returns a privacy-preserving identifier for logs.""" if display_name: return display_name + if file_uri.startswith("assistant-"): + return "assistant-" if _looks_like_openai_file_id(file_uri): return "file-" try: From d47f7a6d6f6c2a3bffddfe0c575196d728f10d6f Mon Sep 17 00:00:00 2001 From: nileshpatil6 Date: Thu, 21 May 2026 18:03:49 +0530 Subject: [PATCH 2/2] test: add coverage for assistant- prefix file ID recognition --- tests/unittests/models/test_litellm.py | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tests/unittests/models/test_litellm.py b/tests/unittests/models/test_litellm.py index 216866602f..63202661ed 100644 --- a/tests/unittests/models/test_litellm.py +++ b/tests/unittests/models/test_litellm.py @@ -40,11 +40,13 @@ from google.adk.models.lite_llm import _get_content from google.adk.models.lite_llm import _get_provider_from_model from google.adk.models.lite_llm import _is_anthropic_model +from google.adk.models.lite_llm import _looks_like_openai_file_id from google.adk.models.lite_llm import _message_to_generate_content_response from google.adk.models.lite_llm import _MISSING_TOOL_RESULT_MESSAGE from google.adk.models.lite_llm import _model_response_to_chunk from google.adk.models.lite_llm import _model_response_to_generate_content_response from google.adk.models.lite_llm import _parse_tool_calls_from_text +from google.adk.models.lite_llm import _redact_file_uri_for_log from google.adk.models.lite_llm import _redirect_litellm_loggers_to_stdout from google.adk.models.lite_llm import _safe_json_serialize from google.adk.models.lite_llm import _schema_to_dict @@ -4987,3 +4989,44 @@ async def test_generate_content_async_skips_request_log_build_above_debug( assert mock_build.called is should_call finally: litellm_logger.setLevel(original_level) + + +@pytest.mark.parametrize( + "file_uri, expected", + [ + ("file-abc123", True), + ("assistant-abc123", True), + ("https://example.com/file.pdf", False), + ("not-a-file-id", False), + ("", False), + ("FILE-abc123", False), + ], +) +def test_looks_like_openai_file_id(file_uri, expected): + """Both `file-` and `assistant-` (Azure assistants) prefixes count as OpenAI file IDs.""" + assert _looks_like_openai_file_id(file_uri) is expected + + +@pytest.mark.parametrize( + "file_uri, expected", + [ + ("file-abc123", "file-"), + ("assistant-abc123", "assistant-"), + ], +) +def test_redact_file_uri_for_log_openai_prefixes(file_uri, expected): + """OpenAI-style IDs are redacted while preserving the prefix kind.""" + assert _redact_file_uri_for_log(file_uri) == expected + + +def test_redact_file_uri_for_log_uses_display_name_when_provided(): + assert ( + _redact_file_uri_for_log("file-abc123", display_name="my.pdf") == "my.pdf" + ) + + +def test_redact_file_uri_for_log_http_url_keeps_scheme_and_tail(): + assert ( + _redact_file_uri_for_log("https://example.com/path/file.pdf") + == "https:///file.pdf" + )