hf-transformers-bot HF Staff commited on
Commit
b385e58
·
verified ·
1 Parent(s): de55986

Update tiny models for HYV4Model

Browse files
Files changed (5) hide show
  1. chat_template.jinja +309 -0
  2. config.json +64 -0
  3. model.safetensors +3 -0
  4. tokenizer.json +0 -0
  5. tokenizer_config.json +11 -0
chat_template.jinja ADDED
@@ -0,0 +1,309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {#- ----------‑‑‑ special token variables ‑‑‑---------- -#}
2
+ {%- set HYTK = ':opensource' %}
3
+ {%- set hy_start_token = '<|hy_start{}|>'.format(HYTK) %}
4
+ {%- set hy_middle_token = '<|hy_middle{}|>'.format(HYTK) %}
5
+ {%- set hy_end_token = '<|hy_end{}|>'.format(HYTK) %}
6
+ {%- set think_begin_token = '<think{}>'.format(HYTK) %}
7
+ {%- set think_end_token = '</think{}>'.format(HYTK) %}
8
+ {%- set toolcalls_begin_token = '<tool_calls{}>'.format(HYTK) %}
9
+ {%- set toolcalls_end_token = '</tool_calls{}>'.format(HYTK) %}
10
+ {%- set toolcall_begin_token = '<tool_call{}>'.format(HYTK) %}
11
+ {%- set toolcall_end_token = '</tool_call{}>'.format(HYTK) %}
12
+ {%- set argkey_begin_token = '<arg_key{}>'.format(HYTK) %}
13
+ {%- set argkey_end_token = '</arg_key{}>'.format(HYTK) %}
14
+ {%- set argvalue_begin_token = '<arg_value{}>'.format(HYTK) %}
15
+ {%- set argvalue_end_token = '</arg_value{}>'.format(HYTK) %}
16
+ {%- set toolresponse_begin_token = '<tool_response{}>'.format(HYTK) %}
17
+ {%- set toolresponse_end_token = '</tool_response{}>'.format(HYTK) %}
18
+ {%- set reasoning_mode_token = '<|reasoning_mode{}|>'.format(HYTK) %}
19
+
20
+ {#- ----------‑‑‑ hyperparameters variables ‑‑‑---------- -#}
21
+ {%- if not add_generation_prompt is defined %}
22
+ {%- set add_generation_prompt = false %}
23
+ {%- endif %}
24
+ {%- if not preserved_thinking is defined %}
25
+ {%- if not tools %}
26
+ {%- set preserved_thinking = false %}
27
+ {%- else %}
28
+ {%- set preserved_thinking = true %}
29
+ {%- endif %}
30
+ {%- endif %}
31
+
32
+ {%- if not reasoning_effort is defined %}
33
+ {%- set reasoning_effort = 'high' %}
34
+ {%- elif reasoning_effort not in ['high', 'no_think'] %}
35
+ {%- if reasoning_effort is none %}
36
+ {{- raise_exception('reasoning_effort error : None, should be no_think/high') }}
37
+ {%- else %}
38
+ {{- raise_exception('reasoning_effort error : ' + reasoning_effort + ', should be no_think/high') }}
39
+ {%- endif %}
40
+ {%- endif %}
41
+
42
+ {%- if fallback_strategy is defined and fallback_strategy == 'reasoning_toolcall_retry' %}
43
+ {%- set reasoning_effort = 'high' %}
44
+ {%- set add_generation_prompt = false %}
45
+ {%- endif %}
46
+ {%- if not raw_last_assistant is defined %}
47
+ {%- set raw_last_assistant = false %}
48
+ {%- endif %}
49
+
50
+ {%- macro tool_to_json(tool) -%}
51
+ {%- set ns_tool = namespace(first=true) -%}
52
+ {{- '{' -}}
53
+ {%- for k, v in tool.items() -%}
54
+ {%- if k != 'defer_loading' and k != 'strict' -%}
55
+ {%- if not ns_tool.first -%}{{- ', ' -}}{%- endif -%}
56
+ {%- set ns_tool.first = false -%}
57
+ {{- '"' ~ k ~ '": ' ~ (v | tojson(ensure_ascii=False)) -}}
58
+ {%- endif -%}
59
+ {%- endfor -%}
60
+ {{- '}' -}}
61
+ {%- endmacro -%}
62
+
63
+ {%- macro render_content(content) -%}
64
+ {%- if content is string -%}
65
+ {{- content -}}
66
+ {%- elif content is iterable and content is not mapping -%}
67
+ {%- for item in content -%}
68
+ {%- if item is mapping and item.type == 'text' -%}
69
+ {{- item.text -}}
70
+ {%- elif item is string -%}
71
+ {{- item -}}
72
+ {%- else -%}
73
+ {{- item | string -}}
74
+ {%- endif -%}
75
+ {%- endfor -%}
76
+ {%- elif content is none -%}
77
+ {{- '' -}}
78
+ {%- else -%}
79
+ {{- content | string -}}
80
+ {%- endif -%}
81
+ {%- endmacro -%}
82
+
83
+ {%- macro render_tools_prompt() -%}
84
+ {{- '# Tools\n\nYou may call one or more functions to assist with the user query.' -}}
85
+ {{- '\n\nYou are provided with function signatures within <tools></tools> XML tags:' -}}
86
+ {{- '\n<tools>\n' -}}
87
+ {%- set tool_ns = namespace(first=true) -%}
88
+ {%- for tool in tools -%}
89
+ {%- set t = tool['function'] if tool is mapping and 'function' in tool else tool -%}
90
+ {%- if t.defer_loading is not defined or not t.defer_loading -%}
91
+ {%- if not tool_ns.first -%}{{- '\n' -}}{%- endif -%}
92
+ {%- set tool_ns.first = false -%}
93
+ {{- tool_to_json(t) -}}
94
+ {%- endif -%}
95
+ {%- endfor -%}
96
+ {{- '\n</tools>\n\n' -}}
97
+ {{- 'For function call returns, you should first print ' ~ toolcalls_begin_token -}}
98
+ {{- '\nFor each function call, you should return object like:\n' -}}
99
+ {{- toolcall_begin_token ~ '{function-name}' -}}
100
+ {{- argkey_begin_token ~ '{arg-key-1}' ~ argkey_end_token -}}
101
+ {{- argvalue_begin_token ~ '{arg-value-1}' ~ argvalue_end_token -}}
102
+ {{- argkey_begin_token ~ '{arg-key-2}' ~ argkey_end_token -}}
103
+ {{- argvalue_begin_token ~ '{arg-value-2}' ~ argvalue_end_token -}}
104
+ {{- '...' -}}
105
+ {{- toolcall_end_token -}}
106
+ {{- '\nAt the end of function call returns, you should print ' ~ toolcalls_end_token -}}
107
+ {%- endmacro -%}
108
+
109
+ {%- macro render_tool_response(message) -%}
110
+ {%- set content = message['content'] -%}
111
+ {%- if content is string -%}
112
+ {{- toolresponse_begin_token ~ content ~ toolresponse_end_token -}}
113
+ {%- elif content is iterable and content is not mapping and content and content[0] is mapping and content[0].type == 'tool_reference' -%}
114
+ {{- toolresponse_begin_token -}}
115
+ {{- '<tools>\n' -}}
116
+ {%- for tr in content -%}
117
+ {%- for tool in tools -%}
118
+ {%- set t = tool['function'] if tool is mapping and 'function' in tool else tool -%}
119
+ {%- if t.name == tr.name -%}
120
+ {{- tool_to_json(t) ~ '\n' -}}
121
+ {%- endif -%}
122
+ {%- endfor -%}
123
+ {%- endfor -%}
124
+ {{- '</tools>' -}}
125
+ {{- toolresponse_end_token -}}
126
+ {%- elif content is iterable and content is not mapping and content and content[0] is mapping and content[0].output is defined -%}
127
+ {%- for tr in content -%}
128
+ {{- toolresponse_begin_token ~ tr.output ~ toolresponse_end_token -}}
129
+ {%- endfor -%}
130
+ {%- else -%}
131
+ {{- toolresponse_begin_token ~ render_content(content) ~ toolresponse_end_token -}}
132
+ {%- endif -%}
133
+ {%- endmacro -%}
134
+
135
+ {#- consecutive tool messages are clustered into a single tool message whose content is the list of the original tool messages; the result is written to merged_ns.messages (a macro cannot return a list) -#}
136
+ {%- set merged_ns = namespace(messages=[]) %}
137
+ {%- macro merge_tool_responses(messages) -%}
138
+ {%- set merge_ns = namespace(result=[], cluster=[]) -%}
139
+ {%- for message in messages -%}
140
+ {%- if message['role'] == 'tool' -%}
141
+ {%- set merge_ns.cluster = merge_ns.cluster + [message] -%}
142
+ {%- else -%}
143
+ {%- if merge_ns.cluster -%}
144
+ {%- set merge_ns.result = merge_ns.result + [{'role': 'tool', 'content': merge_ns.cluster}] -%}
145
+ {%- set merge_ns.cluster = [] -%}
146
+ {%- endif -%}
147
+ {%- set merge_ns.result = merge_ns.result + [message] -%}
148
+ {%- endif -%}
149
+ {%- endfor -%}
150
+ {%- if merge_ns.cluster -%}
151
+ {%- set merge_ns.result = merge_ns.result + [{'role': 'tool', 'content': merge_ns.cluster}] -%}
152
+ {%- endif -%}
153
+ {%- set merged_ns.messages = merge_ns.result -%}
154
+ {%- endmacro -%}
155
+
156
+ {#- render one tool cluster, reordered to follow the tool_call order of the preceding assistant turn; any missing / ambiguous id falls back to the original tool message order for the whole cluster -#}
157
+ {%- macro render_tool_responses(tool_messages, tool_call_ids) -%}
158
+ {%- set order_ns = namespace(ordered=[], matched=true) -%}
159
+ {%- if tool_call_ids and tool_call_ids | length == tool_messages | length -%}
160
+ {%- for tool_call_id in tool_call_ids -%}
161
+ {%- set hit_ns = namespace(count=0, message=none) -%}
162
+ {%- for tool_message in tool_messages -%}
163
+ {%- set message_id = tool_message['tool_call_id'] if tool_message['tool_call_id'] is defined else tool_message['id'] -%}
164
+ {%- if message_id is defined and message_id == tool_call_id -%}
165
+ {%- set hit_ns.count = hit_ns.count + 1 -%}
166
+ {%- set hit_ns.message = tool_message -%}
167
+ {%- endif -%}
168
+ {%- endfor -%}
169
+ {%- if hit_ns.count == 1 -%}
170
+ {%- set order_ns.ordered = order_ns.ordered + [hit_ns.message] -%}
171
+ {%- else -%}
172
+ {%- set order_ns.matched = false -%}
173
+ {%- endif -%}
174
+ {%- endfor -%}
175
+ {%- else -%}
176
+ {%- set order_ns.matched = false -%}
177
+ {%- endif -%}
178
+ {%- for tool_message in (order_ns.ordered if order_ns.matched else tool_messages) -%}
179
+ {{- render_tool_response(tool_message) -}}
180
+ {%- endfor -%}
181
+ {%- endmacro -%}
182
+
183
+ {%- set _ = merge_tool_responses(messages) %}
184
+ {%- set normed_messages = merged_ns.messages %}
185
+
186
+ {%- set ns = namespace(last_user_index=-1, has_leading_system=false) %}
187
+ {%- if normed_messages and normed_messages[0].role == 'system' %}
188
+ {%- set ns.has_leading_system = true %}
189
+ {%- endif %}
190
+ {%- for message in normed_messages %}
191
+ {%- if message['role'] == 'user' %}
192
+ {%- set ns.last_user_index = loop.index0 %}
193
+ {%- endif %}
194
+ {%- endfor %}
195
+
196
+ {#- no leading system: synthesize one for tools and/or reasoning_mode -#}
197
+ {%- if not ns.has_leading_system %}
198
+ {{- hy_start_token ~ 'system' ~ hy_middle_token -}}
199
+ {%- if tools %}
200
+ {{- render_tools_prompt() -}}
201
+ {%- endif %}
202
+ {{- reasoning_mode_token ~ 'reasoning_effort:' ~ reasoning_effort -}}
203
+ {{- hy_end_token -}}
204
+ {%- endif %}
205
+
206
+ {%- set last_ns = namespace(last_is_assistant=false) %}
207
+ {%- set prev_ns = namespace(tool_call_ids=[]) %}
208
+ {%- for message in normed_messages %}
209
+ {%- if message['role'] == 'system' %}
210
+ {{- hy_start_token ~ 'system' ~ hy_middle_token -}}
211
+ {#- tools / reasoning_mode only attach to the leading system (messages[0]) -#}
212
+ {%- if loop.first %}
213
+ {%- if tools %}
214
+ {{- render_tools_prompt() -}}
215
+ {%- endif %}
216
+ {%- set content = render_content(message['content']) -%}
217
+ {%- if tools and content -%}
218
+ {{- '\n\n' -}}
219
+ {%- endif -%}
220
+ {{- content -}}
221
+ {{- reasoning_mode_token ~ 'reasoning_effort:' ~ reasoning_effort -}}
222
+ {%- else %}
223
+ {{- render_content(message['content']) -}}
224
+ {%- endif %}
225
+ {{- hy_end_token -}}
226
+ {%- elif message['role'] == 'user' %}
227
+ {{- hy_start_token ~ 'user' ~ hy_middle_token -}}
228
+ {{- render_content(message['content']) -}}
229
+ {{- hy_end_token -}}
230
+ {%- elif message['role'] == 'assistant' %}
231
+ {%- set content_body = render_content(message['content']) -%}
232
+ {#- 'reasoning' takes precedence, fall back to 'reasoning_content' when it is empty -#}
233
+ {%- set reasoning_text = '' %}
234
+ {%- if message['reasoning'] is defined and message['reasoning'] is string and message['reasoning'] %}
235
+ {%- set reasoning_text = message['reasoning'] %}
236
+ {%- elif message['reasoning_content'] is defined and message['reasoning_content'] is string and message['reasoning_content'] %}
237
+ {%- set reasoning_text = message['reasoning_content'] %}
238
+ {%- endif %}
239
+ {#- no_think overrides preserved_thinking: history is always emitted with empty think tags -#}
240
+ {%- if reasoning_effort != 'no_think' and (preserved_thinking or loop.index0 > ns.last_user_index) and reasoning_text %}
241
+ {%- set content = think_begin_token ~ reasoning_text ~ think_end_token ~ content_body %}
242
+ {%- else %}
243
+ {%- set content = think_begin_token ~ think_end_token ~ content_body %}
244
+ {%- endif %}
245
+ {{- hy_start_token ~ 'assistant' ~ hy_middle_token -}}
246
+ {%- if message['tool_calls'] is defined and message['tool_calls'] %}
247
+ {#- remember the tool_call ids of this turn to order the following tool responses; an incomplete id set means "do not reorder" -#}
248
+ {%- set ids_ns = namespace(ids=[], complete=true) %}
249
+ {%- for tool in message['tool_calls'] %}
250
+ {%- set tool_call_id = tool['id'] if tool['id'] is defined and tool['id'] else tool['tool_call_id'] %}
251
+ {%- if tool_call_id is defined and tool_call_id %}
252
+ {%- set ids_ns.ids = ids_ns.ids + [tool_call_id] %}
253
+ {%- else %}
254
+ {%- set ids_ns.complete = false %}
255
+ {%- endif %}
256
+ {%- endfor %}
257
+ {%- set prev_ns.tool_call_ids = ids_ns.ids if ids_ns.complete else [] %}
258
+ {{- content -}}
259
+ {{- toolcalls_begin_token -}}
260
+ {%- for tool in message['tool_calls'] -%}
261
+ {%- set func = tool['function'] if tool is mapping and 'function' in tool else tool -%}
262
+ {%- set arguments = func['arguments'] -%}
263
+ {{- toolcall_begin_token ~ func['name'] -}}
264
+ {%- for key, value in arguments.items() -%}
265
+ {{- argkey_begin_token ~ key ~ argkey_end_token -}}
266
+ {%- if value is not string -%}
267
+ {%- set value = value | tojson(ensure_ascii=False) -%}
268
+ {%- endif -%}
269
+ {{- argvalue_begin_token ~ value ~ argvalue_end_token -}}
270
+ {%- endfor -%}
271
+ {{- toolcall_end_token -}}
272
+ {%- endfor -%}
273
+ {{- toolcalls_end_token -}}
274
+ {%- else %}
275
+ {%- if loop.last and raw_last_assistant %}
276
+ {{- content_body -}}
277
+ {%- else %}
278
+ {{- content -}}
279
+ {%- endif %}
280
+ {%- endif %}
281
+ {#- continuation / prefill: last assistant is still open, do not close with hy_end -#}
282
+ {%- if not (loop.last and raw_last_assistant) %}
283
+ {{- hy_end_token -}}
284
+ {%- endif %}
285
+ {%- elif message['role'] == 'tool' %}
286
+ {{- hy_start_token ~ 'tool' ~ hy_middle_token -}}
287
+ {{- render_tool_responses(message['content'], prev_ns.tool_call_ids) -}}
288
+ {{- hy_end_token -}}
289
+ {%- else %}
290
+ {{- hy_start_token ~ message['role'] ~ hy_middle_token -}}
291
+ {{- render_content(message['content']) -}}
292
+ {{- hy_end_token -}}
293
+ {%- endif %}
294
+ {%- if message['role'] != 'assistant' or not (message['tool_calls'] is defined and message['tool_calls']) %}
295
+ {%- set prev_ns.tool_call_ids = [] %}
296
+ {%- endif %}
297
+ {%- if loop.last and message['role'] == 'assistant' %}
298
+ {%- set last_ns.last_is_assistant = true %}
299
+ {%- endif %}
300
+ {%- endfor %}
301
+ {%- if add_generation_prompt %}
302
+ {%- if not last_ns.last_is_assistant %}
303
+ {%- if reasoning_effort == 'no_think' %}
304
+ {{- hy_start_token ~ 'assistant' ~ hy_middle_token ~ think_begin_token ~ think_end_token -}}
305
+ {%- else %}
306
+ {{- hy_start_token ~ 'assistant' ~ hy_middle_token ~ think_begin_token -}}
307
+ {%- endif %}
308
+ {%- endif %}
309
+ {%- endif %}
config.json ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "HYV4Model"
4
+ ],
5
+ "attention_bias": false,
6
+ "attention_dropout": 0.0,
7
+ "bos_token_id": 120000,
8
+ "dtype": "float32",
9
+ "eos_token_id": 120025,
10
+ "hc_eps": 1e-06,
11
+ "hc_magnitude": 2.0,
12
+ "hc_mult": 4,
13
+ "head_dim": 4,
14
+ "hidden_act": "gelu",
15
+ "hidden_size": 32,
16
+ "index_head_dim": 8,
17
+ "index_n_heads": 4,
18
+ "index_topk": 8,
19
+ "indexer_types": [
20
+ "full",
21
+ "shared"
22
+ ],
23
+ "initializer_range": 0.02,
24
+ "intermediate_size": 32,
25
+ "kv_lora_rank": 8,
26
+ "layer_types": [
27
+ "indexed_attention",
28
+ "indexed_attention"
29
+ ],
30
+ "learnable_sink_init": 0.0,
31
+ "max_position_embeddings": 512,
32
+ "mlp_layer_types": [
33
+ "dense",
34
+ "sparse"
35
+ ],
36
+ "model_type": "hy_v4",
37
+ "moe_intermediate_size": 16,
38
+ "n_group": 1,
39
+ "n_routed_experts": 8,
40
+ "n_shared_experts": 1,
41
+ "norm_topk_prob": true,
42
+ "num_attention_heads": 2,
43
+ "num_experts_per_tok": 2,
44
+ "num_hidden_layers": 2,
45
+ "num_key_value_heads": 2,
46
+ "pad_token_id": 120002,
47
+ "q_lora_rank": 16,
48
+ "qk_head_dim": 8,
49
+ "qk_nope_head_dim": 4,
50
+ "qk_rope_head_dim": 4,
51
+ "rms_norm_eps": 1e-05,
52
+ "rope_parameters": {
53
+ "rope_theta": 10000.0,
54
+ "rope_type": "default"
55
+ },
56
+ "routed_scaling_factor": 2.827,
57
+ "swiglu_limit": 10.0,
58
+ "tie_word_embeddings": false,
59
+ "topk_group": 1,
60
+ "transformers_version": "5.19.0.dev0",
61
+ "use_cache": true,
62
+ "v_head_dim": 8,
63
+ "vocab_size": 120832
64
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fb7eff33e94e656d0e449203fb2ba6580d93f71f50adae291b2524e8d58b2564
3
+ size 15582820
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backend": "tokenizers",
3
+ "bos_token": "<|hy_start:opensource|>",
4
+ "clean_up_tokenization_spaces": false,
5
+ "eos_token": "<|hy_end:opensource|>",
6
+ "is_local": true,
7
+ "local_files_only": false,
8
+ "model_max_length": 512,
9
+ "pad_token": "<|hy_pad:opensource|>",
10
+ "tokenizer_class": "TokenizersBackend"
11
+ }