优化后端和前端
This commit is contained in:
@@ -22,7 +22,7 @@ spec:
|
||||
- name: climate.set_temperature
|
||||
description: Set an absolute HVAC temperature from 18 to 32 degrees Celsius.
|
||||
target_devices: [hvac]
|
||||
target_scopes: [driver, passenger, front_row, rear_row, rear_left, rear_right, vehicle]
|
||||
target_scopes: [driver, passenger, front_row, rear, rear_row, rear_left, rear_right, vehicle]
|
||||
parameters:
|
||||
- name: temperature_c
|
||||
type: number
|
||||
|
||||
@@ -395,6 +395,9 @@ def build_function_config(
|
||||
"capability": DYNAMIC_MODE_STOP_CAPABILITY,
|
||||
"target": TARGETS[action["target"]],
|
||||
"parameters": {},
|
||||
"parse_source": str(
|
||||
action.get("parse_source", "local_rule")
|
||||
),
|
||||
"timeout_ms": 5000,
|
||||
"failure_policy": "abort",
|
||||
}
|
||||
@@ -412,6 +415,9 @@ def build_function_config(
|
||||
"capability": DYNAMIC_MODE_CAPABILITY,
|
||||
"target": TARGETS[action["target"]],
|
||||
"parameters": {"mode_id": int(action["mode_id"])},
|
||||
"parse_source": str(
|
||||
action.get("parse_source", "local_rule")
|
||||
),
|
||||
"timeout_ms": 5000,
|
||||
"failure_policy": "abort",
|
||||
}
|
||||
@@ -437,6 +443,9 @@ def build_function_config(
|
||||
"capability": MOTION_CAPABILITIES[action["axis"]],
|
||||
"target": TARGETS[action["target"]],
|
||||
"parameters": parameters,
|
||||
"parse_source": str(
|
||||
action.get("parse_source", "local_rule")
|
||||
),
|
||||
"timeout_ms": 8000,
|
||||
"failure_policy": "abort",
|
||||
}
|
||||
@@ -460,6 +469,9 @@ def build_function_config(
|
||||
"capability": CAPABILITIES[action["function"]],
|
||||
"target": TARGETS[action["target"]],
|
||||
"parameters": parameters,
|
||||
"parse_source": str(
|
||||
action.get("parse_source", "local_rule")
|
||||
),
|
||||
"timeout_ms": 3000,
|
||||
"failure_policy": "abort",
|
||||
}
|
||||
|
||||
@@ -52,6 +52,15 @@ STRONG_PATTERN = re.compile(r"很|太|非常|特别|难受")
|
||||
AIRFLOW_CAUSE_PATTERN = re.compile(r"吹|风太大|风吹")
|
||||
FIRST_PERSON_PATTERN = re.compile(r"我|自己")
|
||||
VEHICLE_SCOPE_PATTERN = re.compile(r"车上|车内|车里|全车|整车|整个车")
|
||||
NON_SEAT_DEVICE_PATTERN = re.compile(
|
||||
r"车窗|车门|门锁|空调|温度|风量|风速|出风模式|"
|
||||
r"内循环|外循环|循环模式|风口|遮阳帘|天幕|阅读灯|"
|
||||
r"室内灯|车内灯|氛围灯"
|
||||
)
|
||||
SEAT_CONTROL_PATTERN = re.compile(
|
||||
r"座椅|坐椅|座位|靠背|椅背|坐盆|坐垫|滑轨|腿托|脚托|四轴|"
|
||||
r"通风|加热|按摩|记忆|预设"
|
||||
)
|
||||
PASSENGER_ONLY_QUESTION = "当前所有座椅能力仅控制副驾,不支持主驾座椅目标。"
|
||||
UNSUPPORTED_SEAT_SCOPE_PATTERN = re.compile(
|
||||
r"后排|第二排|二排|第三排|三排|左前座椅|左前座|左前|"
|
||||
@@ -799,6 +808,16 @@ def parse_local_intent(
|
||||
"""Parse common Chinese seat commands without making hardware assumptions."""
|
||||
|
||||
text = _normalize_text(utterance)
|
||||
if NON_SEAT_DEVICE_PATTERN.search(text) and not SEAT_CONTROL_PATTERN.search(text):
|
||||
# This parser owns CAN0 passenger-seat semantics only. Occupant words
|
||||
# such as “主驾/副驾” in a window or climate clause are spatial
|
||||
# qualifiers for that device and must not create a seat ambiguity.
|
||||
return {
|
||||
"actions": [],
|
||||
"ambiguities": [],
|
||||
"decision_summary": [],
|
||||
"confidence": 0.0,
|
||||
}
|
||||
clauses = [part for part in re.split(r"[,,。;;!!??]", text) if part]
|
||||
actions: list[dict[str, Any]] = []
|
||||
motion_actions: list[dict[str, Any]] = []
|
||||
|
||||
@@ -311,7 +311,7 @@ class SeatServiceIntegrationTests(unittest.TestCase):
|
||||
]
|
||||
self.assertEqual(
|
||||
commands,
|
||||
["seat driver memory recall 3", "ac temp driver 25", "ac fan 1"],
|
||||
["seat driver position 3", "ac temp driver 25", "ac fan 1"],
|
||||
)
|
||||
|
||||
def test_model_climate_request_completes_domain_loop(self) -> None:
|
||||
|
||||
@@ -67,6 +67,21 @@ class LocalIntentParserTests(unittest.TestCase):
|
||||
self.assertEqual(result["actions"][0]["target"], "passenger")
|
||||
self.assertEqual(result["ambiguities"], [])
|
||||
|
||||
def test_non_seat_spatial_qualifiers_do_not_enter_can0_seat_rules(self) -> None:
|
||||
utterances = (
|
||||
"打开主驾车窗",
|
||||
"打开副驾车窗",
|
||||
"把主驾和副驾温度都设为24度",
|
||||
"风量调到2档",
|
||||
"设置主驾出风模式为吹脸",
|
||||
)
|
||||
for utterance in utterances:
|
||||
with self.subTest(utterance=utterance):
|
||||
result = parse_local_intent(utterance)
|
||||
|
||||
self.assertEqual(result["actions"], [])
|
||||
self.assertEqual(result["ambiguities"], [])
|
||||
|
||||
def test_parses_four_axis_zero_for_passenger(self) -> None:
|
||||
result = parse_local_intent("把水平、坐盆、靠背、腿托四轴归零")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user