优化语音输入/普通文本输入
This commit is contained in:
@@ -133,7 +133,9 @@ CONVERSATION_ID_PATTERN = re.compile(r"^conv-[a-z0-9-]{6,80}$")
|
||||
MODE_EDITOR_REQUEST_ID_PATTERN = re.compile(r"^req-[a-z0-9-]{6,100}$")
|
||||
SEAT_SCOPE_PATTERN = re.compile(r"\bseats?\b|座椅|坐椅", re.IGNORECASE)
|
||||
DRIVER_SEAT_SCOPE_PATTERN = re.compile(
|
||||
r"\bdriver\b|\bfront[-_ ]?left\b|\bleft[-_ ]?front\b|主驾|驾驶位|司机位|左前",
|
||||
r"\bdriver\b|\bfront[-_ ]?left\b|\bleft[-_ ]?front\b|"
|
||||
r"主驾|主驾驶(?:座|座椅|席)?|驾驶位|驾驶席|驾驶座(?:椅)?|"
|
||||
r"司机位|司机座(?:椅)?|左前",
|
||||
re.IGNORECASE,
|
||||
)
|
||||
PASSENGER_SEAT_SCOPE_PATTERN = re.compile(
|
||||
@@ -2257,13 +2259,9 @@ class SeatDemoService:
|
||||
local_preview=local_preview,
|
||||
model_parse_source=model_parse_source,
|
||||
)
|
||||
if self._is_dynamic_mode_stop_request(utterance):
|
||||
dynamic_mode_stop = self._is_dynamic_mode_stop_request(utterance)
|
||||
if dynamic_mode_stop:
|
||||
parsed = self._apply_dynamic_mode_stop_request(parsed, utterance)
|
||||
else:
|
||||
parsed = self._apply_mode_profiles(
|
||||
parsed, matched_modes, context, vehicle_profile
|
||||
)
|
||||
parsed = self._mark_control_parse_source(parsed, "local_rule")
|
||||
relative_resolution = (
|
||||
self.native_can_relative_resolver.resolve(utterance, context)
|
||||
if self.native_can_relative_resolver.matches(utterance)
|
||||
@@ -2282,6 +2280,19 @@ class SeatDemoService:
|
||||
relative_resolution.claimed_controls if relative_resolution else None
|
||||
),
|
||||
)
|
||||
if not dynamic_mode_stop:
|
||||
# Apply repository-backed modes after the final native-CAN
|
||||
# merge. Otherwise that merge can discard a valid passenger
|
||||
# mode operation while enforcing its generic unscoped-seat
|
||||
# CH1 default.
|
||||
parsed = self._apply_mode_profiles(
|
||||
parsed,
|
||||
matched_modes,
|
||||
context,
|
||||
vehicle_profile,
|
||||
utterance=utterance,
|
||||
)
|
||||
parsed = self._mark_control_parse_source(parsed, "local_rule")
|
||||
if direct_mode_profile is not None:
|
||||
parsed = self._mark_control_parse_source(
|
||||
parsed,
|
||||
@@ -3327,6 +3338,8 @@ class SeatDemoService:
|
||||
matched_modes: list[ModeProfile],
|
||||
context: dict[str, Any],
|
||||
vehicle_profile: VehicleProfile,
|
||||
*,
|
||||
utterance: str,
|
||||
) -> dict[str, Any]:
|
||||
if not matched_modes:
|
||||
return parsed
|
||||
@@ -3354,6 +3367,12 @@ class SeatDemoService:
|
||||
]
|
||||
return rejected
|
||||
|
||||
parsed = self._apply_implicit_mode_target_policy(
|
||||
parsed,
|
||||
matched_modes,
|
||||
utterance,
|
||||
)
|
||||
|
||||
safety_ambiguities = [
|
||||
item
|
||||
for item in parsed.get("ambiguities", [])
|
||||
@@ -3430,6 +3449,38 @@ class SeatDemoService:
|
||||
)
|
||||
return merged
|
||||
|
||||
@staticmethod
|
||||
def _apply_implicit_mode_target_policy(
|
||||
parsed: dict[str, Any],
|
||||
matched_modes: list[ModeProfile],
|
||||
utterance: str,
|
||||
) -> dict[str, Any]:
|
||||
"""Let one matched mode own only an omitted seat target.
|
||||
|
||||
The native CH1 parser can add an implicit-driver ambiguity before or
|
||||
after mode injection. A unique repository-backed mode already carries
|
||||
authoritative target scopes on every operation, so that one tagged
|
||||
default is redundant. Explicit scopes and all other safety questions
|
||||
remain untouched.
|
||||
"""
|
||||
|
||||
if len(matched_modes) != 1 or (
|
||||
DRIVER_SEAT_SCOPE_PATTERN.search(utterance)
|
||||
or PASSENGER_SEAT_SCOPE_PATTERN.search(utterance)
|
||||
):
|
||||
return parsed
|
||||
ambiguities = list(parsed.get("ambiguities", []))
|
||||
filtered = [
|
||||
item
|
||||
for item in ambiguities
|
||||
if item.get("reason") != "implicit_driver_default_unresolved"
|
||||
]
|
||||
if len(filtered) == len(ambiguities):
|
||||
return parsed
|
||||
resolved = deepcopy(parsed)
|
||||
resolved["ambiguities"] = filtered
|
||||
return resolved
|
||||
|
||||
@staticmethod
|
||||
def _is_dynamic_mode_stop_request(utterance: str) -> bool:
|
||||
compact = re.sub(r"\s+", "", utterance)
|
||||
|
||||
Reference in New Issue
Block a user