from __future__ import annotations import tempfile import unittest from pathlib import Path from training.lora_trainer import ( build_lora_training_request, lora_dependency_report, vision_finetuning_plan, ) class LoraTrainerTest(unittest.TestCase): def test_dependency_report_is_serializable(self) -> None: report = lora_dependency_report().as_dict() self.assertIn("ready", report) self.assertIn("peft_available", report) self.assertIn("trl_available", report) def test_builds_non_executing_lora_request(self) -> None: with tempfile.TemporaryDirectory() as tmp: dataset = Path(tmp) / "train.jsonl" dataset.write_text('{"prompt":"hello","correction":"world"}\n', encoding="utf-8") request = build_lora_training_request( "minicpm5_1b", str(dataset), rank=8, epochs=2, output_root=Path(tmp) / "out", ) data = request.as_dict() self.assertFalse(data["execute_training"]) self.assertEqual(data["plan"]["lora"]["rank"], 8) self.assertIn("--model-id", data["command_preview"]) def test_vision_finetuning_plan_mentions_swift_and_llama_factory(self) -> None: plan = vision_finetuning_plan() self.assertFalse(plan["implemented"]) self.assertIn("SWIFT", plan["recommended_tools"]) self.assertIn("LLaMA-Factory", plan["recommended_tools"]) if __name__ == "__main__": unittest.main()