← All workNo. 04 · Python libraryApache 2.0 · on PyPI

Seedmill

YAML in, training data out.

Config-driven synthetic data for LLM training sets, generated against local models like Ollama and llama.cpp, or a hosted API. One engine and one CLI: a new use case is a YAML file, not a new script.

name:vocab:seeds:fields:yaml in{"interest": …}{"interest": …}{"interest": …}data out
Version
0.1, in alpha
Generates with
Ollama, llama.cpp or a hosted API
Licence
Apache 2.0
Built with
Python, Pydantic, Typer, httpx

Why it exists

most synthetic data code is one script per dataset, copied and drifting apart

  1. 1

    Vocabularies become grammar

    A field that declares a vocabulary is constrained at decode time, so the model can't emit a label outside it. No cleaning up 134 spellings of "coffee cup".

  2. 2

    Seeds force coverage

    Free-running batches collapse onto the model's favourite topics. Iterating a seed axis with a quota per seed is what reaches the long tail.

  3. 3

    Splits are group-aware

    Whole concept groups go to one split, so evaluation measures generalization to unseen concepts, not memorized phrasings.

One CLI

Local-first: Ollama and llama.cpp need no key and cost nothing per record. A hosted backend is there when you want a stronger teacher model, with the same YAML and the same constrained decoding.

installpip install seedmillseedmill init
  • seedmill initScaffolds a runnable example task to edit.
  • seedmill tasksLists the use cases you have.
  • seedmill generateThe full run, and it resumes where it stopped.
  • seedmill exportTrain, validation and test splits, in SFT and pairs formats.

A task, abridged

Given an interest phrase, pick the best icon from a fixed set. Everything about the use case lives in this one file.

icon_classifier.yamlname: icon_classifiermodel:backend: ollamamodel: gemma4:27bvocabularies:icons:file: ../icons.yamlseeds:file: ../concepts.yamlper_seed: 8

a new use case is a file, not a script

The fine print

for Seedmill and its docs