BrokenCompute commited on
Commit
3a330a9
·
verified ·
1 Parent(s): 4d80340

Add files using upload-large-folder tool

Browse files
.gitattributes CHANGED
@@ -34,3 +34,4 @@ saved_model/**/* 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
  IDK-v1-Q4_K_M.gguf 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
  IDK-v1-Q4_K_M.gguf filter=lfs diff=lfs merge=lfs -text
37
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ base_model: Qwen/Qwen3.5-4B
4
+ language:
5
+ - en
6
+ pipeline_tag: text-generation
7
+ tags:
8
+ - abstention
9
+ - honesty
10
+ - calibration
11
+ - gguf
12
+ - safetensors
13
+ - qwen3.5
14
+ ---
15
+
16
+ # IDK v1
17
+
18
+ A 4B abstention fine-tune of Qwen3.5-4B. Instead of fabricating when it doesn't know, it emits a leading `[IDK]` marker plus a short reason — and, given a search tool, it looks the answer up first. Runs on an 8 GB GPU.
19
+
20
+ > ⚠️ **Experimental model — use at your own risk.** IDK v1 is an early research release provided as-is, with no guarantees of correctness, safety, or fitness for any purpose. It is a 4B model and can still be wrong or fabricate. You are responsible for validating its outputs before relying on them.
21
+
22
+ ## What it does
23
+
24
+ Given a question, the model takes one of three actions:
25
+
26
+ - **Answer** — when the prompt or its own knowledge supports a reliable answer.
27
+ - **Search** — when a findable external/current fact is missing, it calls a `web_search(query)` tool and grounds its answer on the result.
28
+ - **Decline** — when it can't answer reliably and no tool resolves it, it replies with a leading `[IDK]` and a brief reason, rather than guessing.
29
+
30
+ Its abstention tracks difficulty: it declines more as questions get harder, and (with search) reserves `[IDK]` for what genuinely isn't findable.
31
+
32
+ ## Recommended serving
33
+
34
+ - **Reasoning: ON.** Every training example carries a reasoning trace; calibration and instruction-following are meaningfully better with thinking enabled.
35
+ - **Format: conversational chat.** The abstention behavior lives in the conversational format it was trained on; rigid `\boxed{}`-style output prompts suppress it.
36
+ - **System prompt** granting the decline affordance, e.g.:
37
+ ```
38
+ You may answer, or decline with [IDK] and a brief reason if you are not
39
+ confident. Do not guess.
40
+ ```
41
+ - **Search tool (recommended for factual use).** Declare an OpenAI-style `web_search(query)` function backed by SearXNG, Serper, or any search API. Without it, the model can only answer or decline.
42
+ - **Sampler:** `top_k 40`, `top_p 0.95`, `min_p 0.05`, `repeat_penalty 1.1`.
43
+ - **Temperature:** minimal impact — tested across the full `0.2–1.0` range with little behavioral change, so anything in that band is fine.
44
+ - **Quantization:** `BF16` for best calibration; `Q4_K_M` (~2.7 GB) runs on 8 GB GPUs and abstains slightly more.
45
+ - **Context:** trained at max-seq 4096.
46
+
47
+ Formats in this repo:
48
+ - **`safetensors`** (merged bf16, ~8 GB) — for 🤗 Transformers / vLLM.
49
+ - **`BF16` GGUF** (~8.4 GB) — full precision for llama.cpp / LM Studio.
50
+ - **`Q4_K_M` GGUF** (~2.7 GB) — runs on 8 GB GPUs.
51
+
52
+ ### Loading (Transformers)
53
+
54
+ The base is a vision-language model, so load with **`AutoModelForImageTextToText`** (not `AutoModelForCausalLM`), and apply the chat template with thinking on:
55
+
56
+ ```python
57
+ import torch
58
+ from transformers import AutoModelForImageTextToText, AutoTokenizer
59
+
60
+ tok = AutoTokenizer.from_pretrained("BrokenCompute/IDK-v1")
61
+ model = AutoModelForImageTextToText.from_pretrained(
62
+ "BrokenCompute/IDK-v1", dtype=torch.bfloat16, device_map="auto")
63
+
64
+ msgs = [
65
+ {"role": "system", "content": "You may answer, or decline with [IDK] and a brief reason if you are not confident. Do not guess."},
66
+ {"role": "user", "content": "Which jurist said the First Amendment 'may finally have worked itself pure'?"},
67
+ ]
68
+ text = tok.apply_chat_template(msgs, add_generation_prompt=True, tokenize=False, enable_thinking=True)
69
+ out = model.generate(**tok(text, return_tensors="pt").to(model.device), max_new_tokens=512)
70
+ print(tok.decode(out[0], skip_special_tokens=True))
71
+ ```
72
+
73
+ ## Training
74
+
75
+ - **Base:** Qwen3.5-4B (via Unsloth), 4-bit QLoRA supervised fine-tune. No RLHF/DPO in this checkpoint.
76
+ - **Data:** 8,763-example abstention corpus. Every example carries a reasoning trace; a subset teaches `web_search` tool use.
77
+ - **Recipe:** LoRA rank 32 / alpha 32, 2 epochs, lr 2e-4, max-seq 4096, seed 3407, final loss ~0.95.
78
+ - Trained on a single **RTX 5060 Ti (16 GB)**.
79
+
80
+ ## Limitations
81
+
82
+ - It's a 4B — more honest about its limits than most, but "more honest" is not "correct." Not for medical, legal, or financial decisions.
83
+ - Over-refusal without tools; pair with search for factual work.
84
+ - English; focused on Health, Law, and Software-Engineering domains.
85
+ - **Multimodal base, text-only fine-tune.** Qwen3.5-4B is a vision-language model; this fine-tune trained only the text pathway. The vision tower is the base's, carried along unmodified and untested here — treat this as a text model.
86
+ - Reasoning-off increases over-refusal — keep reasoning on. Quantization matters far less: with reasoning on, `Q4_K_M` tracks `BF16` closely on most benchmarks.
87
+
88
+ ## License
89
+
90
+ Built on Qwen3.5-4B (Apache-2.0). This fine-tune and model card are released under Apache-2.0.
chat_template.jinja ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 num_sys = 0 %}
46
+ {%- set merged_system = '' %}
47
+ {%- if messages[0].role == 'system' or messages[0].role == 'developer' %}
48
+ {%- set first = render_content(messages[0].content, false, true)|trim %}
49
+ {%- if messages|length > 1 and (messages[1].role == 'system' or messages[1].role == 'developer') %}
50
+ {%- set second = render_content(messages[1].content, false, true)|trim %}
51
+ {%- set merged_system = first + '\n' + second %}
52
+ {%- set num_sys = 2 %}
53
+ {%- else %}
54
+ {%- set merged_system = first %}
55
+ {%- set num_sys = 1 %}
56
+ {%- endif %}
57
+ {%- endif %}
58
+ {%- if tools and tools is iterable and tools is not mapping %}
59
+ {{- '<|im_start|>system\n' }}
60
+ {{- "# Tools\n\nYou have access to the following functions:\n\n<tools>" }}
61
+ {%- for tool in tools %}
62
+ {{- "\n" }}
63
+ {{- tool | tojson }}
64
+ {%- endfor %}
65
+ {{- "\n</tools>" }}
66
+ {{- '\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>' }}
67
+ {%- if merged_system %}
68
+ {{- '\n\n' + merged_system }}
69
+ {%- endif %}
70
+ {{- '<|im_end|>\n' }}
71
+ {%- else %}
72
+ {%- if merged_system %}
73
+ {{- '<|im_start|>system\n' + merged_system + '<|im_end|>\n' }}
74
+ {%- endif %}
75
+ {%- endif %}
76
+ {%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}
77
+ {%- for message in messages[::-1] %}
78
+ {%- set index = (messages|length - 1) - loop.index0 %}
79
+ {%- if ns.multi_step_tool and message.role == "user" %}
80
+ {%- set content = render_content(message.content, false)|trim %}
81
+ {%- if not(content.startswith('<tool_response>') and content.endswith('</tool_response>')) %}
82
+ {%- set ns.multi_step_tool = false %}
83
+ {%- set ns.last_query_index = index %}
84
+ {%- endif %}
85
+ {%- endif %}
86
+ {%- endfor %}
87
+ {%- for message in messages %}
88
+ {%- if loop.index0 >= num_sys and message.role != "system" and message.role != "developer" %}
89
+ {%- set content = render_content(message.content, true)|trim %}
90
+ {%- if message.role == "user" %}
91
+ {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }}
92
+ {%- elif message.role == "assistant" %}
93
+ {%- set reasoning_content = '' %}
94
+ {%- if message.reasoning_content is string %}
95
+ {%- set reasoning_content = message.reasoning_content %}
96
+ {%- else %}
97
+ {%- if '</think>' in content %}
98
+ {%- set reasoning_content = content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
99
+ {%- set content = content.split('</think>')[-1].lstrip('\n') %}
100
+ {%- endif %}
101
+ {%- endif %}
102
+ {%- set reasoning_content = reasoning_content|trim %}
103
+ {%- if loop.index0 > ns.last_query_index %}
104
+ {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content + '\n</think>\n\n' + content }}
105
+ {%- else %}
106
+ {{- '<|im_start|>' + message.role + '\n' + content }}
107
+ {%- endif %}
108
+ {%- if message.tool_calls and message.tool_calls is iterable and message.tool_calls is not mapping %}
109
+ {%- for tool_call in message.tool_calls %}
110
+ {%- if tool_call.function is defined %}
111
+ {%- set tool_call = tool_call.function %}
112
+ {%- endif %}
113
+ {%- if loop.first %}
114
+ {%- if content|trim %}
115
+ {{- '\n\n<tool_call>\n<function=' + tool_call.name + '>\n' }}
116
+ {%- else %}
117
+ {{- '<tool_call>\n<function=' + tool_call.name + '>\n' }}
118
+ {%- endif %}
119
+ {%- else %}
120
+ {{- '\n<tool_call>\n<function=' + tool_call.name + '>\n' }}
121
+ {%- endif %}
122
+ {%- if tool_call.arguments is mapping %}
123
+ {%- for args_name in tool_call.arguments %}
124
+ {%- set args_value = tool_call.arguments[args_name] %}
125
+ {{- '<parameter=' + args_name + '>\n' }}
126
+ {%- set args_value = args_value | tojson | safe if args_value is mapping or (args_value is sequence and args_value is not string) else args_value | string %}
127
+ {{- args_value }}
128
+ {{- '\n</parameter>\n' }}
129
+ {%- endfor %}
130
+ {%- endif %}
131
+ {{- '</function>\n</tool_call>' }}
132
+ {%- endfor %}
133
+ {%- endif %}
134
+ {{- '<|im_end|>\n' }}
135
+ {%- elif message.role == "tool" %}
136
+ {%- if loop.previtem and loop.previtem.role != "tool" %}
137
+ {{- '<|im_start|>user' }}
138
+ {%- endif %}
139
+ {{- '\n<tool_response>\n' }}
140
+ {{- content }}
141
+ {{- '\n</tool_response>' }}
142
+ {%- if not loop.last and loop.nextitem.role != "tool" %}
143
+ {{- '<|im_end|>\n' }}
144
+ {%- elif loop.last %}
145
+ {{- '<|im_end|>\n' }}
146
+ {%- endif %}
147
+ {%- endif %}
148
+ {%- endif %}
149
+ {%- endfor %}
150
+ {%- if add_generation_prompt %}
151
+ {{- '<|im_start|>assistant\n' }}
152
+ {%- if enable_thinking is defined and enable_thinking is false %}
153
+ {{- '<think>\n\n</think>\n\n' }}
154
+ {%- else %}
155
+ {{- '<think>\n' }}
156
+ {%- endif %}
157
+ {%- endif %}
158
+ {#- Unsloth fixes - developer role, tool calling #}
config.json ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "Qwen3_5ForConditionalGeneration"
4
+ ],
5
+ "dtype": "bfloat16",
6
+ "image_token_id": 248056,
7
+ "model_type": "qwen3_5",
8
+ "mtp_num_hidden_layers": 0,
9
+ "text_config": {
10
+ "attention_bias": false,
11
+ "attention_dropout": 0.0,
12
+ "attn_output_gate": true,
13
+ "bos_token_id": null,
14
+ "dtype": "bfloat16",
15
+ "eos_token_id": 248044,
16
+ "full_attention_interval": 4,
17
+ "head_dim": 256,
18
+ "hidden_act": "silu",
19
+ "hidden_size": 2560,
20
+ "initializer_range": 0.02,
21
+ "intermediate_size": 9216,
22
+ "layer_types": [
23
+ "linear_attention",
24
+ "linear_attention",
25
+ "linear_attention",
26
+ "full_attention",
27
+ "linear_attention",
28
+ "linear_attention",
29
+ "linear_attention",
30
+ "full_attention",
31
+ "linear_attention",
32
+ "linear_attention",
33
+ "linear_attention",
34
+ "full_attention",
35
+ "linear_attention",
36
+ "linear_attention",
37
+ "linear_attention",
38
+ "full_attention",
39
+ "linear_attention",
40
+ "linear_attention",
41
+ "linear_attention",
42
+ "full_attention",
43
+ "linear_attention",
44
+ "linear_attention",
45
+ "linear_attention",
46
+ "full_attention",
47
+ "linear_attention",
48
+ "linear_attention",
49
+ "linear_attention",
50
+ "full_attention",
51
+ "linear_attention",
52
+ "linear_attention",
53
+ "linear_attention",
54
+ "full_attention"
55
+ ],
56
+ "linear_conv_kernel_dim": 4,
57
+ "linear_key_head_dim": 128,
58
+ "linear_num_key_heads": 16,
59
+ "linear_num_value_heads": 32,
60
+ "linear_value_head_dim": 128,
61
+ "mamba_ssm_dtype": "float32",
62
+ "max_position_embeddings": 262144,
63
+ "mlp_only_layers": [],
64
+ "model_type": "qwen3_5_text",
65
+ "mtp_num_hidden_layers": 0,
66
+ "mtp_use_dedicated_embeddings": false,
67
+ "num_attention_heads": 16,
68
+ "num_hidden_layers": 32,
69
+ "num_key_value_heads": 4,
70
+ "pad_token_id": null,
71
+ "partial_rotary_factor": 0.25,
72
+ "rms_norm_eps": 1e-06,
73
+ "rope_parameters": {
74
+ "mrope_interleaved": true,
75
+ "mrope_section": [
76
+ 11,
77
+ 11,
78
+ 10
79
+ ],
80
+ "partial_rotary_factor": 0.25,
81
+ "rope_theta": 10000000,
82
+ "rope_type": "default"
83
+ },
84
+ "tie_word_embeddings": true,
85
+ "use_cache": true,
86
+ "vocab_size": 248320
87
+ },
88
+ "tie_word_embeddings": true,
89
+ "transformers_version": "5.5.0",
90
+ "unsloth_fixed_mtp": true,
91
+ "video_token_id": 248057,
92
+ "vision_config": {
93
+ "deepstack_visual_indexes": [],
94
+ "depth": 24,
95
+ "dtype": "bfloat16",
96
+ "hidden_act": "gelu_pytorch_tanh",
97
+ "hidden_size": 1024,
98
+ "in_channels": 3,
99
+ "initializer_range": 0.02,
100
+ "intermediate_size": 4096,
101
+ "model_type": "qwen3_5",
102
+ "num_heads": 16,
103
+ "num_position_embeddings": 2304,
104
+ "out_hidden_size": 2560,
105
+ "patch_size": 16,
106
+ "spatial_merge_size": 2,
107
+ "temporal_patch_size": 2
108
+ },
109
+ "vision_end_token_id": 248054,
110
+ "vision_start_token_id": 248053
111
+ }
generation_config.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "_from_model_config": true,
3
+ "eos_token_id": 248044,
4
+ "transformers_version": "5.5.0",
5
+ "use_cache": true
6
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:058c7929e3c025b82a82debf06ee387c2e1364cd9dee39333617cf7ea9c15556
3
+ size 9078637776
processor_config.json ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "image_processor": {
3
+ "data_format": "channels_first",
4
+ "do_convert_rgb": true,
5
+ "do_normalize": true,
6
+ "do_rescale": true,
7
+ "do_resize": true,
8
+ "image_mean": [
9
+ 0.5,
10
+ 0.5,
11
+ 0.5
12
+ ],
13
+ "image_processor_type": "Qwen2VLImageProcessor",
14
+ "image_std": [
15
+ 0.5,
16
+ 0.5,
17
+ 0.5
18
+ ],
19
+ "merge_size": 2,
20
+ "patch_size": 16,
21
+ "resample": 3,
22
+ "rescale_factor": 0.00392156862745098,
23
+ "size": {
24
+ "longest_edge": 16777216,
25
+ "shortest_edge": 65536
26
+ },
27
+ "temporal_patch_size": 2
28
+ },
29
+ "processor_class": "Qwen3VLProcessor",
30
+ "video_processor": {
31
+ "data_format": "channels_first",
32
+ "default_to_square": true,
33
+ "do_convert_rgb": true,
34
+ "do_normalize": true,
35
+ "do_rescale": true,
36
+ "do_resize": true,
37
+ "do_sample_frames": true,
38
+ "fps": 2,
39
+ "image_mean": [
40
+ 0.5,
41
+ 0.5,
42
+ 0.5
43
+ ],
44
+ "image_std": [
45
+ 0.5,
46
+ 0.5,
47
+ 0.5
48
+ ],
49
+ "max_frames": 768,
50
+ "merge_size": 2,
51
+ "min_frames": 4,
52
+ "patch_size": 16,
53
+ "resample": 3,
54
+ "rescale_factor": 0.00392156862745098,
55
+ "return_metadata": false,
56
+ "size": {
57
+ "longest_edge": 25165824,
58
+ "shortest_edge": 4096
59
+ },
60
+ "temporal_patch_size": 2,
61
+ "video_processor_type": "Qwen3VLVideoProcessor"
62
+ }
63
+ }
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:87a7830d63fcf43bf241c3c5242e96e62dd3fdc29224ca26fed8ea333db72de4
3
+ size 19989343
tokenizer_config.json ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": false,
3
+ "audio_bos_token": "<|audio_start|>",
4
+ "audio_eos_token": "<|audio_end|>",
5
+ "audio_token": "<|audio_pad|>",
6
+ "backend": "tokenizers",
7
+ "bos_token": null,
8
+ "clean_up_tokenization_spaces": false,
9
+ "eos_token": "<|im_end|>",
10
+ "errors": "replace",
11
+ "image_token": "<|image_pad|>",
12
+ "is_local": false,
13
+ "model_max_length": 262144,
14
+ "model_specific_special_tokens": {
15
+ "audio_bos_token": "<|audio_start|>",
16
+ "audio_eos_token": "<|audio_end|>",
17
+ "audio_token": "<|audio_pad|>",
18
+ "image_token": "<|image_pad|>",
19
+ "video_token": "<|video_pad|>",
20
+ "vision_bos_token": "<|vision_start|>",
21
+ "vision_eos_token": "<|vision_end|>"
22
+ },
23
+ "pad_token": "<|vision_pad|>",
24
+ "padding_side": "left",
25
+ "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+",
26
+ "processor_class": "Qwen3VLProcessor",
27
+ "split_special_tokens": false,
28
+ "tokenizer_class": "TokenizersBackend",
29
+ "unk_token": null,
30
+ "video_token": "<|video_pad|>",
31
+ "vision_bos_token": "<|vision_start|>",
32
+ "vision_eos_token": "<|vision_end|>"
33
+ }