三部分:(1) 模型向工具 API(15 个
kimi_webbridge_*);(2) 部署配置 API 与插件模块导出;(3) WebBridge 守护进程 HTTP API(插件背后的协议)。 参数名与守护进程 action 参数一一对应;输出 schema 与实测响应信封逐键对齐(dsh v0.1.0-rc.6 + Windows 守护进程实测)。
通用行为:
- 请求体固定携带
session(来自配置,全任务稳定)。 - 错误:守护进程不可达 → 附带
kimi_webbridge_start_daemon提示;ok:false→ 透传 daemonerror.message。 - 取消:
exec.signal中止请求;超时由requestTimeoutMs控制。 - 渲染:
render返回[{type:'text', text:<紧凑 JSON>}],超过maxRenderText截断。
打开 URL。任务的第一次调用设置 group_title(用户语言的短标签)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
url |
string | ✓ | 完整 URL |
newTab |
boolean | true=新标签;省略=当前标签跳转 | |
group_title |
string | 分组人类标签,仅首次设置 |
输出:{success:boolean, url:string, tabId:integer}(additionalProperties:false)
按完整 URL 重新选中本会话标签;active:true 借用用户正在看的标签。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
url |
string | ✓ | 完整 URL(取自 navigate 结果或 list_tabs) |
active |
boolean | true=使用用户当前查看的标签 |
输出:{success:boolean, url?, tabId?, borrowed?}(开放对象)
列出本会话标签。无参数。
输出:{success:boolean, tabs:<json>(tabs 形如 [{tabId,url,title,active,groupTitle}])
读取当前标签无障碍树(页面内容的主要读取方式)。无参数。
输出:{url:string, title:string, tree:<json>(tree 节点含 role/name/ref/children,交互元素带 @e 引用)
点击元素(合成 el.click())。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
selector |
string | ✓ | @e 引用(首选)或 CSS 选择器 |
输出:{success:boolean, tag?, text?}(开放对象)
清空并插入文本;input/textarea 与 contenteditable 富文本均有效。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
selector |
string | ✓ | @e 引用或 CSS 选择器 |
value |
string | ✓ | 插入文本(替换现有内容) |
输出:{success:boolean, tag?, mode?}(mode ∈ value|contenteditable,开放对象)
在页面执行 JS(支持 async/await)。
实现注:守护进程对
undefined结果省略value键,本工具在 execute 层归一化为value ?? null、type ?? 'undefined'(见docs/solutions.md#7)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
code |
string | ✓ | JavaScript 代码 |
输出:{type:string, value:<json>}(additionalProperties:false)
原始 chrome.debugger 透传(高级逃生舱)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
method |
string | ✓ | CDP 方法(如 Page.getLayoutMetrics) |
params |
json | CDP 参数 |
输出:<json>(原始 CDP 结果;扩展不支持的方法会透传 daemon 错误)
截图(视口或指定元素)。守护进程写盘并返回文件路径(用文件工具读取)。
实现注:
retryOnTimeout:true—— 新标签后首次截图可能因页面未稳定卡住,超时后自动重试 1 次(重试通常秒回)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
format |
string | png(默认) | jpeg |
|
quality |
integer | JPEG 质量 0–100 | |
selector |
string | @e 或 CSS,仅截取该元素 |
|
path |
string | 自定义输出路径(唯一名;已存在则覆盖) |
输出:{format:string, path:string, sizeBytes:integer, mimeType:string}(additionalProperties:false)
网络抓包:start / stop / list / detail。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
cmd |
string | ✓ | enum start|stop|list|detail |
filter |
string | URL 子串过滤(list) | |
requestId |
string | 请求 id(detail) |
输出:<json>(list 形如 {count, requests})
向 <input type=file> 设置文件。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
selector |
string | ✓ | @e 或 CSS 选择器 |
files |
array[string] | ✓ | 文件绝对路径列表 |
输出:{success:boolean, fileCount?, …}(开放对象)
把当前页面渲染为 PDF(守护进程写盘返回路径)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
paper_format |
string | enum letter|a4|legal|a3|tabloid |
|
landscape |
boolean | 横向(默认 false) | |
scale |
number | 0.1–2.0(默认 1.0) | |
print_background |
boolean | 保留背景色(默认 true) | |
path |
string | 自定义输出路径(唯一名) |
输出:{path:string, sizeBytes?, mimeType?, pageTitle?}(开放对象)
实现注:同 screenshot,
retryOnTimeout:true。
关闭当前标签。无参数。
输出:{success:boolean, closed?}(开放对象)
关闭整个标签分组(仅当用户明确要求)。无参数。
输出:{success:boolean, closed:integer}(additionalProperties:false)
启动本地守护进程(安全,已运行时为空操作)。startDaemonTool:false 时不注册。
实现注:spawn 二进制(
detached+unref,绝不执行 stop/restart/uninstall)→ 20 s 轮询就绪。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| (无) |
输出:{started:boolean, daemonBin:string, baseUrl:string, error?}(开放对象)
| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
baseUrl |
string | http://127.0.0.1:10086 |
守护进程端点(http/https) |
session |
string | dsh |
WebBridge 分组名,非空 |
requestTimeoutMs |
number | 120000 |
单请求超时,正数 |
startDaemonTool |
boolean | true |
是否注册 start_daemon 工具 |
daemonBin |
string|null | null |
覆盖守护进程二进制路径 |
maxRenderText |
number | 50000 |
渲染文本上限,正数 |
非法配置:加载时抛错并列出全部违规项(kimi-webbridge: invalid config: …)。
| 导出 | 值 | 说明 |
|---|---|---|
name |
kimi-webbridge |
插件标识(kebab) |
inject |
['tools'] |
等待工具服务就绪 |
apply(ctx, config) |
function | 校验配置 → 注册 15(或 14)个工具 |
| 函数 | 签名要点 | 职责 |
|---|---|---|
normalizeConfig(config) |
→ cfg | 默认合并 + 逐键校验 |
daemonBinPath(cfg) |
→ 路径 | 平台化二进制路径 |
withAbort(signal, ms) |
→ {signal, timedOut, cleanup} |
取消+超时合成 |
requestDaemon(cfg, action, args, exec) |
→ data | 单次请求 + 信封解析 + 错误分类(kind: 'timeout') |
callDaemon(cfg, action, args, exec, {retryOnTimeout}) |
→ data | 超时重试包装 |
cleanArgs(args) |
→ args | 剔除 undefined |
renderJson(value, maxText) |
→ ContentBlock[] | 紧凑 JSON 渲染 |
obj / req / opt |
→ schema 节点 | schema 助手 |
POST http://127.0.0.1:10086/command
Content-Type: application/json
体:{"action":"<action>","args":{...},"session":"<分组名>"}
响应信封(实测):
- 成功:
{"ok":true,"data":{…}} - 失败:
{"ok":false,"error":{"code":"<code>","message":"<message>"}}
已实测的 action 与 data 形状:
| action | 实测 data | 备注 |
|---|---|---|
| navigate | {success, url, tabId} |
group_title 首次设置分组标签 |
| find_tab | {success, url, tabId, borrowed} |
按完整 URL |
| list_tabs | {success, tabs:[{tabId,url,title,active,groupTitle}]} |
|
| snapshot | {url, title, tree} |
tree 含 @e ref |
| click | {success, tag, text} |
合成事件 |
| fill | {mode, success, tag} |
mode=value/contenteditable;中文等非 ASCII 正常 |
| evaluate | {type, value} |
undefined 时省略 value |
| cdp | 原始 CDP 结果 | 不支持的域返回 extension_error 透传 |
| screenshot | {format, path, sizeBytes, mimeType} |
写盘返回路径 |
| network | start/stop: {success, message};list: {count, requests} |
|
| upload | {success, selector, fileCount, files} |
files=绝对路径数组 |
| save_as_pdf | {path, sizeBytes, mimeType, pageTitle} |
|
| close_tab | {success, closed} |
|
| close_session | {success, closed} |
closed=关闭数 |
其他端点:GET /status(200);/mcp、/sse、/health 均 404(无 MCP 端点,故不适用 @deepseek-ai/dsh-mcp-client)。
约束(官方行为,插件已内建到工具描述):
- 新标签后的首次 screenshot/save_as_pdf 可能等待页面稳定(卡顿数秒至数十秒),重试即秒回;
- 严格校验
event.isTrusted的站点会忽略 click/fill; - 跨源 iframe 内的元素不在顶层框架操作范围内。
- dsh:v0.1.0-rc.6 实测通过(
@deepseek-ai/dsh-tools同版)。 - WebBridge:守护进程当前安装版实测;"Please update the Kimi WebBridge extension" 报错 = 扩展版本过旧。
- Node ≥ 18(全局 fetch);开发环境 Node 24 实测。