Plugin System (v0.45.0)
5 parts, +169 tests. Public plugin / hook surface.
BasePlugin Protocol
from soup_cli.plugins import BasePlugin, PluginSpec
class MyTrainerPlugin(BasePlugin):
spec = PluginSpec(name="my-trainer", version="0.1.0")
def on_train_begin(self, ctx): ...
def on_step_end(self, ctx): ...soup plugins list
soup plugins install ./my_plugin
soup plugins enable my-trainer
soup plugins disable my-trainerOpenAI ↔ Anthropic Messages converter
anthropic_messages.py converts between OpenAI and Anthropic Messages schemas — useful for trace-to-preference + serve.
Server-side tools allowlist
server_tools.py ships a server-side tools allowlist + WebSearchConfig for the inference server.
N-gram speculative decoding
ngram_spec.py schema for n-gram speculative decoding; the serve path consumes it live.
External integrations catalog
15-entry registry of known deployment and serving targets a trained model can be handed to, each with the artifact format it expects: LM Studio, ComfyUI, stable-diffusion.cpp, Open WebUI, Ollama, TEI, pgvector, FAISS, Weaviate and the rest. Not experiment trackers: W&B, MLflow, ClearML, Comet and Neptune are a separate allowlist, wired through soup train --tracker.
Advanced trainer-plugin allowlist
Closed allowlist for advanced trainer plugins.
Data Recipe DAG
recipe_dag.py parses a YAML DAG describing data preprocessing steps + dependencies. Topological sort guarantees deterministic execution order.
soup data recipe recipe.yamlValidation is the default: the path is a positional argument and there is no validate subcommand. The live per-node runner shipped in v0.53.7 behind --execute.
Soup is free and Apache-2.0. If it saved you a training run, starring the repo costs nothing and helps most. You can also fund the GPU time behind the work a 4 GB laptop cannot reach.