GitHub推荐:Google 把 agent 当 K8s workload 跑:开源 6 个月破万星的 ax 怎么做到亚秒级挂起恢复
GitHub: https://github.com/google/ax
一句话总结
ax(Agent eXecutor)是 Google DeepMind + Google Cloud 联合开源的 AI agent 编排框架——它把 agent 当成「stateful、bursty、long-running actor」这种新 workload来跑,把 K8s 的声明式控制面与 Redis Streams 事件队列、Temporal 的 durable execution 思想、Substrate 的 gVisor 快照能力组合在一起,让「亚秒级 suspend/resume」和「8 个 worker pod 跑 250 个 actor」成为声明式 API 的默认能力。
值得关注的理由
- Google DeepMind 官方出品,Apache 2.0 开源半年破万星——Google 组织账号(79k 粉丝、14 年历史)背书,主导者 Jaana Dogan(@rakyll,13k 粉丝、Google Go runtime/可观测性布道者、原 AWS principal engineer)亲自操刀,定位明显是 Google 推自家 agent platform 的策略性入口。
- 清晰的边界意识——AX 自留「声明式 API + Redis 状态 + 事件队列 + 协调循环」约 6000 行 Go,把沙箱/快照/容器 lifecycle 全部下放给独立开源项目 Agent Substrate(含 gVisor + GCS 快照),这是**「cloud-native 思想迁移到新 workload」的范式样本**,不是另起炉灶的 runtime。
- 直接对标 Temporal / Kagent 的差异化卡位——补「agent runtime」这层空白:Temporal 是通用 durable workflow,Kagent 是 K8s-native agent 但缺 sub-second suspend,LangGraph/CrewAI 只做 DSL 不解决 runtime;ax 用
kubectl风格 CLI(apply/get/watch/ssh/suspend/resume/fork/delete)让 K8s 用户零成本迁移。
项目展示
README 媒体
— 类型: hero(粉色 axolotl 吉祥物,README 顶部 logo)
官网/媒体补充
仓库
assets/下目前只有一个axolotl.svg吉祥物,官网(agentexecutor.io)以 YAML 代码块叙事为主,没有额外截图或 Demo 视频。视觉素材偏弱,主要靠 mascot + 文字叙事,可视化靠 SPEC 示例承担。
筛选说明
- 总共发现 1 个原始媒体元素(README 内的
axolotl.svg,已 verified) - 官网无独立 image/CDN 图床,CLI 命令与 spec YAML 取代传统架构图
- README 中包含完整可执行的 demo 脚本(
./demo.sh),可作为交互式 demo 入口
项目画像
| 维度 | 数据 |
|---|---|
| GitHub | https://github.com/google/ax |
| Star / Fork / Watcher | 11,226 / 542 / 52 |
| 代码行数 | 约 11,221 行(Go ~94% / YAML ~3% / Proto ~2% / Shell ~1% / Python ~1% / 其它) |
| 文件数量 | 55(核心代码,不含 vendor/生成代码) |
| 项目年龄 | 8.5 个月(首次提交 2026-01-21,仓库创建 2026-03-30) |
| 最近推送 | 2026-09-25(活跃) |
| 开发阶段 | 密集开发(近 30 天 12 commits;近 90 天 123 commits) |
| 贡献模式 | Google 内部核心团队主推(Top1 占 75.1%,Top5 占 91.4%,20 名贡献者) |
| 热度定位 | 大众热门(半年破万星,发布即爆发) |
| License | Apache-2.0 |
| 当前版本 | v0.3.1(7 个 tag,0.x 语义化版本,API 仍在定型期) |
| 质量评级 | 代码[优秀] 文档[优秀] 测试[不足] |
作者视角:为什么存在这个项目
创始人/作者背景
主导者 Jaana Dogan(@rakyll,JBD)——Google 资深 Go runtime/可观测性布道者、原 AWS principal engineer,公开 bio 写明「ML/AI Systems」,13.3k 粉丝、249 个公开仓库。她把 Google 内部 agent infra 抽出来开源化的典型人选:长项是把 cloud-native 控制面 + reconciliation 循环这套已验证模式,迁移到 AI agent 这个全新 workload 上。核心贡献者多为 Google 内部员工(joycel-github、wjjclaud、anj-s、zbl94、dberkov 等),外部贡献者寥寥。
问题判断
作者在 DESIGN.md 与 README 中明确写出三条「现有方案不够」的理由:
- etcd 装不下——「Storing millions of short-lived tasks as Kubernetes CRDs pushes etcd past its comfort zone (single-digit GB storage limits, write-rate bottlenecks, control plane degradation).」 这就是 AX 把任务状态搬到 Redis + Redis Streams 而不是用 K8s CRD 的根本理由。
- 裸 K8s 缺原语——没有 suspend/resume actor + 沙箱快照的能力、没有 per-task MCP server 注入、没有 goal-driven workspace bootstrap、没有 per-task model credential 命名引用。
- DSL 层不解决 runtime——LangGraph/CrewAI 管「agent 怎么想」,AX 管「agent 在哪跑、怎么挂、怎么停」。
解法哲学
README 原话「tastefully adding the essential features everyone needs」——作者反复用 kubectl-shaped CLI(apply/get/describe/watch/delete),让 K8s 用户零成本迁移。明确不做什么:
- 不重造 sandbox runtime —— 委托给 Agent Substrate(gVisor + 快照)
- 不做模型路由/智能调度 —— 只接 Gemini 一个 provider,其余 provider 走 fallback 文案
- 不做 workflow DAG —— 只做一个最小可挂起单元 Task,让 agent 自己编排
战略意图
AX ≠ substrate,AX 是声明层。go.mod 同时依赖 github.com/agent-substrate/substrate 与 github.com/agent-substrate/env——前者是控制面(gRPC Control API),后者是数据面(guest gRPC + snapshots)。两个仓库分离说明:substrate 是 runtime,ax 是其上层 declarative orchestrator。商业化层面:Apache 2.0 genuinely open,但 DefaultSnapshotsBucket 写死为 gs://dberkov-gke-dev3/ate-env/(绑定 GCP),且只接 Gemini——这是 Google 推自家 agent platform 的策略性入口。
核心价值提炼
创新之处
按新颖度×实用性排序:
- proto ↔ YAML 双向 bridge via protojson + yaml.Node ——
pkg/apis/v1alpha1/types.go把 protojson 输出转换成yaml.Node树,关键点是用dec.UseNumber()保留数字精度,且给非 RFC3339 字符串打!!strtag——这是解决「YAML 1.1 把True当 bool」历史包袱的最干净做法。可迁移性满分。 - Per-task ActorTemplate 命名 =
sha256(image + sortedEnv)[:4bytes]——taskTemplateName()把 task 名 + image + 排序后 env 做 SHA256,截前 4 字节 hex 作为模板名后缀。改 image 或改 env 自动产出新模板,旧模板由taskTemplatePattern正则批量删除——避免 actor 复用错配置的模板。 LaunchTask = proto.Clone(task); launchTask.Status = nil; launchTask.Spec.Suspend = false——reconciler 把 spec 序列化进 env 时只带 spec 不带 status,且强制Suspend=false——避免容器里读到的 YAML 反映「过去某次」状态。注释写得很清楚:「Only launch configuration belongs in the template; status and suspend changes must not create new golden snapshots.」- 「声明式 API + Redis Streams 事件队列 + Worker 池」控制面模板 ——
apply → server.Save* (ZADD + XADD) → controller.XREADGROUP → reconciler.Reconcile → UpdateTaskStatus (SET + PUBLISH)的全套链路,参考实现价值极高。 setup.go的 maiden-run marker 机制 ——/ax/initialized-<workspace-path-sanitized>文件记录 workspace 是否做过首次初始化(git clone + skills 挂载 + antigravity bootstrap)。每次重启 task runner 都检查 marker,存在则整个 setup 跳过。Git 失败时故意不写 marker,下次启动会重试。internal/substrate/client.go的 actor state machine 等待循环 ——EnsureActor处理AlreadyExists时,如果旧 actor 处于DELETING状态,每 500ms 重试创建最多 20 次(10 秒)——这是 Substrate gRPC API 没有 wait-for-deletion 语义的合理补丁。- in-container metadata server 同端口多协议(HTTP 1.1 + h2c gRPC) ——
metadata.NewServer用SetHTTP1(true)+SetUnencryptedHTTP2(true)同时支持 HTTP/1.1 的 metadata endpoint 和 HTTP/2 (h2c) 的 guest gRPC(ax ssh用),按Content-Type头区分协议。
可复用的模式与技巧
- proto-as-schema 单一来源——
pkg/apis/v1alpha1/用ax.proto+ax.pb.go+ax_grpc.pb.go+types.go(YAML 桥),整个仓库零行手写 struct tag。任何想避免「OpenAPI/YAML/Go struct 三套 schema 漂移」的 API 项目都适用。 - thin wrapper over external runtime——
internal/substrate/client.go是 AX 与 Substrate 边界的全部实现,200 行代码、8 个方法 +BuildActorTemplate。任何「在 X 之上做声明式编排」的项目都该把 X 的 RPC 封装成 1 个 client + 极少方法。 - per-task event consumer group——
defaultWorkerGroup = "ax-controllers"+consumer = "<hostname>-<nanos>"让多副本 controller 自动负载均衡且 crash-safe(未 ack 的事件在 PEL 里保留,新 worker 接管时 XREADGROUP 可读到)。 - in-container metadata server——
runner.Run启动metadata.NewServer提供/healthz、/readyz、/metadata/v1alpha1/ax/{task,workspaces},让外部 controller 通过atenet-router探活并取 spec。这是 cloud-style metadata service(AWS IMDS、GCP Metadata Server)的 agent 化翻版。 ZSet 索引 + Streams 队列 + PubSub 通知Redis 三件套——internal/store/redis/store.go把ax:task:<atespace>:<name>Hash 存 JSON、ax:tasks:indexZSet 按时间排序、ax:stream:tasksXREADGROUP 事件流、ax:pubsub:task:<atespace>:<name>Watch fan-out——大多数中小规模控制面不需要 Kafka。
关键设计决策
-
状态全部用 Redis(Hashes + ZSets + Streams + PubSub),不用 K8s CRD
- 换得 TB 级容量与毫秒级写速;代价是失去 K8s RBAC/审计/
kubectl兼容,必须自建治理(roadmap §4 提到 SPIFFE + Google platform requirements)。
- 换得 TB 级容量与毫秒级写速;代价是失去 K8s RBAC/审计/
-
Actor 创建/挂起/恢复/删除通过单一 gRPC client 委托给 Substrate
- 8 个方法集:
EnsureAtespace / EnsureActorTemplate / EnsureActor / ResumeActor / SuspendActor / DeleteActor / ListActorTemplates / DeleteActorTemplate。最关键的架构边界——AX/substrate 的契约就是这一组 8 个 RPC。
- 8 个方法集:
-
sub-second suspend/resume不在 AX 层实现,由 Substrate snapshot/restore 实现- AX 只是把 suspend/resume 当成两个 RPC 调用:
SnapshotsConfig{StorageLocation: gs://..., OnPause: SNAPSHOT_CONTENT_SCOPE_DATA, OnResume: FromData: RESUME_SOURCE_GOLDEN},substrate 负责把 actor 状态序列化到 GCS bucket 并在新 worker 上 restore。roadmap §2 还规划「基于 idleness 检测自动 SuspendActor」——进一步下放到 substrate 层。
- AX 只是把 suspend/resume 当成两个 RPC 调用:
-
proto3 message 同时作为 wire format + Go struct + YAML schema 的单一来源
pkg/apis/v1alpha1/types.go用 protojson 做 YAML ↔ proto 的桥——marshalYAML(m proto.Message)把 protojson 输出转回yaml.Node,保留字段顺序与字段名(lowerCamelCase);unmarshalYAML走yaml → generic map → JSON → protojson三跳,未知字段直接报错。
-
Task的 actor name == task name,简化路由- 在
reconciler.Reconcile强制task.Status.Actor = task.Metadata.Name;atenet-router通过ate-target-actor: <atespace>/<task>header 直接路由。短期 mental model 极简,长期 roadmap §2 提到「splitting Task workspace setup into a separate actor」会打破这个 1:1。
- 在
-
Model是命名模型配置而非模型本身ModelSpec{provider, model, parameters: Struct, secretKeyRef: {name, key}};internal/model/client.go把 ModelSpec 转 Config,运行时从 K8s Secret 拉 key 走 GeminigenerateContentHTTP API。协议面是 provider-agnostic 的,但当前只硬编码 Gemini,其他 provider 走fallbackResponse返回合成字符串。
竞品格局与定位
竞品对比矩阵
| 维度 | AX (google/ax) | Kagent (Solo.io) | Temporal | LangGraph/CrewAI | Inngest/Prefect/Restate | 裸 K8s Jobs + 自研 CRD |
|---|---|---|---|---|---|---|
| 定位层级 | agent orchestrator(声明层) | agent runtime(K8s-native) | durable workflow engine | agent DSL / 状态机 | 事件驱动 workflow | 朴素基线 |
| 状态存储 | Redis Streams + Hashes | K8s CRD + etcd | 自建持久化数据库 | 进程内存 / 外部 store | 自建 | etcd |
| 子秒级 suspend/resume | 有(委托 Substrate 快照) | 无 | 无(仅 activity retry) | 无 | 无 | 需自研 |
| Sandbox 隔离 | gVisor(通过 Substrate) | K8s 默认 | 无 | 无 | 无 | K8s 默认 |
| Network policy | Gateway 原语(已 deprecated)→ policies | 需自接 | 需自接 | 无 | 无 | NetworkPolicy |
| LLM credential 抽象 | ModelSpec + K8s Secret | 自接 | 自接 | 各框架内置 | 自接 | 需自研 |
| CLI 体验 | kubectl-style | kubectl-style | tctl | Python API | 各家 SDK | kubectl |
| 多语言 SDK | Go + Python antigravity | Go | 7+ 语言 | Python / TS | TS / Python / Go | 任意 |
| License | Apache-2.0 | Apache-2.0 | MIT | MIT | Apache/MIT | N/A |
| 生产验证 | 新(半年) | 较新 | 7+ 年 | 2+ 年 | 3+ 年 | N/A |
差异化护城河
- 信任护城河:Google DeepMind 官方出品 + GCP 背书
- 技术护城河:Substrate + gVisor + atenet-router 一栈(Google 的底层能力整合)
- 范式护城河:声明式 spec 让 agent 行为可审计、可回放、可断点恢复——这是其他 runtime 都没解决的
- 生态护城河:弱——无周边工具链(CLI 只是
kubectl-shape,没有 Terraform provider、没有 Argo Events integration、没有 crossplane provider)
竞争风险
最危险的:
- Kagent(同样 K8s-native,同样 enterprise 路线,社区已发起「Kagent vs AX」issue #394)
- Temporal(如果它把 agent 当一等公民,7 年生产验证 + 7+ 语言 SDK 是难以追赶的)
- AWS Bedrock AgentCore / Vertex AI Agent Engine(云厂商原生集成,对应 ax 这种 self-hosted 路线)
LangGraph/Autogen 不直接竞争(DSL 层 vs runtime 层),可叠加。
生态定位
「AI agent 的 Linux kernel」——不写应用,只提供运行时原语。上层 LangGraph/AutoGen 编 agent 图,下层 Substrate 管 sandbox,AX 居中做声明式控制。
AX 已收录入 DeepWiki;Zread.ai 未收录。无公开 arXiv 论文;起源叙事指向 DeepMind agentic runtime 研究但无具体 paper 链接。
套利机会分析
- 信息差:ax 已经爆发(11k stars),不属于「低关注度高质量」类套利;但**「AX/substrate 边界」「proto-as-schema」「Redis Streams 替代 Kafka」这三个工程模式**目前在国内社区几乎没有中文深度解读,存在认知差。
- 技术借鉴:(a) proto ↔ YAML 双向 bridge 模式可直接搬到 K8s CRD/Crossplane 替代品;(b) Redis 三件套(ZSet + Streams + PubSub)适合中小规模控制面,参考价值高于 Temporal;(c) thin wrapper over external runtime 模式适合任何「在 X 之上做编排」的项目。
- 生态位:填补「agent runtime」这层空白——Temporal 与裸 K8s 之间的灰色地带被 ax 命名了,Kagent 紧跟入场说明这层空白已被市场认可。
- 趋势判断:agent runtime 是 2026 下半年红海方向(Kagent / Temporal agent focus / AWS Bedrock AgentCore / 各家云厂商),窗口期还在但收窄;ax 凭 Google 背书 + Substrate 技术栈 + 清晰的边界意识仍处第一梯队,但需关注 v1.0 之前的 API 稳定性。
风险与不足
- API 仍在定型期 —— README 开头明确
WARNING: We are still actively refining our core concepts, protocols, and specifications. We will likely to introduce major breaking changes prior to a stable release.v0.3.1 + roadmap §1「Stabilize Core Specs」是真实的自我警示。issue #349「Task without spec 触发 controller nil-pointer panic」印证输入校验不充分。 - 测试覆盖率严重偏低 —— commit 类型分布中 Test 仅 1.5%(3/200),整个仓库仅 10 个测试文件(
reconciler_test.go/worker_test.go/server_test.go/metadata_server_test.go/workspace/setup_test.go/workspace/planner_test.go/model/client_test.go/tunnel/tunnel_test.go/runner/runner_test.go/pkg/apis/v1alpha1/types_test.go/cmd/ax/main_test.go),且没有 controller 端到端 / substrate integration test。对一个负责任务调度的控制器框架是显著短板。 - 架构仍在收敛 —— Phase 2 元分析中显示
controller2、experimental、gemini、cmd/gar、proto/gar.proto等路径曾高频修改(139 commits),后续被 PR #214 / #196 / #179 / #176 整合掉。这是「interface 成形期」特征,但短期内还会再变。 - 平台绑定 ——
DefaultSnapshotsBucket写死 GCP GCS,模型只硬编码 Gemini,其他 provider 走 fallback 文案。要真去平台化需要补 AWS S3 / Azure Blob / 多 provider adapter。 - 构建链路未覆盖 ARM64 —— issue #358:Makefile/ko build targets hardcode linux/amd64,对 Apple Silicon / AWS Graviton 自部署用户是 blocker。
- 生产化配套不足 —— 无 CHANGELOG(git log + GitHub Releases 替代)、无 nightly E2E、无 integration test pipeline、release 走
ko apply手动部署。
行动建议
如果你要用它
- 不建议立即生产化——v0.3.x + roadmap §1「Stabilize Core Specs」+ README WARNING 已经说「stable release 之前还会有 breaking changes」
- 适合评估纳入中远期 stack——尤其是有 K8s 集群 + 跑大量 agent + 需要 sub-second suspend 节省成本的场景
- 对比 Kagent 决定:ax 优势在 suspend/resume 与 Substrate 一栈;Kagent 优势在 CRD/informer 治理与社区成熟度
- 小规模自托管:可作为内部 coding agent 的底座(10-1000 个 task/天)
如果你要学它
重点关注这 8 个文件:
| # | 路径 | 行数 | 推荐理由 |
|---|---|---|---|
| 1 | DESIGN.md | 80 | 4 分钟读完架构全貌 |
| 2 | pkg/apis/v1alpha1/ax.proto | 322 | 整个 API 的契约;reserved 字段暴露演化轨迹(gateway 已被删除) |
| 3 | pkg/apis/v1alpha1/types.go | 277 | proto ↔ YAML 桥接的工程典范 |
| 4 | internal/controller/reconciler.go | 464 | 单文件讲透「controller → substrate → K8s」全链路;status condition 状态机;taskTemplateName SHA trick |
| 5 | internal/store/redis/store.go | 711 | Redis Streams 实战范本:ZSet 索引 + XREADGROUP + PubSub watch + 两阶段删除 |
| 6 | internal/substrate/client.go | 448 | AX/substrate 边界全貌;snapshot 配置;actor state machine 等待 |
| 7 | runner/runner.go | 246 | in-container 容器主循环;maiden-run marker;SIGTERM grace period;workspace 顺序 mount |
| 8 | internal/model/client.go | 622 | Gemini 集成 + K8s Secret 自动解析 + provider fallback;看 generateGoogle / fallbackResponse 即可 |
如果你要 fork 它
可改进方向:
- 补 substrate mock + reconciler e2e test——把测试覆盖拉到 ≥40%,生产前必做
- 解绑 GCP——抽象
SnapshotBackendinterface(GS / S3 / Azure Blob),DefaultSnapshotsBucket改成配置项 - 加 provider abstraction——
internal/model/client.go当前只硬编码 Gemini,需要 OpenAI/Anthropic/Bedrock 适配 - 修 ARM64 build(issue #358)——Makefile/ko targets 加
GOARCH变量 - 拆分 workspace bootstrap 与 coding agent harness(roadmap §3)——让用户可配置自定义 agent runtime,而不是被 antigravity 绑定
- stabalize 4 → 3 primitives 后——Gateway 已 deprecated,可以从 README/docs 清理掉历史叙事
知识入口
| 资源 | 链接 |
|---|---|
| DeepWiki | https://deepwiki.com/google/ax |
| Zread.ai | 未收录 |
| 关联论文 | 无(起源叙事指向 DeepMind agentic runtime 研究但无具体 paper 链接) |
| 在线 Demo | 无官方 Playground;可在本地 clone 后跑 ./demo.sh 体验完整 lifecycle(apply → watch → ssh → suspend → resume → delete) |
| 官网 | https://agentexecutor.io |
| 外部深度视角 | Google Open-Sources AX, a Kubernetes-Style Orchestrator for Autonomous AI Agents(InfoQ)— 独立观点:AX 是「foundational execution runtime」而非高层 orchestrator;Temporal 的 durable-execution 思路被借鉴但本地化到 agent;Kagent 共享 K8s-native 定位但 AX 更激进追求 suspension/multiplexing 经济性 |
| 外部深度视角 | Google AX: Safer AI Agent Sandboxes at Scale(Nahornyi AI LAB)— 独立观点:把「不可信 agent 代码」提升为一类独立基础设施是核心思路;批评点在于「billions per cluster」是架构目标而非已验证容量;substrate 是真正执行层,AX 只是声明式 orchestration;价值最终取决于「一个坏 agent 的故障域是否被严格圈在自己 sandbox 内」,公开材料尚未证明 |