ukisai commited on
Commit
e476358
·
0 Parent(s):

initial release

Browse files
.gitattributes ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
37
+ ukisai-banner.png filter=lfs diff=lfs merge=lfs -text
38
+ swift-1.5-planet-demo.mp4 filter=lfs diff=lfs merge=lfs -text
LICENSE ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Swift Open License v1.0
2
+
3
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
4
+
5
+ 1. Definitions.
6
+
7
+ "License" shall mean the terms and conditions for use, reproduction, and
8
+ distribution as defined by this document.
9
+
10
+ "Licensor" shall mean UkisAI.
11
+
12
+ "Legal Entity" shall mean the union of the acting entity and all other entities
13
+ that control, are controlled by, or are under common control with that entity.
14
+ For the purposes of this definition, "control" means (i) the power, direct or
15
+ indirect, to cause the direction or management of such entity, whether by
16
+ contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
17
+ outstanding shares, or (iii) beneficial ownership of such entity.
18
+
19
+ "You" (or "Your") shall mean an individual or Legal Entity exercising
20
+ permissions granted by this License.
21
+
22
+ "Source" form shall mean the preferred form for making modifications,
23
+ including but not limited to software source code, documentation source,
24
+ configuration files, and model weights in an unquantized, trainable format.
25
+
26
+ "Object" form shall mean any form resulting from mechanical transformation or
27
+ translation of a Source form, including but not limited to compiled object
28
+ code, generated documentation, quantized or otherwise converted model weights,
29
+ and conversions to other media types or file formats.
30
+
31
+ "Base Model" shall mean the Qwen3.8-27B model, Copyright 2026 Alibaba Cloud,
32
+ made available at https://huggingface.co/Qwen/Qwen3.8-27B, including its
33
+ weights, configuration, tokenizer, and chat template, in any form.
34
+
35
+ "Base Model License" shall mean the Apache License, Version 2.0, under which
36
+ the Base Model is made available. A copy is distributed with the Work in the
37
+ file LICENSE-APACHE-2.0.
38
+
39
+ "Swift Contribution" shall mean the modifications to the Base Model authored
40
+ by Licensor, in any form, including without limitation adapted model weights,
41
+ weight deltas, model weights to the extent they differ from the Base Model, and
42
+ any configuration, documentation, and evaluation materials created by Licensor
43
+ and distributed with the Work.
44
+
45
+ "Work" shall mean the Swift Contribution together with, to the extent of
46
+ Licensor's rights therein, the Derivative Work of the Base Model made available
47
+ by Licensor under this License (as indicated by a copyright notice that is
48
+ included in or attached to the work), in any format made available by Licensor.
49
+
50
+ "Derivative Works" shall mean any work, whether in Source or Object form, that
51
+ is based on (or derived from) the Work and for which the editorial revisions,
52
+ annotations, elaborations, or other modifications represent, as a whole, an
53
+ original work of authorship. For the purposes of this License, Derivative Works
54
+ shall not include works that remain separable from, or merely link (or bind by
55
+ name) to the interfaces of, the Work and Derivative Works thereof.
56
+
57
+ "Contribution" shall mean any work of authorship, including the original
58
+ version of the Work and any modifications or additions to that Work or
59
+ Derivative Works thereof, that is intentionally submitted to Licensor for
60
+ inclusion in the Work by the copyright owner or by an individual or Legal
61
+ Entity authorized to submit on behalf of the copyright owner. For the purposes
62
+ of this definition, "submitted" means any form of electronic, verbal, or
63
+ written communication sent to the Licensor or its representatives, including
64
+ but not limited to communication on electronic mailing lists, source code
65
+ control systems, and issue tracking systems that are managed by, or on behalf
66
+ of, the Licensor for the purpose of discussing and improving the Work, but
67
+ excluding communication that is conspicuously marked or otherwise designated in
68
+ writing by the copyright owner as "Not a Contribution."
69
+
70
+ "Contributor" shall mean Licensor and any individual or Legal Entity on behalf
71
+ of whom a Contribution has been received by Licensor and subsequently
72
+ incorporated within the Work.
73
+
74
+ "Commercial Use" shall mean any use of the Work or a Derivative Work for direct
75
+ or indirect commercial advantage or monetary compensation.
76
+
77
+ "Qualified Non-Profit Organization" shall mean a Legal Entity that is organized
78
+ and operated exclusively for religious, charitable, scientific, testing for
79
+ public safety, literary, or educational purposes, and which is exempt from
80
+ federal income tax under Section 501(c)(3) of the United States Internal
81
+ Revenue Code of 1986, as amended, or any equivalent non-profit or charitable
82
+ organization in a foreign jurisdiction.
83
+
84
+ "Non-Commercial or Research Purposes" shall mean purposes that do not involve
85
+ any use of the Work or a Derivative Work for Commercial Use.
86
+
87
+ "Threshold" shall mean gross revenue of one million United States dollars
88
+ (US$1,000,000) or more, measured over the most recently completed fiscal year
89
+ of You together with every Legal Entity that controls, is controlled by, or is
90
+ under common control with You.
91
+
92
+ 2. Grant of Copyright License. Subject to the terms and conditions of this
93
+ License, including the Commercial Use limitation set forth in Section 5, each
94
+ Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
95
+ no-charge, royalty-free, irrevocable copyright license to reproduce, prepare
96
+ Derivative Works of, publicly display, publicly perform, sublicense, and
97
+ distribute the Work and such Derivative Works in Source or Object form.
98
+
99
+ 3. Grant of Patent License. Subject to the terms and conditions of this
100
+ License, including the Commercial Use limitation set forth in Section 5, each
101
+ Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
102
+ no-charge, royalty-free, irrevocable (except as stated in this section) patent
103
+ license to make, have made, use, offer to sell, sell, import, and otherwise
104
+ transfer the Work, where such license applies only to those patent claims
105
+ licensable by such Contributor that are necessarily infringed by their
106
+ Contribution(s) alone or by combination of their Contribution(s) with the Work
107
+ to which such Contribution(s) was submitted. If You institute patent litigation
108
+ against any entity (including a cross-claim or counterclaim in a lawsuit)
109
+ alleging that the Work or a Contribution incorporated within the Work
110
+ constitutes direct or contributory patent infringement, then any patent
111
+ licenses granted to You under this License for that Work shall terminate as of
112
+ the date such litigation is filed.
113
+
114
+ 4. Redistribution. You may reproduce and distribute copies of the Work or
115
+ Derivative Works thereof in any medium, with or without modifications, and in
116
+ Source or Object form, provided that You meet the following conditions:
117
+
118
+ (a) You must give any other recipients of the Work or Derivative Works a copy
119
+ of this License; and
120
+
121
+ (b) You must cause any modified files to carry prominent notices stating that
122
+ You changed the files; and
123
+
124
+ (c) You must retain, in the Source form of any Derivative Works that You
125
+ distribute, all copyright, patent, trademark, and attribution notices from the
126
+ Source form of the Work, excluding those notices that do not pertain to any
127
+ part of the Derivative Works; and
128
+
129
+ (d) If the Work includes a "NOTICE" text file as part of its distribution, then
130
+ any Derivative Works that You distribute must include a readable copy of the
131
+ attribution notices contained within such NOTICE file, excluding those notices
132
+ that do not pertain to any part of the Derivative Works, in at least one of the
133
+ following places: within a NOTICE text file distributed as part of the
134
+ Derivative Works; within the Source form or documentation, if provided along
135
+ with the Derivative Works; or, within a display generated by the Derivative
136
+ Works, if and wherever such third-party notices normally appear. The contents
137
+ of the NOTICE file are for informational purposes only and do not modify the
138
+ License. You may add Your own attribution notices within Derivative Works that
139
+ You distribute, alongside or as an addendum to the NOTICE text from the Work,
140
+ provided that such additional attribution notices cannot be construed as
141
+ modifying the License; and
142
+
143
+ (e) If the copy You distribute contains any portion of the Base Model
144
+ (including merged, quantized, or otherwise converted weights that incorporate
145
+ the Base Model), You must also give recipients a copy of the Base Model License
146
+ and must comply with the Base Model License with respect to the Base Model.
147
+
148
+ You may add Your own copyright statement to Your modifications and may provide
149
+ additional or different license terms and conditions for use, reproduction, or
150
+ distribution of Your modifications, or for any such Derivative Works as a
151
+ whole, provided Your use, reproduction, and distribution of the Work otherwise
152
+ complies with the conditions stated in this License, and provided that Section
153
+ 5 continues to apply to the Swift Contribution contained in any such
154
+ Derivative Works.
155
+
156
+ 5. Commercial Use Limitation.
157
+
158
+ (a) The rights granted under this License for Commercial Use are conditioned
159
+ upon You or Your Legal Entity not exceeding the Threshold.
160
+
161
+ (b) Any Commercial Use of the Work or a Derivative Work by a Legal Entity that
162
+ exceeds the Threshold is not licensed under this License.
163
+
164
+ (c) The Threshold shall not apply to a Qualified Non-Profit Organization's use
165
+ of the Work or a Derivative Work for Non-Commercial or Research Purposes.
166
+
167
+ (d) A Legal Entity that exceeds the Threshold may obtain a separate written
168
+ license for Commercial Use from Licensor (the "Swift Enterprise License").
169
+ Contact: https://ukisai.com/contact.
170
+
171
+ 6. Base Model Rights. The Work incorporates the Base Model. Nothing in this
172
+ License limits, restricts, conditions, or modifies any rights You have in the
173
+ Base Model under the Base Model License, and the Base Model remains available
174
+ to You from its licensor under the Base Model License. Sections 5 and 12 of
175
+ this License apply solely to the Swift Contribution and to the Work or any
176
+ Derivative Work to the extent it contains, incorporates, or is derived from the
177
+ Swift Contribution.
178
+
179
+ 7. Submission of Contributions. Unless You explicitly state otherwise, any
180
+ Contribution intentionally submitted for inclusion in the Work by You to the
181
+ Licensor shall be under the terms and conditions of this License, without any
182
+ additional terms or conditions. Notwithstanding the above, nothing herein shall
183
+ supersede or modify the terms of any separate license agreement you may have
184
+ executed with Licensor regarding such Contributions.
185
+
186
+ 8. Trademarks. This License does not grant permission to use the trade names,
187
+ trademarks, service marks, or product names of the Licensor (including "UkisAI"
188
+ and "Swift"), except for the reasonable and customary use in describing the
189
+ origin of the Work and reproducing the content of the NOTICE file.
190
+
191
+ 9. Disclaimer of Warranty. Unless required by applicable law or agreed to in
192
+ writing, Licensor provides the Work (and each Contributor provides its
193
+ Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
194
+ KIND, either express or implied, including, without limitation, any warranties
195
+ or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
196
+ PARTICULAR PURPOSE. You are solely responsible for determining the
197
+ appropriateness of using or redistributing the Work and assume any risks
198
+ associated with Your exercise of permissions under this License.
199
+
200
+ 10. Limitation of Liability. In no event and under no legal theory, whether in
201
+ tort (including negligence), contract, or otherwise, unless required by
202
+ applicable law (such as deliberate and grossly negligent acts) or agreed to in
203
+ writing, shall any Contributor be liable to You for damages, including any
204
+ direct, indirect, special, incidental, or consequential damages of any
205
+ character arising as a result of this License or out of the use or inability to
206
+ use the Work (including but not limited to damages for loss of goodwill, work
207
+ stoppage, computer failure or malfunction, or any and all other commercial
208
+ damages or losses), even if such Contributor has been advised of the
209
+ possibility of such damages.
210
+
211
+ 11. Accepting Warranty or Additional Liability. While redistributing the Work
212
+ or Derivative Works thereof, You may choose to offer, and charge a fee for,
213
+ acceptance of support, warranty, indemnity, or other liability obligations
214
+ and/or rights consistent with this License. However, in accepting such
215
+ obligations, You may act only on Your own behalf and on Your sole
216
+ responsibility, not on behalf of any other Contributor, and only if You agree
217
+ to indemnify, defend, and hold each Contributor harmless for any liability
218
+ incurred by, or claims asserted against, such Contributor by reason of your
219
+ accepting any such warranty or additional liability.
220
+
221
+ 12. Termination. This License will terminate automatically and immediately if
222
+ You fail to comply with any of its terms and conditions. Upon termination, You
223
+ must cease all use of the Swift Contribution and of any Work or Derivative
224
+ Works containing it, and delete all copies in Your possession. Termination does
225
+ not affect Your rights in the Base Model under the Base Model License.
226
+
227
+ END OF TERMS AND CONDITIONS
228
+
229
+ APPENDIX: Notice for redistributors (quantizations, conversions, merges).
230
+
231
+ Copyright 2026 UkisAI. Swift Contribution licensed under the Swift Open
232
+ License v1.0 (https://huggingface.co/ukisai/Swift-1.5-Qwen3.8-27b/blob/main/LICENSE).
233
+ Derivative of Qwen3.8-27B, Copyright 2026 Alibaba Cloud, Apache License 2.0.
LICENSE-APACHE-2.0 ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright 2026 Alibaba Cloud
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
NOTICE ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Swift 1.5 Qwen3.8-27B
2
+ Copyright 2026 UkisAI
3
+
4
+ UkisAI's contribution (the "Swift Contribution") is licensed under the
5
+ Swift Open License v1.0. See LICENSE.
6
+
7
+ This model is a Derivative Work of Qwen3.8-27B
8
+ https://huggingface.co/Qwen/Qwen3.8-27B
9
+ Copyright 2026 Alibaba Cloud
10
+ Licensed under the Apache License, Version 2.0. See LICENSE-APACHE-2.0.
11
+
12
+ Swift 1.5 continues UkisAI's Swift 1.0 model, itself a Qwen3.8-27B
13
+ derivative. The full release incorporates the Qwen3.8-27B Base Model and
14
+ UkisAI's Swift 1.0 and Swift 1.5 contributions.
15
+
16
+ Changes made by UkisAI (Apache License 2.0, Section 4(b) change notice):
17
+ - model-*.safetensors, model.safetensors.index.json: the model weights from
18
+ Swift 1.0 were further adapted by UkisAI using additional post-training
19
+ methods.
20
+ - README.md: replaced. LICENSE and NOTICE added.
21
+ - All other files (config.json, generation_config.json, chat_template.jinja,
22
+ tokenizer.json, tokenizer_config.json, vocab.json, merges.txt,
23
+ preprocessor_config.json, video_preprocessor_config.json) are retained from
24
+ the parent model and remain available under Apache License, Version 2.0.
QUANTIZATION_MANIFEST.json ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": {
3
+ "exact_unquantized_tensors": 609,
4
+ "quantized_modules": 590,
5
+ "saved_tensors": 2379,
6
+ "tensor_bytes": 19281804384,
7
+ "weight_shard_names": [
8
+ "model-00001-of-00004.safetensors",
9
+ "model-00002-of-00004.safetensors",
10
+ "model-00003-of-00004.safetensors",
11
+ "model-00004-of-00004.safetensors"
12
+ ],
13
+ "weight_shards": 4
14
+ },
15
+ "limitations": {
16
+ "broad_accuracy_benchmark": "NOT_RUN",
17
+ "full_apple_silicon_generation": "NOT_RUN",
18
+ "integrated_mtp_speculative_generation": "NOT_IMPLEMENTED_BY_PATCH",
19
+ "integrated_multimodal_generation": "NOT_IMPLEMENTED_BY_PATCH",
20
+ "long_context_benchmark": "NOT_RUN"
21
+ },
22
+ "mlx_lm_revision": "c69d1288440a0dc4e6401fc417098b07598dccd5",
23
+ "patches": [
24
+ {
25
+ "path": "compatibility/swift15-mlx-lm.patch",
26
+ "sha256": "f6f1d0bdafa45863bfbf93dac0398c481c993ea04fdf38b9bae98c643f89eaec"
27
+ },
28
+ {
29
+ "path": "compatibility/enable-5bit.patch",
30
+ "sha256": "b985961eac3035e05ca4c9f3a8b283c26e6dd69bab4d113997fc04fe2a4f99cc"
31
+ }
32
+ ],
33
+ "quantization": {
34
+ "bits": 5,
35
+ "group_size": 64,
36
+ "method": "official MLX-LM affine round-to-nearest conversion",
37
+ "mode": "affine"
38
+ },
39
+ "source_manifest_sha256": "0a00065b88ab003281853a7fb9bd5ce0086bc3781b36136d8c39da19933923ae",
40
+ "source_repository": "ukisai/Swift-1.5-Qwen3.8-27b",
41
+ "source_revision": "5ad04445d2686f525e9fbe5c077e6fa0c7df4200",
42
+ "source_revision_url": "https://huggingface.co/ukisai/Swift-1.5-Qwen3.8-27b/tree/5ad04445d2686f525e9fbe5c077e6fa0c7df4200",
43
+ "source_tensors": 1199,
44
+ "source_weight_bytes": 55563006776,
45
+ "source_weight_shards": 18,
46
+ "status": "VALIDATED",
47
+ "validation": {
48
+ "all_floating_tensors_finite": true,
49
+ "all_source_tensors_accounted_for": 1199,
50
+ "load_memory_bytes": 19281804392,
51
+ "mtp": {
52
+ "path": "Explicit MTP step with real text hidden states and shared LM head; speculative generation is not integrated",
53
+ "shape": [
54
+ 1,
55
+ 1,
56
+ 248320
57
+ ],
58
+ "status": "PASS"
59
+ },
60
+ "process_peak_rss_bytes": 24964259840,
61
+ "status": "PASS",
62
+ "text_generation": {
63
+ "elapsed_seconds": 495.4394222159999,
64
+ "finish_reason": "stop",
65
+ "prompt": "<|im_start|>user\nReply with exactly: Hello from Swift.<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\n",
66
+ "prompt_tokens_per_second": 0.04886516458777248,
67
+ "text": "Hello from Swift.",
68
+ "token_ids": [
69
+ 9419,
70
+ 494,
71
+ 22929,
72
+ 13,
73
+ 248046
74
+ ],
75
+ "tokens": 5,
76
+ "tokens_per_second": 0.05894060179705689
77
+ },
78
+ "total_validation_seconds": 609.2779944080003,
79
+ "vision": {
80
+ "grid": [
81
+ [
82
+ 1,
83
+ 16,
84
+ 16
85
+ ]
86
+ ],
87
+ "path": "Vision encoder only; image/video insertion and multimodal text generation are not implemented",
88
+ "shape": [
89
+ 64,
90
+ 5120
91
+ ],
92
+ "status": "PASS"
93
+ }
94
+ }
95
+ }
README.md ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: other
3
+ license_name: swift-open-license-1.0
4
+ license_link: https://huggingface.co/ukisai/Swift-1.5-5bit-MLX/blob/main/LICENSE
5
+ base_model: ukisai/Swift-1.5-Qwen3.8-27b
6
+ base_model_relation: quantized
7
+ library_name: mlx
8
+ pipeline_tag: text-generation
9
+ tags:
10
+ - mlx
11
+ - quantized
12
+ - 5-bit
13
+ - affine
14
+ - qwen3_8
15
+ ---
16
+
17
+ <div align="center">
18
+ <a href="https://ukisai.com"><img src="ukisai-banner.png" alt="UkisAI" style="width:100%;max-width:100%;height:auto;display:block;margin-bottom:0.6em;" /></a>
19
+ <a href="https://ukisai.com">Website</a> &bull;
20
+ <a href="https://ukisai.com/products/swift">Learn more</a> &bull;
21
+ <a href="https://huggingface.co/ukisai/Swift-1.5-Qwen3.8-27b">BF16 model</a> &bull;
22
+ <a href="https://huggingface.co/ukisai/Swift-1.5-Qwen3.8-27B-GGUF">GGUF</a> &bull;
23
+ <a href="https://huggingface.co/ukisai/Swift-1.5-Qwen3.8-27B-GSQ-RCO-GGUF">GSQ-RCO GGUF</a> &bull;
24
+ <a href="#evaluation">Evaluation</a> &bull;
25
+ <a href="#license-and-access">Enterprise licensing</a>
26
+ </div>
27
+
28
+ # Swift 1.5 Qwen3.8-27B — 5-bit MLX
29
+
30
+ **MLX affine 5-bit quantization, group size 64.** Swift 1.5 is UkisAI's
31
+ reasoning-efficient Qwen3.8-27B derivative, focused on long-horizon, agentic and
32
+ coding tasks. This export preserves the text, vision and MTP parameter tree;
33
+ its supported generation interface is text-only with the included MLX-LM patches.
34
+
35
+ Swift 1.5 uses **58.5% fewer thinking tokens** than base Qwen3.8-27B while scoring **0.35% higher**, for a **9.18× speed-up** on several tasks.
36
+
37
+ > [!CAUTION]
38
+ > Use only a complete snapshot whose files match `UPLOAD_MANIFEST.json`.
39
+ > Historical build tests are not certification of an incomplete Hub snapshot.
40
+ > Full independent Apple Silicon generation and quality evaluation remain **NOT_RUN**.
41
+ > The 19.28 GB tensor payload must not be forced onto a 16 GiB Mac.
42
+
43
+ ## Demo
44
+
45
+ We gave base Qwen3.8-27B and Swift 1.5 27B the same prompt:
46
+
47
+ > create a 3d little planet globe where I (player can walk around) and it has all these biomes to explore, the globe doesn't have to be too big, but still fun to go around. It's about a boy scout who is camping and goes around exploring.
48
+
49
+ <video src="https://huggingface.co/ukisai/Swift-1.5-5bit-MLX/resolve/main/swift-1.5-planet-demo.mp4" controls autoplay muted loop playsinline style="width:100%;height:auto;border-radius:12px;"></video>
50
+
51
+ Try the game yourself here: [https://ukisai.com/swift-games/27b](https://ukisai.com/swift-games/27b)
52
+
53
+ Base Qwen3.8-27B took 104.6 minutes to build its game. Swift 1.5 took 11.39 minutes.
54
+
55
+ ## Source and quantization
56
+
57
+ The recorded source is the complete customized Swift BF16 export at
58
+ [`5ad04445d2686f525e9fbe5c077e6fa0c7df4200`](https://huggingface.co/ukisai/Swift-1.5-Qwen3.8-27b/tree/5ad04445d2686f525e9fbe5c077e6fa0c7df4200),
59
+ not base Qwen or another quantized model. The converter uses official MLX-LM
60
+ commit `c69d1288440a0dc4e6401fc417098b07598dccd5` with the included architecture
61
+ patch followed by the 5-bit extension.
62
+
63
+ The original build report accounts for 1,199 source tensors, including 333 vision
64
+ and 15 MTP tensors, and records 590 quantized modules plus 609 unquantized BF16
65
+ tensors after layout mapping. Its four shards contain 2,379 saved tensors and
66
+ 19,281,804,384 bytes of tensor data. Independent recovery checks verified full
67
+ SHA-256 hashes and header/index consistency of the original build. They did not
68
+ repeat the complete source-value equality, finite-value or model-generation tests.
69
+
70
+ The original tokenizer, template, configs, processors and quantized bytes are
71
+ preserved. [QUANTIZATION_MANIFEST.json](QUANTIZATION_MANIFEST.json) and the
72
+ existing `compatibility/` reports are historical build evidence. The current
73
+ [upload manifest](UPLOAD_MANIFEST.json) identifies the intended complete file set.
74
+
75
+ ## Evaluation
76
+
77
+ See the [Swift BF16 source evaluation](https://huggingface.co/ukisai/Swift-1.5-Qwen3.8-27b#evaluation)
78
+ for source benchmarks and methodology. They were not rerun on this MLX export.
79
+ No new broad accuracy, stability, long-context or BF16 quality-parity result is claimed.
80
+
81
+ ## Validation and use
82
+
83
+ **Both supplied MLX-LM patches are required, in order.** [USAGE.md](USAGE.md)
84
+ contains the pinned install, full-file integrity check and generation example.
85
+ The preserved source architecture is `Qwen3_5ForConditionalGeneration` / `qwen3_5`.
86
+
87
+ The historical Linux build reports strict reload of 2,379 tensors, finite floating
88
+ values, exact unquantized BF16 preservation, processor/tokenizer loading, and a short
89
+ CPU generation returning `Hello from Swift.`. It also reports a real-weight vision
90
+ encoder check and one explicit MTP step. These are historical results, not new
91
+ independent inference results for the uploaded release.
92
+
93
+ The CPU example promotes in-memory floating values to FP32 while retaining packed
94
+ 5-bit UINT32 weights. A new synthetic macOS CPU/Metal diagnostic reproduces an MLX
95
+ 0.32.2 CPU BF16 accumulation issue; it is not a Linux or full-model test. See
96
+ [diagnostic](compatibility/macos-quantized-matmul-diagnostic.json) and
97
+ [package checks](compatibility/package-checks.json).
98
+
99
+ Full 27B Apple Silicon generation is unverified. Integrated image/video chat and
100
+ speculative MTP generation are **not implemented** by the patch. Vision/MTP weights
101
+ and component checks do not establish those end-to-end capabilities. Runtime/cache
102
+ and OS memory must be budgeted in addition to the tensor payload.
103
+
104
+ ## License and access
105
+
106
+ Swift 1.5 derives from [Qwen3.8-27B](https://huggingface.co/Qwen/Qwen3.8-27B)
107
+ (Copyright 2026 Alibaba Cloud, [Apache License 2.0](https://huggingface.co/ukisai/Swift-1.5-5bit-MLX/blob/main/LICENSE-APACHE-2.0)).
108
+ UkisAI's adapted weights are licensed under the [Swift Open License v1.0](https://huggingface.co/ukisai/Swift-1.5-5bit-MLX/blob/main/LICENSE).
109
+ See [NOTICE](https://huggingface.co/ukisai/Swift-1.5-5bit-MLX/blob/main/NOTICE) for attribution and change notices.
110
+
111
+ Personal, research, educational, evaluation and commercial use are free for
112
+ individuals and organizations with gross annual revenue, including affiliates,
113
+ of up to US$1,000,000. Above that threshold, commercial use requires a separate
114
+ Swift Enterprise License. Contact [UkisAI](https://ukisai.com/contact) for terms.
115
+ Nothing in the Swift Open License limits the Apache 2.0 rights in Qwen3.8-27B itself.
116
+ The accompanying Apple MLX-LM code has a separate upstream
117
+ [MIT notice](compatibility/LICENSE-MLX-LM-MIT).
118
+
119
+ ## Citation
120
+
121
+ ```bibtex
122
+ @misc{swift-1.5-qwen3.8-27b,
123
+ title = {Swift 1.5 Qwen3.8-27B},
124
+ author = {UkisAI},
125
+ year = {2026},
126
+ url = {https://huggingface.co/ukisai/Swift-1.5-Qwen3.8-27b}
127
+ }
128
+ ```
129
+
130
+ ## Acknowledgements
131
+
132
+ We acknowledge the [NVIDIA Innovation Lab](https://www.nvidia.com/en-us/data-center/innovation-lab/),
133
+ [Amazon Web Services](https://aws.amazon.com/), and [Google Cloud](https://cloud.google.com/)
134
+ for compute credits and infrastructure support for Swift's development, training
135
+ and evaluation.
UPLOAD_MANIFEST.json ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "files": [
3
+ {
4
+ "path": ".gitattributes",
5
+ "bytes": 1686,
6
+ "sha256": "8a9fd1f95733fb82a6cba50f5ea2b1e26ca7578bea7a7cc21b4301ff83b1ce3b",
7
+ "git_blob_sha1": "3727b14f485a05787b6cda82f0346eaeaa2e751b"
8
+ },
9
+ {
10
+ "path": "LICENSE",
11
+ "bytes": 13306,
12
+ "sha256": "1367057bf17041aa1d69286a1400be5f464d2f8b8f54f600088b209eac1850be",
13
+ "git_blob_sha1": "209a5720f7e4a747e658b49808a933309eeecceb"
14
+ },
15
+ {
16
+ "path": "LICENSE-APACHE-2.0",
17
+ "bytes": 11544,
18
+ "sha256": "bbedc3fda3305820b977265f01b8619d87570a6739de3a5582c3464840f1e57a",
19
+ "git_blob_sha1": "f938136e3adacfd92be087f6e113b5d6d97f678f"
20
+ },
21
+ {
22
+ "path": "NOTICE",
23
+ "bytes": 1133,
24
+ "sha256": "be30f3d464974990e40e9833bc6f356fd89fe16733c6c1a581d97106b8ae741d",
25
+ "git_blob_sha1": "c4ad1a7188a4191cb5efd0f5109bf6e9ba8caee8"
26
+ },
27
+ {
28
+ "path": "QUANTIZATION_MANIFEST.json",
29
+ "bytes": 2946,
30
+ "sha256": "7bbc577963403dd60e93e994a8aeb12142558031d985489aea27708a97ada4cf",
31
+ "git_blob_sha1": "b25e2206cf43c5b85231da234a5014e1ea2e1e99"
32
+ },
33
+ {
34
+ "path": "README.md",
35
+ "bytes": 6283,
36
+ "sha256": "77bebdc893764e1ddb8499b4dd614856a33a39689ca03c46623c11f7a6480722",
37
+ "git_blob_sha1": "91d0f0da8a67b2a793ccb1fc16e54d6e14b67729"
38
+ },
39
+ {
40
+ "path": "USAGE.md",
41
+ "bytes": 4963,
42
+ "sha256": "8d9aeb9c1a86a8e23bc4daf4c7b38b3f8af7a7e0b8b74616e411346469b3cc0e",
43
+ "git_blob_sha1": "816e5c09652657535d15d4d8fddfb59b2253cd43"
44
+ },
45
+ {
46
+ "path": "chat_template.jinja",
47
+ "bytes": 8952,
48
+ "sha256": "c3cf9e34abf4f9e36c2d72165aa9c132d3e2a725b6c2586aaa3a8af9d7a81041",
49
+ "git_blob_sha1": "c0c686f9c38d70d179fb7b5f5aa7530bc913dda3"
50
+ },
51
+ {
52
+ "path": "compatibility/LICENSE-MLX-LM-MIT",
53
+ "bytes": 1066,
54
+ "sha256": "ccfab7ccb2ea306f71531c8ca77bb55507606cd90768b1e32b8b52ab5b48cf01",
55
+ "git_blob_sha1": "98ff47b9ef9d4ac9f1a4bde3db13dd27456c5ea1"
56
+ },
57
+ {
58
+ "path": "compatibility/conversion-result.json",
59
+ "bytes": 694,
60
+ "sha256": "46d5f5abfae73b29c2b65ec5a6d05decd8e4d5b50eb0dd0df90f94edae040986",
61
+ "git_blob_sha1": "7b9848cd983f8f7df81116454907e733543fed82"
62
+ },
63
+ {
64
+ "path": "compatibility/enable-5bit.patch",
65
+ "bytes": 2227,
66
+ "sha256": "b985961eac3035e05ca4c9f3a8b283c26e6dd69bab4d113997fc04fe2a4f99cc",
67
+ "git_blob_sha1": "c577d5a2b6ea8fe634076ebd1387ecf7575d5d27"
68
+ },
69
+ {
70
+ "path": "compatibility/environment-linux.json",
71
+ "bytes": 274,
72
+ "sha256": "29646417ed15e6c1d08602b5832287abd44aabf4da624ea06f7e0b617bccbb48",
73
+ "git_blob_sha1": "0bca526431ce202cd367b40381cbdd041e02028e"
74
+ },
75
+ {
76
+ "path": "compatibility/macos-quantized-matmul-diagnostic.json",
77
+ "bytes": 4399,
78
+ "sha256": "90b992aa7535dde1ecbdcca93d6c8df78397689f4456e095abbae7c112d1754c",
79
+ "git_blob_sha1": "d9475a8bb176a03cf7e3b6fd686e56b59e93e297"
80
+ },
81
+ {
82
+ "path": "compatibility/package-checks.json",
83
+ "bytes": 77429,
84
+ "sha256": "016ebd02e676cdecebb27c9049bd53bff0f803a219b81ad364ca1d769d7bedc8",
85
+ "git_blob_sha1": "599f4e1d3b0e3c2d8032bc68d67b46a279490983"
86
+ },
87
+ {
88
+ "path": "compatibility/patch-manifest.json",
89
+ "bytes": 380,
90
+ "sha256": "c862249f212d4f94113a85336db22a24f3128014c034cdf9878fb9e44b103a95",
91
+ "git_blob_sha1": "955f2d916e47bab3292448d9db7681808053df02"
92
+ },
93
+ {
94
+ "path": "compatibility/quant-validation-results.json",
95
+ "bytes": 3784,
96
+ "sha256": "5a2bdbaa7ffa5616b2edf4817953369c694596c6d41aca2ba458a48b651ebab2",
97
+ "git_blob_sha1": "89c26ee2aabe9ce7717a0d91b217717af4d27b3f"
98
+ },
99
+ {
100
+ "path": "compatibility/source-structural-results.json",
101
+ "bytes": 2503,
102
+ "sha256": "cb9ccedd803a6cd336e7412de3da6809f89c30e567d3300e1c14af7f90e05fbf",
103
+ "git_blob_sha1": "b2641ec35a9f4810da73f8d439ec4603147d15a8"
104
+ },
105
+ {
106
+ "path": "compatibility/source-verification.json",
107
+ "bytes": 380649,
108
+ "sha256": "27d87d8d5209c6559643efdd7d7b468b0138ebfb3a7d5771b29be79214bffe75",
109
+ "git_blob_sha1": "c807fa472c01946b5ad47e1438f57e5980f01d38"
110
+ },
111
+ {
112
+ "path": "compatibility/swift15-mlx-lm.patch",
113
+ "bytes": 38976,
114
+ "sha256": "f6f1d0bdafa45863bfbf93dac0398c481c993ea04fdf38b9bae98c643f89eaec",
115
+ "git_blob_sha1": "b739acc2e3b4cb82f073b7280255bcb898bb2a33"
116
+ },
117
+ {
118
+ "path": "config.json",
119
+ "bytes": 4577,
120
+ "sha256": "77eaf6b1ee9e2ca06a9a3119f218853ec16c6f9f558e6b492a7e9a1be8d2ac43",
121
+ "git_blob_sha1": "3b9f5cd48042e788592ec30c3e153ffe794e45c7"
122
+ },
123
+ {
124
+ "path": "generation_config.json",
125
+ "bytes": 202,
126
+ "sha256": "e70c136c1b78ddc1fb0905bac8e733a4dc448d4f852a5dd75143fffc70be550e",
127
+ "git_blob_sha1": "023756cfadf88e5bf69eefeee3e172f38c448d64"
128
+ },
129
+ {
130
+ "path": "merges.txt",
131
+ "bytes": 3353259,
132
+ "sha256": "a9d356d7bdf1ef4949e3e748e95b8e10ad9d4e2e838eddc38a0a7b6b94d1db8d",
133
+ "git_blob_sha1": "a494e019ca1502219fd0128658b979e5f05ae8e8"
134
+ },
135
+ {
136
+ "path": "model-00001-of-00004.safetensors",
137
+ "bytes": 5360417859,
138
+ "sha256": "9da8750595ec42d8c5d2ff0ae0b695e387cbcb3c0beac40f262e6d9a7196b59d"
139
+ },
140
+ {
141
+ "path": "model-00002-of-00004.safetensors",
142
+ "bytes": 5338181777,
143
+ "sha256": "b592723bd4e9f01344335cd7d4b4f41a7c8cde98e2e074ad1d943cdb951a6835"
144
+ },
145
+ {
146
+ "path": "model-00003-of-00004.safetensors",
147
+ "bytes": 5355925620,
148
+ "sha256": "0027e7fe05310d5b2d960414221ed0872de9b511aa7e6b1c3a8f0e4647558412"
149
+ },
150
+ {
151
+ "path": "model-00004-of-00004.safetensors",
152
+ "bytes": 3227578201,
153
+ "sha256": "afec577f16805b327471561d6841662eb4acf7d866ad5e761c5ef8cd3149d8f4"
154
+ },
155
+ {
156
+ "path": "model.safetensors.index.json",
157
+ "bytes": 232537,
158
+ "sha256": "83526f2e7856d41145f3599146a4a574ea2b258c4abe09302617243f13abec62",
159
+ "git_blob_sha1": "936e7dc269c4155002581e4c5620f085ab1d64f0"
160
+ },
161
+ {
162
+ "path": "preprocessor_config.json",
163
+ "bytes": 390,
164
+ "sha256": "27225450ac9c6529872ee1924fcb0962ff5634834f817040f444118116f4e516",
165
+ "git_blob_sha1": "2ea84a437d448ff71b08df68fdd949d5cc4ebb64"
166
+ },
167
+ {
168
+ "path": "swift-1.5-planet-demo.mp4",
169
+ "bytes": 4738825,
170
+ "sha256": "1cda6924169e8b83e5d6d7299baf8329ed1b1a182a481aa0e06344e0f5c00111"
171
+ },
172
+ {
173
+ "path": "tokenizer.json",
174
+ "bytes": 12809320,
175
+ "sha256": "0997f410c57a1f4e53b09e4be8f4a172d90edd9564368fb0847030937229b9f3"
176
+ },
177
+ {
178
+ "path": "tokenizer_config.json",
179
+ "bytes": 17928,
180
+ "sha256": "b11349aafa7cdc6a320767cf7ceb29ed82f7eda5d65e8e0819e76f0ce947bf27",
181
+ "git_blob_sha1": "5de744b3fca2129d7186979ae47c06be33903243"
182
+ },
183
+ {
184
+ "path": "ukisai-banner.png",
185
+ "bytes": 307739,
186
+ "sha256": "8577252b8b37e331f06f7ddecdf3bfa1c497e164f9eb36d78c37232d1b8492ca"
187
+ },
188
+ {
189
+ "path": "verify_release.py",
190
+ "bytes": 6662,
191
+ "sha256": "02ac6ed751c4dd915d1673f2d501f3322d27039c3a32a5bc3c0264861e4d0982",
192
+ "git_blob_sha1": "7e235791f8cfadb8321321231b3ea6359565db89"
193
+ },
194
+ {
195
+ "path": "video_preprocessor_config.json",
196
+ "bytes": 385,
197
+ "sha256": "7768af27c1fafa9cc9011c1dc20067e03f8915e03b63504550e11d5066986d13",
198
+ "git_blob_sha1": "3ba673a5ad7d4d13f54155ecd38b2a94a6dac8fe"
199
+ },
200
+ {
201
+ "path": "vocab.json",
202
+ "bytes": 6722759,
203
+ "sha256": "ce99b4cb2983d118806ce0a8b777a35b093e2000a503ebde25853284c9dfa003",
204
+ "git_blob_sha1": "0aa0ce0658d60ac4a5d609f4eadb0e8e43514176"
205
+ }
206
+ ],
207
+ "file_count": 35,
208
+ "total_bytes": 19310861234,
209
+ "self_excluded": true
210
+ }
USAGE.md ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Swift 1.5 5-bit — complete MLX architecture
2
+
3
+ Use only a complete snapshot: all four shards, original index, tokenizer and
4
+ processor/runtime files are required. The 19.28 GB tensor payload plus runtime,
5
+ cache and OS must fit available memory. Do not load this full model on a 16 GiB Mac
6
+ or raise system memory limits to conceal insufficient hardware.
7
+
8
+ ## Pin the snapshot and verify it
9
+
10
+ Use a new working directory. After installing the HF CLI, run `hf auth login`
11
+ interactively if not already signed in with access to this private repository.
12
+ The command below resolves current main once to a full commit and then uses
13
+ only that pinned snapshot. For a repeat run, reuse the recorded commit.
14
+ Do not use an incomplete historical upload or proceed after verification failure.
15
+
16
+ ```bash
17
+ python3.12 -m venv .venv-swift5
18
+ source .venv-swift5/bin/activate
19
+ python -m pip install 'huggingface_hub==1.31.0'
20
+ SWIFT_MLX_REVISION="$(python -c 'from huggingface_hub import HfApi; print(HfApi().model_info("ukisai/Swift-1.5-5bit-MLX").sha)')"
21
+ printf 'Pinned model revision: %s\n' "$SWIFT_MLX_REVISION"
22
+ hf download ukisai/Swift-1.5-5bit-MLX --revision "$SWIFT_MLX_REVISION" --local-dir Swift-1.5-5bit-MLX
23
+ hf cache verify ukisai/Swift-1.5-5bit-MLX --revision "$SWIFT_MLX_REVISION" --local-dir Swift-1.5-5bit-MLX --fail-on-missing-files
24
+ python Swift-1.5-5bit-MLX/verify_release.py Swift-1.5-5bit-MLX
25
+ ```
26
+
27
+ The included checker has no network or model-loading code. Supply its optional
28
+ `--manifest-sha256` argument from a trusted release plan to pin the manifest too.
29
+ Without that trusted digest it checks consistency, not source authenticity.
30
+ Stop if any file, checksum, index entry or payload-boundary check fails.
31
+
32
+ ## Install the patches in this order
33
+
34
+ ```bash
35
+ git clone https://github.com/ml-explore/mlx-lm.git swift5-mlx-lm
36
+ git -C swift5-mlx-lm checkout --detach c69d1288440a0dc4e6401fc417098b07598dccd5
37
+ git -C swift5-mlx-lm apply --check ../Swift-1.5-5bit-MLX/compatibility/swift15-mlx-lm.patch
38
+ git -C swift5-mlx-lm apply ../Swift-1.5-5bit-MLX/compatibility/swift15-mlx-lm.patch
39
+ git -C swift5-mlx-lm apply --check ../Swift-1.5-5bit-MLX/compatibility/enable-5bit.patch
40
+ git -C swift5-mlx-lm apply ../Swift-1.5-5bit-MLX/compatibility/enable-5bit.patch
41
+ ```
42
+
43
+ Apple Silicon:
44
+
45
+ ```bash
46
+ python -m pip install 'mlx==0.32.2' 'transformers==5.14.1' 'huggingface_hub==1.31.0' 'pillow==12.3.0'
47
+ python -m pip install -e ./swift5-mlx-lm
48
+ ```
49
+
50
+ Linux CPU, Python 3.12, glibc 2.35 or newer:
51
+
52
+ ```bash
53
+ python -m pip install 'mlx[cpu]==0.32.2' 'transformers==5.14.1' 'huggingface_hub==1.31.0' 'pillow==12.3.0'
54
+ python -m pip install -e ./swift5-mlx-lm
55
+ ```
56
+
57
+ The historical [Linux environment](compatibility/environment-linux.json) records
58
+ Hub 1.32.0. The 1.31.0 pin above was separately installed in the independent macOS
59
+ audit, where 18 synthetic patch tests passed. These environments are not identical
60
+ and the tests did not load the full 27B model. The upstream code
61
+ [MIT notice](compatibility/LICENSE-MLX-LM-MIT) is included separately from weight licenses.
62
+
63
+ ## Text generation
64
+
65
+ ```python
66
+ import mlx.core as mx
67
+ from mlx_lm import generate, load
68
+ from mlx_lm.sample_utils import make_sampler
69
+
70
+ model, tokenizer = load("Swift-1.5-5bit-MLX")
71
+ if mx.default_device() == mx.cpu:
72
+ model.apply(lambda x: x.astype(mx.float32) if mx.issubdtype(x.dtype, mx.floating) else x)
73
+ prompt = tokenizer.apply_chat_template(
74
+ [{"role": "user", "content": "Reply with exactly: Hello from Swift."}],
75
+ tokenize=False, add_generation_prompt=True, enable_thinking=False,
76
+ )
77
+ mx.random.seed(20260922)
78
+ print(generate(model, tokenizer, prompt=prompt, max_tokens=32, sampler=make_sampler(temp=0)))
79
+ ```
80
+
81
+ The CPU branch changes only in-memory floating types; packed UINT32 weights and
82
+ files are unchanged. The historical build reported a Linux BF16 accumulation issue.
83
+ Its original diagnostic file was not published. The separately executed
84
+ [macOS CPU/Metal diagnostic](compatibility/macos-quantized-matmul-diagnostic.json)
85
+ uses synthetic tensors: summing 8,192 ones gives 256 on CPU BF16 and 8,192 with FP32;
86
+ Metal BF16/FP32 also give 8,192. It is not a new Linux or full-model generation test.
87
+
88
+ The template supports `reasoning_effort="low"`, `"medium"`, and `"xhigh"`.
89
+ Template support does not establish generated quality for those modes.
90
+ The explicit `model.mtp_logits` step and `model.visual` encoder have historical
91
+ component evidence. Integrated image/video chat and speculative generation are
92
+ not implemented; unsupported multimodal generation must not be reported as working.
93
+
94
+ ## Conversion provenance
95
+
96
+ Conversion is not part of installation. If separately authorized, use only the
97
+ complete customized Swift BF16 source identified in `QUANTIZATION_MANIFEST.json`,
98
+ with its 18 shards verified before conversion, the pinned patched converter, and
99
+ affine / 5-bit / group size 64. Do not fill missing weights with base Qwen or another
100
+ quantization. Existing quantized weights are unchanged by these packaging repairs.
chat_template.jinja ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {%- set image_count = namespace(value=0) %}
2
+ {%- set video_count = namespace(value=0) %}
3
+ {%- macro render_content(content, do_vision_count, is_system_content=false) %}
4
+ {%- if content is string %}
5
+ {{- content }}
6
+ {%- elif content is iterable and content is not mapping %}
7
+ {%- for item in content %}
8
+ {%- if 'image' in item or 'image_url' in item or item.type == 'image' %}
9
+ {%- if is_system_content %}
10
+ {{- raise_exception('System message cannot contain images.') }}
11
+ {%- endif %}
12
+ {%- if do_vision_count %}
13
+ {%- set image_count.value = image_count.value + 1 %}
14
+ {%- endif %}
15
+ {%- if add_vision_id %}
16
+ {{- 'Picture ' ~ image_count.value ~ ': ' }}
17
+ {%- endif %}
18
+ {{- '<|vision_start|><|image_pad|><|vision_end|>' }}
19
+ {%- elif 'video' in item or item.type == 'video' %}
20
+ {%- if is_system_content %}
21
+ {{- raise_exception('System message cannot contain videos.') }}
22
+ {%- endif %}
23
+ {%- if do_vision_count %}
24
+ {%- set video_count.value = video_count.value + 1 %}
25
+ {%- endif %}
26
+ {%- if add_vision_id %}
27
+ {{- 'Video ' ~ video_count.value ~ ': ' }}
28
+ {%- endif %}
29
+ {{- '<|vision_start|><|video_pad|><|vision_end|>' }}
30
+ {%- elif 'text' in item %}
31
+ {{- item.text }}
32
+ {%- else %}
33
+ {{- raise_exception('Unexpected item type in content.') }}
34
+ {%- endif %}
35
+ {%- endfor %}
36
+ {%- elif content is none or content is undefined %}
37
+ {{- '' }}
38
+ {%- else %}
39
+ {{- raise_exception('Unexpected content type.') }}
40
+ {%- endif %}
41
+ {%- endmacro %}
42
+ {%- if not messages %}
43
+ {{- raise_exception('No messages provided.') }}
44
+ {%- endif %}
45
+ {%- set reasoning_instructions = '' %}
46
+ {%- if enable_thinking is undefined or enable_thinking is true %}
47
+ {%- set resolved_reasoning_effort = reasoning_effort|default('xhigh') %}
48
+ {%- if resolved_reasoning_effort not in ('xhigh', 'medium', 'low') %}
49
+ {{- raise_exception('Unexpected reasoning effort ' ~ reasoning_effort ~ '. Supported types are xhigh (default), medium, and low.') }}
50
+ {%- endif %}
51
+ {%- if resolved_reasoning_effort == 'xhigh' %}
52
+ {%- set reasoning_instructions = 'Reasoning effort is set to xhigh. Please think carefully through the task, validate key assumptions, consider plausible alternatives, and prioritize correctness, consistency, and clarity in the final answer.' %}
53
+ {%- elif resolved_reasoning_effort == 'low' %}
54
+ {%- set reasoning_instructions = 'Reasoning effort is set to low. Keep your thinking brief and focused, moving directly to the conclusion without unnecessary elaboration.' %}
55
+ {%- endif %}
56
+ {%- endif %}
57
+ {%- if tools and tools is iterable and tools is not mapping %}
58
+ {{- '<|im_start|>system\n' }}
59
+ {%- if reasoning_instructions %}
60
+ {{- reasoning_instructions + '\n\n' }}
61
+ {%- endif %}
62
+ {{- "# Tools\n\nYou have access to the following functions:\n\n<tools>" }}
63
+ {%- for tool in tools %}
64
+ {{- "\n" }}
65
+ {{- tool | tojson }}
66
+ {%- endfor %}
67
+ {{- "\n</tools>" }}
68
+ {{- '\n\nIf you choose to call a function ONLY reply in the following format with NO suffix:\n\n<tool_call>\n<function=example_function_name>\n<parameter=example_parameter_1>\nvalue_1\n</parameter>\n<parameter=example_parameter_2>\nThis is the value for the second parameter\nthat can span\nmultiple lines\n</parameter>\n</function>\n</tool_call>\n\n<IMPORTANT>\nReminder:\n- Function calls MUST follow the specified format: an inner <function=...></function> block must be nested within <tool_call></tool_call> XML tags\n- Required parameters MUST be specified\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\n- If there is no function call available, answer the question like normal with your current knowledge and do not tell the user about function calls\n</IMPORTANT>' }}
69
+ {%- if messages[0].role == 'system' %}
70
+ {%- set content = render_content(messages[0].content, false, true)|trim %}
71
+ {%- if content %}
72
+ {{- '\n\n' + content }}
73
+ {%- endif %}
74
+ {%- endif %}
75
+ {{- '<|im_end|>\n' }}
76
+ {%- else %}
77
+ {%- if messages[0].role == 'system' %}
78
+ {%- set content = render_content(messages[0].content, false, true)|trim %}
79
+ {%- if content %}
80
+ {{- '<|im_start|>system\n' + (reasoning_instructions + '\n\n' if reasoning_instructions else '') + content + '<|im_end|>\n' }}
81
+ {%- elif reasoning_instructions %}
82
+ {{- '<|im_start|>system\n' + reasoning_instructions + '<|im_end|>\n' }}
83
+ {%- endif %}
84
+ {%- elif reasoning_instructions %}
85
+ {{- '<|im_start|>system\n' + reasoning_instructions + '<|im_end|>\n' }}
86
+ {%- endif %}
87
+ {%- endif %}
88
+ {%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}
89
+ {%- for message in messages[::-1] %}
90
+ {%- set index = (messages|length - 1) - loop.index0 %}
91
+ {%- if ns.multi_step_tool and message.role == "user" %}
92
+ {%- set content = render_content(message.content, false)|trim %}
93
+ {%- if not(content.startswith('<tool_response>') and content.endswith('</tool_response>')) %}
94
+ {%- set ns.multi_step_tool = false %}
95
+ {%- set ns.last_query_index = index %}
96
+ {%- endif %}
97
+ {%- endif %}
98
+ {%- endfor %}
99
+ {%- if ns.multi_step_tool %}
100
+ {{- raise_exception('No user query found in messages.') }}
101
+ {%- endif %}
102
+ {%- for message in messages %}
103
+ {%- set content = render_content(message.content, true)|trim %}
104
+ {%- if message.role == "system" %}
105
+ {%- if not loop.first %}
106
+ {{- raise_exception('System message must be at the beginning.') }}
107
+ {%- endif %}
108
+ {%- elif message.role == "user" %}
109
+ {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }}
110
+ {%- elif message.role == "assistant" %}
111
+ {%- set reasoning_content = '' %}
112
+ {%- if message.reasoning_content is string %}
113
+ {%- set reasoning_content = message.reasoning_content %}
114
+ {%- endif %}
115
+ {%- set reasoning_content = reasoning_content|trim %}
116
+ {%- if preserve_thinking is undefined or preserve_thinking is true or loop.index0 > ns.last_query_index %}
117
+ {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content + '\n</think>\n\n' + content }}
118
+ {%- else %}
119
+ {{- '<|im_start|>' + message.role + '\n' + content }}
120
+ {%- endif %}
121
+ {%- if message.tool_calls and message.tool_calls is iterable and message.tool_calls is not mapping %}
122
+ {%- for tool_call in message.tool_calls %}
123
+ {%- if tool_call.function is defined %}
124
+ {%- set tool_call = tool_call.function %}
125
+ {%- endif %}
126
+ {%- if loop.first %}
127
+ {%- if content|trim %}
128
+ {{- '\n\n<tool_call>\n<function=' + tool_call.name + '>\n' }}
129
+ {%- else %}
130
+ {{- '<tool_call>\n<function=' + tool_call.name + '>\n' }}
131
+ {%- endif %}
132
+ {%- else %}
133
+ {{- '\n<tool_call>\n<function=' + tool_call.name + '>\n' }}
134
+ {%- endif %}
135
+ {%- if tool_call.arguments is defined and tool_call.arguments != '' %}
136
+ {%- for args_name, args_value in tool_call.arguments|items %}
137
+ {{- '<parameter=' + args_name + '>\n' }}
138
+ {%- set args_value = args_value | string if args_value is string else args_value | tojson | safe %}
139
+ {{- args_value }}
140
+ {{- '\n</parameter>\n' }}
141
+ {%- endfor %}
142
+ {%- endif %}
143
+ {{- '</function>\n</tool_call>' }}
144
+ {%- endfor %}
145
+ {%- endif %}
146
+ {{- '<|im_end|>\n' }}
147
+ {%- elif message.role == "tool" %}
148
+ {%- if loop.previtem and loop.previtem.role != "tool" %}
149
+ {{- '<|im_start|>user' }}
150
+ {%- endif %}
151
+ {{- '\n<tool_response>\n' }}
152
+ {{- content }}
153
+ {{- '\n</tool_response>' }}
154
+ {%- if not loop.last and loop.nextitem.role != "tool" %}
155
+ {{- '<|im_end|>\n' }}
156
+ {%- elif loop.last %}
157
+ {{- '<|im_end|>\n' }}
158
+ {%- endif %}
159
+ {%- else %}
160
+ {{- raise_exception('Unexpected message role.') }}
161
+ {%- endif %}
162
+ {%- endfor %}
163
+ {%- if add_generation_prompt %}
164
+ {{- '<|im_start|>assistant\n' }}
165
+ {%- if enable_thinking is defined and enable_thinking is false %}
166
+ {{- '<think>\n\n</think>\n\n' }}
167
+ {%- else %}
168
+ {{- '<think>\n' }}
169
+ {%- endif %}
170
+ {%- endif %}
compatibility/LICENSE-MLX-LM-MIT ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright © 2023 Apple Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
compatibility/conversion-result.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "command": [
3
+ "mlx_lm.convert",
4
+ "--hf-path",
5
+ "<SOURCE_MODEL_DIR>",
6
+ "--mlx-path",
7
+ "<OUTPUT_MODEL_DIR>",
8
+ "--quantize",
9
+ "--q-mode",
10
+ "affine",
11
+ "--q-bits",
12
+ "5",
13
+ "--q-group-size",
14
+ "64"
15
+ ],
16
+ "elapsed_seconds": 130.01374627799942,
17
+ "finished_at": "2026-09-22T12:05:47.557129+00:00",
18
+ "quantization": {
19
+ "bits": 5,
20
+ "group_size": 64,
21
+ "mode": "affine"
22
+ },
23
+ "returncode": 0,
24
+ "source_manifest_sha256": "0a00065b88ab003281853a7fb9bd5ce0086bc3781b36136d8c39da19933923ae",
25
+ "source_repo": "ukisai/Swift-1.5-Qwen3.8-27b",
26
+ "source_revision": "5ad04445d2686f525e9fbe5c077e6fa0c7df4200",
27
+ "started_at": "2026-09-22T12:03:37.543218+00:00"
28
+ }
compatibility/enable-5bit.patch ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ diff --git a/mlx_lm/models/qwen3_5_full.py b/mlx_lm/models/qwen3_5_full.py
2
+ --- a/mlx_lm/models/qwen3_5_full.py
3
+ +++ b/mlx_lm/models/qwen3_5_full.py
4
+ @@ -459,9 +459,9 @@ class Model(nn.Module):
5
+ settings.get("group_size"),
6
+ settings.get("mode", "affine"),
7
+ )
8
+ - if (bits, group, mode) != (4, 64, "affine"):
9
+ + if bits not in (4, 5) or group != 64 or mode != "affine":
10
+ raise ValueError(
11
+ - "This extension only prepares affine/4-bit/group-64 native checkpoints"
12
+ + "This extension only prepares affine/4-or-5-bit/group-64 native checkpoints"
13
+ )
14
+ original = shapes[f"{path}.weight"]
15
+ if original[-1] % group:
16
+ diff --git a/tests/test_qwen3_5_full.py b/tests/test_qwen3_5_full.py
17
+ --- a/tests/test_qwen3_5_full.py
18
+ +++ b/tests/test_qwen3_5_full.py
19
+ @@ -340,14 +340,17 @@ def test_official_nonquantized_convert_and_reload_preserve_all_tensors(
20
+ load_model(output, lazy=True)
21
+
22
+
23
+ -def test_fixed_affine_quantized_roundtrip_preserves_component_tree(reference, tmp_path):
24
+ +@pytest.mark.parametrize("bits", [4, 5])
25
+ +def test_fixed_affine_quantized_roundtrip_preserves_component_tree(
26
+ + reference, tmp_path, bits
27
+ +):
28
+ from mlx_lm.utils import quantize_model, save_model
29
+
30
+ config, _, _, state, _ = reference
31
+ model = Model(ModelArgs.from_dict(config))
32
+ model.load_weights(list(model.sanitize(state).items()), strict=True)
33
+ original_names = set(dict(tree_flatten(model.parameters())))
34
+ - model, quantized_config = quantize_model(model, config, 64, 4, mode="affine")
35
+ + model, quantized_config = quantize_model(model, config, 64, bits, mode="affine")
36
+ save_model(tmp_path, model)
37
+ save_config(quantized_config, tmp_path / "config.json")
38
+ loaded, saved_config = load_model(tmp_path, lazy=False, strict=True)
39
+ @@ -355,7 +358,7 @@ def test_fixed_affine_quantized_roundtrip_preserves_component_tree(reference, tm
40
+ assert set(actual) == set(expected)
41
+ assert original_names <= set(actual)
42
+ assert saved_config["quantization"] == {
43
+ - "bits": 4,
44
+ + "bits": bits,
45
+ "group_size": 64,
46
+ "mode": "affine",
47
+ }
compatibility/environment-linux.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "packages": {
3
+ "huggingface-hub": "1.32.0",
4
+ "mlx": "0.32.2",
5
+ "mlx-cpu": "0.32.2",
6
+ "mlx-lm": "0.32.0",
7
+ "pillow": "12.3.0",
8
+ "safetensors": "0.8.0",
9
+ "transformers": "5.14.1"
10
+ },
11
+ "platform": "Linux x86_64",
12
+ "runtime": "CPU validation only"
13
+ }
compatibility/macos-quantized-matmul-diagnostic.json ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "scope": "Synthetic kernel probe on macOS, not Linux and not real model inference",
3
+ "results": [
4
+ {
5
+ "device": "DeviceType.gpu",
6
+ "bits": 3,
7
+ "group_size": 64,
8
+ "floating_dtype": "mlx.core.bfloat16",
9
+ "expected": 8192,
10
+ "actual": [
11
+ [
12
+ 8192.0,
13
+ 8192.0,
14
+ 8192.0,
15
+ 8192.0,
16
+ 8192.0,
17
+ 8192.0,
18
+ 8192.0,
19
+ 8192.0
20
+ ]
21
+ ],
22
+ "exact": true,
23
+ "packed_sha256": "de676bae28a480011d3d012db14bef539324e62a841a9627863c689bea168af3",
24
+ "packed_dtype": "mlx.core.uint32",
25
+ "seconds": 0.02095266600008472
26
+ },
27
+ {
28
+ "device": "DeviceType.gpu",
29
+ "bits": 3,
30
+ "group_size": 64,
31
+ "floating_dtype": "mlx.core.float32",
32
+ "expected": 8192,
33
+ "actual": [
34
+ [
35
+ 8192.0,
36
+ 8192.0,
37
+ 8192.0,
38
+ 8192.0,
39
+ 8192.0,
40
+ 8192.0,
41
+ 8192.0,
42
+ 8192.0
43
+ ]
44
+ ],
45
+ "exact": true,
46
+ "packed_sha256": "de676bae28a480011d3d012db14bef539324e62a841a9627863c689bea168af3",
47
+ "packed_dtype": "mlx.core.uint32",
48
+ "seconds": 0.014540874999511288
49
+ },
50
+ {
51
+ "device": "DeviceType.gpu",
52
+ "bits": 5,
53
+ "group_size": 64,
54
+ "floating_dtype": "mlx.core.bfloat16",
55
+ "expected": 8192,
56
+ "actual": [
57
+ [
58
+ 8192.0,
59
+ 8192.0,
60
+ 8192.0,
61
+ 8192.0,
62
+ 8192.0,
63
+ 8192.0,
64
+ 8192.0,
65
+ 8192.0
66
+ ]
67
+ ],
68
+ "exact": true,
69
+ "packed_sha256": "02b1c2234680617802901a77eae606ad02e4ddb4282ccbc60061eac5b2d90bba",
70
+ "packed_dtype": "mlx.core.uint32",
71
+ "seconds": 0.017056000000593485
72
+ },
73
+ {
74
+ "device": "DeviceType.gpu",
75
+ "bits": 5,
76
+ "group_size": 64,
77
+ "floating_dtype": "mlx.core.float32",
78
+ "expected": 8192,
79
+ "actual": [
80
+ [
81
+ 8192.0,
82
+ 8192.0,
83
+ 8192.0,
84
+ 8192.0,
85
+ 8192.0,
86
+ 8192.0,
87
+ 8192.0,
88
+ 8192.0
89
+ ]
90
+ ],
91
+ "exact": true,
92
+ "packed_sha256": "02b1c2234680617802901a77eae606ad02e4ddb4282ccbc60061eac5b2d90bba",
93
+ "packed_dtype": "mlx.core.uint32",
94
+ "seconds": 0.021967042001051595
95
+ },
96
+ {
97
+ "device": "DeviceType.cpu",
98
+ "bits": 3,
99
+ "group_size": 64,
100
+ "floating_dtype": "mlx.core.bfloat16",
101
+ "expected": 8192,
102
+ "actual": [
103
+ [
104
+ 256.0,
105
+ 256.0,
106
+ 256.0,
107
+ 256.0,
108
+ 256.0,
109
+ 256.0,
110
+ 256.0,
111
+ 256.0
112
+ ]
113
+ ],
114
+ "exact": false,
115
+ "packed_sha256": "de676bae28a480011d3d012db14bef539324e62a841a9627863c689bea168af3",
116
+ "packed_dtype": "mlx.core.uint32",
117
+ "seconds": 0.00037379100103862584
118
+ },
119
+ {
120
+ "device": "DeviceType.cpu",
121
+ "bits": 3,
122
+ "group_size": 64,
123
+ "floating_dtype": "mlx.core.float32",
124
+ "expected": 8192,
125
+ "actual": [
126
+ [
127
+ 8192.0,
128
+ 8192.0,
129
+ 8192.0,
130
+ 8192.0,
131
+ 8192.0,
132
+ 8192.0,
133
+ 8192.0,
134
+ 8192.0
135
+ ]
136
+ ],
137
+ "exact": true,
138
+ "packed_sha256": "de676bae28a480011d3d012db14bef539324e62a841a9627863c689bea168af3",
139
+ "packed_dtype": "mlx.core.uint32",
140
+ "seconds": 0.00011829099821625277
141
+ },
142
+ {
143
+ "device": "DeviceType.cpu",
144
+ "bits": 5,
145
+ "group_size": 64,
146
+ "floating_dtype": "mlx.core.bfloat16",
147
+ "expected": 8192,
148
+ "actual": [
149
+ [
150
+ 256.0,
151
+ 256.0,
152
+ 256.0,
153
+ 256.0,
154
+ 256.0,
155
+ 256.0,
156
+ 256.0,
157
+ 256.0
158
+ ]
159
+ ],
160
+ "exact": false,
161
+ "packed_sha256": "02b1c2234680617802901a77eae606ad02e4ddb4282ccbc60061eac5b2d90bba",
162
+ "packed_dtype": "mlx.core.uint32",
163
+ "seconds": 0.0003301249998912681
164
+ },
165
+ {
166
+ "device": "DeviceType.cpu",
167
+ "bits": 5,
168
+ "group_size": 64,
169
+ "floating_dtype": "mlx.core.float32",
170
+ "expected": 8192,
171
+ "actual": [
172
+ [
173
+ 8192.0,
174
+ 8192.0,
175
+ 8192.0,
176
+ 8192.0,
177
+ 8192.0,
178
+ 8192.0,
179
+ 8192.0,
180
+ 8192.0
181
+ ]
182
+ ],
183
+ "exact": true,
184
+ "packed_sha256": "02b1c2234680617802901a77eae606ad02e4ddb4282ccbc60061eac5b2d90bba",
185
+ "packed_dtype": "mlx.core.uint32",
186
+ "seconds": 8.200000229408033e-05
187
+ }
188
+ ]
189
+ }
compatibility/package-checks.json ADDED
@@ -0,0 +1,2088 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "observed_at": "2026-09-22T14:48:11.669625+00:00",
3
+ "source": "Independent local packaging audit",
4
+ "scope": "Original-build file integrity and runtime assets; no full model generation",
5
+ "original_build_integrity": {
6
+ "model": "mlx5",
7
+ "event": "SUMMARY",
8
+ "file_count": 29,
9
+ "tensor_count": 2379,
10
+ "manifest_sha256": "1e0d5730ef70b67f8dbbe6c2b2ced6115f74658b7a30c73948fa5497c226935a",
11
+ "manifest_mismatches": [],
12
+ "header_index_status": "PASS",
13
+ "elapsed_seconds": 147.257588171,
14
+ "scope": "Original build; NOT HF upload validation"
15
+ },
16
+ "original_small_file_matches": [
17
+ {
18
+ "file": "LICENSE",
19
+ "sha256": "1367057bf17041aa1d69286a1400be5f464d2f8b8f54f600088b209eac1850be",
20
+ "matches_original_build": true
21
+ },
22
+ {
23
+ "file": "LICENSE-APACHE-2.0",
24
+ "sha256": "bbedc3fda3305820b977265f01b8619d87570a6739de3a5582c3464840f1e57a",
25
+ "matches_original_build": true
26
+ },
27
+ {
28
+ "file": "NOTICE",
29
+ "sha256": "be30f3d464974990e40e9833bc6f356fd89fe16733c6c1a581d97106b8ae741d",
30
+ "matches_original_build": true
31
+ },
32
+ {
33
+ "file": "QUANTIZATION_MANIFEST.json",
34
+ "sha256": "7bbc577963403dd60e93e994a8aeb12142558031d985489aea27708a97ada4cf",
35
+ "matches_original_build": true
36
+ },
37
+ {
38
+ "file": "README.md",
39
+ "sha256": "22ec5682ebce0fd3f576d70c87fc8bba81589ebdb6370f59bf664f36bf9bc694",
40
+ "matches_original_build": true
41
+ },
42
+ {
43
+ "file": "USAGE.md",
44
+ "sha256": "15e984ebae2115a54d86282ce7e04ebac6e78eb1e2ca4f55191d5a9a908b47a2",
45
+ "matches_original_build": true
46
+ },
47
+ {
48
+ "file": "chat_template.jinja",
49
+ "sha256": "c3cf9e34abf4f9e36c2d72165aa9c132d3e2a725b6c2586aaa3a8af9d7a81041",
50
+ "matches_original_build": true
51
+ },
52
+ {
53
+ "file": "compatibility/conversion-result.json",
54
+ "sha256": "46d5f5abfae73b29c2b65ec5a6d05decd8e4d5b50eb0dd0df90f94edae040986",
55
+ "matches_original_build": true
56
+ },
57
+ {
58
+ "file": "compatibility/enable-5bit.patch",
59
+ "sha256": "b985961eac3035e05ca4c9f3a8b283c26e6dd69bab4d113997fc04fe2a4f99cc",
60
+ "matches_original_build": true
61
+ },
62
+ {
63
+ "file": "compatibility/environment-linux.json",
64
+ "sha256": "29646417ed15e6c1d08602b5832287abd44aabf4da624ea06f7e0b617bccbb48",
65
+ "matches_original_build": true
66
+ },
67
+ {
68
+ "file": "compatibility/patch-manifest.json",
69
+ "sha256": "c862249f212d4f94113a85336db22a24f3128014c034cdf9878fb9e44b103a95",
70
+ "matches_original_build": true
71
+ },
72
+ {
73
+ "file": "compatibility/quant-validation-results.json",
74
+ "sha256": "5a2bdbaa7ffa5616b2edf4817953369c694596c6d41aca2ba458a48b651ebab2",
75
+ "matches_original_build": true
76
+ },
77
+ {
78
+ "file": "compatibility/source-structural-results.json",
79
+ "sha256": "2c07ba0d068c3cf8059b3cf31578c9e98540fb08140a2623d79a1eb9737e12e4",
80
+ "matches_original_build": true
81
+ },
82
+ {
83
+ "file": "compatibility/source-verification.json",
84
+ "sha256": "27d87d8d5209c6559643efdd7d7b468b0138ebfb3a7d5771b29be79214bffe75",
85
+ "matches_original_build": true
86
+ },
87
+ {
88
+ "file": "compatibility/swift15-mlx-lm.patch",
89
+ "sha256": "f6f1d0bdafa45863bfbf93dac0398c481c993ea04fdf38b9bae98c643f89eaec",
90
+ "matches_original_build": true
91
+ },
92
+ {
93
+ "file": "config.json",
94
+ "sha256": "77eaf6b1ee9e2ca06a9a3119f218853ec16c6f9f558e6b492a7e9a1be8d2ac43",
95
+ "matches_original_build": true
96
+ },
97
+ {
98
+ "file": "generation_config.json",
99
+ "sha256": "e70c136c1b78ddc1fb0905bac8e733a4dc448d4f852a5dd75143fffc70be550e",
100
+ "matches_original_build": true
101
+ },
102
+ {
103
+ "file": "merges.txt",
104
+ "sha256": "a9d356d7bdf1ef4949e3e748e95b8e10ad9d4e2e838eddc38a0a7b6b94d1db8d",
105
+ "matches_original_build": true
106
+ },
107
+ {
108
+ "file": "preprocessor_config.json",
109
+ "sha256": "27225450ac9c6529872ee1924fcb0962ff5634834f817040f444118116f4e516",
110
+ "matches_original_build": true
111
+ },
112
+ {
113
+ "file": "tokenizer.json",
114
+ "sha256": "0997f410c57a1f4e53b09e4be8f4a172d90edd9564368fb0847030937229b9f3",
115
+ "matches_original_build": true
116
+ },
117
+ {
118
+ "file": "tokenizer_config.json",
119
+ "sha256": "b11349aafa7cdc6a320767cf7ceb29ed82f7eda5d65e8e0819e76f0ce947bf27",
120
+ "matches_original_build": true
121
+ },
122
+ {
123
+ "file": "ukisai-banner.png",
124
+ "sha256": "8577252b8b37e331f06f7ddecdf3bfa1c497e164f9eb36d78c37232d1b8492ca",
125
+ "matches_original_build": true
126
+ },
127
+ {
128
+ "file": "video_preprocessor_config.json",
129
+ "sha256": "7768af27c1fafa9cc9011c1dc20067e03f8915e03b63504550e11d5066986d13",
130
+ "matches_original_build": true
131
+ },
132
+ {
133
+ "file": "vocab.json",
134
+ "sha256": "ce99b4cb2983d118806ce0a8b777a35b093e2000a503ebde25853284c9dfa003",
135
+ "matches_original_build": true
136
+ }
137
+ ],
138
+ "original_small_file_matches_scope": "Verified inputs before the documented documentation overlay; current file digests are in UPLOAD_MANIFEST.json.",
139
+ "tokenizer_comparison": {
140
+ "status": "PASS",
141
+ "cases": [
142
+ {
143
+ "case": "copy-01",
144
+ "options": {},
145
+ "rendered_equal": true,
146
+ "tokens_equal": true,
147
+ "rendered_sha256": "4c818d1bec319bdcb9f9ae6fb165958cc228993b88271d074717a54da892a12c",
148
+ "token_ids_sha256": "a92b1c7a4f0c7046a5d8adfa819d3d92870cce145b5316398b467f77267b467b"
149
+ },
150
+ {
151
+ "case": "copy-01",
152
+ "options": {
153
+ "enable_thinking": false
154
+ },
155
+ "rendered_equal": true,
156
+ "tokens_equal": true,
157
+ "rendered_sha256": "65d21c471e0404dd574585906ea708c25e143644e26d6f6da38a963c89d95353",
158
+ "token_ids_sha256": "2f2ea6c38bd950ee61cab76d0e0a2719b90793c129881f4653665f6f32e83f37"
159
+ },
160
+ {
161
+ "case": "copy-01",
162
+ "options": {
163
+ "reasoning_effort": "low"
164
+ },
165
+ "rendered_equal": true,
166
+ "tokens_equal": true,
167
+ "rendered_sha256": "18150302804516ca9bde6d9f4859e35de3047beb7f3f42db2c709f9f659f7d97",
168
+ "token_ids_sha256": "99796b2eb8cb5ea634506794c13de258c6a4381ef2ff617a4952a2e81100a773"
169
+ },
170
+ {
171
+ "case": "copy-01",
172
+ "options": {
173
+ "reasoning_effort": "medium"
174
+ },
175
+ "rendered_equal": true,
176
+ "tokens_equal": true,
177
+ "rendered_sha256": "cc38501bdf707099ff6a0e337475ea7df68417bfc4012dbeff043f22d9d671ef",
178
+ "token_ids_sha256": "628de4373c94835dfb58149eb1f3a6cc7de44019ecff368687b61a6271501263"
179
+ },
180
+ {
181
+ "case": "copy-01",
182
+ "options": {
183
+ "reasoning_effort": "xhigh"
184
+ },
185
+ "rendered_equal": true,
186
+ "tokens_equal": true,
187
+ "rendered_sha256": "4c818d1bec319bdcb9f9ae6fb165958cc228993b88271d074717a54da892a12c",
188
+ "token_ids_sha256": "a92b1c7a4f0c7046a5d8adfa819d3d92870cce145b5316398b467f77267b467b"
189
+ },
190
+ {
191
+ "case": "copy-02",
192
+ "options": {},
193
+ "rendered_equal": true,
194
+ "tokens_equal": true,
195
+ "rendered_sha256": "c899009f64185c1cf610481f00667851c613755d9992bbea2782f63a23aeab50",
196
+ "token_ids_sha256": "a2c44489d2864ff48ab7c3c4ed23786132dba628a7160d29d49538eb7754232d"
197
+ },
198
+ {
199
+ "case": "copy-02",
200
+ "options": {
201
+ "enable_thinking": false
202
+ },
203
+ "rendered_equal": true,
204
+ "tokens_equal": true,
205
+ "rendered_sha256": "0dce1e6a9eae5b1630ac76c0d094e90b3d51252fe393b03eee6678564e29f43a",
206
+ "token_ids_sha256": "ca5fbed68bb860caa55ef73136f045a99917c48c8897883c60f8c71646f03e4f"
207
+ },
208
+ {
209
+ "case": "copy-02",
210
+ "options": {
211
+ "reasoning_effort": "low"
212
+ },
213
+ "rendered_equal": true,
214
+ "tokens_equal": true,
215
+ "rendered_sha256": "398a9d6fee34ee4123220a2a2902f597f4313c8511d97f6793d6b546466c0421",
216
+ "token_ids_sha256": "d2a89478a168aa84c857b0a92a02e92d72827dafe25d4b295a85cb6e4ae62451"
217
+ },
218
+ {
219
+ "case": "copy-02",
220
+ "options": {
221
+ "reasoning_effort": "medium"
222
+ },
223
+ "rendered_equal": true,
224
+ "tokens_equal": true,
225
+ "rendered_sha256": "34206e0e86b7b48b6e4a90b432c00dfecd7e215379355ddf16616a891ec15a5f",
226
+ "token_ids_sha256": "f6d035e18f6cce3a81e364b17997f04a6e373fda9ffd2c803957a0b67a91f3b3"
227
+ },
228
+ {
229
+ "case": "copy-02",
230
+ "options": {
231
+ "reasoning_effort": "xhigh"
232
+ },
233
+ "rendered_equal": true,
234
+ "tokens_equal": true,
235
+ "rendered_sha256": "c899009f64185c1cf610481f00667851c613755d9992bbea2782f63a23aeab50",
236
+ "token_ids_sha256": "a2c44489d2864ff48ab7c3c4ed23786132dba628a7160d29d49538eb7754232d"
237
+ },
238
+ {
239
+ "case": "copy-03",
240
+ "options": {},
241
+ "rendered_equal": true,
242
+ "tokens_equal": true,
243
+ "rendered_sha256": "7546d15c056af8aa4c0c90d23aabb5b1ca726609ba850c3b1b6185a613837c92",
244
+ "token_ids_sha256": "ddbc030acb515ce5e2d03db0a169b6f68905c4827af8a329fed19bec400f985f"
245
+ },
246
+ {
247
+ "case": "copy-03",
248
+ "options": {
249
+ "enable_thinking": false
250
+ },
251
+ "rendered_equal": true,
252
+ "tokens_equal": true,
253
+ "rendered_sha256": "941b6b40fb0afa04dcb3cbeb3d703e1362bfab8aff0c223fe723ad68fb0f1c8c",
254
+ "token_ids_sha256": "1ae80f7895f4296112ee802500c9650fbba344adbd43ea18f6ec38ee5fc1c5ab"
255
+ },
256
+ {
257
+ "case": "copy-03",
258
+ "options": {
259
+ "reasoning_effort": "low"
260
+ },
261
+ "rendered_equal": true,
262
+ "tokens_equal": true,
263
+ "rendered_sha256": "fff8cb95ccca437354811f847c4803f4db097acb3e25741571dc0bc3125275d9",
264
+ "token_ids_sha256": "e2d2fbfdef377e1dc40cc011dd75adf8484f8ad6f2769241207f1070e4b4101f"
265
+ },
266
+ {
267
+ "case": "copy-03",
268
+ "options": {
269
+ "reasoning_effort": "medium"
270
+ },
271
+ "rendered_equal": true,
272
+ "tokens_equal": true,
273
+ "rendered_sha256": "b5b000a062e3a761951c5b319766cec522bfb6d922409fcabfc3d0ddb1a4359d",
274
+ "token_ids_sha256": "262b04aaeff8bf09922edc2a45504750fd9fc9c3f3055b403a9f68b871c6d1c9"
275
+ },
276
+ {
277
+ "case": "copy-03",
278
+ "options": {
279
+ "reasoning_effort": "xhigh"
280
+ },
281
+ "rendered_equal": true,
282
+ "tokens_equal": true,
283
+ "rendered_sha256": "7546d15c056af8aa4c0c90d23aabb5b1ca726609ba850c3b1b6185a613837c92",
284
+ "token_ids_sha256": "ddbc030acb515ce5e2d03db0a169b6f68905c4827af8a329fed19bec400f985f"
285
+ },
286
+ {
287
+ "case": "copy-04",
288
+ "options": {},
289
+ "rendered_equal": true,
290
+ "tokens_equal": true,
291
+ "rendered_sha256": "93cd159f2fb657d1616693847e4f5c43af88edb03234c0b2dcc0181ff408b6ed",
292
+ "token_ids_sha256": "9cca472a04965a233f1a5e45043c6f112b9ee441dd9b26aa23de8b4ca61a626c"
293
+ },
294
+ {
295
+ "case": "copy-04",
296
+ "options": {
297
+ "enable_thinking": false
298
+ },
299
+ "rendered_equal": true,
300
+ "tokens_equal": true,
301
+ "rendered_sha256": "0d7641637466c7079c2bc3e9e79a92397c06d7622bb8472c475f0fe452654c83",
302
+ "token_ids_sha256": "f283875df94548c1657a5550db42828ce955ec3b20fa148e646bbf042f6f0d2b"
303
+ },
304
+ {
305
+ "case": "copy-04",
306
+ "options": {
307
+ "reasoning_effort": "low"
308
+ },
309
+ "rendered_equal": true,
310
+ "tokens_equal": true,
311
+ "rendered_sha256": "05353d7dc1f61ff121bf6598e0936277bd9ca84fbc19fd91e286d6e4b45bc059",
312
+ "token_ids_sha256": "2f715ed2fb5ec71a98be5bd3ed990a1e70d0678f168da4306a5f27dddc0b6856"
313
+ },
314
+ {
315
+ "case": "copy-04",
316
+ "options": {
317
+ "reasoning_effort": "medium"
318
+ },
319
+ "rendered_equal": true,
320
+ "tokens_equal": true,
321
+ "rendered_sha256": "f1a18e28b7392715dc638885ae8d79244fbd278f43e7c13f69fe8fb2b93da608",
322
+ "token_ids_sha256": "433b7e2976986230f0a2e200c658f3a7f00f0e38fe8906970aaedddc66fa59d9"
323
+ },
324
+ {
325
+ "case": "copy-04",
326
+ "options": {
327
+ "reasoning_effort": "xhigh"
328
+ },
329
+ "rendered_equal": true,
330
+ "tokens_equal": true,
331
+ "rendered_sha256": "93cd159f2fb657d1616693847e4f5c43af88edb03234c0b2dcc0181ff408b6ed",
332
+ "token_ids_sha256": "9cca472a04965a233f1a5e45043c6f112b9ee441dd9b26aa23de8b4ca61a626c"
333
+ },
334
+ {
335
+ "case": "copy-05",
336
+ "options": {},
337
+ "rendered_equal": true,
338
+ "tokens_equal": true,
339
+ "rendered_sha256": "fb61ba28f75ad7405020c6d3241f3728b010b8633fdc1642e129b81523e87ad3",
340
+ "token_ids_sha256": "c0337ac4d3e6f3afd6fb5313d1ae35c3fba5fdc1d3b32c615ea1a9d469b23426"
341
+ },
342
+ {
343
+ "case": "copy-05",
344
+ "options": {
345
+ "enable_thinking": false
346
+ },
347
+ "rendered_equal": true,
348
+ "tokens_equal": true,
349
+ "rendered_sha256": "a6bf42558b20071884725645d2ff092639c819386f92af80f95cf87951eceb25",
350
+ "token_ids_sha256": "c1f030f36157b04cdd7a5599f05578720ef484f3300982179014968be81ea065"
351
+ },
352
+ {
353
+ "case": "copy-05",
354
+ "options": {
355
+ "reasoning_effort": "low"
356
+ },
357
+ "rendered_equal": true,
358
+ "tokens_equal": true,
359
+ "rendered_sha256": "ef76dafe530370c7baa9a57c590899bfd62f6814b9c6c36735e28002e382a072",
360
+ "token_ids_sha256": "587c1d346c730fdf014d7e27e58f57344dc0d1e2c3a95a80dce943a16b5d21a6"
361
+ },
362
+ {
363
+ "case": "copy-05",
364
+ "options": {
365
+ "reasoning_effort": "medium"
366
+ },
367
+ "rendered_equal": true,
368
+ "tokens_equal": true,
369
+ "rendered_sha256": "96eaf3b174a72fcabbd9115c37f1a8c180a2ed19340a0cab757c80887a7b06dd",
370
+ "token_ids_sha256": "99598ba689281150a6a056699b14f24b499fc7c0a882ef22e4b2a2a682ff0057"
371
+ },
372
+ {
373
+ "case": "copy-05",
374
+ "options": {
375
+ "reasoning_effort": "xhigh"
376
+ },
377
+ "rendered_equal": true,
378
+ "tokens_equal": true,
379
+ "rendered_sha256": "fb61ba28f75ad7405020c6d3241f3728b010b8633fdc1642e129b81523e87ad3",
380
+ "token_ids_sha256": "c0337ac4d3e6f3afd6fb5313d1ae35c3fba5fdc1d3b32c615ea1a9d469b23426"
381
+ },
382
+ {
383
+ "case": "arithmetic-01",
384
+ "options": {},
385
+ "rendered_equal": true,
386
+ "tokens_equal": true,
387
+ "rendered_sha256": "2a3e217d73ae1cdf4118b870a9ec322dc88de707843c83f0f5481f813faa99a4",
388
+ "token_ids_sha256": "56a79c0ee7bb6e52c284a19a16146c231142c47b22bfd0a27dac2330822afb49"
389
+ },
390
+ {
391
+ "case": "arithmetic-01",
392
+ "options": {
393
+ "enable_thinking": false
394
+ },
395
+ "rendered_equal": true,
396
+ "tokens_equal": true,
397
+ "rendered_sha256": "ee9178c74035beb407c016586ef958578e5be4041b572aa2bf5409dcddf07739",
398
+ "token_ids_sha256": "b520feeac9ab433d35a057c9dc8e2a169254fa0db38e76955d042a2f91c774a7"
399
+ },
400
+ {
401
+ "case": "arithmetic-01",
402
+ "options": {
403
+ "reasoning_effort": "low"
404
+ },
405
+ "rendered_equal": true,
406
+ "tokens_equal": true,
407
+ "rendered_sha256": "3c43b55f9ffffff2dcf76e9b6ae04a1311b330b2c0757ed1fe664cd64c469506",
408
+ "token_ids_sha256": "3b9b091b00ae6093fb726ab7fa7c5e5bdaf6aa87238eb14291bf52a439e178cb"
409
+ },
410
+ {
411
+ "case": "arithmetic-01",
412
+ "options": {
413
+ "reasoning_effort": "medium"
414
+ },
415
+ "rendered_equal": true,
416
+ "tokens_equal": true,
417
+ "rendered_sha256": "39e3c8c4b7c6b8352df4c942933b289007e0e9ac3c7d3dfa172203f0891ad801",
418
+ "token_ids_sha256": "17ca2fe9b641d0b785ef902f06a0fb4463f8b144e85903dcd0dbf7dea82f54be"
419
+ },
420
+ {
421
+ "case": "arithmetic-01",
422
+ "options": {
423
+ "reasoning_effort": "xhigh"
424
+ },
425
+ "rendered_equal": true,
426
+ "tokens_equal": true,
427
+ "rendered_sha256": "2a3e217d73ae1cdf4118b870a9ec322dc88de707843c83f0f5481f813faa99a4",
428
+ "token_ids_sha256": "56a79c0ee7bb6e52c284a19a16146c231142c47b22bfd0a27dac2330822afb49"
429
+ },
430
+ {
431
+ "case": "arithmetic-02",
432
+ "options": {},
433
+ "rendered_equal": true,
434
+ "tokens_equal": true,
435
+ "rendered_sha256": "1580424514af0e654467483640add4ab4c970be8278db0a7dc51a6634160fafe",
436
+ "token_ids_sha256": "bc696d41dda4cfadb0539d3e6b16bba3012ff8adfd9eeba7f192b3fb020bd1ba"
437
+ },
438
+ {
439
+ "case": "arithmetic-02",
440
+ "options": {
441
+ "enable_thinking": false
442
+ },
443
+ "rendered_equal": true,
444
+ "tokens_equal": true,
445
+ "rendered_sha256": "ed261285116d3895ef5f2209e9cdc6c9abd475a551b8ec212ba201303c02de65",
446
+ "token_ids_sha256": "6440d6812569b88a93b4fb5877d6a13138a10c627b39cd54adee08ddefe19eec"
447
+ },
448
+ {
449
+ "case": "arithmetic-02",
450
+ "options": {
451
+ "reasoning_effort": "low"
452
+ },
453
+ "rendered_equal": true,
454
+ "tokens_equal": true,
455
+ "rendered_sha256": "3956026c853805d5dd053f1cb259f44626617e1c4946148db45c2561fea505ec",
456
+ "token_ids_sha256": "248a53a76b3082f4ca13c376452d9fa450cc372b27ee74681776106bf62f75dc"
457
+ },
458
+ {
459
+ "case": "arithmetic-02",
460
+ "options": {
461
+ "reasoning_effort": "medium"
462
+ },
463
+ "rendered_equal": true,
464
+ "tokens_equal": true,
465
+ "rendered_sha256": "b186fa6f03caeb78d03459674e39e7a017d68a025cb578ad0b68ebd10d082f31",
466
+ "token_ids_sha256": "d436f86318f7c2911a841f3dd3310ee76feffd7eecb427f87addbc87eb8c2607"
467
+ },
468
+ {
469
+ "case": "arithmetic-02",
470
+ "options": {
471
+ "reasoning_effort": "xhigh"
472
+ },
473
+ "rendered_equal": true,
474
+ "tokens_equal": true,
475
+ "rendered_sha256": "1580424514af0e654467483640add4ab4c970be8278db0a7dc51a6634160fafe",
476
+ "token_ids_sha256": "bc696d41dda4cfadb0539d3e6b16bba3012ff8adfd9eeba7f192b3fb020bd1ba"
477
+ },
478
+ {
479
+ "case": "arithmetic-03",
480
+ "options": {},
481
+ "rendered_equal": true,
482
+ "tokens_equal": true,
483
+ "rendered_sha256": "758590c0e51a33e06f51fbffc5bbe0e3f777b0f7bf88ad708b58ebd6faccb390",
484
+ "token_ids_sha256": "bebe998965694a6a237aaa57377f49b2edab3815b787bd14a880e37433951748"
485
+ },
486
+ {
487
+ "case": "arithmetic-03",
488
+ "options": {
489
+ "enable_thinking": false
490
+ },
491
+ "rendered_equal": true,
492
+ "tokens_equal": true,
493
+ "rendered_sha256": "ee6e110a809b16af00e88c49f620155ce1c738fd11950af79743146491eb0200",
494
+ "token_ids_sha256": "ece7b34196ccd3cee4f4533466992cc6819660af56bd1bb4c1e4a2efbd09d1aa"
495
+ },
496
+ {
497
+ "case": "arithmetic-03",
498
+ "options": {
499
+ "reasoning_effort": "low"
500
+ },
501
+ "rendered_equal": true,
502
+ "tokens_equal": true,
503
+ "rendered_sha256": "69fdc96534e7e6c2b009822cfbe68f1b164bd8cc28a38396ac6532c9e3717627",
504
+ "token_ids_sha256": "290d3d9286cc2fa631a68f8d7d7c21e79b101dd6f9d47d2e5fed68cae8dfa9f1"
505
+ },
506
+ {
507
+ "case": "arithmetic-03",
508
+ "options": {
509
+ "reasoning_effort": "medium"
510
+ },
511
+ "rendered_equal": true,
512
+ "tokens_equal": true,
513
+ "rendered_sha256": "4fc7455c07e88c95e3e4b9789d219e4bda857bbd8e75099da123855c41c93a9b",
514
+ "token_ids_sha256": "15384731525c414b4dd4496505a9d1c10db7b09e191ecc1ca1324ce51740b9c8"
515
+ },
516
+ {
517
+ "case": "arithmetic-03",
518
+ "options": {
519
+ "reasoning_effort": "xhigh"
520
+ },
521
+ "rendered_equal": true,
522
+ "tokens_equal": true,
523
+ "rendered_sha256": "758590c0e51a33e06f51fbffc5bbe0e3f777b0f7bf88ad708b58ebd6faccb390",
524
+ "token_ids_sha256": "bebe998965694a6a237aaa57377f49b2edab3815b787bd14a880e37433951748"
525
+ },
526
+ {
527
+ "case": "arithmetic-04",
528
+ "options": {},
529
+ "rendered_equal": true,
530
+ "tokens_equal": true,
531
+ "rendered_sha256": "c91b90926ba37c04a16a7e51163ed88366f6ad1f91eb7a4c40a8213b986f6f2d",
532
+ "token_ids_sha256": "e1706e27836de214be0261eff95fe8145f2945effdc517a7e9115ded3148a67a"
533
+ },
534
+ {
535
+ "case": "arithmetic-04",
536
+ "options": {
537
+ "enable_thinking": false
538
+ },
539
+ "rendered_equal": true,
540
+ "tokens_equal": true,
541
+ "rendered_sha256": "bce2488b1645bb08cb2a157697c4dbc6d634da4e9b1949a9f77e3e987d4ac3e4",
542
+ "token_ids_sha256": "52455a3c634132dfcc0673da9ab990c3def7dac61376fdc9614160b1172b10bc"
543
+ },
544
+ {
545
+ "case": "arithmetic-04",
546
+ "options": {
547
+ "reasoning_effort": "low"
548
+ },
549
+ "rendered_equal": true,
550
+ "tokens_equal": true,
551
+ "rendered_sha256": "9823550d5e522b6cf480c9d82a1726e3b6530437570093e24bf7a82920827c1b",
552
+ "token_ids_sha256": "1aa3c00b507cfb0fda234a8759b649edad21c2e167c4fa77e4632cad6837ed9e"
553
+ },
554
+ {
555
+ "case": "arithmetic-04",
556
+ "options": {
557
+ "reasoning_effort": "medium"
558
+ },
559
+ "rendered_equal": true,
560
+ "tokens_equal": true,
561
+ "rendered_sha256": "60d7fc3ef5d976266dfbe9fa89c6f82bd990fbf2c751aff527871070001fa549",
562
+ "token_ids_sha256": "9115c65f6cc99cbcf2ceccf86f3a62ef18d39afaa429b74cc9297894a6ffe1cb"
563
+ },
564
+ {
565
+ "case": "arithmetic-04",
566
+ "options": {
567
+ "reasoning_effort": "xhigh"
568
+ },
569
+ "rendered_equal": true,
570
+ "tokens_equal": true,
571
+ "rendered_sha256": "c91b90926ba37c04a16a7e51163ed88366f6ad1f91eb7a4c40a8213b986f6f2d",
572
+ "token_ids_sha256": "e1706e27836de214be0261eff95fe8145f2945effdc517a7e9115ded3148a67a"
573
+ },
574
+ {
575
+ "case": "arithmetic-05",
576
+ "options": {},
577
+ "rendered_equal": true,
578
+ "tokens_equal": true,
579
+ "rendered_sha256": "ff43ba2decea43f8543fdd36dd6c5c536c8bb97a54e5890131890fbf0c66c869",
580
+ "token_ids_sha256": "c93f056f94513cd2779bf1ce8f298d406ef3b027cb9f3a7db4a09dd7592ba85b"
581
+ },
582
+ {
583
+ "case": "arithmetic-05",
584
+ "options": {
585
+ "enable_thinking": false
586
+ },
587
+ "rendered_equal": true,
588
+ "tokens_equal": true,
589
+ "rendered_sha256": "3c2c2497661577a7357fa67b079db6b11ff395265a222b0a32b9d1b8bef02b6c",
590
+ "token_ids_sha256": "82acbe5edfb07831dc3d554b178ded8e7bf7f53ff8e743c4a1907b4447f6894f"
591
+ },
592
+ {
593
+ "case": "arithmetic-05",
594
+ "options": {
595
+ "reasoning_effort": "low"
596
+ },
597
+ "rendered_equal": true,
598
+ "tokens_equal": true,
599
+ "rendered_sha256": "81a352decd47f903266075bf8d7d21980e0d39b7f19befdc4ef2565d9ab27760",
600
+ "token_ids_sha256": "3abdcb06a624fcc9f3dc6593e04e92ada7b0666f675fac2a07fabddeebc2d7b4"
601
+ },
602
+ {
603
+ "case": "arithmetic-05",
604
+ "options": {
605
+ "reasoning_effort": "medium"
606
+ },
607
+ "rendered_equal": true,
608
+ "tokens_equal": true,
609
+ "rendered_sha256": "0a9271c8cb020e0a54ed4cc1c04eb582c81d4cafa9eae887b06fcc44d4b44653",
610
+ "token_ids_sha256": "37341803c1c617340a309634f0e56d48636b27377a3b4c254086439a753500a6"
611
+ },
612
+ {
613
+ "case": "arithmetic-05",
614
+ "options": {
615
+ "reasoning_effort": "xhigh"
616
+ },
617
+ "rendered_equal": true,
618
+ "tokens_equal": true,
619
+ "rendered_sha256": "ff43ba2decea43f8543fdd36dd6c5c536c8bb97a54e5890131890fbf0c66c869",
620
+ "token_ids_sha256": "c93f056f94513cd2779bf1ce8f298d406ef3b027cb9f3a7db4a09dd7592ba85b"
621
+ },
622
+ {
623
+ "case": "arithmetic-06",
624
+ "options": {},
625
+ "rendered_equal": true,
626
+ "tokens_equal": true,
627
+ "rendered_sha256": "d9d7029346d3fc3e6f37173c76ec3db19e8668a82698b1345e71b56ec802ce28",
628
+ "token_ids_sha256": "3b45ede402669923581a4b9464a66bded91059bf64aa29c0006bdd81990e01f8"
629
+ },
630
+ {
631
+ "case": "arithmetic-06",
632
+ "options": {
633
+ "enable_thinking": false
634
+ },
635
+ "rendered_equal": true,
636
+ "tokens_equal": true,
637
+ "rendered_sha256": "fe48fab3c6ca13c7db6caa901b0961f231160d5ebac912fe33187ac662b0d3cb",
638
+ "token_ids_sha256": "8f92b0168bc1370747e0e92234e3e472b1d84ee4ac7936c9c58faae6e9f48e50"
639
+ },
640
+ {
641
+ "case": "arithmetic-06",
642
+ "options": {
643
+ "reasoning_effort": "low"
644
+ },
645
+ "rendered_equal": true,
646
+ "tokens_equal": true,
647
+ "rendered_sha256": "5d8e4b8ae6957fa3c0fd3c6243db43414cd8117cb3498cb40d077c1283bfeaaf",
648
+ "token_ids_sha256": "bd4d6941e778d63fe01e72f236a70078db1d5438d9d6b0dea085cf5a2d78b7ca"
649
+ },
650
+ {
651
+ "case": "arithmetic-06",
652
+ "options": {
653
+ "reasoning_effort": "medium"
654
+ },
655
+ "rendered_equal": true,
656
+ "tokens_equal": true,
657
+ "rendered_sha256": "50e45800a302d26ba7ae81e3301201636685303bd7161f4713d8620fc847d504",
658
+ "token_ids_sha256": "a3798779d6db6bb5aeeaa5faa0060644926b9e489488ae7e9318c23351717b50"
659
+ },
660
+ {
661
+ "case": "arithmetic-06",
662
+ "options": {
663
+ "reasoning_effort": "xhigh"
664
+ },
665
+ "rendered_equal": true,
666
+ "tokens_equal": true,
667
+ "rendered_sha256": "d9d7029346d3fc3e6f37173c76ec3db19e8668a82698b1345e71b56ec802ce28",
668
+ "token_ids_sha256": "3b45ede402669923581a4b9464a66bded91059bf64aa29c0006bdd81990e01f8"
669
+ },
670
+ {
671
+ "case": "arithmetic-07",
672
+ "options": {},
673
+ "rendered_equal": true,
674
+ "tokens_equal": true,
675
+ "rendered_sha256": "d4abab4ea9a54502aacc0cc037e6a3d2392eb4f00620de2842db7fcabbb5c6ff",
676
+ "token_ids_sha256": "d4555520da558d82c23f683d6d8bfc85b3662713180da8e247f4db6c6b9a94c1"
677
+ },
678
+ {
679
+ "case": "arithmetic-07",
680
+ "options": {
681
+ "enable_thinking": false
682
+ },
683
+ "rendered_equal": true,
684
+ "tokens_equal": true,
685
+ "rendered_sha256": "4634f6ef7ab3216baa6ae0839b583c8c493bddf057c97228292e1c6493febbe4",
686
+ "token_ids_sha256": "b20040ab0deeea513aeee03ff9e7eadc1af6dfb0c53cc32100297911de879bc7"
687
+ },
688
+ {
689
+ "case": "arithmetic-07",
690
+ "options": {
691
+ "reasoning_effort": "low"
692
+ },
693
+ "rendered_equal": true,
694
+ "tokens_equal": true,
695
+ "rendered_sha256": "9da13b3584b88529d3d4d3afdf40f9dedc2e3259a3575ff617c6fb3eb0279cca",
696
+ "token_ids_sha256": "666ba3da90ecdd0822ff3f0bd76faf857abd0464d497dde69be343644b84f6c9"
697
+ },
698
+ {
699
+ "case": "arithmetic-07",
700
+ "options": {
701
+ "reasoning_effort": "medium"
702
+ },
703
+ "rendered_equal": true,
704
+ "tokens_equal": true,
705
+ "rendered_sha256": "4e3d704c3f85473c586455d9a99d16f244bb2dd8337b78319296b0a36ebe479f",
706
+ "token_ids_sha256": "09095dae80f1f9451b2a58c2aaba62d236e5c6edae31f9d592eea9f3a177f2a1"
707
+ },
708
+ {
709
+ "case": "arithmetic-07",
710
+ "options": {
711
+ "reasoning_effort": "xhigh"
712
+ },
713
+ "rendered_equal": true,
714
+ "tokens_equal": true,
715
+ "rendered_sha256": "d4abab4ea9a54502aacc0cc037e6a3d2392eb4f00620de2842db7fcabbb5c6ff",
716
+ "token_ids_sha256": "d4555520da558d82c23f683d6d8bfc85b3662713180da8e247f4db6c6b9a94c1"
717
+ },
718
+ {
719
+ "case": "arithmetic-08",
720
+ "options": {},
721
+ "rendered_equal": true,
722
+ "tokens_equal": true,
723
+ "rendered_sha256": "f7d3036cc3bc0141cca89e9879ad1a822638eafdd067d0502bf748d895fdbe71",
724
+ "token_ids_sha256": "e980911b51a3c2dc5739a7c33f3f003e083ebbfabf6f60e75791c7825f1e2a95"
725
+ },
726
+ {
727
+ "case": "arithmetic-08",
728
+ "options": {
729
+ "enable_thinking": false
730
+ },
731
+ "rendered_equal": true,
732
+ "tokens_equal": true,
733
+ "rendered_sha256": "84ee45d869045b2f96a220c89040a27c4340529b2f10ba5a362125d9b99255ca",
734
+ "token_ids_sha256": "629913233bfa1e8693053fb398886818deb1c269b49a30ff12d752326dfea49f"
735
+ },
736
+ {
737
+ "case": "arithmetic-08",
738
+ "options": {
739
+ "reasoning_effort": "low"
740
+ },
741
+ "rendered_equal": true,
742
+ "tokens_equal": true,
743
+ "rendered_sha256": "10b71fafeee6fb4c5250eaca77c8d848e0377898e8c4e31e3610fcb31a4bbf95",
744
+ "token_ids_sha256": "c776b00461042b3c38e18d8dff79d402a4ecced8c64c67d622058041ef04cbc6"
745
+ },
746
+ {
747
+ "case": "arithmetic-08",
748
+ "options": {
749
+ "reasoning_effort": "medium"
750
+ },
751
+ "rendered_equal": true,
752
+ "tokens_equal": true,
753
+ "rendered_sha256": "537f1753a07185b06875abe3a1ebb3ea40cd514794ce71f4a6a083f2e0d11fb3",
754
+ "token_ids_sha256": "a5f82822b6d6af6c83758f5e173128bca3c3d50d290cacb42309156672ab606c"
755
+ },
756
+ {
757
+ "case": "arithmetic-08",
758
+ "options": {
759
+ "reasoning_effort": "xhigh"
760
+ },
761
+ "rendered_equal": true,
762
+ "tokens_equal": true,
763
+ "rendered_sha256": "f7d3036cc3bc0141cca89e9879ad1a822638eafdd067d0502bf748d895fdbe71",
764
+ "token_ids_sha256": "e980911b51a3c2dc5739a7c33f3f003e083ebbfabf6f60e75791c7825f1e2a95"
765
+ },
766
+ {
767
+ "case": "arithmetic-09",
768
+ "options": {},
769
+ "rendered_equal": true,
770
+ "tokens_equal": true,
771
+ "rendered_sha256": "bc7d34da11dd014cb41eac5b8ed8758a7a88dcafccb274866a6812b62fef30ec",
772
+ "token_ids_sha256": "62c6cfebfddf285cd89ff58d1833e6e535fb72484b68251bb0d92fe37aa593e3"
773
+ },
774
+ {
775
+ "case": "arithmetic-09",
776
+ "options": {
777
+ "enable_thinking": false
778
+ },
779
+ "rendered_equal": true,
780
+ "tokens_equal": true,
781
+ "rendered_sha256": "0bf19f315da38c20699e3eaebf5f02d9ed76193aa99eaf0bc9167dc210416d12",
782
+ "token_ids_sha256": "0bf26e146c4373d1613d6c9ec028b465601dd2173c8c874cd48e405c35abe5e9"
783
+ },
784
+ {
785
+ "case": "arithmetic-09",
786
+ "options": {
787
+ "reasoning_effort": "low"
788
+ },
789
+ "rendered_equal": true,
790
+ "tokens_equal": true,
791
+ "rendered_sha256": "2a4aed936eaa1a57af5f4e11d45f1c93becbceed7bebf4349e2f5c21965cb183",
792
+ "token_ids_sha256": "cc54e72fe17312e9865a641818fdfc7e78ebe03daf8c53c2096f650d5cda29ad"
793
+ },
794
+ {
795
+ "case": "arithmetic-09",
796
+ "options": {
797
+ "reasoning_effort": "medium"
798
+ },
799
+ "rendered_equal": true,
800
+ "tokens_equal": true,
801
+ "rendered_sha256": "439ed4db5d4c179b66f0d507be08cd06fff0c5017d15f945c53127da81cab47f",
802
+ "token_ids_sha256": "40c23ec4db2ea5e8b6ed8a8591cdd74339f986c05f5474bcd4f928c8ba95fc74"
803
+ },
804
+ {
805
+ "case": "arithmetic-09",
806
+ "options": {
807
+ "reasoning_effort": "xhigh"
808
+ },
809
+ "rendered_equal": true,
810
+ "tokens_equal": true,
811
+ "rendered_sha256": "bc7d34da11dd014cb41eac5b8ed8758a7a88dcafccb274866a6812b62fef30ec",
812
+ "token_ids_sha256": "62c6cfebfddf285cd89ff58d1833e6e535fb72484b68251bb0d92fe37aa593e3"
813
+ },
814
+ {
815
+ "case": "arithmetic-10",
816
+ "options": {},
817
+ "rendered_equal": true,
818
+ "tokens_equal": true,
819
+ "rendered_sha256": "0b724f38e7bd9051ec7c968b1663b1b3635ec23c3b94c91e10aa9222fa7eadd9",
820
+ "token_ids_sha256": "31ef5951966d506a875595669d28381adb7f3eb8ca36e728f849aa0d8458b0cd"
821
+ },
822
+ {
823
+ "case": "arithmetic-10",
824
+ "options": {
825
+ "enable_thinking": false
826
+ },
827
+ "rendered_equal": true,
828
+ "tokens_equal": true,
829
+ "rendered_sha256": "6062a96149481c62ced98da104245bb90e591cb34292c12eadfc3d9fb67299a2",
830
+ "token_ids_sha256": "80b76dc69c7844e058fe435e5c28373408aaf2b9f5dc24f6aafc735cf75b4b61"
831
+ },
832
+ {
833
+ "case": "arithmetic-10",
834
+ "options": {
835
+ "reasoning_effort": "low"
836
+ },
837
+ "rendered_equal": true,
838
+ "tokens_equal": true,
839
+ "rendered_sha256": "884f8cf268a54b70f40569b1a039037963471f5ece48c681f117920ccae1fdea",
840
+ "token_ids_sha256": "b6fabf136f2e5a33c007f475cbd3b7f87bdce0cc1da9196ea00b679d62ce151c"
841
+ },
842
+ {
843
+ "case": "arithmetic-10",
844
+ "options": {
845
+ "reasoning_effort": "medium"
846
+ },
847
+ "rendered_equal": true,
848
+ "tokens_equal": true,
849
+ "rendered_sha256": "0dc637f9d7ed2ed1fca6922a413f5c47ebf3ab6579aa31b4ce3bff07af300ab9",
850
+ "token_ids_sha256": "4363a2a13106c422c12752f4b87b3581eef342b6a2340ada93f635851c45f37d"
851
+ },
852
+ {
853
+ "case": "arithmetic-10",
854
+ "options": {
855
+ "reasoning_effort": "xhigh"
856
+ },
857
+ "rendered_equal": true,
858
+ "tokens_equal": true,
859
+ "rendered_sha256": "0b724f38e7bd9051ec7c968b1663b1b3635ec23c3b94c91e10aa9222fa7eadd9",
860
+ "token_ids_sha256": "31ef5951966d506a875595669d28381adb7f3eb8ca36e728f849aa0d8458b0cd"
861
+ },
862
+ {
863
+ "case": "json-01",
864
+ "options": {},
865
+ "rendered_equal": true,
866
+ "tokens_equal": true,
867
+ "rendered_sha256": "4de0442df7ac09fc61d43b9ffa738f4f2d3573f71ac77dcec22aba786bc0342e",
868
+ "token_ids_sha256": "e4b144f0c08aa87b573f59f54bf96d10641d30ddfb373ad355bb3938075682c0"
869
+ },
870
+ {
871
+ "case": "json-01",
872
+ "options": {
873
+ "enable_thinking": false
874
+ },
875
+ "rendered_equal": true,
876
+ "tokens_equal": true,
877
+ "rendered_sha256": "5f50a83fafc47f078151ce396bbc1ba2fb64795e38165ab27adb8513a9aae264",
878
+ "token_ids_sha256": "bbbfd4ba0e5b27f3914e50c9be5a2bbf8c7cbedc83bd8ee3ffccf36090b042e6"
879
+ },
880
+ {
881
+ "case": "json-01",
882
+ "options": {
883
+ "reasoning_effort": "low"
884
+ },
885
+ "rendered_equal": true,
886
+ "tokens_equal": true,
887
+ "rendered_sha256": "31a143c5a416e7f3a93ba3739fd66634ca3a728482405636c7048ec40161619d",
888
+ "token_ids_sha256": "13a83c0266c974090ef5736aa8cade8685638d64637e2787534440dab7152c6e"
889
+ },
890
+ {
891
+ "case": "json-01",
892
+ "options": {
893
+ "reasoning_effort": "medium"
894
+ },
895
+ "rendered_equal": true,
896
+ "tokens_equal": true,
897
+ "rendered_sha256": "9dcf381dbeb544ab3054db3afdc5ff7d33833027519c5c03d98d59de2d76b9c8",
898
+ "token_ids_sha256": "7debf297e3e6f800a92cccece7deecb3f1edcdd30c80ca6beaf3194c66c267da"
899
+ },
900
+ {
901
+ "case": "json-01",
902
+ "options": {
903
+ "reasoning_effort": "xhigh"
904
+ },
905
+ "rendered_equal": true,
906
+ "tokens_equal": true,
907
+ "rendered_sha256": "4de0442df7ac09fc61d43b9ffa738f4f2d3573f71ac77dcec22aba786bc0342e",
908
+ "token_ids_sha256": "e4b144f0c08aa87b573f59f54bf96d10641d30ddfb373ad355bb3938075682c0"
909
+ },
910
+ {
911
+ "case": "json-02",
912
+ "options": {},
913
+ "rendered_equal": true,
914
+ "tokens_equal": true,
915
+ "rendered_sha256": "f52a34ad0f6b545d6d81c4ccd7ec54604a733c172a8f4f13e51fa28ef276d803",
916
+ "token_ids_sha256": "1eb009c158c67adfb279a1d55cfc67b2559b54a9ee95b6771952fde76795ad6b"
917
+ },
918
+ {
919
+ "case": "json-02",
920
+ "options": {
921
+ "enable_thinking": false
922
+ },
923
+ "rendered_equal": true,
924
+ "tokens_equal": true,
925
+ "rendered_sha256": "1a2f1c8bb1b3286ab8a957f85f575a0d4d5a0f1bb971b742e69c4990fec9577f",
926
+ "token_ids_sha256": "09f7a63ef1188c209d80f1a7cc6ccf071e931b268cd115601c98ae083609b5b9"
927
+ },
928
+ {
929
+ "case": "json-02",
930
+ "options": {
931
+ "reasoning_effort": "low"
932
+ },
933
+ "rendered_equal": true,
934
+ "tokens_equal": true,
935
+ "rendered_sha256": "0fa5d71515f9c8233ad41e135dc72cf6cca670d4a56253727155ec1071ce271b",
936
+ "token_ids_sha256": "a630c470d9a5e52e1e429dd2b3c84cadbfbbf02803317d58008c99d1fe4c51e2"
937
+ },
938
+ {
939
+ "case": "json-02",
940
+ "options": {
941
+ "reasoning_effort": "medium"
942
+ },
943
+ "rendered_equal": true,
944
+ "tokens_equal": true,
945
+ "rendered_sha256": "ea329dcbf37dc55489fd11c37d464c2bc3ac63e0e9a81b8c56d3d875fcec3a74",
946
+ "token_ids_sha256": "e940fea90dfa2c71564f797a50cb8dad160f993fe006bc1a4b25b1f27f603a9c"
947
+ },
948
+ {
949
+ "case": "json-02",
950
+ "options": {
951
+ "reasoning_effort": "xhigh"
952
+ },
953
+ "rendered_equal": true,
954
+ "tokens_equal": true,
955
+ "rendered_sha256": "f52a34ad0f6b545d6d81c4ccd7ec54604a733c172a8f4f13e51fa28ef276d803",
956
+ "token_ids_sha256": "1eb009c158c67adfb279a1d55cfc67b2559b54a9ee95b6771952fde76795ad6b"
957
+ },
958
+ {
959
+ "case": "json-03",
960
+ "options": {},
961
+ "rendered_equal": true,
962
+ "tokens_equal": true,
963
+ "rendered_sha256": "8a3dbb38d2827e057168fb8a3d6a2de8e032ec6852a8e87c0b361543f8f6056f",
964
+ "token_ids_sha256": "b34856c2e771c03911bab8353efb901ca50653e99bb8fa22c52970ca9437387f"
965
+ },
966
+ {
967
+ "case": "json-03",
968
+ "options": {
969
+ "enable_thinking": false
970
+ },
971
+ "rendered_equal": true,
972
+ "tokens_equal": true,
973
+ "rendered_sha256": "37bd9133255a681630a15fbf5f902a6c60689d4b6cb7a7fe1631eac26bda9142",
974
+ "token_ids_sha256": "6ca400f3330a08f46318460cafd0f658af05cb80994f132a306a291dcc6e3aea"
975
+ },
976
+ {
977
+ "case": "json-03",
978
+ "options": {
979
+ "reasoning_effort": "low"
980
+ },
981
+ "rendered_equal": true,
982
+ "tokens_equal": true,
983
+ "rendered_sha256": "15eda6413cbfe554fd979fe671f9b29d3460190424f4fad532170efd3eed6fee",
984
+ "token_ids_sha256": "d8bb4ed4c951d432251f174077cf19e53716afd602d49e5fa3a561cd9c7e0324"
985
+ },
986
+ {
987
+ "case": "json-03",
988
+ "options": {
989
+ "reasoning_effort": "medium"
990
+ },
991
+ "rendered_equal": true,
992
+ "tokens_equal": true,
993
+ "rendered_sha256": "e13d3dcfb7025ae479066fa806518c2e558c8f3c154d0c907c6263e67349ca95",
994
+ "token_ids_sha256": "1e5cfb4792450de79b24f3850daec9b92b2aaeaf090e31c9c2d0ec65db03f1a1"
995
+ },
996
+ {
997
+ "case": "json-03",
998
+ "options": {
999
+ "reasoning_effort": "xhigh"
1000
+ },
1001
+ "rendered_equal": true,
1002
+ "tokens_equal": true,
1003
+ "rendered_sha256": "8a3dbb38d2827e057168fb8a3d6a2de8e032ec6852a8e87c0b361543f8f6056f",
1004
+ "token_ids_sha256": "b34856c2e771c03911bab8353efb901ca50653e99bb8fa22c52970ca9437387f"
1005
+ },
1006
+ {
1007
+ "case": "json-04",
1008
+ "options": {},
1009
+ "rendered_equal": true,
1010
+ "tokens_equal": true,
1011
+ "rendered_sha256": "1f303eab286c8e0b2dfd1e037488ced9ec2ad631c83baa367f2e7ce84c0d754b",
1012
+ "token_ids_sha256": "7ba01d3705a9a2fc2c44adebb589fe7c4cc55d32f4f34b4c171b0e004c68cfeb"
1013
+ },
1014
+ {
1015
+ "case": "json-04",
1016
+ "options": {
1017
+ "enable_thinking": false
1018
+ },
1019
+ "rendered_equal": true,
1020
+ "tokens_equal": true,
1021
+ "rendered_sha256": "8653dbe405bebf2ae11a4e03ce412656fe2c8edac19590eddd7683ff0a161a41",
1022
+ "token_ids_sha256": "12c6581c2d8aca475d83a32e06a2c4c13acaebe759c2559bb9d0b0072bd01eea"
1023
+ },
1024
+ {
1025
+ "case": "json-04",
1026
+ "options": {
1027
+ "reasoning_effort": "low"
1028
+ },
1029
+ "rendered_equal": true,
1030
+ "tokens_equal": true,
1031
+ "rendered_sha256": "390532466ee5550aeeab6067168146cfc47eaffb3423ff6758df6d6733a4d59a",
1032
+ "token_ids_sha256": "9ae37ad8259608f3968e7aecd6ae80cca934d185231a2b18ab6dfd0ff50dab36"
1033
+ },
1034
+ {
1035
+ "case": "json-04",
1036
+ "options": {
1037
+ "reasoning_effort": "medium"
1038
+ },
1039
+ "rendered_equal": true,
1040
+ "tokens_equal": true,
1041
+ "rendered_sha256": "33f30604fafeb5471321edce74a26ec52381f03eabfd6acfa4a79784124d9855",
1042
+ "token_ids_sha256": "9fb15ad820d73935b93d25cc15c9277639804a93d7fca097cfaa1704ff4862e0"
1043
+ },
1044
+ {
1045
+ "case": "json-04",
1046
+ "options": {
1047
+ "reasoning_effort": "xhigh"
1048
+ },
1049
+ "rendered_equal": true,
1050
+ "tokens_equal": true,
1051
+ "rendered_sha256": "1f303eab286c8e0b2dfd1e037488ced9ec2ad631c83baa367f2e7ce84c0d754b",
1052
+ "token_ids_sha256": "7ba01d3705a9a2fc2c44adebb589fe7c4cc55d32f4f34b4c171b0e004c68cfeb"
1053
+ },
1054
+ {
1055
+ "case": "json-05",
1056
+ "options": {},
1057
+ "rendered_equal": true,
1058
+ "tokens_equal": true,
1059
+ "rendered_sha256": "8ed29d2b59a460fa3e6dbee839a9635edbbaf50eea80b88bff5eacdc78e73fc1",
1060
+ "token_ids_sha256": "4139c153e92d79a41aea986199662c5f31289a0f8b774855c7c4f66dc6b8db17"
1061
+ },
1062
+ {
1063
+ "case": "json-05",
1064
+ "options": {
1065
+ "enable_thinking": false
1066
+ },
1067
+ "rendered_equal": true,
1068
+ "tokens_equal": true,
1069
+ "rendered_sha256": "a3818397f7583a07006ca0feefadf46f8f09f4f14123cb7e61e2eed7b3549b5e",
1070
+ "token_ids_sha256": "8184a5cc8b187c66285b51417a2655460c534ae8a98581f6abbeea0db3d9d7fc"
1071
+ },
1072
+ {
1073
+ "case": "json-05",
1074
+ "options": {
1075
+ "reasoning_effort": "low"
1076
+ },
1077
+ "rendered_equal": true,
1078
+ "tokens_equal": true,
1079
+ "rendered_sha256": "54972f2f1eef05bb9bb6905aac8573dc4e6074740cf6e74633295c307d00e256",
1080
+ "token_ids_sha256": "331548692bf3d1c450ffe65bafac49565037ecb0bc078b03b794d88e3a55395f"
1081
+ },
1082
+ {
1083
+ "case": "json-05",
1084
+ "options": {
1085
+ "reasoning_effort": "medium"
1086
+ },
1087
+ "rendered_equal": true,
1088
+ "tokens_equal": true,
1089
+ "rendered_sha256": "9cb233dad0e7c052b679c8abcbd1c37f806f8771ddef95a255739e1aadbbeb30",
1090
+ "token_ids_sha256": "d9a08463d3373938a3b098b85182894715e811c42f08dea12d3b3c699d65696d"
1091
+ },
1092
+ {
1093
+ "case": "json-05",
1094
+ "options": {
1095
+ "reasoning_effort": "xhigh"
1096
+ },
1097
+ "rendered_equal": true,
1098
+ "tokens_equal": true,
1099
+ "rendered_sha256": "8ed29d2b59a460fa3e6dbee839a9635edbbaf50eea80b88bff5eacdc78e73fc1",
1100
+ "token_ids_sha256": "4139c153e92d79a41aea986199662c5f31289a0f8b774855c7c4f66dc6b8db17"
1101
+ },
1102
+ {
1103
+ "case": "unicode-01",
1104
+ "options": {},
1105
+ "rendered_equal": true,
1106
+ "tokens_equal": true,
1107
+ "rendered_sha256": "873831a91e22b06c76fc5f676cf413eb134887725518f0915bb5e84d7f06b2b5",
1108
+ "token_ids_sha256": "f3baf0dc6982eaece8c4cdd4c4671b1ad756619ae32530bd08481c691a4986c8"
1109
+ },
1110
+ {
1111
+ "case": "unicode-01",
1112
+ "options": {
1113
+ "enable_thinking": false
1114
+ },
1115
+ "rendered_equal": true,
1116
+ "tokens_equal": true,
1117
+ "rendered_sha256": "e73da63a506d2412fe58c20add9e44337afcc80e82ea3f8149529b0a5be5c989",
1118
+ "token_ids_sha256": "b556477b09485ca4d3c36829cd8f61f1145fae0b1eb1efef0aeab02853ceae18"
1119
+ },
1120
+ {
1121
+ "case": "unicode-01",
1122
+ "options": {
1123
+ "reasoning_effort": "low"
1124
+ },
1125
+ "rendered_equal": true,
1126
+ "tokens_equal": true,
1127
+ "rendered_sha256": "749b9ab5744f103026bc7b97cb021f820aec8a708ef3117ed9ffb3c82dc727a6",
1128
+ "token_ids_sha256": "c04c84f9c01ef219732a2a5a12df123c7596e297e5c286aa0929648a7e3f4a71"
1129
+ },
1130
+ {
1131
+ "case": "unicode-01",
1132
+ "options": {
1133
+ "reasoning_effort": "medium"
1134
+ },
1135
+ "rendered_equal": true,
1136
+ "tokens_equal": true,
1137
+ "rendered_sha256": "7222991af7ce9ca6c332f1004b1447347009c19ad2c6e305872c9b885e58ee6e",
1138
+ "token_ids_sha256": "c4e35e4934451ebe9cdff2d460d661d4c2f4d2b10cfc3885a233d1aca0671af3"
1139
+ },
1140
+ {
1141
+ "case": "unicode-01",
1142
+ "options": {
1143
+ "reasoning_effort": "xhigh"
1144
+ },
1145
+ "rendered_equal": true,
1146
+ "tokens_equal": true,
1147
+ "rendered_sha256": "873831a91e22b06c76fc5f676cf413eb134887725518f0915bb5e84d7f06b2b5",
1148
+ "token_ids_sha256": "f3baf0dc6982eaece8c4cdd4c4671b1ad756619ae32530bd08481c691a4986c8"
1149
+ },
1150
+ {
1151
+ "case": "unicode-02",
1152
+ "options": {},
1153
+ "rendered_equal": true,
1154
+ "tokens_equal": true,
1155
+ "rendered_sha256": "7d29c826bee76e345dcad80d469e0c238f48af54819f1912de0f6038169538c7",
1156
+ "token_ids_sha256": "4a3f23fdbd290986351a2d30596196a47868493013f89a206e7a94d6ada39ad4"
1157
+ },
1158
+ {
1159
+ "case": "unicode-02",
1160
+ "options": {
1161
+ "enable_thinking": false
1162
+ },
1163
+ "rendered_equal": true,
1164
+ "tokens_equal": true,
1165
+ "rendered_sha256": "2941f77f6d53b2f4123fedbb77ecfc009e7da0970021af7cbdbf5ff5d5e27749",
1166
+ "token_ids_sha256": "08c986d3979914a9a4ccc7205f9acb2969db0063df8ed2eddf8850891b3b2ae8"
1167
+ },
1168
+ {
1169
+ "case": "unicode-02",
1170
+ "options": {
1171
+ "reasoning_effort": "low"
1172
+ },
1173
+ "rendered_equal": true,
1174
+ "tokens_equal": true,
1175
+ "rendered_sha256": "abf48e9b182940d04cd3ae1b89bbe6d2558044551682fc80660e82b6cf7270d8",
1176
+ "token_ids_sha256": "662cc9514c92de9469ecb2c47fedfcf0f1468d481445cbb5fa73950e6ca8310d"
1177
+ },
1178
+ {
1179
+ "case": "unicode-02",
1180
+ "options": {
1181
+ "reasoning_effort": "medium"
1182
+ },
1183
+ "rendered_equal": true,
1184
+ "tokens_equal": true,
1185
+ "rendered_sha256": "998ab000c7531bd04a91be93ebbae3b10bf0128784a4dcbfad895249f02de0dc",
1186
+ "token_ids_sha256": "306a80c5aeb1708c537527547590859a3adcfa5951fb9937ffd177b0349a5199"
1187
+ },
1188
+ {
1189
+ "case": "unicode-02",
1190
+ "options": {
1191
+ "reasoning_effort": "xhigh"
1192
+ },
1193
+ "rendered_equal": true,
1194
+ "tokens_equal": true,
1195
+ "rendered_sha256": "7d29c826bee76e345dcad80d469e0c238f48af54819f1912de0f6038169538c7",
1196
+ "token_ids_sha256": "4a3f23fdbd290986351a2d30596196a47868493013f89a206e7a94d6ada39ad4"
1197
+ },
1198
+ {
1199
+ "case": "unicode-03",
1200
+ "options": {},
1201
+ "rendered_equal": true,
1202
+ "tokens_equal": true,
1203
+ "rendered_sha256": "bf4b5f71c04f51824c51cc1426cfcd0c437171656133c7c369c23c357223b486",
1204
+ "token_ids_sha256": "e00642a1e34a12ef656d09970b2324751d6af2271b01c433d7d1b16e56740d9f"
1205
+ },
1206
+ {
1207
+ "case": "unicode-03",
1208
+ "options": {
1209
+ "enable_thinking": false
1210
+ },
1211
+ "rendered_equal": true,
1212
+ "tokens_equal": true,
1213
+ "rendered_sha256": "12fbc9a75e8f80f90e604940aec261dce857bd6a9a29b44155c780b7da72da34",
1214
+ "token_ids_sha256": "a2974c301f5ce702b9c5c3046d5f83c4c435d41bed622d4c48874b40a580861f"
1215
+ },
1216
+ {
1217
+ "case": "unicode-03",
1218
+ "options": {
1219
+ "reasoning_effort": "low"
1220
+ },
1221
+ "rendered_equal": true,
1222
+ "tokens_equal": true,
1223
+ "rendered_sha256": "6add51b230cd93bf48a49f4db9373b3ec1e551d2ec96a3b4dbea5a7d015b144f",
1224
+ "token_ids_sha256": "8416686c5324dacd87e006bae5782e6bbf64b80d63173dab546e2e9818d3f641"
1225
+ },
1226
+ {
1227
+ "case": "unicode-03",
1228
+ "options": {
1229
+ "reasoning_effort": "medium"
1230
+ },
1231
+ "rendered_equal": true,
1232
+ "tokens_equal": true,
1233
+ "rendered_sha256": "fb1f80d916cbd5dfb8280688956eadd738271c2bc2337b80815bb9fc51731c32",
1234
+ "token_ids_sha256": "b81d42ed82db2354b3340df6024f1231000a5325ccbb914db8358283a0532e62"
1235
+ },
1236
+ {
1237
+ "case": "unicode-03",
1238
+ "options": {
1239
+ "reasoning_effort": "xhigh"
1240
+ },
1241
+ "rendered_equal": true,
1242
+ "tokens_equal": true,
1243
+ "rendered_sha256": "bf4b5f71c04f51824c51cc1426cfcd0c437171656133c7c369c23c357223b486",
1244
+ "token_ids_sha256": "e00642a1e34a12ef656d09970b2324751d6af2271b01c433d7d1b16e56740d9f"
1245
+ },
1246
+ {
1247
+ "case": "unicode-04",
1248
+ "options": {},
1249
+ "rendered_equal": true,
1250
+ "tokens_equal": true,
1251
+ "rendered_sha256": "d7142c4d4ade7ba1b87072e8aacf73c17f08e255dea6eb1b06a621353211c5a1",
1252
+ "token_ids_sha256": "4ed5ff2c7b6a2f8ae5c264e871a1d758a316b2f28f5870331b4458bfe1d8caf0"
1253
+ },
1254
+ {
1255
+ "case": "unicode-04",
1256
+ "options": {
1257
+ "enable_thinking": false
1258
+ },
1259
+ "rendered_equal": true,
1260
+ "tokens_equal": true,
1261
+ "rendered_sha256": "cc557c74d6c9a5c41b9ec54c4924315e2976080858c08f18c03110223f8aead6",
1262
+ "token_ids_sha256": "f0309c2a3ee2ca5a83c54e5b1c23482a075686d5e997824788a572193bce952f"
1263
+ },
1264
+ {
1265
+ "case": "unicode-04",
1266
+ "options": {
1267
+ "reasoning_effort": "low"
1268
+ },
1269
+ "rendered_equal": true,
1270
+ "tokens_equal": true,
1271
+ "rendered_sha256": "0f4e07bf9c8129f5ecfe3c815adff8d78d3013cf8157d85f113f6035966762cb",
1272
+ "token_ids_sha256": "f0c31548432c48ba755043292d19a9dcc64e81677e3a0c4129b663d664df1fe8"
1273
+ },
1274
+ {
1275
+ "case": "unicode-04",
1276
+ "options": {
1277
+ "reasoning_effort": "medium"
1278
+ },
1279
+ "rendered_equal": true,
1280
+ "tokens_equal": true,
1281
+ "rendered_sha256": "515d47b9366bdbff3c4da92f763fcdd382487ae4dbc97c88dc4f677e600ffdd7",
1282
+ "token_ids_sha256": "14f6bce785b2517a53fc15d776f89d688fac43e4b11d434a63903fb451628e3d"
1283
+ },
1284
+ {
1285
+ "case": "unicode-04",
1286
+ "options": {
1287
+ "reasoning_effort": "xhigh"
1288
+ },
1289
+ "rendered_equal": true,
1290
+ "tokens_equal": true,
1291
+ "rendered_sha256": "d7142c4d4ade7ba1b87072e8aacf73c17f08e255dea6eb1b06a621353211c5a1",
1292
+ "token_ids_sha256": "4ed5ff2c7b6a2f8ae5c264e871a1d758a316b2f28f5870331b4458bfe1d8caf0"
1293
+ },
1294
+ {
1295
+ "case": "unicode-05",
1296
+ "options": {},
1297
+ "rendered_equal": true,
1298
+ "tokens_equal": true,
1299
+ "rendered_sha256": "c29c6cf2be9160e98648fa8dc071fece6ea6660cf69f08e1f7b0aa54fe316b7e",
1300
+ "token_ids_sha256": "25632625ac135dc1d449c78798e64ada84f0ae48804aafbc09914e8b026d3146"
1301
+ },
1302
+ {
1303
+ "case": "unicode-05",
1304
+ "options": {
1305
+ "enable_thinking": false
1306
+ },
1307
+ "rendered_equal": true,
1308
+ "tokens_equal": true,
1309
+ "rendered_sha256": "44b83f63cdda91288fca02c6155eea41a474b6cb2fcdad68ff9587cc055a2fab",
1310
+ "token_ids_sha256": "1fd9dc706e9b32b1af44b066e7abe40afa5f6636a645a3c9879f9dd0d6cccf6d"
1311
+ },
1312
+ {
1313
+ "case": "unicode-05",
1314
+ "options": {
1315
+ "reasoning_effort": "low"
1316
+ },
1317
+ "rendered_equal": true,
1318
+ "tokens_equal": true,
1319
+ "rendered_sha256": "54513566862c2e37446c1bf5d746b65b4c32e938f68764673ee100ab40c0f71d",
1320
+ "token_ids_sha256": "c7871f918bec46deeddf3630e2fe8a1b39970eb5b8efb50c135b2ea9801c82c3"
1321
+ },
1322
+ {
1323
+ "case": "unicode-05",
1324
+ "options": {
1325
+ "reasoning_effort": "medium"
1326
+ },
1327
+ "rendered_equal": true,
1328
+ "tokens_equal": true,
1329
+ "rendered_sha256": "0857bea7133e43b4ef19f718421ae2a03622f96d921ab05042503fd15895d2dc",
1330
+ "token_ids_sha256": "ebf3da501675389d42d06b41329a53a3f90650cc2ec38c8319c9ae9088ffc866"
1331
+ },
1332
+ {
1333
+ "case": "unicode-05",
1334
+ "options": {
1335
+ "reasoning_effort": "xhigh"
1336
+ },
1337
+ "rendered_equal": true,
1338
+ "tokens_equal": true,
1339
+ "rendered_sha256": "c29c6cf2be9160e98648fa8dc071fece6ea6660cf69f08e1f7b0aa54fe316b7e",
1340
+ "token_ids_sha256": "25632625ac135dc1d449c78798e64ada84f0ae48804aafbc09914e8b026d3146"
1341
+ },
1342
+ {
1343
+ "case": "roles-01",
1344
+ "options": {},
1345
+ "rendered_equal": true,
1346
+ "tokens_equal": true,
1347
+ "rendered_sha256": "69197243135d48e4810d294922e7cf658a4be3dee7774ef4c990645dda560c23",
1348
+ "token_ids_sha256": "678d6c1d5b98f94c37677b7eccaf46dd0cad48028bf1da9d26ca95b8bbb5c07c"
1349
+ },
1350
+ {
1351
+ "case": "roles-01",
1352
+ "options": {
1353
+ "enable_thinking": false
1354
+ },
1355
+ "rendered_equal": true,
1356
+ "tokens_equal": true,
1357
+ "rendered_sha256": "be4e59de4ee724c6ad88fa7bd5ba7e3b720d10007ddb784bf816c159a5177638",
1358
+ "token_ids_sha256": "dedb5f6a296d441e6ae9f0800da3ff20185aa7679704d810bee4f7e4cb688866"
1359
+ },
1360
+ {
1361
+ "case": "roles-01",
1362
+ "options": {
1363
+ "reasoning_effort": "low"
1364
+ },
1365
+ "rendered_equal": true,
1366
+ "tokens_equal": true,
1367
+ "rendered_sha256": "b18660722791b356c87ecaca8b311901c0c1c7998c333b9f1fb4a30e4db71cdb",
1368
+ "token_ids_sha256": "d814d754001623d861b248019f7b6217520c75b930e0e35bba3c17e58cb7d5fb"
1369
+ },
1370
+ {
1371
+ "case": "roles-01",
1372
+ "options": {
1373
+ "reasoning_effort": "medium"
1374
+ },
1375
+ "rendered_equal": true,
1376
+ "tokens_equal": true,
1377
+ "rendered_sha256": "eee7dec1e6469d438b5d21989ef21095f287efd1eae13b4734fb56cfb84f1959",
1378
+ "token_ids_sha256": "ceeb56c216d9df66e9942193cc03ad169bfa40959d8d381188443e2006f8ebda"
1379
+ },
1380
+ {
1381
+ "case": "roles-01",
1382
+ "options": {
1383
+ "reasoning_effort": "xhigh"
1384
+ },
1385
+ "rendered_equal": true,
1386
+ "tokens_equal": true,
1387
+ "rendered_sha256": "69197243135d48e4810d294922e7cf658a4be3dee7774ef4c990645dda560c23",
1388
+ "token_ids_sha256": "678d6c1d5b98f94c37677b7eccaf46dd0cad48028bf1da9d26ca95b8bbb5c07c"
1389
+ },
1390
+ {
1391
+ "case": "roles-02",
1392
+ "options": {},
1393
+ "rendered_equal": true,
1394
+ "tokens_equal": true,
1395
+ "rendered_sha256": "712d00c38b9e83916c4835a7fd39282d23ac9320c9f19bc16c16eb4a4f040011",
1396
+ "token_ids_sha256": "e2bf0f7a3aae6e78f914021f4402fea5d91d6c707ce5a4cbf620829cf3c0764e"
1397
+ },
1398
+ {
1399
+ "case": "roles-02",
1400
+ "options": {
1401
+ "enable_thinking": false
1402
+ },
1403
+ "rendered_equal": true,
1404
+ "tokens_equal": true,
1405
+ "rendered_sha256": "7fa28a820c16c0cdb7bd520ce67584863bc2621963b5ca86b0ff9b31bb4e595c",
1406
+ "token_ids_sha256": "2cd4c83c774cd9f5d4cd6cb831fc524e56177ada3fe18441cb5dc90c9ed40a91"
1407
+ },
1408
+ {
1409
+ "case": "roles-02",
1410
+ "options": {
1411
+ "reasoning_effort": "low"
1412
+ },
1413
+ "rendered_equal": true,
1414
+ "tokens_equal": true,
1415
+ "rendered_sha256": "13e1946a670a1e3fb4f611341760b334e9a0e451ae65eccf52b2a6d03e4fbe61",
1416
+ "token_ids_sha256": "6ee01320aa8b8230d8d9fce35bdf2cf5379524e389f2fcaef27b4a8c1d8360bd"
1417
+ },
1418
+ {
1419
+ "case": "roles-02",
1420
+ "options": {
1421
+ "reasoning_effort": "medium"
1422
+ },
1423
+ "rendered_equal": true,
1424
+ "tokens_equal": true,
1425
+ "rendered_sha256": "040d17c8416b169af8829d4ac474fb2f59b4df2c3a1e05b97798f97b702f5d85",
1426
+ "token_ids_sha256": "bfad556e9b5da0ccd563f009ee1b2b332165bf7e740db9118d0b3293d34227b9"
1427
+ },
1428
+ {
1429
+ "case": "roles-02",
1430
+ "options": {
1431
+ "reasoning_effort": "xhigh"
1432
+ },
1433
+ "rendered_equal": true,
1434
+ "tokens_equal": true,
1435
+ "rendered_sha256": "712d00c38b9e83916c4835a7fd39282d23ac9320c9f19bc16c16eb4a4f040011",
1436
+ "token_ids_sha256": "e2bf0f7a3aae6e78f914021f4402fea5d91d6c707ce5a4cbf620829cf3c0764e"
1437
+ },
1438
+ {
1439
+ "case": "roles-03",
1440
+ "options": {},
1441
+ "rendered_equal": true,
1442
+ "tokens_equal": true,
1443
+ "rendered_sha256": "3b85188652babd19a119f9bb6970d704077a93af91a2b0d16f24a787188a4068",
1444
+ "token_ids_sha256": "d94af0af1c092b4782cba4ad4b25b38414db15ee002a375a2fd0c75ba6d05dd8"
1445
+ },
1446
+ {
1447
+ "case": "roles-03",
1448
+ "options": {
1449
+ "enable_thinking": false
1450
+ },
1451
+ "rendered_equal": true,
1452
+ "tokens_equal": true,
1453
+ "rendered_sha256": "ce4853f4464de61b59ff75e37680c4dd1ae59aedddebcbea809f3a2c4f1affca",
1454
+ "token_ids_sha256": "12248951e0fdecd25101bc14b252df89f96b821450e55e896c8f6e12615206a8"
1455
+ },
1456
+ {
1457
+ "case": "roles-03",
1458
+ "options": {
1459
+ "reasoning_effort": "low"
1460
+ },
1461
+ "rendered_equal": true,
1462
+ "tokens_equal": true,
1463
+ "rendered_sha256": "dfb78b9b5145697a1185231bc1af8f91785880221c5da5154fb7f91459ebd927",
1464
+ "token_ids_sha256": "a61aacd7a56e3427d13f7c06794de7b3903885140d063a8a9373ed2d21507c3f"
1465
+ },
1466
+ {
1467
+ "case": "roles-03",
1468
+ "options": {
1469
+ "reasoning_effort": "medium"
1470
+ },
1471
+ "rendered_equal": true,
1472
+ "tokens_equal": true,
1473
+ "rendered_sha256": "d9381db20bf9a23be308fc95f4ff07b7af74b610c2c2c3daeb886c545bc647fc",
1474
+ "token_ids_sha256": "42408fa09b988dd65ee60fe0f098d82323f1a9a3c60e2067263549573d9e8a8a"
1475
+ },
1476
+ {
1477
+ "case": "roles-03",
1478
+ "options": {
1479
+ "reasoning_effort": "xhigh"
1480
+ },
1481
+ "rendered_equal": true,
1482
+ "tokens_equal": true,
1483
+ "rendered_sha256": "3b85188652babd19a119f9bb6970d704077a93af91a2b0d16f24a787188a4068",
1484
+ "token_ids_sha256": "d94af0af1c092b4782cba4ad4b25b38414db15ee002a375a2fd0c75ba6d05dd8"
1485
+ },
1486
+ {
1487
+ "case": "roles-04",
1488
+ "options": {},
1489
+ "rendered_equal": true,
1490
+ "tokens_equal": true,
1491
+ "rendered_sha256": "9cebda0d117eae0f377f38014a909a8ff59a7c9813803ab4be09faae59f3edff",
1492
+ "token_ids_sha256": "00ab1f28e66ffa06478fa3d42dbe05c1b7b243e73cc1324147361bc2e71fcf27"
1493
+ },
1494
+ {
1495
+ "case": "roles-04",
1496
+ "options": {
1497
+ "enable_thinking": false
1498
+ },
1499
+ "rendered_equal": true,
1500
+ "tokens_equal": true,
1501
+ "rendered_sha256": "78fb14a7cf8badcc8b7c4b2dc1deb5f18d49d1c2e08f682b3508982f9274d5f1",
1502
+ "token_ids_sha256": "395aca8a9be097ba2cdd5e11bcf9fb67928fb9ec72fc39e9097414249f120f56"
1503
+ },
1504
+ {
1505
+ "case": "roles-04",
1506
+ "options": {
1507
+ "reasoning_effort": "low"
1508
+ },
1509
+ "rendered_equal": true,
1510
+ "tokens_equal": true,
1511
+ "rendered_sha256": "580a0ed251e3ae771fe6d9dc098cc46198d1512615318b3c360c0ad93c7f0b37",
1512
+ "token_ids_sha256": "d03a56676074998e963716039d4fbeee0404bff282283e3eba2bcdc534e48527"
1513
+ },
1514
+ {
1515
+ "case": "roles-04",
1516
+ "options": {
1517
+ "reasoning_effort": "medium"
1518
+ },
1519
+ "rendered_equal": true,
1520
+ "tokens_equal": true,
1521
+ "rendered_sha256": "43603f71f3d781afd5495449e11ddbcfb123e4bbfcb91d49127b8f3d38c1d525",
1522
+ "token_ids_sha256": "e0ef1daabe4baf72ddcaf1569e2896647a3170e7eeabb5bfcf56df297a19f300"
1523
+ },
1524
+ {
1525
+ "case": "roles-04",
1526
+ "options": {
1527
+ "reasoning_effort": "xhigh"
1528
+ },
1529
+ "rendered_equal": true,
1530
+ "tokens_equal": true,
1531
+ "rendered_sha256": "9cebda0d117eae0f377f38014a909a8ff59a7c9813803ab4be09faae59f3edff",
1532
+ "token_ids_sha256": "00ab1f28e66ffa06478fa3d42dbe05c1b7b243e73cc1324147361bc2e71fcf27"
1533
+ },
1534
+ {
1535
+ "case": "roles-05",
1536
+ "options": {},
1537
+ "rendered_equal": true,
1538
+ "tokens_equal": true,
1539
+ "rendered_sha256": "221adbad330129783e9a8df3a43fa0f498b8bcbfb3812c655de79639ec91790b",
1540
+ "token_ids_sha256": "d7a18d6d1252cb2703786b18e1d3eaa16a9648eea36b93a1ded2006f85a37091"
1541
+ },
1542
+ {
1543
+ "case": "roles-05",
1544
+ "options": {
1545
+ "enable_thinking": false
1546
+ },
1547
+ "rendered_equal": true,
1548
+ "tokens_equal": true,
1549
+ "rendered_sha256": "12516193a253ae877876f64b85f7e4b494e26eea096266af085340cb58053c64",
1550
+ "token_ids_sha256": "e2cccb2f8693bc68d97b17c93bd70a633deaa59bce1000d60277300e8bec630a"
1551
+ },
1552
+ {
1553
+ "case": "roles-05",
1554
+ "options": {
1555
+ "reasoning_effort": "low"
1556
+ },
1557
+ "rendered_equal": true,
1558
+ "tokens_equal": true,
1559
+ "rendered_sha256": "accba5632f386b18f07a489f2533b56bf288f4dacc67092747c164c02c8d1410",
1560
+ "token_ids_sha256": "320f0dae8da2a7da89b861a88cbdb0681c059aa2c32becbfd1ca61cd1d51118c"
1561
+ },
1562
+ {
1563
+ "case": "roles-05",
1564
+ "options": {
1565
+ "reasoning_effort": "medium"
1566
+ },
1567
+ "rendered_equal": true,
1568
+ "tokens_equal": true,
1569
+ "rendered_sha256": "cb560837a0396a76b67755d82e2f085f3579679fee20d2439cd3091e12c021f3",
1570
+ "token_ids_sha256": "ef56d5a979147ce65ac1fdd78283b8f25c0a80d8321e1d41b92c512712cd7506"
1571
+ },
1572
+ {
1573
+ "case": "roles-05",
1574
+ "options": {
1575
+ "reasoning_effort": "xhigh"
1576
+ },
1577
+ "rendered_equal": true,
1578
+ "tokens_equal": true,
1579
+ "rendered_sha256": "221adbad330129783e9a8df3a43fa0f498b8bcbfb3812c655de79639ec91790b",
1580
+ "token_ids_sha256": "d7a18d6d1252cb2703786b18e1d3eaa16a9648eea36b93a1ded2006f85a37091"
1581
+ },
1582
+ {
1583
+ "case": "coding-01",
1584
+ "options": {},
1585
+ "rendered_equal": true,
1586
+ "tokens_equal": true,
1587
+ "rendered_sha256": "051b7aa8df5fde373f9f96fca41c7d670d7b11fcd2ddb142a390bea76999b5f8",
1588
+ "token_ids_sha256": "b1ad5965c18fb4f6e2b2fa341dae0f025c989df9bf0e3283189e551a7b96da82"
1589
+ },
1590
+ {
1591
+ "case": "coding-01",
1592
+ "options": {
1593
+ "enable_thinking": false
1594
+ },
1595
+ "rendered_equal": true,
1596
+ "tokens_equal": true,
1597
+ "rendered_sha256": "c6fc7d3512acc9d7d7bd3c0788be368e86ddf7cee0036b70e86e293a10e89596",
1598
+ "token_ids_sha256": "d095663e2e962f0090c4e595ae1454d546a5528db6aeb791bc4c90ef35117d40"
1599
+ },
1600
+ {
1601
+ "case": "coding-01",
1602
+ "options": {
1603
+ "reasoning_effort": "low"
1604
+ },
1605
+ "rendered_equal": true,
1606
+ "tokens_equal": true,
1607
+ "rendered_sha256": "04300fbdce4d473786e1ad0f4fcc7e198d4bcdef5f266c1ad05fff21cd456200",
1608
+ "token_ids_sha256": "c62e1d77b8b548ea85c60177e753441b267e5935ce5a017139594a0cf104d456"
1609
+ },
1610
+ {
1611
+ "case": "coding-01",
1612
+ "options": {
1613
+ "reasoning_effort": "medium"
1614
+ },
1615
+ "rendered_equal": true,
1616
+ "tokens_equal": true,
1617
+ "rendered_sha256": "712e6076d40ff56ab6beb8b543193f01de8ff494109f916e79e351e9051c2bcd",
1618
+ "token_ids_sha256": "0722a8a5fb8124f7a028af8507b238963d8bc82429a6726fed54c4694a8cce04"
1619
+ },
1620
+ {
1621
+ "case": "coding-01",
1622
+ "options": {
1623
+ "reasoning_effort": "xhigh"
1624
+ },
1625
+ "rendered_equal": true,
1626
+ "tokens_equal": true,
1627
+ "rendered_sha256": "051b7aa8df5fde373f9f96fca41c7d670d7b11fcd2ddb142a390bea76999b5f8",
1628
+ "token_ids_sha256": "b1ad5965c18fb4f6e2b2fa341dae0f025c989df9bf0e3283189e551a7b96da82"
1629
+ },
1630
+ {
1631
+ "case": "coding-02",
1632
+ "options": {},
1633
+ "rendered_equal": true,
1634
+ "tokens_equal": true,
1635
+ "rendered_sha256": "411d173959d148e172d44867aef97f6367f1208c5086c1c656b8c61bdaa1ad97",
1636
+ "token_ids_sha256": "c21a74da2b8d69aa0a51e372ee4bb83480a380d34c8a5e5c8e9cbd437ffd456c"
1637
+ },
1638
+ {
1639
+ "case": "coding-02",
1640
+ "options": {
1641
+ "enable_thinking": false
1642
+ },
1643
+ "rendered_equal": true,
1644
+ "tokens_equal": true,
1645
+ "rendered_sha256": "580edec3aba6a11165ebf4fdf0740108cc3d7b0382cd1e4aeb46b4ba749cfc8a",
1646
+ "token_ids_sha256": "e6a92c6cf675c02b37b416cfb3e7dffa09e52a2260cbc79165a2073f6a09ec13"
1647
+ },
1648
+ {
1649
+ "case": "coding-02",
1650
+ "options": {
1651
+ "reasoning_effort": "low"
1652
+ },
1653
+ "rendered_equal": true,
1654
+ "tokens_equal": true,
1655
+ "rendered_sha256": "7e86786de23289534a245e624822a9e0de18e1e9fafdb381cd7a833d840b474b",
1656
+ "token_ids_sha256": "f69df4a17b6dac41f1b470bd58a9b05b5c396b5b763f0d658b26b5fd9ab2f2f9"
1657
+ },
1658
+ {
1659
+ "case": "coding-02",
1660
+ "options": {
1661
+ "reasoning_effort": "medium"
1662
+ },
1663
+ "rendered_equal": true,
1664
+ "tokens_equal": true,
1665
+ "rendered_sha256": "bbcc8f29071b25d8fb0b525aa9fcdbfa344f77559069b617a5883ceefac21dc9",
1666
+ "token_ids_sha256": "29a24edf2946e8334424a9eb1c654efbd861c71def8c72e9cbd43cd3f25e282e"
1667
+ },
1668
+ {
1669
+ "case": "coding-02",
1670
+ "options": {
1671
+ "reasoning_effort": "xhigh"
1672
+ },
1673
+ "rendered_equal": true,
1674
+ "tokens_equal": true,
1675
+ "rendered_sha256": "411d173959d148e172d44867aef97f6367f1208c5086c1c656b8c61bdaa1ad97",
1676
+ "token_ids_sha256": "c21a74da2b8d69aa0a51e372ee4bb83480a380d34c8a5e5c8e9cbd437ffd456c"
1677
+ },
1678
+ {
1679
+ "case": "coding-03",
1680
+ "options": {},
1681
+ "rendered_equal": true,
1682
+ "tokens_equal": true,
1683
+ "rendered_sha256": "c8b31bcbabdc40e027ff96975825c9e8e1c707b34ad353efa4349d1eeb105e43",
1684
+ "token_ids_sha256": "a0c8029475104f3da2c240b437c2611571e30faa137278d9dbb144ae8a69d719"
1685
+ },
1686
+ {
1687
+ "case": "coding-03",
1688
+ "options": {
1689
+ "enable_thinking": false
1690
+ },
1691
+ "rendered_equal": true,
1692
+ "tokens_equal": true,
1693
+ "rendered_sha256": "6a2ced8824a9a8b8f5198c6a05c27504fa89fc64fbec2ecb6ad7dc60945c3f01",
1694
+ "token_ids_sha256": "40e5461c319001a2e97fb9bbafd7cb867634caaecdc07b65c941415002402daf"
1695
+ },
1696
+ {
1697
+ "case": "coding-03",
1698
+ "options": {
1699
+ "reasoning_effort": "low"
1700
+ },
1701
+ "rendered_equal": true,
1702
+ "tokens_equal": true,
1703
+ "rendered_sha256": "3830b62bb1d8d8bb3ae2632340987db3c294e516bb169422217377831e816b4a",
1704
+ "token_ids_sha256": "de27378bdd6efb851642482fa6dfe3f11d39c52265218c6fec331890b0945b55"
1705
+ },
1706
+ {
1707
+ "case": "coding-03",
1708
+ "options": {
1709
+ "reasoning_effort": "medium"
1710
+ },
1711
+ "rendered_equal": true,
1712
+ "tokens_equal": true,
1713
+ "rendered_sha256": "dff5aa85158115d29350b91444084fac347e49f1f8286ecd3ffa1875e66a7594",
1714
+ "token_ids_sha256": "3349f46bfc31fc3682bfc4c96ddaaa3738c886eb37c61e7464f5887f74a2efc1"
1715
+ },
1716
+ {
1717
+ "case": "coding-03",
1718
+ "options": {
1719
+ "reasoning_effort": "xhigh"
1720
+ },
1721
+ "rendered_equal": true,
1722
+ "tokens_equal": true,
1723
+ "rendered_sha256": "c8b31bcbabdc40e027ff96975825c9e8e1c707b34ad353efa4349d1eeb105e43",
1724
+ "token_ids_sha256": "a0c8029475104f3da2c240b437c2611571e30faa137278d9dbb144ae8a69d719"
1725
+ },
1726
+ {
1727
+ "case": "coding-04",
1728
+ "options": {},
1729
+ "rendered_equal": true,
1730
+ "tokens_equal": true,
1731
+ "rendered_sha256": "525527a25652337c7b127cc17ef22ff8ab41b8624bc5231067ae32d9f7a83f39",
1732
+ "token_ids_sha256": "fc9272e512c52fb5862355801f76a9f0e1fa8612c04397f30b63b85bc0edd39d"
1733
+ },
1734
+ {
1735
+ "case": "coding-04",
1736
+ "options": {
1737
+ "enable_thinking": false
1738
+ },
1739
+ "rendered_equal": true,
1740
+ "tokens_equal": true,
1741
+ "rendered_sha256": "072168df13573a942e2940693badc6bafa7f11669572d6fc2f229001b4469653",
1742
+ "token_ids_sha256": "a66ea75e01bfc1615c9f537012258e3f087b634feb08fa4ffd8d8ba340e0f305"
1743
+ },
1744
+ {
1745
+ "case": "coding-04",
1746
+ "options": {
1747
+ "reasoning_effort": "low"
1748
+ },
1749
+ "rendered_equal": true,
1750
+ "tokens_equal": true,
1751
+ "rendered_sha256": "208f77c8f98b9ee4f04a355793762383877e67d6aaa289b2dfcf1bd75fbddebd",
1752
+ "token_ids_sha256": "40c119c2ad05ffe426d8e69e5b341ca118babdcf8b7818b236d0d352d1d58741"
1753
+ },
1754
+ {
1755
+ "case": "coding-04",
1756
+ "options": {
1757
+ "reasoning_effort": "medium"
1758
+ },
1759
+ "rendered_equal": true,
1760
+ "tokens_equal": true,
1761
+ "rendered_sha256": "6e7390f1ec457eda8db0918223dc25c095c8f4172ea6b09b831437185f02c427",
1762
+ "token_ids_sha256": "0499243975895f7c92a2d18281d1f17e2c36c5846b221d289fe34306c39df9e2"
1763
+ },
1764
+ {
1765
+ "case": "coding-04",
1766
+ "options": {
1767
+ "reasoning_effort": "xhigh"
1768
+ },
1769
+ "rendered_equal": true,
1770
+ "tokens_equal": true,
1771
+ "rendered_sha256": "525527a25652337c7b127cc17ef22ff8ab41b8624bc5231067ae32d9f7a83f39",
1772
+ "token_ids_sha256": "fc9272e512c52fb5862355801f76a9f0e1fa8612c04397f30b63b85bc0edd39d"
1773
+ },
1774
+ {
1775
+ "case": "coding-05",
1776
+ "options": {},
1777
+ "rendered_equal": true,
1778
+ "tokens_equal": true,
1779
+ "rendered_sha256": "9f2ad75fb0b84ce9efd65a3efb8010b701fcf92941cde2ba6a6ef20940bc8ccf",
1780
+ "token_ids_sha256": "4bd80bdd05badf800ad6c69d84e685cb702dd393a4409cffded2e4579467560b"
1781
+ },
1782
+ {
1783
+ "case": "coding-05",
1784
+ "options": {
1785
+ "enable_thinking": false
1786
+ },
1787
+ "rendered_equal": true,
1788
+ "tokens_equal": true,
1789
+ "rendered_sha256": "cd8d48627da73de9ab073e5d0622f81210cac59854b54da2bf2aae54bf55370b",
1790
+ "token_ids_sha256": "eaae104ce5b9c9eb5a26f34ce473f160fd29f32830097ac8d142f51f2e5827cf"
1791
+ },
1792
+ {
1793
+ "case": "coding-05",
1794
+ "options": {
1795
+ "reasoning_effort": "low"
1796
+ },
1797
+ "rendered_equal": true,
1798
+ "tokens_equal": true,
1799
+ "rendered_sha256": "4e769996021bd0ea7f66d57b712c999869e42e96463efa83e93369b6b60fc86e",
1800
+ "token_ids_sha256": "a7586d4d012fb8954d08416f41f08b3cf130aa756497f3f20cebbb7ace39f2b1"
1801
+ },
1802
+ {
1803
+ "case": "coding-05",
1804
+ "options": {
1805
+ "reasoning_effort": "medium"
1806
+ },
1807
+ "rendered_equal": true,
1808
+ "tokens_equal": true,
1809
+ "rendered_sha256": "50912990af564be675422742d3f8d089638d94c8816fec6c89cbe50e289247a8",
1810
+ "token_ids_sha256": "33732ad475a97239de800bf23cff2107361231851a056386d34492ad51bdcbcd"
1811
+ },
1812
+ {
1813
+ "case": "coding-05",
1814
+ "options": {
1815
+ "reasoning_effort": "xhigh"
1816
+ },
1817
+ "rendered_equal": true,
1818
+ "tokens_equal": true,
1819
+ "rendered_sha256": "9f2ad75fb0b84ce9efd65a3efb8010b701fcf92941cde2ba6a6ef20940bc8ccf",
1820
+ "token_ids_sha256": "4bd80bdd05badf800ad6c69d84e685cb702dd393a4409cffded2e4579467560b"
1821
+ },
1822
+ {
1823
+ "case": "coding-06",
1824
+ "options": {},
1825
+ "rendered_equal": true,
1826
+ "tokens_equal": true,
1827
+ "rendered_sha256": "82b4aa32308ea9227904a64f15d1e6d04c19de98e6ac96c29e48c9b128ec06fd",
1828
+ "token_ids_sha256": "267b2aa4000603afed98cede64f743b1d7595e2b821e8a3fcd3ff4e508ddaedd"
1829
+ },
1830
+ {
1831
+ "case": "coding-06",
1832
+ "options": {
1833
+ "enable_thinking": false
1834
+ },
1835
+ "rendered_equal": true,
1836
+ "tokens_equal": true,
1837
+ "rendered_sha256": "81fcfdfd7d5fcb963098331741f221d85160d3282b0ec492a8b12e3bd21a574d",
1838
+ "token_ids_sha256": "bfe93c4c4646449437207262ad6b630c0f47d7099de75dc72f39834928f9ea12"
1839
+ },
1840
+ {
1841
+ "case": "coding-06",
1842
+ "options": {
1843
+ "reasoning_effort": "low"
1844
+ },
1845
+ "rendered_equal": true,
1846
+ "tokens_equal": true,
1847
+ "rendered_sha256": "4d5147f44a60a4825fd8a217b46811224cf80183f9d53f5ce6c8cb9788aae7bc",
1848
+ "token_ids_sha256": "0dd4cd614a3f9d968a52cfbff7d2db4d8e8efebc9d91d8bb48a6f3753c253ea6"
1849
+ },
1850
+ {
1851
+ "case": "coding-06",
1852
+ "options": {
1853
+ "reasoning_effort": "medium"
1854
+ },
1855
+ "rendered_equal": true,
1856
+ "tokens_equal": true,
1857
+ "rendered_sha256": "06189fca5fb668321f952582429ceb9d88c42c9636b4b355d5d3a3e553f091be",
1858
+ "token_ids_sha256": "f707a9bf1f7e54764c1d9d85b6249e4476477f0dd2740e0d79ce1c9743dc063c"
1859
+ },
1860
+ {
1861
+ "case": "coding-06",
1862
+ "options": {
1863
+ "reasoning_effort": "xhigh"
1864
+ },
1865
+ "rendered_equal": true,
1866
+ "tokens_equal": true,
1867
+ "rendered_sha256": "82b4aa32308ea9227904a64f15d1e6d04c19de98e6ac96c29e48c9b128ec06fd",
1868
+ "token_ids_sha256": "267b2aa4000603afed98cede64f743b1d7595e2b821e8a3fcd3ff4e508ddaedd"
1869
+ },
1870
+ {
1871
+ "case": "coding-07",
1872
+ "options": {},
1873
+ "rendered_equal": true,
1874
+ "tokens_equal": true,
1875
+ "rendered_sha256": "b0d7e700a9fac7b48229de675455ed2940caa11f4b1cc49c209a37301a6c2b8f",
1876
+ "token_ids_sha256": "c71180eb108ca429cb4ca6dffcab936a64ab26f63badea18129a4ab6c940d1e5"
1877
+ },
1878
+ {
1879
+ "case": "coding-07",
1880
+ "options": {
1881
+ "enable_thinking": false
1882
+ },
1883
+ "rendered_equal": true,
1884
+ "tokens_equal": true,
1885
+ "rendered_sha256": "e4bcb00c59182c545871cd2c67195403005b03152d8796bf0beae9c047dcd617",
1886
+ "token_ids_sha256": "c56e5386106e5377b9e81ee81fa50c575d4088c26b9971cdd59f76fb6e85cb5a"
1887
+ },
1888
+ {
1889
+ "case": "coding-07",
1890
+ "options": {
1891
+ "reasoning_effort": "low"
1892
+ },
1893
+ "rendered_equal": true,
1894
+ "tokens_equal": true,
1895
+ "rendered_sha256": "5caae3bccbe931fe69c7b7fe5005227be953a288044615e8314a64c6955200a1",
1896
+ "token_ids_sha256": "db7915bbe12598651b963d0cf689f970021965a932800c1b982695c305803c32"
1897
+ },
1898
+ {
1899
+ "case": "coding-07",
1900
+ "options": {
1901
+ "reasoning_effort": "medium"
1902
+ },
1903
+ "rendered_equal": true,
1904
+ "tokens_equal": true,
1905
+ "rendered_sha256": "8a6a197dceef434429c6436feced1f1e6d1d9bd8365c1b701164c25b7ad1019c",
1906
+ "token_ids_sha256": "d18ff1d4baf16bb9fc113e3880da3d144bfe41318982afc841747d1e1fa210cf"
1907
+ },
1908
+ {
1909
+ "case": "coding-07",
1910
+ "options": {
1911
+ "reasoning_effort": "xhigh"
1912
+ },
1913
+ "rendered_equal": true,
1914
+ "tokens_equal": true,
1915
+ "rendered_sha256": "b0d7e700a9fac7b48229de675455ed2940caa11f4b1cc49c209a37301a6c2b8f",
1916
+ "token_ids_sha256": "c71180eb108ca429cb4ca6dffcab936a64ab26f63badea18129a4ab6c940d1e5"
1917
+ },
1918
+ {
1919
+ "case": "coding-08",
1920
+ "options": {},
1921
+ "rendered_equal": true,
1922
+ "tokens_equal": true,
1923
+ "rendered_sha256": "6450b7356a6c99f5fa6ee088f4cd053ea337b1a2acc88f8e02f9b3cd5d55e0dc",
1924
+ "token_ids_sha256": "3c5750c4c0067dfc14491dcb8fcece2fd17c0b7803757705ffa9e148b5448df0"
1925
+ },
1926
+ {
1927
+ "case": "coding-08",
1928
+ "options": {
1929
+ "enable_thinking": false
1930
+ },
1931
+ "rendered_equal": true,
1932
+ "tokens_equal": true,
1933
+ "rendered_sha256": "f8c20776c7229a2a1f91e51a268039b936f8146a12f2b6db1d8dc69d06655a88",
1934
+ "token_ids_sha256": "567bd1194c16fb99264033311094691bb98e2682faf3cf9a3c2fd205b6f123c4"
1935
+ },
1936
+ {
1937
+ "case": "coding-08",
1938
+ "options": {
1939
+ "reasoning_effort": "low"
1940
+ },
1941
+ "rendered_equal": true,
1942
+ "tokens_equal": true,
1943
+ "rendered_sha256": "be22db21ec1ad4e3462089e8a95c744b8b9e0f759efebbaf1da7cecd4f47c2d6",
1944
+ "token_ids_sha256": "de26d7e88adda3545ad0dbeb5bd563c07df82e0e33e2a16e3d7a510d8a64f36b"
1945
+ },
1946
+ {
1947
+ "case": "coding-08",
1948
+ "options": {
1949
+ "reasoning_effort": "medium"
1950
+ },
1951
+ "rendered_equal": true,
1952
+ "tokens_equal": true,
1953
+ "rendered_sha256": "393e28f2aabec5fbd8eadbae4c2143d4bc31bba3810ade122b069dab5a3348a9",
1954
+ "token_ids_sha256": "0660e04b0b6c1a679a7aa1ba2a8d25aed5bce7953a4e808628020fa9e78377f1"
1955
+ },
1956
+ {
1957
+ "case": "coding-08",
1958
+ "options": {
1959
+ "reasoning_effort": "xhigh"
1960
+ },
1961
+ "rendered_equal": true,
1962
+ "tokens_equal": true,
1963
+ "rendered_sha256": "6450b7356a6c99f5fa6ee088f4cd053ea337b1a2acc88f8e02f9b3cd5d55e0dc",
1964
+ "token_ids_sha256": "3c5750c4c0067dfc14491dcb8fcece2fd17c0b7803757705ffa9e148b5448df0"
1965
+ },
1966
+ {
1967
+ "case": "coding-09",
1968
+ "options": {},
1969
+ "rendered_equal": true,
1970
+ "tokens_equal": true,
1971
+ "rendered_sha256": "8087587422b7ee2873c562eb9c4e06eac2a07978ccf0b937a29c02fc3b4c2356",
1972
+ "token_ids_sha256": "bcfe76e47c160f14ab2d450be69d2323d7937287d3f5f9c1f534dc8a9d7efdb6"
1973
+ },
1974
+ {
1975
+ "case": "coding-09",
1976
+ "options": {
1977
+ "enable_thinking": false
1978
+ },
1979
+ "rendered_equal": true,
1980
+ "tokens_equal": true,
1981
+ "rendered_sha256": "e18a2c027cdedd8cda071243f4be301285a09f18a3369d6ede946a304d930aae",
1982
+ "token_ids_sha256": "dc1b5e6e60fdd50123ad7e05ec4cf7b82469e54b47bc00b123eb4f1de8cf1e82"
1983
+ },
1984
+ {
1985
+ "case": "coding-09",
1986
+ "options": {
1987
+ "reasoning_effort": "low"
1988
+ },
1989
+ "rendered_equal": true,
1990
+ "tokens_equal": true,
1991
+ "rendered_sha256": "8d8bdcc536f5c82c277280b4a64e08d1d326a7c073a5255304f0c6de30da5e65",
1992
+ "token_ids_sha256": "cd8a8a5bc78a2f006d9feea1d4a338d567a851dfe999e89326a65aac3dfe7486"
1993
+ },
1994
+ {
1995
+ "case": "coding-09",
1996
+ "options": {
1997
+ "reasoning_effort": "medium"
1998
+ },
1999
+ "rendered_equal": true,
2000
+ "tokens_equal": true,
2001
+ "rendered_sha256": "897bc62dc9b88b47342347d094c357b25197a7686e3931356184f20228a0be89",
2002
+ "token_ids_sha256": "449614cdc8ddbe692df31591b26e4cbb9f97ff69ebcdbe2785fcbc76c74a52ef"
2003
+ },
2004
+ {
2005
+ "case": "coding-09",
2006
+ "options": {
2007
+ "reasoning_effort": "xhigh"
2008
+ },
2009
+ "rendered_equal": true,
2010
+ "tokens_equal": true,
2011
+ "rendered_sha256": "8087587422b7ee2873c562eb9c4e06eac2a07978ccf0b937a29c02fc3b4c2356",
2012
+ "token_ids_sha256": "bcfe76e47c160f14ab2d450be69d2323d7937287d3f5f9c1f534dc8a9d7efdb6"
2013
+ },
2014
+ {
2015
+ "case": "coding-10",
2016
+ "options": {},
2017
+ "rendered_equal": true,
2018
+ "tokens_equal": true,
2019
+ "rendered_sha256": "94354515b7bcb3d0493082d7a923fc6a3f828576f84c7851187462d32e08b4ce",
2020
+ "token_ids_sha256": "d1006418b971215d68426eca0929c46e7e55c66c36e5bfb8f1b125297ee415ad"
2021
+ },
2022
+ {
2023
+ "case": "coding-10",
2024
+ "options": {
2025
+ "enable_thinking": false
2026
+ },
2027
+ "rendered_equal": true,
2028
+ "tokens_equal": true,
2029
+ "rendered_sha256": "425363c857a6ab7ece15aae285272fb08356c01fe91e2e85809a337a8f7007ed",
2030
+ "token_ids_sha256": "276077d7b9ded956051ce9ab980fefa8c761f423d570286b49defa34d1e71f92"
2031
+ },
2032
+ {
2033
+ "case": "coding-10",
2034
+ "options": {
2035
+ "reasoning_effort": "low"
2036
+ },
2037
+ "rendered_equal": true,
2038
+ "tokens_equal": true,
2039
+ "rendered_sha256": "a78a50f74c7edbdc09efa5c1ae67361be98cffdaa4836461445c57feb5bd901d",
2040
+ "token_ids_sha256": "c6e9c7e1d58b531f655fadfa24efdd5580004bf88258d5fd93be5429873869be"
2041
+ },
2042
+ {
2043
+ "case": "coding-10",
2044
+ "options": {
2045
+ "reasoning_effort": "medium"
2046
+ },
2047
+ "rendered_equal": true,
2048
+ "tokens_equal": true,
2049
+ "rendered_sha256": "87d4ff617dfc4d3b7389dd945a6244a020ef8751963faab8d1e11eb69772eda3",
2050
+ "token_ids_sha256": "eeb894ad3f8837c9d0cfb00d24e654f6d489b991cd4dda621e9619fa452fc2ab"
2051
+ },
2052
+ {
2053
+ "case": "coding-10",
2054
+ "options": {
2055
+ "reasoning_effort": "xhigh"
2056
+ },
2057
+ "rendered_equal": true,
2058
+ "tokens_equal": true,
2059
+ "rendered_sha256": "94354515b7bcb3d0493082d7a923fc6a3f828576f84c7851187462d32e08b4ce",
2060
+ "token_ids_sha256": "d1006418b971215d68426eca0929c46e7e55c66c36e5bfb8f1b125297ee415ad"
2061
+ }
2062
+ ],
2063
+ "special_token_ids": {
2064
+ "bos_token_id": {
2065
+ "reference": null,
2066
+ "candidate": null
2067
+ },
2068
+ "eos_token_id": {
2069
+ "reference": 248046,
2070
+ "candidate": 248046
2071
+ },
2072
+ "pad_token_id": {
2073
+ "reference": 248044,
2074
+ "candidate": 248044
2075
+ },
2076
+ "unk_token_id": {
2077
+ "reference": null,
2078
+ "candidate": null
2079
+ }
2080
+ },
2081
+ "reference_commit": "5ad04445d2686f525e9fbe5c077e6fa0c7df4200",
2082
+ "scope": "Actual tokenizer/template comparison only, no model generation"
2083
+ },
2084
+ "full_generation": "NOT_RUN",
2085
+ "weight_value_equivalence_to_source": "NOT_RUN",
2086
+ "model_quality": "NOT_RUN",
2087
+ "script_sha256": "59470d94d54adef20c6413a9fbabdb0c19cdc6cbe225dfd760507cb28a6e906f"
2088
+ }
compatibility/patch-manifest.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "mlx_lm_revision": "c69d1288440a0dc4e6401fc417098b07598dccd5",
3
+ "patches": [
4
+ {
5
+ "path": "compatibility/swift15-mlx-lm.patch",
6
+ "sha256": "f6f1d0bdafa45863bfbf93dac0398c481c993ea04fdf38b9bae98c643f89eaec"
7
+ },
8
+ {
9
+ "path": "compatibility/enable-5bit.patch",
10
+ "sha256": "b985961eac3035e05ca4c9f3a8b283c26e6dd69bab4d113997fc04fe2a4f99cc"
11
+ }
12
+ ]
13
+ }
compatibility/quant-validation-results.json ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "all_floating_tensors_finite": true,
3
+ "assets_sha256": {
4
+ "chat_template.jinja": "c3cf9e34abf4f9e36c2d72165aa9c132d3e2a725b6c2586aaa3a8af9d7a81041",
5
+ "generation_config.json": "e70c136c1b78ddc1fb0905bac8e733a4dc448d4f852a5dd75143fffc70be550e",
6
+ "merges.txt": "a9d356d7bdf1ef4949e3e748e95b8e10ad9d4e2e838eddc38a0a7b6b94d1db8d",
7
+ "preprocessor_config.json": "27225450ac9c6529872ee1924fcb0962ff5634834f817040f444118116f4e516",
8
+ "tokenizer.json": "0997f410c57a1f4e53b09e4be8f4a172d90edd9564368fb0847030937229b9f3",
9
+ "tokenizer_config.json": "b11349aafa7cdc6a320767cf7ceb29ed82f7eda5d65e8e0819e76f0ce947bf27",
10
+ "video_preprocessor_config.json": "7768af27c1fafa9cc9011c1dc20067e03f8915e03b63504550e11d5066986d13",
11
+ "vocab.json": "ce99b4cb2983d118806ce0a8b777a35b093e2000a503ebde25853284c9dfa003"
12
+ },
13
+ "categories": {
14
+ "MTP": 15,
15
+ "text": 851,
16
+ "vision": 333
17
+ },
18
+ "chat_templates": [
19
+ {
20
+ "options": {
21
+ "enable_thinking": false
22
+ },
23
+ "rendered": "<|im_start|>user\nSay hello.<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\n"
24
+ },
25
+ {
26
+ "options": {
27
+ "reasoning_effort": "low"
28
+ },
29
+ "rendered": "<|im_start|>system\nReasoning effort is set to low. Keep your thinking brief and focused, moving directly to the conclusion without unnecessary elaboration.<|im_end|>\n<|im_start|>user\nSay hello.<|im_end|>\n<|im_start|>assistant\n<think>\n"
30
+ },
31
+ {
32
+ "options": {
33
+ "reasoning_effort": "xhigh"
34
+ },
35
+ "rendered": "<|im_start|>system\nReasoning effort is set to xhigh. Please think carefully through the task, validate key assumptions, consider plausible alternatives, and prioritize correctness, consistency, and clarity in the final answer.<|im_end|>\n<|im_start|>user\nSay hello.<|im_end|>\n<|im_start|>assistant\n<think>\n"
36
+ }
37
+ ],
38
+ "exact_unquantized_tensors": 609,
39
+ "generation": {
40
+ "elapsed_seconds": 495.4394222159999,
41
+ "finish_reason": "stop",
42
+ "prompt": "<|im_start|>user\nReply with exactly: Hello from Swift.<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\n",
43
+ "prompt_tokens_per_second": 0.04886516458777248,
44
+ "text": "Hello from Swift.",
45
+ "token_ids": [
46
+ 9419,
47
+ 494,
48
+ 22929,
49
+ 13,
50
+ 248046
51
+ ],
52
+ "tokens": 5,
53
+ "tokens_per_second": 0.05894060179705689
54
+ },
55
+ "ignored_tensors": 0,
56
+ "inference_floating_dtype": "float32, CPU runtime only; stored floating tensors remain BF16",
57
+ "load_memory_bytes": 19281804392,
58
+ "load_seconds": 3.1353140849996635,
59
+ "mapped_source_tensors": 1199,
60
+ "mtp": {
61
+ "path": "Explicit MTP step with real text hidden states and shared LM head; speculative generation is not integrated",
62
+ "shape": [
63
+ 1,
64
+ 1,
65
+ 248320
66
+ ],
67
+ "status": "PASS"
68
+ },
69
+ "native_bf16_cpu_inference": "Aborted after reproducing incorrect accumulation in the official Linux BF16 quantized matmul. See cpu-quantized-matmul-diagnostic.json.",
70
+ "process_peak_rss_bytes": 24964259840,
71
+ "processor": "Qwen3VLProcessor",
72
+ "quantization": {
73
+ "bits": 5,
74
+ "group_size": 64,
75
+ "mode": "affine"
76
+ },
77
+ "recorded_at": "2026-09-22T12:17:07.052752+00:00",
78
+ "saved_tensors": 2379,
79
+ "source_repo": "ukisai/Swift-1.5-Qwen3.8-27b",
80
+ "source_revision": "5ad04445d2686f525e9fbe5c077e6fa0c7df4200",
81
+ "source_shard_bytes": 55563006776,
82
+ "source_shards": 18,
83
+ "source_tensors": 1199,
84
+ "status": "PASS",
85
+ "tokenizer": "Qwen2Tokenizer",
86
+ "total_validation_seconds": 609.2779944080003,
87
+ "unexplained_tensors": 0,
88
+ "vision": {
89
+ "grid": [
90
+ [
91
+ 1,
92
+ 16,
93
+ 16
94
+ ]
95
+ ],
96
+ "path": "Vision encoder only; image/video insertion and multimodal text generation are not implemented",
97
+ "shape": [
98
+ 64,
99
+ 5120
100
+ ],
101
+ "status": "PASS"
102
+ }
103
+ }
compatibility/source-structural-results.json ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "categories": {
3
+ "MTP": 15,
4
+ "text": 851,
5
+ "vision": 333
6
+ },
7
+ "chat_templates": [
8
+ {
9
+ "options": {
10
+ "enable_thinking": false
11
+ },
12
+ "rendered": "<|im_start|>user\nSay hello.<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\n",
13
+ "tokens": 15
14
+ },
15
+ {
16
+ "options": {
17
+ "reasoning_effort": "low"
18
+ },
19
+ "rendered": "<|im_start|>system\nReasoning effort is set to low. Keep your thinking brief and focused, moving directly to the conclusion without unnecessary elaboration.<|im_end|>\n<|im_start|>user\nSay hello.<|im_end|>\n<|im_start|>assistant\n<think>\n",
20
+ "tokens": 43
21
+ },
22
+ {
23
+ "options": {
24
+ "reasoning_effort": "xhigh"
25
+ },
26
+ "rendered": "<|im_start|>system\nReasoning effort is set to xhigh. Please think carefully through the task, validate key assumptions, consider plausible alternatives, and prioritize correctness, consistency, and clarity in the final answer.<|im_end|>\n<|im_start|>user\nSay hello.<|im_end|>\n<|im_start|>assistant\n<think>\n",
27
+ "tokens": 55
28
+ }
29
+ ],
30
+ "elapsed_seconds": 1.0959153320000041,
31
+ "full_parameter_evaluation": false,
32
+ "generation": "NOT_RUN",
33
+ "ignored_tensors": 0,
34
+ "mapped_tensors": 1199,
35
+ "mlx_active_memory_bytes": 8,
36
+ "mtp_runtime": "component-only; no integrated speculative decoding",
37
+ "platform": "Linux x86_64",
38
+ "process_peak_rss_bytes": 1180291072,
39
+ "processor": "Qwen3VLProcessor",
40
+ "quantization_executed": false,
41
+ "recorded_at": "2026-09-22T12:03:20.905145+00:00",
42
+ "source": "<SOURCE_MODEL_DIR>",
43
+ "source_repo": "ukisai/Swift-1.5-Qwen3.8-27b",
44
+ "source_revision": "5ad04445d2686f525e9fbe5c077e6fa0c7df4200",
45
+ "source_tensors": 1199,
46
+ "source_verification": "compatibility/source-verification.json",
47
+ "previous_recorded_source_verification_sha256_unverified": "1e6e65ed808f3dbc08766bc141706f2d30349d28608f6aba6884b419c3849ef3",
48
+ "source_verification_sha256": "27d87d8d5209c6559643efdd7d7b468b0138ebfb3a7d5771b29be79214bffe75",
49
+ "reference_update_note": "Current hash identifies the published redacted document. The previous recorded hash is retained for provenance but was not reproduced. This reference correction does not rerun the historical validation.",
50
+ "status": "PASS_ACTUAL_SOURCE_LAZY_STRUCTURAL_LOAD",
51
+ "tokenizer": "Qwen2Tokenizer",
52
+ "unexplained_tensors": 0,
53
+ "vision_runtime": "encoder-only; no integrated multimodal generation",
54
+ "weight_backing": "actual verified source safetensors; lazy loading"
55
+ }
compatibility/source-verification.json ADDED
The diff for this file is too large to render. See raw diff
 
compatibility/swift15-mlx-lm.patch ADDED
@@ -0,0 +1,962 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ diff --git a/mlx_lm/models/qwen3_5_full.py b/mlx_lm/models/qwen3_5_full.py
2
+ new file mode 100644
3
+ index 0000000..eb3d09b
4
+ --- /dev/null
5
+ +++ b/mlx_lm/models/qwen3_5_full.py
6
+ @@ -0,0 +1,485 @@
7
+ +# Copyright © 2026 Apple Inc.
8
+ +
9
+ +"""Complete Qwen3.5 parameter model, including the vision encoder and MTP.
10
+ +
11
+ +Text generation, the vision encoder, and explicit MTP steps are separate APIs.
12
+ +Image/video token insertion, multimodal text positions, and speculative decoding
13
+ +are not implemented here. Unsupported multimodal calls raise an error.
14
+ +"""
15
+ +
16
+ +import copy
17
+ +from dataclasses import dataclass
18
+ +from typing import Optional
19
+ +
20
+ +import mlx.core as mx
21
+ +import mlx.nn as nn
22
+ +import numpy as np
23
+ +from mlx.utils import tree_flatten, tree_unflatten
24
+ +
25
+ +from . import qwen3_5
26
+ +from .base import BaseModelArgs, create_attention_mask
27
+ +from .cache import KVCache
28
+ +
29
+ +
30
+ +class OffsetRMSNorm(nn.Module):
31
+ + """Keep HF's zero-centered weights without rounding weight + 1 to BF16."""
32
+ +
33
+ + def __init__(self, dims, eps=1e-6):
34
+ + super().__init__()
35
+ + self.weight = mx.zeros((dims,))
36
+ + self.eps = eps
37
+ +
38
+ + def __call__(self, x):
39
+ + y = x.astype(mx.float32)
40
+ + y = y * mx.rsqrt(mx.mean(y * y, axis=-1, keepdims=True) + self.eps)
41
+ + return (y * (1 + self.weight.astype(mx.float32))).astype(x.dtype)
42
+ +
43
+ +
44
+ +def _use_offset_norms(module):
45
+ + replacements = [
46
+ + (name, OffsetRMSNorm(norm.weight.shape[0], norm.eps))
47
+ + for name, norm in module.named_modules()
48
+ + if isinstance(norm, nn.RMSNorm)
49
+ + ]
50
+ + module.update_modules(tree_unflatten(replacements))
51
+ +
52
+ +
53
+ +@dataclass
54
+ +class VisionArgs(BaseModelArgs):
55
+ + depth: int
56
+ + hidden_size: int
57
+ + intermediate_size: int
58
+ + num_heads: int
59
+ + out_hidden_size: int
60
+ + num_position_embeddings: int
61
+ + patch_size: int = 16
62
+ + temporal_patch_size: int = 2
63
+ + spatial_merge_size: int = 2
64
+ + in_channels: int = 3
65
+ + hidden_act: str = "gelu_pytorch_tanh"
66
+ + deepstack_visual_indexes: Optional[list] = None
67
+ +
68
+ + def __post_init__(self):
69
+ + if self.deepstack_visual_indexes:
70
+ + raise ValueError("DeepStack vision features are not supported")
71
+ + if self.hidden_act != "gelu_pytorch_tanh":
72
+ + raise ValueError(f"Unsupported vision activation: {self.hidden_act}")
73
+ + if self.hidden_size % self.num_heads or self.hidden_size // self.num_heads % 4:
74
+ + raise ValueError("Vision head dimension must be divisible by four")
75
+ + if int(self.num_position_embeddings**0.5) ** 2 != self.num_position_embeddings:
76
+ + raise ValueError("Vision position table must be square")
77
+ +
78
+ +
79
+ +class VisionPatchEmbed(nn.Module):
80
+ + def __init__(self, args):
81
+ + super().__init__()
82
+ + self.args = args
83
+ + kernel = (args.temporal_patch_size, args.patch_size, args.patch_size)
84
+ + self.proj = nn.Conv3d(
85
+ + args.in_channels, args.hidden_size, kernel, stride=kernel, bias=True
86
+ + )
87
+ +
88
+ + def __call__(self, pixels):
89
+ + a = self.args
90
+ + x = pixels.reshape(
91
+ + -1, a.in_channels, a.temporal_patch_size, a.patch_size, a.patch_size
92
+ + )
93
+ + x = x.transpose(0, 2, 3, 4, 1).astype(self.proj.weight.dtype)
94
+ + return self.proj(x).reshape(-1, a.hidden_size)
95
+ +
96
+ +
97
+ +class VisionAttention(nn.Module):
98
+ + def __init__(self, args):
99
+ + super().__init__()
100
+ + self.num_heads = args.num_heads
101
+ + self.head_dim = args.hidden_size // args.num_heads
102
+ + self.qkv = nn.Linear(args.hidden_size, 3 * args.hidden_size)
103
+ + self.proj = nn.Linear(args.hidden_size, args.hidden_size)
104
+ +
105
+ + def __call__(self, x, cos, sin, boundaries):
106
+ + qkv = self.qkv(x).reshape(x.shape[0], 3, self.num_heads, self.head_dim)
107
+ + q, k, v = qkv.transpose(1, 0, 2, 3)
108
+ +
109
+ + def rotate(y):
110
+ + z = y.astype(mx.float32)
111
+ + half = self.head_dim // 2
112
+ + rotated = mx.concatenate([-z[..., half:], z[..., :half]], axis=-1)
113
+ + return (z * cos[:, None] + rotated * sin[:, None]).astype(y.dtype)
114
+ +
115
+ + q, k = rotate(q), rotate(k)
116
+ + outputs = []
117
+ + for start, end in zip(boundaries, boundaries[1:]):
118
+ + out = mx.fast.scaled_dot_product_attention(
119
+ + q[start:end].transpose(1, 0, 2)[None],
120
+ + k[start:end].transpose(1, 0, 2)[None],
121
+ + v[start:end].transpose(1, 0, 2)[None],
122
+ + scale=self.head_dim**-0.5,
123
+ + )
124
+ + outputs.append(out[0].transpose(1, 0, 2).reshape(end - start, -1))
125
+ + return self.proj(mx.concatenate(outputs, axis=0))
126
+ +
127
+ +
128
+ +class VisionMLP(nn.Module):
129
+ + def __init__(self, args):
130
+ + super().__init__()
131
+ + self.linear_fc1 = nn.Linear(args.hidden_size, args.intermediate_size)
132
+ + self.linear_fc2 = nn.Linear(args.intermediate_size, args.hidden_size)
133
+ +
134
+ + def __call__(self, x):
135
+ + return self.linear_fc2(nn.gelu_approx(self.linear_fc1(x)))
136
+ +
137
+ +
138
+ +class VisionBlock(nn.Module):
139
+ + def __init__(self, args):
140
+ + super().__init__()
141
+ + self.norm1 = nn.LayerNorm(args.hidden_size, eps=1e-6)
142
+ + self.norm2 = nn.LayerNorm(args.hidden_size, eps=1e-6)
143
+ + self.attn = VisionAttention(args)
144
+ + self.mlp = VisionMLP(args)
145
+ +
146
+ + def __call__(self, x, cos, sin, boundaries):
147
+ + x = x + self.attn(self.norm1(x), cos, sin, boundaries)
148
+ + return x + self.mlp(self.norm2(x))
149
+ +
150
+ +
151
+ +class VisionMerger(nn.Module):
152
+ + def __init__(self, args):
153
+ + super().__init__()
154
+ + self.hidden_size = args.hidden_size * args.spatial_merge_size**2
155
+ + self.norm = nn.LayerNorm(args.hidden_size, eps=1e-6)
156
+ + self.linear_fc1 = nn.Linear(self.hidden_size, self.hidden_size)
157
+ + self.linear_fc2 = nn.Linear(self.hidden_size, args.out_hidden_size)
158
+ +
159
+ + def __call__(self, x):
160
+ + x = self.norm(x).reshape(-1, self.hidden_size)
161
+ + return self.linear_fc2(nn.gelu(self.linear_fc1(x)))
162
+ +
163
+ +
164
+ +class VisionModel(nn.Module):
165
+ + def __init__(self, args):
166
+ + super().__init__()
167
+ + self.args = args
168
+ + self.patch_embed = VisionPatchEmbed(args)
169
+ + self.pos_embed = nn.Embedding(args.num_position_embeddings, args.hidden_size)
170
+ + self.blocks = [VisionBlock(args) for _ in range(args.depth)]
171
+ + self.merger = VisionMerger(args)
172
+ +
173
+ + def _positions(self, grid_thw):
174
+ + grid = np.asarray(
175
+ + grid_thw.tolist() if hasattr(grid_thw, "tolist") else grid_thw
176
+ + )
177
+ + if (
178
+ + grid.ndim != 2
179
+ + or grid.shape[1] != 3
180
+ + or not np.issubdtype(grid.dtype, np.integer)
181
+ + ):
182
+ + raise ValueError("grid_thw must be an integer array with shape (N, 3)")
183
+ + merge = self.args.spatial_merge_size
184
+ + side = int(self.args.num_position_embeddings**0.5)
185
+ + positions, indices, weights, boundaries = [], [], [], [0]
186
+ + for t, h, w in grid.tolist():
187
+ + if min(t, h, w) <= 0 or h % merge or w % merge:
188
+ + raise ValueError("Invalid vision grid or spatial merge dimensions")
189
+ + hp, wp = np.indices((h, w))
190
+ + block = (h // merge, merge, w // merge, merge)
191
+ + hp = hp.reshape(block).transpose(0, 2, 1, 3).reshape(-1)
192
+ + wp = wp.reshape(block).transpose(0, 2, 1, 3).reshape(-1)
193
+ + positions.append(np.tile(np.stack([hp, wp], axis=-1), (t, 1)))
194
+ + reorder = np.tile(hp * w + wp, t)
195
+ + hs = np.linspace(0, side - 1, h, dtype=np.float32)
196
+ + ws = np.linspace(0, side - 1, w, dtype=np.float32)
197
+ + hf, wf = hs.astype(np.int32), ws.astype(np.int32)
198
+ + hc, wc = np.minimum(hf + 1, side - 1), np.minimum(wf + 1, side - 1)
199
+ + dh, dw = hs - hf, ws - wf
200
+ + idx = [
201
+ + (a[:, None] * side + b[None]).reshape(-1)
202
+ + for a, b in [(hf, wf), (hf, wc), (hc, wf), (hc, wc)]
203
+ + ]
204
+ + coeff = [
205
+ + (a[:, None] * b[None]).reshape(-1)
206
+ + for a, b in [(1 - dh, 1 - dw), (1 - dh, dw), (dh, 1 - dw), (dh, dw)]
207
+ + ]
208
+ + indices.append(np.stack(idx)[:, reorder])
209
+ + weights.append(np.stack(coeff)[:, reorder])
210
+ + offset = boundaries[-1]
211
+ + boundaries.extend(offset + (i + 1) * h * w for i in range(t))
212
+ + if not positions:
213
+ + raise ValueError("At least one vision grid is required")
214
+ + return (
215
+ + mx.array(np.concatenate(positions), dtype=mx.float32),
216
+ + mx.array(np.concatenate(indices, axis=1), dtype=mx.int32),
217
+ + mx.array(np.concatenate(weights, axis=1), dtype=mx.float32),
218
+ + boundaries,
219
+ + )
220
+ +
221
+ + def __call__(self, pixels, grid_thw, return_hidden_states=False):
222
+ + positions, indices, weights, boundaries = self._positions(grid_thw)
223
+ + x = self.patch_embed(pixels)
224
+ + if x.shape[0] != boundaries[-1]:
225
+ + raise ValueError("Pixel patch count does not match grid_thw")
226
+ + pos = (self.pos_embed(indices) * weights[..., None]).sum(axis=0)
227
+ + x = x + pos.astype(x.dtype)
228
+ + dim = self.args.hidden_size // self.args.num_heads // 2
229
+ + inv_freq = 1.0 / (10000 ** (mx.arange(0, dim, 2, dtype=mx.float32) / dim))
230
+ + angles = (positions[..., None] * inv_freq).reshape(x.shape[0], -1)
231
+ + angles = mx.concatenate([angles, angles], axis=-1)
232
+ + cos, sin = mx.cos(angles), mx.sin(angles)
233
+ + for block in self.blocks:
234
+ + x = block(x, cos, sin, boundaries)
235
+ + merged = self.merger(x)
236
+ + return (x, merged) if return_hidden_states else merged
237
+ +
238
+ +
239
+ +class MultiTokenPredictor(nn.Module):
240
+ + """An explicit MTP step; embeddings and the output head belong to the LM."""
241
+ +
242
+ + def __init__(self, args, num_layers):
243
+ + super().__init__()
244
+ + self.fc = nn.Linear(2 * args.hidden_size, args.hidden_size, bias=False)
245
+ + self.pre_fc_norm_embedding = OffsetRMSNorm(args.hidden_size, args.rms_norm_eps)
246
+ + self.pre_fc_norm_hidden = OffsetRMSNorm(args.hidden_size, args.rms_norm_eps)
247
+ + self.layers = [
248
+ + qwen3_5.DecoderLayer(args, args.full_attention_interval - 1)
249
+ + for _ in range(num_layers)
250
+ + ]
251
+ + self.norm = OffsetRMSNorm(args.hidden_size, args.rms_norm_eps)
252
+ + _use_offset_norms(self)
253
+ +
254
+ + def __call__(self, hidden_states, next_token_embeddings, cache=None, step=0):
255
+ + if hidden_states.shape != next_token_embeddings.shape:
256
+ + raise ValueError("MTP hidden states and next-token embeddings must align")
257
+ + if step < 0:
258
+ + raise ValueError("MTP step must be non-negative")
259
+ + x = mx.concatenate(
260
+ + [
261
+ + self.pre_fc_norm_embedding(next_token_embeddings),
262
+ + self.pre_fc_norm_hidden(hidden_states),
263
+ + ],
264
+ + axis=-1,
265
+ + )
266
+ + x = self.fc(x)
267
+ + layer = step % len(self.layers)
268
+ + if cache is not None and len(cache) != len(self.layers):
269
+ + raise ValueError("MTP requires one KV cache per MTP layer")
270
+ + c = cache[layer] if cache is not None else None
271
+ + return self.norm(self.layers[layer](x, create_attention_mask(x, c), c))
272
+ +
273
+ + def make_cache(self):
274
+ + return [KVCache() for _ in self.layers]
275
+ +
276
+ +
277
+ +@dataclass
278
+ +class ModelArgs(BaseModelArgs):
279
+ + model_type: str
280
+ + text_config: dict
281
+ + vision_config: dict
282
+ + language_model_only: bool = False
283
+ + image_token_id: Optional[int] = None
284
+ + video_token_id: Optional[int] = None
285
+ + vision_start_token_id: Optional[int] = None
286
+ + tie_word_embeddings: bool = False
287
+ + quantization: Optional[dict] = None
288
+ +
289
+ + @classmethod
290
+ + def from_dict(cls, params):
291
+ + return super().from_dict(copy.deepcopy(params))
292
+ +
293
+ +
294
+ +class Model(nn.Module):
295
+ + extra_save_files = (
296
+ + "preprocessor_config.json",
297
+ + "video_preprocessor_config.json",
298
+ + "processor_config.json",
299
+ + "tokenizer.json",
300
+ + "tokenizer_config.json",
301
+ + "special_tokens_map.json",
302
+ + "vocab.json",
303
+ + "merges.txt",
304
+ + "chat_template.jinja",
305
+ + )
306
+ +
307
+ + def __init__(self, args):
308
+ + super().__init__()
309
+ + self.args = args
310
+ + self.model_type = args.model_type
311
+ + text = args.text_config
312
+ + if args.language_model_only:
313
+ + raise ValueError("The complete model requires language_model_only=false")
314
+ + if text.get("hidden_act", "silu") not in ("silu", "swish"):
315
+ + raise ValueError("Unsupported text MLP activation")
316
+ + if text.get("attn_output_gate", True) is not True:
317
+ + raise ValueError("Ungated attention is not supported")
318
+ + if text.get("output_gate_type", "swish") not in ("swish", "sigmoid"):
319
+ + raise ValueError("Unknown attention gate declaration")
320
+ + if text.get("mtp_use_dedicated_embeddings", False):
321
+ + raise ValueError("Dedicated MTP embeddings are not supported")
322
+ + if args.tie_word_embeddings != text.get("tie_word_embeddings", False):
323
+ + raise ValueError("Conflicting text and top-level weight tying settings")
324
+ + self._text_args = qwen3_5.TextModelArgs.from_dict(copy.deepcopy(text))
325
+ + expected_layers = [
326
+ + (
327
+ + "full_attention"
328
+ + if (i + 1) % self._text_args.full_attention_interval == 0
329
+ + else "linear_attention"
330
+ + )
331
+ + for i in range(self._text_args.num_hidden_layers)
332
+ + ]
333
+ + if text.get("layer_types", expected_layers) != expected_layers:
334
+ + raise ValueError("Layer schedule differs from the supported architecture")
335
+ + if self._text_args.num_experts:
336
+ + raise ValueError("This complete model supports the dense architecture")
337
+ + self.language_model = qwen3_5.TextModel(self._text_args)
338
+ + _use_offset_norms(self.language_model)
339
+ + self.visual = VisionModel(VisionArgs.from_dict(args.vision_config))
340
+ + if self.visual.args.out_hidden_size != self._text_args.hidden_size:
341
+ + raise ValueError("Vision output size does not match text hidden size")
342
+ + num_mtp = text.get("mtp_num_hidden_layers", 0)
343
+ + if num_mtp < 0:
344
+ + raise ValueError("Invalid MTP layer count")
345
+ + if num_mtp:
346
+ + self.mtp = MultiTokenPredictor(self._text_args, num_mtp)
347
+ + self._parameter_shapes = {
348
+ + k: tuple(v.shape) for k, v in tree_flatten(self.parameters())
349
+ + }
350
+ +
351
+ + @property
352
+ + def model(self):
353
+ + return self.language_model.model
354
+ +
355
+ + @property
356
+ + def layers(self):
357
+ + return self.language_model.layers
358
+ +
359
+ + def make_cache(self):
360
+ + return self.language_model.make_cache()
361
+ +
362
+ + def __call__(self, inputs, cache=None, input_embeddings=None, **kwargs):
363
+ + if kwargs:
364
+ + raise NotImplementedError(
365
+ + "Multimodal text integration is not implemented; use visual() for encoder features"
366
+ + )
367
+ + for token in (
368
+ + self.args.image_token_id,
369
+ + self.args.video_token_id,
370
+ + self.args.vision_start_token_id,
371
+ + ):
372
+ + if (
373
+ + token is not None
374
+ + and inputs is not None
375
+ + and bool(mx.any(inputs == token))
376
+ + ):
377
+ + raise NotImplementedError(
378
+ + "Multimodal token positions require a multimodal text runtime"
379
+ + )
380
+ + return self.language_model(inputs, cache, input_embeddings)
381
+ +
382
+ + def mtp_logits(self, next_token_ids, previous_hidden_states, cache=None, step=0):
383
+ + if not hasattr(self, "mtp"):
384
+ + raise ValueError("This checkpoint has no MTP layers")
385
+ + embeddings = self.model.embed_tokens(next_token_ids)
386
+ + hidden = self.mtp(previous_hidden_states, embeddings, cache, step)
387
+ + if self._text_args.tie_word_embeddings:
388
+ + return self.model.embed_tokens.as_linear(hidden)
389
+ + return self.language_model.lm_head(hidden)
390
+ +
391
+ + def weight_mapping(self):
392
+ + rows = []
393
+ + for name, shape in sorted(self._parameter_shapes.items()):
394
+ + source, source_shape, transform = name, shape, "identity"
395
+ + if name.startswith("language_model.model."):
396
+ + source = "model.language_model." + name[len("language_model.model.") :]
397
+ + elif name.startswith("language_model.lm_head."):
398
+ + source = name[len("language_model.") :]
399
+ + elif name.startswith("visual."):
400
+ + source = "model." + name
401
+ + if name.endswith(".conv1d.weight"):
402
+ + source_shape = (shape[0], shape[2], shape[1])
403
+ + transform = "transpose(0,2,1)"
404
+ + elif name == "visual.patch_embed.proj.weight":
405
+ + source_shape = (shape[0], shape[4], shape[1], shape[2], shape[3])
406
+ + transform = "transpose(0,2,3,4,1)"
407
+ + category = (
408
+ + "vision"
409
+ + if name.startswith("visual.")
410
+ + else "MTP" if name.startswith("mtp.") else "text"
411
+ + )
412
+ + rows.append(
413
+ + dict(
414
+ + source=source,
415
+ + source_shape=source_shape,
416
+ + destination=name,
417
+ + destination_shape=shape,
418
+ + category=category,
419
+ + transform=transform,
420
+ + )
421
+ + )
422
+ + return rows
423
+ +
424
+ + def sanitize(self, weights):
425
+ + rows = self.weight_mapping()
426
+ + hf_names = {r["source"] for r in rows}
427
+ + native_names = set(self._parameter_shapes)
428
+ + is_hf = any(k.startswith("model.language_model.") for k in weights)
429
+ + expected = hf_names if is_hf else native_names
430
+ + if self.args.quantization:
431
+ + if is_hf:
432
+ + raise ValueError("Only original unquantized HF weights can be mapped")
433
+ + return self._check_native_quantized(weights)
434
+ + missing, unexpected = expected - set(weights), set(weights) - expected
435
+ + if missing or unexpected:
436
+ + raise ValueError(
437
+ + f"Incomplete weight mapping: missing={sorted(missing)}, unexpected={sorted(unexpected)}"
438
+ + )
439
+ + mapped = {}
440
+ + for row in rows:
441
+ + key = row["source"] if is_hf else row["destination"]
442
+ + value = weights[key]
443
+ + shape = row["source_shape"] if is_hf else row["destination_shape"]
444
+ + if tuple(value.shape) != shape:
445
+ + raise ValueError(f"Shape mismatch for {key}: {value.shape} != {shape}")
446
+ + if is_hf and row["transform"] == "transpose(0,2,1)":
447
+ + value = value.transpose(0, 2, 1)
448
+ + elif is_hf and row["transform"] == "transpose(0,2,3,4,1)":
449
+ + value = value.transpose(0, 2, 3, 4, 1)
450
+ + mapped[row["destination"]] = value
451
+ + return mapped
452
+ +
453
+ + def _check_native_quantized(self, weights):
454
+ + shapes = dict(self._parameter_shapes)
455
+ + q = self.args.quantization
456
+ + for path, module in self.named_modules():
457
+ + if not hasattr(module, "to_quantized"):
458
+ + continue
459
+ + settings = q.get(path, q)
460
+ + if settings is False:
461
+ + continue
462
+ + if not isinstance(settings, dict):
463
+ + raise ValueError(f"Invalid native quantization metadata for {path}")
464
+ + bits, group, mode = (
465
+ + settings.get("bits"),
466
+ + settings.get("group_size"),
467
+ + settings.get("mode", "affine"),
468
+ + )
469
+ + if (bits, group, mode) != (4, 64, "affine"):
470
+ + raise ValueError(
471
+ + "This extension only prepares affine/4-bit/group-64 native checkpoints"
472
+ + )
473
+ + original = shapes[f"{path}.weight"]
474
+ + if original[-1] % group:
475
+ + continue
476
+ + shapes[f"{path}.weight"] = (*original[:-1], original[-1] * bits // 32)
477
+ + shapes[f"{path}.scales"] = (*original[:-1], original[-1] // group)
478
+ + shapes[f"{path}.biases"] = shapes[f"{path}.scales"]
479
+ + missing, unexpected = set(shapes) - set(weights), set(weights) - set(shapes)
480
+ + if missing or unexpected:
481
+ + raise ValueError(
482
+ + f"Incomplete native checkpoint: missing={sorted(missing)}, unexpected={sorted(unexpected)}"
483
+ + )
484
+ + for name, shape in shapes.items():
485
+ + if tuple(weights[name].shape) != shape:
486
+ + raise ValueError(f"Native checkpoint shape mismatch: {name}")
487
+ + return weights
488
+ +
489
+ + @property
490
+ + def cast_predicate(self):
491
+ + return self.language_model.cast_predicate
492
+ diff --git a/mlx_lm/utils.py b/mlx_lm/utils.py
493
+ index a00fed8..6a751a2 100644
494
+ --- a/mlx_lm/utils.py
495
+ +++ b/mlx_lm/utils.py
496
+ @@ -195,6 +195,13 @@ def _transform_awq_weights(
497
+ return new_weights, mlx_quantization
498
+
499
+
500
+ +def _is_complete_qwen3_5(config: dict) -> bool:
501
+ + return (
502
+ + config.get("model_type") == "qwen3_5"
503
+ + and config.get("language_model_only") is False
504
+ + )
505
+ +
506
+ +
507
+ def _get_classes(config: dict):
508
+ """
509
+ Retrieve the model and model args classes based on the configuration.
510
+ @@ -216,6 +223,8 @@ def _get_classes(config: dict):
511
+ break
512
+ else:
513
+ model_type = MODEL_REMAPPING.get(model_type, model_type)
514
+ + if _is_complete_qwen3_5(config):
515
+ + model_type = "qwen3_5_full"
516
+ try:
517
+ arch = importlib.import_module(f"mlx_lm.models.{model_type}")
518
+ except ImportError as e:
519
+ @@ -446,12 +455,35 @@ def load_model(
520
+
521
+ weight_files = glob.glob(str(model_path / "model*.safetensors"))
522
+
523
+ + complete_qwen = _is_complete_qwen3_5(config)
524
+ + if complete_qwen:
525
+ + with open(model_path / "model.safetensors.index.json") as stream:
526
+ + index = json.load(stream)
527
+ + expected_files = set(index["weight_map"].values())
528
+ + actual_files = {Path(file).name for file in weight_files}
529
+ + if actual_files != expected_files:
530
+ + raise ValueError(
531
+ + "Incomplete full-model checkpoint: "
532
+ + f"missing shards={sorted(expected_files - actual_files)}, "
533
+ + f"unexpected shards={sorted(actual_files - expected_files)}"
534
+ + )
535
+ +
536
+ if not weight_files and strict:
537
+ raise FileNotFoundError(f"No safetensors found in {model_path}")
538
+
539
+ weights = {}
540
+ for wf in weight_files:
541
+ - weights.update(mx.load(wf))
542
+ + shard = mx.load(wf)
543
+ + if complete_qwen:
544
+ + duplicates = weights.keys() & shard.keys()
545
+ + if duplicates:
546
+ + raise ValueError(f"Duplicate checkpoint tensors: {sorted(duplicates)}")
547
+ + for name in shard:
548
+ + if index["weight_map"].get(name) != Path(wf).name:
549
+ + raise ValueError(f"Checkpoint index mismatch: {name}")
550
+ + weights.update(shard)
551
+ + if complete_qwen and weights.keys() != index["weight_map"].keys():
552
+ + raise ValueError("Checkpoint tensor set does not match its index")
553
+
554
+ if (model_file := config.get("model_file")) is not None:
555
+ if not trust_remote_code:
556
+ @@ -1064,9 +1096,11 @@ def save_config(
557
+ config (dict): The model configuration.
558
+ config_path (Union[str, Path]): Model configuration file path.
559
+ """
560
+ - # Clean unused keys
561
+ + config = copy.deepcopy(config)
562
+ + # Complete multimodal checkpoints need the vision architecture on reload.
563
+ config.pop("_name_or_path", None)
564
+ - config.pop("vision_config", None)
565
+ + if not _is_complete_qwen3_5(config):
566
+ + config.pop("vision_config", None)
567
+ if "quantization" in config:
568
+ config["quantization_config"] = config["quantization"]
569
+
570
+ @@ -1099,7 +1133,8 @@ def save(
571
+ save_config(config, config_path=dst_path / "config.json")
572
+ tokenizer.save_pretrained(dst_path)
573
+
574
+ - for p in ["*.py", "generation_config.json"]:
575
+ + extra_files = getattr(model, "extra_save_files", ())
576
+ + for p in ["*.py", "generation_config.json", *extra_files]:
577
+ for file in glob.glob(str(src_path / p)):
578
+ shutil.copy(file, dst_path)
579
+
580
+ diff --git a/tests/test_qwen3_5_full.py b/tests/test_qwen3_5_full.py
581
+ new file mode 100644
582
+ index 0000000..2b3e5ae
583
+ --- /dev/null
584
+ +++ b/tests/test_qwen3_5_full.py
585
+ @@ -0,0 +1,377 @@
586
+ +# Copyright © 2026 Apple Inc.
587
+ +
588
+ +"""Small synthetic fixtures test architecture code, not Swift model quality."""
589
+ +
590
+ +import copy
591
+ +import json
592
+ +from pathlib import Path
593
+ +from unittest.mock import patch
594
+ +
595
+ +import mlx.core as mx
596
+ +import numpy as np
597
+ +import pytest
598
+ +import torch
599
+ +from mlx.utils import tree_flatten
600
+ +from mlx_lm.convert import convert
601
+ +from mlx_lm.models.qwen3_5_full import Model, ModelArgs, OffsetRMSNorm
602
+ +from mlx_lm.utils import _get_classes, load_model, save_config
603
+ +from transformers import Qwen3_5Config, Qwen3_5ForConditionalGeneration
604
+ +from transformers.models.qwen3_5.modeling_qwen3_5 import (
605
+ + Qwen3_5DecoderLayer,
606
+ + Qwen3_5RMSNorm,
607
+ + Qwen3_5TextRotaryEmbedding,
608
+ +)
609
+ +
610
+ +
611
+ +def small_config():
612
+ + return {
613
+ + "model_type": "qwen3_5",
614
+ + "architectures": ["Qwen3_5ForConditionalGeneration"],
615
+ + "language_model_only": False,
616
+ + "tie_word_embeddings": False,
617
+ + "image_token_id": 125,
618
+ + "video_token_id": 126,
619
+ + "vision_start_token_id": 127,
620
+ + "text_config": {
621
+ + "model_type": "qwen3_5_text",
622
+ + "hidden_size": 128,
623
+ + "intermediate_size": 256,
624
+ + "num_hidden_layers": 4,
625
+ + "num_attention_heads": 4,
626
+ + "num_key_value_heads": 2,
627
+ + "head_dim": 32,
628
+ + "vocab_size": 128,
629
+ + "full_attention_interval": 4,
630
+ + "layer_types": ["linear_attention"] * 3 + ["full_attention"],
631
+ + "linear_num_key_heads": 2,
632
+ + "linear_num_value_heads": 4,
633
+ + "linear_key_head_dim": 32,
634
+ + "linear_value_head_dim": 32,
635
+ + "linear_conv_kernel_dim": 4,
636
+ + "hidden_act": "silu",
637
+ + "attn_output_gate": True,
638
+ + "output_gate_type": "swish",
639
+ + "mamba_ssm_dtype": "float32",
640
+ + "rms_norm_eps": 1e-6,
641
+ + "max_position_embeddings": 256,
642
+ + "tie_word_embeddings": False,
643
+ + "attention_bias": False,
644
+ + "attention_dropout": 0.0,
645
+ + "mtp_num_hidden_layers": 1,
646
+ + "mtp_use_dedicated_embeddings": False,
647
+ + "rope_parameters": {
648
+ + "rope_type": "default",
649
+ + "rope_theta": 10000000,
650
+ + "partial_rotary_factor": 0.5,
651
+ + "mrope_interleaved": True,
652
+ + "mrope_section": [3, 3, 2],
653
+ + },
654
+ + },
655
+ + "vision_config": {
656
+ + "model_type": "qwen3_5",
657
+ + "depth": 2,
658
+ + "hidden_size": 32,
659
+ + "intermediate_size": 48,
660
+ + "num_heads": 4,
661
+ + "out_hidden_size": 128,
662
+ + "num_position_embeddings": 16,
663
+ + "patch_size": 2,
664
+ + "temporal_patch_size": 2,
665
+ + "spatial_merge_size": 2,
666
+ + "in_channels": 3,
667
+ + "hidden_act": "gelu_pytorch_tanh",
668
+ + "deepstack_visual_indexes": [],
669
+ + },
670
+ + }
671
+ +
672
+ +
673
+ +class ReferenceMTP(torch.nn.Module):
674
+ + """Single-step composition used by the source vLLM MTP implementation."""
675
+ +
676
+ + def __init__(self, args):
677
+ + super().__init__()
678
+ + h = args.hidden_size
679
+ + self.fc = torch.nn.Linear(2 * h, h, bias=False)
680
+ + self.pre_fc_norm_embedding = Qwen3_5RMSNorm(h, args.rms_norm_eps)
681
+ + self.pre_fc_norm_hidden = Qwen3_5RMSNorm(h, args.rms_norm_eps)
682
+ + self.layers = torch.nn.ModuleList([Qwen3_5DecoderLayer(args, 3)])
683
+ + self.norm = Qwen3_5RMSNorm(h, args.rms_norm_eps)
684
+ + self.rotary = Qwen3_5TextRotaryEmbedding(args)
685
+ +
686
+ + def forward(self, hidden, embeds):
687
+ + x = self.fc(
688
+ + torch.cat(
689
+ + [self.pre_fc_norm_embedding(embeds), self.pre_fc_norm_hidden(hidden)],
690
+ + dim=-1,
691
+ + )
692
+ + )
693
+ + positions = torch.arange(x.shape[1])[None, None].expand(3, x.shape[0], -1)
694
+ + rotary = self.rotary(x, positions)
695
+ + mask = torch.triu(
696
+ + torch.full((x.shape[0], 1, x.shape[1], x.shape[1]), float("-inf")),
697
+ + diagonal=1,
698
+ + )
699
+ + return self.norm(
700
+ + self.layers[0](x, position_embeddings=rotary, attention_mask=mask)
701
+ + )
702
+ +
703
+ +
704
+ +@pytest.fixture(scope="module")
705
+ +def reference():
706
+ + torch.set_num_threads(2)
707
+ + torch.manual_seed(71)
708
+ + config = small_config()
709
+ + hf_config = Qwen3_5Config(**copy.deepcopy(config))
710
+ + hf_config._attn_implementation = "eager"
711
+ + hf_config.text_config._attn_implementation = "eager"
712
+ + hf_config.vision_config._attn_implementation = "eager"
713
+ + hf = Qwen3_5ForConditionalGeneration(hf_config).eval()
714
+ + mtp = ReferenceMTP(hf_config.text_config).eval()
715
+ + with torch.no_grad():
716
+ + for module in (hf, mtp):
717
+ + for name, value in module.named_parameters():
718
+ + if "norm" in name and value.ndim == 1 and "model.visual" not in name:
719
+ + value.uniform_(-0.15, 0.15)
720
+ + state = {k: mx.array(v.detach().numpy()) for k, v in hf.state_dict().items()}
721
+ + state.update(
722
+ + {"mtp." + k: mx.array(v.detach().numpy()) for k, v in mtp.state_dict().items()}
723
+ + )
724
+ + model = Model(ModelArgs.from_dict(config))
725
+ + model.load_weights(list(model.sanitize(state).items()), strict=True)
726
+ + model.eval()
727
+ + return config, hf, mtp, state, model
728
+ +
729
+ +
730
+ +def assert_close(mlx_value, torch_value, atol=3e-5, rtol=3e-5):
731
+ + np.testing.assert_allclose(
732
+ + np.array(mlx_value), torch_value.detach().numpy(), atol=atol, rtol=rtol
733
+ + )
734
+ +
735
+ +
736
+ +def test_dispatch_and_mapping_preserve_every_component(reference):
737
+ + config, _, _, state, model = reference
738
+ + before = copy.deepcopy(config)
739
+ + cls, args = _get_classes(config)
740
+ + fresh = cls(args.from_dict(config))
741
+ + assert cls is Model
742
+ + assert config == before
743
+ + rows = fresh.weight_mapping()
744
+ + assert {r["source"] for r in rows} == set(state)
745
+ + assert len(rows) == len(dict(tree_flatten(model.parameters())))
746
+ + assert sum(r["category"] == "MTP" for r in rows) == 15
747
+ + assert sum(r["category"] == "vision" for r in rows) == 33
748
+ + assert model.language_model.lm_head is not model.model.embed_tokens
749
+ + assert not any("mtp.embed" in r["destination"] for r in rows)
750
+ +
751
+ +
752
+ +@pytest.mark.parametrize("prefix", ["model.language_model.", "model.visual.", "mtp."])
753
+ +def test_missing_critical_tensor_is_rejected(reference, prefix):
754
+ + _, _, _, state, model = reference
755
+ + missing = dict(state)
756
+ + missing.pop(next(k for k in state if k.startswith(prefix)))
757
+ + with pytest.raises(ValueError, match="missing="):
758
+ + model.sanitize(missing)
759
+ +
760
+ +
761
+ +def test_unexpected_and_misshaped_tensors_are_rejected(reference):
762
+ + _, _, _, state, model = reference
763
+ + with pytest.raises(ValueError, match="unexpected="):
764
+ + model.sanitize(dict(state, **{"mtp.unknown.weight": mx.zeros((1,))}))
765
+ + wrong = dict(state)
766
+ + wrong["mtp.fc.weight"] = mx.zeros((1,))
767
+ + with pytest.raises(ValueError, match="Shape mismatch"):
768
+ + model.sanitize(wrong)
769
+ +
770
+ +
771
+ +def test_native_mapping_is_idempotent_and_norm_values_are_exact(reference):
772
+ + _, _, _, state, model = reference
773
+ + once = model.sanitize(state)
774
+ + twice = model.sanitize(once)
775
+ + for key in once:
776
+ + np.testing.assert_array_equal(np.array(once[key]), np.array(twice[key]))
777
+ + for row in model.weight_mapping():
778
+ + if "norm" in row["source"]:
779
+ + np.testing.assert_array_equal(
780
+ + np.array(state[row["source"]]), np.array(once[row["destination"]])
781
+ + )
782
+ +
783
+ +
784
+ +def test_offset_norm_preserves_small_bf16_deltas():
785
+ + layer = OffsetRMSNorm(4)
786
+ + raw = mx.array([0.0001, -0.0002, 0.0003, -0.0004], dtype=mx.bfloat16)
787
+ + layer.weight = raw
788
+ + x = mx.array([[0.8, -1.2, 0.4, 2.0]], dtype=mx.bfloat16)
789
+ + torch_layer = Qwen3_5RMSNorm(4)
790
+ + torch_layer.weight.data.copy_(torch.tensor(np.array(raw.astype(mx.float32))))
791
+ + expected = torch_layer(
792
+ + torch.tensor(np.array(x.astype(mx.float32))).to(torch.bfloat16)
793
+ + ).float()
794
+ + assert_close(layer(x).astype(mx.float32), expected, atol=0, rtol=0)
795
+ + np.testing.assert_array_equal(
796
+ + np.array(layer.weight.astype(mx.float32)), np.array(raw.astype(mx.float32))
797
+ + )
798
+ +
799
+ +
800
+ +def test_text_forward_matches_transformers(reference):
801
+ + _, hf, _, _, model = reference
802
+ + ids = torch.tensor([[3, 19, 8, 21, 11]])
803
+ + with torch.no_grad():
804
+ + expected = hf(input_ids=ids, use_cache=False).logits
805
+ + actual = model(mx.array(ids.numpy()))
806
+ + assert_close(actual, expected)
807
+ +
808
+ +
809
+ +def test_text_decode_cache_matches_full_forward(reference):
810
+ + _, _, _, _, model = reference
811
+ + ids = mx.array([[3, 19, 8, 21, 11]])
812
+ + full = model(ids)
813
+ + cache = model.make_cache()
814
+ + parts = [model(ids[:, :3], cache)]
815
+ + parts.extend(model(ids[:, i : i + 1], cache) for i in range(3, 5))
816
+ + np.testing.assert_allclose(
817
+ + np.array(mx.concatenate(parts, axis=1)), np.array(full), atol=3e-5, rtol=3e-5
818
+ + )
819
+ +
820
+ +
821
+ +@pytest.mark.parametrize("grid", [[[1, 4, 4]], [[2, 2, 4], [1, 4, 2]], [[1, 6, 4]]])
822
+ +def test_vision_encoder_matches_transformers(reference, grid):
823
+ + _, hf, _, _, model = reference
824
+ + torch.manual_seed(11)
825
+ + count = sum(t * h * w for t, h, w in grid)
826
+ + pixels = torch.randn(count, 3 * 2 * 2 * 2)
827
+ + with torch.no_grad():
828
+ + expected = hf.model.visual(pixels, torch.tensor(grid))
829
+ + hidden, pooled = model.visual(
830
+ + mx.array(pixels.numpy()), grid, return_hidden_states=True
831
+ + )
832
+ + assert_close(hidden, expected.last_hidden_state)
833
+ + assert_close(pooled, expected.pooler_output)
834
+ +
835
+ +
836
+ +def test_mtp_forward_and_shared_head_match_reference(reference):
837
+ + _, hf, mtp, _, model = reference
838
+ + torch.manual_seed(9)
839
+ + hidden = torch.randn(1, 4, 128)
840
+ + ids = torch.tensor([[9, 8, 7, 6]])
841
+ + with torch.no_grad():
842
+ + embeds = hf.model.language_model.embed_tokens(ids)
843
+ + expected = mtp(hidden, embeds)
844
+ + expected_logits = hf.lm_head(expected)
845
+ + assert_close(
846
+ + model.mtp(mx.array(hidden.numpy()), mx.array(embeds.numpy())), expected
847
+ + )
848
+ + assert_close(
849
+ + model.mtp_logits(mx.array(ids.numpy()), mx.array(hidden.numpy())),
850
+ + expected_logits,
851
+ + )
852
+ + cache = model.mtp.make_cache()
853
+ + cached = mx.concatenate(
854
+ + [
855
+ + model.mtp(
856
+ + mx.array(hidden[:, i : i + 1].numpy()),
857
+ + mx.array(embeds[:, i : i + 1].numpy()),
858
+ + cache,
859
+ + )
860
+ + for i in range(4)
861
+ + ],
862
+ + axis=1,
863
+ + )
864
+ + assert_close(cached, expected)
865
+ +
866
+ +
867
+ +def test_unsupported_multimodal_generation_fails_explicitly(reference):
868
+ + _, _, _, _, model = reference
869
+ + with pytest.raises(NotImplementedError, match="Multimodal"):
870
+ + model(mx.array([[1, 2]]), pixel_values=mx.zeros((1, 24)))
871
+ + with pytest.raises(NotImplementedError, match="Multimodal"):
872
+ + model(mx.array([[1, 125]]))
873
+ +
874
+ +
875
+ +def test_save_config_keeps_vision_and_does_not_mutate_input(tmp_path):
876
+ + config = small_config()
877
+ + before = copy.deepcopy(config)
878
+ + save_config(config, tmp_path / "config.json")
879
+ + assert config == before
880
+ + assert json.loads((tmp_path / "config.json").read_text()) == before
881
+ +
882
+ +
883
+ +def test_official_nonquantized_convert_and_reload_preserve_all_tensors(
884
+ + reference, tmp_path
885
+ +):
886
+ + config, _, _, state, model = reference
887
+ + source, output = tmp_path / "hf", tmp_path / "mlx"
888
+ + source.mkdir()
889
+ + (source / "config.json").write_text(json.dumps(config))
890
+ + mx.save_safetensors(str(source / "model.safetensors"), state)
891
+ + (source / "model.safetensors.index.json").write_text(
892
+ + json.dumps({"weight_map": {k: "model.safetensors" for k in state}})
893
+ + )
894
+ + assets = ["generation_config.json", *model.extra_save_files]
895
+ + for name in assets:
896
+ + (source / name).write_text("original synthetic asset: " + name)
897
+ + (source / "generation_config.json").write_text('{"eos_token_id": 2}')
898
+ +
899
+ + class FixtureTokenizer:
900
+ + def save_pretrained(self, target):
901
+ + Path(target, "tokenizer_config.json").write_text("rewritten")
902
+ +
903
+ + def fixture_load(path, **kwargs):
904
+ + loaded, loaded_config = load_model(Path(path), lazy=True, strict=True)
905
+ + return loaded, FixtureTokenizer(), loaded_config
906
+ +
907
+ + with patch("mlx_lm.convert.load", side_effect=fixture_load):
908
+ + convert(str(source), str(output), quantize=False)
909
+ + loaded, saved_config = load_model(output, lazy=False, strict=True)
910
+ + expected = model.sanitize(state)
911
+ + actual = dict(tree_flatten(loaded.parameters()))
912
+ + assert set(actual) == set(expected)
913
+ + for name in actual:
914
+ + np.testing.assert_array_equal(np.array(actual[name]), np.array(expected[name]))
915
+ + assert saved_config["vision_config"] == config["vision_config"]
916
+ + assert saved_config["text_config"] == config["text_config"]
917
+ + assert "quantization" not in saved_config
918
+ + for name in assets:
919
+ + assert (source / name).read_bytes() == (output / name).read_bytes()
920
+ + ids = mx.array([[3, 19, 8]])
921
+ + np.testing.assert_array_equal(np.array(model(ids)), np.array(loaded(ids)))
922
+ + (output / "model.safetensors.index.json").write_text(
923
+ + json.dumps(
924
+ + {
925
+ + "weight_map": {
926
+ + **{k: "model.safetensors" for k in actual},
927
+ + "mtp.missing.weight": "missing.safetensors",
928
+ + }
929
+ + }
930
+ + )
931
+ + )
932
+ + with pytest.raises(ValueError, match="missing shards"):
933
+ + load_model(output, lazy=True)
934
+ +
935
+ +
936
+ +def test_fixed_affine_quantized_roundtrip_preserves_component_tree(reference, tmp_path):
937
+ + from mlx_lm.utils import quantize_model, save_model
938
+ +
939
+ + config, _, _, state, _ = reference
940
+ + model = Model(ModelArgs.from_dict(config))
941
+ + model.load_weights(list(model.sanitize(state).items()), strict=True)
942
+ + original_names = set(dict(tree_flatten(model.parameters())))
943
+ + model, quantized_config = quantize_model(model, config, 64, 4, mode="affine")
944
+ + save_model(tmp_path, model)
945
+ + save_config(quantized_config, tmp_path / "config.json")
946
+ + loaded, saved_config = load_model(tmp_path, lazy=False, strict=True)
947
+ + actual = dict(tree_flatten(loaded.parameters()))
948
+ + expected = dict(tree_flatten(model.parameters()))
949
+ + assert set(actual) == set(expected)
950
+ + assert original_names <= set(actual)
951
+ + assert saved_config["quantization"] == {
952
+ + "bits": 4,
953
+ + "group_size": 64,
954
+ + "mode": "affine",
955
+ + }
956
+ + for name in actual:
957
+ + np.testing.assert_array_equal(np.array(actual[name]), np.array(expected[name]))
958
+ + assert bool(mx.all(mx.isfinite(loaded(mx.array([[3, 19, 8]])))))
959
+ + missing = dict(actual)
960
+ + missing.pop("mtp.fc.scales")
961
+ + with pytest.raises(ValueError, match="Incomplete native checkpoint"):
962
+ + loaded.sanitize(missing)
config.json ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "Qwen3_5ForConditionalGeneration"
4
+ ],
5
+ "eos_token_id": [
6
+ 248046,
7
+ 248044
8
+ ],
9
+ "image_token_id": 248056,
10
+ "language_model_only": false,
11
+ "model_type": "qwen3_5",
12
+ "quantization": {
13
+ "group_size": 64,
14
+ "bits": 5,
15
+ "mode": "affine"
16
+ },
17
+ "quantization_config": {
18
+ "group_size": 64,
19
+ "bits": 5,
20
+ "mode": "affine"
21
+ },
22
+ "text_config": {
23
+ "attention_bias": false,
24
+ "attention_dropout": 0.0,
25
+ "attn_output_gate": true,
26
+ "bos_token_id": 248044,
27
+ "dtype": "bfloat16",
28
+ "eos_token_id": 248044,
29
+ "full_attention_interval": 4,
30
+ "head_dim": 256,
31
+ "hidden_act": "silu",
32
+ "hidden_size": 5120,
33
+ "initializer_range": 0.02,
34
+ "intermediate_size": 17408,
35
+ "layer_types": [
36
+ "linear_attention",
37
+ "linear_attention",
38
+ "linear_attention",
39
+ "full_attention",
40
+ "linear_attention",
41
+ "linear_attention",
42
+ "linear_attention",
43
+ "full_attention",
44
+ "linear_attention",
45
+ "linear_attention",
46
+ "linear_attention",
47
+ "full_attention",
48
+ "linear_attention",
49
+ "linear_attention",
50
+ "linear_attention",
51
+ "full_attention",
52
+ "linear_attention",
53
+ "linear_attention",
54
+ "linear_attention",
55
+ "full_attention",
56
+ "linear_attention",
57
+ "linear_attention",
58
+ "linear_attention",
59
+ "full_attention",
60
+ "linear_attention",
61
+ "linear_attention",
62
+ "linear_attention",
63
+ "full_attention",
64
+ "linear_attention",
65
+ "linear_attention",
66
+ "linear_attention",
67
+ "full_attention",
68
+ "linear_attention",
69
+ "linear_attention",
70
+ "linear_attention",
71
+ "full_attention",
72
+ "linear_attention",
73
+ "linear_attention",
74
+ "linear_attention",
75
+ "full_attention",
76
+ "linear_attention",
77
+ "linear_attention",
78
+ "linear_attention",
79
+ "full_attention",
80
+ "linear_attention",
81
+ "linear_attention",
82
+ "linear_attention",
83
+ "full_attention",
84
+ "linear_attention",
85
+ "linear_attention",
86
+ "linear_attention",
87
+ "full_attention",
88
+ "linear_attention",
89
+ "linear_attention",
90
+ "linear_attention",
91
+ "full_attention",
92
+ "linear_attention",
93
+ "linear_attention",
94
+ "linear_attention",
95
+ "full_attention",
96
+ "linear_attention",
97
+ "linear_attention",
98
+ "linear_attention",
99
+ "full_attention"
100
+ ],
101
+ "linear_conv_kernel_dim": 4,
102
+ "linear_key_head_dim": 128,
103
+ "linear_num_key_heads": 16,
104
+ "linear_num_value_heads": 48,
105
+ "linear_value_head_dim": 128,
106
+ "mamba_ssm_dtype": "float32",
107
+ "max_position_embeddings": 262144,
108
+ "model_type": "qwen3_5_text",
109
+ "mtp_num_hidden_layers": 1,
110
+ "mtp_use_dedicated_embeddings": false,
111
+ "num_attention_heads": 24,
112
+ "num_hidden_layers": 64,
113
+ "num_key_value_heads": 4,
114
+ "output_gate_type": "swish",
115
+ "pad_token_id": null,
116
+ "partial_rotary_factor": 0.25,
117
+ "rms_norm_eps": 1e-06,
118
+ "rope_parameters": {
119
+ "mrope_interleaved": true,
120
+ "mrope_section": [
121
+ 11,
122
+ 11,
123
+ 10
124
+ ],
125
+ "partial_rotary_factor": 0.25,
126
+ "rope_theta": 10000000,
127
+ "rope_type": "default"
128
+ },
129
+ "tie_word_embeddings": false,
130
+ "use_cache": true,
131
+ "vocab_size": 248320
132
+ },
133
+ "tie_word_embeddings": false,
134
+ "transformers_version": "5.8.0.dev0",
135
+ "video_token_id": 248057,
136
+ "vision_config": {
137
+ "deepstack_visual_indexes": [],
138
+ "depth": 27,
139
+ "hidden_act": "gelu_pytorch_tanh",
140
+ "hidden_size": 1152,
141
+ "in_channels": 3,
142
+ "initializer_range": 0.02,
143
+ "intermediate_size": 4304,
144
+ "model_type": "qwen3_5",
145
+ "num_heads": 16,
146
+ "num_position_embeddings": 2304,
147
+ "out_hidden_size": 5120,
148
+ "patch_size": 16,
149
+ "spatial_merge_size": 2,
150
+ "temporal_patch_size": 2
151
+ },
152
+ "vision_end_token_id": 248054,
153
+ "vision_start_token_id": 248053
154
+ }
generation_config.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token_id": 248044,
3
+ "do_sample": true,
4
+ "eos_token_id": [
5
+ 248046,
6
+ 248044
7
+ ],
8
+ "pad_token_id": 248044,
9
+ "temperature": 1.0,
10
+ "top_k": 20,
11
+ "top_p": 0.95
12
+ }
merges.txt ADDED
The diff for this file is too large to render. See raw diff
 
model-00001-of-00004.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9da8750595ec42d8c5d2ff0ae0b695e387cbcb3c0beac40f262e6d9a7196b59d
3
+ size 5360417859
model-00002-of-00004.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b592723bd4e9f01344335cd7d4b4f41a7c8cde98e2e074ad1d943cdb951a6835
3
+ size 5338181777
model-00003-of-00004.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0027e7fe05310d5b2d960414221ed0872de9b511aa7e6b1c3a8f0e4647558412
3
+ size 5355925620
model-00004-of-00004.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:afec577f16805b327471561d6841662eb4acf7d866ad5e761c5ef8cd3149d8f4
3
+ size 3227578201
model.safetensors.index.json ADDED
The diff for this file is too large to render. See raw diff
 
preprocessor_config.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "size": {
3
+ "longest_edge": 16777216,
4
+ "shortest_edge": 65536
5
+ },
6
+ "patch_size": 16,
7
+ "temporal_patch_size": 2,
8
+ "merge_size": 2,
9
+ "image_mean": [
10
+ 0.5,
11
+ 0.5,
12
+ 0.5
13
+ ],
14
+ "image_std": [
15
+ 0.5,
16
+ 0.5,
17
+ 0.5
18
+ ],
19
+ "processor_class": "Qwen3VLProcessor",
20
+ "image_processor_type": "Qwen2VLImageProcessorFast"
21
+ }
swift-1.5-planet-demo.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1cda6924169e8b83e5d6d7299baf8329ed1b1a182a481aa0e06344e0f5c00111
3
+ size 4738825
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0997f410c57a1f4e53b09e4be8f4a172d90edd9564368fb0847030937229b9f3
3
+ size 12809320
tokenizer_config.json ADDED
@@ -0,0 +1,305 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": false,
3
+ "added_tokens_decoder": {
4
+ "248044": {
5
+ "content": "<|endoftext|>",
6
+ "lstrip": false,
7
+ "normalized": false,
8
+ "rstrip": false,
9
+ "single_word": false,
10
+ "special": true
11
+ },
12
+ "248045": {
13
+ "content": "<|im_start|>",
14
+ "lstrip": false,
15
+ "normalized": false,
16
+ "rstrip": false,
17
+ "single_word": false,
18
+ "special": true
19
+ },
20
+ "248046": {
21
+ "content": "<|im_end|>",
22
+ "lstrip": false,
23
+ "normalized": false,
24
+ "rstrip": false,
25
+ "single_word": false,
26
+ "special": true
27
+ },
28
+ "248047": {
29
+ "content": "<|object_ref_start|>",
30
+ "lstrip": false,
31
+ "normalized": false,
32
+ "rstrip": false,
33
+ "single_word": false,
34
+ "special": true
35
+ },
36
+ "248048": {
37
+ "content": "<|object_ref_end|>",
38
+ "lstrip": false,
39
+ "normalized": false,
40
+ "rstrip": false,
41
+ "single_word": false,
42
+ "special": true
43
+ },
44
+ "248049": {
45
+ "content": "<|box_start|>",
46
+ "lstrip": false,
47
+ "normalized": false,
48
+ "rstrip": false,
49
+ "single_word": false,
50
+ "special": true
51
+ },
52
+ "248050": {
53
+ "content": "<|box_end|>",
54
+ "lstrip": false,
55
+ "normalized": false,
56
+ "rstrip": false,
57
+ "single_word": false,
58
+ "special": true
59
+ },
60
+ "248051": {
61
+ "content": "<|quad_start|>",
62
+ "lstrip": false,
63
+ "normalized": false,
64
+ "rstrip": false,
65
+ "single_word": false,
66
+ "special": true
67
+ },
68
+ "248052": {
69
+ "content": "<|quad_end|>",
70
+ "lstrip": false,
71
+ "normalized": false,
72
+ "rstrip": false,
73
+ "single_word": false,
74
+ "special": true
75
+ },
76
+ "248053": {
77
+ "content": "<|vision_start|>",
78
+ "lstrip": false,
79
+ "normalized": false,
80
+ "rstrip": false,
81
+ "single_word": false,
82
+ "special": true
83
+ },
84
+ "248054": {
85
+ "content": "<|vision_end|>",
86
+ "lstrip": false,
87
+ "normalized": false,
88
+ "rstrip": false,
89
+ "single_word": false,
90
+ "special": true
91
+ },
92
+ "248055": {
93
+ "content": "<|vision_pad|>",
94
+ "lstrip": false,
95
+ "normalized": false,
96
+ "rstrip": false,
97
+ "single_word": false,
98
+ "special": true
99
+ },
100
+ "248056": {
101
+ "content": "<|image_pad|>",
102
+ "lstrip": false,
103
+ "normalized": false,
104
+ "rstrip": false,
105
+ "single_word": false,
106
+ "special": true
107
+ },
108
+ "248057": {
109
+ "content": "<|video_pad|>",
110
+ "lstrip": false,
111
+ "normalized": false,
112
+ "rstrip": false,
113
+ "single_word": false,
114
+ "special": true
115
+ },
116
+ "248058": {
117
+ "content": "<tool_call>",
118
+ "lstrip": false,
119
+ "normalized": false,
120
+ "rstrip": false,
121
+ "single_word": false,
122
+ "special": false
123
+ },
124
+ "248059": {
125
+ "content": "</tool_call>",
126
+ "lstrip": false,
127
+ "normalized": false,
128
+ "rstrip": false,
129
+ "single_word": false,
130
+ "special": false
131
+ },
132
+ "248060": {
133
+ "content": "<|fim_prefix|>",
134
+ "lstrip": false,
135
+ "normalized": false,
136
+ "rstrip": false,
137
+ "single_word": false,
138
+ "special": false
139
+ },
140
+ "248061": {
141
+ "content": "<|fim_middle|>",
142
+ "lstrip": false,
143
+ "normalized": false,
144
+ "rstrip": false,
145
+ "single_word": false,
146
+ "special": false
147
+ },
148
+ "248062": {
149
+ "content": "<|fim_suffix|>",
150
+ "lstrip": false,
151
+ "normalized": false,
152
+ "rstrip": false,
153
+ "single_word": false,
154
+ "special": false
155
+ },
156
+ "248063": {
157
+ "content": "<|fim_pad|>",
158
+ "lstrip": false,
159
+ "normalized": false,
160
+ "rstrip": false,
161
+ "single_word": false,
162
+ "special": false
163
+ },
164
+ "248064": {
165
+ "content": "<|repo_name|>",
166
+ "lstrip": false,
167
+ "normalized": false,
168
+ "rstrip": false,
169
+ "single_word": false,
170
+ "special": false
171
+ },
172
+ "248065": {
173
+ "content": "<|file_sep|>",
174
+ "lstrip": false,
175
+ "normalized": false,
176
+ "rstrip": false,
177
+ "single_word": false,
178
+ "special": false
179
+ },
180
+ "248066": {
181
+ "content": "<tool_response>",
182
+ "lstrip": false,
183
+ "normalized": false,
184
+ "rstrip": false,
185
+ "single_word": false,
186
+ "special": false
187
+ },
188
+ "248067": {
189
+ "content": "</tool_response>",
190
+ "lstrip": false,
191
+ "normalized": false,
192
+ "rstrip": false,
193
+ "single_word": false,
194
+ "special": false
195
+ },
196
+ "248068": {
197
+ "content": "<think>",
198
+ "lstrip": false,
199
+ "normalized": false,
200
+ "rstrip": false,
201
+ "single_word": false,
202
+ "special": false
203
+ },
204
+ "248069": {
205
+ "content": "</think>",
206
+ "lstrip": false,
207
+ "normalized": false,
208
+ "rstrip": false,
209
+ "single_word": false,
210
+ "special": false
211
+ },
212
+ "248070": {
213
+ "content": "<|audio_start|>",
214
+ "lstrip": false,
215
+ "normalized": false,
216
+ "rstrip": false,
217
+ "single_word": false,
218
+ "special": true
219
+ },
220
+ "248071": {
221
+ "content": "<|audio_end|>",
222
+ "lstrip": false,
223
+ "normalized": false,
224
+ "rstrip": false,
225
+ "single_word": false,
226
+ "special": true
227
+ },
228
+ "248072": {
229
+ "content": "<tts_pad>",
230
+ "lstrip": false,
231
+ "normalized": false,
232
+ "rstrip": false,
233
+ "single_word": false,
234
+ "special": true
235
+ },
236
+ "248073": {
237
+ "content": "<tts_text_bos>",
238
+ "lstrip": false,
239
+ "normalized": false,
240
+ "rstrip": false,
241
+ "single_word": false,
242
+ "special": true
243
+ },
244
+ "248074": {
245
+ "content": "<tts_text_eod>",
246
+ "lstrip": false,
247
+ "normalized": false,
248
+ "rstrip": false,
249
+ "single_word": false,
250
+ "special": true
251
+ },
252
+ "248075": {
253
+ "content": "<tts_text_bos_single>",
254
+ "lstrip": false,
255
+ "normalized": false,
256
+ "rstrip": false,
257
+ "single_word": false,
258
+ "special": true
259
+ },
260
+ "248076": {
261
+ "content": "<|audio_pad|>",
262
+ "lstrip": false,
263
+ "normalized": false,
264
+ "rstrip": false,
265
+ "single_word": false,
266
+ "special": true
267
+ }
268
+ },
269
+ "additional_special_tokens": [
270
+ "<|im_start|>",
271
+ "<|im_end|>",
272
+ "<|object_ref_start|>",
273
+ "<|object_ref_end|>",
274
+ "<|box_start|>",
275
+ "<|box_end|>",
276
+ "<|quad_start|>",
277
+ "<|quad_end|>",
278
+ "<|vision_start|>",
279
+ "<|vision_end|>",
280
+ "<|vision_pad|>",
281
+ "<|image_pad|>",
282
+ "<|video_pad|>"
283
+ ],
284
+ "bos_token": null,
285
+ "chat_template": "{%- set image_count = namespace(value=0) %}\n{%- set video_count = namespace(value=0) %}\n{%- macro render_content(content, do_vision_count, is_system_content=false) %}\n {%- if content is string %}\n {{- content }}\n {%- elif content is iterable and content is not mapping %}\n {%- for item in content %}\n {%- if 'image' in item or 'image_url' in item or item.type == 'image' %}\n {%- if is_system_content %}\n {{- raise_exception('System message cannot contain images.') }}\n {%- endif %}\n {%- if do_vision_count %}\n {%- set image_count.value = image_count.value + 1 %}\n {%- endif %}\n {%- if add_vision_id %}\n {{- 'Picture ' ~ image_count.value ~ ': ' }}\n {%- endif %}\n {{- '<|vision_start|><|image_pad|><|vision_end|>' }}\n {%- elif 'video' in item or item.type == 'video' %}\n {%- if is_system_content %}\n {{- raise_exception('System message cannot contain videos.') }}\n {%- endif %}\n {%- if do_vision_count %}\n {%- set video_count.value = video_count.value + 1 %}\n {%- endif %}\n {%- if add_vision_id %}\n {{- 'Video ' ~ video_count.value ~ ': ' }}\n {%- endif %}\n {{- '<|vision_start|><|video_pad|><|vision_end|>' }}\n {%- elif 'text' in item %}\n {{- item.text }}\n {%- else %}\n {{- raise_exception('Unexpected item type in content.') }}\n {%- endif %}\n {%- endfor %}\n {%- elif content is none or content is undefined %}\n {{- '' }}\n {%- else %}\n {{- raise_exception('Unexpected content type.') }}\n {%- endif %}\n{%- endmacro %}\n{%- if not messages %}\n {{- raise_exception('No messages provided.') }}\n{%- endif %}\n{%- set reasoning_instructions = '' %}\n{%- if enable_thinking is undefined or enable_thinking is true %}\n {%- set resolved_reasoning_effort = reasoning_effort|default('xhigh') %}\n {%- if resolved_reasoning_effort not in ('xhigh', 'medium', 'low') %}\n {{- raise_exception('Unexpected reasoning effort ' ~ reasoning_effort ~ '. Supported types are xhigh (default), medium, and low.') }}\n {%- endif %}\n {%- if resolved_reasoning_effort == 'xhigh' %}\n {%- set reasoning_instructions = 'Reasoning effort is set to xhigh. Please think carefully through the task, validate key assumptions, consider plausible alternatives, and prioritize correctness, consistency, and clarity in the final answer.' %}\n {%- elif resolved_reasoning_effort == 'low' %}\n {%- set reasoning_instructions = 'Reasoning effort is set to low. Keep your thinking brief and focused, moving directly to the conclusion without unnecessary elaboration.' %}\n {%- endif %}\n{%- endif %}\n{%- if tools and tools is iterable and tools is not mapping %}\n {{- '<|im_start|>system\\n' }}\n {%- if reasoning_instructions %}\n {{- reasoning_instructions + '\\n\\n' }}\n {%- endif %}\n {{- \"# Tools\\n\\nYou have access to the following functions:\\n\\n<tools>\" }}\n {%- for tool in tools %}\n {{- \"\\n\" }}\n {{- tool | tojson }}\n {%- endfor %}\n {{- \"\\n</tools>\" }}\n {{- '\\n\\nIf you choose to call a function ONLY reply in the following format with NO suffix:\\n\\n<tool_call>\\n<function=example_function_name>\\n<parameter=example_parameter_1>\\nvalue_1\\n</parameter>\\n<parameter=example_parameter_2>\\nThis is the value for the second parameter\\nthat can span\\nmultiple lines\\n</parameter>\\n</function>\\n</tool_call>\\n\\n<IMPORTANT>\\nReminder:\\n- Function calls MUST follow the specified format: an inner <function=...></function> block must be nested within <tool_call></tool_call> XML tags\\n- Required parameters MUST be specified\\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\\n- If there is no function call available, answer the question like normal with your current knowledge and do not tell the user about function calls\\n</IMPORTANT>' }}\n {%- if messages[0].role == 'system' %}\n {%- set content = render_content(messages[0].content, false, true)|trim %}\n {%- if content %}\n {{- '\\n\\n' + content }}\n {%- endif %}\n {%- endif %}\n {{- '<|im_end|>\\n' }}\n{%- else %}\n {%- if messages[0].role == 'system' %}\n {%- set content = render_content(messages[0].content, false, true)|trim %}\n {%- if content %}\n {{- '<|im_start|>system\\n' + (reasoning_instructions + '\\n\\n' if reasoning_instructions else '') + content + '<|im_end|>\\n' }}\n {%- elif reasoning_instructions %}\n {{- '<|im_start|>system\\n' + reasoning_instructions + '<|im_end|>\\n' }}\n {%- endif %}\n {%- elif reasoning_instructions %}\n {{- '<|im_start|>system\\n' + reasoning_instructions + '<|im_end|>\\n' }}\n {%- endif %}\n{%- endif %}\n{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}\n{%- for message in messages[::-1] %}\n {%- set index = (messages|length - 1) - loop.index0 %}\n {%- if ns.multi_step_tool and message.role == \"user\" %}\n {%- set content = render_content(message.content, false)|trim %}\n {%- if not(content.startswith('<tool_response>') and content.endswith('</tool_response>')) %}\n {%- set ns.multi_step_tool = false %}\n {%- set ns.last_query_index = index %}\n {%- endif %}\n {%- endif %}\n{%- endfor %}\n{%- if ns.multi_step_tool %}\n {{- raise_exception('No user query found in messages.') }}\n{%- endif %}\n{%- for message in messages %}\n {%- set content = render_content(message.content, true)|trim %}\n {%- if message.role == \"system\" %}\n {%- if not loop.first %}\n {{- raise_exception('System message must be at the beginning.') }}\n {%- endif %}\n {%- elif message.role == \"user\" %}\n {{- '<|im_start|>' + message.role + '\\n' + content + '<|im_end|>' + '\\n' }}\n {%- elif message.role == \"assistant\" %}\n {%- set reasoning_content = '' %}\n {%- if message.reasoning_content is string %}\n {%- set reasoning_content = message.reasoning_content %}\n {%- endif %}\n {%- set reasoning_content = reasoning_content|trim %}\n {%- if preserve_thinking is undefined or preserve_thinking is true or loop.index0 > ns.last_query_index %}\n {{- '<|im_start|>' + message.role + '\\n<think>\\n' + reasoning_content + '\\n</think>\\n\\n' + content }}\n {%- else %}\n {{- '<|im_start|>' + message.role + '\\n' + content }}\n {%- endif %}\n {%- if message.tool_calls and message.tool_calls is iterable and message.tool_calls is not mapping %}\n {%- for tool_call in message.tool_calls %}\n {%- if tool_call.function is defined %}\n {%- set tool_call = tool_call.function %}\n {%- endif %}\n {%- if loop.first %}\n {%- if content|trim %}\n {{- '\\n\\n<tool_call>\\n<function=' + tool_call.name + '>\\n' }}\n {%- else %}\n {{- '<tool_call>\\n<function=' + tool_call.name + '>\\n' }}\n {%- endif %}\n {%- else %}\n {{- '\\n<tool_call>\\n<function=' + tool_call.name + '>\\n' }}\n {%- endif %}\n {%- if tool_call.arguments is defined and tool_call.arguments != '' %}\n {%- for args_name, args_value in tool_call.arguments|items %}\n {{- '<parameter=' + args_name + '>\\n' }}\n {%- set args_value = args_value | string if args_value is string else args_value | tojson | safe %}\n {{- args_value }}\n {{- '\\n</parameter>\\n' }}\n {%- endfor %}\n {%- endif %}\n {{- '</function>\\n</tool_call>' }}\n {%- endfor %}\n {%- endif %}\n {{- '<|im_end|>\\n' }}\n {%- elif message.role == \"tool\" %}\n {%- if loop.previtem and loop.previtem.role != \"tool\" %}\n {{- '<|im_start|>user' }}\n {%- endif %}\n {{- '\\n<tool_response>\\n' }}\n {{- content }}\n {{- '\\n</tool_response>' }}\n {%- if not loop.last and loop.nextitem.role != \"tool\" %}\n {{- '<|im_end|>\\n' }}\n {%- elif loop.last %}\n {{- '<|im_end|>\\n' }}\n {%- endif %}\n {%- else %}\n {{- raise_exception('Unexpected message role.') }}\n {%- endif %}\n{%- endfor %}\n{%- if add_generation_prompt %}\n {{- '<|im_start|>assistant\\n' }}\n {%- if enable_thinking is defined and enable_thinking is false %}\n {{- '<think>\\n\\n</think>\\n\\n' }}\n {%- else %}\n {{- '<think>\\n' }}\n {%- endif %}\n{%- endif %}",
286
+ "clean_up_tokenization_spaces": false,
287
+ "eos_token": "<|im_end|>",
288
+ "errors": "replace",
289
+ "model_max_length": 262144,
290
+ "pad_token": "<|endoftext|>",
291
+ "split_special_tokens": false,
292
+ "tokenizer_class": "Qwen2Tokenizer",
293
+ "unk_token": null,
294
+ "add_bos_token": false,
295
+ "pretokenize_regex": "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?[\\p{L}\\p{M}]+|\\p{N}| ?[^\\s\\p{L}\\p{M}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+",
296
+ "extra_special_tokens": {
297
+ "audio_bos_token": "<|audio_start|>",
298
+ "audio_eos_token": "<|audio_end|>",
299
+ "audio_token": "<|audio_pad|>",
300
+ "image_token": "<|image_pad|>",
301
+ "video_token": "<|video_pad|>",
302
+ "vision_bos_token": "<|vision_start|>",
303
+ "vision_eos_token": "<|vision_end|>"
304
+ }
305
+ }
ukisai-banner.png ADDED

Git LFS Details

  • SHA256: 8577252b8b37e331f06f7ddecdf3bfa1c497e164f9eb36d78c37232d1b8492ca
  • Pointer size: 131 Bytes
  • Size of remote file: 308 kB
verify_release.py ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Offline, bounded-memory file/index integrity check. Does not execute model code."""
2
+ import argparse
3
+ import hashlib
4
+ import json
5
+ import math
6
+ from pathlib import Path, PurePosixPath
7
+ import re
8
+ import struct
9
+
10
+
11
+ def unique(pairs):
12
+ result = {}
13
+ for key, value in pairs:
14
+ if key in result:
15
+ raise ValueError('duplicate JSON key')
16
+ result[key] = value
17
+ return result
18
+
19
+
20
+ def read_json(path):
21
+ return json.loads(path.read_text(encoding='utf-8'), object_pairs_hook=unique)
22
+
23
+
24
+ def safe_path(root, name):
25
+ if not isinstance(name, str) or not name or '\\' in name:
26
+ raise ValueError('unsafe file path')
27
+ p = PurePosixPath(name)
28
+ if p.is_absolute() or '..' in p.parts or str(p) != name:
29
+ raise ValueError('unsafe file path')
30
+ target = root.joinpath(*p.parts)
31
+ if any(parent.is_symlink() for parent in (target, *target.parents) if parent != root.parent):
32
+ raise ValueError('symlink path not allowed')
33
+ target.resolve().relative_to(root.resolve())
34
+ return target
35
+
36
+
37
+ def file_hashes(path):
38
+ size = path.stat().st_size
39
+ sha = hashlib.sha256()
40
+ blob = hashlib.sha1(f'blob {size}\0'.encode())
41
+ with path.open('rb') as stream:
42
+ for chunk in iter(lambda: stream.read(8 * 1024**2), b''):
43
+ sha.update(chunk)
44
+ blob.update(chunk)
45
+ return size, sha.hexdigest(), blob.hexdigest()
46
+
47
+
48
+ def tensor_header(path):
49
+ size = path.stat().st_size
50
+ with path.open('rb') as stream:
51
+ prefix = stream.read(8)
52
+ if len(prefix) != 8:
53
+ raise ValueError('short safetensors prefix')
54
+ n = struct.unpack('<Q', prefix)[0]
55
+ if n > 16 * 1024**2 or 8+n > size:
56
+ raise ValueError('invalid header boundary')
57
+ header = json.loads(stream.read(n), object_pairs_hook=unique)
58
+ widths = {'BF16': 2, 'F16': 2, 'F32': 4, 'F64': 8, 'U32': 4, 'I32': 4,
59
+ 'U8': 1, 'I8': 1, 'U16': 2, 'I16': 2, 'U64': 8, 'I64': 8, 'BOOL': 1}
60
+ spans, names = [], set()
61
+ for name, value in header.items():
62
+ if name == '__metadata__':
63
+ continue
64
+ shape = value['shape']
65
+ if not isinstance(shape, list) or any(type(x) is not int or x < 0 for x in shape):
66
+ raise ValueError('invalid tensor shape')
67
+ start, end = value['data_offsets']
68
+ if type(start) is not int or type(end) is not int or not 0 <= start <= end <= size-8-n:
69
+ raise ValueError('invalid tensor payload boundary')
70
+ if end-start != math.prod(shape)*widths[value['dtype']]:
71
+ raise ValueError('dtype/shape byte count mismatch')
72
+ spans.append((start, end))
73
+ names.add(name)
74
+ cursor = 0
75
+ for start, end in sorted(spans):
76
+ if start != cursor:
77
+ raise ValueError('payload gap or overlap')
78
+ cursor = end
79
+ if cursor != size-8-n:
80
+ raise ValueError('unreferenced or truncated payload')
81
+ return names
82
+
83
+
84
+ def verify(root, expected_manifest_sha256=None):
85
+ root = Path(root).absolute()
86
+ errors, checked = [], []
87
+ try:
88
+ manifest_path = safe_path(root, 'UPLOAD_MANIFEST.json')
89
+ _, manifest_sha, _ = file_hashes(manifest_path)
90
+ if expected_manifest_sha256 and expected_manifest_sha256 != manifest_sha:
91
+ raise ValueError('trusted manifest hash mismatch')
92
+ manifest = read_json(manifest_path)
93
+ entries = manifest['files']
94
+ names = [e['path'] for e in entries]
95
+ if len(names) != len(set(names)):
96
+ raise ValueError('duplicate manifest file')
97
+ if any(type(e['bytes']) is not int or e['bytes'] < 0 for e in entries):
98
+ raise ValueError('invalid manifest size')
99
+ if len(entries) != manifest['file_count'] or sum(e['bytes'] for e in entries) != manifest['total_bytes']:
100
+ raise ValueError('manifest aggregates mismatch')
101
+ for e in entries:
102
+ if e['path'] == 'UPLOAD_MANIFEST.json' or not re.fullmatch('[a-f0-9]{64}', e['sha256']):
103
+ raise ValueError('invalid manifest entry')
104
+ p = safe_path(root, e['path'])
105
+ if not p.is_file():
106
+ errors.append({'file': e['path'], 'reason': 'missing file'})
107
+ continue
108
+ size, sha, blob = file_hashes(p)
109
+ if size != e['bytes'] or sha != e['sha256'] or (e.get('git_blob_sha1') and blob != e['git_blob_sha1']):
110
+ errors.append({'file': e['path'], 'reason': 'size or full-file hash mismatch'})
111
+ continue
112
+ if p.suffix == '.json':
113
+ read_json(p)
114
+ checked.append(e['path'])
115
+ index_name = 'model.safetensors.index.json'
116
+ if index_name not in names:
117
+ errors.append({'file': index_name, 'reason': 'required index not in manifest'})
118
+ elif index_name in checked:
119
+ index = read_json(root/index_name)['weight_map']
120
+ if not isinstance(index, dict) or not index:
121
+ raise ValueError('invalid weight map')
122
+ shards = set(index.values())
123
+ expected_shards = {n for n in names if n.endswith('.safetensors')}
124
+ if shards != expected_shards:
125
+ errors.append({'reason': 'index/manifest shard set mismatch'})
126
+ actual = {}
127
+ for shard in sorted(shards):
128
+ safe_path(root, shard)
129
+ if shard not in checked:
130
+ errors.append({'file': shard, 'reason': 'referenced shard missing or not hash-verified'})
131
+ continue
132
+ for tensor in tensor_header(root/shard):
133
+ if tensor in actual:
134
+ raise ValueError('duplicate tensor across shards')
135
+ actual[tensor] = shard
136
+ if actual != index:
137
+ errors.append({'reason': 'actual tensor inventory differs from weight map'})
138
+ except (OSError, ValueError, TypeError, KeyError, AttributeError) as exc:
139
+ errors.append({'reason': 'invalid or incomplete package', 'exception_type': type(exc).__name__})
140
+ return {'status': 'FAIL' if errors else 'PASS', 'errors': errors,
141
+ 'fully_hashed_files': len(checked), 'manifest_pinned': bool(expected_manifest_sha256),
142
+ 'scope': 'File integrity and tensor index only; not generation, finite-value or quality validation'}
143
+
144
+
145
+ if __name__ == '__main__':
146
+ parser = argparse.ArgumentParser(description=__doc__)
147
+ parser.add_argument('snapshot', type=Path)
148
+ parser.add_argument('--manifest-sha256')
149
+ args = parser.parse_args()
150
+ result = verify(args.snapshot, args.manifest_sha256)
151
+ print(json.dumps(result, indent=2))
152
+ raise SystemExit(0 if result['status'] == 'PASS' else 1)
video_preprocessor_config.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "size": {
3
+ "longest_edge": 25165824,
4
+ "shortest_edge": 4096
5
+ },
6
+ "patch_size": 16,
7
+ "temporal_patch_size": 2,
8
+ "merge_size": 2,
9
+ "image_mean": [
10
+ 0.5,
11
+ 0.5,
12
+ 0.5
13
+ ],
14
+ "image_std": [
15
+ 0.5,
16
+ 0.5,
17
+ 0.5
18
+ ],
19
+ "processor_class": "Qwen3VLProcessor",
20
+ "video_processor_type": "Qwen3VLVideoProcessor"
21
+ }
vocab.json ADDED
The diff for this file is too large to render. See raw diff