AX: Google이 공개한 분산 에이전트 런타임, 재개 가능한 실행과 단일 컨트롤러 기반 조율

AX 소개

AX(Agent eXecutor)는 자율적으로 동작하는 AI 에이전트의 실행을 조율하고 상태를 안전하게 관리하기 위해 Google이 공개한 분산 에이전트 런타임(distributed agent runtime)입니다. 단순한 챗봇 수준을 넘어 며칠 단위로 장시간 동작하거나 여러 도구·서브 에이전트를 호출하는 워크로드가 늘어나면서, 실행 상태를 추적하고 장애 시 재개(resumption)할 수 있는 인프라 계층이 필요해진 흐름에서 출발했습니다. AX는 그 계층을 채우는 "에이전트를 위한 서빙 레이어" 를 표방합니다.

기존 모놀리식 에이전트 구현에서 벗어나, AX는 컨트롤러(controller), 스킬(skills), 도구(tools), 에이전트(agents) 를 각각 격리된 액터(isolated actor)로 분리해 분산 배치합니다. 모든 사용자·에이전트 호출은 단일 컨트롤러를 통과하므로 실행 흐름을 한 곳에서 감사(audit) 하고 정책을 적용할 수 있고, 이벤트 로그(event log) 에 기록된 상태로부터 중단된 실행을 다시 이어붙일 수 있습니다. 프레임워크와 모델에 종속되지 않도록 설계되어 ADK(Python), A2A 프로토콜 등 외부 에이전트를 원격 에이전트로 등록할 수 있습니다.

Google의 AX 저장소는 "AX is in active early development" 라는 경고와 함께 공개되어 있으며, 핵심·재개 프로토콜·런타임 명세가 안정화되기 전까지 호환성을 깨는 변경(breaking change) 이 이어질 것이라고 명시되어 있습니다. README 기준 v0.1.0 이 첫 태그이며, 컨트리뷰션은 코어 안정화 이후 본격 수용할 예정입니다. 본 게시물은 v0.1.0 시점의 README 와 공식 발표를 기준으로 정리한 자료입니다.

AX의 핵심 설계 결정

단일 작성자(Single-Writer) 컨트롤러

AX 는 하나의 컨트롤러가 실행 상태에 대한 유일한 작성자 역할을 합니다. 클라이언트, 원격 에이전트, MCP 도구, 환경(environment) 은 모두 라우터(router) 와 컨트롤러를 거쳐 통신하므로, 상태 변경이 한 지점에 직렬화되어 동시성 충돌과 부분 갱신을 피하기 쉽습니다. 동일한 컨트롤러가 정책·승인 흐름을 강제하는 지점이기도 해서, bash 도구처럼 부수효과가 있는 호출은 사용자 확인을 통과해야 실제 실행됩니다.

이벤트 로그 기반 재개

실행 중 발생하는 모든 이벤트는 내구성 있는 이벤트 로그에 기록됩니다. README 의 예시 설정은 SQLite 파일을 백엔드로 사용하는 형태입니다.

server:
  address: ":8494"

eventlog:
  sqlite:
    filename: "eventlog/log.sqlite"

planner:
  gemini:
    model: "gemini-3.5-flash"
    timeout: "60s"
    skills_dir: "./examples/skills"

registry:
  remote_agents:
    - id: "medical-deep-researcher"
      name: "Medical Deep Researcher"
      description: "Performs deep medical research using various resources like pubmed and clinicaltrials.gov"
      address: "localhost:50051"

클라이언트가 네트워크 단절로 끊겼다가 돌아오는 경우, 마지막으로 본 시퀀스 번호(--last-seq) 를 넘기면 컨트롤러가 그 이후 이벤트만 재생해 클라이언트를 따라잡게 해줍니다. 대화 자체를 되감는 것이 아니라 놓친 이벤트를 보내주는 동작입니다. 체크포인트에서 분기해서 새 흐름을 만들고 싶다면 ax fork 로 별도 대화를 떠낼 수 있습니다.

격리된 액터로서의 스킬·도구·에이전트

스킬·도구·에이전트가 각각 격리된 액터로 동작하는 구조는 두 가지 효과를 노립니다. 첫째, 한 에이전트나 도구의 장애가 컨트롤러까지 전파되지 않도록 막아 전체 실행의 가용성을 높입니다. 둘째, 호환되는 컴퓨트 플랫폼 위에서는 컴퓨트 레이어 액터 자체의 재개 까지 지원할 수 있습니다. README 는 이 부분을 "compute-layer actor resumption on compatible platforms" 라고 표현하며, Kubernetes 와 Agent Substrate 를 권장 배포 환경으로 명시합니다.

모델·하네스·프레임워크에 비종속

AX 는 "무엇이 아닌가" 를 본문에서 명시적으로 정의합니다. 매니지드 서비스가 아니고, 특정 에이전트 프레임워크나 코딩 하네스(예: Antigravity) 도 아니며, 모델별 컨트롤러도 아닙니다. 대신 ADK 같은 프레임워크나 A2A 프로토콜 호환 에이전트를 원격 에이전트로 끌어다 쓰는 서빙 계층 역할에 집중합니다. 로드맵에는 BYOH(Bring Your Own Harness) 와 서브 에이전트 단위의 일시정지·재개, 서브 에이전트 도구 호출 승인 등이 올라가 있습니다.

AX의 아키텍처

README 의 Mermaid 다이어그램을 그대로 옮기면 다음과 같습니다.

Client ─[resumable stream]→ Router ─→ AX Controller ─[resumable stream]→ Agent (isolated actor)
                                              │
                                              ├─→ Environment (skills, built-in tools — isolated actor)
                                              └─→ Tool (MCP server)

핵심은 클라이언트와 원격 에이전트 사이의 통신이 재개 가능 스트림(resumable stream) 으로 묶여 있다는 점입니다. 컨트롤러는 실행기(executor), 이벤트 로그, 레지스트리(registry) 를 모아 둔 코어이며, MCP 서버로 노출된 도구와 빌트인 스킬을 같은 통제선 위에서 호출합니다. 재개 스트리밍과 에이전트 통신 프로토콜은 안정화 전까지 변경이 예고된 상태이므로, 통합 코드를 작성한다면 proto/ax.protoAgentService 를 진실 공급원으로 참고하라고 README 가 안내합니다.

AX 설치와 빠른 시작

Go 가 설치된 환경에서 CLI 를 직접 받을 수 있습니다.

go install github.com/google/ax/cmd/ax@latest
ax --help

가장 단순한 한 줄 실행은 빌트인 에이전트와 도구만 사용해 로컬에서 한 번 동작합니다.

ax exec --input "Can you list me this directory?"

같은 대화를 이어 가려면 --conversation 으로 대화 ID 를 넘기고, 끊겼다가 돌아온 클라이언트는 --last-seq--resume 으로 따라잡습니다.

ax exec \
  --conversation d85a4b4e-c53b-4c84-b879-f10d905bce40 \
  --input "Show me the contents of README.md"

ax exec \
  --conversation d85a4b4e-c53b-4c84-b879-f10d905bce40 \
  --last-seq 12 \
  --resume

서버 모드로 띄우면 여러 클라이언트가 같은 컨트롤러를 공유할 수 있습니다.

ax serve --config ax.yaml
ax exec --server localhost:8494 --input "Hello agents!"

체크포인트에서 분기하려면 ax fork 로 원본 대화의 특정 시퀀스 이후를 새 대화로 떠냅니다.

ax fork \
  --src-conversation 38460323-9a78-41cb-8991-022b0ff2c19c \
  --dest-conversation e5e26e38-53a2-4f22-b1cb-ae867357df83 \
  --src-seq 12

실행을 시각적으로 확인하고 싶을 때는 ax trace 가 이벤트 로그에서 직접 데이터를 읽어 로컬 웹 UI 를 띄워 줍니다.

ax trace --conversation 1a6e0b29-87c2-4af0-81ac-0c73bf8fa293

AX의 빌트인 Gemini 에이전트와 원격 에이전트

빌트인 Gemini 에이전트는 gemini ID 로 등록되어 있어 곧바로 실행할 수 있습니다. AI Studio 의 API 키 또는 Vertex AI 의 애플리케이션 기본 자격 증명(ADC) 둘 다 지원합니다.

ax exec --agent gemini --input "Hello, how are you?"

# AI Studio
export GEMINI_API_KEY="your-api-key"

# Vertex AI
export GOOGLE_CLOUD_PROJECT="your-project-id"
export GOOGLE_CLOUD_LOCATION="us-central1"
export GOOGLE_GENAI_USE_VERTEXAI=True

자체 에이전트를 붙일 때는 원격 에이전트로 등록하는 것이 표준 경로입니다. README 는 네 가지 패턴을 예시로 제공합니다.

  • AX 네이티브 AgentService 를 그대로 구현하는 examples/remote_agent
  • Google ADK(Python) 에이전트를 원격 에이전트로 띄우는 examples/adk_agent
  • A2A 프로토콜을 쓰는 에이전트를 A2A 브리지로 연결하는 examples/a2a_agent
  • Google Colab 세션 위에서 파이썬 스크립트/노트북을 돌리는 실험적 examples/colab_agent

원격 에이전트를 등록한 뒤 실행하는 흐름은 다음과 같습니다.

# Terminal 1: 원격 에이전트(gRPC :50051)
go run examples/remote_agent/main.go

# Terminal 2: AX 컨트롤러
ax serve

# Terminal 3: 등록된 에이전트로 실행
ax exec \
  --server localhost:8494 \
  --input "HELLO, CAN YOU LOWERCASE WHAT I JUST SAID?"

ax.yamlregistry.remote_agents 항목에 ID·이름·설명·주소를 적어 두면 컨트롤러가 라우팅 대상으로 인식합니다.

AX의 운영 모델과 안전 흐름

AX 의 bash 도구는 빌트인 플래너가 일반 셸 명령을 실행할 수 있게 해 주지만, 명령마다 사용자 명시 승인 흐름을 통과해야 합니다. 모든 사용자·에이전트 호출이 컨트롤러를 거치는 구조이기 때문에, 승인 흐름과 이벤트 로그 기록은 항상 같은 지점에서 강제됩니다. README 의 "What AX is NOT" 절은 AX 가 매니지드 서비스나 특정 코딩 에이전트가 아니라는 점을 분명히 하며, 운영 책임은 사용자의 클러스터에 있다는 점을 명확히 합니다. 로드맵에는 Antigravity 를 기본 하네스로 통합하는 작업, BYOH 지원, 서브 에이전트 일시정지·재개, 서브 에이전트 도구 호출 승인 등이 차례로 올라 있습니다.

AX의 라이선스

AX 는 Apache License 2.0 으로 공개되어 있어 상업적 사용·수정·재배포가 자유롭고, 변경 사항 표기와 라이선스·고지 의무를 지키면 됩니다.

:github: AX 프로젝트 GitHub 저장소

:github: Agent Substrate (AX 권장 배포 환경)

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck: