dsh-plugin-intelligent-ui
在 DeepSeek Harness 当前对话中,让 Agent 根据任务选择文字、结构化 UI 或交互式 UI,组合严格校验的组件,并把界面作为本地计算、授权工具操作和后续 Agent 请求的入口。
0.2.0 在 P0 上增加 P1 工具/Agent 联动、持久化操作记录,以及 P2 组件级 Streaming 与 Patch。本次任务的 P3 定义为工程加固与验收:真实模型、权限与审批、重复请求、故障恢复、热启停、资源边界和性能测量。具体通过的检查、修复与未验证范围见 VALIDATION。
插件使用 Harness 公开扩展点,不 Fork Harness,不修改核心 Agent Loop,不复制 OpenAI 私有实现或协议。UI DSL 是数据;模型不能通过它执行任意 JavaScript、HTML、CSS 或系统命令。
兼容范围
| 项目 | 核查与运行版本 |
|---|
| Harness | @deepseek-ai/dsh@0.2.1-rc.2,Web profile |
| 官方源码快照 | 687f282e8625c6b8d11ff58211a90524be2e4317,2026-10-18 |
| Cordis / React | 4.0.5 / Harness 提供的 React 18.3.1 |
| Node | 要求 `^22.19.0 |
| 文档 DSL | 1.0 保留原有本地交互;1.1 增加显式外部动作 |
| Wire 协议 | Action/Stream 独立版本化,不改变 Harness Session V4 |
Harness 处于开发者预览阶段,本包锁定已核查版本。Desktop、TUI、其他 Harness 版本及多 Host 共享操作存储不在本次验收范围。接口证据见 SOURCE_AUDIT。
安装与启动
TGZ 已含 Host、Client、类型声明、Schema 和示例,无需先构建。
# 如尚未安装 Harness:
npm install -g @deepseek-ai/dsh@0.2.1-rc.2
# 初始化或读取 Web profile;已有 profile 不会因此重置。
dsh web --dump-config
dsh plugin --profile web add ./dsh-plugin-intelligent-ui-0.2.0.tgz
dsh web --dump-config
dsh web
本项目未发布到 npm registry,请使用交付的 TGZ。安装时 Harness 的包管理器仍可能访问 npm registry 解析依赖。模型账户和凭据沿用 Harness 已有配置,插件没有单独的 API key 设置,也不读取密钥。
启用 P1 / P2
默认启用 P0,外部动作和组件流默认关闭。使用交付源码中的 examples/intelligent-ui.patch.yml,或创建以下管理员配置:
- id: intelligent-ui
config:
actions:
enabled: true
capabilities:
- id: read_file
toolName: read
title: Read text file
description: Read using existing Harness workspace permissions.
risk: read
resultFields: [totalLines]
- id: write_file
toolName: write
title: Write text file
description: Write through Harness after mandatory confirmation.
risk: write
resultFields: [operation]
streaming:
enabled: true
dsh web --patch ./examples/intelligent-ui.patch.yml
配置把已注册工具映射为 capability,不会授予该工具原本没有的权限。目标工具必须在所属 Agent 作用域可见,参数仍须符合真实 Schema。所有 risk: write 操作需要 Harness 原生审批;现有工具策略要求的其他审批也继续生效。管理员必须正确声明副作用,不能把写入工具错误标成 read。
resultFields 仅开放 canonical result 的指定标量字段。示例 read 暴露 totalLines,不会自动把文件内容或原始输出放进 UI。复杂文件列表等功能应注册可信适配工具,筛选返回数据,再明确配置公开字段。
启用、禁用、升级和卸载
Plugins 页面管理 bundle 启用状态。支持即时应用的 Web profile 会卸载/恢复贡献;其他 profile 可重启 Host 使配置生效。停用不删除 Session 或账本,重新启用仅恢复显示,不重新执行动作。
dsh plugin --profile web add ./dsh-plugin-intelligent-ui-NEW_VERSION.tgz
dsh plugin --profile web remove dsh-plugin-intelligent-ui
在聊天中使用
无需特殊命令。可关闭的规划章节提供三种输出形式和组件语法,模型按任务决定是否调用 UI 工具。没有按关键词选择整页模板,也不会强制所有回答生成 UI。
普通问题
1 + 1 等于多少?
预期直接文字回答。
本地计算器
创建一个复利收益计算器:本金用数字输入框,年收益率和年限用滑块;显示期末总额和收益,让结果随输入立即更新。
控件和受限表达式在浏览器本地运行,滑块变化不发起模型请求。固定年收益率示例不包含追加投资、税费等假设;它用于参数探索,不提供精确十进制账本语义。
数据比较
用表格和合适的图表比较这些虚构产品:A 价格199、续航8小时;B 价格249、续航12小时;C 价格179、续航6小时。注明数据来自用户。
工具面板(P1)
创建文件操作面板:读取 fixture.txt,允许编辑新内容,点击保存后通过现有工具写入,并遵守审批。先只生成界面,等我点击后才执行。
点击后,Host 从当前 Session 保存的 UI 重新解析 capability 和参数,写入操作记录,再提交正常 Agent turn。模型调用 intelligent_ui_action 执行保留的动作。此桥接设计复用真实 Agent 上下文、工具权限和原生审批,因此外部动作通常需要一次模型调用;本地输入和计算不需要。
逐步生成(P2)
逐步生成数量分析面板。先给我数量输入和结果,再添加说明与图表;新增组件时保留我正在输入的值。
Agent 使用 intelligent_ui_open、intelligent_ui_patch、intelligent_ui_complete 和 intelligent_ui_cancel,通过正常工具结果传递完整 checkpoint,复用原生 Session 流。组件更新验证 Schema、稳定 ID、基线版本和资源预算。此版本不实现逐 Token 编译器。
状态与持久化边界
| 数据 | 保存位置 / 恢复行为 |
|---|
| 文档、初始 state、derived、动作声明 | 正常 tool/result.meta;历史会话可恢复 |
| 每步流式 checkpoint | 正常工具结果;每帧含完整已验证快照 |
| 本地输入和未提交草稿 | 当前实例内;增量更新保留,刷新恢复初始值 |
| 明确提交的请求、参数、审批与执行状态 | Host storage-domain 账本,用于授权、幂等和恢复 |
| 公开工具回执 | Host 保存,scoped Remote 查询;挂载仅恢复显示 |
刷新、历史回放、热启用均不会提交动作,也不会把历史 resultMap 再写入字段。只有本次明确提交的成功回执允许更新字段;如果用户在等待期间继续编辑,则保留新草稿,并在独立面板显示真实结果。
同一 requestId 的重试复用原记录,参数变化被拒绝;新的用户点击才产生新请求。Host 重启时停止未确认开始的操作,把已经进入执行但结局不明的操作标为 unknown,不会自动重试。取消运行中的工具不等于回滚。
账本容量固定,满后拒绝新增,不自动删除幂等记录。当前实现针对单 Host,不承诺分布式 exactly-once。
开发与验证
npm ci
npm run check
npm run test:package
npm pack
check 包含 TypeScript、全部 Vitest 测试和构建。测试直接使用锁定版本的 Cordis、ToolRuntime、Session/Agent、Gateway/Registry 和官方 conversation assembler,并区分单元、浏览器、完整 Harness 与真实模型验证。
host/ UI tool、规划、capability、动作服务/账本、组件流
client/ 原生 Conversation/ToolView、React registry、状态与 dispatcher
remote/ 正式 Host/Client TYPERT contribution
shared/ DSL、表达式、Action/Stream 协议、验证和预算
schema/ 构建生成的 JSON Schema
examples/ 本地交互、数据、动作、组件流示例与启用配置
tests/ Host、Gateway、shared、assembler 和 React DOM 测试
scripts/ 构建、打包、浏览器、Harness、真实模型和性能验收
docs/ 源码审计、架构、安全、协议和验证记录
lib/ Host ESM、Client lazy factory、Remote 与声明文件
无模型费用的验收
npx playwright install chromium
npm run test:browser
npm run test:harness:advanced
Linux 容器需要 Chromium 系统依赖和字体。advanced 脚本启动真实 Harness,在隔离 profile 中通过官方插件管理器安装 TGZ,仅以确定性 Messages/SSE 替代模型。它验证原生工具、审批、回执、重放、callback、流式、热启停与重启,不需要上游源码副本,也不使用已有用户 DSH_HOME。
原有 npm run test:harness 使用上游官方 mock server,需要 ../upstream-deepseek-harness 或 DSH_UPSTREAM_DIR 指向上述固定提交。
真实模型验收(主动运行会产生调用费用)
把密钥保存在项目外的权限受限文件中;设置 Messages-compatible HTTPS base URL 和精确模型 ID:
export IUI_LIVE_KEY_FILE=/absolute/private/path/api-key
export IUI_LIVE_BASE_URL=https://your-authorized-provider.example/v1
export IUI_LIVE_MODEL=your-model-id
npm run test:live
npm run test:live:harness
npm run test:live:advanced
上述 URL 和模型是占位符。脚本在 base URL 后追加 /messages,禁止重定向,限制调用次数、输出和超时。有代理的 Node 环境可按需使用 node --use-env-proxy scripts/harness-live-advanced.mjs。真实密钥仅由测试代理进程使用,隔离 Harness 只获得本机一次性凭据。交付物不包含测试密钥、测试 profile 或完整服务日志。
指定 deepseek-v4.1-flash 的实际结果见 VALIDATION。少量样本不代表总体规划成功率;测试观察到首个 DSL 无效、模型读取反馈后修复的情况,报告保留这一限制。
npm run benchmark
benchmark 测量有界文档验证、本地更新和 React 服务端渲染,结果不是浏览器帧率或生产 SLA。
配置与安全
enabledPlanning 默认 true;maxDocumentBytes 范围 1,024–262,144。动作默认超时60秒,入队有效期1小时,全局最多2,048条、每Session128条。流默认最多256个generation、每个256个checkpoint,另受累计字节限制。管理员 patch 可在 Schema 范围内调整。
执行前边界包括组件白名单、严格属性、表达式 AST、状态值域、Markdown 禁用外部资源、双端校验,以及主体/Session/参数来源/工具权限校验。按钮只能引用声明的 action ID;模型不能提交工具名、主体或“已确认”标志。详见 SECURITY。
完整文档:
许可
项目源码采用 MIT License。DeepSeek Harness 和依赖保留各自许可;lockfile 固定版本,浏览器构建包含的第三方许可见 THIRD_PARTY_NOTICES.txt。