Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/google/adk/models/lite_llm.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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-<redacted>"
if _looks_like_openai_file_id(file_uri):
return "file-<redacted>"
try:
Expand Down
43 changes: 43 additions & 0 deletions tests/unittests/models/test_litellm.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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-<redacted>"),
("assistant-abc123", "assistant-<redacted>"),
],
)
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://<redacted>/file.pdf"
)