288 lines
13 KiB
Markdown
Executable File
288 lines
13 KiB
Markdown
Executable File
# Cognitive Agent
|
||
|
||
面向车载执行器的认知编排单仓工程。系统把自然语言或结构化请求转换为可校验的语义配置,由领域插件确定性编译为 `CommandPlan`,经过平台安全门禁后以 dry-run、模拟台架或真实 CAN 方式执行,并保存可审计结果。
|
||
|
||
当前仓库以腾势 N7 / T2G 座舱演示和硬件台架为主。默认环境不会打开真实硬件;气候、天幕和氛围灯领域的矩阵目前也只允许虚拟执行。
|
||
|
||
## 能做什么
|
||
|
||
- 同源 Python HTTP 服务与 Vue 3 + Vite Web 控制台。
|
||
- 能力目录驱动的自然语言编排、模式卡片、跨域场景和 NDJSON 助手流。
|
||
- `IntentIR`、`FunctionConfig`、`SceneConfig`、`CommandPlan`、`TraceEvent` 和 `ExecutionReport` 公共契约。
|
||
- 座椅、空调、天幕、氛围灯四个领域插件,以及平台侧门窗、插座、阅读灯等原生 CAN 能力。
|
||
- 虚拟 CAN、模拟硬件、T2G ZLG CAN 台架和双通道车身 CAN 接入。
|
||
- 语音输入、MediaPipe 手势、NFC/红外外设、模式目录同步和只读固件 OTA 服务。
|
||
|
||
AI 模型只能提出受契约约束的语义计划,不能生成或发送原始 CAN 帧。真实执行仍由服务端的能力白名单、参数 Schema、硬件授权、安全策略、互斥和反馈检查共同决定。
|
||
|
||
## 处理链路
|
||
|
||
```text
|
||
用户请求
|
||
-> 能力目录 / 会话状态 / Codex 或本地解析
|
||
-> IntentIR
|
||
-> FunctionConfig(单领域)或 SceneConfig(跨领域)
|
||
-> 公共 Schema + 领域语义校验
|
||
-> 领域 Compiler -> CommandPlan
|
||
-> 平台安全校验 -> dry-run / simulated_hardware / physical CAN
|
||
-> 回读、超时和审计 -> TraceEvent + ExecutionReport
|
||
```
|
||
|
||
运行时产物位于 `artifacts/runs/<request_id>/`,典型结构如下:
|
||
|
||
```text
|
||
intent.yaml
|
||
scene.yaml # 跨域请求才有
|
||
functions/<domain>.yaml
|
||
command-plans/<domain>.yaml
|
||
trace.jsonl
|
||
execution-report.yaml
|
||
```
|
||
|
||
不要在 `artifacts/` 写入 API Key、完整隐私文本或未脱敏车辆标识。
|
||
|
||
## 当前能力边界
|
||
|
||
| 能力面 | 当前状态 | 事实来源 |
|
||
| --- | --- | --- |
|
||
| `seat` | 虚拟矩阵闭环;T2G 台架使用独立硬件映射和校准 | [`domains/seat/`](domains/seat/)、[台架流程](docs/workflows/t2g-seat-hardware-bench.md) |
|
||
| `climate` | dry-run;支持分区温度、电源、风量、A/C、循环、风向和前除霜 | [`domains/climate/`](domains/climate/) |
|
||
| `roof` | dry-run;支持透光率、后遮阳帘位置和自动调光 | [`domains/roof/`](domains/roof/) |
|
||
| `ambient_light` | dry-run;支持开关、RGB、亮度和矩阵场景模式 | [`domains/ambient_light/`](domains/ambient_light/) |
|
||
| 原生车身 CAN | 按平台和运行时能力目录启用,不等同于领域插件 | [`config/native_can_capabilities/`](config/native_can_capabilities/)、[`platforms/`](platforms/) |
|
||
| 模式卡片 | `config/scene_templates/` 提供内置模板;用户模式持久化到 `artifacts/mode-profiles/` | [模式时间轴](docs/mode-schedules.md) |
|
||
|
||
`platforms/reference_vehicle` 的 `execution_enabled` 为 `false`。`platforms/t2g_seat_bench` 和 `platforms/t2g_cabin_bench` 才是仓库内允许配置真实执行的台架平台,但仍需硬件开关、授权令牌、总线配置和反馈校验全部满足。
|
||
|
||
## 快速开始
|
||
|
||
### 环境要求
|
||
|
||
- Python 3.11 或更高版本。
|
||
- Node.js 与 npm(构建 Web 控制台)。
|
||
- Codex CLI `0.150.0-alpha.8`,用于内置 AI 助手。
|
||
- 真实台架另需 ZLG 驱动/桥接程序、对应 DBC、IAR 工具链和硬件授权。
|
||
|
||
### 安装(PowerShell)
|
||
|
||
```powershell
|
||
py -3.11 -m venv .venv
|
||
.\.venv\Scripts\python.exe -m pip install --upgrade pip
|
||
.\.venv\Scripts\python.exe -m pip install -e ".[test,dev,api,can,llm,ir]"
|
||
|
||
cd apps\web-console
|
||
npm ci
|
||
npm run build
|
||
cd ..\..
|
||
|
||
npm install --global @openai/codex@0.150.0-alpha.8
|
||
codex login status
|
||
```
|
||
|
||
语音识别是可选安装项:
|
||
|
||
```powershell
|
||
.\.venv\Scripts\python.exe -m pip install -e ".[speech]"
|
||
.\.venv\Scripts\python.exe tools\install_sensevoice_model.py
|
||
```
|
||
|
||
配置模型认证时使用 `OPENAI_API_KEY`,或让 Codex CLI 使用已登录账户。`.env` 和 `.env.auth` 已被 Git 忽略;可参照 [`config/environments/`](config/environments/) 中的示例配置。不要把密钥提交到仓库。
|
||
|
||
### 启动完整本地演示
|
||
|
||
推荐使用启动器。它会管理主服务、只读模式卡片服务和只读 OTA 服务:
|
||
|
||
```powershell
|
||
.\.venv\Scripts\python.exe tools\start_n7web.py --skip-web-build
|
||
```
|
||
|
||
默认端口:
|
||
|
||
| 服务 | 地址 | 说明 |
|
||
| --- | --- | --- |
|
||
| 主服务和 Web 控制台 | `http://127.0.0.1:8000` | API、控制台、助手和车控入口 |
|
||
| 模式卡片目录 | `http://127.0.0.1:8090/n7/scenes` | HTTP/UDP 只读目录服务 |
|
||
| 固件 OTA | `http://127.0.0.1:8012` | 只读发布清单和下载 |
|
||
|
||
启动前端构建:
|
||
|
||
```powershell
|
||
.\.venv\Scripts\python.exe tools\start_n7web.py
|
||
```
|
||
|
||
启动器支持 `--host`、`--port`、`--scene-port`、`--ota-port`、`--catalog`、`--server-id`、`--python` 和 `--dry-run`。使用 `--host 0.0.0.0` 前请确认网络可信,并为公网部署启用认证和 HTTPS。
|
||
|
||
健康检查:
|
||
|
||
```powershell
|
||
Invoke-RestMethod http://127.0.0.1:8000/api/health
|
||
Invoke-RestMethod http://127.0.0.1:8000/api/assistant/status
|
||
```
|
||
|
||
`/api/health` 依赖 Codex App Server 就绪;助手进程不可用时返回 HTTP `503`,不会伪装成可用服务。
|
||
|
||
### 只启动主服务
|
||
|
||
需要自行运行前端开发服务器或不需要模式目录/OTA 服务时,可直接运行:
|
||
|
||
```powershell
|
||
$env:PYTHONPATH = "src;domains/seat/src"
|
||
.\.venv\Scripts\python.exe -m cognitive_agent.server
|
||
```
|
||
|
||
前端热更新:
|
||
|
||
```powershell
|
||
cd apps\web-console
|
||
npm run dev
|
||
```
|
||
|
||
Vite 使用 `http://127.0.0.1:5173`,并把 `/api` 与 `/artifacts` 代理到 `http://127.0.0.1:8000`。生产构建输出为 `apps/web-console/dist`,主服务检测到该目录后优先提供构建产物。
|
||
|
||
在已安装 GNU Make 的环境中,`make dev` 等价于启动主服务;Windows PowerShell 推荐使用上面的显式 Python 命令,以确保使用仓库的 `.venv`。
|
||
|
||
## 开发与验证
|
||
|
||
先激活 `.venv`,或把下面的 `python` 替换为 `.\.venv\Scripts\python.exe`。仓库的 `Makefile` 使用 POSIX 风格环境变量,在 Windows 上也可以直接调用 Python 脚本。
|
||
|
||
```bash
|
||
# 公共 Schema、领域清单、平台资源和生成 CAN 协议
|
||
make validate
|
||
|
||
# 全量 Python、前端契约和 CAN 协议回归
|
||
make test
|
||
|
||
# 仅前端运行时契约
|
||
make test-frontend
|
||
|
||
# 生成或检查共享 CAN 语义协议
|
||
make can-protocol-generate
|
||
make can-protocol-check
|
||
```
|
||
|
||
不使用 `make` 时:
|
||
|
||
```powershell
|
||
.\.venv\Scripts\python.exe tools\validate_repository.py
|
||
.\.venv\Scripts\python.exe -m pytest
|
||
```
|
||
|
||
仓库配置了 `pytest` 的 `contract`、`integration` 和 `hardware` markers。默认测试使用虚拟或模拟执行;真实台架测试必须按 [T2G 前端测试集](docs/testing/t2g-seat-frontend-test-suite.md) 的顺序执行,并显式确认硬件。
|
||
|
||
构建双通道 CAN 读取工具需要 CMake 和外部 CANFD SDK:
|
||
|
||
```bash
|
||
make can-read-trans
|
||
make can-read-trans-test
|
||
```
|
||
|
||
## API 入口
|
||
|
||
浏览器只访问同源服务。下面是主要集成面,完整路由以 [`src/cognitive_agent/server.py`](src/cognitive_agent/server.py) 为准:
|
||
|
||
| 方法 | 路径 | 用途 |
|
||
| --- | --- | --- |
|
||
| `GET` | `/api/health` | 服务与助手健康状态 |
|
||
| `GET` | `/api/runtime` | 当前运行时、平台和执行模式摘要 |
|
||
| `GET` | `/api/assistant/status` | Codex App Server 状态 |
|
||
| `GET` | `/api/assistant/capabilities` | 权威能力目录快照 |
|
||
| `POST` | `/api/requests` | 提交自然语言或结构化车控请求 |
|
||
| `POST` | `/api/requests/preview` | 只规划/校验,不执行 |
|
||
| `POST` | `/api/assistant/stream` | AI 助手 NDJSON 流 |
|
||
| `GET` | `/api/hardware/seat-state` | 座椅状态快照 |
|
||
| `GET` | `/api/hardware/vehicle-state` | 车身状态快照 |
|
||
| `GET` | `/api/vehicle-display-sync` | 网页与车机任务同步 |
|
||
| `GET` | `/n7/scenes` | 只读模式目录 |
|
||
|
||
`/api/internal/codex/vehicle-control` 仅供本机 Codex MCP 回调使用,需要一次性令牌和原始请求绑定,不是浏览器或第三方 API。语音、手势、NFC、固件工作台和自修复接口也由服务端权限门禁保护。
|
||
|
||
## 配置与安全
|
||
|
||
默认 [`config/default.yaml`](config/default.yaml) 使用 `dry_run`、结构化输出和 `artifacts/runs`。真实硬件必须同时满足:
|
||
|
||
1. 平台 manifest 的 `execution_enabled: true`。
|
||
2. 对应 CAN 后端、通道、DBC 和校准可用。
|
||
3. 服务端硬件开关、授权令牌和安全策略通过校验。
|
||
4. 领域映射明确允许硬件执行,并收到真实反馈。
|
||
|
||
模拟台架显式使用:
|
||
|
||
```powershell
|
||
$env:COGNITIVE_AGENT_SIMULATED_HARDWARE_ENABLED = "true"
|
||
```
|
||
|
||
模拟结果会标记为 `simulated_hardware`,不会打开真实 CAN、ZLG 或 IAR。真实 T2G 座椅需要参考 [`config/environments/t2g_seat_bench.example.yaml`](config/environments/t2g_seat_bench.example.yaml) 和 [硬件台架流程](docs/workflows/t2g-seat-hardware-bench.md);不要仅通过前端按钮声称已经获得硬件权限。
|
||
|
||
语音和摄像头只在安全来源工作:本机使用 `http://127.0.0.1:8000`,远程部署必须使用 HTTPS。局域网开发命令如下:
|
||
|
||
```bash
|
||
make dev-lan
|
||
```
|
||
|
||
该模式会监听全部网络接口,任何可达设备都可能触发服务端请求,只适合可信网络临时演示。
|
||
|
||
## 代码结构
|
||
|
||
```text
|
||
apps/web-console/ Vue 入口、兼容运行层、静态资源和 PWA
|
||
src/cognitive_agent/ HTTP 服务、应用编排、运行时、基础设施和助手适配
|
||
domains/*/ 领域插件:能力、Schema、映射、编译器和测试
|
||
platforms/*/ 车型、DBC、总线和校准;定义执行边界
|
||
contracts/schemas/ 冻结的公共 JSON Schema
|
||
config/ 环境、策略、车辆、模式和原生能力配置
|
||
tests/ 跨域契约、集成、端到端和前端测试
|
||
tools/ 启动器、仓库校验、协议生成、HIL 和诊断工具
|
||
firmware/t2g/ T2G 固件工程和可烧录依赖
|
||
deploy/ Docker Compose、服务器和 Kubernetes 占位配置
|
||
docs/ 架构、决策、治理、工作流和测试说明
|
||
artifacts/ 本地运行产物、模型、HIL 报告和持久化数据
|
||
```
|
||
|
||
依赖边界:领域插件只依赖 SDK 和公共契约,不直接调用 LLM、HTTP 或 CAN;编排层只组合语义配置,不按 CAN signal 编排;DBC 和安全标定由 `platforms/` 统一维护。详见 [总体架构](docs/architecture/overview.md)、[领域交付流程](docs/workflows/domain-delivery.md) 和 [所有权规则](docs/governance/ownership.md)。
|
||
|
||
## 可选能力
|
||
|
||
### 语音
|
||
|
||
安装 `.[speech]` 并运行 `tools/install_sensevoice_model.py` 后,控制台支持手动录音和唤醒词待机。预览和最终识别接口为 `/api/speech/preview` 与 `/api/speech/transcribe`;录音不持久化。调试使用 `SPEECH_DEBUG=1`,默认不向浏览器返回 trace。
|
||
|
||
### 手势
|
||
|
||
手势模型随仓库提供:`apps/web-console/assets/gesture/gesture_recognizer.task`。推理在浏览器完成,视频帧不上传;需要摄像头权限和安全来源。
|
||
|
||
### NFC / 红外外设
|
||
|
||
安装 `.[ir]` 后运行主服务。NFC、GSCU1B TCP 网关、红外槽位目录和 MQTT 回退由 `/api/extension/*` 管理;学习、绑定和发射均受服务端能力目录与持久 NFC 绑定约束。
|
||
|
||
### Android PAD
|
||
|
||
```powershell
|
||
powershell -ExecutionPolicy Bypass -File .\tools\android_pad_dev.ps1
|
||
powershell -ExecutionPolicy Bypass -File .\tools\android_pad_dev.ps1 -Stop
|
||
```
|
||
|
||
脚本使用模拟台架,不打开真实硬件执行。
|
||
|
||
## 部署
|
||
|
||
服务器 Docker Compose 和 Caddy 反向代理说明见 [`deploy/server/README.md`](deploy/server/README.md)。镜像默认以非 root 用户、只读根文件系统运行,应用只绑定服务器回环地址,再由 Caddy 提供 HTTPS。部署时通过私密环境文件注入认证材料和模型凭据,不把 `.env`、`.env.auth`、Codex `auth.json` 或 API Key 放入镜像和版本库。
|
||
|
||
`deploy/docker/` 记录后续拆分 API/worker/Web 的边界;`deploy/k8s/` 目前是 Kubernetes 资源占位文档。真实 CAN 设备只能挂载到明确授权的执行器环境。
|
||
|
||
## 相关文档
|
||
|
||
- [总体架构](docs/architecture/overview.md)
|
||
- [T2G 座椅与车身双通道 CAN](docs/workflows/t2g-cabin-dual-channel-can.md)
|
||
- [T2G 座椅真实硬件台架](docs/workflows/t2g-seat-hardware-bench.md)
|
||
- [T2G 座椅前端测试集](docs/testing/t2g-seat-frontend-test-suite.md)
|
||
- [中文语音控制链路](docs/speech-recognition.md)
|
||
- [模式卡片与时间轴](docs/mode-schedules.md)
|
||
- [领域交付流程](docs/workflows/domain-delivery.md)
|
||
- [所有权与变更边界](docs/governance/ownership.md)
|
||
- [服务器部署](deploy/server/README.md)
|
||
- [Web 控制台细节](apps/web-console/README.md)
|
||
|
||
## 项目状态
|
||
|
||
这是面向演示、集成和受控台架验证的工程,不是未经适配即可部署到任意车型的通用车控产品。提交修改前至少运行 `validate` 和相关领域测试;涉及 DBC、平台标定、硬件执行或公共 Schema 的变更,需要同时更新对应专题文档与回归用例。
|