Install
openclaw skills install @fatonionlee/ous-upload将本地文件上传到 对象存储 并返回最终 CDN 链接。适用于已经拿到 token 响应中的 ousToken、globalDomain、blockSize。需要由 agent 自行分析本地文件、判断走单文件上传还是分片上传、在需要时拆分文件、调用 OUS 接口。获取 token 响应不在本 skill 的能力范围内。
openclaw skills install @fatonionlee/ous-upload这个 skill 是纯 SKILL.md 工作流,不依赖任何预置上传脚本。执行上传时,由 agent 自己读取文件内容、分析文件大小、计算 MD5、在必要时按 blockSize 拆分文件、依次调用 OUS V2 接口并轮询状态;只有在上传进入成功终态后,才返回最终的 url 和 uploadKey。
执行时优先兼容服务端真实返回,而不是死板依赖某一版示例字段名。只要响应语义一致,就应该继续完成上传。
开始前先准备这些输入:
ousTokenglobalDomainblockSize除非其他系统明确要求,否则忽略 bucketType。
ousToken、globalDomain、blockSize这三个字段需要单独调用 soa token 生成接口。不要在这个 skill 里调用 SOA token 生成接口。
如果调用方给的是完整 SOA 响应,而不是拆开的字段,可以直接从响应 JSON 中提取:
d.ousTokend.globalDomaind.blockSize这个 skill 只接受本地文件路径作为输入。
如果用户没有提供本地文件路径,或者路径不存在、不可读,就直接停止并明确告诉用户:这个 skill 只支持本地文件上传。
在发起上传前,agent 需要自行完成这些准备工作:
文件大小 <= blockSize 还是 文件大小 > blockSize如果 文件大小 <= blockSize,走单文件上传。
如果 文件大小 > blockSize,走分片上传,并按下面规则处理:
blocks = ceil(fileSize / blockSize)blockSize 将文件切成若干分片1 开始blockSizesplit 参数一定可用;如果系统自带 split 选项不兼容,可以改用 dd、脚本流式切片或其他本地可靠方案当 文件大小 <= blockSize 时:
POST /ous/api/v2/single/uploadous-token-v2: <ousToken>multipart/form-data 传这些字段:filemd5metadatacustomPrefixcustomFilenametaskIdtaskId,但存在 obsTaskId 或其他服务端返回的任务标识,也要记录下来用于排障当 文件大小 > blockSize 时:
POST /ous/api/v2/block/upload/initous-token-v2: <ousToken>md5blockssizenamemetadatacustomPrefixcustomFilenametaskIdlackBlocksprogressdeduplicatedobsTaskId(如果服务端返回)然后按下面规则继续:
deduplicated = true,视为初始化后服务端已具备完成条件;此时可以直接进入状态轮询lackBlocks 为空或不存在,上传所有分片lackBlocks 非空,只上传缺失分片taskId,但接口返回成功且后续状态查询可通过 token 正常工作,不要因为缺少 taskId 就中断流程;记录已有任务标识并继续lackBlocks 可能是压缩区间格式,例如 8-10;agent 需要先展开成具体分片编号,再决定上传列表上传每个分片时:
POST /ous/api/v2/block/upload/partous-token-v2: <ousToken>multipart/form-data 传这些字段:fileblockblock 为当前分片编号,分片序号从 1 开始分片上传保持保守策略即可。优先串行上传,避免触发文档中的并发限制;如果必须并发,也不要超过文档建议上限。
只有在最后一个需要上传的分片成功提交之后,才开始调用状态接口;不要在中间分片上传完成后提前查询状态。
如果初始化已成功,但后续分片上传无法继续,可以按需调用:
POST /ous/api/v2/block/upload/abort状态接口的调用时机必须满足下面条件之一:
deduplicated = true满足上述条件后,才开始轮询:
GET /ous/api/v2/upload/statusHeader 仍然带:
ous-token-v2: <ousToken>状态查询优先依赖 token 绑定关系,不要假设一定还要额外显式传 taskId。如果响应里返回的是 obsTaskId 而不是 taskId,把它当作排障信息即可。
轮询规则:
200ms2分钟status = 5,视为上传成功status = 6 或 status = 8,视为终态失败uploadKey、obsTaskId、blockUpload.progressPercent 等中间信息,就把任务误判为成功;是否成功只看终态 status只有在 /ous/api/v2/upload/status 返回 status = 5 时,才向用户返回:
urluploadKey如果有助于排查问题或串联后续流程,也可以一并返回:
taskIdobsTaskIdmd5如果上传没有成功,或者任何一步执行失败,不要向用户返回 url、uploadKey,即使失败态响应里带了这些字段也不要透出。
当上传失败时,清晰地向用户暴露真实失败原因。
按下面这些规则处理:
status = 6 和 status = 8 视为终态失败12 视为 token 异常,例如 token 已被复用或尚未绑定任务2分钟 仍未进入成功或失败终态,就按超时处理,并返回真实的超时信息url 或 uploadKey这个 skill 当前没有自带 references/ 目录。只有在需要确认精确接口名、请求字段、状态码、lackBlocks 语义或上传流程细节时,再从当前仓库实现、测试客户端或用户额外提供的协议文档中取证;不要默认依赖不存在的本地引用文件。