22 Commits
Author SHA1 Message Date
JBD ac2332829f Replace Redis Streams queue and controller with direct execution and resource locking
Transition the AX architecture from asynchronous event queues (Redis Streams
and the `ax-controller` worker pool) to direct, synchronous reconciliation in
`ax-server` guarded by fine-grained distributed locks.

Key changes:
- Implement per-resource locking (`lock:task`, `lock:workspace`, `lock:model`)
  using Redis distributed locks (`SET NX PX` with token validation) and an
  in-memory locker for testing.
- Move Substrate reconciliation directly into `ax-server` for Task, Workspace,
  and Model lifecycle methods (`Create`, `Resume`, `Suspend`, `Delete`).
- Decommission `ax-controller`, `deploy/ax-controller.yaml`, and Redis Stream
  event publishing/consuming interfaces.
- Simplify `ax delete` and `ax watch` in the CLI to eliminate two-phase
  polling loops now that operations complete synchronously.
- Update `demo.sh`, build configurations (`Makefile`, `.ko.yaml`), and
  documentation to reflect the single-binary control plane architecture.
2026-09-27 16:54:08 -07:00
Jaana Dogan d0bc38bcf9 Clarify Model resource concept description
Refine the Model section in docs/concepts.md to directly describe it as a
declarative configuration resource for model providers, parameters, and
credentials rather than using colloquial phrasing.

Fixes #356
2026-09-25 21:44:39 -07:00
JBD 532635dd24 feat: add support for inlined files in workspace specifications 2026-09-25 21:37:53 -07:00
Jaana Dogan c7de928027 Replace UpdateTask with CreateTask and enforce immutability (#398)
* Replace UpdateTask with CreateTask and enforce immutability

Replaced UpdateTask RPC with CreateTask. Tasks are now
immutable once created; modifying an existing task returns a
FailedPrecondition error.

- Renamed UpdateTask/UpdateTaskRequest to CreateTask/CreateTaskRequest.
- Checked existence in Server.CreateTask to prevent mutation.
- Updated CLI apply logic, tests, and documentation.

* refactor: remove TaskSpec.Suspend and default new tasks to suspended state

* chore: update default snapshots bucket to snapshot-substrate-test-ax-substrate
2026-09-25 20:59:08 -07:00
Matt Van Horn 099f24a5ad feat(server): reject resource names that are not RFC 1123 labels (#406)
ax apply accepted any metadata.name, but Substrate requires actor,
ActorTemplate and atespace names to be lowercase RFC 1123 labels. A name
such as Task-With-Caps was therefore stored, and only failed seconds
later with an asynchronous ActorCreationFailed condition that the user
had to dig out of ax describe or the controller logs.

Validate metadata.name (and metadata.atespace when set) against
[a-z0-9]([-a-z0-9]*[a-z0-9])? with a 63 character limit for Task,
Workspace and Model alike, and return InvalidArgument at apply time.

Fixes #370
2026-09-25 09:17:35 -07:00
Jaana Dogan acb6c1709b Remove temperature parameter from Model examples (#397)
Remove `temperature` settings from example Model manifests. We don't recommend this parameter.
2026-09-24 17:47:37 -07:00
Jaana Dogan 0b5427c4bb Remove Gateway concept to avoid bifurcation with Substrate (#395)
Remove the Gateway resource across the API, controller, server, CLI,
store, and documentation.

Gateway introduced an unnecessary layer and architectural bifurcation
between Agent Substrate and AX. By removing it, AX aligns directly with
Substrate's native primitives and networking rather than maintaining an
overlapping ingress/routing abstraction.

- Reserved protobuf field 8 and removed Gateway RPCs and messages.
- Cleaned up controller reconciler, server endpoints, and store models.
- Updated CLI, documentation, and example manifests.
2026-09-24 16:59:45 -07:00
Alex Jones e6211f84a9 fix(controller): keep task templates stable across lifecycle changes (#390)
Exclude status and the suspend flag from embedded launch configuration so reconciliation reuses the existing template and golden snapshot.
2026-09-24 02:01:21 -07:00
Jaana Dogan ace03604a6 Add external roadmap (#381)
Fixes #362.
2026-09-23 14:08:21 -07:00
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 a2fc9a7057 Update documentation links to point to the examples directory (#308) 2026-05-06 22:49:56 -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
Jaana Dogan 55d5b1b1ea Deploy AX to Substrate (#228)
This change introduces an EPP to create/resume actor the incoming
conversation_id. We also introduce an ax-shell image and a demo pod for
testing purposes.

Follow up changes:
- Suspend the AX server automatically after the request is sent.
- Explore failure cases and how we can ensure suspension safely even if
AX server crashes.
- EventLogService.Fork shouldn't autogenerate a dest_conversation_id.
dest_conversation_id should always be supplied from the client for
routing.

This change also removes the RegisterAgent RPC. Actor
resumption/suspension requires a valid conversation_id for all RPCs and
RegisterAgent no longer fits into this new constraint.
2026-05-04 08:23:48 -07:00
Jaana Dogan d44fe1402f Move the Kubernetes sandbox router to experimental (#265) 2026-04-30 08:53:49 -07:00
Jaana Doganandgemini-code-assist[bot] d694866ec5 Move experimental docs to experimental (#264)
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-04-30 08:48:52 -07:00
Jaana Dogan 3cce8cf42d Use the prebuilt k8s-sandbox-router image (#256) 2026-04-27 07:40:25 -07:00
Jaana Dogan 43ba7aa7db Delete the Python remote agent for now (#196)
This implementation is outdated. We will come back to this once the
AgentService protocol is more stable.
2026-04-13 20:13:47 -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 bd9100c2f3 Add documentation about skills (#150) 2026-03-26 16:57:31 -07:00
Jaana Dogan b10de4c4d3 Split out custom agents into their own pages (#139) 2026-03-24 10:38:54 -07:00