优化无线/有线CAN,以及控制指令解析
This commit is contained in:
@@ -44,6 +44,7 @@ from cognitive_agent.infrastructure.can.hardware import ( # noqa: E402
|
||||
HardwareBusyError,
|
||||
HardwareSafetyError,
|
||||
)
|
||||
from cognitive_agent.infrastructure.can.gateway import CanGatewayError # noqa: E402
|
||||
from cognitive_agent.infrastructure.can.access import ( # noqa: E402
|
||||
HardwareAccessRequiredError,
|
||||
)
|
||||
@@ -387,7 +388,11 @@ class SeatDemoHandler(BaseHTTPRequestHandler):
|
||||
status="failed",
|
||||
utterance=utterance,
|
||||
source=source,
|
||||
error={"code": code, "message": str(error)},
|
||||
error={
|
||||
"code": code,
|
||||
"message": str(error),
|
||||
"outcome": "failed_or_blocked",
|
||||
},
|
||||
)
|
||||
|
||||
try:
|
||||
@@ -536,6 +541,7 @@ class SeatDemoHandler(BaseHTTPRequestHandler):
|
||||
{
|
||||
"error": "hardware_access_required",
|
||||
"message": str(exc),
|
||||
"outcome": "failed_or_blocked",
|
||||
"access_state": exc.state,
|
||||
},
|
||||
HTTPStatus.FORBIDDEN,
|
||||
@@ -546,6 +552,7 @@ class SeatDemoHandler(BaseHTTPRequestHandler):
|
||||
{
|
||||
"error": "hardware_busy",
|
||||
"message": str(exc),
|
||||
"outcome": "failed_or_blocked",
|
||||
"retry_after_seconds": exc.retry_after_seconds,
|
||||
},
|
||||
HTTPStatus.CONFLICT,
|
||||
@@ -554,12 +561,33 @@ class SeatDemoHandler(BaseHTTPRequestHandler):
|
||||
except HardwareSafetyError as exc:
|
||||
fail_display_sync("hardware_safety_gate", exc)
|
||||
self._json(
|
||||
{"error": "hardware_safety_gate", "message": str(exc)},
|
||||
{
|
||||
"error": "hardware_safety_gate",
|
||||
"message": str(exc),
|
||||
"outcome": "failed_or_blocked",
|
||||
},
|
||||
HTTPStatus.FORBIDDEN,
|
||||
)
|
||||
except CanGatewayError as exc:
|
||||
fail_display_sync("can_transport_failed", exc)
|
||||
self._json(
|
||||
{
|
||||
"error": "can_transport_failed",
|
||||
"message": str(exc),
|
||||
"outcome": "failed_or_blocked",
|
||||
},
|
||||
HTTPStatus.SERVICE_UNAVAILABLE,
|
||||
)
|
||||
except (ValueError, json.JSONDecodeError) as exc:
|
||||
fail_display_sync("invalid_request", exc)
|
||||
self._json({"error": "invalid_request", "message": str(exc)}, HTTPStatus.BAD_REQUEST)
|
||||
self._json(
|
||||
{
|
||||
"error": "invalid_request",
|
||||
"message": str(exc),
|
||||
"outcome": "failed_or_blocked",
|
||||
},
|
||||
HTTPStatus.BAD_REQUEST,
|
||||
)
|
||||
except OpenAIIntentError as exc:
|
||||
fail_display_sync("openai_request_failed", exc)
|
||||
self.log_error("OpenAI intent request failed: %s", exc)
|
||||
@@ -567,6 +595,7 @@ class SeatDemoHandler(BaseHTTPRequestHandler):
|
||||
{
|
||||
"error": "openai_request_failed",
|
||||
"message": "GPT 意图解析失败,请检查 API Key、模型权限或网络状态。",
|
||||
"outcome": "failed_or_blocked",
|
||||
},
|
||||
HTTPStatus.BAD_GATEWAY,
|
||||
)
|
||||
@@ -577,6 +606,8 @@ class SeatDemoHandler(BaseHTTPRequestHandler):
|
||||
{
|
||||
"error": "internal_error",
|
||||
"message": "请求处理失败,请查看服务端日志。",
|
||||
"outcome": "failed_or_blocked",
|
||||
"detail": str(exc),
|
||||
},
|
||||
HTTPStatus.INTERNAL_SERVER_ERROR,
|
||||
)
|
||||
@@ -618,6 +649,36 @@ class SeatDemoHandler(BaseHTTPRequestHandler):
|
||||
def on_commands_validated(result: dict[str, object]) -> None:
|
||||
emit({"type": "validated_commands", "payload": result})
|
||||
|
||||
def emit_terminal_error(
|
||||
code: str,
|
||||
message: str,
|
||||
*,
|
||||
detail: str | None = None,
|
||||
extra: dict[str, object] | None = None,
|
||||
) -> None:
|
||||
"""Publish one terminal failure using can_read_trans outcome terms."""
|
||||
|
||||
error = {
|
||||
"code": code,
|
||||
"message": message,
|
||||
"outcome": "failed_or_blocked",
|
||||
**({"detail": detail} if detail else {}),
|
||||
}
|
||||
self.vehicle_display_sync.update_task(
|
||||
status="failed",
|
||||
utterance=utterance,
|
||||
source=source,
|
||||
error=error,
|
||||
)
|
||||
emit({
|
||||
"type": "error",
|
||||
"error": code,
|
||||
"message": message,
|
||||
"outcome": "failed_or_blocked",
|
||||
**({"detail": detail} if detail else {}),
|
||||
**(extra or {}),
|
||||
})
|
||||
|
||||
utterance = str(common_arguments.get("utterance") or "")
|
||||
try:
|
||||
if path == "/api/requests/preview":
|
||||
@@ -663,63 +724,37 @@ class SeatDemoHandler(BaseHTTPRequestHandler):
|
||||
)
|
||||
emit({"type": "result", "payload": result})
|
||||
except HardwareAccessRequiredError as exc:
|
||||
self.vehicle_display_sync.update_task(
|
||||
status="failed",
|
||||
utterance=utterance,
|
||||
source=source,
|
||||
error={"code": "hardware_access_required", "message": str(exc)},
|
||||
emit_terminal_error(
|
||||
"hardware_access_required",
|
||||
str(exc),
|
||||
extra={"access_state": exc.state},
|
||||
)
|
||||
emit({
|
||||
"type": "error",
|
||||
"error": "hardware_access_required",
|
||||
"message": str(exc),
|
||||
"access_state": exc.state,
|
||||
})
|
||||
except HardwareBusyError as exc:
|
||||
self.vehicle_display_sync.update_task(
|
||||
status="failed",
|
||||
utterance=utterance,
|
||||
source=source,
|
||||
error={"code": "hardware_busy", "message": str(exc)},
|
||||
emit_terminal_error(
|
||||
"hardware_busy",
|
||||
str(exc),
|
||||
extra={"retry_after_seconds": exc.retry_after_seconds},
|
||||
)
|
||||
emit({
|
||||
"type": "error",
|
||||
"error": "hardware_busy",
|
||||
"message": str(exc),
|
||||
"retry_after_seconds": exc.retry_after_seconds,
|
||||
})
|
||||
except HardwareSafetyError as exc:
|
||||
self.vehicle_display_sync.update_task(
|
||||
status="failed",
|
||||
utterance=utterance,
|
||||
source=source,
|
||||
error={"code": "hardware_safety_gate", "message": str(exc)},
|
||||
)
|
||||
emit({
|
||||
"type": "error",
|
||||
"error": "hardware_safety_gate",
|
||||
"message": str(exc),
|
||||
})
|
||||
emit_terminal_error("hardware_safety_gate", str(exc))
|
||||
except CanGatewayError as exc:
|
||||
emit_terminal_error("can_transport_failed", str(exc))
|
||||
except (ValueError, json.JSONDecodeError) as exc:
|
||||
emit({
|
||||
"type": "error",
|
||||
"error": "invalid_request",
|
||||
"message": str(exc),
|
||||
})
|
||||
emit_terminal_error("invalid_request", str(exc))
|
||||
except OpenAIIntentError as exc:
|
||||
self.log_error("OpenAI intent request failed: %s", exc)
|
||||
emit({
|
||||
"type": "error",
|
||||
"error": "openai_request_failed",
|
||||
"message": "GPT 意图解析失败,请检查 API Key、模型权限或网络状态。",
|
||||
})
|
||||
emit_terminal_error(
|
||||
"openai_request_failed",
|
||||
"GPT 意图解析失败,请检查 API Key、模型权限或网络状态。",
|
||||
detail=str(exc),
|
||||
)
|
||||
except Exception as exc: # noqa: BLE001 - stream a terminal event
|
||||
self.log_error("streaming request failed: %s", exc)
|
||||
emit({
|
||||
"type": "error",
|
||||
"error": "internal_error",
|
||||
"message": "请求处理失败,请查看服务端日志。",
|
||||
})
|
||||
emit_terminal_error(
|
||||
"internal_error",
|
||||
"请求处理失败,请查看服务端日志。",
|
||||
detail=str(exc),
|
||||
)
|
||||
|
||||
def do_DELETE(self) -> None: # noqa: N802 - stdlib handler API
|
||||
parsed_url = urlparse(self.path)
|
||||
|
||||
Reference in New Issue
Block a user