面向把企业 Web 页面装进 QwenWork 桌面客户端的开发团队:一张图看懂整体架构与两种承载形态,其余篇幅全部给 JSAPI。
面向把企业 Web 页面装进 QwenWork 桌面客户端的开发团队:一张图看懂整体架构与两种承载形态,其余篇幅全部给 JSAPI。
本文版本 1.30.0 · 更新日期 2026-09-20 ·
客户端提供两种模式把企业页面装进来,JSAPI 完全一致(同名同参同事件,
内嵌应用(WebView)· 侧边栏入口
iframe · 技能广场 / 专家套件「企业专属」市场页
按域分类,每个方法给调用示例与返回说明。WebView 用
方法名与参数两形态完全相同。WebView 由宿主直接注入
iframe · postMessage 完整封装(可直接抄)
app.* 查内嵌应用自身信息与宿主桥能力;auth.* 取登录态与企业后端调用凭据。以下逐个方法说明用途与返回。
app.getInfo · 获取当前内嵌应用的基本信息
返回后台配置的应用 ID、展示名、路由标识与本次发布版本号,页面据此确认「自己是哪个应用、哪个版本」。
app.ping · 桥连通性探活
轻量活体检查、立即返回,供页面初始化时判断桥是否可用。
app.getEnv · 读取后台下发的环境变量
读取后台自定义链接里为本应用配置的环境变量(如租户 ID),见 1.2 高级选项;未配置时返回空对象。
app.getCapabilities · 查询桥支持的能力清单
返回桥版本、可调用方法列表、可订阅事件列表与错误协议,供页面做能力检测与降级。
auth.getLoginState · 获取登录态与当前用户信息
判断用户是否已登录并取用户基本信息;未登录时
auth.getToken · 获取调企业后端的令牌
返回 Bearer token 与过期时间,页面调自己企业后端时放入
auth.logout · 退出当前账号登录
通知宿主发起登出流程;接口先返回、宿主随后登出。
这几个是 WebView 侧的扁平兼容名;iframe 形态没有它们,外链请走
1 · 整体架构与接入

1.1 两种承载形态
客户端提供两种模式把企业页面装进来,JSAPI 完全一致(同名同参同事件,bridgeVersion: 1.0.0),只是「挂在哪、承载什么、怎么承载」不同:
| 模式 | 挂在哪 | 承载什么 | 怎么承载 |
|---|---|---|---|
| 内嵌应用(WebView) | 侧边栏入口(后台自定义链接选「在 QwenWork 内打开」) | 企业自己的业务系统页(知识库、OA、工单等) | preload 注入 window.qwBridge;常驻,切走只隐藏 |
| iframe(企业市场页) | 技能广场、专家套件(及连接器)的「企业专属」市场页 | 企业自己的私有市场/广场页(技能、套件、连接器目录) | postMessage + 自写 callBridge;激活 tab 才挂载,切走即卸载 |


1.2 后台配置
- 路径:个性化配置 → 导航配置 → 自定义链接,打开方式选「在 QwenWork 内打开」即有桥;
- 高级选项(可选):路由标识
route(deeplink 用)、离线包 zip、环境变量envVars; - 保存节点后必须在导航配置页发布才下发到客户端。
2 · JSAPI
按域分类,每个方法给调用示例与返回说明。WebView 用 window.qwBridge,iframe 用自写的 callBridge,方法名与参数完全相同。
2.1 两种调用方式
方法名与参数两形态完全相同。WebView 由宿主直接注入 window.qwBridge;iframe 宿主不注入任何脚本,页面用 postMessage 自己封一个 callBridge(下方给完整可抄实现)。
WebView · 宿主注入 window.qwBridge
- 首屏即可调用,无需握手;推荐
invokeSafe拿结构化错误信封。 - 宿主事件两形态同名:
skills:changed/connectors:changed/expertKits:changed/connector.statusChanged/connector.toolsChanged/page.themeChanged/page.languageChanged,异步任务另有<方法>:progress/:complete(带requestId)。 - WebView 宿主不设超时(页面自加);iframe 默认 10s。
2.2 app.* / auth.*(应用与登录态)
app.* 查内嵌应用自身信息与宿主桥能力;auth.* 取登录态与企业后端调用凭据。以下逐个方法说明用途与返回。
app.getInfo · 获取当前内嵌应用的基本信息
返回后台配置的应用 ID、展示名、路由标识与本次发布版本号,页面据此确认「自己是哪个应用、哪个版本」。
user 为 null,页面可自行引导登录。
Authorization 头;按 expiresIn 到期重取,不要长期缓存。
user.id 是跨系统唯一标识;登录态与 token 都不要长期缓存,token 禁止写日志/URL/localStorage。
2.3 host.* / agentRuntime.*(环境与设备)
getEnvironment 是轻量判定(调不通即普通浏览器);getClientInfo 设备字段采集失败回落空字符串,有 60s 缓存;路径检测只收绝对路径,相对/~ 报 INVALID_PARAMS。
2.4 page.*(页面与跳转)
toIndex 的 skillName/pluginName 二选一(本地目录名),未安装报 SKILL_NOT_FOUND/EXPERT_KIT_NOT_FOUND;close 不传 name 即关自己。
2.5 skill.*(技能)
skillId/name 都是本地目录名;upload.start/aoneKitInstall/update/installFromZip 是异步任务(:progress/:complete);accessPolicy 只读不拦,按钮显隐是页面自己的事。
2.6 connector.*(连接器 / MCP)
displayName/description 列表返回是多语言对象,页面按 page.getLanguage 索引并自行回落;启停统一用 setEnabled;内置连接器(source:"builtin")只读,配置与授权走 connector.open 宿主弹窗。
2.7 expertKit.* / storage.* / enterprise.*(套件 / 存储 / 企业票据)
2.8 兼容扁平方法(仅 WebView)
page.openUrl。addToChat 的 file 由宿主下载成附件,folder 配 mcp 时做成远程引用 chip 交给指定 MCP 工具。