优化了副驾座椅控制

This commit is contained in:
minghanchen
2026-08-25 11:39:41 +08:00
parent 33c92d1352
commit 9ac8fdface
34 changed files with 31714 additions and 289 deletions
+182
View File
@@ -329,6 +329,188 @@ class Can1SemanticWhitelistTests(unittest.TestCase):
24,
)
def test_disabling_one_outlet_feature_never_enables_that_mode(self) -> None:
for index, utterance in enumerate(
("关闭吹面出风口", "把吹面出风口关闭")
):
with self.subTest(utterance=utterance):
result = self.service.process(
utterance,
provider="local",
conversation_id=f"conv-can-one-close-outlet-{index}",
execution_mode="dry_run",
)
self.assertEqual(result["status"], "needs_confirmation")
self.assertEqual(self._debug_commands(result), [])
ambiguities = result["intent_ir"]["spec"]["ambiguities"]
self.assertEqual(
ambiguities[0]["reason"],
"outlet_feature_disable_requires_absolute_mode",
)
preview = self.service.preview_native_can(
"关闭吹面出风口",
provider="openai",
conversation_id="conv-can-one-close-outlet-preview",
execution_mode="dry_run",
)
self.assertFalse(preview["supplement_required"])
self.assertEqual(preview["unresolved_clauses"], [])
self.assertEqual(self._debug_commands(preview), [])
explicit_replacement = self.service.process(
"关闭吹面出风口,切换到吹脚模式",
provider="local",
conversation_id="conv-can-one-replace-outlet",
execution_mode="dry_run",
)
self.assertEqual(explicit_replacement["status"], "succeeded")
self.assertEqual(self._debug_commands(explicit_replacement), ["ac mode feet"])
def test_driver_seat_natural_language_levels_and_motion_aliases(self) -> None:
cases = (
("打开主驾座椅按摩", ["seat driver massage mode relax"]),
(
"主驾座椅按摩强度设置为最大",
["seat driver massage strength strong"],
),
(
"主驾座椅按摩强度最小",
["seat driver massage strength weak"],
),
(
"主驾座椅按摩强度调中",
["seat driver massage strength medium"],
),
("主驾座椅朝前挪一秒", ["seat driver horizontal forward 1000"]),
("主驾座椅后退两秒", ["seat driver horizontal backward 2000"]),
("主驾座椅椅背放倒", ["seat driver backrest backward 500"]),
("主驾座椅座垫放低", ["seat driver basin down 500"]),
("主驾座椅往上移动", ["seat driver height up 500"]),
("主驾座椅通风最低", ["seat driver vent low"]),
("主驾座椅通风最小", ["seat driver vent low"]),
("主驾座椅通风最高", ["seat driver vent high"]),
("主驾座椅通风最大", ["seat driver vent high"]),
("空调风量设置为最低", ["ac fan 1"]),
("空调风量设置为中等", ["ac fan 4"]),
("空调风量设置为最大", ["ac fan 7"]),
("氛围灯亮度最低", ["light ambient brightness 1"]),
("氛围灯亮度中等", ["light ambient brightness 3"]),
("氛围灯亮度最高", ["light ambient brightness 5"]),
(
"打开主驾座椅通风并关闭按摩",
["seat driver vent low", "seat driver massage off"],
),
(
"关闭主驾座椅通风并打开按摩",
["seat driver vent off", "seat driver massage mode relax"],
),
)
for index, (utterance, expected) in enumerate(cases):
with self.subTest(utterance=utterance):
result = self.service.process(
utterance,
provider="local",
conversation_id=f"conv-can-one-seat-alias-{index}",
execution_mode="dry_run",
)
self.assertEqual(result["status"], "succeeded")
self.assertEqual(self._debug_commands(result), expected)
stop_all = self.service.process(
"停止主驾座椅移动",
provider="local",
conversation_id="conv-can-one-seat-stop-all",
execution_mode="dry_run",
)
self.assertEqual(stop_all["status"], "succeeded")
self.assertEqual(
self._debug_commands(stop_all),
[
"seat driver horizontal stop",
"seat driver height stop",
"seat driver backrest stop",
"seat driver basin stop",
],
)
def test_unsupported_driver_seat_middle_thermal_level_is_explicit(self) -> None:
for index, feature in enumerate(("通风", "加热")):
utterance = f"主驾座椅{feature}调到中档"
with self.subTest(utterance=utterance):
result = self.service.process(
utterance,
provider="local",
conversation_id=f"conv-can-one-seat-middle-{index}",
execution_mode="dry_run",
)
self.assertEqual(result["status"], "needs_confirmation")
self.assertEqual(self._debug_commands(result), [])
self.assertIn(
"driver_seat_thermal_middle_level_unsupported",
{
item.get("reason")
for item in result["intent_ir"]["spec"]["ambiguities"]
},
)
preview = self.service.preview_native_can(
"主驾座椅通风设置为中等",
provider="openai",
conversation_id="conv-can-one-seat-middle-preview",
execution_mode="dry_run",
)
self.assertFalse(preview["supplement_required"])
self.assertEqual(preview["unresolved_clauses"], [])
self.assertEqual(self._debug_commands(preview), [])
def test_vehicle_position_aliases_stay_scoped_to_the_device_domain(self) -> None:
cases = (
("打开左前车窗", ["window front-left open"]),
("打开右前车窗", ["window front-right open"]),
("打开左后车窗", ["window rear-left open"]),
("打开右后车窗", ["window rear-right open"]),
("打开主驾车窗", ["window front-left open"]),
("打开副驾车窗", ["window front-right open"]),
("打开左前座椅通风", ["seat driver vent low"]),
("打开主驾座椅通风", ["seat driver vent low"]),
("主驾空调温度设置为24度", ["ac temp driver 24"]),
("副驾空调温度设置为24度", ["ac temp passenger 24"]),
)
for index, (utterance, expected) in enumerate(cases):
with self.subTest(utterance=utterance):
result = self.service.process(
utterance,
provider="local",
conversation_id=f"conv-can-position-alias-{index}",
execution_mode="dry_run",
)
self.assertEqual(result["status"], "succeeded")
self.assertEqual(self._debug_commands(result), expected)
for index, utterance in enumerate(
("打开右前座椅通风", "打开副驾座椅通风")
):
with self.subTest(utterance=utterance):
result = self.service.process(
utterance,
provider="local",
conversation_id=f"conv-can-passenger-alias-{index}",
execution_mode="dry_run",
)
self.assertEqual(result["status"], "succeeded")
operations = [
operation
for config in result.get("function_configs", {}).values()
for operation in config.get("spec", {}).get("operations", [])
]
self.assertNotIn(
"seat.set_driver_ventilation_native",
{item["capability"] for item in operations},
)
self.assertEqual(operations[0]["capability"], "seat.set_ventilation")
self.assertEqual(operations[0]["target"]["zone"], "front_right")
def test_fractional_values_are_not_silently_truncated(self) -> None:
utterances = (
"空调温度设为24.5度",