@q1k-oss/mint-format 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +378 -0
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
# MINT Format
|
|
2
|
+
|
|
3
|
+
**Minimal Inference Notation for Tokens**
|
|
4
|
+
|
|
5
|
+
A fresh, human-readable, token-efficient data format for LLM prompts.
|
|
6
|
+
Combines YAML simplicity with Markdown table clarity.
|
|
7
|
+
|
|
8
|
+
[](https://github.com/q1k-oss/mint/actions/workflows/publish.yml)
|
|
9
|
+
[](https://www.npmjs.com/package/@q1k-oss/mint-format)
|
|
10
|
+
[](https://github.com/q1k-oss/mint/blob/main/LICENSE)
|
|
11
|
+
|
|
12
|
+
**[Live Playground](https://mint.q1k.ai)** | **[Full Specification](https://github.com/q1k-oss/mint/blob/main/SPEC.md)** | **[GitHub](https://github.com/q1k-oss/mint)**
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Why MINT?
|
|
17
|
+
|
|
18
|
+
Modern LLMs are powerful but **tokens cost money**. Existing formats force a tradeoff:
|
|
19
|
+
|
|
20
|
+
| Format | Problem |
|
|
21
|
+
|--------|---------|
|
|
22
|
+
| **JSON** | Verbose — ~40% overhead from braces, quotes, repeated keys |
|
|
23
|
+
| **YAML** | Better — but arrays of objects still repeat every key |
|
|
24
|
+
| **TOON** | Efficient — but cryptic syntax, hard to read |
|
|
25
|
+
| **CSV** | Compact — but no structure, can't nest |
|
|
26
|
+
|
|
27
|
+
**MINT** gives you the best of all worlds — **47% smaller than JSON** with **zero learning curve**.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Key Features
|
|
32
|
+
|
|
33
|
+
- **Fresh & Clean** — Instantly readable, no learning curve
|
|
34
|
+
- **47% Fewer Tokens** — Significant cost savings on LLM APIs
|
|
35
|
+
- **Crystal Clear** — Visible `|` boundaries, Markdown tables
|
|
36
|
+
- **Edit-Friendly** — No invisible tabs, no alignment headaches
|
|
37
|
+
- **Lossless** — Perfect JSON round-trip (`encode` → `decode` returns identical data)
|
|
38
|
+
- **Fast** — Simple parsing, zero dependencies
|
|
39
|
+
- **Tiny** — ~5KB minified
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Installation
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# npm
|
|
47
|
+
npm install @q1k-oss/mint-format
|
|
48
|
+
|
|
49
|
+
# pnpm
|
|
50
|
+
pnpm add @q1k-oss/mint-format
|
|
51
|
+
|
|
52
|
+
# yarn
|
|
53
|
+
yarn add @q1k-oss/mint-format
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Quick Start
|
|
59
|
+
|
|
60
|
+
### Encode (JSON → MINT)
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import { encode } from '@q1k-oss/mint-format';
|
|
64
|
+
|
|
65
|
+
const data = {
|
|
66
|
+
users: [
|
|
67
|
+
{ id: 1, name: 'Alice', role: 'admin' },
|
|
68
|
+
{ id: 2, name: 'Bob', role: 'user' },
|
|
69
|
+
{ id: 3, name: 'Charlie', role: 'user' }
|
|
70
|
+
]
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
console.log(encode(data));
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Output:**
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
users:
|
|
80
|
+
| id | name | role |
|
|
81
|
+
| 1 | Alice | admin |
|
|
82
|
+
| 2 | Bob | user |
|
|
83
|
+
| 3 | Charlie | user |
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Decode (MINT → JSON)
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
import { decode } from '@q1k-oss/mint-format';
|
|
90
|
+
|
|
91
|
+
const mint = `
|
|
92
|
+
users:
|
|
93
|
+
| id | name | role |
|
|
94
|
+
| 1 | Alice | admin |
|
|
95
|
+
| 2 | Bob | user |
|
|
96
|
+
`;
|
|
97
|
+
|
|
98
|
+
const data = decode(mint);
|
|
99
|
+
console.log(JSON.stringify(data, null, 2));
|
|
100
|
+
// {
|
|
101
|
+
// "users": [
|
|
102
|
+
// { "id": 1, "name": "Alice", "role": "admin" },
|
|
103
|
+
// { "id": 2, "name": "Bob", "role": "user" }
|
|
104
|
+
// ]
|
|
105
|
+
// }
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Format Overview
|
|
111
|
+
|
|
112
|
+
### Objects — YAML Style
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
user:
|
|
116
|
+
id: 123
|
|
117
|
+
name: Alice
|
|
118
|
+
email: alice@example.com
|
|
119
|
+
active: true
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Nested Objects
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
config:
|
|
126
|
+
database:
|
|
127
|
+
host: localhost
|
|
128
|
+
port: 5432
|
|
129
|
+
cache:
|
|
130
|
+
enabled: true
|
|
131
|
+
ttl: 3600
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Arrays of Objects — Markdown Tables
|
|
135
|
+
|
|
136
|
+
This is where MINT shines:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
employees:
|
|
140
|
+
| id | name | department | salary |
|
|
141
|
+
| 1 | Alice | Engineering | 95000 |
|
|
142
|
+
| 2 | Bob | Marketing | 75000 |
|
|
143
|
+
| 3 | Charlie | Sales | 80000 |
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Simple Arrays — Inline
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
tags: typescript, javascript, nodejs
|
|
150
|
+
numbers: 1, 2, 3, 4, 5
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Null Values
|
|
154
|
+
|
|
155
|
+
Use `-` in tables:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
results:
|
|
159
|
+
| id | name | score |
|
|
160
|
+
| 1 | Alice | 95 |
|
|
161
|
+
| 2 | Bob | - |
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Compact Mode (Optional)
|
|
165
|
+
|
|
166
|
+
Enable symbols for extra compression:
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
# Standard # Compact (opt-in)
|
|
170
|
+
| status | | st |
|
|
171
|
+
| completed | | ✓ |
|
|
172
|
+
| pending | | ⏳ |
|
|
173
|
+
| failed | | ✗ |
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Real-World Example
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
workflow:
|
|
182
|
+
id: wf_7x9k2m
|
|
183
|
+
name: Invoice Reconciliation
|
|
184
|
+
status: awaiting_review
|
|
185
|
+
|
|
186
|
+
steps:
|
|
187
|
+
| id | tool | status | duration | output |
|
|
188
|
+
| 1 | gmail_search | completed | 7s | Found 23 emails |
|
|
189
|
+
| 2 | document_parser | completed | 32s | Parsed 21 docs |
|
|
190
|
+
| 3 | sheets_lookup | completed | 16s | Matched 18 POs |
|
|
191
|
+
| 4 | slack_notify | pending | - | - |
|
|
192
|
+
|
|
193
|
+
messages:
|
|
194
|
+
| role | content |
|
|
195
|
+
| user | Run invoice reconciliation |
|
|
196
|
+
| assistant | Starting reconciliation... |
|
|
197
|
+
| assistant | Found 3 discrepancies. Please review.|
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## API Reference
|
|
203
|
+
|
|
204
|
+
### `encode(value, options?): string`
|
|
205
|
+
|
|
206
|
+
Converts JavaScript values to MINT format.
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
import { encode } from '@q1k-oss/mint-format';
|
|
210
|
+
|
|
211
|
+
const mint = encode(data, {
|
|
212
|
+
indent: 2, // Spaces per level (default: 2)
|
|
213
|
+
compact: false, // Use symbols (default: false)
|
|
214
|
+
sortKeys: false, // Sort object keys (default: false)
|
|
215
|
+
});
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### `decode(input, options?): unknown`
|
|
219
|
+
|
|
220
|
+
Parses MINT string back to JavaScript values.
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
import { decode } from '@q1k-oss/mint-format';
|
|
224
|
+
|
|
225
|
+
const data = decode(mintString, {
|
|
226
|
+
strict: true, // Throw on invalid syntax (default: true)
|
|
227
|
+
});
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### `validate(input): ValidationResult`
|
|
231
|
+
|
|
232
|
+
Validates MINT syntax without full parsing.
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
import { validate } from '@q1k-oss/mint-format';
|
|
236
|
+
|
|
237
|
+
const result = validate(mintString);
|
|
238
|
+
if (!result.valid) {
|
|
239
|
+
console.error(result.errors);
|
|
240
|
+
// errors include line/column information
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### `estimateTokens(data): TokenEstimate`
|
|
245
|
+
|
|
246
|
+
Estimates token counts for JSON vs MINT.
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
import { estimateTokens } from '@q1k-oss/mint-format';
|
|
250
|
+
|
|
251
|
+
const estimate = estimateTokens(data);
|
|
252
|
+
console.log(estimate);
|
|
253
|
+
// {
|
|
254
|
+
// json: 3245,
|
|
255
|
+
// mint: 1756,
|
|
256
|
+
// savings: 1489,
|
|
257
|
+
// savingsPercent: 45.9
|
|
258
|
+
// }
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## CLI
|
|
264
|
+
|
|
265
|
+
A companion CLI tool is available as a separate package:
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
# No install needed
|
|
269
|
+
npx @q1k-oss/mint-format-cli input.json -o output.mint
|
|
270
|
+
|
|
271
|
+
# Or install globally
|
|
272
|
+
npm install -g @q1k-oss/mint-format-cli
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
| Option | Description |
|
|
276
|
+
|--------|-------------|
|
|
277
|
+
| `-o, --output <file>` | Output file path |
|
|
278
|
+
| `-e, --encode` | Force JSON → MINT |
|
|
279
|
+
| `-d, --decode` | Force MINT → JSON |
|
|
280
|
+
| `--compact` | Enable symbol compression |
|
|
281
|
+
| `--stats` | Show token count & savings |
|
|
282
|
+
| `--indent <n>` | Indentation spaces (default: 2) |
|
|
283
|
+
| `--validate` | Validate input without conversion |
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Benchmarks
|
|
288
|
+
|
|
289
|
+
| Dataset | JSON Tokens | MINT Tokens | Savings |
|
|
290
|
+
|---------|-------------|-------------|---------|
|
|
291
|
+
| User records (100 rows) | 3,245 | 1,756 | **46%** |
|
|
292
|
+
| API responses (50 items) | 2,891 | 1,534 | **47%** |
|
|
293
|
+
| Workflow states (25 steps) | 1,567 | 892 | **43%** |
|
|
294
|
+
| Nested configs | 892 | 523 | **41%** |
|
|
295
|
+
| **Average** | - | - | **~45%** |
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Comparison
|
|
300
|
+
|
|
301
|
+
### vs JSON
|
|
302
|
+
|
|
303
|
+
```json
|
|
304
|
+
{
|
|
305
|
+
"users": [
|
|
306
|
+
{ "id": 1, "name": "Alice" },
|
|
307
|
+
{ "id": 2, "name": "Bob" }
|
|
308
|
+
]
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
```
|
|
313
|
+
users:
|
|
314
|
+
| id | name |
|
|
315
|
+
| 1 | Alice |
|
|
316
|
+
| 2 | Bob |
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**MINT: 47% smaller, equally readable.**
|
|
320
|
+
|
|
321
|
+
### vs YAML
|
|
322
|
+
|
|
323
|
+
```yaml
|
|
324
|
+
users:
|
|
325
|
+
- id: 1
|
|
326
|
+
name: Alice
|
|
327
|
+
- id: 2
|
|
328
|
+
name: Bob
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
**MINT: 35% smaller for arrays of objects.**
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## When to Use MINT
|
|
336
|
+
|
|
337
|
+
**Perfect For:**
|
|
338
|
+
- Sending structured data to LLMs
|
|
339
|
+
- Reducing token costs (API billing)
|
|
340
|
+
- Human-readable LLM prompts
|
|
341
|
+
- Arrays of similar objects
|
|
342
|
+
- Agentic AI workflows
|
|
343
|
+
- Version-controlled data (clean diffs)
|
|
344
|
+
|
|
345
|
+
**Consider Alternatives For:**
|
|
346
|
+
- Maximum compression needed → TOON
|
|
347
|
+
- API interoperability → JSON
|
|
348
|
+
- Binary data → MessagePack
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## Try It Online
|
|
353
|
+
|
|
354
|
+
Visit **[mint.q1k.ai](https://mint.q1k.ai)** to try MINT in your browser — encode, decode, and see token savings in real time.
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Contributing
|
|
359
|
+
|
|
360
|
+
We welcome contributions! See [CONTRIBUTING.md](https://github.com/q1k-oss/mint/blob/main/CONTRIBUTING.md).
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
git clone https://github.com/q1k-oss/mint.git
|
|
364
|
+
cd mint
|
|
365
|
+
pnpm install
|
|
366
|
+
pnpm test
|
|
367
|
+
pnpm build
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## License
|
|
373
|
+
|
|
374
|
+
[MIT](https://github.com/q1k-oss/mint/blob/main/LICENSE)
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
**MINT Format** — Fresh data for LLMs. Keep it minimal.
|