Merge pull request #36031 from BerriAI/litellm_b13_unscoped_files_list

fix(managed_files): return unified ids from unscoped file listing
This commit is contained in:
Mateo Wang 2026-08-05 20:11:15 -07:00 committed by GitHub
commit d26ef670e2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 41 additions and 6 deletions

View file

@ -384,9 +384,11 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints):
}
)
return [
OpenAIFileObject.model_validate(file_object.file_object)
for file_object in file_ids
if file_object.file_object is not None
OpenAIFileObject.model_validate(row.file_object).model_copy(
update={"id": row.unified_file_id}
)
for row in file_ids
if row.file_object is not None
]
async def check_managed_file_id_access(

View file

@ -144,8 +144,11 @@ async def test_get_user_created_file_ids_skips_rows_without_file_object():
managed_files = _make_managed_files_instance()
managed_files.prisma_client.db.litellm_managedfiletable.find_many = AsyncMock(
return_value=[
MagicMock(file_object=_make_file_object().model_dump()),
MagicMock(file_object=None),
MagicMock(
file_object=_make_file_object().model_dump(),
unified_file_id="unified-id-1",
),
MagicMock(file_object=None, unified_file_id="unified-id-2"),
]
)
@ -153,7 +156,37 @@ async def test_get_user_created_file_ids_skips_rows_without_file_object():
_make_user_api_key_dict(), ["file-output-abc"]
)
assert [file.id for file in files] == ["file-output-abc"]
assert [file.id for file in files] == ["unified-id-1"]
@pytest.mark.asyncio
async def test_get_user_created_file_ids_remaps_stored_raw_provider_id_to_unified_id():
"""
Rows registered from batch outputs store the provider's file object, whose
id is the raw provider id (e.g. file-abc). Listing must return the row's
unified_file_id so callers get ids that work on the managed routes.
Regression test for https://github.com/BerriAI/litellm/issues/35362.
"""
unified_id = "bGl0ZWxsbV9wcm94eTt1bmlmaWVkX2lkLGRlYWRiZWVm"
raw_provider_object = _make_file_object("file-raw-provider-123")
managed_files = _make_managed_files_instance()
managed_files.prisma_client.db.litellm_managedfiletable.find_many = AsyncMock(
return_value=[
MagicMock(
file_object=raw_provider_object.model_dump(),
unified_file_id=unified_id,
),
]
)
files = await managed_files.get_user_created_file_ids(
_make_user_api_key_dict(), ["file-raw-provider-123"]
)
assert [file.id for file in files] == [unified_id]
assert files[0].filename == raw_provider_object.filename
assert files[0].purpose == raw_provider_object.purpose
@pytest.mark.asyncio