feat: 完善 N7 智能座舱交互与控制链路

This commit is contained in:
vee
2026-09-07 15:34:59 +08:00
parent 32d179143f
commit c96970f068
100 changed files with 30088 additions and 1174 deletions
+17
View File
@@ -0,0 +1,17 @@
{
"version": 1,
"positions": {
"1": {
"payload_15": "15 02 C6 3E 2A C8 FF FF",
"payload_16": "16 9A 66 3C 76 04 06 00"
},
"2": {
"payload_15": "15 02 A6 AE 00 C8 FF FF",
"payload_16": "16 9A 66 3C 76 04 06 00"
},
"3": {
"payload_15": "15 02 C6 3E 2A C8 FF FF",
"payload_16": "16 9A 66 3C 76 04 06 00"
}
}
}
+218
View File
@@ -0,0 +1,218 @@
"""Deterministic JSONL App Server used by protocol adapter tests."""
from __future__ import annotations
import json
import os
import sys
import time
import tomllib
from pathlib import Path
TRACE_PATH = Path.cwd() / "wire.jsonl"
ENVIRONMENT_PATH = Path.cwd() / "environment.json"
EXTRA_MCP_NAME = next(
(
argument.removeprefix("--fake-extra-mcp=")
for argument in sys.argv[1:]
if argument.startswith("--fake-extra-mcp=")
),
None,
)
INVALID_MCP_CONFIG = "--fake-invalid-mcp-config" in sys.argv[1:]
thread_number = 0
turn_number = 0
waiting_turns: dict[str, str] = {}
ENVIRONMENT_PATH.write_text(
json.dumps(sorted(os.environ), ensure_ascii=True),
encoding="utf-8",
)
def emit(message: dict[str, object]) -> None:
print(json.dumps(message, ensure_ascii=False, separators=(",", ":")), flush=True)
def trace(message: dict[str, object]) -> None:
with TRACE_PATH.open("a", encoding="utf-8") as stream:
stream.write(json.dumps(message, ensure_ascii=False) + "\n")
for raw_line in sys.stdin:
message = json.loads(raw_line)
trace(message)
method = message.get("method")
request_id = message.get("id")
params = message.get("params") if isinstance(message.get("params"), dict) else {}
if method == "initialize":
emit(
{
"id": request_id,
"result": {
"userAgent": "fake-codex/1.0",
"platformFamily": "test",
"platformOs": "test",
},
}
)
elif method == "initialized":
continue
elif method == "config/read":
mcp_override = next(
(
argument.removeprefix("mcp_servers=")
for argument in sys.argv
if argument.startswith("mcp_servers=")
),
"{}",
)
mcp_servers = tomllib.loads(f"mcp_servers = {mcp_override}")["mcp_servers"]
if EXTRA_MCP_NAME and EXTRA_MCP_NAME not in mcp_servers:
mcp_servers[EXTRA_MCP_NAME] = {"enabled": True}
if INVALID_MCP_CONFIG:
mcp_servers = {}
emit(
{
"id": request_id,
"result": {
"config": {
"model_provider": "fake-provider",
"mcp_servers": mcp_servers,
},
"origins": {},
"layers": None,
},
}
)
elif method == "thread/start":
thread_number += 1
thread_id = f"thread-{thread_number}"
emit(
{
"id": request_id,
"result": {
"thread": {"id": thread_id},
"model": params.get("model"),
"modelProvider": params.get("modelProvider"),
},
}
)
elif method == "turn/start":
turn_number += 1
turn_id = f"turn-{turn_number}"
thread_id = str(params.get("threadId"))
text = str((params.get("input") or [{}])[0].get("text") or "")
# Emit before the RPC response to exercise out-of-order event backlog.
emit(
{
"method": "turn/started",
"params": {
"threadId": thread_id,
"turn": {"id": turn_id, "status": "inProgress", "items": []},
},
}
)
emit(
{
"id": request_id,
"result": {"turn": {"id": turn_id, "status": "inProgress", "items": []}},
}
)
if "WAIT_FOR_INTERRUPT" in text:
waiting_turns[turn_id] = thread_id
continue
if "EXIT_DURING_TURN" in text:
# Let the client register the returned turn handle before stdout
# closes, then exercise its unexpected-process-exit path.
time.sleep(0.1)
raise SystemExit(23)
if "FAIL_DURING_TURN" in text:
emit(
{
"method": "error",
"params": {
"threadId": thread_id,
"turnId": turn_id,
"willRetry": False,
"error": {"message": "upstream failed without a terminal event"},
},
}
)
continue
item_id = f"answer-{turn_number}"
emit(
{
"method": "item/started",
"params": {
"threadId": thread_id,
"turnId": turn_id,
"startedAtMs": 1,
"item": {
"id": item_id,
"type": "agentMessage",
"text": "",
"phase": "final_answer",
},
},
}
)
for delta in ("协议", "正常"):
emit(
{
"method": "item/agentMessage/delta",
"params": {
"threadId": thread_id,
"turnId": turn_id,
"itemId": item_id,
"delta": delta,
},
}
)
emit(
{
"method": "item/completed",
"params": {
"threadId": thread_id,
"turnId": turn_id,
"completedAtMs": 2,
"item": {
"id": item_id,
"type": "agentMessage",
"text": "协议正常",
"phase": "final_answer",
},
},
}
)
emit(
{
"method": "turn/completed",
"params": {
"threadId": thread_id,
"turn": {"id": turn_id, "status": "completed", "items": []},
},
}
)
elif method == "turn/interrupt":
turn_id = str(params.get("turnId"))
thread_id = waiting_turns.pop(turn_id, str(params.get("threadId")))
emit({"id": request_id, "result": {}})
emit(
{
"method": "turn/completed",
"params": {
"threadId": thread_id,
"turn": {"id": turn_id, "status": "interrupted", "items": []},
},
}
)
elif method == "thread/unsubscribe":
emit({"id": request_id, "result": {"status": "unsubscribed"}})
else:
emit(
{
"id": request_id,
"error": {"code": -32601, "message": f"unsupported: {method}"},
}
)
+10 -7
View File
@@ -21,14 +21,17 @@
{"name":"target_correction","raw":"把座椅,不对,把靠背往后调一点。","clean":"将座椅靠背向后调整一点。","capabilities":["seat.set_driver_axis_native"],"cancelled":1,"uncertain":false},
{"name":"action_correction","raw":"把空调关掉,不,是打开。","clean":"打开空调。","capabilities":["climate.set_power"],"cancelled":1,"uncertain":false},
{"name":"multi_not_correction","raw":"空调调到24度,然后把座椅靠背调到20度。","clean":"将空调设置为24度,然后将座椅靠背调整到20度。","capabilities":["climate.set_temperature","seat.set_backrest_recline"],"cancelled":0,"uncertain":true},
{"name":"cancel_incomplete","raw":"把空调调……算了。","clean":"","capabilities":[],"cancelled":1,"uncertain":false},
{"name":"cancel_incomplete","raw":"把空调调……算了。","clean":"","assistant":"算了。","capabilities":[],"cancelled":1,"uncertain":false},
{"name":"negated_open","raw":"不要打开空调。","clean":"不要打开空调。","capabilities":[],"cancelled":1,"uncertain":false},
{"name":"negated_close","raw":"不要关闭空调。","clean":"不要关闭空调。","capabilities":[],"cancelled":1,"uncertain":false},
{"name":"filler_cancel","raw":"嗯嗯,那个……算了。","clean":"","capabilities":[],"cancelled":1,"uncertain":false},
{"name":"unrelated_chat","raw":"今天天气还不错。","clean":"","capabilities":[],"cancelled":0,"uncertain":false},
{"name":"unrelated_question","raw":"我们中午吃什么?","clean":"","capabilities":[],"cancelled":0,"uncertain":false},
{"name":"unknown_device","raw":"打开雨刷。","clean":"","capabilities":[],"cancelled":0,"uncertain":true},
{"name":"incomplete_known_target","raw":"空调挺凉快。","clean":"","capabilities":[],"cancelled":0,"uncertain":true},
{"name":"filler_cancel","raw":"嗯嗯,那个……算了。","clean":"","assistant":"算了。","capabilities":[],"cancelled":1,"uncertain":false},
{"name":"unrelated_chat","raw":"今天天气还不错。","clean":"","assistant":"今天天气还不错。","capabilities":[],"cancelled":0,"uncertain":false},
{"name":"unrelated_question","raw":"我们中午吃什么?","clean":"","assistant":"我们中午吃什么?","capabilities":[],"cancelled":0,"uncertain":false},
{"name":"unknown_device","raw":"打开雨刷。","clean":"","assistant":"打开雨刷。","capabilities":[],"cancelled":0,"uncertain":true},
{"name":"incomplete_known_target","raw":"空调挺凉快。","clean":"","assistant":"空调挺凉快。","capabilities":[],"cancelled":0,"uncertain":true},
{"name":"comfort_goal_for_assistant","raw":"车上有点热。","clean":"","assistant":"车上有点热。","capabilities":[],"cancelled":0,"uncertain":false},
{"name":"general_knowledge_question","raw":"什么是CAN FD?","clean":"","assistant":"什么是CAN FD?","capabilities":[],"cancelled":0,"uncertain":false},
{"name":"general_question_stutter","raw":"我我想问什么是CAN FD?","clean":"","assistant":"我想问什么是CAN FD?","capabilities":[],"cancelled":0,"uncertain":false},
{"name":"decimal_temperature","raw":"把空调调到24.5度。","clean":"将空调设置为24.5度。","capabilities":["climate.set_temperature"],"cancelled":0,"uncertain":false},
{"name":"chinese_number","raw":"把空调调到二十四度。","clean":"将空调设置为24度。","capabilities":["climate.set_temperature"],"cancelled":0,"uncertain":false},
{"name":"lost_marker_false_start","raw":"空调打开打,把座椅的靠背靠座椅靠背向后调24度。","clean":"将座椅靠背向后调整24度。","capabilities":["seat.set_backrest_recline"],"cancelled":1,"uncertain":false},
@@ -58,7 +61,7 @@
{"name":"elliptical_temperature","raw":"空调二十四度","clean":"将空调设置为24度。","capabilities":["climate.set_temperature"],"cancelled":0,"uncertain":false,"execution_eligible":true},
{"name":"elliptical_value_continuation","raw":"打开空调,然后二十四度","clean":"打开空调,然后将空调设置为24度。","capabilities":["climate.set_power","climate.set_temperature"],"cancelled":0,"uncertain":false,"execution_eligible":true},
{"name":"punctuated_ambient_slots","raw":"氛围灯打开,调成蓝色,亮度百分之五十","clean":"打开氛围灯,然后将氛围灯颜色调整为蓝色并将亮度设置为50%。","capabilities":["ambient_light.set_power","ambient_light.set_illumination"],"cancelled":0,"uncertain":false,"execution_eligible":true},
{"name":"non_control_continuation_fails_closed","raw":"打开空调,然后开玩笑。","clean":"打开空调。","capabilities":["climate.set_power"],"cancelled":0,"uncertain":true,"execution_eligible":false},
{"name":"non_control_continuation_fails_closed","raw":"打开空调,然后开玩笑。","clean":"打开空调。","assistant":"打开空调,然后开玩笑。","capabilities":["climate.set_power"],"cancelled":0,"uncertain":true,"execution_eligible":false},
{"name":"rocking_horse_mode_unscoped","raw":"将座椅调整为木马模式。","clean":"将座椅调整为木马模式。","capabilities":[null],"cancelled":0,"uncertain":false,"execution_eligible":true},
{"name":"rocking_horse_mode_enter","raw":"进入木马模式","clean":"将座椅调整为木马模式。","capabilities":[null],"cancelled":0,"uncertain":false,"execution_eligible":true},
{"name":"rocking_horse_mode_stop","raw":"关闭木马模式","clean":"关闭木马模式。","capabilities":[null],"cancelled":0,"uncertain":false,"execution_eligible":true}