fix(download): save multi-variant files under raw stored filenames (#1100)

The public REST API rewrites files[].name to "{model}_{version}" for
non-LoRA model types, so every precision variant of a multi-file version
shared one name and landed on disk with a random short-hash suffix.

Fetch the raw stored filename from the model-versions/mini endpoint
(always pinned with modelFileId) and use it for the on-disk name and
metadata when available; fall back silently to the REST name otherwise.
CivArchive already serves raw names and is skipped.
This commit is contained in:
Will Miao
2026-09-06 22:23:48 +08:00
parent a17399d667
commit 41302e75ba
6 changed files with 427 additions and 0 deletions
+41
View File
@@ -818,3 +818,44 @@ async def test_get_model_by_hash_rejects_empty_placeholder_without_request(downl
assert result is None
assert error == "Model not found"
assert requested == []
async def test_get_version_file_mini_returns_payload(downloader):
"""The mini endpoint returns the raw stored filename (#1100)."""
client = await CivitaiClient.get_instance()
async def fake_make_request(method, url, use_auth=True, **kwargs):
assert method == "GET"
assert url.endswith("/model-versions/mini/3284136")
assert kwargs.get("params") == {"modelFileId": 3168412}
assert use_auth is True
return True, {"fileName": "CyberRealistic_zit_v8.0_bf16.safetensors"}
downloader.make_request = fake_make_request
result = await client.get_version_file_mini(3284136, 3168412)
assert result == {"fileName": "CyberRealistic_zit_v8.0_bf16.safetensors"}
async def test_get_version_file_mini_returns_none_on_failure(downloader):
client = await CivitaiClient.get_instance()
async def fake_make_request(method, url, use_auth=True, **kwargs):
return False, "Model file 2 not found in version 1"
downloader.make_request = fake_make_request
assert await client.get_version_file_mini(1, 2) is None
async def test_get_version_file_mini_propagates_rate_limit(downloader):
client = await CivitaiClient.get_instance()
async def fake_make_request(method, url, use_auth=True, **kwargs):
return False, RateLimitError("limited", retry_after=1.0)
downloader.make_request = fake_make_request
with pytest.raises(RateLimitError):
await client.get_version_file_mini(1, 2)