订阅以接收新文章的通知:

Artifacts:支持 Git 的版本化存储

2026-04-16

阅读时间:9 分钟

智能体改变了我们对源代码管理、文件系统和持久状态的思考。开发人员和智能体生成的代码比以往任何时候都多——未来 5 年内编写的代码量将超过整个编程历上的总和——导致这一需求所需的系统规模发生了数量级的变化。源代码管理平台在这方面尤其力不从心:它们原本是为了满足人类需求而构建的,无法应对永不休息、能同时处理多个问题且永不疲倦的智能体带来的 10 倍体量变化。

我们认为需要一种新的基础组件:专为智能体构建的分布式版本化文件系统,能够为当今正在构建的各类应用程序提供服务。

我们称之为 Artifacts:支持 Git 的版本化文件系统。您可以通过编程方式创建存储库,将其与智能体、沙盒、Workers 或任何其他计算范式结合使用,同时可通过任何常规 Git 客户端进行连接。

想为每个智能体会话提供一个存储库?Artifacts 能做到。每个沙盒实例呢?Artifacts 也能做到。想从一个已知良好的起点创建 10000 个分叉?您猜对了:Artifacts 仍能做到。Artifacts 提供一个 REST API 和原生 Workers API,用于在不适合使用 Git 客户端的环境中(即任何无服务器函数)中创建存储库、生成凭据和进行提交。

订阅 Workers 付费计划的所有开发人员都可以使用 Artifacts 的内测版,我们的目标是在 5 月初之前开放公测版。

// Create a repo
const repo = await env.AGENT_REPOS.create(name)
// Pass back the token & remote to your agent
return { repo.remote, repo.token }
# Clone it and use it like any regular git remote
$ git clone https://x:${TOKEN}@123def456abc.artifacts.cloudflare.net/git/repo-13194.git

就是这样。动态创建空存储库,随时可用,任何 Git 客户端都可操作。

如果您想从现有的 Git 存储库创建一个 Artifacts 存储库,以便您的智能体可以独立工作并推送独立的更改,您也可以通过 .import() 来实现:

interface Env {
  ARTIFACTS: Artifacts
}

export default {
  async fetch(request: Request, env: Env) {
    // Import from GitHub
    const { remote, token } = await env.ARTIFACTS.import({
      source: {
        url: "https://github.com/cloudflare/workers-sdk",
        branch: "main",
      },
      target: {
        name: "workers-sdk",
      },
    })

    // Get a handle to the imported repo
    const repo = await env.ARTIFACTS.get("workers-sdk")

    // Fork to an isolated, read-only copy
    const fork = await repo.fork("workers-sdk-review", {
      readOnly: true,
    })

    return Response.json({ remote: fork.remote, token: fork.token })
  },
}

查看文档以开始使用,或者如果您想了解 Artifacts 的使用方式、构建过程和底层工作原理,请继续阅读。

为什么使用 Git?什么是版本化文件系统?

智能体熟悉 Git。它深藏在大多数模型的训练数据中。智能体熟知最佳路径边缘案例,并且经过代码优化的模型(和/或框架)特别擅长使用 Git。

此外,Git 的数据模型不仅适用于源代码管理,还适用于您需要跟踪状态、时间旅行和保留大量小数据的任何内容。代码、配置、会话提示词和智能体历史记录:您通常希望将这些内容(“对象”)存储为小块(“提交”),并能够还原或以其他方式回滚(“历史”)。

我们本可以发明一个全新的定制协议……但这样就会出现引导问题。AI 模型对此一无所知,因此您必须分发技能或 CLI,或者寄希望于用户接入您的文档 MCP……所有这些都会增加摩擦。 如果我们只为智能体提供一个经过身份验证的安全 HTTPS Git 远程 URL,并让它们像 Git 存储库一样运行呢?事实证明,这种方法效果不错。对于不支持 Git 的客户端,例如 Cloudflare Worker、Lambda 函数或 Node.js 应用,我们已提供 REST API 并(即将)推出特定语言的 SDK。这些客户端也可以使用 isomorphic-git,但在许多情况下,更简单的 TypeScript API 可以减少所需的 API 表面。

不仅仅适用于源代码管理

Artifacts 的 Git API 可能让您认为它仅用于源代码管理,但实际上,Git API 和数据模型是一种强大的状态持久化方法,允许您对任何数据进行分叉、时间旅行回溯和比较状态。

在 Cloudflare 内部,我们将 Artifacts 用于内部智能体:自动将文件系统的当前状态会话历史记录持久保存到每个会话的 Artifacts 存储库中。这使我们能够:

  • 持久保存沙盒状态,而无需预配(和保留)块存储。

  • 与其他人共享会话,并允许他们通过时间旅行回溯到会话(提示词)状态文件状态,无论是否有对“实际”存储库(源代码管理)的提交。

  • 最棒的是:从任何点分叉一个会话,让我们的团队与同事共享会话,并让他们从那里继续。正在调试某些东西,需要别人帮忙看看?发送 URL 并将其分叉。要对 API 进行二次开发?让同事进行分叉,然后从您停下的地方继续。

我们还与一些团队交流过,这些团队希望在完全不需要使用 Git 协议,但需要某些语义(回滚、克隆、比较差异)的情况下使用 Artifacts。将每个客户配置存储为产品的一部分,并希望能够回滚?Artifacts 可以很好地体现这一点。

我们很高兴看到团队对 Artifacts 的非 Git 用例进行探索,这与以 Git 为中心的用例同样重要。

底层实现

Artifacts 构建于 Durable Objects 之上。创建数百万(或数千万)有状态的隔离计算实例的能力是如今 Durable Objects 工作方式的固有能力,而这正是我们支持每个命名空间数百万个 Git 存储库所需要的。

美国职业棒球大联盟(用于实时比赛扇出)、Confluence Whiteboards 以及我们自己的 Agents SDK 都在底层大规模使用了 Durable Objects,因此,我们基于一个已经投入生产一段时间的基础组件来构建此功能。

然而,我们确实需要的是可以在 Cloudflare Workers 上运行的 Git 实现。它需要很小、尽可能完整、可扩展(注释LFS),而且高效。因此,我们使用 Zig 构建,并将其编译为 Wasm。

我们为什么使用 Zig?三个理由:

  1. 整个 Git 协议引擎采用纯 Zig 编写(无 libc),编译为约 100KB 的 WASM 二进制文件(还有优化空间!)。它实现 SHA-1、zlib inflate/deflate、delta 编码/解码、包解析和完整的 Git smart HTTP 协议——全部从头开始,对标准库以外的外部依赖为零。

  2. Zig 让我们能够手动控制内存分配,这在 Durable Objects 等受限环境中非常重要。Zig 构建系统让我们能够轻松在 WASM 运行时(生产)和原生构建(根据 libgit2 测试以验证正确性)之间共享代码。

  3. WASM 模块通过一个瘦回调接口与 JS 主机通信:11 个主机导入函数用于存储操作(host_get_object, host_put_object 等),1 个用于流输出 (host_emit_bytes)。WASM 端完全可以隔离测试。

在底层,Artifacts 也使用 R2(用于快照)和 KV(用于跟踪身份验证令牌):

BLOG-3269 2

Artifacts 如何工作(Workers、Durable Objects 和 WebAssembly)

Worker 作为前端,处理身份验证和授权、关键指标(错误、延迟),并实时查询每个 Artifacts 存储库(Durable Object)。

具体如下:

  • 文件存储在底层 Durable Object 的 SQLite 数据库中。

    • Durable Object 存储的最大行大小为 2 MB,因此大型 Git 对象可以分块并跨多行存储。

    • 我们使用同步 KV API (state.storage.kv),其底层由 SQLite 提供支持。

  • DO 的内存限制约为 128MB:这意味着我们可以生成数千万个 DO(它们又快又轻),但必须在这些限制内工作。

    • 我们在获取与推送路径中均深度使用流式传输技术,直接返回根据原始 WASM 输出块构建的 ReadableStream<Uint8Array> 数据流。

    • 我们避免计算自己的 Git 增量,而是将原始增量和基本哈希与解析的对象一起保留。在提取时,如果请求客户端已有基础对象,则 Zig 会发出增量而不是完整对象,从而节省带宽内存。

  • 同时支持 Git 协议 v1 和 v2 版本。

    • 我们支持的功能包括 ls-refs、浅层克隆(deepen、deepe-since、deep-relative)以及通过“have/want”协商进行增量获取。

    • 我们有广泛的测试套件,其中包括针对 Git 客户端的一致性测试和针对 libgit2 服务器的验证测试,旨在验证协议支持。

除此之外,我们还原生支持 git-notes。Artifacts 被设计为智能体优先,而注释使智能体能够向 Git 对象添加注释(元数据)。这包括提示词、智能体属性和其他元数据,这些元数据可以从存储库中读取/写入,而无需改变对象本身。

大型存储库,大问题?了解 ArtifactFS。

大多数存储库都没有那么大,而且 Git 在存储方面的设计极其高效:大多数存储库最多只需几秒钟即可克隆,而这主要取决于网络设置时间、身份验证和校验和。在大多数智能体或沙盒场景中,这是可行的:只需在沙盒启动时克隆存储库并开始工作。

但如果是多 GB 存储库和/或包含数百万个对象的存储库呢?如何快速克隆该存储库,同时又不影响智能体的工作能力,且不消耗算力?

克隆一个流行的 Web 框架(大小 2.4 GB,历史记录很长!)需要近 2 分钟。浅克隆的速度更快,但还不足以将时间缩短到个位数,而且我们也不总是想忽略历史记录(智能体发现它很有用)。

我们能否将大型存储库缩短到约 10-15 秒,以便我们的智能体能够开始工作?可以,但需要一些技巧。

作为 Artifacts 发布的一部分,我们正在开源 ArtifactFS,这是一个文件系统驱动程序,旨在尽快挂载大型 Git 存储库,动态补充文件内容,而不是在初始克隆时阻止。它非常适合智能体、沙箱、容器和其他启动时间至关重要的用例。如果每个大型存储库的沙盒启动时间减少约 90-100 秒,每月运行 1 万个沙盒作业:即节省 2778 小时的沙盒时间。

您可以将 ArtifactFS 视为“异步 Git 克隆”:

  • ArtifactFS 运行 Git 存储库的无 blob 克隆:它获取文件树和引用,但不获取文件内容。它可以在沙盒启动期间这样做,然后您的智能体程序框架才能开始工作。

  • 在后台,它开始通过一个轻量级后台程序同时下载文件内容。

  • 它优先处理智能体通常首先要操作的文件:包清单(package.json、go.mod)、配置文件和代码,并在可能的情况下降低二进制 blob(图像、可执行文件和其他非文本文件)的优先级,以便智能体可以在文件本身被加载时扫描文件树。

  • 如果智能体尝试读取文件时,文件尚未完全加载,则读取操作将被阻止,直到文件完全加载。

文件系统不会尝试将文件“同步”回远程存储库:对于数千或数百万个对象,这通常非常慢,而且我们说的是 Git,因此我们不需要这样做。您的智能体只需要提交和推送,就像处理任何存储库一样。无需学习新的 API。

重要的是,ArtifactFS 可与任何 Git 远程服务器配合使用,而不仅仅是我们自己的 Artifact。如果您从 GitHub、GitLab 或自托管 Git 基础设施克隆大型存储库:仍可以使用 ArtifactFS。

后续计划

我们今天发布的版本只是测试版,目前还在开发一些功能,您将看到这些功能将在未来几周内推出:

  • 扩展我们公开的可用指标。今天,我们提供了每个命名空间、存储库的关键操作计数指标以及每个存储库的存储字节数,使管理数百万个 Artifact 不再费力。

  • 支持存储库级别事件的事件订阅,以便我们能够在推送、拉取、克隆和分叉到一个命名空间内的任何存储库时发送事件。此外,您也可以使用事件、编写 Webhook,并使用这些事件来通知最终用户、在产品中驱动生命周期事件,和/或运行推送后作业(如 CI/CD)。

  • 原生 TypeScript、Go 和 Python 客户端 SDK,用于与 Artifacts API 交互

  • 存储库级别搜索 API 和命名空间范围的搜索 API,例如“查找所有包含 package.json 文件的存储库”。

我们还计划了一个用于 Workers Builds 的 API,让您可以在任何由智能体驱动的工作流程上运行 CI/CD 作业。

费用是多少?

Artifacts 仍处于早期阶段,但希望我们的定价能在智能体规模上发挥作用:拥有数百万个存储库需要具有成本效益,未使用(或很少使用)的存储库不应该成为负担,并且我们的定价应该与智能体的高度单租户性质相符。

您也不用考虑一个存储库是否会被使用,是热是冷,和/或是否会有智能体将其唤醒。我们会根据每个存储库使用的存储空间和操作(例如克隆、分叉、推送和拉取)收费。

美元/单位

已包含

操作

0.15 美元/ 1000 次操作

包含前 1 万个(每月)

存储

0.50 美元/GB/月

首个 1GB 包含在内。

无论您拥有 1,000 个、100,000 个还是 1,000 万个存储库,繁忙大型存储库的费用都高于不常用的小型存储库。

随着测试的进行,我们还将把 Artifacts 引入 Workers Free 计划(有一些合理的限制);我们将在整个测试过程中提供更新,如果此定价发生变化,将在任何使用计费之前进行通知。

我从哪里开始?

BLOG-3269 3

Artifacts 目前推出内测版,我们预计公测将在 5 月初(明确的说,是 2026 年!)进行。我们将在未来几周内逐步允许客户使用,您可以直接注册参与内测

同时,您可以通过以下方式了解有关 Artifacts 的更多信息:

关注变更日志以跟踪测试版的进展。

在 Cloudflare TV 上观看

我们保护整个企业网络,帮助客户高效构建互联网规模的应用程序,加速任何网站或互联网应用程序抵御 DDoS 攻击,防止黑客入侵,并能协助您实现 Zero Trust 的过程

从任何设备访问 1.1.1.1,以开始使用我们的免费应用程序,帮助您更快、更安全地访问互联网。要进一步了解我们帮助构建更美好互联网的使命,请从这里开始。如果您正在寻找新的职业方向,请查看我们的空缺职位
Agents Week智能体GitHubCloudflare Workers存储开发人员平台开发人员

在 X 上关注

Matt Carey|mattzcarey
Matt Silverlock|@elithrar
Cloudflare|@cloudflare

相关帖子

2026年4月30日

Agents can now create Cloudflare accounts, buy domains, and deploy

Starting today, agents can now be Cloudflare customers. They can create a Cloudflare account, start a paid subscription, register a domain, and get back an API token to deploy code right away. Humans can be in the loop to grant permission, but there’s no need to go to the dashboard, copy and paste API tokens, or enter credit card details. ...