Shpigford commited on
Commit
fdf2e12
·
verified ·
1 Parent(s): f9eec12

Upload folder using huggingface_hub

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* 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
 
 
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
README.md ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ language:
4
+ - en
5
+ library_name: mlx
6
+ pipeline_tag: text-generation
7
+ base_model: Qwen/Qwen2.5-1.5B-Instruct
8
+ tags:
9
+ - cron
10
+ - systemd
11
+ - devops
12
+ - schedule
13
+ - text-generation
14
+ - mlx
15
+ - lora
16
+ datasets:
17
+ - joshpigford/cron-schedule-conversion
18
+ ---
19
+
20
+ # Shpigford/cron-mini
21
+
22
+ A small fine-tuned language model that converts natural-language schedules into cron expressions and systemd `OnCalendar` strings.
23
+
24
+ ## What it does
25
+
26
+ ```
27
+ Input: every Tuesday at 3am except December
28
+
29
+ Output: {"cron": "0 3 * 1-11 2",
30
+ "systemd": "Tue *-01..11-* 03:00:00",
31
+ "note": "Months 1-11 only excludes December."}
32
+ ```
33
+
34
+ It handles:
35
+
36
+ - Standard schedules (daily, weekly, monthly, every N minutes/hours)
37
+ - Holidays (Christmas, Thanksgiving, Black Friday, Halloween, etc.)
38
+ - Casual time references ("lunchtime", "before bed", "first thing in the morning")
39
+ - Ordinal weekdays ("second Tuesday of the month", "last Friday")
40
+ - Negative specifications ("every day except Sunday", "all months except December")
41
+ - Sub-minute intervals (cron can't, systemd can — model annotates the limitation)
42
+ - Awkward intervals (every 90 minutes — cron can't, expanded across the day)
43
+ - Compound schedules requiring multiple cron lines
44
+ - systemd-specific features (`OnBootSec=`, `Persistent=`, `RandomizedDelaySec=`)
45
+ - Time zones (sets `TZ=` for cron, uses `Asia/Tokyo`-style for systemd)
46
+ - Typos and informal phrasings ("evry tues @ 3am")
47
+
48
+ ## Usage
49
+
50
+ ### MLX (Apple Silicon)
51
+
52
+ ```python
53
+ from mlx_lm import load, generate
54
+
55
+ model, tokenizer = load("Shpigford/cron-mini")
56
+
57
+ SYSTEM = ("You convert natural-language schedules into cron expressions and "
58
+ "systemd OnCalendar strings. Output JSON with keys: cron, systemd, "
59
+ "note. If cron cannot exactly express the schedule, put the closest "
60
+ "valid cron and explain in note. Do not output anything else.")
61
+
62
+ messages = [
63
+ {"role": "system", "content": SYSTEM},
64
+ {"role": "user", "content": "Convert this schedule to cron and systemd OnCalendar: every weekday at 9am"},
65
+ ]
66
+ prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
67
+ print(generate(model, tokenizer, prompt=prompt, max_tokens=200, temp=0.0))
68
+ ```
69
+
70
+ ### Transformers (any platform)
71
+
72
+ ```python
73
+ from transformers import AutoModelForCausalLM, AutoTokenizer
74
+
75
+ model = AutoModelForCausalLM.from_pretrained("Shpigford/cron-mini", torch_dtype="auto", device_map="auto")
76
+ tokenizer = AutoTokenizer.from_pretrained("Shpigford/cron-mini")
77
+
78
+ SYSTEM = "..." # same as above
79
+ messages = [
80
+ {"role": "system", "content": SYSTEM},
81
+ {"role": "user", "content": "Convert this schedule to cron and systemd OnCalendar: every weekday at 9am"},
82
+ ]
83
+ inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
84
+ out = model.generate(inputs, max_new_tokens=200, do_sample=False)
85
+ print(tokenizer.decode(out[0][inputs.shape[1]:], skip_special_tokens=True))
86
+ ```
87
+
88
+ ### llama.cpp / Ollama (GGUF)
89
+
90
+ A GGUF version is available — see the Files tab for `.gguf` files. Load with llama.cpp or import into Ollama:
91
+
92
+ ```bash
93
+ ollama create cron-mini -f Modelfile
94
+ ```
95
+
96
+ ## Evaluation
97
+
98
+ Held-out test set of 91 cases including all the trick categories above:
99
+
100
+ - **Overall (cron+systemd both correct):** 63/91 (69.2%)
101
+ - **Cron exact match:** 73/91 (80.2%)
102
+ - **Cron syntactically valid:** 87/91 (95.6%)
103
+ - **systemd exact match:** 71/91 (78.0%)
104
+
105
+ See `eval_results.json` in this repo for per-case results.
106
+
107
+ ## Training
108
+
109
+ - **Base model:** `Qwen/Qwen2.5-1.5B-Instruct` (Apache 2.0)
110
+ - **Method:** LoRA fine-tune via [mlx-lm](https://github.com/ml-explore/mlx-examples/tree/main/llms)
111
+ - **Hardware:** M4 Mac mini, 16GB unified memory
112
+ - **Dataset:** ~3000 examples — hand-crafted hard cases + templated generation + Claude-API paraphrases and synthetic novel cases (verified with a self-check pass)
113
+ - **Dataset on HF:** [joshpigford/cron-schedule-conversion](https://huggingface.co/datasets/joshpigford/cron-schedule-conversion)
114
+
115
+ ## Limitations
116
+
117
+ - The model emits a single best-guess for ambiguous fuzzy times (e.g., "morning" → 7am). It will not ask clarifying questions.
118
+ - For "every other Monday" / "biweekly" / "fortnightly" patterns, cron cannot express them natively — the model emits "every Monday" and notes the limitation. Gate in your script with a week-of-year check.
119
+ - For "last day of month" / "last Friday", cron has no native expression — the model approximates with day-of-month ranges and flags the limitation.
120
+ - Vixie cron OR-matches DOM and DOW when both are restricted; the model emits expressions that work under the more common AND-matching interpretation. Verify on your specific cron implementation.
121
+ - Time zone handling: cron has no built-in TZ field; the model emits the schedule in the system's local time and notes when a `TZ=` env var is needed.
122
+ - Trained on English. Other languages will likely degrade significantly.
123
+
124
+ ## License
125
+
126
+ Apache 2.0, same as the base model.
127
+
128
+ ## Citation
129
+
130
+ If you find this useful:
131
+
132
+ ```bibtex
133
+ @misc{cron-mini,
134
+ author = {Pigford, Josh},
135
+ title = {Cron-Mini: A Small Model for Schedule Conversion},
136
+ year = {2026},
137
+ howpublished = {Hugging Face},
138
+ url = {https://huggingface.co/Shpigford/cron-mini}
139
+ }
140
+ ```
chat_template.jinja ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {%- if tools %}
2
+ {{- '<|im_start|>system\n' }}
3
+ {%- if messages[0]['role'] == 'system' %}
4
+ {{- messages[0]['content'] }}
5
+ {%- else %}
6
+ {{- 'You are Qwen, created by Alibaba Cloud. You are a helpful assistant.' }}
7
+ {%- endif %}
8
+ {{- "\n\n# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" }}
9
+ {%- for tool in tools %}
10
+ {{- "\n" }}
11
+ {{- tool | tojson }}
12
+ {%- endfor %}
13
+ {{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }}
14
+ {%- else %}
15
+ {%- if messages[0]['role'] == 'system' %}
16
+ {{- '<|im_start|>system\n' + messages[0]['content'] + '<|im_end|>\n' }}
17
+ {%- else %}
18
+ {{- '<|im_start|>system\nYou are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>\n' }}
19
+ {%- endif %}
20
+ {%- endif %}
21
+ {%- for message in messages %}
22
+ {%- if (message.role == "user") or (message.role == "system" and not loop.first) or (message.role == "assistant" and not message.tool_calls) %}
23
+ {{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }}
24
+ {%- elif message.role == "assistant" %}
25
+ {{- '<|im_start|>' + message.role }}
26
+ {%- if message.content %}
27
+ {{- '\n' + message.content }}
28
+ {%- endif %}
29
+ {%- for tool_call in message.tool_calls %}
30
+ {%- if tool_call.function is defined %}
31
+ {%- set tool_call = tool_call.function %}
32
+ {%- endif %}
33
+ {{- '\n<tool_call>\n{"name": "' }}
34
+ {{- tool_call.name }}
35
+ {{- '", "arguments": ' }}
36
+ {{- tool_call.arguments | tojson }}
37
+ {{- '}\n</tool_call>' }}
38
+ {%- endfor %}
39
+ {{- '<|im_end|>\n' }}
40
+ {%- elif message.role == "tool" %}
41
+ {%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != "tool") %}
42
+ {{- '<|im_start|>user' }}
43
+ {%- endif %}
44
+ {{- '\n<tool_response>\n' }}
45
+ {{- message.content }}
46
+ {{- '\n</tool_response>' }}
47
+ {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}
48
+ {{- '<|im_end|>\n' }}
49
+ {%- endif %}
50
+ {%- endif %}
51
+ {%- endfor %}
52
+ {%- if add_generation_prompt %}
53
+ {{- '<|im_start|>assistant\n' }}
54
+ {%- endif %}
config.json ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "Qwen2ForCausalLM"
4
+ ],
5
+ "attention_dropout": 0.0,
6
+ "bos_token_id": 151643,
7
+ "eos_token_id": [
8
+ 151645,
9
+ 151643
10
+ ],
11
+ "hidden_act": "silu",
12
+ "hidden_size": 1536,
13
+ "initializer_range": 0.02,
14
+ "intermediate_size": 8960,
15
+ "max_position_embeddings": 32768,
16
+ "max_window_layers": 21,
17
+ "model_type": "qwen2",
18
+ "num_attention_heads": 12,
19
+ "num_hidden_layers": 28,
20
+ "num_key_value_heads": 2,
21
+ "rms_norm_eps": 1e-06,
22
+ "rope_theta": 1000000.0,
23
+ "sliding_window": 32768,
24
+ "tie_word_embeddings": true,
25
+ "torch_dtype": "bfloat16",
26
+ "transformers_version": "4.43.1",
27
+ "use_cache": true,
28
+ "use_sliding_window": false,
29
+ "vocab_size": 151936
30
+ }
eval_results.json ADDED
@@ -0,0 +1,1375 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "summary": {
3
+ "cron_exact": "73/91 (80.2%)",
4
+ "cron_valid": "87/91 (95.6%)",
5
+ "systemd_exact": "71/91 (78.0%)",
6
+ "overall": "63/91 (69.2%)"
7
+ },
8
+ "results": [
9
+ {
10
+ "nl": "every Tuesday at 3am except December",
11
+ "expected": {
12
+ "cron": "0 3 * 1-11 2",
13
+ "systemd": "Tue *-01..11-* 03:00:00"
14
+ },
15
+ "got": {
16
+ "cron": "0 3 * 1-11 2",
17
+ "systemd": "Tue *-01..11-* 03:00:00",
18
+ "note": "Months 1-11 only excludes December."
19
+ },
20
+ "cron_exact": true,
21
+ "systemd_exact": true,
22
+ "cron_valid": true
23
+ },
24
+ {
25
+ "nl": "the last Friday of every month at 11pm",
26
+ "expected": {
27
+ "cron": "0 23 * * 5",
28
+ "systemd": "Fri *-*-25..31 23:00:00"
29
+ },
30
+ "got": {
31
+ "cron": "0 23 25-31 * 5",
32
+ "systemd": "Fri *-*-25..31 23:00:00",
33
+ "note": "Last Friday of month = DOM 25-31 + Fri (last 7 calendar days always have a Fri)."
34
+ },
35
+ "cron_exact": false,
36
+ "systemd_exact": true,
37
+ "cron_valid": true
38
+ },
39
+ {
40
+ "nl": "every other Monday at noon",
41
+ "expected": {
42
+ "cron": "0 12 * * 1",
43
+ "systemd": "Mon *-*-* 12:00:00"
44
+ },
45
+ "got": {
46
+ "cron": "0 12 * * 1",
47
+ "systemd": "Mon *-*-* 12:00:00",
48
+ "note": "Cron cannot express 'every other week' \u2014 runs every Monday, gate in script with week-of-year %2."
49
+ },
50
+ "cron_exact": true,
51
+ "systemd_exact": true,
52
+ "cron_valid": true
53
+ },
54
+ {
55
+ "nl": "first Sunday of the month at midnight",
56
+ "expected": {
57
+ "cron": "0 0 1-7 * 0",
58
+ "systemd": "Sun *-*-01..07 00:00:00"
59
+ },
60
+ "got": {
61
+ "cron": "0 0 1-7 * 0",
62
+ "systemd": "Sun *-*-01..07 00:00:00",
63
+ "note": "Day-of-month 1-7 + specific weekday = first occurrence in the month."
64
+ },
65
+ "cron_exact": true,
66
+ "systemd_exact": true,
67
+ "cron_valid": true
68
+ },
69
+ {
70
+ "nl": "second Tuesday of every month at 9am",
71
+ "expected": {
72
+ "cron": "0 9 8-14 * 2",
73
+ "systemd": "Tue *-*-08..14 09:00:00"
74
+ },
75
+ "got": {
76
+ "cron": "0 9 15-21 * 2",
77
+ "systemd": "Tue *-*-15..21 09:00:00",
78
+ "note": "Second Tuesday of month = DOM 15-21 + Tue."
79
+ },
80
+ "cron_exact": false,
81
+ "systemd_exact": false,
82
+ "cron_valid": true
83
+ },
84
+ {
85
+ "nl": "third Thursday of every month at 2pm",
86
+ "expected": {
87
+ "cron": "0 14 15-21 * 4",
88
+ "systemd": "Thu *-*-15..21 14:00:00"
89
+ },
90
+ "got": {
91
+ "cron": "0 14 15-21 * 4",
92
+ "systemd": "Thu *-*-15..21 14:00:00",
93
+ "note": "DOM 15-21 + Thu = third Thursday of the month."
94
+ },
95
+ "cron_exact": true,
96
+ "systemd_exact": true,
97
+ "cron_valid": true
98
+ },
99
+ {
100
+ "nl": "every Friday the 13th at midnight",
101
+ "expected": {
102
+ "cron": "0 0 13 * 5",
103
+ "systemd": "Fri *-*-13 00:00:00"
104
+ },
105
+ "got": {
106
+ "cron": "0 0 13 * 5",
107
+ "systemd": "Fri *-*-13 00:00:00",
108
+ "note": "Vixie cron OR-matches DOM and DOW; use systemd or guard with a date check."
109
+ },
110
+ "cron_exact": true,
111
+ "systemd_exact": true,
112
+ "cron_valid": true
113
+ },
114
+ {
115
+ "nl": "every 30 seconds",
116
+ "expected": {
117
+ "cron": "* * * * *",
118
+ "systemd": "*-*-* *:*:0/30"
119
+ },
120
+ "got": {
121
+ "cron": "* * * * *",
122
+ "systemd": "*-*-* *:*:0/30",
123
+ "note": "Cron has no sub-minute granularity \u2014 runs every minute."
124
+ },
125
+ "cron_exact": true,
126
+ "systemd_exact": true,
127
+ "cron_valid": true
128
+ },
129
+ {
130
+ "nl": "every 10 seconds",
131
+ "expected": {
132
+ "cron": "* * * * *",
133
+ "systemd": "*-*-* *:*:0/10"
134
+ },
135
+ "got": {
136
+ "cron": "* * * * *",
137
+ "systemd": "*-*-* *:*:0/10",
138
+ "note": "Cron cannot do sub-minute. systemd: 0/10."
139
+ },
140
+ "cron_exact": true,
141
+ "systemd_exact": true,
142
+ "cron_valid": true
143
+ },
144
+ {
145
+ "nl": "every 5 seconds",
146
+ "expected": {
147
+ "cron": "* * * * *",
148
+ "systemd": "*-*-* *:*:0/5"
149
+ },
150
+ "got": {
151
+ "cron": "* * * * *",
152
+ "systemd": "*-*-* *:*:0/5",
153
+ "note": "Cron cannot do sub-minute."
154
+ },
155
+ "cron_exact": true,
156
+ "systemd_exact": true,
157
+ "cron_valid": true
158
+ },
159
+ {
160
+ "nl": "every second",
161
+ "expected": {
162
+ "cron": "* * * * *",
163
+ "systemd": "*-*-* *:*:*"
164
+ },
165
+ "got": {
166
+ "cron": "* * * * *",
167
+ "systemd": "*-*-* *:*:0",
168
+ "note": "Cron has no second-level granularity. Even systemd is not ideal \u2014 consider a long-running daemon."
169
+ },
170
+ "cron_exact": true,
171
+ "systemd_exact": false,
172
+ "cron_valid": true
173
+ },
174
+ {
175
+ "nl": "every Christmas at 7am",
176
+ "expected": {
177
+ "cron": "0 7 25 12 *",
178
+ "systemd": "*-12-25 07:00:00"
179
+ },
180
+ "got": {
181
+ "cron": "0 7 25 12 *",
182
+ "systemd": "*-12-25 07:00:00",
183
+ "note": ""
184
+ },
185
+ "cron_exact": true,
186
+ "systemd_exact": true,
187
+ "cron_valid": true
188
+ },
189
+ {
190
+ "nl": "every New Year's Day at midnight",
191
+ "expected": {
192
+ "cron": "0 0 1 1 *",
193
+ "systemd": "*-01-01 00:00:00"
194
+ },
195
+ "got": {
196
+ "cron": "0 0 1 1 *",
197
+ "systemd": "*-01-01 00:00:00",
198
+ "note": ""
199
+ },
200
+ "cron_exact": true,
201
+ "systemd_exact": true,
202
+ "cron_valid": true
203
+ },
204
+ {
205
+ "nl": "every New Year's Eve at 11:59pm",
206
+ "expected": {
207
+ "cron": "59 23 31 12 *",
208
+ "systemd": "*-12-31 23:59:00"
209
+ },
210
+ "got": {
211
+ "cron": "59 23 31 12 *",
212
+ "systemd": "*-12-31 23:59:00",
213
+ "note": ""
214
+ },
215
+ "cron_exact": true,
216
+ "systemd_exact": true,
217
+ "cron_valid": true
218
+ },
219
+ {
220
+ "nl": "every Halloween at 6pm",
221
+ "expected": {
222
+ "cron": "0 18 31 10 *",
223
+ "systemd": "*-10-31 18:00:00"
224
+ },
225
+ "got": {
226
+ "cron": "0 18 31 10 *",
227
+ "systemd": "*-10-31 18:00:00",
228
+ "note": ""
229
+ },
230
+ "cron_exact": true,
231
+ "systemd_exact": true,
232
+ "cron_valid": true
233
+ },
234
+ {
235
+ "nl": "Independence Day at noon",
236
+ "expected": {
237
+ "cron": "0 12 4 7 *",
238
+ "systemd": "*-07-04 12:00:00"
239
+ },
240
+ "got": {
241
+ "cron": "0 12 4 7 *",
242
+ "systemd": "*-07-04 12:00:00",
243
+ "note": ""
244
+ },
245
+ "cron_exact": true,
246
+ "systemd_exact": true,
247
+ "cron_valid": true
248
+ },
249
+ {
250
+ "nl": "every Valentine's Day at 9am",
251
+ "expected": {
252
+ "cron": "0 9 14 2 *",
253
+ "systemd": "*-02-14 09:00:00"
254
+ },
255
+ "got": {
256
+ "cron": "0 9 14 2 *",
257
+ "systemd": "*-02-14 09:00:00",
258
+ "note": ""
259
+ },
260
+ "cron_exact": true,
261
+ "systemd_exact": true,
262
+ "cron_valid": true
263
+ },
264
+ {
265
+ "nl": "every leap day at midnight",
266
+ "expected": {
267
+ "cron": "0 0 29 2 *",
268
+ "systemd": "*-02-29 00:00:00"
269
+ },
270
+ "got": {
271
+ "cron": "0 0 29 2 *",
272
+ "systemd": "*-02-29 00:00:00",
273
+ "note": "Runs only in leap years."
274
+ },
275
+ "cron_exact": true,
276
+ "systemd_exact": true,
277
+ "cron_valid": true
278
+ },
279
+ {
280
+ "nl": "every April Fools' Day at 8am",
281
+ "expected": {
282
+ "cron": "0 8 1 4 *",
283
+ "systemd": "*-04-01 08:00:00"
284
+ },
285
+ "got": {
286
+ "cron": "0 8 1 4 *",
287
+ "systemd": "*-04-01 08:00:00",
288
+ "note": ""
289
+ },
290
+ "cron_exact": true,
291
+ "systemd_exact": true,
292
+ "cron_valid": true
293
+ },
294
+ {
295
+ "nl": "Black Friday at 6am",
296
+ "expected": {
297
+ "cron": "0 6 23-29 11 5",
298
+ "systemd": "Fri *-11-23..29 06:00:00"
299
+ },
300
+ "got": {
301
+ "cron": "0 6 23 11 *",
302
+ "systemd": "*-11-23 06:00:00",
303
+ "note": ""
304
+ },
305
+ "cron_exact": false,
306
+ "systemd_exact": false,
307
+ "cron_valid": true
308
+ },
309
+ {
310
+ "nl": "every Thanksgiving at 11am",
311
+ "expected": {
312
+ "cron": "0 11 22-28 11 4",
313
+ "systemd": "Thu *-11-22..28 11:00:00"
314
+ },
315
+ "got": {
316
+ "cron": "0 11 22 11 *",
317
+ "systemd": "*-11-22 11:00:00",
318
+ "note": ""
319
+ },
320
+ "cron_exact": false,
321
+ "systemd_exact": false,
322
+ "cron_valid": true
323
+ },
324
+ {
325
+ "nl": "every morning",
326
+ "expected": {
327
+ "cron": "0 7 * * *",
328
+ "systemd": "*-*-* 07:00:00"
329
+ },
330
+ "got": {
331
+ "cron": "0 7 * * *",
332
+ "systemd": "*-*-* 07:00:00",
333
+ "note": "'first thing' interpreted as 7am."
334
+ },
335
+ "cron_exact": true,
336
+ "systemd_exact": true,
337
+ "cron_valid": true
338
+ },
339
+ {
340
+ "nl": "every night before bed",
341
+ "expected": {
342
+ "cron": "0 22 * * *",
343
+ "systemd": "*-*-* 22:00:00"
344
+ },
345
+ "got": {
346
+ "cron": "0 22 * * *",
347
+ "systemd": "*-*-* 22:00:00",
348
+ "note": "'before bed' interpreted as 10pm."
349
+ },
350
+ "cron_exact": true,
351
+ "systemd_exact": true,
352
+ "cron_valid": true
353
+ },
354
+ {
355
+ "nl": "first thing in the morning",
356
+ "expected": {
357
+ "cron": "0 6 * * *",
358
+ "systemd": "*-*-* 06:00:00"
359
+ },
360
+ "got": {
361
+ "cron": "0 6 * * *",
362
+ "systemd": "*-*-* 06:00:00",
363
+ "note": "'first thing in the morning' interpreted as 6am."
364
+ },
365
+ "cron_exact": true,
366
+ "systemd_exact": true,
367
+ "cron_valid": true
368
+ },
369
+ {
370
+ "nl": "at lunchtime every weekday",
371
+ "expected": {
372
+ "cron": "0 12 * * 1-5",
373
+ "systemd": "Mon..Fri *-*-* 12:00:00"
374
+ },
375
+ "got": {
376
+ "cron": "0 12 * * 1-5",
377
+ "systemd": "Mon..Fri *-*-* 12:00:00",
378
+ "note": "'lunchtime' interpreted as noon weekdays."
379
+ },
380
+ "cron_exact": true,
381
+ "systemd_exact": true,
382
+ "cron_valid": true
383
+ },
384
+ {
385
+ "nl": "at the crack of dawn",
386
+ "expected": {
387
+ "cron": "0 5 * * *",
388
+ "systemd": "*-*-* 05:00:00"
389
+ },
390
+ "got": {
391
+ "cron": "0 5 * * *",
392
+ "systemd": "*-*-* 05:00:00",
393
+ "note": "'crack of dawn' interpreted as 5am."
394
+ },
395
+ "cron_exact": true,
396
+ "systemd_exact": true,
397
+ "cron_valid": true
398
+ },
399
+ {
400
+ "nl": "every day at end of business",
401
+ "expected": {
402
+ "cron": "0 17 * * 1-5",
403
+ "systemd": "Mon..Fri *-*-* 17:00:00"
404
+ },
405
+ "got": {
406
+ "cron": "0 17 * * 1-5",
407
+ "systemd": "Mon..Fri *-*-* 17:00:00",
408
+ "note": "'end of day' interpreted as 5pm weekdays."
409
+ },
410
+ "cron_exact": true,
411
+ "systemd_exact": true,
412
+ "cron_valid": true
413
+ },
414
+ {
415
+ "nl": "early morning every Sunday",
416
+ "expected": {
417
+ "cron": "0 5 * * 0",
418
+ "systemd": "Sun *-*-* 05:00:00"
419
+ },
420
+ "got": {
421
+ "cron": "0 5 * * 0",
422
+ "systemd": "Sun *-*-* 5:00:00",
423
+ "note": "'first thing' interpreted as 5am."
424
+ },
425
+ "cron_exact": true,
426
+ "systemd_exact": false,
427
+ "cron_valid": true
428
+ },
429
+ {
430
+ "nl": "every afternoon",
431
+ "expected": {
432
+ "cron": "0 14 * * *",
433
+ "systemd": "*-*-* 14:00:00"
434
+ },
435
+ "got": {
436
+ "cron": "0 14 * * *",
437
+ "systemd": "*-*-* 14:00:00",
438
+ "note": "'afternoon' interpreted as 2pm."
439
+ },
440
+ "cron_exact": true,
441
+ "systemd_exact": true,
442
+ "cron_valid": true
443
+ },
444
+ {
445
+ "nl": "every evening",
446
+ "expected": {
447
+ "cron": "0 19 * * *",
448
+ "systemd": "*-*-* 19:00:00"
449
+ },
450
+ "got": {
451
+ "cron": "0 19 * * *",
452
+ "systemd": "*-*-* 19:00:00",
453
+ "note": "'evening' interpreted as 7pm."
454
+ },
455
+ "cron_exact": true,
456
+ "systemd_exact": true,
457
+ "cron_valid": true
458
+ },
459
+ {
460
+ "nl": "around midnight every Friday",
461
+ "expected": {
462
+ "cron": "0 0 * * 5",
463
+ "systemd": "Fri *-*-* 00:00:00"
464
+ },
465
+ "got": {
466
+ "cron": "0 0 * * 5",
467
+ "systemd": "Fri *-*-* 00:00:00",
468
+ "note": ""
469
+ },
470
+ "cron_exact": true,
471
+ "systemd_exact": true,
472
+ "cron_valid": true
473
+ },
474
+ {
475
+ "nl": "every day except Sunday at 8am",
476
+ "expected": {
477
+ "cron": "0 8 * * 1-6",
478
+ "systemd": "Mon..Sat *-*-* 08:00:00"
479
+ },
480
+ "got": {
481
+ "cron": "0 8 * * 1-6",
482
+ "systemd": "Mon..Sat *-*-* 08:00:00",
483
+ "note": ""
484
+ },
485
+ "cron_exact": true,
486
+ "systemd_exact": true,
487
+ "cron_valid": true
488
+ },
489
+ {
490
+ "nl": "every minute except between 2am and 3am",
491
+ "expected": {
492
+ "cron": "* 0-1,3-23 * * *",
493
+ "systemd": "*-*-* 00..01,03..23:*:00"
494
+ },
495
+ "got": {
496
+ "cron": "* 0-1,3-23 * * *",
497
+ "systemd": "*-*-* 00..01..03..23:*:00",
498
+ "note": "Skip the 2-3 AM hour for backups."
499
+ },
500
+ "cron_exact": true,
501
+ "systemd_exact": false,
502
+ "cron_valid": true
503
+ },
504
+ {
505
+ "nl": "every hour except midnight",
506
+ "expected": {
507
+ "cron": "0 1-23 * * *",
508
+ "systemd": "*-*-* 01..23:00:00"
509
+ },
510
+ "got": {
511
+ "cron": "0 1-23 * * *",
512
+ "systemd": "*-*-* 01..03:00",
513
+ "note": ""
514
+ },
515
+ "cron_exact": true,
516
+ "systemd_exact": false,
517
+ "cron_valid": true
518
+ },
519
+ {
520
+ "nl": "every day at 9am, but not on weekends",
521
+ "expected": {
522
+ "cron": "0 9 * * 1-5",
523
+ "systemd": "Mon..Fri *-*-* 09:00:00"
524
+ },
525
+ "got": {
526
+ "cron": "0 9 * * 1-5",
527
+ "systemd": "Mon..Fri *-*-* 09:00:00",
528
+ "note": "'Not weekends' = Mon-Fri only."
529
+ },
530
+ "cron_exact": true,
531
+ "systemd_exact": true,
532
+ "cron_valid": true
533
+ },
534
+ {
535
+ "nl": "every Tuesday at 4pm except in summer",
536
+ "expected": {
537
+ "cron": "0 16 * 1-5,9-12 2",
538
+ "systemd": "Tue *-01..05,09..12-* 16:00:00"
539
+ },
540
+ "got": {
541
+ "cron": "0 16 * 1-7,9-12 2",
542
+ "systemd": "Tue *-01..07,09..12-* 16:00:00",
543
+ "note": "All months except August (month 8)."
544
+ },
545
+ "cron_exact": false,
546
+ "systemd_exact": false,
547
+ "cron_valid": true
548
+ },
549
+ {
550
+ "nl": "every Sunday at 4am except in July",
551
+ "expected": {
552
+ "cron": "0 4 * 1-6,8-12 0",
553
+ "systemd": "Sun *-01..06,08..12-* 04:00:00"
554
+ },
555
+ "got": {
556
+ "cron": "0 4 * 1-6,8-12 0",
557
+ "systemd": "Sun *-01..06,08..12-* 04:00:00",
558
+ "note": "Every Sunday at 04:00 for months 1-6, August-December (last day of month = DOM 25-31)."
559
+ },
560
+ "cron_exact": true,
561
+ "systemd_exact": true,
562
+ "cron_valid": true
563
+ },
564
+ {
565
+ "nl": "any day except Friday at midnight",
566
+ "expected": {
567
+ "cron": "0 0 * * 0-4,6",
568
+ "systemd": "Sun..Thu,Sat *-*-* 00:00:00"
569
+ },
570
+ "got": {
571
+ "cron": "0 0 * * 0-4,6",
572
+ "systemd": "Sun..Thu,Sat *-*-* 00:00:00",
573
+ "note": "Every day except Friday (DOW 5) at midnight."
574
+ },
575
+ "cron_exact": true,
576
+ "systemd_exact": true,
577
+ "cron_valid": true
578
+ },
579
+ {
580
+ "nl": "every Tuesday and Thursday at 9am and 3pm",
581
+ "expected": {
582
+ "cron": "0 9,15 * * 2,4",
583
+ "systemd": "Tue,Thu *-*-* 09,15:00:00"
584
+ },
585
+ "got": {
586
+ "cron": "0 9,15 * * 2,4",
587
+ "systemd": "Tue,Thu *-*-* 09,15:00",
588
+ "note": ""
589
+ },
590
+ "cron_exact": true,
591
+ "systemd_exact": false,
592
+ "cron_valid": true
593
+ },
594
+ {
595
+ "nl": "9am Monday through Friday, plus 10am on Saturday",
596
+ "expected": {
597
+ "cron": "0 9 * * 1-5\n0 10 * * 6",
598
+ "systemd": "Mon..Fri *-*-* 09:00:00\nSat *-*-* 10:00:00"
599
+ },
600
+ "got": {
601
+ "cron": "0 9 * * 1-5\n0 10 * * 6",
602
+ "systemd": "Mon..Fri *-*-* 09:00:00\nSat *-*-* 10:00:00",
603
+ "note": "Two schedules \u2014 different times for different days."
604
+ },
605
+ "cron_exact": true,
606
+ "systemd_exact": true,
607
+ "cron_valid": true
608
+ },
609
+ {
610
+ "nl": "every weekday at 8am and weekends at 10am",
611
+ "expected": {
612
+ "cron": "0 8 * * 1-5\n0 10 * * 0,6",
613
+ "systemd": "Mon..Fri *-*-* 08:00:00\nSat,Sun *-*-* 10:00:00"
614
+ },
615
+ "got": {
616
+ "cron": "0 8 * * 1-5\n0 10 * * 0,6",
617
+ "systemd": "Mon..Fri *-*-* 08:00:00\nSat,Sun *-*-* 10:00:00",
618
+ "note": "Two schedules \u2014 earlier weekdays, later weekends."
619
+ },
620
+ "cron_exact": true,
621
+ "systemd_exact": true,
622
+ "cron_valid": true
623
+ },
624
+ {
625
+ "nl": "twice a day, at 9am and 5pm, every day",
626
+ "expected": {
627
+ "cron": "0 9,17 * * *",
628
+ "systemd": "*-*-* 09,17:00:00"
629
+ },
630
+ "got": {
631
+ "cron": "0 9,17 * * *",
632
+ "systemd": "*-*-* 09,17:00:00",
633
+ "note": ""
634
+ },
635
+ "cron_exact": true,
636
+ "systemd_exact": true,
637
+ "cron_valid": true
638
+ },
639
+ {
640
+ "nl": "three times a day at 8am, noon, and 6pm",
641
+ "expected": {
642
+ "cron": "0 8,12,18 * * *",
643
+ "systemd": "*-*-* 08,12,18:00:00"
644
+ },
645
+ "got": {
646
+ "cron": "0 8,12,18 * * *",
647
+ "systemd": "*-*-* 08,12,18:00:00",
648
+ "note": ""
649
+ },
650
+ "cron_exact": true,
651
+ "systemd_exact": true,
652
+ "cron_valid": true
653
+ },
654
+ {
655
+ "nl": "every weekday at 9, 12, and 3",
656
+ "expected": {
657
+ "cron": "0 9,12,15 * * 1-5",
658
+ "systemd": "Mon..Fri *-*-* 09,12,15:00:00"
659
+ },
660
+ "got": {
661
+ "cron": "0 9,12,15 * * 1-5",
662
+ "systemd": "Mon..Fri *-*-* 9,12,15-*-*",
663
+ "note": "Bare numbers in business context default to AM/PM logically \u2014 9am, noon, 3pm."
664
+ },
665
+ "cron_exact": true,
666
+ "systemd_exact": false,
667
+ "cron_valid": true
668
+ },
669
+ {
670
+ "nl": "every 90 minutes",
671
+ "expected": {
672
+ "cron": "0,30 0,3,6,9,12,15,18,21 * * *\n0 1,4,7,10,13,16,19,22 * * *",
673
+ "systemd": "*-*-* 00/1:30/90:00"
674
+ },
675
+ "got": {
676
+ "cron": "0,30 0,3,6,9,12,15,18,21 * * *\n0 6,9,12,15,18,21 * *",
677
+ "systemd": "*-*-* 06..09,12,15,18,21-*-*",
678
+ "note": "Cron has no native 90-min interval; expanded. systemd handles natively."
679
+ },
680
+ "cron_exact": false,
681
+ "systemd_exact": false,
682
+ "cron_valid": false
683
+ },
684
+ {
685
+ "nl": "every 45 minutes",
686
+ "expected": {
687
+ "cron": "0,45 0,3,6,9,12,15,18,21 * * *\n30 1,4,7,10,13,16,19,22 * * *",
688
+ "systemd": "*-*-* *:0/45:00"
689
+ },
690
+ "got": {
691
+ "cron": "*/45 * * * *",
692
+ "systemd": "*-*-* *:45:00",
693
+ "note": ""
694
+ },
695
+ "cron_exact": false,
696
+ "systemd_exact": false,
697
+ "cron_valid": true
698
+ },
699
+ {
700
+ "nl": "every 100 minutes",
701
+ "expected": {
702
+ "cron": "* * * * *",
703
+ "systemd": "*-*-* 00:00/100:00"
704
+ },
705
+ "got": {
706
+ "cron": "* * * * *",
707
+ "systemd": "*-*-* *:*:0/100",
708
+ "note": "Cron cannot express intervals that don't align to 0:00. Use a script gate or systemd timer."
709
+ },
710
+ "cron_exact": true,
711
+ "systemd_exact": false,
712
+ "cron_valid": true
713
+ },
714
+ {
715
+ "nl": "every 2 hours starting at 1am",
716
+ "expected": {
717
+ "cron": "0 1,3,5,7,9,11,13,15,17,19,21,23 * * *",
718
+ "systemd": "*-*-* 01/2:00:00"
719
+ },
720
+ "got": {
721
+ "cron": "0 0,3,6,9,12,15,18,21 * * *",
722
+ "systemd": "*-*-* 00..03:00/2:00",
723
+ "note": "On the 1st of each month at 00:00."
724
+ },
725
+ "cron_exact": false,
726
+ "systemd_exact": false,
727
+ "cron_valid": true
728
+ },
729
+ {
730
+ "nl": "every 4 hours starting at 2am",
731
+ "expected": {
732
+ "cron": "0 2,6,10,14,18,22 * * *",
733
+ "systemd": "*-*-* 02/4:00:00"
734
+ },
735
+ "got": {
736
+ "cron": "0 2,4,6,8,10,12,14,16,18,20,22,24 * * *",
737
+ "systemd": "*-*-* 02/4:00:00",
738
+ "note": "Cron */4 starts at 00:00."
739
+ },
740
+ "cron_exact": false,
741
+ "systemd_exact": true,
742
+ "cron_valid": false
743
+ },
744
+ {
745
+ "nl": "every 3 hours between 6am and midnight",
746
+ "expected": {
747
+ "cron": "0 6,9,12,15,18,21 * * *",
748
+ "systemd": "*-*-* 06..23:00/180:00"
749
+ },
750
+ "got": {
751
+ "cron": "0 6,9,12,15,18,21 * * *",
752
+ "systemd": "*-*-* 06..23:00/3:00",
753
+ "note": "Last fire before midnight \u2014 23:00."
754
+ },
755
+ "cron_exact": true,
756
+ "systemd_exact": false,
757
+ "cron_valid": true
758
+ },
759
+ {
760
+ "nl": "every hour on the half hour",
761
+ "expected": {
762
+ "cron": "30 * * * *",
763
+ "systemd": "*-*-* *:30:00"
764
+ },
765
+ "got": {
766
+ "cron": "30 * * * *",
767
+ "systemd": "*-*-* *:30:00",
768
+ "note": ""
769
+ },
770
+ "cron_exact": true,
771
+ "systemd_exact": true,
772
+ "cron_valid": true
773
+ },
774
+ {
775
+ "nl": "every hour at quarter past",
776
+ "expected": {
777
+ "cron": "15 * * * *",
778
+ "systemd": "*-*-* *:15:00"
779
+ },
780
+ "got": {
781
+ "cron": "15 * * * *",
782
+ "systemd": "*-*-* *:15:00",
783
+ "note": ""
784
+ },
785
+ "cron_exact": true,
786
+ "systemd_exact": true,
787
+ "cron_valid": true
788
+ },
789
+ {
790
+ "nl": "every hour at the 17th minute",
791
+ "expected": {
792
+ "cron": "17 * * * *",
793
+ "systemd": "*-*-* *:17:00"
794
+ },
795
+ "got": {
796
+ "cron": "17 * * * *",
797
+ "systemd": "*-*-* 17:00:00",
798
+ "note": ""
799
+ },
800
+ "cron_exact": true,
801
+ "systemd_exact": false,
802
+ "cron_valid": true
803
+ },
804
+ {
805
+ "nl": "at 23 minutes past every hour during the workday",
806
+ "expected": {
807
+ "cron": "23 9-17 * * 1-5",
808
+ "systemd": "Mon..Fri *-*-* 09..17:23:00"
809
+ },
810
+ "got": {
811
+ "cron": "23 9-17 * * 1-5",
812
+ "systemd": "Mon..Fri *-*-* 09..17:59:00",
813
+ "note": "9-17 inclusive covers up to 17:59."
814
+ },
815
+ "cron_exact": true,
816
+ "systemd_exact": false,
817
+ "cron_valid": true
818
+ },
819
+ {
820
+ "nl": "at 3pm UTC every day",
821
+ "expected": {
822
+ "cron": "0 15 * * *",
823
+ "systemd": "*-*-* 15:00:00 UTC"
824
+ },
825
+ "got": {
826
+ "cron": "0 15 * * *",
827
+ "systemd": "*-*-* 15:00:00 UTC",
828
+ "note": "Cron uses system timezone; set TZ=UTC at top of crontab."
829
+ },
830
+ "cron_exact": true,
831
+ "systemd_exact": true,
832
+ "cron_valid": true
833
+ },
834
+ {
835
+ "nl": "at 9am Eastern Time every weekday",
836
+ "expected": {
837
+ "cron": "0 9 * * 1-5",
838
+ "systemd": "Mon..Fri *-*-* 09:00:00 America/New_York"
839
+ },
840
+ "got": {
841
+ "cron": "0 9 * * 1-5",
842
+ "systemd": "Mon..Fri *-*-* 09:00:00 America/New_York",
843
+ "note": "Cron has no built-in TZ; set TZ=America/New_York in env."
844
+ },
845
+ "cron_exact": true,
846
+ "systemd_exact": true,
847
+ "cron_valid": true
848
+ },
849
+ {
850
+ "nl": "5 minutes after every boot",
851
+ "expected": {
852
+ "cron": "@reboot sleep 300 && cmd",
853
+ "systemd": "OnBootSec=5min"
854
+ },
855
+ "got": {
856
+ "cron": "@reboot sleep 30 && cmd",
857
+ "systemd": "OnBootSec=5min",
858
+ "note": "Use OnBootSec= in systemd timers (not OnCalendar)."
859
+ },
860
+ "cron_exact": false,
861
+ "systemd_exact": true,
862
+ "cron_valid": true
863
+ },
864
+ {
865
+ "nl": "1 hour after the service starts",
866
+ "expected": {
867
+ "cron": "@reboot sleep 3600 && cmd",
868
+ "systemd": "OnUnitActiveSec=1h"
869
+ },
870
+ "got": {
871
+ "cron": "@reboot sleep 336 && cmd",
872
+ "systemd": "OnUnitActiveSec=1h",
873
+ "note": "OnUnitActiveSec= = relative to service activation. systemd-only feature."
874
+ },
875
+ "cron_exact": false,
876
+ "systemd_exact": true,
877
+ "cron_valid": true
878
+ },
879
+ {
880
+ "nl": "if missed during shutdown, run on next boot",
881
+ "expected": {
882
+ "cron": "0 0 * * *",
883
+ "systemd": "OnCalendar=daily\nPersistent=true"
884
+ },
885
+ "got": {
886
+ "cron": "0 0 * * *",
887
+ "systemd": "OnCalendar=daily\nPersistent=true",
888
+ "note": "Persistent=true is a systemd-specific flag \u2014 runs missed jobs on next boot. Cron has no equivalent."
889
+ },
890
+ "cron_exact": true,
891
+ "systemd_exact": true,
892
+ "cron_valid": true
893
+ },
894
+ {
895
+ "nl": "with random delay up to 30 minutes, every hour",
896
+ "expected": {
897
+ "cron": "0 * * * * sleep $((RANDOM % 1800))",
898
+ "systemd": "OnCalendar=hourly\nRandomizedDelaySec=30min"
899
+ },
900
+ "got": {
901
+ "cron": "0 * * * *",
902
+ "systemd": "OnCalendar=hourly\nRandomizedDelaySec=30min",
903
+ "note": "RandomizedDelaySec= adds jitter \u2014 systemd-only."
904
+ },
905
+ "cron_exact": false,
906
+ "systemd_exact": true,
907
+ "cron_valid": true
908
+ },
909
+ {
910
+ "nl": "first weekday of every month at 8am",
911
+ "expected": {
912
+ "cron": "0 8 1-3 * 1-5",
913
+ "systemd": "Mon..Fri *-*-01..03 08:00:00"
914
+ },
915
+ "got": {
916
+ "cron": "0 8 1-3 * 1-5",
917
+ "systemd": "Mon..Fri *-*-01..03 08:00:00",
918
+ "note": "First weekday of month = DOM 1-3 + Mon-Fri (by day 4 there's always been a weekday)."
919
+ },
920
+ "cron_exact": true,
921
+ "systemd_exact": true,
922
+ "cron_valid": true
923
+ },
924
+ {
925
+ "nl": "at the top of every hour",
926
+ "expected": {
927
+ "cron": "0 * * * *",
928
+ "systemd": "*-*-* *:00:00"
929
+ },
930
+ "got": {
931
+ "cron": "0:00 * * * *",
932
+ "systemd": "*-*-* 00:00:00",
933
+ "note": ""
934
+ },
935
+ "cron_exact": false,
936
+ "systemd_exact": false,
937
+ "cron_valid": false
938
+ },
939
+ {
940
+ "nl": "every 15 minutes",
941
+ "expected": {
942
+ "cron": "*/15 * * * *",
943
+ "systemd": "*-*-* *:0/15:00"
944
+ },
945
+ "got": {
946
+ "cron": "*/15 * * * *",
947
+ "systemd": "*-*-* *:0/15:00",
948
+ "note": ""
949
+ },
950
+ "cron_exact": true,
951
+ "systemd_exact": true,
952
+ "cron_valid": true
953
+ },
954
+ {
955
+ "nl": "every 5 minutes",
956
+ "expected": {
957
+ "cron": "*/5 * * * *",
958
+ "systemd": "*-*-* *:0/5:00"
959
+ },
960
+ "got": {
961
+ "cron": "*/5 * * * *",
962
+ "systemd": "*-*-* *:0/5:00",
963
+ "note": ""
964
+ },
965
+ "cron_exact": true,
966
+ "systemd_exact": true,
967
+ "cron_valid": true
968
+ },
969
+ {
970
+ "nl": "every Sunday at 2:15am",
971
+ "expected": {
972
+ "cron": "15 2 * * 0",
973
+ "systemd": "Sun *-*-* 02:15:00"
974
+ },
975
+ "got": {
976
+ "cron": "15 2 * * 0",
977
+ "systemd": "Sun *-*-* 02:15:00",
978
+ "note": ""
979
+ },
980
+ "cron_exact": true,
981
+ "systemd_exact": true,
982
+ "cron_valid": true
983
+ },
984
+ {
985
+ "nl": "rotate logs nightly at 3am",
986
+ "expected": {
987
+ "cron": "0 3 * * *",
988
+ "systemd": "*-*-* 03:00:00"
989
+ },
990
+ "got": {
991
+ "cron": "0 3 * * *",
992
+ "systemd": "*-*-* 03:00:00",
993
+ "note": ""
994
+ },
995
+ "cron_exact": true,
996
+ "systemd_exact": true,
997
+ "cron_valid": true
998
+ },
999
+ {
1000
+ "nl": "weekly maintenance Sunday at 4am",
1001
+ "expected": {
1002
+ "cron": "0 4 * * 0",
1003
+ "systemd": "Sun *-*-* 04:00:00"
1004
+ },
1005
+ "got": {
1006
+ "cron": "0 4 * * 0",
1007
+ "systemd": "Sun *-*-* 04:00:00",
1008
+ "note": ""
1009
+ },
1010
+ "cron_exact": true,
1011
+ "systemd_exact": true,
1012
+ "cron_valid": true
1013
+ },
1014
+ {
1015
+ "nl": "first day of each quarter at midnight",
1016
+ "expected": {
1017
+ "cron": "0 0 1 1,4,7,10 *",
1018
+ "systemd": "*-01,04,07,10-01 00:00:00"
1019
+ },
1020
+ "got": {
1021
+ "cron": "0 0 1 1,4,7,10 *",
1022
+ "systemd": "*-01,04,07,10-01 00:00:00",
1023
+ "note": ""
1024
+ },
1025
+ "cron_exact": true,
1026
+ "systemd_exact": true,
1027
+ "cron_valid": true
1028
+ },
1029
+ {
1030
+ "nl": "last day of each quarter at 6pm",
1031
+ "expected": {
1032
+ "cron": "0 18 28-31 3,6,9,12 *",
1033
+ "systemd": "*-03,06,09,12-* 18:00:00"
1034
+ },
1035
+ "got": {
1036
+ "cron": "30 18 28-31 3,6,9,12 *",
1037
+ "systemd": "*-03,06,09,12-* 18:00:00",
1038
+ "note": "Last day of quarter \u2014 cron approximates with DOM 28-31, needs date check."
1039
+ },
1040
+ "cron_exact": false,
1041
+ "systemd_exact": true,
1042
+ "cron_valid": true
1043
+ },
1044
+ {
1045
+ "nl": "first Monday of each quarter",
1046
+ "expected": {
1047
+ "cron": "0 0 1-7 1,4,7,10 1",
1048
+ "systemd": "Mon *-01,04,07,10-01..07 00:00:00"
1049
+ },
1050
+ "got": {
1051
+ "cron": "0 0 1-7 1,4,7,10 1",
1052
+ "systemd": "Mon *-01,04,07,10-01..07 00:00:00",
1053
+ "note": ""
1054
+ },
1055
+ "cron_exact": true,
1056
+ "systemd_exact": true,
1057
+ "cron_valid": true
1058
+ },
1059
+ {
1060
+ "nl": "every fiscal year start (April 1)",
1061
+ "expected": {
1062
+ "cron": "0 0 1 4 *",
1063
+ "systemd": "*-04-01 00:00:00"
1064
+ },
1065
+ "got": {
1066
+ "cron": "0 0 1 4 *",
1067
+ "systemd": "*-04-01 00:00:00",
1068
+ "note": ""
1069
+ },
1070
+ "cron_exact": true,
1071
+ "systemd_exact": true,
1072
+ "cron_valid": true
1073
+ },
1074
+ {
1075
+ "nl": "twice an hour",
1076
+ "expected": {
1077
+ "cron": "0,30 * * * *",
1078
+ "systemd": "*-*-* *:00,30:00"
1079
+ },
1080
+ "got": {
1081
+ "cron": "0,30 * * * *",
1082
+ "systemd": "*-*-* *:00,30:00",
1083
+ "note": "On the hour and half hour. Use list 0,30 not */30 to be explicit."
1084
+ },
1085
+ "cron_exact": true,
1086
+ "systemd_exact": true,
1087
+ "cron_valid": true
1088
+ },
1089
+ {
1090
+ "nl": "four times a day at quarter days",
1091
+ "expected": {
1092
+ "cron": "0 0,6,12,18 * * *",
1093
+ "systemd": "*-*-* 00,06,12,18:00:00"
1094
+ },
1095
+ "got": {
1096
+ "cron": "0 9,15,19,21 * * *",
1097
+ "systemd": "*-09,15,19,21-* 09,15,19,21",
1098
+ "note": ""
1099
+ },
1100
+ "cron_exact": false,
1101
+ "systemd_exact": false,
1102
+ "cron_valid": true
1103
+ },
1104
+ {
1105
+ "nl": "biweekly on Friday at 5pm",
1106
+ "expected": {
1107
+ "cron": "0 17 * * 5",
1108
+ "systemd": "Fri *-*-* 17:00:00"
1109
+ },
1110
+ "got": {
1111
+ "cron": "0 17 * * 5",
1112
+ "systemd": "Fri *-*-* 17:00:00",
1113
+ "note": "Cron cannot express 'every other Friday' \u2014 runs this Friday; gate in script with day-of-month %2."
1114
+ },
1115
+ "cron_exact": true,
1116
+ "systemd_exact": true,
1117
+ "cron_valid": true
1118
+ },
1119
+ {
1120
+ "nl": "fortnightly on Monday morning",
1121
+ "expected": {
1122
+ "cron": "0 9 * * 1",
1123
+ "systemd": "Mon *-*-* 09:00:00"
1124
+ },
1125
+ "got": {
1126
+ "cron": "0 9 * * 1",
1127
+ "systemd": "Mon *-*-* 09:00:00",
1128
+ "note": "Fortnightly = every 2 weeks. Cron cannot natively. Gate in script."
1129
+ },
1130
+ "cron_exact": true,
1131
+ "systemd_exact": true,
1132
+ "cron_valid": true
1133
+ },
1134
+ {
1135
+ "nl": "every minute between 9am and 5pm on weekdays",
1136
+ "expected": {
1137
+ "cron": "* 9-16 * * 1-5",
1138
+ "systemd": "Mon..Fri *-*-* 09..16:*:00"
1139
+ },
1140
+ "got": {
1141
+ "cron": "* 9-16 * * 1-5",
1142
+ "systemd": "Mon..Fri *-*-* 09..16:*:00",
1143
+ "note": "9-16 inclusive covers 9:00 to 16:59 (just before 5pm)."
1144
+ },
1145
+ "cron_exact": true,
1146
+ "systemd_exact": true,
1147
+ "cron_valid": true
1148
+ },
1149
+ {
1150
+ "nl": "every 10 minutes from 8am to 6pm exclusive",
1151
+ "expected": {
1152
+ "cron": "*/10 8-17 * * *",
1153
+ "systemd": "*-*-* 08..17:00/10:00"
1154
+ },
1155
+ "got": {
1156
+ "cron": "*/10 8-17 * * 1-5",
1157
+ "systemd": "Mon..Fri *-*-* 08..17:00/10:00",
1158
+ "note": "8-17 inclusive covers up to 17:59."
1159
+ },
1160
+ "cron_exact": false,
1161
+ "systemd_exact": false,
1162
+ "cron_valid": true
1163
+ },
1164
+ {
1165
+ "nl": "at 11:59pm on December 31st",
1166
+ "expected": {
1167
+ "cron": "59 23 31 12 *",
1168
+ "systemd": "*-12-31 23:59:00"
1169
+ },
1170
+ "got": {
1171
+ "cron": "59 23 31 12 *",
1172
+ "systemd": "*-12-31 23:59:00",
1173
+ "note": ""
1174
+ },
1175
+ "cron_exact": true,
1176
+ "systemd_exact": true,
1177
+ "cron_valid": true
1178
+ },
1179
+ {
1180
+ "nl": "noon on March 1st",
1181
+ "expected": {
1182
+ "cron": "0 12 1 3 *",
1183
+ "systemd": "*-03-01 12:00:00"
1184
+ },
1185
+ "got": {
1186
+ "cron": "0 12 1 3 *",
1187
+ "systemd": "*-03-01 12:00:00",
1188
+ "note": ""
1189
+ },
1190
+ "cron_exact": true,
1191
+ "systemd_exact": true,
1192
+ "cron_valid": true
1193
+ },
1194
+ {
1195
+ "nl": "8am on the 15th of every month",
1196
+ "expected": {
1197
+ "cron": "0 8 15 * *",
1198
+ "systemd": "*-*-15 08:00:00"
1199
+ },
1200
+ "got": {
1201
+ "cron": "0 8 15 * *",
1202
+ "systemd": "*-*-15 08:00:00",
1203
+ "note": ""
1204
+ },
1205
+ "cron_exact": true,
1206
+ "systemd_exact": true,
1207
+ "cron_valid": true
1208
+ },
1209
+ {
1210
+ "nl": "every Sunday at 6am",
1211
+ "expected": {
1212
+ "cron": "0 6 * * 0",
1213
+ "systemd": "Sun *-*-* 06:00:00"
1214
+ },
1215
+ "got": {
1216
+ "cron": "0 6 * * 0",
1217
+ "systemd": "Sun *-*-* 06:00:00",
1218
+ "note": ""
1219
+ },
1220
+ "cron_exact": true,
1221
+ "systemd_exact": true,
1222
+ "cron_valid": true
1223
+ },
1224
+ {
1225
+ "nl": "every Saturday night at 11pm",
1226
+ "expected": {
1227
+ "cron": "0 23 * * 6",
1228
+ "systemd": "Sat *-*-* 23:00:00"
1229
+ },
1230
+ "got": {
1231
+ "cron": "0 23 * * 6",
1232
+ "systemd": "Sat *-*-* 23:00:00",
1233
+ "note": ""
1234
+ },
1235
+ "cron_exact": true,
1236
+ "systemd_exact": true,
1237
+ "cron_valid": true
1238
+ },
1239
+ {
1240
+ "nl": "every day in March",
1241
+ "expected": {
1242
+ "cron": "0 0 * 3 *",
1243
+ "systemd": "*-03-* 00:00:00"
1244
+ },
1245
+ "got": {
1246
+ "cron": "0 0 * 3 *",
1247
+ "systemd": "*-03-* 00:00:00",
1248
+ "note": "Defaults to midnight."
1249
+ },
1250
+ "cron_exact": true,
1251
+ "systemd_exact": true,
1252
+ "cron_valid": true
1253
+ },
1254
+ {
1255
+ "nl": "weekdays in Q1 at 9am",
1256
+ "expected": {
1257
+ "cron": "0 9 * 1-3 1-5",
1258
+ "systemd": "Mon..Fri *-01..03-* 09:00:00"
1259
+ },
1260
+ "got": {
1261
+ "cron": "0 9 * 1-3 1-5",
1262
+ "systemd": "Mon..Fri *-01..03-* 09:00:00",
1263
+ "note": ""
1264
+ },
1265
+ "cron_exact": true,
1266
+ "systemd_exact": true,
1267
+ "cron_valid": true
1268
+ },
1269
+ {
1270
+ "nl": "every minute on the dot",
1271
+ "expected": {
1272
+ "cron": "* * * * *",
1273
+ "systemd": "*-*-* *:*:00"
1274
+ },
1275
+ "got": {
1276
+ "cron": "* * * * *",
1277
+ "systemd": "*-*-* *:*:00",
1278
+ "note": ""
1279
+ },
1280
+ "cron_exact": true,
1281
+ "systemd_exact": true,
1282
+ "cron_valid": true
1283
+ },
1284
+ {
1285
+ "nl": "every Friday at 4:20pm",
1286
+ "expected": {
1287
+ "cron": "20 16 * * 5",
1288
+ "systemd": "Fri *-*-* 16:20:00"
1289
+ },
1290
+ "got": {
1291
+ "cron": "20 16 * * 5",
1292
+ "systemd": "Fri *-*-* 16:20:00",
1293
+ "note": ""
1294
+ },
1295
+ "cron_exact": true,
1296
+ "systemd_exact": true,
1297
+ "cron_valid": true
1298
+ },
1299
+ {
1300
+ "nl": "every prime-numbered minute of every hour",
1301
+ "expected": {
1302
+ "cron": "2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59 * * * *",
1303
+ "systemd": "*-*-* *:02,03,05,07,11,13,17,19,23,29,31,37,41,43,47,53,59:00"
1304
+ },
1305
+ "got": {
1306
+ "cron": "2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59 * * *",
1307
+ "systemd": "*-*-* *:02,03,05,07,11,13,17,19,23,29,31,37,41,43,47,53,59:00",
1308
+ "note": "Listed primes 0-59."
1309
+ },
1310
+ "cron_exact": false,
1311
+ "systemd_exact": true,
1312
+ "cron_valid": false
1313
+ },
1314
+ {
1315
+ "nl": "every Monday and Wednesday at 6am from March to October",
1316
+ "expected": {
1317
+ "cron": "0 6 * 3-10 1,3",
1318
+ "systemd": "Mon,Wed *-03..10-* 06:00:00"
1319
+ },
1320
+ "got": {
1321
+ "cron": "0 6 * 3-10 1,3",
1322
+ "systemd": "Mon,Wed *-03..10-* 06:00:00",
1323
+ "note": "Mon and Wed at 6am, March through October only."
1324
+ },
1325
+ "cron_exact": true,
1326
+ "systemd_exact": true,
1327
+ "cron_valid": true
1328
+ },
1329
+ {
1330
+ "nl": "every 45 minutes during weekday afternoons",
1331
+ "expected": {
1332
+ "cron": "0,45 12-16 * * 1-5\n30 13,15 * * 1-5",
1333
+ "systemd": "Mon..Fri *-*-* 12..16:00/45:00"
1334
+ },
1335
+ "got": {
1336
+ "cron": "0,45 12-16 * * 1-5",
1337
+ "systemd": "Mon..Fri *-*-* 12..16:00/45:00",
1338
+ "note": "45-min interval during weekday afternoons; expanded."
1339
+ },
1340
+ "cron_exact": false,
1341
+ "systemd_exact": true,
1342
+ "cron_valid": true
1343
+ },
1344
+ {
1345
+ "nl": "every other Wednesday at 7pm",
1346
+ "expected": {
1347
+ "cron": "0 19 * * 3",
1348
+ "systemd": "Wed *-*-* 19:00:00"
1349
+ },
1350
+ "got": {
1351
+ "cron": "0 19 * * 3",
1352
+ "systemd": "Wed *-*-* 19:00:00",
1353
+ "note": "Cron cannot express 'every other Wednesday' \u2014 runs every Wednesday at 7pm, gate in script with week-of-year %2."
1354
+ },
1355
+ "cron_exact": true,
1356
+ "systemd_exact": true,
1357
+ "cron_valid": true
1358
+ },
1359
+ {
1360
+ "nl": "sunset every Friday (7pm)",
1361
+ "expected": {
1362
+ "cron": "0 19 * * 5",
1363
+ "systemd": "Fri *-*-* 19:00:00"
1364
+ },
1365
+ "got": {
1366
+ "cron": "0 19 * * 5",
1367
+ "systemd": "Fri *-*-* 19:00:00",
1368
+ "note": "'before bed' interpreted as 7pm."
1369
+ },
1370
+ "cron_exact": true,
1371
+ "systemd_exact": true,
1372
+ "cron_valid": true
1373
+ }
1374
+ ]
1375
+ }
example.py ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Minimal inference example for Shpigford/cron-mini."""
3
+ from mlx_lm import load, generate
4
+
5
+ model, tokenizer = load("Shpigford/cron-mini")
6
+
7
+ SYSTEM = ("You convert natural-language schedules into cron expressions and "
8
+ "systemd OnCalendar strings. Output JSON with keys: cron, systemd, "
9
+ "note. If cron cannot exactly express the schedule, put the closest "
10
+ "valid cron and explain in note. Do not output anything else.")
11
+
12
+ def schedule_to_cron(nl: str) -> str:
13
+ messages = [
14
+ {"role": "system", "content": SYSTEM},
15
+ {"role": "user", "content": f"Convert this schedule to cron and systemd OnCalendar: {nl}"},
16
+ ]
17
+ prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
18
+ return generate(model, tokenizer, prompt=prompt, max_tokens=200, temp=0.0)
19
+
20
+ if __name__ == "__main__":
21
+ import sys
22
+ print(schedule_to_cron(" ".join(sys.argv[1:]) or "every weekday at 9am"))
generation_config.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token_id": 151643,
3
+ "pad_token_id": 151643,
4
+ "do_sample": true,
5
+ "eos_token_id": [
6
+ 151645,
7
+ 151643
8
+ ],
9
+ "repetition_penalty": 1.1,
10
+ "temperature": 0.7,
11
+ "top_p": 0.8,
12
+ "top_k": 20,
13
+ "transformers_version": "4.37.0"
14
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:072605ba0699270bf57e8491b0b2d78304b5b71e653d177c5d2af3f47f4aad5c
3
+ size 3087467005
model.safetensors.index.json ADDED
@@ -0,0 +1,346 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "metadata": {
3
+ "total_size": 3087428608,
4
+ "total_parameters": 1543714304
5
+ },
6
+ "weight_map": {
7
+ "model.embed_tokens.weight": "model.safetensors",
8
+ "model.layers.0.input_layernorm.weight": "model.safetensors",
9
+ "model.layers.0.mlp.down_proj.weight": "model.safetensors",
10
+ "model.layers.0.mlp.gate_proj.weight": "model.safetensors",
11
+ "model.layers.0.mlp.up_proj.weight": "model.safetensors",
12
+ "model.layers.0.post_attention_layernorm.weight": "model.safetensors",
13
+ "model.layers.0.self_attn.k_proj.bias": "model.safetensors",
14
+ "model.layers.0.self_attn.k_proj.weight": "model.safetensors",
15
+ "model.layers.0.self_attn.o_proj.weight": "model.safetensors",
16
+ "model.layers.0.self_attn.q_proj.bias": "model.safetensors",
17
+ "model.layers.0.self_attn.q_proj.weight": "model.safetensors",
18
+ "model.layers.0.self_attn.v_proj.bias": "model.safetensors",
19
+ "model.layers.0.self_attn.v_proj.weight": "model.safetensors",
20
+ "model.layers.1.input_layernorm.weight": "model.safetensors",
21
+ "model.layers.1.mlp.down_proj.weight": "model.safetensors",
22
+ "model.layers.1.mlp.gate_proj.weight": "model.safetensors",
23
+ "model.layers.1.mlp.up_proj.weight": "model.safetensors",
24
+ "model.layers.1.post_attention_layernorm.weight": "model.safetensors",
25
+ "model.layers.1.self_attn.k_proj.bias": "model.safetensors",
26
+ "model.layers.1.self_attn.k_proj.weight": "model.safetensors",
27
+ "model.layers.1.self_attn.o_proj.weight": "model.safetensors",
28
+ "model.layers.1.self_attn.q_proj.bias": "model.safetensors",
29
+ "model.layers.1.self_attn.q_proj.weight": "model.safetensors",
30
+ "model.layers.1.self_attn.v_proj.bias": "model.safetensors",
31
+ "model.layers.1.self_attn.v_proj.weight": "model.safetensors",
32
+ "model.layers.10.input_layernorm.weight": "model.safetensors",
33
+ "model.layers.10.mlp.down_proj.weight": "model.safetensors",
34
+ "model.layers.10.mlp.gate_proj.weight": "model.safetensors",
35
+ "model.layers.10.mlp.up_proj.weight": "model.safetensors",
36
+ "model.layers.10.post_attention_layernorm.weight": "model.safetensors",
37
+ "model.layers.10.self_attn.k_proj.bias": "model.safetensors",
38
+ "model.layers.10.self_attn.k_proj.weight": "model.safetensors",
39
+ "model.layers.10.self_attn.o_proj.weight": "model.safetensors",
40
+ "model.layers.10.self_attn.q_proj.bias": "model.safetensors",
41
+ "model.layers.10.self_attn.q_proj.weight": "model.safetensors",
42
+ "model.layers.10.self_attn.v_proj.bias": "model.safetensors",
43
+ "model.layers.10.self_attn.v_proj.weight": "model.safetensors",
44
+ "model.layers.11.input_layernorm.weight": "model.safetensors",
45
+ "model.layers.11.mlp.down_proj.weight": "model.safetensors",
46
+ "model.layers.11.mlp.gate_proj.weight": "model.safetensors",
47
+ "model.layers.11.mlp.up_proj.weight": "model.safetensors",
48
+ "model.layers.11.post_attention_layernorm.weight": "model.safetensors",
49
+ "model.layers.11.self_attn.k_proj.bias": "model.safetensors",
50
+ "model.layers.11.self_attn.k_proj.weight": "model.safetensors",
51
+ "model.layers.11.self_attn.o_proj.weight": "model.safetensors",
52
+ "model.layers.11.self_attn.q_proj.bias": "model.safetensors",
53
+ "model.layers.11.self_attn.q_proj.weight": "model.safetensors",
54
+ "model.layers.11.self_attn.v_proj.bias": "model.safetensors",
55
+ "model.layers.11.self_attn.v_proj.weight": "model.safetensors",
56
+ "model.layers.12.input_layernorm.weight": "model.safetensors",
57
+ "model.layers.12.mlp.down_proj.weight": "model.safetensors",
58
+ "model.layers.12.mlp.gate_proj.weight": "model.safetensors",
59
+ "model.layers.12.mlp.up_proj.weight": "model.safetensors",
60
+ "model.layers.12.post_attention_layernorm.weight": "model.safetensors",
61
+ "model.layers.12.self_attn.k_proj.bias": "model.safetensors",
62
+ "model.layers.12.self_attn.k_proj.weight": "model.safetensors",
63
+ "model.layers.12.self_attn.o_proj.weight": "model.safetensors",
64
+ "model.layers.12.self_attn.q_proj.bias": "model.safetensors",
65
+ "model.layers.12.self_attn.q_proj.weight": "model.safetensors",
66
+ "model.layers.12.self_attn.v_proj.bias": "model.safetensors",
67
+ "model.layers.12.self_attn.v_proj.weight": "model.safetensors",
68
+ "model.layers.13.input_layernorm.weight": "model.safetensors",
69
+ "model.layers.13.mlp.down_proj.weight": "model.safetensors",
70
+ "model.layers.13.mlp.gate_proj.weight": "model.safetensors",
71
+ "model.layers.13.mlp.up_proj.weight": "model.safetensors",
72
+ "model.layers.13.post_attention_layernorm.weight": "model.safetensors",
73
+ "model.layers.13.self_attn.k_proj.bias": "model.safetensors",
74
+ "model.layers.13.self_attn.k_proj.weight": "model.safetensors",
75
+ "model.layers.13.self_attn.o_proj.weight": "model.safetensors",
76
+ "model.layers.13.self_attn.q_proj.bias": "model.safetensors",
77
+ "model.layers.13.self_attn.q_proj.weight": "model.safetensors",
78
+ "model.layers.13.self_attn.v_proj.bias": "model.safetensors",
79
+ "model.layers.13.self_attn.v_proj.weight": "model.safetensors",
80
+ "model.layers.14.input_layernorm.weight": "model.safetensors",
81
+ "model.layers.14.mlp.down_proj.weight": "model.safetensors",
82
+ "model.layers.14.mlp.gate_proj.weight": "model.safetensors",
83
+ "model.layers.14.mlp.up_proj.weight": "model.safetensors",
84
+ "model.layers.14.post_attention_layernorm.weight": "model.safetensors",
85
+ "model.layers.14.self_attn.k_proj.bias": "model.safetensors",
86
+ "model.layers.14.self_attn.k_proj.weight": "model.safetensors",
87
+ "model.layers.14.self_attn.o_proj.weight": "model.safetensors",
88
+ "model.layers.14.self_attn.q_proj.bias": "model.safetensors",
89
+ "model.layers.14.self_attn.q_proj.weight": "model.safetensors",
90
+ "model.layers.14.self_attn.v_proj.bias": "model.safetensors",
91
+ "model.layers.14.self_attn.v_proj.weight": "model.safetensors",
92
+ "model.layers.15.input_layernorm.weight": "model.safetensors",
93
+ "model.layers.15.mlp.down_proj.weight": "model.safetensors",
94
+ "model.layers.15.mlp.gate_proj.weight": "model.safetensors",
95
+ "model.layers.15.mlp.up_proj.weight": "model.safetensors",
96
+ "model.layers.15.post_attention_layernorm.weight": "model.safetensors",
97
+ "model.layers.15.self_attn.k_proj.bias": "model.safetensors",
98
+ "model.layers.15.self_attn.k_proj.weight": "model.safetensors",
99
+ "model.layers.15.self_attn.o_proj.weight": "model.safetensors",
100
+ "model.layers.15.self_attn.q_proj.bias": "model.safetensors",
101
+ "model.layers.15.self_attn.q_proj.weight": "model.safetensors",
102
+ "model.layers.15.self_attn.v_proj.bias": "model.safetensors",
103
+ "model.layers.15.self_attn.v_proj.weight": "model.safetensors",
104
+ "model.layers.16.input_layernorm.weight": "model.safetensors",
105
+ "model.layers.16.mlp.down_proj.weight": "model.safetensors",
106
+ "model.layers.16.mlp.gate_proj.weight": "model.safetensors",
107
+ "model.layers.16.mlp.up_proj.weight": "model.safetensors",
108
+ "model.layers.16.post_attention_layernorm.weight": "model.safetensors",
109
+ "model.layers.16.self_attn.k_proj.bias": "model.safetensors",
110
+ "model.layers.16.self_attn.k_proj.weight": "model.safetensors",
111
+ "model.layers.16.self_attn.o_proj.weight": "model.safetensors",
112
+ "model.layers.16.self_attn.q_proj.bias": "model.safetensors",
113
+ "model.layers.16.self_attn.q_proj.weight": "model.safetensors",
114
+ "model.layers.16.self_attn.v_proj.bias": "model.safetensors",
115
+ "model.layers.16.self_attn.v_proj.weight": "model.safetensors",
116
+ "model.layers.17.input_layernorm.weight": "model.safetensors",
117
+ "model.layers.17.mlp.down_proj.weight": "model.safetensors",
118
+ "model.layers.17.mlp.gate_proj.weight": "model.safetensors",
119
+ "model.layers.17.mlp.up_proj.weight": "model.safetensors",
120
+ "model.layers.17.post_attention_layernorm.weight": "model.safetensors",
121
+ "model.layers.17.self_attn.k_proj.bias": "model.safetensors",
122
+ "model.layers.17.self_attn.k_proj.weight": "model.safetensors",
123
+ "model.layers.17.self_attn.o_proj.weight": "model.safetensors",
124
+ "model.layers.17.self_attn.q_proj.bias": "model.safetensors",
125
+ "model.layers.17.self_attn.q_proj.weight": "model.safetensors",
126
+ "model.layers.17.self_attn.v_proj.bias": "model.safetensors",
127
+ "model.layers.17.self_attn.v_proj.weight": "model.safetensors",
128
+ "model.layers.18.input_layernorm.weight": "model.safetensors",
129
+ "model.layers.18.mlp.down_proj.weight": "model.safetensors",
130
+ "model.layers.18.mlp.gate_proj.weight": "model.safetensors",
131
+ "model.layers.18.mlp.up_proj.weight": "model.safetensors",
132
+ "model.layers.18.post_attention_layernorm.weight": "model.safetensors",
133
+ "model.layers.18.self_attn.k_proj.bias": "model.safetensors",
134
+ "model.layers.18.self_attn.k_proj.weight": "model.safetensors",
135
+ "model.layers.18.self_attn.o_proj.weight": "model.safetensors",
136
+ "model.layers.18.self_attn.q_proj.bias": "model.safetensors",
137
+ "model.layers.18.self_attn.q_proj.weight": "model.safetensors",
138
+ "model.layers.18.self_attn.v_proj.bias": "model.safetensors",
139
+ "model.layers.18.self_attn.v_proj.weight": "model.safetensors",
140
+ "model.layers.19.input_layernorm.weight": "model.safetensors",
141
+ "model.layers.19.mlp.down_proj.weight": "model.safetensors",
142
+ "model.layers.19.mlp.gate_proj.weight": "model.safetensors",
143
+ "model.layers.19.mlp.up_proj.weight": "model.safetensors",
144
+ "model.layers.19.post_attention_layernorm.weight": "model.safetensors",
145
+ "model.layers.19.self_attn.k_proj.bias": "model.safetensors",
146
+ "model.layers.19.self_attn.k_proj.weight": "model.safetensors",
147
+ "model.layers.19.self_attn.o_proj.weight": "model.safetensors",
148
+ "model.layers.19.self_attn.q_proj.bias": "model.safetensors",
149
+ "model.layers.19.self_attn.q_proj.weight": "model.safetensors",
150
+ "model.layers.19.self_attn.v_proj.bias": "model.safetensors",
151
+ "model.layers.19.self_attn.v_proj.weight": "model.safetensors",
152
+ "model.layers.2.input_layernorm.weight": "model.safetensors",
153
+ "model.layers.2.mlp.down_proj.weight": "model.safetensors",
154
+ "model.layers.2.mlp.gate_proj.weight": "model.safetensors",
155
+ "model.layers.2.mlp.up_proj.weight": "model.safetensors",
156
+ "model.layers.2.post_attention_layernorm.weight": "model.safetensors",
157
+ "model.layers.2.self_attn.k_proj.bias": "model.safetensors",
158
+ "model.layers.2.self_attn.k_proj.weight": "model.safetensors",
159
+ "model.layers.2.self_attn.o_proj.weight": "model.safetensors",
160
+ "model.layers.2.self_attn.q_proj.bias": "model.safetensors",
161
+ "model.layers.2.self_attn.q_proj.weight": "model.safetensors",
162
+ "model.layers.2.self_attn.v_proj.bias": "model.safetensors",
163
+ "model.layers.2.self_attn.v_proj.weight": "model.safetensors",
164
+ "model.layers.20.input_layernorm.weight": "model.safetensors",
165
+ "model.layers.20.mlp.down_proj.weight": "model.safetensors",
166
+ "model.layers.20.mlp.gate_proj.weight": "model.safetensors",
167
+ "model.layers.20.mlp.up_proj.weight": "model.safetensors",
168
+ "model.layers.20.post_attention_layernorm.weight": "model.safetensors",
169
+ "model.layers.20.self_attn.k_proj.bias": "model.safetensors",
170
+ "model.layers.20.self_attn.k_proj.weight": "model.safetensors",
171
+ "model.layers.20.self_attn.o_proj.weight": "model.safetensors",
172
+ "model.layers.20.self_attn.q_proj.bias": "model.safetensors",
173
+ "model.layers.20.self_attn.q_proj.weight": "model.safetensors",
174
+ "model.layers.20.self_attn.v_proj.bias": "model.safetensors",
175
+ "model.layers.20.self_attn.v_proj.weight": "model.safetensors",
176
+ "model.layers.21.input_layernorm.weight": "model.safetensors",
177
+ "model.layers.21.mlp.down_proj.weight": "model.safetensors",
178
+ "model.layers.21.mlp.gate_proj.weight": "model.safetensors",
179
+ "model.layers.21.mlp.up_proj.weight": "model.safetensors",
180
+ "model.layers.21.post_attention_layernorm.weight": "model.safetensors",
181
+ "model.layers.21.self_attn.k_proj.bias": "model.safetensors",
182
+ "model.layers.21.self_attn.k_proj.weight": "model.safetensors",
183
+ "model.layers.21.self_attn.o_proj.weight": "model.safetensors",
184
+ "model.layers.21.self_attn.q_proj.bias": "model.safetensors",
185
+ "model.layers.21.self_attn.q_proj.weight": "model.safetensors",
186
+ "model.layers.21.self_attn.v_proj.bias": "model.safetensors",
187
+ "model.layers.21.self_attn.v_proj.weight": "model.safetensors",
188
+ "model.layers.22.input_layernorm.weight": "model.safetensors",
189
+ "model.layers.22.mlp.down_proj.weight": "model.safetensors",
190
+ "model.layers.22.mlp.gate_proj.weight": "model.safetensors",
191
+ "model.layers.22.mlp.up_proj.weight": "model.safetensors",
192
+ "model.layers.22.post_attention_layernorm.weight": "model.safetensors",
193
+ "model.layers.22.self_attn.k_proj.bias": "model.safetensors",
194
+ "model.layers.22.self_attn.k_proj.weight": "model.safetensors",
195
+ "model.layers.22.self_attn.o_proj.weight": "model.safetensors",
196
+ "model.layers.22.self_attn.q_proj.bias": "model.safetensors",
197
+ "model.layers.22.self_attn.q_proj.weight": "model.safetensors",
198
+ "model.layers.22.self_attn.v_proj.bias": "model.safetensors",
199
+ "model.layers.22.self_attn.v_proj.weight": "model.safetensors",
200
+ "model.layers.23.input_layernorm.weight": "model.safetensors",
201
+ "model.layers.23.mlp.down_proj.weight": "model.safetensors",
202
+ "model.layers.23.mlp.gate_proj.weight": "model.safetensors",
203
+ "model.layers.23.mlp.up_proj.weight": "model.safetensors",
204
+ "model.layers.23.post_attention_layernorm.weight": "model.safetensors",
205
+ "model.layers.23.self_attn.k_proj.bias": "model.safetensors",
206
+ "model.layers.23.self_attn.k_proj.weight": "model.safetensors",
207
+ "model.layers.23.self_attn.o_proj.weight": "model.safetensors",
208
+ "model.layers.23.self_attn.q_proj.bias": "model.safetensors",
209
+ "model.layers.23.self_attn.q_proj.weight": "model.safetensors",
210
+ "model.layers.23.self_attn.v_proj.bias": "model.safetensors",
211
+ "model.layers.23.self_attn.v_proj.weight": "model.safetensors",
212
+ "model.layers.24.input_layernorm.weight": "model.safetensors",
213
+ "model.layers.24.mlp.down_proj.weight": "model.safetensors",
214
+ "model.layers.24.mlp.gate_proj.weight": "model.safetensors",
215
+ "model.layers.24.mlp.up_proj.weight": "model.safetensors",
216
+ "model.layers.24.post_attention_layernorm.weight": "model.safetensors",
217
+ "model.layers.24.self_attn.k_proj.bias": "model.safetensors",
218
+ "model.layers.24.self_attn.k_proj.weight": "model.safetensors",
219
+ "model.layers.24.self_attn.o_proj.weight": "model.safetensors",
220
+ "model.layers.24.self_attn.q_proj.bias": "model.safetensors",
221
+ "model.layers.24.self_attn.q_proj.weight": "model.safetensors",
222
+ "model.layers.24.self_attn.v_proj.bias": "model.safetensors",
223
+ "model.layers.24.self_attn.v_proj.weight": "model.safetensors",
224
+ "model.layers.25.input_layernorm.weight": "model.safetensors",
225
+ "model.layers.25.mlp.down_proj.weight": "model.safetensors",
226
+ "model.layers.25.mlp.gate_proj.weight": "model.safetensors",
227
+ "model.layers.25.mlp.up_proj.weight": "model.safetensors",
228
+ "model.layers.25.post_attention_layernorm.weight": "model.safetensors",
229
+ "model.layers.25.self_attn.k_proj.bias": "model.safetensors",
230
+ "model.layers.25.self_attn.k_proj.weight": "model.safetensors",
231
+ "model.layers.25.self_attn.o_proj.weight": "model.safetensors",
232
+ "model.layers.25.self_attn.q_proj.bias": "model.safetensors",
233
+ "model.layers.25.self_attn.q_proj.weight": "model.safetensors",
234
+ "model.layers.25.self_attn.v_proj.bias": "model.safetensors",
235
+ "model.layers.25.self_attn.v_proj.weight": "model.safetensors",
236
+ "model.layers.26.input_layernorm.weight": "model.safetensors",
237
+ "model.layers.26.mlp.down_proj.weight": "model.safetensors",
238
+ "model.layers.26.mlp.gate_proj.weight": "model.safetensors",
239
+ "model.layers.26.mlp.up_proj.weight": "model.safetensors",
240
+ "model.layers.26.post_attention_layernorm.weight": "model.safetensors",
241
+ "model.layers.26.self_attn.k_proj.bias": "model.safetensors",
242
+ "model.layers.26.self_attn.k_proj.weight": "model.safetensors",
243
+ "model.layers.26.self_attn.o_proj.weight": "model.safetensors",
244
+ "model.layers.26.self_attn.q_proj.bias": "model.safetensors",
245
+ "model.layers.26.self_attn.q_proj.weight": "model.safetensors",
246
+ "model.layers.26.self_attn.v_proj.bias": "model.safetensors",
247
+ "model.layers.26.self_attn.v_proj.weight": "model.safetensors",
248
+ "model.layers.27.input_layernorm.weight": "model.safetensors",
249
+ "model.layers.27.mlp.down_proj.weight": "model.safetensors",
250
+ "model.layers.27.mlp.gate_proj.weight": "model.safetensors",
251
+ "model.layers.27.mlp.up_proj.weight": "model.safetensors",
252
+ "model.layers.27.post_attention_layernorm.weight": "model.safetensors",
253
+ "model.layers.27.self_attn.k_proj.bias": "model.safetensors",
254
+ "model.layers.27.self_attn.k_proj.weight": "model.safetensors",
255
+ "model.layers.27.self_attn.o_proj.weight": "model.safetensors",
256
+ "model.layers.27.self_attn.q_proj.bias": "model.safetensors",
257
+ "model.layers.27.self_attn.q_proj.weight": "model.safetensors",
258
+ "model.layers.27.self_attn.v_proj.bias": "model.safetensors",
259
+ "model.layers.27.self_attn.v_proj.weight": "model.safetensors",
260
+ "model.layers.3.input_layernorm.weight": "model.safetensors",
261
+ "model.layers.3.mlp.down_proj.weight": "model.safetensors",
262
+ "model.layers.3.mlp.gate_proj.weight": "model.safetensors",
263
+ "model.layers.3.mlp.up_proj.weight": "model.safetensors",
264
+ "model.layers.3.post_attention_layernorm.weight": "model.safetensors",
265
+ "model.layers.3.self_attn.k_proj.bias": "model.safetensors",
266
+ "model.layers.3.self_attn.k_proj.weight": "model.safetensors",
267
+ "model.layers.3.self_attn.o_proj.weight": "model.safetensors",
268
+ "model.layers.3.self_attn.q_proj.bias": "model.safetensors",
269
+ "model.layers.3.self_attn.q_proj.weight": "model.safetensors",
270
+ "model.layers.3.self_attn.v_proj.bias": "model.safetensors",
271
+ "model.layers.3.self_attn.v_proj.weight": "model.safetensors",
272
+ "model.layers.4.input_layernorm.weight": "model.safetensors",
273
+ "model.layers.4.mlp.down_proj.weight": "model.safetensors",
274
+ "model.layers.4.mlp.gate_proj.weight": "model.safetensors",
275
+ "model.layers.4.mlp.up_proj.weight": "model.safetensors",
276
+ "model.layers.4.post_attention_layernorm.weight": "model.safetensors",
277
+ "model.layers.4.self_attn.k_proj.bias": "model.safetensors",
278
+ "model.layers.4.self_attn.k_proj.weight": "model.safetensors",
279
+ "model.layers.4.self_attn.o_proj.weight": "model.safetensors",
280
+ "model.layers.4.self_attn.q_proj.bias": "model.safetensors",
281
+ "model.layers.4.self_attn.q_proj.weight": "model.safetensors",
282
+ "model.layers.4.self_attn.v_proj.bias": "model.safetensors",
283
+ "model.layers.4.self_attn.v_proj.weight": "model.safetensors",
284
+ "model.layers.5.input_layernorm.weight": "model.safetensors",
285
+ "model.layers.5.mlp.down_proj.weight": "model.safetensors",
286
+ "model.layers.5.mlp.gate_proj.weight": "model.safetensors",
287
+ "model.layers.5.mlp.up_proj.weight": "model.safetensors",
288
+ "model.layers.5.post_attention_layernorm.weight": "model.safetensors",
289
+ "model.layers.5.self_attn.k_proj.bias": "model.safetensors",
290
+ "model.layers.5.self_attn.k_proj.weight": "model.safetensors",
291
+ "model.layers.5.self_attn.o_proj.weight": "model.safetensors",
292
+ "model.layers.5.self_attn.q_proj.bias": "model.safetensors",
293
+ "model.layers.5.self_attn.q_proj.weight": "model.safetensors",
294
+ "model.layers.5.self_attn.v_proj.bias": "model.safetensors",
295
+ "model.layers.5.self_attn.v_proj.weight": "model.safetensors",
296
+ "model.layers.6.input_layernorm.weight": "model.safetensors",
297
+ "model.layers.6.mlp.down_proj.weight": "model.safetensors",
298
+ "model.layers.6.mlp.gate_proj.weight": "model.safetensors",
299
+ "model.layers.6.mlp.up_proj.weight": "model.safetensors",
300
+ "model.layers.6.post_attention_layernorm.weight": "model.safetensors",
301
+ "model.layers.6.self_attn.k_proj.bias": "model.safetensors",
302
+ "model.layers.6.self_attn.k_proj.weight": "model.safetensors",
303
+ "model.layers.6.self_attn.o_proj.weight": "model.safetensors",
304
+ "model.layers.6.self_attn.q_proj.bias": "model.safetensors",
305
+ "model.layers.6.self_attn.q_proj.weight": "model.safetensors",
306
+ "model.layers.6.self_attn.v_proj.bias": "model.safetensors",
307
+ "model.layers.6.self_attn.v_proj.weight": "model.safetensors",
308
+ "model.layers.7.input_layernorm.weight": "model.safetensors",
309
+ "model.layers.7.mlp.down_proj.weight": "model.safetensors",
310
+ "model.layers.7.mlp.gate_proj.weight": "model.safetensors",
311
+ "model.layers.7.mlp.up_proj.weight": "model.safetensors",
312
+ "model.layers.7.post_attention_layernorm.weight": "model.safetensors",
313
+ "model.layers.7.self_attn.k_proj.bias": "model.safetensors",
314
+ "model.layers.7.self_attn.k_proj.weight": "model.safetensors",
315
+ "model.layers.7.self_attn.o_proj.weight": "model.safetensors",
316
+ "model.layers.7.self_attn.q_proj.bias": "model.safetensors",
317
+ "model.layers.7.self_attn.q_proj.weight": "model.safetensors",
318
+ "model.layers.7.self_attn.v_proj.bias": "model.safetensors",
319
+ "model.layers.7.self_attn.v_proj.weight": "model.safetensors",
320
+ "model.layers.8.input_layernorm.weight": "model.safetensors",
321
+ "model.layers.8.mlp.down_proj.weight": "model.safetensors",
322
+ "model.layers.8.mlp.gate_proj.weight": "model.safetensors",
323
+ "model.layers.8.mlp.up_proj.weight": "model.safetensors",
324
+ "model.layers.8.post_attention_layernorm.weight": "model.safetensors",
325
+ "model.layers.8.self_attn.k_proj.bias": "model.safetensors",
326
+ "model.layers.8.self_attn.k_proj.weight": "model.safetensors",
327
+ "model.layers.8.self_attn.o_proj.weight": "model.safetensors",
328
+ "model.layers.8.self_attn.q_proj.bias": "model.safetensors",
329
+ "model.layers.8.self_attn.q_proj.weight": "model.safetensors",
330
+ "model.layers.8.self_attn.v_proj.bias": "model.safetensors",
331
+ "model.layers.8.self_attn.v_proj.weight": "model.safetensors",
332
+ "model.layers.9.input_layernorm.weight": "model.safetensors",
333
+ "model.layers.9.mlp.down_proj.weight": "model.safetensors",
334
+ "model.layers.9.mlp.gate_proj.weight": "model.safetensors",
335
+ "model.layers.9.mlp.up_proj.weight": "model.safetensors",
336
+ "model.layers.9.post_attention_layernorm.weight": "model.safetensors",
337
+ "model.layers.9.self_attn.k_proj.bias": "model.safetensors",
338
+ "model.layers.9.self_attn.k_proj.weight": "model.safetensors",
339
+ "model.layers.9.self_attn.o_proj.weight": "model.safetensors",
340
+ "model.layers.9.self_attn.q_proj.bias": "model.safetensors",
341
+ "model.layers.9.self_attn.q_proj.weight": "model.safetensors",
342
+ "model.layers.9.self_attn.v_proj.bias": "model.safetensors",
343
+ "model.layers.9.self_attn.v_proj.weight": "model.safetensors",
344
+ "model.norm.weight": "model.safetensors"
345
+ }
346
+ }
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3fd169731d2cbde95e10bf356d66d5997fd885dd8dbb6fb4684da3f23b2585d8
3
+ size 11421892
tokenizer_config.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": false,
3
+ "backend": "tokenizers",
4
+ "bos_token": null,
5
+ "clean_up_tokenization_spaces": false,
6
+ "eos_token": "<|im_end|>",
7
+ "errors": "replace",
8
+ "extra_special_tokens": [
9
+ "<|im_start|>",
10
+ "<|im_end|>",
11
+ "<|object_ref_start|>",
12
+ "<|object_ref_end|>",
13
+ "<|box_start|>",
14
+ "<|box_end|>",
15
+ "<|quad_start|>",
16
+ "<|quad_end|>",
17
+ "<|vision_start|>",
18
+ "<|vision_end|>",
19
+ "<|vision_pad|>",
20
+ "<|image_pad|>",
21
+ "<|video_pad|>"
22
+ ],
23
+ "is_local": true,
24
+ "local_files_only": false,
25
+ "model_max_length": 131072,
26
+ "pad_token": "<|endoftext|>",
27
+ "split_special_tokens": false,
28
+ "tokenizer_class": "Qwen2Tokenizer",
29
+ "tool_parser_type": "json_tools",
30
+ "unk_token": null
31
+ }