十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Mastra 工作区接入 Archil:使用 @mastra/archil 构建弹性无服务器文件系统

Mastra 工作区接入 Archil:使用 @mastra/archil 构建弹性无服务器文件系统 Mastra 工作区接入 Archil使用 mastra/archil 构建弹性无服务器文件系统【免费下载链接】mastraMastra is the modern TypeScript framework for AI-powered applications and agents.项目地址: https://gitcode.com/GitHub_Trending/ma/mastramastra/archil是 Mastra 官方的工作区文件系统提供者它把 Archil 的弹性无服务器磁盘接入到 Mastra Workspace 生态中底层用 S3 兼容对象 API 实现快速的读写用exec()提供 POSIX shell 访问同时支持快照与持久化卷。读完本文你将掌握如何安装并初始化ArchilFilesystem、理解全部配置参数与初始化路径、调用其专属能力shell 执行、服务端搜索、签名分享链接并能将它以 Provider 的形式注册进 MastraEditor。文中所有结论均来自本仓库的源码、配置与测试实现你可以对照 filesystem.ts、filesystem.test.ts 等文件自行验证。包定位与核心能力mastra/archil位于仓库的 workspaces/archil 目录下其 package.json 将包描述为Archil filesystem provider for Mastra workspaces — elastic, serverless file systems for AI agents。它只依赖一个运行时包disk当前锁定版本 0.8.13并以mastra/core 1.4.0-0 2.0.0-0作为 peer 依赖同时要求 Node.js 22.13.0。从包导出的 API 看见 index.ts它对外提供三样东西ArchilFilesystem类实现WorkspaceFilesystem接口的文件系统实例ArchilFilesystemOptions类型构造与配置参数archilFilesystemProvider描述符供MastraEditor注册与实例化使用。整体能力可以归纳为四点S3 兼容对象操作getObject/putObject/deleteObject/headObject/listObjects/objectExists覆盖文件的读写删查POSIX shell 访问exec()在磁盘挂载目录上执行任意 shell 命令S3 API 不擅长的追加、复制、移动、目录操作都通过它完成服务端并行搜索diskGrep()把正则搜索下发到 Archil 的 serverless 计算返回包含匹配行、扫描文件数、耗时等详细结果持久化与分享磁盘上的文件跨会话持久可通过share()生成带时效的签名下载 URL。安装与前置条件在任意使用 Mastra 的 TypeScript 项目中安装npm install mastra/archil安装前需要确认两点依据 package.json项目依赖mastra/core版本范围1.4.0-0 2.0.0-0因为ArchilFilesystem继承自mastra/core/workspace中的MastraFilesystem基类并使用其类型定义Node.js 版本不低于 22.13.0。快速上手连接一个已有磁盘仓库 README.md 给出了最小示例——连接一个已存在的 Archil 磁盘import { ArchilFilesystem } from mastra/archil; const filesystem new ArchilFilesystem({ diskId: dsk-0123456789abcdef, apiKey: process.env.ARCHIL_API_KEY!, region: aws-us-east-1, });构造完成后还需要调用init()或经由生命周期包装器_init()才能真正建立连接。结合 filesystem.ts 的init()实现可以看到完整的初始化语义仅提供diskId调用archil.disks.get(diskId)挂载已存在的磁盘仅提供createDiskOptions调用archil.disks.create(...)新建磁盘并把返回的result.disk作为实例两者都不提供抛出Either diskId or createDiskOptions must be provided两者同时提供抛出diskId and createDiskOptions are mutually exclusive互斥校验。初始化成功后实例状态变为ready失败则状态置为error并记录错误信息后重新抛出。测试用例 filesystem.test.ts 对上述四种路径挂载、创建、缺参、互斥逐一做了验证。配置参数全解ArchilFilesystemOptions扩展自MastraFilesystemOptions后者提供onInit/onDestroy两个生命周期回调完整定义见 filesystem.ts。参数清单如下参数类型默认值说明idstringarchil-fs-${时间戳}-${随机串}文件系统实例的唯一标识displayNamestringArchil用于 UI 展示的名称iconFilesystemIconcloudUI 图标标识descriptionstringElastic serverless filesystem powered by Archil提示气泡中展示的描述readOnlybooleanfalse以只读方式挂载所有写操作会被拦截diskIdstring无要挂载的已有磁盘 ID如dsk-0123456789abcdef与createDiskOptions互斥createDiskOptionsCreateDiskRequest无初始化时新建磁盘的选项与diskId互斥apiKeystring回退ARCHIL_API_KEY环境变量Archil API 密钥regionstring回退ARCHIL_REGION环境变量Archil 区域例如aws-us-east-1baseUrlstring无覆盖 Archil 控制面基础 URL用于测试/自托管s3BaseUrlstring回退ARCHIL_S3_BASE_URL环境变量覆盖 S3 兼容 API 的基础 URL其中id、displayName、icon、description、readOnly的默认赋值可以在构造函数 filesystem.ts 中看到apiKey、region、baseUrl、s3BaseUrl会被汇总进_archilOptions传给底层 Archil SDK。readOnly的实现很直接所有写方法writeFile、appendFile、deleteFile、copyFile、moveFile、mkdir、rmdir、exec都先调用私有方法assertWritable()见 filesystem.ts一旦为只读模式即抛出Filesystem is read-only。生命周期init / destroy / isReady / getInfoArchilFilesystem继承自mastra/core的MastraFilesystem抽象基类实现见 mastra-filesystem.ts。基类提供并发安全的_init()/_destroy()包装器内部维护各自的 Promise避免并发调用产生竞态并自动推进状态机子类只需覆写不带下划线的init()/destroy()。这也解释了测试中直接调用fs._init()的原因。ArchilFilesystem自身暴露的状态与查询方法isReady()返回status ready _disk ! nullfilesystem.tsgetInfo()返回FilesystemInfo其中metadata携带磁盘 ID、区域、磁盘名filesystem.tsgetInstructions()生成给 Agent/LLM 看的说明文本标注是只读还是持久存储、以及支持exec()服务端执行filesystem.tsdestroy()清空_disk与_archil引用disk/archil两个访问器分别暴露底层 Disk 实例与 Archil SDK 客户端未初始化时访问disk会提示先调用init()。Archil 专属操作这四个方法不走通用WorkspaceFilesystem接口契约而是 Archil 能力的外露全部位于 filesystem.tsexec(command: string): PromiseExecResult在磁盘挂载目录上执行 shell 命令。ArchilFilesystem内部大量操作如mkdir -p、cp、mv、printf 追加都复用它调用者也可直接使用例如在磁盘上跑ls、grep或构建脚本。返回的ExecResult包含exitCode、stdout、stderr以及timing总耗时、排队耗时、执行耗时三段。diskGrep(opts: GrepOptions): PromiseGrepResult把搜索任务并行分发到 Archil 的 serverless 计算上进行。命名刻意使用diskGrep而非grep——CHANGELOG.md 记录了这一重命名因为其选项与结果结构matches、stoppedReason、filesScanned、containersDispatched、computeSecondsUsed、durationMs、listingMs、grepMs与mastra/core中可选的WorkspaceFilesystem.grep能力契约不同同名会导致核心工作区的 grep 工具用不匹配的参数去调用。测试中展示的用法是const results await filesystem.diskGrep({ directory: /src, pattern: TODO, recursive: true });share(key: string, opts?: ShareUrlOptions): PromiseShareUrlResult为文件生成签名、限时的下载 URL测试中传入了{ expiresIn: 3600 }并断言返回{ url, expiresAt }见 filesystem.test.ts。listObjects / headObject直通 S3 兼容 APIlistObjects(prefix, opts)支持分页/单页/递归等选项headObject(key)只取对象元数据大小、Content-Type、最后修改时间而不下载内容是stat()判断路径是否为文件的依据。标准文件操作及其底层实现ArchilFilesystem实现了WorkspaceFilesystem接口要求的全部文件方法。值得强调的是文件读写走 S3 对象 API而涉及目录语义的操作走 shell这是整个实现的分工主线。readFile / writeFilefilesystem.tsreadFile(path, { encoding })通过getObject(key)取对象。传encoding如utf-8时返回字符串否则返回Buffer对象缺失HTTP 404 或NoSuchKey会被转换为FileNotFoundError。writeFile(path, content, options)内容支持字符串、Uint8Array与普通数组三种形态统一转成Uint8ArrayMIME 类型优先取options.mimeType否则按扩展名自动推断见下方 MIME 表。overwrite: false时若对象已存在则抛FileExistsErrorrecursive: true时先用mkdir -p创建父目录。路径会先经过toKey()规范化去掉首尾斜杠因此工作区风格的/a/b.txt与对象键a/b.txt一一对应。MIME 自动检测源码内置了一张扩展名到 MIME 类型的映射表filesystem.ts覆盖.txt、.md、.html、.css、.csv、.xml、.js/.mjs/.jsx、.ts/.tsx、.json、.yaml/.yml、.py、.sh、常见图片格式、.pdf、.zip/.gz/.tar等未知扩展名统一回退为application/octet-stream。appendFilefilesystem.tsS3 对象 API 不支持追加因此实现走 shell字符串内容用printf %s 内容 文件二进制内容先 base64 编码再用| base64 -d 文件解码追加。命令中的路径与内容都经过shellEscape()处理单引号包裹并对内部单引号做\转义见 filesystem.ts避免注入风险。deleteFile / copyFile / moveFilefilesystem.tsdeleteFile默认先检查对象是否存在不存在抛FileNotFoundErrorforce: true跳过检查最后deleteObject(key)copyFile/moveFile目标已存在且未显式overwrite时抛FileExistsError随后分别执行cp [-r] src dest与mv src dest通过exitCode与 stderr 内容判断失败原因——包含No such file时映射为FileNotFoundError。目录与路径操作mkdir / rmdirfilesystem.tsmkdir(path, { recursive })递归时加-p根路径直接返回始终存在stderr 含File exists时抛FileExistsErrorrmdir(path, { recursive, force })非递归用rmdir递归且 force 用rm -rf递归但不 force 用rm -rforce 模式下命令追加2/dev/null; true以吞掉错误。测试对这三种命令形态都做了断言见 filesystem.test.ts。readdirfilesystem.ts非递归模式走listObjects(prefix, { recursive: false })objects中键不含/的作为文件项附 sizecommonPrefixes作为目录项支持extension过滤与recursive递归模式。递归模式支持maxDepth与extension组合过滤。exists / statfilesystem.tsexists根路径恒为true先按文件查objectExists再按目录查前缀listObjects(key /, { singlePage: true, limit: 1 })是否有内容stat同样先文件后目录——headObject命中则返回文件FileStat含size、mimeType、时间戳否则查前缀判定目录都查不到抛FileNotFoundError。注册到 MastraEditorarchilFilesystemProvider除了直接实例化包还导出了archilFilesystemProvider见 provider.ts用于把 Archil 注册为MastraEditor可识别的文件系统 Provider。它实现了FilesystemProviderTConfig接口接口定义见 types.tsid: archil与存储配置中的provider字段对应configSchema一段 JSON SchemaoneOf约束配置必须满足有diskId或有createDiskOptions二者之一并声明了diskId、createDiskOptions、apiKey、region、readOnly默认false、baseUrl、s3BaseUrl等字段的 UI 描述createFilesystem(config)直接new ArchilFilesystem(config)把存储的配置水合为运行实例。内置的本地文件系统 Provider 会被自动注册而外部 ProviderArchil、S3、GCS 等需要显式传入MastraEditorConfig.filesystems才能被编辑器使用。测试验证与运行方式仓库为mastra/archil提供了覆盖完整的单元测试 filesystem.test.ts通过vi.mock(disk)注入模拟的 Archil SDK验证点包括构造函数默认值与自定义选项生命周期四态挂载成功、创建成功、缺参报错、互斥报错、销毁readFile的 Buffer/字符串两种返回与 404 错误映射writeFile的字符串/二进制写入、overwrite: false冲突、recursive建目录、只读拦截deleteFile的缺失检查与force行为copyFile/moveFile/mkdir/rmdir生成的 shell 命令形态readdir的文件/目录混合列表与扩展名过滤exists/stat的文件-目录判定顺序appendFile的字符串与 base64 二进制两条分支share、exec、diskGrep、getInstructions的直通行为。运行测试依据 package.json 的 scriptspnpm --filter mastra/archil test:unit # 单元测试 pnpm --filter mastra/archil test # 云端集成测试需真实 Archil 环境 pnpm --filter mastra/archil lint # oxlint eslint 校验小结mastra/archil的架构思路清晰用 S3 兼容对象 API 承担高性能的文件读写与元数据查询用 POSIXexec()补齐追加、复制、移动、目录管理等对象存储不擅长的语义再叠加服务端搜索与签名分享两项差异化能力为 AI Agent 提供持久化、可执行 shell 命令的弹性文件系统。无论你是想为 Agent 工作区接入远程持久化磁盘还是要在 MastraEditor 中注册一个新的文件系统 Provider都可以从 README.md、filesystem.ts 与 filesystem.test.ts 出发结合本文的配置清单与调用语义快速落地。【免费下载链接】mastraMastra is the modern TypeScript framework for AI-powered applications and agents.项目地址: https://gitcode.com/GitHub_Trending/ma/mastra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表