第三方应用
硬件接入与积分兑换
接入介绍
平台概述
WorkBuddy 开放平台基于 OAuth 2.1 规范 来进行用户身份验证和获取用户授权,同时面向开发者及生态合作伙伴提供了一套基于 HTTPS 协议的 Open API,第三方应用可以在取得用户授权的条件下通过 Open API 进行用户数据操作。
为了保护用户数据的安全和隐私,第三方应用访问用户数据前需要显式地向用户征求授权。用户授权后,平台将遵循 OAuth 规范派发第三方票据,第三方应用可以获取第三方票据并与平台进行所需要的操作。
核心能力
| 能力域 | 说明 |
|---|---|
| 本地助理对话 | 通过 API 与 PC 端本地助理进行消息交互 |
| 云端任务管理 | 创建并管理云端 AI 任务,支持移动端/应用会话 |
| 产物管理 | 会话产物的拉取、增量更新与媒体文件下载 |
| 兑换码核销 | 通过卡券或兑换码为用户兑换WorkBuddy积分(credits) |
应用类型
开放平台当前支持三类第三方应用,面向不同接入场景:
| 应用类型 | 说明 | 可申请权限 |
|---|---|---|
| 硬件接入 | 面向硬件设备厂商与合作伙伴开放 API 能力。硬件设备(如智能眼镜、车机等)通过开放平台接入 WorkBuddy,取得用户授权后可调用本地助理对话、云端任务、会话产物等 Open API | 全部权限(按业务需要申请) |
| Buddy 应用 | 面向行业伙伴开放垂直行业 AI Harness 能力。伙伴将行业 know-how 封装进 WorkBuddy,取得用户授权后可调用 Open API,为用户提供开箱即用的行业 AI Harness | 部分权限(按业务需要申请) |
| 积分应用 | 面向开发者和合作伙伴开放积分权益 API 能力。应用取得用户授权后,可通过卡券或兑换码为用户兑换 WorkBuddy 积分(credits),适用于积分发放等场景 | 部分权限(如积分与权益类) |
术语定义
| 角色 | 说明 | 信任边界 |
|---|---|---|
| Resource Owner | 资源拥有者,通常是 WorkBuddy 用户 | 决定第三方应用或连接器可访问的资源范围 |
| Third Application | 常规第三方应用,开发者基于 WorkBuddy 开放平台开发 | 用户授权后可调用 Open API |
| WorkBuddy | 代表用户执行任务、发起工具调用的智能体运行环境 | 调用前应换取短生命周期凭据 |
| Open Platform | 开放平台,负责应用注册、授权确认、令牌签发、Scope 管理和审计 | 平台级可信边界,所有开放调用的权限源头 |
接入指南
接入流程概览
步骤一:创建应用并完成配置
在 WorkBuddy 开放平台一次性填写应用基本信息、权限管理信息和回调地址配置,完成全部应用配置后提交审核。
步骤二:从用户授权到调用接口
应用引导用户完成 OAuth 2.1 授权,服务端换取访问凭证后即可调用 Open API。整体过程可以分为三个连续阶段:
- 首先由三方应用发起用户授权
2. 用户完成授权后,由应用服务端换取访问凭证 3. 应用使用访问凭证调用所需的 Open API
授权请求的具体说明请参考「认证授权 API:请求用户授权」,访问凭证的获取与刷新请参考「认证授权 API:换取接口调用凭证」,具体业务接口的参数、权限和响应结构请参考「Open API 接口」。以下时序图展示从用户授权到接口调用的完整过程。
应用注册与授权认证
硬件接入
硬件接入面向硬件设备厂商与合作伙伴开放。硬件设备(如智能眼镜、车机等)在开放平台创建硬件接入应用后,引导用户完成 OAuth 2.1 授权,即可通过 Open API 使用本地助理对话、云端任务管理、会话产物等能力,将 WorkBuddy 的智能体能力延伸至硬件终端。
新建硬件接入应用时一次性完成应用基本信息、权限管理信息和回调地址配置,提交后进入审核流程。审核通过后,应用发布并启用相应能力。
应用基本配置
- 登录 WorkBuddy 开放平台
- 点击「硬件接入」
- 填写基本信息
- 配置权限管理信息
- 配置 OAuth 回调地址
- 提交审核
积分应用
积分应用面向开发者和合作伙伴开放积分权益兑换能力。应用取得用户授权后,可通过 Open API 使用卡券或兑换码为用户兑换 WorkBuddy 积分(credits),适用于积分发放等场景。
新建积分应用时一次性完成应用基本信息、权限管理信息和回调地址配置,提交后进入审核流程。审核通过后,应用发布并启用相应能力。
应用基本配置
- 登录 WorkBuddy 开放平台
- 点击「其他 > 积分兑换」
- 填写基本信息
- 配置权限管理信息(仅开放积分与权益类 Scope)
- 配置 OAuth 回调地址
- 提交审核
应用说明
| 状态 | 说明 |
|---|---|
| 审核中 | 应用配置已提交,等待平台审核 |
| 已启用 | 应用审核通过并发布,可以调用已授权的 Open API |
| 已驳回 | 应用审核未通过,需要根据审核反馈修改配置后重新提交 |
应用凭据说明:应用创建后进入审核状态,平台生成 client_id 和 client_secret。client_secret 仅在应用创建成功后明文展示一次,请妥善保管 client_secret,不要在前端或客户端代码中暴露。如有遗失,请联系平台处理。
授权认证
应用审核通过并启用后,需引导用户完成 OAuth 2.1 授权以获取 access_token。授权流程涉及两类接口,完整 API 文档见「Open API 接口」:
- 「认证授权 API」— GET /authorize(请求用户授权)、POST /token(换取/刷新 Token)
Token 类型一览
| Token 类型 | 用途 | 有效期 | 备注 |
|---|---|---|---|
| access_token | 调用 Open API 的凭证 | 24 小时 | 通过「换取访问凭证」获取;过期后需重新获取。 |
| refresh_token | 刷新 access_token | 60 天 | 通过「换取访问凭证」获取;需安全存储在服务端,不得暴露在前端或客户端代码中。 |
权限配置列表及关联 API
Scope 权限列表
| 分类 | Scope | 权限名称 | 描述 |
|---|---|---|---|
| 用户资料 | user.profile.readable | 读取个人资料 | 读取用户的昵称和头像 |
| 用户资料 | user.contact.readable | 验证联系方式 | 校验调用方提供的手机号是否与用户的手机号一致 |
| 积分与权益 | user.credit.exchange | 卡券兑换积分 | 使用卡券或兑换码为用户兑换WorkBuddy积分 |
| 云端任务 | user.task.invokable | 创建并执行云端任务 | 允许应用按照用户的指令创建并执行云端任务 |
| 云端任务 | user.task.readable | 读取任务列表与详情 | 允许应用读取用户的云端任务列表及任务详情 |
| 本地助理 | user.localassistant.invokable | 向本地助理发送消息 | 向本地助理(用户 PC 端)发送消息,驱动用户本机 Agent 执行任务 |
| 本地助理 | user.localassistant.readable | 读取本地助理在线状态与消息历史 | 读取本地助理(用户 PC 端)的在线状态与会话消息历史 |
权限申请指南
申请步骤
- 在应用管理页面选择需要申请的 Scope
- 说明使用场景和必要性
- 提交审核
最小权限原则:仅申请应用功能所需的 Scope;用户授权时仅请求当前操作所需的 Scope;避免申请超出业务需求的权限。
分享能力接入
功能介绍
WorkBuddy 分享是指第三方应用通过接入该能力,让用户可以从自己的应用把文本、图片、音频、文件、资源链接等内容一键分享到 WorkBuddy。
WorkBuddy 分享功能已向通过企业认证的开发者开放。开发者在 WorkBuddy 开放平台创建分享应用(按「基础配置 → 应用平台信息」两步填写),提交审核后即生成应用 ID,审核通过后生成密钥,即可获得分享接入权限。
WorkBuddy 分享当前支持 PC 端接入(Windows 应用 / macOS 应用);移动端(Android / iPhone / 鸿蒙应用)后续开放。
接入前准备
接入分享能力前,需在 WorkBuddy 开放平台 创建分享应用、通过审核并生成密钥。请确认用户使用的 WorkBuddy 客户端为 5.8.0 及以上版本,更低版本无法唤起分享。移动端(Android / iPhone / 鸿蒙)接入方式与分享 SDK 后续开放。
进入开放平台「第三方接入 → 分享功能接入」,点击「创建应用」,按 基础配置 → 应用平台信息 两步填写,支持随时「存草稿」。提交审核后立即生成应用 ID 并进入审核(7 个工作日内);审核通过后到应用详情生成密钥,即可按《PC 端开发手册》接入。
第一步:基础配置
| 字段 | 必填 | 填写说明 |
|---|---|---|
| 应用名称 | 是 | 全平台唯一,重名时无法提交。如实填写产品名称,与应用官网介绍一致;不可使用「Demo」「test」「测试」等字样,禁止夸大、误导或侵权 |
| 应用 logo | 是 | 不小于 96×96px,不大于 100KB,支持 JPG/PNG。使用产品真实图标,不得使用未授权的第三方素材 |
| 应用简介 | 是 | 说明应用提供的服务与功能,将用于审核核验应用真实性,须与应用实际功能一致 |
| 应用官网 | 是 | 须可正常访问(登录页不算),页面需包含应用介绍、服务功能详情、用户协议、版权信息与网站备案信息;网站备案主体与开放平台认证主体一致时优先通过,不一致时请在申请说明中说明关系 |
| 申请说明 | 否 | 需要向审核人员说明的情况(如官网需登录查看的账号、主体关系说明)可在此描述 |
第二步:应用平台信息
先勾选应用的接入端(Windows 应用 / macOS 应用),至少一个;勾中的端各展开一张信息卡。
Windows 应用
| 字段 | 必填 | 填写说明与获取方式 |
|---|---|---|
| Windows 应用标识 | 是 | 填产品主程序的可执行文件名称(如 wemeet.exe)或产品名称。Windows 没有包名概念,请勿填写反域名格式 |
| 代码签名主体 | 是 | 即签名证书的 Subject。获取:右键 .exe → 属性 → 数字签名 → 选中签名 → 详细信息 → 查看证书 → 「主题」 |
| 代码签名证书指纹 | 是 | 即证书 Thumbprint,40 位十六进制。获取:同上路径查看「指纹」。证书属性中的指纹每两位之间有空格,填写时去掉空格 |
| 应用已上架 | 是 | 是 / 否。选「是」需提供该应用的下载链接(Microsoft 商店或官网) |
| 开发方式 | 固定 | deeplink 接入 |
一次取出主体与指纹(PowerShell,把路径换成你的 exe 路径):
$sig = Get-AuthenticodeSignature "C:\Path\To\App.exe"
$sig.SignerCertificate.Subject # 例:CN="XXX Technology Co., Ltd.", O="XXX Technology Co., Ltd.", C=CN
$sig.SignerCertificate.Thumbprint # 例:A1B2C3D4E5F6…(40 位十六进制)
应用须使用代码签名证书签名后发布(OV / EV 证书需企业实名申请),自签名或未签名的应用无法通过审核。
macOS 应用
| 字段 | 必填 | 填写说明与获取方式 |
|---|---|---|
| Bundle ID | 是 | 你 macOS 应用的唯一标识。获取:Xcode 工程 General → Identity → Bundle Identifier |
| Team ID | 是 | Apple 分配给开发者团队的 10 位标识。获取:登录 developer.apple.com → Account → Membership details 页查看 |
| 应用已上架 | 是 | 是 / 否。选「是」需提供下载链接(Mac App Store 或官网) |
| 开发方式 | 固定 | deeplink 接入 |
一次取出 Bundle ID 与 Team ID(终端,把路径换成你的 .app 路径):
defaults read /Applications/你的应用.app/Contents/Info.plist CFBundleIdentifier # 例:com.example.app
codesign -dv --verbose=4 /Applications/你的应用.app 2>&1 | grep TeamIdentifier # 例:TeamIdentifier=AB12CD34EF
Team ID 取自 Apple Developer Program 会员资格页,同一团队下所有应用共用;查看不到时确认该账号已加入开发者计划。
字段用途:桌面端唤起时不校验发起方的应用签名,Windows 代码签名主体与指纹、macOS Team ID 用于登记、唯一性校验与审核核验;填错不会导致唤起失败,但会在审核阶段被驳回。
提交与审核
两步填写完整后点击「提交审核」。
| 项 | 说明 |
|---|---|
| 提交 | 必填项缺失时提交按钮不可用 |
| 应用 ID | 提交后立即生成,应用状态为「审核中」;此时可查看应用 ID,但还不能生成密钥 |
| 审核 | 7 个工作日内完成;审核期间可「撤回申请」回到编辑态 |
| 结果通知 | 审核结果经开放平台通知中心、WorkBuddy 端内消息中心、开发者邮箱三渠道通知;驳回含原因,可修改后重新提交,应用 ID 不变 |
| 通过后 | 应用状态变为「已开通」,到应用详情「安全配置」生成密钥后按《PC 端开发手册》集成分享能力。基础信息提交后固化,如需变更由平台处理;后续可随时「新增端」 |
生成密钥
密钥在应用审核通过后生成,创建应用阶段不提交密钥。
| 项 | 说明 |
|---|---|
| 生成入口 | 应用详情点击「随机生成密钥对」;仅主体超管可操作 |
| 生成方式 | 在浏览器本地生成非对称密钥对(RSA-2048,私钥为 PKCS#8 PEM 格式,签名算法 RSAwithSHA256、PSS 填充),私钥不经过平台服务端 |
| 密钥标识 | 生成后展示该密钥对的标识 kid,调用分享能力时需随签名参数传入;WorkBuddy 按 kid 取对应公钥验签 |
| 生效 | 生成即生效,无需保存;该公钥立即参与验签 |
| 私钥保管 | 生成后弹窗展示公钥与私钥,私钥支持一键复制,并提示「私钥仅本次展示,关闭后不再显示,请立即复制保存」。关闭弹窗后不再展示私钥,平台不保存你的私钥,丢失需重新生成一对。私钥请保存在你的服务端,不要放入网页、桌面应用或移动应用安装包 |
| 数量 | 同时有效的密钥最多 10 对;达到上限时先删除不再使用的密钥再生成 |
| 多对并存 | 多对可同时有效,每对有独立的 kid;WorkBuddy 按调用时传入的 kid 取对应公钥验签,可平滑轮换:先生成新的、把签名切到新 kid 后再删除旧的 |
| 删除 | 可删除不再使用的密钥,删除即时生效,该公钥不再参与验签;删除后该 kid 失效,仍用旧 kid 签名的调用将验签失败 |
| 公钥 | 密钥列表逐对展示 kid、公钥指纹、生成时间与最近使用时间,公钥可随时复制;私钥仅在生成弹窗中出现一次 |
标识冲突与申诉
| 校验项 | 规则 |
|---|---|
| 应用名称 | 全平台唯一,重名时输入框下方提示「该应用名称已被占用,请更换」 |
| 各端应用标识与签名信息 | 同一端下全平台唯一、只能归属一个主体;冲突时拦截并提示可申诉 |
申诉:标识或名称确为你所有(如换绑、多账号误占),请发送邮件至 openworkbuddy@tencent.com 提交申诉,邮件中说明被占用的应用名称或标识、你的开发者主体名称,并附上能证明归属的材料(软件著作权证书、应用市场后台截图等)。平台核实认证主体后处理归属。
使用 WorkBuddy 品牌标识
接入分享能力后,你需要在自己应用内唤起分享的入口展示 WorkBuddy 标识(分享面板的分享目标项、设置页的接入标识位),让用户看清内容将发往哪里。标识须遵守 WorkBuddy 品牌设计指南:WorkBuddy 品牌中心(进入后切换至 WorkBuddy 品牌查看,徽标素材在页面「徽标」处下载)。
| 类别 | 规则 |
|---|---|
| 使用范围 | 仅在与 WorkBuddy 分享能力直接相关的入口使用,不得用于你的应用图标、开屏、广告投放与对外宣传物料 |
| 素材 | 使用品牌中心下载的官方徽标包,或 SDK 提供的标准素材;按原样使用,可等比缩放,不得拉伸、压扁、裁剪、旋转或添加阴影与特效 |
| 净空与背景 | 保留规定的净空区域;浅色底使用标准横版锁定或符号,深色底字标转白但符号保持品牌主色,不得在杂乱背景上使用 |
| 配色 | 不得改动徽标与符号的既定配色,不使用未经批准的配色 |
| 视觉层级 | WorkBuddy 标识的视觉显著性不得高于你自己的品牌 |
| 文案 | 统一写作 WorkBuddy(驼峰式),不得写成 WORK BUDDY、Work Buddy 或 codebuddy;描述使用「分享到 WorkBuddy」「基于 WorkBuddy」,不使用「官方」「授权」「合作伙伴」等表述 |
| 关系表述 | 展示 WorkBuddy 标识仅表示你已接入分享能力,不代表获得 WorkBuddy 官方背书或推荐 |
平台会在应用审核与线上巡查中核验标识使用情况;未按规范使用时,平台可要求整改并暂停分享能力。
常见问题
| 问题 | 说明 |
|---|---|
| 证书指纹填了提示格式错误 | 证书属性中的指纹每两位之间有空格,去掉空格后再填,共 40 位十六进制字符 |
| 取不到签名主体或指纹 | 确认 exe 已使用代码签名证书签名:右键属性中无「数字签名」页签即为未签名,未签名应用无法接入 |
| 找不到 Team ID | 登录 developer.apple.com → Account → Membership details 查看;需该账号已加入 Apple Developer Program |
| 同一公司多个产品共用一张签名证书 | 可以接入,各产品分别创建应用、填写各自的应用标识即可 |
| 应用尚未上架任何市场 | 可以接入,「应用已上架」选「否」;上架后可在应用详情中补充链接 |
| 没有代码签名证书 | Windows 端暂无法接入,请申请 OV / EV 代码签名证书后提交 |
| 私钥丢失 | 在应用详情「安全配置」重新生成一对密钥即可,生成即生效;确认不再使用的旧密钥可删除 |
完成以上准备后,按《PC 端开发手册》接入分享能力。
PC端开发手册
适用版本: WorkBuddy 5.8.0 及以上。
能力概览
第三方应用构造分享消息,使用应用私钥生成签名包,再通过 PC 端 HTTPS 中间页或移动端 SDK 交给 WorkBuddy。WorkBuddy 校验请求后将内容预填到任务输入区;用户可以检查、编辑并发送。唤起成功或内容预填成功,不等于用户已提交任务。
当前分享场景值统一为 newTask。若 WorkBuddy 新建任务输入框中已有内容,分享内容将会覆盖当前任务输入区;否则创建新任务并填充到任务输入区。newTask 是协议场景名称,不表示每次分享都强制创建全新的任务。
当前消息负载使用 TaskPayload,其内容块可以承载文本、图片、音频、文件资源和资源链接。各端对本地资源和内嵌数据的支持存在差异,详见下文。
快速开始:分享一条文本消息
以下示例使用 Node.js 内置模块,在服务端签名并生成 PC 端 HTTPS 中间页链接。你需要先在开放平台获得真实的 appId、kid 和对应私钥。将私钥保存为服务端的 private-key.pem,保留 PEM 头尾与换行;不要将此文件提交到代码仓库。
将以下代码保存为 sign.cjs:
const fs = require('node:fs');
const crypto = require('node:crypto');
const b64 = value => Buffer.from(value, 'utf8').toString('base64');
const appId = process.env.APP_ID;
const kid = process.env.KEY_ID;
if (!appId || !kid) throw new Error('缺少 APP_ID 或 KEY_ID');
const messageObject = {
title: '分析仓库',
description: '请总结仓库结构',
payload: {
action: 'start',
promptContentBlocks: [{ type: 'text', text: '分析这个仓库' }]
}
};
const messageJson = JSON.stringify(messageObject);
if (Buffer.byteLength(messageJson, 'utf8') > 16384) {
throw new Error('原始消息 JSON 超过 16 KiB');
}
const packet = {
appId,
kid,
message: b64(messageJson),
nonce: crypto.randomBytes(16).toString('hex'),
scene: 'newTask',
timestamp: String(Math.floor(Date.now() / 1000))
};
const signingText = [
`appId=${b64(packet.appId)}`,
`kid=${b64(packet.kid)}`,
`message=${packet.message}`,
`nonce=${b64(packet.nonce)}`,
`scene=${b64(packet.scene)}`,
`timestamp=${b64(packet.timestamp)}`
].join('&');
packet.sig = crypto.sign('sha256', Buffer.from(signingText, 'utf8'), {
key: fs.readFileSync('./private-key.pem', 'utf8'),
padding: crypto.constants.RSA_PKCS1_PADDING
}).toString('base64');
const query = new URLSearchParams(packet).toString();
console.log(`https://workbuddy.cn/app/open-deeplink?${query}`);
在保存私钥的服务端目录运行(将值替换为你的实际应用信息):
APP_ID='你的应用标识' KEY_ID='对应的密钥标识' node sign.cjs
使用输出的 HTTPS 中间页链接,确认可以唤起 WorkBuddy,消息在输入区完成预填,然后由用户编辑并发送。请在用户发起分享时生成签名包;不要提前生成并长期复用链接。
PC 端完整链接
PC 端对外提供 HTTPS 中间页:https://workbuddy.cn/app/open-deeplink。第三方应用在系统浏览器打开带参数的链接,由用户确认后唤起 WorkBuddy;未安装客户端时可引导安装。
链接使用 appId、kid、message、nonce、scene、timestamp、sig 七个查询参数。用 URLSearchParams 对传输参数进行 URL 编码,不要手动拼接 Base64 中的 +、/、=。
下面展示一条字段和值均完整的格式示例。它由临时 RSA-2048 密钥生成并通过本地验签,但 app_demo、kid_demo 并未在平台登记,且示例时间戳会过期,不可用于真实分享。
HTTPS 中间页:
https://workbuddy.cn/app/open-deeplink?appId=app_demo&kid=kid_demo&message=eyJ0aXRsZSI6IkRlbW8iLCJkZXNjcmlwdGlvbiI6IkRlbW8iLCJwYXlsb2FkIjp7ImFjdGlvbiI6InN0YXJ0IiwicHJvbXB0Q29udGVudEJsb2NrcyI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiSGVsbG8gV29ya0J1ZGR5In1dfX0%3D&nonce=9f2c8b1a6d4e7035c8a912f0b7d6e453&scene=newTask×tamp=1791515336&sig=s%2Bbo02%2BkPMj%2BbJV9iuzAxsIo3oEoPVYLl%2FkgPqQe4J0MTEEqa2kxmSssB%2Bg%2BzhsD1UZrNTlMPLQfUbApszCx05ujCKJ%2Fmn5u3QdoiWsIwl7dejptqHLI9iLIndlVroeliQ7r1mKtZNjLElWH4GNCeQbA2taPZanBcrcTQ5LXPXRRouxmryDPq%2FgbFKH9%2FU5vAoZUFEnKI1NqMs1W2QkEvLhj6kDOz2NmffZK64mHrpMlip6v3hD3ImPECWen1xmJJhetTV4Iy8bsinsio3PG7ccNf9dqYtpevWPlQlQhl09GVvhfNrKjQREkJG5Y6SkA3pIoB8vbNdLSH09D1UgV2Q%3D%3D
上述 message 经 URL 解码,再按标准 Base64 解码,其 UTF-8 JSON 为:
{"title":"Demo","description":"Demo","payload":{"action":"start","promptContentBlocks":[{"type":"text","text":"Hello WorkBuddy"}]}}
这里的 %3D、%2B、%2F 分别是 Base64 字符 =、+、/ 的 URL 编码结果。用于签名的是URL 编码前的字段值;用于链接的是签名完成后的传输值。
参数类型与消息结构
传输签名包
下表描述 URL 查询参数或签名包中的传输值。message 在传输时为 string;解码后才是 WorkBuddyMessage 对象。移动端 SDK 的实际入参形式以其正式接口文档为准。
| 参数 | 传输类型 | 格式与含义 |
|---|---|---|
appId | string | 开放平台分配的应用标识 |
kid | string | 与本次签名私钥配套的密钥标识 |
message | string | UTF-8 JSON 的标准 Base64;原始 JSON 最多 16,384 字节 |
nonce | string | 安全随机生成 16 字节后得到的 32 位小写十六进制字符串,仅含 0–9、a–f |
scene | string | 当前固定为 newTask |
timestamp | string | Unix 秒级时间戳的十进制字符串;不是毫秒数 |
sig | string | RS256 签名二进制的标准 Base64;本身不参与签名串 |
前六项参与签名,加上 sig 共七项。无需传验签公钥。
WorkBuddyMessage
| 字段 | 类型 | 说明 |
|---|---|---|
title | string | 分享标题,不超过 50 字 |
description | string | 内容描述,不超过 200 字 |
payload | TaskPayload 对象 | 当前可用的任务负载 |
先序列化整个消息对象,再计算原始 UTF-8 JSON 的字节数。16 KiB 限制针对原始 JSON,不是 URL 长度,也不是 Base64 编码后的字符串长度;如果嵌入多媒体 data,这些字符也计入 JSON 字节数。
TaskPayload
| 字段 | 类型 | 说明 |
|---|---|---|
action | string | 当前支持 start |
promptContentBlocks | ContentBlock[] | 有顺序的内容块数组,可以混排支持的类型 |
connectorIds | string[] | 需要指定连接器时,放在消息负载中的连接器标识列表 |
指定的连接器应已发布,且与分享应用所属主体一致;用户是否已授权仍影响资源读取。
ContentBlock 类型
type值 | 内容类型 | 已知字段及类型 | 端差异 |
|---|---|---|---|
text | 文本 | text: string | 文本内容 |
image | 图片 | data?: string(图片 Base64)、uri?: string、mimeType?: string | 内嵌 data:移动端支持,PC 端不支持 |
audio | 音频 | data?: string(音频 Base64)、uri?: string、mimeType?: string | 内嵌 data:移动端支持,PC 端不支持 |
resource | 文件资源 | data?: string(文件 Base64)、uri?: string、mimeType?: string | 内嵌 data:移动端支持,PC 端不支持 |
resource_link | 资源链接 | name?: string、uri: string、_meta?: object | 需确认链接可访问及必要的连接器授权 |
表中 ? 仅表示不同来源可能不提供该字段,不构成字段组合或必填规则的承诺。资源路径或链接是否能由 WorkBuddy 读取,取决于目标端的访问能力;第三方应用可访问的本地 file:// 路径,不一定能由 WorkBuddy 访问。_meta 可以包含如 og:title、og:image、og:description 的预览信息。字段组合、大小上限和各端完整支持矩阵需要以正式 SDK/协议为准。
文本块示例:
{"type":"text","text":"分析这个仓库"}
资源链接块示例:
{"type":"resource_link","name":"产品文档","uri":"https://example.com/docs","_meta":{"og:title":"产品文档"}}
签名生成:详细步骤
签名算法为 RS256:RSA PKCS#1 v1.5 填充、SHA-256 摘要。使用与 kid 配套的 RSA-2048 私钥(PKCS#8 PEM)生成签名;建议由开发者服务端持有和使用私钥。
- **构造消息对象。**填入
title、description和TaskPayload。例如第 3 节的文本消息。 - **序列化 JSON。**对整个消息对象执行 JSON 序列化,取得确切的 UTF-8 字节序列;原始 JSON 不得超过 16,384 字节。不要在签名与传输之间重新序列化或修改消息,否则字节内容可能变化。
- 生成
message。将第 2 步的 UTF-8 字节做一次标准 Base64,保留+、/及必要的=填充。后续签名时直接使用该值,不再对message二次 Base64。 - **准备其余字段。**读取
appId与kid,设置scene为newTask;使用密码学安全随机数生成器生成 16 字节,转为 32 位小写十六进制nonce;生成本次请求的 Unix 秒级字符串timestamp。 - 分别编码普通字段值。对
appId、kid、nonce、scene、timestamp各自的 UTF-8 字节分别做标准 Base64。此处只编码值,不编码=、&或参数名。 - **拼接待签名串。**按键名的 ASCII 顺序
appId → kid → message → nonce → scene → timestamp拼接,参数名区分大小写,各项间只放一个&,末尾不附加空格或换行:
appId=Base64(appId)&kid=Base64(kid)&message=message&nonce=Base64(nonce)&scene=Base64(scene)×tamp=Base64(timestamp)
- **生成
sig。**对第 6 步签名串的 UTF-8 字节执行 RS256 签名,把签名二进制做标准 Base64。sig不参与自身的签名串拼接。 - **构造传输链接。**把六个原始传输字段值和
sig作为七项查询参数交给URLSearchParams编码。URL 中传输的是原始appId、kid等值,不是签名串里使用的Base64(appId)、Base64(kid)。 - **检查时效与重试。**要求
-30 ≤ 平台当前时间 − timestamp ≤ 300,单位秒。同次分享重试保留原包;发起新分享或包过期后重新生成nonce、timestamp、sig。同一appId + nonce最多允许应用内验签成功 3 次。
调试签名失败时,先比较双方使用的待签名串原文:确认字段顺序、大小写、Base64 填充、message 是否重复编码,以及是否混入换行;再检查 kid 与私钥是否配套。不要将私钥或完整真实分享链接提交到问题工单。
资源与连接器分享
分享图片、音频、文件或链接前,确认目标端支持相应内容形式,并确保 WorkBuddy 能读取所引用的资源。远程资源链接应保持有效;本地文件 URI 只有在目标端具备访问能力时才能使用。对 PC 端,不要依赖将图片、音频或文件以 data 直接嵌入消息的方式。
需要连接器时,在 TaskPayload.connectorIds 中填写应用主体已发布的连接器。若用户未授权、资源无法访问或内容未通过审查,分享可能无法完成预填;允许用户调整内容后重新发起分享。
错误处理与上线检查
| 现象 | 优先检查 | 建议处理 |
|---|---|---|
| 无法唤起客户端 | WorkBuddy 是否安装且为 5.8.0 及以上;HTTPS 中间页链接及其参数是否正确 | 检查中间页能否正常打开,确认客户端已安装并更新 |
| 应用不可用 | 应用是否已审核、启用 | 在开放平台检查应用状态 |
| 接入端不可用或身份不符 | PC 端登记信息、包名、Bundle ID 和签名信息 | 补齐接入端登记,核对测试与正式构建 |
| 验签失败 | kid 与私钥是否配套;字段顺序;Base64 与 URL 编码;是否使用 timestamp | 对照第 7 节逐步重建签名串 |
| 请求过期或重复 | 服务端时钟、秒/毫秒单位、nonce 是否为新分享重新生成 | 同步时钟,并按重试规则重新签名 |
| 资源或连接器不可用 | 资源地址有效期、目标端访问能力、连接器主体及用户授权 | 修复资源访问后重新分享 |
| 内容未预填 | 原始 JSON 字节数、内容块类型与资源可读性、内容审查结果 | 先用纯文本最小消息排除资源问题 |
上线前至少验证:纯文本通过 PC 端 HTTPS 中间页正常分享、未安装客户端、错误私钥、过期请求、重复请求、身份不符与不可访问资源。
