优化前端,优化前端指令,优化自定义控制
This commit is contained in:
@@ -231,9 +231,9 @@ class Ch1VehicleHilContractTests(unittest.TestCase):
|
||||
orchestration = suite_cases(self.suite, "self_orchestration")
|
||||
extension = suite_cases(self.suite, "self_extension")
|
||||
self.assertEqual([case["id"] for case in orchestration], [case["id"] for case in extension])
|
||||
self.assertEqual(len(orchestration), 43)
|
||||
self.assertEqual(len(orchestration), 45)
|
||||
self.assertEqual(
|
||||
len(suite_rejections(self.suite, "self_orchestration")), 14
|
||||
len(suite_rejections(self.suite, "self_orchestration")), 12
|
||||
)
|
||||
self.assertEqual(sum(case.get("hil", True) for case in orchestration), 30)
|
||||
self.assertEqual(len(self.suite["cleanup"]), 9)
|
||||
@@ -271,8 +271,6 @@ class Ch1VehicleHilContractTests(unittest.TestCase):
|
||||
retired = {
|
||||
"REJECT-VEHICLE-LOCK": "door vehicle lock",
|
||||
"REJECT-VEHICLE-UNLOCK": "door vehicle unlock",
|
||||
"REJECT-REAR-LOCK": "door rear lock",
|
||||
"REJECT-REAR-UNLOCK": "door rear unlock",
|
||||
}
|
||||
positive_commands = {case["command"] for case in self.suite["case_catalog"]}
|
||||
rejection_by_id = {
|
||||
@@ -400,8 +398,6 @@ class Ch1VehicleHilContractTests(unittest.TestCase):
|
||||
"REJECT-RAW-CAN",
|
||||
"REJECT-VEHICLE-LOCK",
|
||||
"REJECT-VEHICLE-UNLOCK",
|
||||
"REJECT-REAR-LOCK",
|
||||
"REJECT-REAR-UNLOCK",
|
||||
"REJECT-WALL-LIGHT",
|
||||
"REJECT-READING-ZONE",
|
||||
"REJECT-AMBIENT-SCENE",
|
||||
@@ -657,9 +653,9 @@ class Ch1VehicleHilContractTests(unittest.TestCase):
|
||||
hardware_access_bypass=True,
|
||||
)
|
||||
|
||||
interpret.assert_called_once()
|
||||
interpret.assert_not_called()
|
||||
self.assertEqual(vehicle_service.process.call_args.args[1], "openai")
|
||||
self.assertEqual(response["provider_used"], "openai:gpt-5.6-sol")
|
||||
self.assertEqual(response["provider_used"], "local_rules")
|
||||
self.assertTrue(response["success"])
|
||||
self.assertEqual(len(response["operation_results"]), 1)
|
||||
self.assertEqual(len(captured), 1)
|
||||
@@ -742,7 +738,9 @@ class Ch1VehicleHilContractTests(unittest.TestCase):
|
||||
|
||||
interpret.assert_called_once()
|
||||
self.assertEqual(vehicle_service.process.call_args.args[1], "openai")
|
||||
self.assertEqual(response["provider_used"], "openai:gpt-5.6-sol")
|
||||
self.assertEqual(
|
||||
response["provider_used"], "local_rules+openai:gpt-5.6-sol"
|
||||
)
|
||||
self.assertTrue(response["success"])
|
||||
self.assertEqual(len(response["operation_results"]), 2)
|
||||
self.assertEqual(len(captured), 1)
|
||||
@@ -758,8 +756,6 @@ class Ch1VehicleHilContractTests(unittest.TestCase):
|
||||
retired_door_ids = {
|
||||
"REJECT-VEHICLE-LOCK",
|
||||
"REJECT-VEHICLE-UNLOCK",
|
||||
"REJECT-REAR-LOCK",
|
||||
"REJECT-REAR-UNLOCK",
|
||||
}
|
||||
for index, case in enumerate(
|
||||
suite_rejections(self.suite, "self_orchestration")
|
||||
@@ -1081,7 +1077,7 @@ class Ch1VehicleHilContractTests(unittest.TestCase):
|
||||
report["summary"]["offline_rejection_cases"],
|
||||
2 * len(fixture["rejection_catalog"]),
|
||||
)
|
||||
self.assertEqual(len(fixture["rejection_catalog"]), 14)
|
||||
self.assertEqual(len(fixture["rejection_catalog"]), 12)
|
||||
self.assertEqual(
|
||||
[(path, method) for path, method, _ in api.calls],
|
||||
[("/api/runtime", "GET")],
|
||||
|
||||
@@ -510,6 +510,88 @@ class MultiDomainServiceTests(unittest.TestCase):
|
||||
[],
|
||||
)
|
||||
|
||||
def test_mode_card_editor_persists_only_server_generated_command_flow(self) -> None:
|
||||
mode_root = Path(self.temporary_directory.name) / "mode-card-presets"
|
||||
user_root = Path(self.temporary_directory.name) / "mode-card-user"
|
||||
preset = mode_root / "vehicles" / "denza_n7" / "office.yaml"
|
||||
preset.parent.mkdir(parents=True)
|
||||
preset.write_text(
|
||||
"""
|
||||
id: office
|
||||
name: 办公模式
|
||||
icon: briefcase
|
||||
scope:
|
||||
vehicle_ids: [denza_n7]
|
||||
operations:
|
||||
- domain: climate
|
||||
capability: climate.set_temperature
|
||||
target_scope: passenger
|
||||
parameters:
|
||||
temperature_c: 24
|
||||
""".strip()
|
||||
+ "\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
self.service.mode_profiles = ModeProfileRegistry(
|
||||
mode_root, user_root=user_root
|
||||
)
|
||||
model_output = {
|
||||
"detected_domains": ["climate"],
|
||||
"requests": [
|
||||
{
|
||||
"domain": "climate",
|
||||
"capability": "climate.set_temperature",
|
||||
"target_scope": "passenger",
|
||||
"operation": "set",
|
||||
"parameters": [{"name": "temperature_c", "value": 24}],
|
||||
"reason": "办公温度。",
|
||||
}
|
||||
],
|
||||
"ambiguities": [],
|
||||
"decision_summary": ["副驾温度设置为24度。"],
|
||||
"confidence": 0.97,
|
||||
}
|
||||
instruction = "副驾空调温度设置为24度"
|
||||
with patch.object(self.service.openai, "interpret", return_value=model_output):
|
||||
generated = self.service.process(
|
||||
instruction,
|
||||
"openai",
|
||||
"conv-mode-card-editor",
|
||||
vehicle_id="denza_n7",
|
||||
)
|
||||
|
||||
saved = self.service.save_mode_profile_card(
|
||||
"office",
|
||||
"专注办公模式",
|
||||
instruction,
|
||||
generated["request_id"],
|
||||
"denza_n7",
|
||||
)
|
||||
|
||||
self.assertEqual(saved["status"], "succeeded")
|
||||
self.assertEqual(saved["storage"], "persistent_yaml")
|
||||
self.assertEqual(saved["mode_profile"]["origin"], "customized")
|
||||
self.assertEqual(saved["mode_profile"]["instruction"], instruction)
|
||||
self.assertTrue(saved["mode_profile"]["command_flow"]["plans"])
|
||||
self.assertTrue(
|
||||
saved["mode_profile"]["command_flow"]["function_configs"]
|
||||
)
|
||||
reloaded = ModeProfileRegistry(mode_root, user_root=user_root)
|
||||
persisted = next(
|
||||
item
|
||||
for item in reloaded.public_modes("denza_n7")
|
||||
if item["id"] == "office"
|
||||
)
|
||||
self.assertEqual(persisted["name"], "专注办公模式")
|
||||
with self.assertRaisesRegex(ValueError, "重新点击执行"):
|
||||
self.service.save_mode_profile_card(
|
||||
"office",
|
||||
"专注办公模式",
|
||||
"副驾空调温度设置为25度",
|
||||
generated["request_id"],
|
||||
"denza_n7",
|
||||
)
|
||||
|
||||
def test_build_named_mode_executes_and_persists_in_one_turn(self) -> None:
|
||||
mode_root = Path(self.temporary_directory.name) / "modes"
|
||||
self.service.mode_profiles = ModeProfileRegistry(mode_root)
|
||||
|
||||
@@ -46,7 +46,12 @@ class SeatFrontendInputCoverageTests(unittest.TestCase):
|
||||
cls.temporary_directory = tempfile.TemporaryDirectory()
|
||||
with patch.dict(
|
||||
os.environ,
|
||||
{"COGNITIVE_AGENT_HARDWARE_EXECUTION_ENABLED": "false"},
|
||||
{
|
||||
"COGNITIVE_AGENT_HARDWARE_EXECUTION_ENABLED": "false",
|
||||
"COGNITIVE_AGENT_MODE_PROFILE_ROOT": str(
|
||||
Path(cls.temporary_directory.name) / "mode-profiles"
|
||||
),
|
||||
},
|
||||
clear=False,
|
||||
):
|
||||
cls.service = SeatDemoService(REPOSITORY_ROOT)
|
||||
|
||||
Reference in New Issue
Block a user