Install
openclaw skills install @kadbbz/aios-transfer-fileopenclaw skills install @kadbbz/aios-transfer-file本技能只适用于受控 AIOS 部署。它可能访问真实业务系统,必须按最小权限配置。只读操作可以自动执行;任何会改变状态的操作,包括创建、更新、提交、审批、驳回、删除或触发,都必须先预览目标应用、命令和请求体,并获得明确人工确认。CLI 必须固定到经过评审的版本,Ontology 来源必须可信且可审计。
在 OpenClaw 中,所有文件和图片传输,包括接受用户发来的文件,和给用户发送文件,都必须使用兼容 AWS S3 的 SDK。这适用于附件、file_input:// 消息,以及任何需要把文件返回给用户的场景。
所有本地文件必须按当前通道提供的 senderId 隔离。senderId 是 workspace 文件目录的唯一隔离标识;topic_id 只用于业务系统 SessionId,不得替代 senderId 作为文件目录。
当前工作区内的目录结构固定为:
<senderId>/upload:S3 或通道传入的文件,例如 file_input://... 下载结果。<senderId>/download:OpenClaw 通过互联网、第三方系统、业务应用等方式下载得到的文件。<senderId>/generated:AI 自己生成、转换、分析、渲染或准备返回给用户的文件。aws、s3cmd、mc 或任何其他外部客户端程序。file_input://... URI 之前,或在发送任何本地文件给用户之前,先触发这个 skill。scripts/transfer_s3.mjs,不要在对话中临时写新的传输脚本。--sender-id <senderId>;如果无法确认 senderId,停止文件传输,不得用 topic_id、用户名或推测值替代。<senderId>/upload、<senderId>/download、<senderId>/generated 目录,使用前先创建当前需要的目录。<senderId> 目录内进行。senderId 目录中的文件。file_output://... 消息,不能附带其他文字。使用 AIOS 环境变量构建 S3 客户端:
AIOS_S3_ENDPOINTAIOS_S3_REGIONAIOS_S3_ACCESS_KEY_IDAIOS_S3_SECRET_ACCESS_KEYAIOS_S3_FORCE_PATH_STYLE使用以下 bucket 变量:
AIOS_S3_AGENT_INBOX_BUCKETAIOS_S3_AGENT_OUTBOX_BUCKET发件箱变量统一使用 AIOS_S3_AGENT_OUTBOX_BUCKET,不要引入其他别名。
构造 SDK 客户端时:
AIOS_S3_ENDPOINT 设置自定义 endpoint。AIOS_S3_REGION 设置 region。AIOS_S3_ACCESS_KEY_ID 和 AIOS_S3_SECRET_ACCESS_KEY 作为访问凭证。AIOS_S3_FORCE_PATH_STYLE 为真值时启用 path-style,例如 1、true 或 TRUE。与 aios-agent-management-console 保持一致,使用 TypeScript 或 JavaScript,并采用 AWS SDK for JavaScript v3,具体为 @aws-sdk/client-s3。
优先使用内置 JavaScript 工具:
node scripts/transfer_s3.mjs download-uri --uri "file_input://bucket/path/to/file.bin" --workspace . --sender-id "<senderId>"
node scripts/transfer_s3.mjs upload-file --source "/abs/path/to/file.bin" --workspace . --sender-id "<senderId>"
内置脚本的行为:
@aws-sdk/client-s3 和上面的 AIOS S3 环境变量。aios-agent-management-console 保持同样风格:ESM、动态导入本地安装的包、显式构造 S3Client、显式传入凭证,并且 AIOS_S3_FORCE_PATH_STYLE 默认取 true。senderId 下需要的 upload 或 generated 目录。file_input://... URI 下载到 <senderId>/upload。<senderId>/generated,重命名为要求的时间戳前缀格式,并上传到发件箱 bucket 根目录。--uri-only,用于最终上传回复步骤。依赖位置:
package.json 中声明了 @aws-sdk/client-s3。node_modules/@aws-sdk/client-s3 是否存在,或运行 npm ls @aws-sdk/client-s3 --depth=0。npm install 本地安装依赖。依赖处理流程:
node 和 npm 可用。@aws-sdk/client-s3 是否已经本地安装。npm install。当消息以 file_input:// 开头时:
bucket 和完整的 key。
示例:file_input://bname/path/to/fname.bin extra text
bnamepath/to/fname.bin<senderId>/upload 目录。123456_fname.bin。实现要求:
AIOS_S3_AGENT_INBOX_BUCKET 做诊断比较,但下载时不要改写 URI bucket。<senderId>/upload,不得写入其他 senderId 或工作区根目录。scripts/transfer_s3.mjs download-uri ...,不要写一次性的 SDK 代码。当你需要把本地文件发回给用户时:
AIOS_S3_AGENT_OUTBOX_BUCKET 解析发件箱 bucket。<senderId> 目录内;不得上传其他 senderId 或工作区根目录下的文件。123456_fname.bin(如果原始 basename 已经有时间戳前缀,则替换原前缀,不要叠加),然后将最终文件名中的所有空格替换为 _,最后将该文件复制到工作区当前 <senderId>/generated 目录。file_output://<bucket>/<new_name>。不要在同一条消息里同时输出说明性文字和 file_output://... URI。<senderId>/generated 目录中删除上传暂存文件,避免占用空间。实现要求:
file_output://... 回复不能合并在同一条 assistant 消息里。file_output://...。<senderId> 目录内。scripts/transfer_s3.mjs upload-file ...,不要写一次性的 SDK 代码。下载和上传都使用以下规则:
<timestamp>_filename.ext<digits>_ 开头,则把这个前导数字前缀替换成新的时间戳。_ 之外,文件名其余部分保持原样。使用 SDK 的标准对象操作,不要拉起外部客户端:
GetObject 或等价接口PutObject 或托管上传助手HeadBucket 或等价接口CreateBucket 或等价接口对于大文件,优先使用流式 API;当 SDK 支持流式处理时,避免把整个文件一次性读入内存。
senderId,停止执行,并说明无法确认 workspace 文件隔离目录。file_output://... URI。