Add model card, workflows, and verified release evidence
Browse files- README.md +4 -0
- release_manifest.json +2 -2
- release_verification.json +10 -10
- scripts/upload.py +10 -0
- scripts/verify_release.py +5 -2
README.md
CHANGED
|
@@ -94,6 +94,10 @@ A ready-to-use API/comfy-cli workflow is provided at
|
|
| 94 |
It defaults to Whole W8A8 + INT8 T5. Change the diffusion-model and/or T5
|
| 95 |
filename to test another combination.
|
| 96 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
## Paired quality evaluation
|
| 98 |
|
| 99 |
Twenty 1024×1024 images were generated per pipeline with identical prompts, seeds, sampler, scheduler, guidance, steps, CLIP-L, and VAE. Metrics compare final 8-bit RGB images to Original BF16.
|
|
|
|
| 94 |
It defaults to Whole W8A8 + INT8 T5. Change the diffusion-model and/or T5
|
| 95 |
filename to test another combination.
|
| 96 |
|
| 97 |
+
A maintained copy is available in the general
|
| 98 |
+
[`comfy-workflows`](https://github.com/kgonia/comfy-workflows/blob/master/FLUX1_Dev_ConvRot_API.json)
|
| 99 |
+
repository for direct API use.
|
| 100 |
+
|
| 101 |
## Paired quality evaluation
|
| 102 |
|
| 103 |
Twenty 1024×1024 images were generated per pipeline with identical prompts, seeds, sampler, scheduler, guidance, steps, CLIP-L, and VAE. Metrics compare final 8-bit RGB images to Original BF16.
|
release_manifest.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
| 1 |
{
|
| 2 |
"schema_version": 1,
|
| 3 |
-
"status": "
|
| 4 |
"created_at": "2026-07-20T16:40:30Z",
|
| 5 |
"suggested_repo_id": "SearchingMan/FLUX.1-dev-ConvRot",
|
| 6 |
-
"remote_status": "
|
| 7 |
"base_model": {
|
| 8 |
"repo_id": "black-forest-labs/FLUX.1-dev",
|
| 9 |
"revision": "3de623fc3c33e44ffbe2bad470d0f45bccf2eb21",
|
|
|
|
| 1 |
{
|
| 2 |
"schema_version": 1,
|
| 3 |
+
"status": "verified_private_uploaded",
|
| 4 |
"created_at": "2026-07-20T16:40:30Z",
|
| 5 |
"suggested_repo_id": "SearchingMan/FLUX.1-dev-ConvRot",
|
| 6 |
+
"remote_status": "private",
|
| 7 |
"base_model": {
|
| 8 |
"repo_id": "black-forest-labs/FLUX.1-dev",
|
| 9 |
"revision": "3de623fc3c33e44ffbe2bad470d0f45bccf2eb21",
|
release_verification.json
CHANGED
|
@@ -34,7 +34,7 @@
|
|
| 34 |
"model_hashes_verified": true,
|
| 35 |
"overview_sha256": "3af42bd633bd813f806ff8652a23e21b133004b012ef509656ce336914e914d0",
|
| 36 |
"quality_source_grid_manifest_sha256": "22354490f79e3126d129098ad14d4baa07fbba43d8f9f9d4a2862f4a385b914d",
|
| 37 |
-
"remote_status": "
|
| 38 |
"schema_version": 1,
|
| 39 |
"status": "PASS",
|
| 40 |
"suggested_repo_id": "SearchingMan/FLUX.1-dev-ConvRot",
|
|
@@ -51,9 +51,9 @@
|
|
| 51 |
"sha256": "89032e53e2394d6c57571ff9040feab2c0035836d0bb1bf5ea778f8436014c0a"
|
| 52 |
},
|
| 53 |
{
|
| 54 |
-
"bytes":
|
| 55 |
"path": "README.md",
|
| 56 |
-
"sha256": "
|
| 57 |
},
|
| 58 |
{
|
| 59 |
"bytes": 1546,
|
|
@@ -81,9 +81,9 @@
|
|
| 81 |
"sha256": "bfaa7cfcd14e55460cac0a63e6293ccc9bc6f25d31e2fd882d7c087f39e85bfc"
|
| 82 |
},
|
| 83 |
{
|
| 84 |
-
"bytes":
|
| 85 |
"path": "release_manifest.json",
|
| 86 |
-
"sha256": "
|
| 87 |
},
|
| 88 |
{
|
| 89 |
"bytes": 7160,
|
|
@@ -91,14 +91,14 @@
|
|
| 91 |
"sha256": "e38c568d5d2797fc6f70a0e7e2eca75e5e0a981c85652126e2ed575f55b7fa8d"
|
| 92 |
},
|
| 93 |
{
|
| 94 |
-
"bytes":
|
| 95 |
"path": "scripts/upload.py",
|
| 96 |
-
"sha256": "
|
| 97 |
},
|
| 98 |
{
|
| 99 |
-
"bytes":
|
| 100 |
"path": "scripts/verify_release.py",
|
| 101 |
-
"sha256": "
|
| 102 |
},
|
| 103 |
{
|
| 104 |
"bytes": 1848,
|
|
@@ -106,5 +106,5 @@
|
|
| 106 |
"sha256": "b369b4acd6111fbb7549724eaeebf3c3325dad244590078f1428de44f1b2ac6e"
|
| 107 |
}
|
| 108 |
],
|
| 109 |
-
"verified_at": "2026-07-
|
| 110 |
}
|
|
|
|
| 34 |
"model_hashes_verified": true,
|
| 35 |
"overview_sha256": "3af42bd633bd813f806ff8652a23e21b133004b012ef509656ce336914e914d0",
|
| 36 |
"quality_source_grid_manifest_sha256": "22354490f79e3126d129098ad14d4baa07fbba43d8f9f9d4a2862f4a385b914d",
|
| 37 |
+
"remote_status": "private",
|
| 38 |
"schema_version": 1,
|
| 39 |
"status": "PASS",
|
| 40 |
"suggested_repo_id": "SearchingMan/FLUX.1-dev-ConvRot",
|
|
|
|
| 51 |
"sha256": "89032e53e2394d6c57571ff9040feab2c0035836d0bb1bf5ea778f8436014c0a"
|
| 52 |
},
|
| 53 |
{
|
| 54 |
+
"bytes": 8862,
|
| 55 |
"path": "README.md",
|
| 56 |
+
"sha256": "1d705cabefc08431994f5cf69c272a9c979ac15856592f50742330596bea33e0"
|
| 57 |
},
|
| 58 |
{
|
| 59 |
"bytes": 1546,
|
|
|
|
| 81 |
"sha256": "bfaa7cfcd14e55460cac0a63e6293ccc9bc6f25d31e2fd882d7c087f39e85bfc"
|
| 82 |
},
|
| 83 |
{
|
| 84 |
+
"bytes": 4051,
|
| 85 |
"path": "release_manifest.json",
|
| 86 |
+
"sha256": "0efc3908ee7c944ca9e498ab844df6dc0107c15e3ac41792386891f766daa97f"
|
| 87 |
},
|
| 88 |
{
|
| 89 |
"bytes": 7160,
|
|
|
|
| 91 |
"sha256": "e38c568d5d2797fc6f70a0e7e2eca75e5e0a981c85652126e2ed575f55b7fa8d"
|
| 92 |
},
|
| 93 |
{
|
| 94 |
+
"bytes": 6664,
|
| 95 |
"path": "scripts/upload.py",
|
| 96 |
+
"sha256": "9662e578a9ed19ccbee0976094975a82c40645cb77ba30714cb17800a73999c3"
|
| 97 |
},
|
| 98 |
{
|
| 99 |
+
"bytes": 7868,
|
| 100 |
"path": "scripts/verify_release.py",
|
| 101 |
+
"sha256": "b85b80ed1fea4db1231396090e2cec28204c9eb5351d9481fdadaa0b2d9ffbc2"
|
| 102 |
},
|
| 103 |
{
|
| 104 |
"bytes": 1848,
|
|
|
|
| 106 |
"sha256": "b369b4acd6111fbb7549724eaeebf3c3325dad244590078f1428de44f1b2ac6e"
|
| 107 |
}
|
| 108 |
],
|
| 109 |
+
"verified_at": "2026-07-22T10:18:06+00:00"
|
| 110 |
}
|
scripts/upload.py
CHANGED
|
@@ -29,6 +29,11 @@ def parse_args() -> argparse.Namespace:
|
|
| 29 |
)
|
| 30 |
parser.add_argument("--revision", default="main")
|
| 31 |
parser.add_argument("--execute", action="store_true", help="Perform network writes; default is dry-run.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
parser.add_argument(
|
| 33 |
"--create-private",
|
| 34 |
action="store_true",
|
|
@@ -98,6 +103,7 @@ def main() -> int:
|
|
| 98 |
"repo_id": args.repo_id,
|
| 99 |
"revision": args.revision,
|
| 100 |
"create_private": args.create_private,
|
|
|
|
| 101 |
"support_root": str(ROOT),
|
| 102 |
"artifact_total_bytes": manifest["artifact_total_bytes"],
|
| 103 |
"artifacts": [
|
|
@@ -149,8 +155,12 @@ def main() -> int:
|
|
| 149 |
path_in_repo=".",
|
| 150 |
revision=args.revision,
|
| 151 |
allow_patterns=support_paths,
|
|
|
|
| 152 |
commit_message="Add model card, workflows, and verified release evidence",
|
| 153 |
)
|
|
|
|
|
|
|
|
|
|
| 154 |
for artifact in manifest["artifacts"]:
|
| 155 |
source = model_root / artifact["source_relative_path"]
|
| 156 |
api.upload_file(
|
|
|
|
| 29 |
)
|
| 30 |
parser.add_argument("--revision", default="main")
|
| 31 |
parser.add_argument("--execute", action="store_true", help="Perform network writes; default is dry-run.")
|
| 32 |
+
parser.add_argument(
|
| 33 |
+
"--support-only",
|
| 34 |
+
action="store_true",
|
| 35 |
+
help="Upload documentation/evidence only; do not re-upload model artifacts.",
|
| 36 |
+
)
|
| 37 |
parser.add_argument(
|
| 38 |
"--create-private",
|
| 39 |
action="store_true",
|
|
|
|
| 103 |
"repo_id": args.repo_id,
|
| 104 |
"revision": args.revision,
|
| 105 |
"create_private": args.create_private,
|
| 106 |
+
"support_only": args.support_only,
|
| 107 |
"support_root": str(ROOT),
|
| 108 |
"artifact_total_bytes": manifest["artifact_total_bytes"],
|
| 109 |
"artifacts": [
|
|
|
|
| 155 |
path_in_repo=".",
|
| 156 |
revision=args.revision,
|
| 157 |
allow_patterns=support_paths,
|
| 158 |
+
ignore_patterns=["**/__pycache__/**", "**/*.pyc"],
|
| 159 |
commit_message="Add model card, workflows, and verified release evidence",
|
| 160 |
)
|
| 161 |
+
if args.support_only:
|
| 162 |
+
print(f"Support-file upload complete: https://huggingface.co/{args.repo_id}")
|
| 163 |
+
return 0
|
| 164 |
for artifact in manifest["artifacts"]:
|
| 165 |
source = model_root / artifact["source_relative_path"]
|
| 166 |
api.upload_file(
|
scripts/verify_release.py
CHANGED
|
@@ -65,8 +65,11 @@ def verify_regular_file(path: Path) -> None:
|
|
| 65 |
def main() -> int:
|
| 66 |
args = parse_args()
|
| 67 |
manifest = load_json(MANIFEST_PATH)
|
| 68 |
-
require(
|
| 69 |
-
|
|
|
|
|
|
|
|
|
|
| 70 |
required = manifest.get("required_repository_files")
|
| 71 |
artifacts = manifest.get("artifacts")
|
| 72 |
if not isinstance(required, list):
|
|
|
|
| 65 |
def main() -> int:
|
| 66 |
args = parse_args()
|
| 67 |
manifest = load_json(MANIFEST_PATH)
|
| 68 |
+
require(
|
| 69 |
+
manifest.get("status") in {"ready_for_local_verification", "verified_private_uploaded"},
|
| 70 |
+
"release status drift",
|
| 71 |
+
)
|
| 72 |
+
require(manifest.get("remote_status") in {"not_created", "private"}, "remote-status drift")
|
| 73 |
required = manifest.get("required_repository_files")
|
| 74 |
artifacts = manifest.get("artifacts")
|
| 75 |
if not isinstance(required, list):
|