File size: 1,956 Bytes
634a4e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
"""Generate a labeled synthetic-letter dataset (images + labels.jsonl).

Usage:  .venv\\Scripts\\python.exe scripts\\make_dataset.py [n] [out_dir] [seed]
Default: 48 letters into dataset/eval (gitignored; fully reproducible by seed).
Each labels.jsonl row carries gold fields + an SFT-ready target JSON.
"""

from __future__ import annotations

import json
import os
import random
import sys

sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "src"))

from guardian import letterforge  # noqa: E402


def main() -> None:
    n = int(sys.argv[1]) if len(sys.argv) > 1 else 48
    out_dir = sys.argv[2] if len(sys.argv) > 2 else os.path.join("dataset", "eval")
    seed = int(sys.argv[3]) if len(sys.argv) > 3 else 2026
    rng = random.Random(seed)
    os.makedirs(out_dir, exist_ok=True)

    rows = []
    for i in range(n):
        gold = letterforge.forge(rng)
        img, degradation = letterforge.render_gold(gold, rng)
        fname = f"letter_{i:04d}.png"
        img.save(os.path.join(out_dir, fname))
        rows.append({
            "file": fname,
            "name": gold.name,
            "degradation": degradation,
            "document_type": gold.document_type,
            "sender": gold.sender,
            "amount": gold.amount,
            "deadline": gold.deadline,
            "signal_ids": gold.signal_ids,
            "expected_level": gold.expected_level,
            "acceptable_levels": list(gold.acceptable_levels),
            "sft_target": letterforge.sft_target(gold),
        })

    with open(os.path.join(out_dir, "labels.jsonl"), "w", encoding="utf-8") as f:
        for row in rows:
            f.write(json.dumps(row, ensure_ascii=False) + "\n")

    by_name: dict[str, int] = {}
    for row in rows:
        by_name[row["name"]] = by_name.get(row["name"], 0) + 1
    print(f"wrote {n} letters to {out_dir} (seed {seed}): {by_name}")


if __name__ == "__main__":
    main()