Lyzr Research LabsShadowLM
Any open model.
Any harness.
Any method.
One runtime. Every variable.
Built for the labs and the operators who refuse to pick three out of three.
Any open model
Load weights from HuggingFace or local checkpoints. Llama, Qwen, Mistral, DeepSeek, Gemma, OLMo, Phi — same five lines. 4-bit, 8-bit, or full precision.
Any harness
slm.capture() serves an OpenAI-compatible proxy. Point any agent harness at it — unchanged — and reconstruct multi-turn trajectories for RL.
Any method
Twelve training methods behind one argument. SFT, LoRA, QLoRA, DoRA, full, CPT, DPO, GRPO, MoRE, BitFit, soft prompts, adapters. Switch by changing a string.
Twelve methods.
One config.
ShadowLM normalizes every training objective into a single, declarative spec. Swap DPO for ORPO by changing a key. Stack a LoRA over a 4-bit quantized base in three lines. The substrate handles the rest — gradient routing, optimizer state, distributed sharding, eval hooks.
Three lines.
Production run.
$ pip install 'shadowlm[all]'
$ shadowlm finetune data.jsonl \
--model Qwen/Qwen2.5-0.5B-Instruct \
--method lora --max-steps 60
[shadow] enabled: gradient checkpointing
[mlx:gpu] finetuning Qwen2.5-0.5B-Instruct-4bit · lora
· 8 examples · 40 iters · r=16 on 24 layers · lr 2e-4
[████████████████████████] step 40/40 loss 0.0718 11.7 st/s
loss ▇▆█▇▆▇▇█▅▅▄▅▃▃▁▂▂▂▁▁▁▁ 4.2120 → 0.0718
♥ succeeded · 40 steps · 3.5s