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.
- 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
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
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
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.
pip install seedmillseedmill initseedmill 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.
name: icon_classifiermodel:backend: ollamamodel: gemma4:27bvocabularies:icons:file: ../icons.yamlseeds:file: ../concepts.yamlper_seed: 8a new use case is a file, not a script
The fine print
for Seedmill and its docs
- Privacy policyNot written yet
- Terms of useNot written yet
- LicenceApache 2.0 ↗