Commit Graph
91 Commits
Author SHA1 Message Date
JBD dc4f36cdba Restructure AX into a general-purpose orchestration layer for agentic tasks
AX is undergoing a significant redesign, moving away from a single CLI with
an embedded Python harness toward a general-purpose orchestration layer for
agentic tasks. The repository is reorganized around three binaries: ax-server
exposes a gRPC API for submitting Task manifests, ax-controller runs as a
horizontally scaled reconciler that consumes work from Redis Streams, and
ax-task-runner executes tasks inside sandboxed workers. Task state now lives
in Redis rather than Kubernetes CRDs so the system can handle millions of
short-lived tasks without straining etcd. The legacy Python harness, ATE
client, SQL event log, and skill examples are removed, and new design,
concepts, manifest, networking, runner, and sandbox docs plus Kubernetes
deploy manifests describe the new architecture.
2026-09-19 20:14:43 -07:00
Jaana Dogan 16db0d7a0f refactor: simplify CLI by removing the exec subcommand and moving its flags to the root command 2026-07-22 12:24:07 -07:00
Jaana Dogan b6fe49a25d Relocate antigravity agent source files from the examples directory (#205)
* Relocate antigravity agent source files from the examples directory

Fixes #188.

* refactor: embed agent.py

* chore: update default antigravity harness address from localhost to 127.0.0.1

* refactor: remove unnecessary localhost resolution from harness server setup
2026-06-26 20:37:10 -07:00
Jaana Dogan 6d3a5f1798 Remove AgentService (#186) 2026-06-26 08:42:18 -07:00
JoyceLiu 3438251c04 Remove A2A agent and bridge (#160)
Removes the A2A protocol integration end-to-end:

- examples/a2a_agent/ (Python coding agent example)
- internal/experimental/a2abridge/ (A2A <-> AX bridge)
- internal/experimental/agent/a2a.go (A2A agent client)
- internal/auth/ (only used by A2A)
- RemoteAgentConfig.Protocol/Auth/Headers/A2A fields and
  Registry.registerA2A (the protocol switch collapses to AXP)
- github.com/a2aproject/a2a-go/v2 dep (via go mod tidy)
- A2A mentions in ax.yaml, README.md, .gitignore

Fixes #128
2026-06-22 22:10:20 -07:00
JoyceLiu 2ac395bae2 Remove docker agent example (#159)
The docker_agent example largely duplicates remote_agent (both
implement AX's native AgentService directly via gRPC). Removing it
in favor of the simpler remote_agent example.

Fixes #132
2026-06-22 22:04:59 -07:00
Jaana Dogan da9d20eccc Remove Colab agent support (#151) 2026-06-18 12:14:06 -07:00
anj-s c388c4c2e4 Add gRPC Streaming for Harness interface and integration (#34) 2026-06-01 14:53:42 -07:00
anj-s c526a3d137 feat: Integrate Antigravity harness with fallback in Controller V2 (#22) 2026-05-28 16:12:27 -07:00
Jaana Dogan bc2dd9dd24 Remove the bidi Connect (#9)
We don't allow sub agents to use the controller to make agent handoffs anymore.

Split AgentMessage into AgentRequest and AgentResponse proto definitions.
2026-05-20 22:45:09 -07:00
Jaana Dogan cdb0b348ea go fmt ./... (#11) 2026-05-20 22:35:36 -07:00
Jaana Dogan 740edc7293 Switch to Gemini 3.5 Flash (#372)
TODO: Reduce the number of hardcoded model names across the repo.
2026-05-19 14:01:00 -07:00
Junjie Wang a3fce1d98f Refactor colab and update readme. (#353) 2026-05-15 19:23:02 -07:00
anj-s 6eaba7c1e8 impl: fix subagent execution flow and add unit tests (#339) 2026-05-14 09:27:33 -07:00
Junjie Wang dc9b83d2a4 Update a2a example to remove confirmation from user. (#347) 2026-05-13 14:21:43 -07:00
Junjie Wang 370c658d46 Add documentation for a2a agent. (#337) 2026-05-11 14:19:42 -07:00
zbl94 e100f0ba15 docs: clarify skills directory resolution logic and fallback behavior in configuration and README (#336) 2026-05-11 12:29:46 -07:00
zbl94 c30ca91133 docs: add README for ADK agent example (#324) 2026-05-11 10:13:08 -07:00
anj-s c6510c6cae Remove ax register from run_e2e.sh and use ax.yaml for registration (#313)
Removed the deprecated `ax register` command from
`examples/docker_agent/run_e2e.sh` and used `ax.yaml` for registration
instead.
2026-05-07 11:34:01 -07:00
anj-s fbd3da0f88 Fix DockerAgent text streaming regardless of keepLooping (#284)
## Summary
- Move text streaming logic in `DockerAgent` `Connect` method outside of
the `keepLooping` check.
- This ensures that intermediate text outputs (reasoning, thoughts, or
status updates) emitted by the model during tool calls (like
`activate_skill`) are correctly streamed back to the client instead of
being ignored.
2026-05-07 08:59:30 -07:00
Jaana Dogan a2fc9a7057 Update documentation links to point to the examples directory (#308) 2026-05-06 22:49:56 -07:00
zbl94 7dbf4e21c0 Add support for external ADK agents via gRPC (#285) 2026-05-06 09:07:45 -07:00
Jaana Dogan 9da8fad0ba Delete Kubernetes sandbox agents (#281)
So we don't accidentally promote this option. There are also rough edges
in this implementation that we don't have time to fix, e.g. the use of
kubectl.
2026-05-05 11:55:39 -07:00
Junjie Wang 723023c5d0 An example A2A agent built with ADK. (#275)
## Summary
Add a self-contained Python sample agent
(`examples/a2a_agent/coding_agent.py`) that serves as the end-to-end
reference for AX's A2A bridge. Built on Google ADK's LlmAgent (Gemini),
exposes the agent over A2A on three transports (gRPC, JSON-RPC,
HTTP+JSON REST), and exercises HITL, streaming/polling, multi-scheme
auth, and FilePart artifacts.
## Features exercised
- HITL save-confirmation via `TASK_STATE_INPUT_REQUIRED`, mapped to
ADK's `LongRunningFunctionTool` semantics — the agent proposes a path
and waits for the user's "yes" before writing.
- Returns the saved Python source as a `text/x-python` FilePart
attachment alongside the agent's text reply; on decline, emits the
proposed code as a fenced markdown block instead.
- Optional dual-scheme auth (`--auth`): AgentCard advertises Bearer and
API key as alternatives (OR semantics); symmetric enforcement via HTTP
middleware + gRPC interceptor.
- Streaming and polling-fallback paths (`--no-streaming` disables
streaming in the AgentCard so clients exercise the polling fallback).
- Inline script metadata (`# /// script`) — runnable via `uv run`
without a separate venv.
## Run
```bash
# Gemini API key:    export GOOGLE_API_KEY=...
# or Vertex AI:      export GOOGLE_GENAI_USE_VERTEXAI=TRUE
#                    export GOOGLE_CLOUD_PROJECT=<project>
#                    export GOOGLE_CLOUD_LOCATION=<region>
uv run examples/a2a_agent/coding_agent.py
uv run examples/a2a_agent/coding_agent.py --no-streaming   # polling fallback
uv run examples/a2a_agent/coding_agent.py --auth           # enable dual-scheme auth (set CODING_AGENT_AUTH_TOKEN)
2026-05-04 14:50:34 -07:00
anj-s 62cc24e21a Add DockerAgent example and fix planner loop (#276)
This PR introduces a standalone `DockerAgent` example and fixes an
infinite loop bug in the planner. It also addresses several code review
comments for robustness and cleanups.
2026-05-01 17:25:08 -07:00
Junjie Wang ff8095fe30 Add ConversationId in the example remote agent message. (#246)
- ConversationId is added in the reply agent message of the remote agent
example. Without conversation id the message gets rejected. (The ate
agent and k8s sandbox agent have it added in the previous PR).
2026-04-26 21:29:02 -07:00
Junjie Wang a6d8a2803f Add conversation_id in AgentMessage and Agent interface. (#244)
This PR adds a new conversation_id field in AgentMessage. 

Also add the conversationID to the signature of Agent.Connect and
Executor.Exec so that we can:
1. propagate conversationID from controller to sub-agent, like remote
agent, a2a agent
2. propagate conversationID to substrate worker

The conversationID is unused by anything yet. It will be picked up by
a2a agents in follow up PRs, and possibly substrate agent as well.
2026-04-23 11:54:21 -07:00
Jaana Dogan 60a7e370a8 Remove Agent.HealthCheck (#233)
AX won't be doing any healthchecks itself. agent.HealthCheck is obsolete
now. We keep the AgentService.HealthCheck RPC to ensure agent
implementators provide a health check mechanism on wire for job
schedulers.
2026-04-20 12:56:03 -07:00
Jaana Dogan 818867923c Rename AgentComplete to AgentEnd (#225) 2026-04-18 06:47:49 -07:00
Jaana Dogan 62ca1ba470 Improve the style in the remote agent example (#210) 2026-04-16 12:05:28 -07:00
Jaana Dogan e9facc997b Introduce AgentComplete (#208)
This is required when we multiplex multiple executions on the same bidi
channel. The client needs to know when an agent finished running.
2026-04-16 09:12:03 -07:00
Jaana Dogan ee9c62acdf Rename the proto package (#206)
Remove redundant AX* prefix from service names.
2026-04-15 11:22:03 -07:00
Jaana Dogan 1bc1955791 Switch to Interactions ToolCallContent and ToolResultContent (#205) 2026-04-14 13:48:50 -07:00
Jaana Dogan 8fe7e60e63 Rename AgentService to AXAgentService (#197)
To keep it consistent with AXService and AXEventLogService.
2026-04-13 20:13:05 -07:00
Junjie Wang 73a27f79e0 Feat: Colab agents (#188)
This PR adds Colab agents into AX. The main use case covered:
1. From a local python script, run it with Colab VM, optionally download
output images, and convert it to a notebook and save in Google Drive.
2. From a remote notebook in Google Drive, run it with Colab VM, get the
output in AX and optionally download output images.

Note: This is only available in gLinux for internal Google version of
Colab CLI. Expect the OSS version coming soon. Instructions at
docs/colab-agent.md.
2026-04-09 16:20:21 -07:00
Jaana Dogan e8eb96f374 Introduce the conversation log (#182)
The changes introduce a conversation log to delegate the history storage
and retrieval to AX. Instead of treating every task/execution as a new
isolated event, AX now supports conversational history.

Conversational history is implemented as a layer above the execution
log. Executions are still logged separately and with much more rich
context that enables resumption within the lifetime of an execution.
With this change, controller natively can identify an execution that is
waiting for resumption from the conversation log. Clients don't need to
know about the underlying execution identifier.

The change also removed the WIP forking capability until we stabilize
the event log schema and the concepts. We will implement it as a follow
up change.

`ExecRequest` is updated to support conversation identifier and
`last_seen_seq`. Sequence numbers will be used to be able to resume
playing from a moment client has since the last. If client connection
disappears, we will still be able to communicate the outputs during a
reconnect.

Some follow-up changes after this change is merged:
- Support for `last_seen_seq`, `seq` number in the ExecResponse.
- Implementation of forking.
- Potential schema changes to conversation_log and execution_log.
- More README updates.
- Rewrite of the trace viewer tool with the new schema once the logs are
more stable.
- Controller will introduce its own OutputHandler to emit additional
fields, e.g. `seq`.
- Remove redundancy between conversation_log and execution_log.
2026-04-06 11:35:33 -07:00
Jaana Dogan 38d14a1afa Introduce Message to remove "role" from Content (#145)
Interactions Content doesn't include a "role" and we introduced this
field in our own copy. Remove "role" from Content in preparation to
switch to the actual Contual message.
2026-03-25 18:23:29 -07:00
Jaana Dogan b10de4c4d3 Split out custom agents into their own pages (#139) 2026-03-24 10:38:54 -07:00
Jaana Dogan 7edaabdbf5 Add GitHub action that checks license headers (#134) 2026-03-23 21:53:14 -07:00
Jaana Dogan 878a3c384f Allow starting executions bidirectionally (#127)
This change introduces AgentService.Connect RPC and replaces Process.

- Connect allows bidirectionally executing agents.
- Connect needs to be started with AgentStart and need to be followed
with AgentOutputs.
- Thought the repo, task is renamed to execution. 
- SQLite schema is updated accordingly.
- agent.Task is removed because AgentStart represents the required
fields to start a new agent call.
2026-03-23 11:51:41 -07:00
Jaana Dogan 33d3eea90b Set role in remote agent example (#125)
Also hand off the outputs of the previous process step to the agent when
there is a handoff.
2026-03-20 09:32:09 -07:00
Jaana Dogan 576ad4b47d Differentiate example agents from each other (#119) 2026-03-19 09:59:13 -07:00
Jaana Dogan 1ec9cd8911 Fix remote agent example (#118)
- Instructions on README should just work.
- Remote agent connections should be established at every Process. The
connection is only active during the lifetime of an execution and need
to be closed once Process completes.
- Fix the history curation in the planner agent
- Ensure we only uppercase the last message and ignore the history.
2026-03-19 09:44:16 -07:00
Jaana Dogan c03370ee94 Run go fmt ./... (#100) 2026-03-16 17:11:07 -07:00
Jaana Dogan 3828779172 Rename the project name from GAR to AX (#95) 2026-03-16 14:06:13 -07:00
Jaana Dogan ea3d9c51c6 Remove the notion of session ID (#94) 2026-03-16 13:26:38 -07:00
Jaana Dogan 76dfcf4d5e Fix examples (#89)
- Fix the docker image name
- Fix the typo in README for trigger
- Fix the GKE sandbox agent example directory
2026-03-11 22:43:01 -07:00
Jaana Dogan 9d37476b09 Remove the local example (#90)
This isn't a very relevant example, most users will never have to write
a local agent.
2026-03-11 22:42:38 -07:00
Jaana Dogan f2d0d12340 Add missing license headers (#87) 2026-03-11 12:48:15 -07:00
JoyceLiu 9c740d90e3 Sandbox enhancements (#79)
**Description**
This PR transitions the lifecycle management of GKE Agent Sandbox
WarmPools from programmatic configuration in Go to declarative
Kubernetes manifests.

By removing the hardcoded WarmPool configurations and CreateWarmPool
logic from the
sandboxclient
, we decouple the application logic from the infrastructure state. Users
can now natively manage their entire sandbox and pool environments using
standard kubectl apply workflows (via
sandbox-template-and-pool.yaml
).

**Key Changes**

- Removed Programmatic Pool Creation: Removed CreateWarmPool and
DeleteWarmPool from

internal/sandboxclient/client.go
.

- Removed Config Structs: Removed pool size and template specs from
internal/config/config.go and agent/sandbox.go

- Declarative Manifests: Consolidated the template and pool
configurations into a single, deployable
examples/sandbox_agent/sandbox-template-and-pool.yaml file.

- Documentation: Updated README.md to reflect the new kubectl apply
workflow for infrastructure setup.
2026-03-11 11:12:52 -07:00