优化语音输入/普通文本输入

This commit is contained in:
minghanchen
2026-09-03 13:36:40 +08:00
parent 009d8ca73e
commit 32d179143f
26 changed files with 2318 additions and 53 deletions
@@ -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)