// Optional ANER_USE_LLM_TRAINING source build; explicit local files only.
// Supply a supported floating dense-Llama GGUF at models/base-f16.gguf.
// CSV headers: question,answer. Select disjoint training/validation rows.
// Run from a fresh working directory; published artifacts refuse overwrite.
import aner.gen
import aner.llm

let base = gen.import_model("models/base-f16.gguf", device: "cpu", max_memory_bytes: 4294967296)
let training = gen.supervised_csv(base, "training.csv", input: "question", target: "answer", role: "training", context: 128)
let validation = gen.supervised_csv(base, "validation.csv", input: "question", target: "answer", role: "validation", context: 128)
print(base.memory_summary())
let adapted = base.lora()
let tuned = adapted.fine_tune(training, validation, steps: 2, micro_batch: 1, accumulation: 2, rate: 0.0002, seed: 71)
print(tuned.validation_loss())
tuned.checkpoint("checkpoint-2")
let restored = gen.load_pretrained_checkpoint("checkpoint-2")
let continued = restored.resume(training, validation, steps: 2)
continued.save_model("domain-f32.gguf")
gen.quantize_model("domain-f32.gguf", "domain-q4.gguf", format: "q4_0")
let manifest = continued.save_adapter("domain-adapter")

let native = llm.load("models/base-f16.gguf", context: 128, device: "cpu")
let specialized = native.with_adapter(manifest)
print(specialized.generate("Explain this observation.", max_tokens: 32).text())
specialized.close()
native.close()
