优化前端,优化前端指令,优化自定义控制
This commit is contained in:
@@ -177,7 +177,7 @@ class SeatServiceIntegrationTests(unittest.TestCase):
|
||||
route = next(event for event in result["trace_events"] if event["stage"] == "domain_route")
|
||||
self.assertEqual(route["details"]["domains"], ["climate"])
|
||||
|
||||
def test_openai_unscoped_passenger_target_is_rewritten_to_driver_ch1(self) -> None:
|
||||
def test_local_rules_precede_openai_for_unscoped_driver_console_command(self) -> None:
|
||||
model_output = {
|
||||
"detected_domains": ["seat"],
|
||||
"requests": [
|
||||
@@ -202,29 +202,24 @@ class SeatServiceIntegrationTests(unittest.TestCase):
|
||||
"关闭座椅通风", "openai", context
|
||||
)
|
||||
|
||||
self.assertEqual(parsed["decision_summary"], ["model-owned-plan"])
|
||||
self.assertEqual(parsed["model_requests"], model_output["requests"])
|
||||
self.assertEqual(parsed["actions"], [])
|
||||
self.assertTrue(
|
||||
any("默认选择主驾座椅" in item for item in parsed["decision_summary"])
|
||||
)
|
||||
self.assertEqual(len(parsed["model_requests"]), 1)
|
||||
self.assertEqual(
|
||||
parsed["deferred_requests"],
|
||||
[
|
||||
{
|
||||
"domain": "seat",
|
||||
"capability": "seat.set_driver_ventilation_native",
|
||||
"target_scope": "driver",
|
||||
"desired_change": "deactivate",
|
||||
"requested_value": "off",
|
||||
"parameters": {"state": "off"},
|
||||
"reason": "model-owned-plan",
|
||||
"execution_backend": "native_can",
|
||||
}
|
||||
],
|
||||
parsed["model_requests"][0]["capability"],
|
||||
"seat.set_driver_ventilation_native",
|
||||
)
|
||||
self.assertEqual(provider, f"openai:{self.service.openai.model}")
|
||||
self.assertEqual(parsed["actions"], [])
|
||||
self.assertEqual(len(parsed["deferred_requests"]), 1)
|
||||
deferred = parsed["deferred_requests"][0]
|
||||
self.assertEqual(deferred["capability"], "seat.set_driver_ventilation_native")
|
||||
self.assertEqual(deferred["target_scope"], "driver")
|
||||
self.assertEqual(deferred["parameters"], {"state": "off"})
|
||||
self.assertEqual(deferred["execution_backend"], "native_can")
|
||||
self.assertEqual(provider, "local_rules")
|
||||
self.assertIsNone(notice)
|
||||
interpret.assert_called_once_with(
|
||||
"关闭座椅通风", context, self.service.capability_context
|
||||
)
|
||||
interpret.assert_not_called()
|
||||
|
||||
def test_explicit_gpt_failure_falls_back_to_local_rules(self) -> None:
|
||||
self.service.openai.api_key = "test-key"
|
||||
@@ -235,7 +230,7 @@ class SeatServiceIntegrationTests(unittest.TestCase):
|
||||
side_effect=OpenAIIntentError("invalid_api_key"),
|
||||
):
|
||||
result = self.service.process(
|
||||
"打开副驾座椅通风",
|
||||
"打开副驾座椅通风,同时播放音乐",
|
||||
"openai",
|
||||
"conv-explicit-gpt-fallback",
|
||||
)
|
||||
@@ -250,6 +245,75 @@ class SeatServiceIntegrationTests(unittest.TestCase):
|
||||
any("已降级到本地规则解析" in item for item in result["decision_summary"])
|
||||
)
|
||||
|
||||
def test_local_first_calls_model_with_only_uncovered_clauses(self) -> None:
|
||||
self.service.openai.api_key = "test-key"
|
||||
model_output = {
|
||||
"detected_domains": ["ambient_light"],
|
||||
"requests": [
|
||||
{
|
||||
"domain": "ambient_light",
|
||||
"capability": "ambient_light.set_power",
|
||||
"target_scope": "vehicle",
|
||||
"operation": "set",
|
||||
"parameters": [{"name": "state", "value": "on"}],
|
||||
"reason": "播放场景需要氛围灯。",
|
||||
}
|
||||
],
|
||||
"ambiguities": [],
|
||||
"decision_summary": ["仅补充本地规则未覆盖的播放场景。"],
|
||||
"confidence": 0.9,
|
||||
}
|
||||
context = self.service.conversations.snapshot("conv-clause-fallback")
|
||||
with patch.object(
|
||||
self.service.openai, "interpret", return_value=model_output
|
||||
) as interpret:
|
||||
parsed, provider, notice = self.service._interpret(
|
||||
"空调温度设置为25度,播放音乐",
|
||||
"openai",
|
||||
context,
|
||||
)
|
||||
|
||||
interpret.assert_called_once_with(
|
||||
"播放音乐", context, self.service.capability_context
|
||||
)
|
||||
self.assertEqual(
|
||||
provider, f"local_rules+openai:{self.service.openai.model}"
|
||||
)
|
||||
self.assertIn("仅未覆盖", str(notice))
|
||||
self.assertEqual(
|
||||
[item["capability"] for item in parsed["native_can_actions"]],
|
||||
["climate.set_temperature"],
|
||||
)
|
||||
self.assertEqual(
|
||||
[item["capability"] for item in parsed["domain_actions"]],
|
||||
["ambient_light.set_power"],
|
||||
)
|
||||
|
||||
def test_local_first_compiles_memory_temperature_and_fan_without_model(self) -> None:
|
||||
self.service.openai.api_key = "test-key"
|
||||
with patch.object(self.service.openai, "interpret") as interpret:
|
||||
result = self.service.process(
|
||||
"主驾座椅调整到记忆位置3,空调温度设置为25度,风速设置为1档",
|
||||
"openai",
|
||||
"conv-local-memory-climate",
|
||||
)
|
||||
|
||||
interpret.assert_not_called()
|
||||
self.assertEqual(result["status"], "succeeded")
|
||||
self.assertEqual(result["provider_used"], "local_rules")
|
||||
self.assertEqual(
|
||||
set(result["function_configs"]), {"native_seat", "native_climate"}
|
||||
)
|
||||
commands = [
|
||||
command["signals"]["debug_command"]
|
||||
for plan in result["command_plans"].values()
|
||||
for command in plan["spec"]["commands"]
|
||||
]
|
||||
self.assertEqual(
|
||||
commands,
|
||||
["seat driver memory recall 3", "ac temp driver 25", "ac fan 1"],
|
||||
)
|
||||
|
||||
def test_model_climate_request_completes_domain_loop(self) -> None:
|
||||
model_output = {
|
||||
"detected_domains": ["climate"],
|
||||
@@ -316,7 +380,7 @@ class SeatServiceIntegrationTests(unittest.TestCase):
|
||||
|
||||
with patch.object(self.service.openai, "interpret", return_value=model_output):
|
||||
result = self.service.process(
|
||||
"副驾有点冷、有点闷",
|
||||
"打开副驾座椅加热,播放音乐并把车内风量调舒适",
|
||||
"openai",
|
||||
"conv-model-partial",
|
||||
)
|
||||
@@ -328,6 +392,10 @@ class SeatServiceIntegrationTests(unittest.TestCase):
|
||||
{"state": "on", "level": 1},
|
||||
)
|
||||
self.assertEqual(result["domain_state"]["climate"]["fan_level"], 2)
|
||||
self.assertEqual(
|
||||
result["provider_used"],
|
||||
f"local_rules+openai:{self.service.openai.model}",
|
||||
)
|
||||
self.assertEqual(set(result["function_configs"]), {"seat", "climate"})
|
||||
self.assertEqual(result["scene_config"]["kind"], "SceneConfig")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user