0d986f60bd
web-platform-ci / Standalone decision service (no cloud credentials) (push) Has been cancelled
web-platform-ci / TypeScript, lint, unit, build (push) Has been cancelled
web-platform-ci / Playwright E2E (push) Has been cancelled
lekiwi-compatibility / cpu-compatibility (push) Has been cancelled
集成服务器托管模型、自然语言移动与有界抓放、内置 LeKiwi URL 导入和双摄像头;同步部署契约与指定域名 iframe 白名单,保留原有物理安全、会话及调用预算防护。 更新 npm 包及锁文件版本、CHANGELOG 与发布文档。提交前 typecheck、120 项定向前端测试和 44 项后端测试通过(3 项可选跳过);真实 v2 云模型抓放仍待单独验收,不包含运行密钥或构建产物。
6.8 KiB
6.8 KiB
服务器内置模型与语言控制 · 2026-09-24
用户最新要求及安全实现
用户要求网站使用项目 .env 中的密钥,不再让前端填写 API,默认 DeepSeek flash / Jev 1.13,并支持“前进0.5m”“转动90度”等语言控制。
已采用服务器配置而非把秘密编入网页:
- 只读取授权的
Deepseek_API_KEY与OPENROUTER_API_KEY。没有整份上传.env,没有读取其他凭据或全局 Codex 登录。 - 固定
deepseek-flash/ Responses 与typesafe/jev-1.13/ OpenRouter Decisions,不改模型或使用其他 OpenRouter 主规划模型。 - 密钥通过 SSH 标准输入传输,不进命令参数或日志。服务器文件
/opt/cadworld-sim/secrets/model-keys.env为 0400 / 10001:10001,父目录 root/0700;仅文件只读挂入应用容器。 - 网页/静态包/镜像/Git 均无密钥。上线前对静态构建扫描两项真实密钥;公网
/.env和/run/secrets/model-keys.env返回 404。 - 前端无模型、密钥、BYOK 或订阅设置;公开配置、模型目录、付费连接测试和订阅接口在共享模式返回 403。本地旧界面和官方订阅实现不删除。
- 全站共享60 次/小时、600 次/滚动24小时的上游调用预留限额,生产并行 2;
/command预留 2 次,其他推理 1 次。失败不退款,SQLite 留在宿主预算目录;换会话/部署不会清零。 - 这是调用次数限制,不是美元硬预算。公开用户可能耗尽公共额度,费用由站长承担;建议供应商侧另设金额上限。
当前支持
路径:控制台 → 机器人语言控制,先导入并选择 LeKiwi v1 profile。
- 前进/后退:0.01–1 米,沿当前机器人朝向。
- 左转/右转:1–180 度;逆时针为左转,顺时针为右转。
- 一次一个动作;“转动90度”方向不明则询问,不默认左/右,不执行原抓放任务。
- 可输入“把方块搬到支撑台”请求固定台面抓放演示;该动作会重载演示场景。移动与转向不重载模型。
- 停止按钮、文本“停止”、隐藏、卸载、换场景/控制权可取消。已运行其他控制器时在付费请求之前拒绝,需用户先停止它。
DeepSeek 只返回受限结构化意图,Jev 检查是否匹配单个请求。浏览器保留单一物理时钟与写入票据,使用实际底盘位姿闭环,而非修改 qpos/瞬移;完成要求误差稳定 0.3 s,位置 <8 mm、角度 <0.015 rad,且实际速度已降低。速度/加速度、倾斜/高度、障碍接触、时钟异常、30 s 仿真/60 s 墙钟上限均可停止动作。
范围仅为模拟 LeKiwi、空旷平地;没有任意机器人泛化、避障规划、任意物体或复合动作承诺。
实际验收(区分证据)
免费门禁
- TypeScript、ESLint、Ruff、625 项 Vitest(132 文件)、43 项后端测试含原生 Codex 无工具门禁通过。
- local / website 生产构建通过;原本地工作台导入、mock 抓放、暂停继续与导出回归通过。
- 网站生产资源+真实网关/假 HTTP 上游:前进、左转、沿新朝向前进、右转、后退、方向含糊拒绝、运动中停止、完整抓放均通过(3 个 E2E 用例)。
- 公网非付费检查 2/2:Pyodide、无密钥输入、未配置机器人零推理、只读模型配置、订阅关闭、秘密路径 404、会话销毁。
- 第一次假上游抓放测试失败是 fixture 总选第一候选、错误报告已夹紧导致;修正 fixture 按观测生成判断后通过,没有放松生产的物理校验。
一轮真实付费验证(未重试)
固定上游、没有前端填写密钥,最多批准 4 次 DeepSeek / 14 次 Jev;实际 4 次 DeepSeek+13 次 Jev,17 次预留。
| 指令 | 结果 | 真实物理证据 |
|---|---|---|
| 前进0.5米 | 成功 | 实际 0.4966307933 m,无重载/瞬移 |
| 左转90度 | 成功 | 实际 89.8288865163°,从上一个动作结束位置开始 |
| 把方块搬到支撑台 | 安全停止,未完整通过 | 搬运 0.5937274002 m,42.218 s 时已在目标支撑、双指力 0、夹爪 opening≈0.999685;松开后 Jev 对下一步选择 stop,未执行最后撤离/稳定验收 |
抓放末尾 Jev 同时报告 grasp=empty, diagnosis=none, recovery=continue, choice=stop。系统遵从 stop,不覆盖其判断、不伪报成功,也没有自动重试。此前 BYOK 阶段有完整真实抓放成功记录,但不能将本轮停止改写成通过。
- DeepSeek 报告合计 2709 token,未报告费用。
- Jev 本轮合计报告 $0.000644154,不含 DeepSeek,不等于完整账单。
- 测试会话已销毁;没有 trace/HAR、浏览器凭据输入或存储状态保存。
- 真实动作测试发生在首次 hosted 发布;后续只加“其他控制器占用时先拒绝、避免无效付费”的预检及文档,未改动作算法/模型请求,未再次消费真实模型额度。
发布与运维
- 当前:
20260924T035108Z-hosted。 - 上一版/回滚:
20260924T032955Z-hosted(同为服务器内置配置)。 - 当前镜像:
sha256:ad1333475d46ae86776f05210c53b71891a31a9fd407d48a86917a8c6c9c3f3a,healthy。 - 应用 10001:10001、只读根、宿主仅回环端口;未重启 1Panel/Docker 等无关服务。
- 第二次发布替换容器后实际查询预算仍为 17,证实未重置。未删除密钥或预算目录。
v1.0.1标签保持不变,本轮代码未另行 commit/push。
证据(本地,不随站点发布):
build/website-deployment/hosted-live/:两项运动成功、抓放停止 JSON 与调用汇总。hosted-fixture-final/、hosted-motion-final/、hosted-local-regression/:免费物理回归。hosted-production-final/:公网非付费 2/2。hosted-security.txt、hosted-final-health.txt:权限、镜像、健康、跨容器预算持久化。
计划剩余
用户已改为固定 DeepSeek+Jev,因此不再安排其他 OpenRouter 主规划模型收费测试。语言控制与服务器内置配置已交付;本次完整抓放复验未全部通过,第 9 步暂不标记完成。若继续,需要用户批准一次额外受控复验或明确接受该安全停止边界;不能静默增加调用、替换模型或绕过 Jev。