genmodelfit 0.2.0__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/CHANGELOG.md +99 -1
  2. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/CONTRIBUTING.md +74 -37
  3. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/PKG-INFO +142 -6
  4. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/README.md +141 -5
  5. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/docs/accuracy.md +58 -1
  6. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/docs/license_requests.md +1 -1
  7. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/docs/release.md +100 -2
  8. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/docs/schema.md +251 -9
  9. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/docs/sources.md +14 -5
  10. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/__init__.py +39 -0
  11. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/_version.py +1 -1
  12. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/calibrate.py +97 -4
  13. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/cli.py +921 -1
  14. genmodelfit-0.4.0/src/genmodelfit/contrib.py +1357 -0
  15. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/data/calibration.json +51 -1
  16. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/data/db.json +2079 -1729
  17. genmodelfit-0.4.0/src/genmodelfit/data/measurements_community.json +8 -0
  18. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/db.py +8 -1
  19. genmodelfit-0.4.0/src/genmodelfit/diff.py +277 -0
  20. genmodelfit-0.4.0/src/genmodelfit/downloader.py +1167 -0
  21. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/estimate.py +123 -10
  22. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/models.py +21 -0
  23. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/recommend.py +9 -1
  24. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/safety.py +8 -0
  25. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/update.py +65 -11
  26. genmodelfit-0.4.0/src/genmodelfit/weekly.py +587 -0
  27. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/clihelp.py +7 -0
  28. genmodelfit-0.4.0/tests/fixtures/contrib/rtx-3070/2026-10-20-5bedb2da.json +37 -0
  29. genmodelfit-0.4.0/tests/fixtures/contrib/rtx-3070/2026-10-20-78740c83.json +37 -0
  30. genmodelfit-0.4.0/tests/fixtures/contrib/rtx-3070/2026-10-20-ccef2c3e.json +37 -0
  31. genmodelfit-0.4.0/tests/fixtures/contrib/rtx-4060/2026-10-21-e361ba52.json +37 -0
  32. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf_search/direction_-1_filter_not-for-all-audiences_limit_100_pipeline_tag_text-to-image_sort_downloads.json +23 -1
  33. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf_search/direction_-1_limit_100_pipeline_tag_text-to-speech_sort_trendingScore.json +19 -4
  34. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_cli_casual.py +27 -5
  35. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_cli_json.py +15 -4
  36. genmodelfit-0.4.0/tests/test_contrib.py +1036 -0
  37. genmodelfit-0.4.0/tests/test_diff.py +219 -0
  38. genmodelfit-0.4.0/tests/test_download.py +1063 -0
  39. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_groups.py +1 -1
  40. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_license_sources.py +18 -0
  41. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_privacy_pc.py +36 -0
  42. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_release.py +1 -1
  43. genmodelfit-0.4.0/tests/test_safety_dataset.py +31 -0
  44. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_status.py +25 -10
  45. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_update.py +36 -2
  46. genmodelfit-0.4.0/tests/test_weekly.py +364 -0
  47. genmodelfit-0.4.0/tests/test_workflows.py +125 -0
  48. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/.gitignore +0 -0
  49. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/LICENSE +0 -0
  50. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/THIRD_PARTY_NOTICES +0 -0
  51. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/docs/gate.md +0 -0
  52. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/docs/hardware.md +0 -0
  53. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/pyproject.toml +0 -0
  54. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/__main__.py +0 -0
  55. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/bench.py +0 -0
  56. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/data/__init__.py +0 -0
  57. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/data/measurements.json +0 -0
  58. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/data/signing_keys/2026-10.pub +0 -0
  59. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/families.py +0 -0
  60. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/fetch.py +0 -0
  61. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/gate.py +0 -0
  62. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/groups.py +0 -0
  63. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/hardware.py +0 -0
  64. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/headers.py +0 -0
  65. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/hf.py +0 -0
  66. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/license_sources.py +0 -0
  67. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/py.typed +0 -0
  68. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/remote.py +0 -0
  69. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/repo_precision.py +0 -0
  70. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/signing.py +0 -0
  71. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/status.py +0 -0
  72. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/table.py +0 -0
  73. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/tasks.py +0 -0
  74. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/src/genmodelfit/workflow.py +0 -0
  75. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/conftest.py +0 -0
  76. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/3d_hunyuan3d_image_to_model.json +0 -0
  77. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/audio_ace_step_1_5_checkpoint.json +0 -0
  78. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/lspci_amd_nvidia.txt +0 -0
  79. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/nvsmi_garbage.txt +0 -0
  80. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/nvsmi_multi.csv +0 -0
  81. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/nvsmi_na.csv +0 -0
  82. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/nvsmi_no_devices.txt +0 -0
  83. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/nvsmi_no_driver.txt +0 -0
  84. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/nvsmi_old_error.txt +0 -0
  85. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/nvsmi_old_kepler.csv +0 -0
  86. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/nvsmi_old_maxwell.csv +0 -0
  87. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/nvsmi_rtx3070_win.csv +0 -0
  88. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/registry_amd_stale.json +0 -0
  89. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/registry_this_pc.json +0 -0
  90. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/wmi_amd_single.json +0 -0
  91. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/wmi_basic_nvidia.json +0 -0
  92. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/wmi_intel_nvidia.json +0 -0
  93. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/hardware/wmi_this_pc.json +0 -0
  94. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/image_sdxl_simple.json +0 -0
  95. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/image_z_image_turbo_int8.json +0 -0
  96. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/object_info_subset.json +0 -0
  97. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/text_to_video_wan.json +0 -0
  98. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/ACE-Step__Ace-Step1.5.json +0 -0
  99. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/AtomicChat__Qwen-Image-2.1-Turbo-Uncensored-GGUF.json +0 -0
  100. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Comfy-Org__Wan_2.1_ComfyUI_repackaged.json +0 -0
  101. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Comfy-Org__ace_step_1.5_ComfyUI_files.json +0 -0
  102. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Comfy-Org__hunyuan3D_2.0_repackaged.json +0 -0
  103. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Comfy-Org__stable-audio-open-1.0_repackaged.json +0 -0
  104. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Comfy-Org__z_image_turbo.json +0 -0
  105. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/ComfyUI-Wiki__t5-base.json +0 -0
  106. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/MeiGen-AI__InfiniteTalk.json +0 -0
  107. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Noctaluna__Noct-Q-Uncensored-Qwen-Image-2.1.json +0 -0
  108. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Qwen__Qwen-Image-2.1.json +0 -0
  109. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Qwen__Qwen3-VL-8B-Instruct.json +0 -0
  110. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Tongyi-MAI__Z-Image-Turbo.json +0 -0
  111. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Wan-AI__Wan2.1-FLF2V-14B-720P.json +0 -0
  112. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Wan-AI__Wan2.1-I2V-14B-480P.json +0 -0
  113. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Wan-AI__Wan2.1-I2V-14B-720P.json +0 -0
  114. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Wan-AI__Wan2.1-T2V-1.3B.json +0 -0
  115. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Wan-AI__Wan2.1-T2V-14B.json +0 -0
  116. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Wan-AI__Wan2.1-VACE-1.3B.json +0 -0
  117. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/Wan-AI__Wan2.1-VACE-14B.json +0 -0
  118. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/alibaba-pai__Wan2.1-Fun-V1.1-1.3B-Control-Camera.json +0 -0
  119. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/alibaba-pai__Wan2.1-Fun-V1.1-1.3B-Control.json +0 -0
  120. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/alibaba-pai__Wan2.1-Fun-V1.1-1.3B-InP.json +0 -0
  121. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/alibaba-pai__Wan2.1-Fun-V1.1-14B-Control-Camera.json +0 -0
  122. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/example-org__plain-nsfw-xl.json +0 -0
  123. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/hexgrad__Kokoro-82M.json +0 -0
  124. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/htdong__Wan-Alpha.json +0 -0
  125. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/stabilityai__stable-audio-open-1.0.json +0 -0
  126. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/tencent__Hunyuan3D-2.json +0 -0
  127. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/tencent__Hunyuan3D-2mv.json +0 -0
  128. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf/yl4579__StyleTTS2-LJSpeech.json +0 -0
  129. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf_readme/AtomicChat__Qwen-Image-2.1-Turbo-Uncensored-GGUF.md +0 -0
  130. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf_readme/Noctaluna__Noct-Q-Uncensored-Qwen-Image-2.1.md +0 -0
  131. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf_readme/example-org__plain-nsfw-xl.md +0 -0
  132. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf_readme/hexgrad__Kokoro-82M.md +0 -0
  133. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf_search/direction_-1_limit_100_pipeline_tag_text-to-image_search_uncensored_sort_downloads.json +0 -0
  134. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/hf_search/direction_-1_limit_100_pipeline_tag_text-to-speech_sort_downloads.json +0 -0
  135. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/templates/3d_hunyuan3d_image_to_model.json +0 -0
  136. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/templates/audio_ace_step_1_5_checkpoint.json +0 -0
  137. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/templates/audio_stable_audio_example.json +0 -0
  138. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/templates/image_z_image_turbo.json +0 -0
  139. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/templates/image_z_image_turbo_int8.json +0 -0
  140. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/templates/index.json +0 -0
  141. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/update/templates/templates-wan2_1_infinitetalk_music.json +0 -0
  142. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/fixtures/video_wan2_2_14B_i2v.json +0 -0
  143. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_bench.py +0 -0
  144. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_bench_rtx3070.py +0 -0
  145. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_core.py +0 -0
  146. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_embedding.py +0 -0
  147. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_estimate.py +0 -0
  148. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_families.py +0 -0
  149. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_gate.py +0 -0
  150. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_gate_real.py +0 -0
  151. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_hardware.py +0 -0
  152. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_invariants.py +0 -0
  153. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_issue_28.py +0 -0
  154. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_issue_30.py +0 -0
  155. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_licenses.py +0 -0
  156. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_privacy.py +0 -0
  157. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_review_14.py +0 -0
  158. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_review_fixes.py +0 -0
  159. {genmodelfit-0.2.0 → genmodelfit-0.4.0}/tests/test_table.py +0 -0
@@ -7,7 +7,105 @@ All notable changes to this project are documented here. The format is based on
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ## [0.2.0] - Unreleased
10
+ ## [0.4.0] - 2026-10-21
11
+
12
+ ### Added
13
+
14
+ - `genmodelfit diff OLD NEW [--json]` and `gmf.diff_db(old, new)` (Issue #19): what changed between two lists —
15
+ added / removed models, license changes (changes toward the permissive side are marked), auto-recommendation
16
+ changes under one policy for both lists (HEAD age ignored), size / precision changes beyond a threshold, newly
17
+ uncensored models, failed HEAD checks, 401 repos and changed `sources` numbers. JSON: docs/schema.md "diff".
18
+ 2 つの一覧の違いをまとめる `diff` を足した。
19
+ - Weekly data refresh (Issue #19): `.github/workflows/weekly-data.yml` rebuilds the list every Monday with
20
+ `python -m genmodelfit.weekly` (caches kept between runs), checks it (auto count, the HEAD expiry must be more than
21
+ 7 days away, ruff and pytest with the new list) and opens a pull request `automated/weekly-data` whose body is the
22
+ diff. It is never merged automatically; publishing stays in data.yml after the owner merges. A partial rebuild
23
+ fails unless run by hand with `allow_partial` and only HF repos failed transiently. docs/release.md.
24
+ 毎週、作り直した一覧を PR にする(自動ではマージしない。配るのはマージした一覧だけ)。
25
+
26
+ - Measurement submissions from users (Issue #34). `genmodelfit bench … --submission PATH` and
27
+ `genmodelfit contrib make --from <bench result>` write a submission file (`contrib_schema` 1:
28
+ `data/contrib/<gpu>/<date>-<sha8>.json`) with the GPU name / VRAM / generation / compute capability / driver, the ComfyUI
29
+ version, the OS family, RAM rounded to GiB and the results — never host / user names, paths, GPU UUID, PCI address,
30
+ IP, CPU name or exact times (the note is scrubbed). genmodelfit sends nothing; users open the pull request themselves.
31
+ `contrib show` prints exactly what will be shared with a privacy checklist; `contrib validate` checks schema, value
32
+ ranges, privacy patterns, GPU name / generation consistency, file name and duplicates (exit 0 / 1 / 2);
33
+ `.github/workflows/contrib.yml` runs it on pull requests touching `data/contrib/**` (read-only, the tool installed
34
+ from the base commit, results in the job summary). `contrib aggregate` groups submissions by model, settings and GPU
35
+ with median / MAD outlier removal into the new bundled `measurements_community.json` (empty for now), and
36
+ `--report` re-runs the calibration and flags errors above a threshold (default 25%, exit 3 with `--fail-on-breach`)
37
+ for the weekly job of #19.
38
+ - `Estimate.basis_detail` (`measured` > `measured_community` > `calibrated` > `estimated`); `basis` stays
39
+ `measured` / `estimated`. Community measurements are used only when at least two consistent submissions agree (and
40
+ no OOM), rank after the maintainer's measurements at the same settings, and can only raise the needs (never lower
41
+ VRAM / RAM, never improve a level, never raise the score: `basis` points 0 like estimates). `validate` marks
42
+ implausible values (more than 40% from the formula, below the weights with `offload: none`), values that would raise
43
+ the estimate by more than 15% or change a level at common VRAM / RAM sizes, unknown models and unknown GPUs as
44
+ review-required; approval is per submission (`--allow-review <sha8>` or the maintainers' `data/contrib/REVIEWED`).
45
+ Unapproved community rows raise needs by at most 15% and are ignored where they would change the level.
46
+ `aggregate --report` lists the level changes caused by community data.
47
+ - `torch_reserved` measurements (bench; without the CUDA context) are now lower bounds: below the formula they no
48
+ longer lower the estimate (the bundled RTX 3070 rows for BiRefNet and MoGe now use the formula value).
49
+ `Measurement.origin` / `n_submissions` / `consistent` (optional fields).
50
+ - `python -m genmodelfit.calibrate` also writes the check rows (measurements in another `vram_metric`, such as the
51
+ RTX 3070 runs) to `calibration.json` (`check`) and the accuracy table; LOO rows carry `gpu_name` and `origin`.
52
+ Coefficients are unchanged.
53
+ 利用者の実測の提出(作る・見る・検査・まとめ・毎週の精度の点検)と、根拠の段階 `basis_detail` を足した。
54
+
55
+ ### Changed
56
+
57
+ - Hugging Face selection (Issue #19): the 1,000 all-time floor for models found only by the trending / likes30d
58
+ searches now needs a trendingScore of at least 0.5 and at least 100 downloads in the last 30 days (otherwise
59
+ 10,000 applies); repo names containing `merge` / `mergekit` are skipped like the tag; quantized / format copies
60
+ are recognized by name (`-GGUF`, `-Q8_0`, `_K_M`, `-fp8`, `-nf4`, `-int8`, `_diffusers`, `-Quantized`, …) and
61
+ only the most downloaded is kept; uncensored models also need 100 downloads in the last 30 days.
62
+ HF の選び方を締めた(伸びている条件・名前の merge・量子化の写し・無検閲は直近 30 日も使われているもの)。
63
+ - The bundled list was rebuilt with these rules (326 entries: HF 48, uncensored 26; auto 99 unchanged).
64
+ Added: 6 uncensored HF models that meet the rules and the new official template `video_fasth3_ominiref_r2v`;
65
+ removed: `hf:0xSojalSec/Qwen-Image-2.1-Uncensored-GGUF` (a quantized copy of
66
+ `hf:abenzerps/Qwen-Image-2.1-Uncensored-Quantized`) and `hf:TheImposterImposters/lustifySDXLNSFW_v20-inpainting`
67
+ (the same weights, by sha256, as the more downloaded `hf:andro-flock/LUSTIFY-SDXL-NSFW-checkpoint-v2-0-INPAINTING`).
68
+ 同梱の一覧を新しい規則で作り直した。
69
+ - Weekly PR body: every upstream string is HTML-escaped and Markdown-neutralized (`weekly.md`), mentions are
70
+ broken, truncation keeps `<details>` balanced; a scheduled run fails when more than 5 entries become uncensored
71
+ or when HF / template / uncensored / auto counts fall below half.
72
+
73
+ ### Fixed
74
+
75
+ - Exclusion (safety): uncensored models whose ID, name, tags or card mention a dataset known to include a category
76
+ of sexual content involving minors (`DATASET_TERMS`: e621) are excluded, even when that is not their purpose
77
+ (owner decision, 2026-10-21; `hf:hearmeneigh/sd21-e621-rising-v2` and `hf:Laxhar/noobai-XL-1.1` — its card says it was trained on the full Danbooru and e621 datasets — removed from the bundled list).
78
+ 学習データに未成年の性的表現の分類を含む画像の集まり(e621)を使う無検閲のモデルは外す(安全側)。
79
+
80
+ - When a Hugging Face repo was renamed, `update` applied the license-source table with the new name from the API
81
+ while re-applying it uses the name in the file URL, so the two disagreed (`license_path`). Both now use the URL's
82
+ name. Found by the first weekly rebuild (Comfy-Org/flux2-klein-9B → vae-text-encorder-for-flux-klein-9b).
83
+ リポジトリの名前が変わったとき、出どころの表をファイルの URL の名前で当てるようにした。
84
+ - Tests no longer pin numbers of the bundled list (uncensored count, HEAD check date) so that the weekly rebuild
85
+ can pass them.
86
+
87
+
88
+ ## [0.3.0] - 2026-10-21
89
+
90
+ ### Added
91
+
92
+ - `genmodelfit download <model>` and `gmf.plan_download()` / `gmf.download()` (Issue #31): download all files of a
93
+ model's workflow, with the precision chosen like `recommend` (`--precision`, `--budget GB`), into a ComfyUI folder by
94
+ each file's template folder (`--comfyui-dir`) or the same layout elsewhere (`--output-dir`). `--list` shows the plan
95
+ without any network access. Before downloading it shows every file's license and URL, the total size and the free
96
+ disk and asks for consent (`--yes` to skip). sha256 is checked while writing (a mismatch deletes the file),
97
+ `.part` files resume with HTTP Range, files already there are skipped, and it needs the download + 1 GB free.
98
+ Gated files, uncensored models (unless `--content all|uncensored`) and unknown licenses (unless
99
+ `--include-unknown-license`) are refused; only https URLs on Hugging Face / GitHub hosts are followed (each
100
+ redirect is checked, and URLs that urlsplit and urllib3 would read as different hosts are refused before
101
+ connecting); nothing is written outside the destination. Existing files are hashed again right before they
102
+ are skipped, restarts against servers that ignore Range are capped, and a `.lock` file stops two downloads of
103
+ the same file. URL paths may contain spaces (they are percent-encoded as requests does); spaces, `%` and `@` are
104
+ refused only in the scheme and host, and refusals say whether the URL is malformed or the host is not allowed.
105
+ JSON: docs/schema.md "download".
106
+ モデルを落とす `download` を足した(同意・sha256・続きから・ComfyUI のフォルダ)。
107
+
108
+ ## [0.2.0] - 2026-10-20
11
109
 
12
110
  Fewer unknowns in the table and a clear meaning for `?` and `-` (Issue #30). The JSON output changes in a way that
13
111
  can break apps (below), so this is a minor release under 0.x semver (owner's decision).
@@ -3,13 +3,15 @@
3
3
  genmodelfit の見積もりは、実際の PC で測った値(実測)があるとそれを優先します。いろいろな GPU の実測が
4
4
  集まるほど、見積もりが正確になります。`genmodelfit bench` で測った結果を Pull Request で送ってください。
5
5
 
6
- **English summary:** Run `genmodelfit bench <template> --url http://127.0.0.1:<port>` against your own ComfyUI,
7
- check the JSON it writes, then open a pull request that adds the record to
8
- `src/genmodelfit/data/measurements.json`. Required fields: `model_id`, `gpu_name`, `gpu_vram_gb`, `peak_vram_gb`,
9
- `settings`, `seconds`, `driver`, `comfyui_version`, `offload`, `outcome`, `standard`, `source`, `date`. Do not include
10
- paths, user names, host names or prompts. One model per PR is easiest to review. Out-of-memory runs are welcome too,
11
- but they must keep `outcome: "oom"` (bench prints them and does not save them unless you pass `--save-failed` or
12
- `--output`).
6
+ **English summary:** Run `genmodelfit bench <template> --url http://127.0.0.1:<port> --submission data/contrib/`
7
+ against your own ComfyUI (in a clone of your fork). It writes a submission file
8
+ `data/contrib/<gpu>/<date>-<sha8>.json` (`contrib_schema` 1: GPU name / VRAM / generation / driver, ComfyUI version,
9
+ OS family, RAM rounded to GiB, the model, settings and results). Check exactly what will be shared with
10
+ `genmodelfit contrib show <file>` (it also runs a privacy checklist), then open a pull request that adds only that file.
11
+ **genmodelfit itself never sends anything**; sharing happens only through the pull request you open. The file never
12
+ contains your host name, user name, paths, GPU UUID, PCI address, IP, CPU name or exact time. CI runs
13
+ `genmodelfit contrib validate` on the pull request. Out-of-memory runs are welcome too (`outcome: "oom"`).
14
+ Already have a saved bench result? `genmodelfit contrib make --from <file>` converts it.
13
15
 
14
16
  **License of contributions:** genmodelfit (code and bundled data) is under MPL-2.0. By opening a pull request you
15
17
  agree that your contribution (code, measurements or other data) is licensed under MPL-2.0 like the rest of the
@@ -77,44 +79,79 @@ genmodelfit bench 3d_hunyuan3d_image_to_model --url http://127.0.0.1:8188 --step
77
79
  `--output パス` を付けます。「標準でない」結果も同じで、`--save-nonstandard` か `--output` で保存できます。
78
80
  見積もりは `outcome` が `ok` で `standard` が `true` の実測だけを使います。
79
81
 
80
- ## 2. 確かめる
82
+ ## 2. 提出用の JSON を作る
81
83
 
82
- bench は、最後まで動いた標準の結果を `<キャッシュ>/measurements/<モデル>_<GPU>_<日時>.json` に保存し、
83
- 保存先を表示します(`--output` で場所を変えられます)。キャッシュに置いた実測は、その PC の `genmodelfit` の見積もりにすぐ使われます。
84
+ 自分のフォーク(GitHub の Fork)を手元に clone し、そのフォルダで bench に `--submission` を付けて測ります。
84
85
 
85
- ファイルを開いて、次を確かめてください。
86
+ ```powershell
87
+ git clone https://github.com/<あなたの名前>/genmodelfit
88
+ cd genmodelfit
89
+ genmodelfit bench image_sdxl_simple --url http://127.0.0.1:8188 --resolution 832x832 --submission data/contrib/
90
+ ```
91
+
92
+ - `--submission` にフォルダを渡すと、`data/contrib/<GPU>/<日付>-<sha8>.json` という名前で書きます
93
+ (例 `data/contrib/rtx-3070/2026-10-21-1a2b3c4d.json`。`sha8` は中身の sha256 の先頭 8 桁)。ファイル名を渡せばその名前で書きます
94
+ - 前に測って保存した結果(`<キャッシュ>/measurements/….json` や `--output` のファイル)からも作れます:
95
+ `genmodelfit contrib make --from <bench の結果> --output data/contrib/`
96
+ (ComfyUI が別の PC だったときは `--no-pc-info` を付けると、この PC の OS・メモリ・GPU の世代を入れません)
97
+ - 失敗(OOM)の結果も、そのまま出してください。標準でない条件の結果は記録として受け付けますが、まとめには使いません
98
+
99
+ ### 入るもの・入らないもの
100
+
101
+ | 入るもの | 例 |
102
+ |---|---|
103
+ | GPU の名前・VRAM の総量・世代・compute capability・ドライバの版 | `NVIDIA GeForce RTX 3070`, `8.0`, `ampere`, `8.6`, `566.03` |
104
+ | ComfyUI の版、OS の種類(版・ビルドは入れない)、メインメモリ(GiB の整数に丸める) | `0.40.0`, `windows`, `32` |
105
+ | モデル ID・設定・結果・最大 VRAM / メモリ・時間・載せ方・測り方 | `image_sdxl_simple`, `832x832`, `ok`, `6.9` … |
106
+ | 日付(UTC の日付だけ) | `2026-10-21` |
107
+ | メモ(note。bench が書いた測り方の説明) | パス・URL・PC 名・ユーザ名・メール・UUID・IP・時刻らしい文字を含む文は、文ごと消す |
108
+
109
+ **入らないもの**: PC の名前、ユーザー名、フォルダのパス、GPU の UUID、PCI の差し場所、シリアル番号、IP / MAC アドレス、
110
+ CPU の名前、時刻、bench の `--source` に書いた文、プロンプト。決まった項目以外は CI の検査で断ります。
111
+ ただし自動の点検は文字の形を見るだけで、note に普通の言葉で書いた名前(「山田太郎の PC で測った」など)や、base64 などで
112
+ 書き換えたパスは見分けられません(下の 3 で自分で読んでください)。
113
+
114
+ ## 3. 中身を確かめる(送る前に必ず)
115
+
116
+ ```powershell
117
+ genmodelfit contrib show data/contrib/rtx-3070/2026-10-21-1a2b3c4d.json
118
+ ```
119
+
120
+ ファイルの中身をすべて読める形で出し、個人の情報の点検(パス・PC 名・ユーザ名・UUID・PCI・IP・URL・メール・時刻・
121
+ 知らない項目が無いか。この PC の名前・ユーザ名が入っていないかも見ます)の結果を `[ok]` / `[NG]` で出します。
122
+
123
+ - `[NG]` があれば、直してから出してください(手で書き換えたら、名前の `sha8` が変わるので `contrib validate` が
124
+ 正しい名前を教えます)
125
+ - **note(メモ)は自分で読んでください**。自動の点検は文の意味までは分かりません。気になる文は消して構いません
126
+ - `genmodelfit contrib validate data/contrib` で、CI と同じ検査を手元で動かせます
127
+ - 「要確認」(review)は、式の見積もりから 40% より外れた値・全部 GPU に載せたのに重みより小さい値・見積もりを 15% より
128
+ 上げる値・よくある VRAM で段階を変える値・一覧に無いモデル・知らない GPU です。誤りではありませんが、PR を見る人が
129
+ 確かめるまで受け付けません(測り直すか、PR の説明に事情を書いてください)。確かめた提出は、作者が
130
+ `data/contrib/REVIEWED` に sha8 と理由を書きます(提出の PR ではこのファイルを変えないでください。CI が失敗にします)
131
+
132
+ ## 4. 送る(Pull Request)
86
133
 
87
- - **個人の情報が入っていないこと**: フォルダのパス、ユーザー名、PC の名前、プロンプトの文を入れないでください。
88
- bench はこれらを書きませんが、`--source` や `--note` に自分で書いたものは確かめてください
89
- - `gpu_name` と `driver` が自分の PC と合っていること
90
- - `settings` が測りたかった設定になっていること
134
+ 1. 足すのは `data/contrib/<GPU>/<日付>-<sha8>.json` のファイルだけにします(ほかのファイルは変えない。コードの変更は別の PR に)
135
+ 2. コミットして自分のフォークに push し、Pull Request を作ります。説明に、ComfyUI の起動オプション
136
+ (`--lowvram` など、変えたものだけ)を書いてもらえると助かります。個人名やメールアドレスは不要です
137
+ 3. CI(`Contrib` のワークフロー)が `genmodelfit contrib validate` で形・値の範囲・個人の情報・重複・ファイル名を検査し、
138
+ 結果をジョブのまとめ(Summary)に出します。検査は、PR の向き先(main)の genmodelfit で動きます
91
139
 
92
- ## 3. 送る
140
+ **genmodelfit は何も送りません**。共有されるのは、あなたが自分の GitHub で出した Pull Request の中身だけです
141
+ (自動で PR を作る機能はありません)。マージされると、提出は MPL-2.0 で公開されます(下の「ライセンス」)。
93
142
 
94
- 1. このリポジトリをフォークして、ブランチを作ります
95
- 2. 保存された JSON の `measurements` の中身を、`src/genmodelfit/data/measurements.json` の `measurements` の
96
- 最後に足します(書き方は既存の行にそろえてください)
97
- 3. `source` に、測った環境が分かる短い説明を書きます(例: `"genmodelfit bench, RTX 4060 8GB, ComfyUI portable"`)。
98
- 個人名やメールアドレスは不要です
99
- 4. `pytest -q` が通ることを確かめて、Pull Request を作ります。説明に、PC の構成(GPU・メモリ・OS)と、
100
- ComfyUI の起動オプション(`--lowvram` など、変えたものだけ)を書いてください
143
+ ### 受け付けたあと
101
144
 
102
- ### 必要な項目
145
+ - 作者が `genmodelfit contrib aggregate --output src/genmodelfit/data/measurements_community.json` で、同じモデル・設定・GPU の
146
+ 提出をまとめます(中央値と MAD で外れ値を除く)。同じ構成の提出が **2 件以上そろい、OOM が無いと**、その構成の見積もりの
147
+ 根拠が `measured_community`(ほかの利用者の実測)になります。1 件だけの提出は、もう 1 件そろうまで見積もりには使いません。
148
+ ほかの利用者の実測は、必要量を**上げる向きにだけ**使います(見積もりより小さい値では、段階も点数も変わりません)
149
+ - 毎週の点検(`contrib aggregate --report`)が、校正の誤差の表を作り直します(docs/accuracy.md)
103
150
 
104
- | 項目 | 必須 | 例 |
105
- |---|---|---|
106
- | `model_id` | ○ | `image_z_image_turbo_int8`(一覧の ID) |
107
- | `gpu_name`, `gpu_vram_gb` | ○ | `NVIDIA GeForce RTX 3070`, `8.0` |
108
- | `peak_vram_gb` | ○ | `5.43` |
109
- | `settings` | ○ | `{"width": 768, "height": 768, "steps": 6}` |
110
- | `seconds` | ○ | `41.2` |
111
- | `driver`, `comfyui_version` | ○ | `566.03`, `0.40.0` |
112
- | `offload` | ○ | `dynamic` |
113
- | `outcome`, `standard` | ○ | `ok`, `true`(OOM なら `oom` のまま送る) |
114
- | `source`, `date` | ○ | 上の例、`2026-10-20` |
115
- | `peak_ram_gb`, `note` | | bench が書いたものをそのまま |
151
+ ### 作者の実測(measurements.json)
116
152
 
117
- 形の正本は `src/genmodelfit/models.py` の `Measurement` で、説明は [docs/schema.md](docs/schema.md) にあります。
153
+ 同梱の `src/genmodelfit/data/measurements.json` は作者が測った実測です。項目は docs/schema.md の「Measurement」、
154
+ 提出の形は「contrib」にあります。利用者の実測は data/contrib に出してください(measurements.json は直接変えない)。
118
155
 
119
156
  ## そのほかの変更
120
157
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: genmodelfit
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: Right-size image / video / audio / 3D generation models to your PC (inspired by llmfit).
5
5
  Project-URL: Homepage, https://github.com/laxshmate/genmodelfit
6
6
  Project-URL: Issues, https://github.com/laxshmate/genmodelfit/issues
@@ -189,6 +189,7 @@ Python 3.10+. Windows and Linux. GPUs: NVIDIA (CUDA) in v0.1; other PCs are judg
189
189
  | `genmodelfit gate` | how many models can be auto-recommended, and why the rest are held / 自動でおすすめに出せる数と保留の理由 |
190
190
  | `genmodelfit update` | rebuild the model list from upstream / 一覧を上流から作り直す |
191
191
  | `genmodelfit update --from-release` | fetch the signed model list published by this project / 署名付きの配布の一覧を取り込む |
192
+ | `genmodelfit download <model> [--comfyui-dir DIR] [--list]` | download all files of the model for this PC (precision chosen like `recommend`), after showing licenses, sizes and free disk and asking you; sha256-checked, resumable ([below](#download--モデルを落とす)) / この PC に合う精度でモデルのファイルを落とす(ライセンス・大きさ・空きを見せて同意を取る。sha256 で確かめ、続きから再開できる) |
192
193
  | `genmodelfit bench <template> --url URL` | measure VRAM / RAM / time on a running ComfyUI / 動いている ComfyUI で実測 |
193
194
 
194
195
  Common options / 共通の指定:
@@ -275,6 +276,91 @@ if st.expired: # HEAD checks older than 30 days → auto-recommendations drop /
275
276
  print("run: genmodelfit update --from-release", st.expires_at, st.auto_count)
276
277
  ```
277
278
 
279
+ ## Download / モデルを落とす
280
+
281
+ ```
282
+ genmodelfit download "Z-Image-Turbo" --list # what would be downloaded (no network, writes nothing)
283
+ genmodelfit download "Z-Image-Turbo" --comfyui-dir C:\ComfyUI
284
+ genmodelfit download image_z_image_turbo_int8 --output-dir D:\models --budget 15 --yes
285
+ ```
286
+
287
+ - **Which files**: all files of one workflow. A model name (as in the tables) picks the workflow and precision like
288
+ `recommend`: the highest precision that runs on this PC without offloading. A workflow id is used as is.
289
+ `--precision int8` picks a precision; `--budget 15` (GB) caps the download (files already there are not counted).
290
+ - **Where**: `--comfyui-dir` puts each file in the ComfyUI folder the template names
291
+ (`models/diffusion_models`, `text_encoders`, `vae`, `loras`, `checkpoints`, …; subfolders in the file name are kept).
292
+ `--output-dir` (default: genmodelfit's user data folder, `models`) uses the same layout, so it can be added to
293
+ ComfyUI's `extra_model_paths.yaml`.
294
+ - **Consent first**: before anything is downloaded you see every file with its license and the license URL, licenses
295
+ that are not on the allowlist (commercial use without use restrictions; [docs/gate.md](https://github.com/laxshmate/genmodelfit/blob/main/docs/gate.md))
296
+ are marked, then the total size and the free disk, and you are asked `[y/N]`. `--yes` skips the question
297
+ (required with `--json`). Read the terms of each file before you use the model.
298
+ - **Not downloaded**: gated files (genmodelfit never handles logins or tokens; request access on the model page and
299
+ download them yourself), uncensored models unless you pass `--content all` (or `uncensored`), files whose license is
300
+ unknown unless you pass `--include-unknown-license`, files without a sha256 or size in the list, hosts other than
301
+ Hugging Face / GitHub.
302
+ - **Safety**: every file is checked with the sha256 in the list while it is written; a mismatch deletes it and fails.
303
+ A download goes to `<file>.part` first; after Ctrl-C or a network error run the same command again and it resumes
304
+ with an HTTP Range request (if the server ignores Range it starts over, at most 3 times). Files already there are
305
+ hashed again right before they are skipped; a different file with the same name is never overwritten. A
306
+ `<file>.lock` next to it stops two downloads of the same file at once (a lock left by a process that is gone is
307
+ cleaned up). It does not start unless the free disk is
308
+ the download + 1 GB. Nothing is written outside the destination: names with `..`, absolute paths, drive letters,
309
+ `\`, reserved Windows names (also as folder names), control / bidi characters, and symbolic links / junctions
310
+ that lead outside are refused.
311
+ - **Network**: only the URLs in the list (checked anonymously with HEAD), https only. Every redirect must stay on
312
+ the hosts below; a URL that could be read as two different hosts (`\`, spaces, control characters, `%` or `@`
313
+ in the host, non-ASCII hosts) is refused before any connection, and the host is read the way requests / urllib3
314
+ read it. Allowed:
315
+ `huggingface.co` / `*.hf.co` (CDN, Xet) / `github.com` / `objects.githubusercontent.com` /
316
+ `release-assets.githubusercontent.com`. No `~/.netrc` credentials, no tokens, nothing about this PC (User-Agent and
317
+ Range only). Waits for `Retry-After` on 429 / 503.
318
+
319
+ - **落とすもの**: 1 つのワークフローの全部のファイル。モデル名(表の Model)なら、`recommend` と同じく、この PC で
320
+ 逃がさずに載る中で一番精度の高いワークフローを選びます。ID を指定すればそのまま。`--precision` で精度を、
321
+ `--budget`(GB)で落とす量の上限を決められます(既にあるファイルは数えません)。
322
+ - **置き場所**: `--comfyui-dir` なら、テンプレートの置き場所(`models/diffusion_models`・`text_encoders`・`vae`・`loras`・
323
+ `checkpoints` など)に置きます。`--output-dir`(既定は genmodelfit のデータのフォルダの `models`)も同じ並びです。
324
+ - **先に同意**: 落とす前に、ファイルごとのライセンスと原文の URL(許可リストに無いものは印付き)・合計の大きさ・空きを
325
+ 出して `[y/N]` で尋ねます。`--yes` で省けます(`--json` で落とすときは必須)。使う前に各ファイルの条件を読んでください。
326
+ - **落とさないもの**: gated(ログインや利用申請が要る。genmodelfit はログイン情報を扱いません)、無検閲のモデル
327
+ (`--content all` か `uncensored` を明示したときだけ)、ライセンス不明(`--include-unknown-license` のときだけ)、
328
+ 一覧に sha256・大きさの無いもの、Hugging Face・GitHub 以外の取得先。
329
+ - **安全**: 書きながら sha256 を計り、合わなければ消して失敗にします。途中は `<名前>.part` に書き、Ctrl-C や通信の失敗の
330
+ あとで同じコマンドを実行すると HTTP Range で続きから落とします(相手が Range に応じなければ最初から。3 回まで)。
331
+ 既にあるファイルは飛ばす直前に sha256 を計り直し、同じ名前の別のファイルは上書きしません。同じファイルを
332
+ 2 つの download が同時に書かないよう `<名前>.lock` を置きます(止まったプロセスの残りは片付けます)。空きが「落とす量 + 1 GB」に足りなければ
333
+ 始めません。置き場所の外には書きません(`..`・絶対パス・ドライブ名・`\`・Windows の予約名・外へ出るリンクを拒みます)。
334
+ - **通信**: 一覧の URL(匿名の HEAD で確かめたもの)だけを https で使い、転送先は Hugging Face(CDN・Xet を含む)と
335
+ GitHub の決めたホストだけ。2 通りのホストに読める URL(`\`・空白・制御文字・ホストの中の `%` や `@`・ASCII でない
336
+ ホスト)は、つなぐ前に拒みます。`~/.netrc` もトークンも使わず、PC の情報も送りません。
337
+
338
+ Python:
339
+
340
+ ```python
341
+ import genmodelfit as gmf
342
+
343
+ plan = gmf.plan_download("Z-Image-Turbo", comfyui_dir=r"C:\ComfyUI") # no network, writes nothing
344
+ for f in plan.files: # status: download / resume / present / conflict / unavailable
345
+ print(f.relpath, f.size_bytes, f.license, f.license_url, f.status)
346
+ print(plan.blocked, plan.warnings, plan.download_bytes, plan.disk_free_bytes)
347
+
348
+
349
+ def ask(plan) -> bool: # show licenses, URLs, total and free disk; True to go on
350
+ ...
351
+
352
+
353
+ def show(p): # gmf.DownloadProgress
354
+ print(p.phase, p.name, p.done_bytes, p.total_bytes)
355
+
356
+
357
+ result = gmf.download(plan, confirm=ask, progress=show)
358
+ # or gmf.download("Z-Image-Turbo", yes=True, comfyui_dir=...) when the app already asked
359
+ ```
360
+
361
+ The library prints nothing. `gmf.download` raises `gmf.DownloadRefused` (blocked, no consent), `gmf.DownloadError`
362
+ (network, sha256 mismatch, disk) and lets `KeyboardInterrupt` through, keeping the `.part` file for the next call.
363
+
278
364
  ## Hardware / ハードウェアの検出
279
365
 
280
366
  - Only NVIDIA GPUs confirmed by `nvidia-smi` are used for judging (v0.1). A GPU is judged as **CPU** when no PyTorch
@@ -309,7 +395,8 @@ Measured values win. Models whose download size is unknown are not judged (shown
309
395
 
310
396
  ## Data sources / データ源
311
397
 
312
- The bundled list has 323 entries (image 161, video 114, TTS 20, music 15, 3D 10, SFX 3) that make 204 models.
398
+ The bundled list has 326 entries (image 163, video 115, TTS 20, music 15, 3D 10, SFX 3) that make 207 models
399
+ (2026-10-21; refreshed weekly, see "Maintenance").
313
400
  Like llmfit, Hugging Face models are included only with at least 10,000 all-time downloads (1,000 for trending
314
401
  ones), and merges and test stubs are skipped ([docs/sources.md](https://github.com/laxshmate/genmodelfit/blob/main/docs/sources.md)).
315
402
  llmfit と同じく、Hugging Face のモデルは全期間のダウンロード数が 10,000 以上のもの(伸びているものは 1,000 以上)だけを入れます。
@@ -349,12 +436,55 @@ upstream, not the uploader's label) is on a commercial-use allowlist (apache-2.0
349
436
  replaceable), nothing is gated, an official ComfyUI workflow without custom nodes, the ComfyUI version is
350
437
  supported, every download URL answered an anonymous HEAD within the last 30 days, sha256 is known, the size is
351
438
  known, and the content is `sfw`. Otherwise it is held with machine-readable reasons (`held_reasons` in JSON, e.g. `license`; the table's Auto column shows the first one).
352
- In the bundled list 83 of 323 entries are auto. When a license cannot be verified it is treated as unknown
439
+ In the bundled list 99 of 326 entries are auto (2026-10-21). When a license cannot be verified it is treated as unknown
353
440
  and held. See [docs/gate.md](https://github.com/laxshmate/genmodelfit/blob/main/docs/gate.md).
354
441
 
355
442
  すべての条件を満たすものだけを自動でおすすめに出し、残りは理由付きで保留にします。ライセンスが確かめられない
356
443
  ものは「不明」として保留にします。アプリは使う ComfyUI の版を `--comfyui-version` で渡してください。
357
444
 
445
+ ## Maintenance / 一覧の保守
446
+
447
+ Like llmfit, the list is rebuilt every week and published only after a person has reviewed it:
448
+
449
+ 1. Every Monday (03:00 UTC) `.github/workflows/weekly-data.yml` rebuilds the list from upstream
450
+ (`python -m genmodelfit.weekly`: templates, Hugging Face, HEAD checks, file headers; caches are kept between
451
+ runs), checks it (schema, auto count, the 30-day HEAD expiry must be more than 7 days away), runs ruff and
452
+ pytest with the new list, and opens or updates the pull request `automated/weekly-data` (labels `automated`,
453
+ `data-update`). The body is made by `genmodelfit diff` (added / removed models, license changes — the
454
+ ones toward the permissive side are marked —, auto-recommendation changes, failed HEAD checks).
455
+ It is never merged automatically.
456
+ 2. The owner reviews and merges it.
457
+ 3. On merge, `.github/workflows/data.yml` signs main's `db.json` and replaces the `data-latest` release.
458
+ 4. Apps take it with `genmodelfit update --from-release` (signature checked).
459
+
460
+ ```powershell
461
+ genmodelfit diff old_db.json new_db.json # what changed between two lists (--json for tools)
462
+ python -m genmodelfit.weekly --dry-run --out weekly-out # the same pipeline locally (writes only weekly-out)
463
+ ```
464
+
465
+ 毎週、上流から作り直した一覧を自動で PR にし(自動ではマージしない)、作者が見てマージしたものだけを
466
+ 署名して配ります。PR で確かめることは [docs/release.md](https://github.com/laxshmate/genmodelfit/blob/main/docs/release.md)
467
+ 「毎週の一覧の更新」。
468
+
469
+ ## Contributing measurements / 実測を送る
470
+
471
+ Measured runs on more GPUs make the estimates better. In a clone of your fork:
472
+
473
+ ```powershell
474
+ genmodelfit bench image_sdxl_simple --url http://127.0.0.1:8188 --resolution 832x832 --submission data/contrib/
475
+ genmodelfit contrib show data/contrib/rtx-3070/2026-10-21-1a2b3c4d.json # exactly what will be shared + privacy checklist
476
+ ```
477
+
478
+ Then open a pull request that adds only that file. **genmodelfit sends nothing**; the file holds the GPU name / VRAM /
479
+ generation / driver, ComfyUI version, OS family, RAM rounded to GiB and the results — never host or user names, paths,
480
+ GPU UUID, PCI address, IP or exact times (the checks are pattern based, so read the note yourself). CI checks it with
481
+ `genmodelfit contrib validate`. Once two or more consistent submissions exist for the same model, settings and GPU,
482
+ estimates for that setup become `basis_detail: "measured_community"`; community values can only raise the estimated
483
+ needs, never lower them. Steps: [CONTRIBUTING.md](https://github.com/laxshmate/genmodelfit/blob/main/CONTRIBUTING.md).
484
+
485
+ 自分のフォークで `bench --submission data/contrib/` を付けて測り、`contrib show` で中身を確かめてから、そのファイルだけを
486
+ Pull Request で出してください。genmodelfit は何も送りません(PC の名前・ユーザー名・パス・GPU の UUID などは入りません)。
487
+
358
488
  ## Privacy / 送るもの・送らないもの
359
489
 
360
490
  - `recommend`, `fit`, `search`, `info`, `system`, `types`, `gate` and the Python API (`gmf.recommend()`,
@@ -366,13 +496,16 @@ and held. See [docs/gate.md](https://github.com/laxshmate/genmodelfit/blob/main/
366
496
  main weight files to read their header — dtype and tensor shapes; no weights are downloaded).
367
497
  - `genmodelfit bench` talks only to the ComfyUI URL you give with `--url` (plus the official template files on
368
498
  GitHub when ComfyUI does not have them).
499
+ - `genmodelfit download` (and `gmf.download()`) only GETs the model URLs in the list, over https, following
500
+ redirects only to Hugging Face / GitHub hosts; `--list` and `gmf.plan_download()` make no network access.
369
501
  - Hardware information (GPU name, VRAM, RAM, CPU, disk) is read locally with `nvidia-smi` and psutil and is
370
502
  **never sent**. Measurements from `bench` are saved only on your PC; they are shared only if you open a pull
371
503
  request yourself ([CONTRIBUTING.md](https://github.com/laxshmate/genmodelfit/blob/main/CONTRIBUTING.md)).
372
- Saved measurements hold no host name, user name, paths or GPU UUID.
504
+ Saved measurements hold no host name, user name, paths or GPU UUID. Submission files (`bench --submission`,
505
+ `contrib make`) are written locally only; `genmodelfit contrib` never touches the network.
373
506
  - No telemetry. No hardware information, measurements, prompts or other user content is ever sent anywhere.
374
507
  Tests replace the PC's details with marker strings and check that no request URL, header or body of `update`,
375
- `update --from-release` or `bench` contains them.
508
+ `update --from-release`, `bench` or `download` contains them.
376
509
  Requests carry the User-Agent `genmodelfit/<version> (+https://github.com/laxshmate/genmodelfit)`, and never the
377
510
  credentials in your `~/.netrc` (proxy and certificate settings such as `HTTPS_PROXY` are still honored).
378
511
 
@@ -382,9 +515,12 @@ and held. See [docs/gate.md](https://github.com/laxshmate/genmodelfit/blob/main/
382
515
  - `update` は公開の情報を読むだけです(GitHub の ComfyUI テンプレート、Hugging Face Hub の API、モデルの URL への HEAD と、
383
516
  本体のファイルの先頭の見出し(dtype・テンソルの形)だけの Range 要求。モデル本体は落としません)。
384
517
  - `bench` は `--url` で指定した ComfyUI とだけ話します(ComfyUI に無い公式テンプレートは GitHub から取ります)。
518
+ - `download` は一覧のモデルの URL へ https の GET を送るだけです(転送先は Hugging Face・GitHub の決めたホストだけ)。
519
+ `--list` と `gmf.plan_download()` は通信しません。
385
520
  - PC の情報(GPU の名前・VRAM・メモリ・CPU・空き)は `nvidia-smi` と psutil で手元で読むだけで、**送りません**。
386
521
  `bench` の実測は手元に保存するだけで、利用者が自分で Pull Request を出したときだけ共有されます
387
- (保存する実測に PC の名前・ユーザー名・パス・GPU の UUID は入りません)。
522
+ (保存する実測に PC の名前・ユーザー名・パス・GPU の UUID は入りません)。提出用の JSON(`bench --submission`・`contrib make`)も
523
+ 手元に書くだけで、`genmodelfit contrib` は通信しません。
388
524
  - 利用状況の送信(テレメトリ)はありません。PC の情報・実測・プロンプトなどを送ることはありません。User-Agent は
389
525
  `genmodelfit/<版>` で、`~/.netrc` の資格情報は付けません(プロキシ・証明書の設定は使います)。
390
526