refactor: add DesignIR distillation pipeline

This commit is contained in:
Jerry
2026-07-27 17:24:04 +08:00
parent 0adaac2b2a
commit 550b339bcc
1128 changed files with 10248 additions and 426666 deletions
@@ -21,42 +21,33 @@ class CadRouterTests(unittest.TestCase):
return route_module.build_parser().parse_args(list(args))
def test_routes_gear_to_simplecadapi(self) -> None:
result = route_module.route(self.parse("生成一个模数 2 的人字齿轮", "--output", "step"))
result = route_module.route(self.parse("生成一个模数 2 的人字齿轮"))
self.assertEqual("simplecadapi", result["selected_backend"])
def test_routes_connecting_rod_to_build123d(self) -> None:
result = route_module.route(
self.parse("生成中心距 120mm 的发动机连杆", "--output", "step", "--manufacturing", "machining")
)
result = route_module.route(self.parse("生成中心距 120mm 的发动机连杆"))
self.assertEqual("build123d", result["selected_backend"])
def test_routes_printable_vase_to_cadam(self) -> None:
result = route_module.route(
self.parse("生成一个带蜂窝纹理的可调参数 3D 打印花瓶", "--output", "stl", "--browser-controls")
)
self.assertEqual("cadam", result["selected_backend"])
self.assertEqual("CADAM", result["project"])
self.assertEqual("scripts/cadam_compile.mjs", result["adapter"])
def test_existing_step_stays_step_first(self) -> None:
result = route_module.route(self.parse("修改现有零件的孔径", "--existing-model", "--output", "step"))
result = route_module.route(self.parse("修改现有零件的孔径", "--existing-model"))
self.assertEqual("build123d", result["selected_backend"])
def test_scad_output_is_hard_signal(self) -> None:
result = route_module.route(self.parse("做一个参数化旋钮", "--output", "scad"))
self.assertEqual("cadam", result["selected_backend"])
def test_every_route_reports_only_runtime_project_roles(self) -> None:
result = route_module.route(self.parse("生成一个 40mm 法兰", "--output", "step"))
def test_every_route_has_fixed_step_artifact_contract(self) -> None:
result = route_module.route(self.parse("做一个参数化旋钮"))
self.assertEqual(
{"text-to-cad", "SimpleCADAPI", "CADAM"},
set(result["project_contributions"]),
{
"primary_format": "step",
"editable_contract": "DesignIR 2.0",
},
result["artifact_contract"],
)
def test_cadam_probe_finds_sibling_runtime(self) -> None:
expected_root = Path(__file__).resolve().parents[5] / "CADAM"
if expected_root.is_dir():
self.assertTrue(route_module.cadam_runtime_available(expected_root))
def test_every_route_reports_only_runtime_project_roles(self) -> None:
result = route_module.route(self.parse("生成一个 40mm 法兰"))
self.assertEqual(
{"text-to-cad", "SimpleCADAPI"},
set(result["project_contributions"]),
)
def test_explicit_override_is_respected(self) -> None:
result = route_module.route(self.parse("生成一个齿轮", "--backend", "build123d"))
@@ -94,8 +85,6 @@ class CadRouterTests(unittest.TestCase):
result = route_module.route(
self.parse(
"根据经验生成一个法兰轴套",
"--output",
"step",
"--experience-library",
str(library),
"--experience-family",
@@ -209,8 +198,6 @@ class CadRouterTests(unittest.TestCase):
result = route_module.route(
self.parse(
"生成一个带法兰轴套和中心通孔",
"--output",
"step",
"--experience-library",
str(library),
)
@@ -273,8 +260,6 @@ class CadRouterTests(unittest.TestCase):
result = route_module.route(
self.parse(
"生成一个带法兰轴套",
"--output",
"step",
"--experience-library",
str(library),
)
@@ -318,8 +303,6 @@ class CadRouterTests(unittest.TestCase):
result = route_module.route(
self.parse(
"Generate a mounting plate with four corner holes",
"--output",
"step",
"--experience-library",
str(library),
)
@@ -336,25 +319,26 @@ class CadRouterTests(unittest.TestCase):
[item["id"] for item in context["experiences"]],
)
def test_step_edit_uses_source_and_library_not_private_case(self) -> None:
def test_step_edit_uses_private_evidence_and_isolated_designir(self) -> None:
result = route_module.route(
self.parse(
"把中心孔径调整大一些",
"--edit-source",
"/tmp/source.step",
"--output",
"step",
)
)
plan = result["design_plan"]
self.assertEqual("modify", plan["operation"])
self.assertEqual(
"direct_step_feature_rebuild",
"private_evidence_to_isolated_designir_reconstruction",
plan["edit_context"]["modification_mode"],
)
forbidden = plan["edit_context"]["forbidden_knowledge_sources"]
self.assertIn("cad-experience-plugin/parser/output", forbidden)
self.assertNotIn("private_case", plan["edit_context"])
self.assertIn("teacher STEP during reconstruction", forbidden)
self.assertIn(
"deterministically extracted private teacher evidence",
plan["edit_context"]["allowed_knowledge_sources"],
)
self.assertEqual(
"pending_source_classification", plan["experience_status"]
)
@@ -368,8 +352,6 @@ class CadRouterTests(unittest.TestCase):
"把孔径改为 12mm",
"--edit-source",
"/tmp/model.py",
"--output",
"step",
)
)
self.assertEqual(
@@ -377,22 +359,21 @@ class CadRouterTests(unittest.TestCase):
result["design_plan"]["edit_context"]["modification_mode"],
)
def test_parser_staging_files_are_rejected_as_edit_sources(self) -> None:
parser_source = (
def test_teacher_vault_is_rejected_as_reconstruction_source(self) -> None:
teacher_source = (
Path(__file__).resolve().parents[5]
/ "cad-experience-plugin"
/ "parser"
/ "input"
/ "designir-pipeline"
/ "workspace"
/ "teacher"
/ "inbox"
/ "part.step"
)
with self.assertRaisesRegex(ValueError, "cannot use"):
with self.assertRaisesRegex(ValueError, "cannot read the teacher"):
route_module.route(
self.parse(
"修改这个零件",
"--edit-source",
str(parser_source),
"--output",
"step",
str(teacher_source),
)
)