Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
75a80cb
cua_s1: accept adapted image rows and three-axis language positions
Levius-Fubuki Oct 1, 2026
de46f07
cua_s1: load and validate native vision checkpoints on CPU
Levius-Fubuki Oct 1, 2026
591097e
cua_s1: preprocess RGB images for native vision on CPU
Levius-Fubuki Oct 2, 2026
6844de9
Merge branch 'codex/cua-vision-loader' into codex/cua-native-vision
Levius-Fubuki Oct 2, 2026
35c16e0
Merge branch 'codex/cua-image-preprocess' into codex/cua-native-vision
Levius-Fubuki Oct 2, 2026
6c40bba
Merge branch 'codex/cua-native-multimodal-input' into codex/cua-nativ…
Levius-Fubuki Oct 2, 2026
932e645
feat(cua_s1): execute native vision and serve screenshot decisions
Levius-Fubuki Oct 2, 2026
f73ce6a
chore(cua_s1): limit PR diff to core implementation
Levius-Fubuki Oct 2, 2026
1512852
chore(cua_s1): limit PR diff to core implementation
Levius-Fubuki Oct 2, 2026
63f974f
chore(cua_s1): limit PR diff to core implementation
Levius-Fubuki Oct 2, 2026
9ee058f
chore(cua_s1): limit PR diff to core implementation
Levius-Fubuki Oct 2, 2026
ede0c05
refactor(cua_s1): migrate multimodal inputs into shared Qwen executor
Levius-Fubuki Oct 5, 2026
9538f00
refactor(cua_s1): integrate native vision with shared execution runtime
Levius-Fubuki Oct 5, 2026
1152531
merge: include the updated multimodal input dependency
Levius-Fubuki Oct 5, 2026
c5eb799
Merge remote-tracking branch 'origin/main' into codex/cua-native-mult…
Levius-Fubuki Oct 5, 2026
d743944
merge: integrate current main and refreshed multimodal dependency
Levius-Fubuki Oct 5, 2026
2e2ce90
Merge commit '7f39ac40902c374803992407bb26eeba29c8a588' into codex/cu…
Levius-Fubuki Oct 5, 2026
b4171c7
Merge commit '7f39ac40902c374803992407bb26eeba29c8a588' into codex/cu…
Levius-Fubuki Oct 5, 2026
550ee0a
cua_s1: restore locked vision loader dependency after main merge
Levius-Fubuki Oct 5, 2026
274b082
cua_s1: format preprocessing export after main merge
Levius-Fubuki Oct 5, 2026
9e961f0
merge: integrate refreshed CPU vision loader prerequisite
Levius-Fubuki Oct 5, 2026
55dcf0a
merge: integrate refreshed RGB preprocessing prerequisite
Levius-Fubuki Oct 5, 2026
47c816d
cua_s1: reject MPF screenshot containers before JPEG decoding
Levius-Fubuki Oct 6, 2026
066f5e3
merge: refresh native vision against current main
Levius-Fubuki Oct 6, 2026
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
157 changes: 157 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

57 changes: 57 additions & 0 deletions recipe/cua_s1/export_multimodal_language.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
"""Export the pinned BF16 language model with the multimodal LoRA merged.

Vision execution keeps its original BF16 base and FP32 adapters separately.
This one-time export requires the pinned Transformers/PEFT reference environment.
"""

import argparse
import hashlib
import json
from pathlib import Path

from models.cua_s1.multimodal.model import (
ADAPTER_REVISION,
BASE_REVISION,
MultimodalEngine,
)


def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--base", required=True)
parser.add_argument("--adapter", required=True)
parser.add_argument("--out", required=True, type=Path)
args = parser.parse_args()
if args.out.exists():
parser.error("output already exists")
engine = MultimodalEngine(args.base, args.adapter)
model = engine.model.merge_and_unload()
model.model.language_model.save_pretrained(args.out, max_shard_size="5GB")
model.config.to_json_file(args.out / "config.json")
engine.tokenizer.save_pretrained(args.out)
(args.out / "cua_s1_language_export.json").write_text(
json.dumps(
{
"format": "cua-s1-multimodal-language-merged/1",
"base_revision": BASE_REVISION,
"adapter_revision": ADAPTER_REVISION,
"vision": "separate unmerged base and adapter",
"files": {
p.name: {
"size": p.stat().st_size,
"sha256": hashlib.file_digest(
p.open("rb"), "sha256"
).hexdigest(),
}
for p in args.out.iterdir()
if p.is_file()
},
},
indent=2,
)
+ "\n"
)


if __name__ == "__main__":
main()
Loading
Loading