agent() Agents
Use agent() to build either a short tool-using agent or a long-horizon RLM agent with a typed final response.
var helper = Ax.agent("question:string -> answer:string");Agents coordinate tools, child agents, runtime sessions, memories, skills, context policies, discovery, recall, shared fields, traces, usage, and final typed responses.
Pick the path by task shape:
- Short agents: quick tool calls, small child-agent composition, and compact final responses.
- Long-horizon agents: RLM runtime execution, context policy, context maps, memory, skills, and optimizer artifacts.
See short agent examples and Advanced Start for the broader Ax path.
What It Does
agent() creates a structured agent program. The agent planner/executor/responder loop can call tools, delegate to child agents, inspect runtime state, ask for clarification, discover tools or skills, recall memory, and finish with a typed output object.
Actor code stages request one exact javascriptCode field. Native-capable providers use strict json_schema; providers without native schema support use validated json_object, so DeepSeek Agent execution does not depend on provider-visible tools. Generated-language distiller and executor stages make one validation correction attempt by default through validation_retries; an explicit zero disables the retry.
Core Call Shape
helper = agent(signature, options)
result = helper.forward(aiClient, inputs)Common Patterns
- Start with a signature that names the final answer fields.
- Add
fn()tools for host data and side effects. - Add child agents to the same callable list as tools.
- Use namespaces to keep tool calls readable.
- Enable discovery when available tools are too numerous to include in full.
- Save and restore state around clarification.
- Use context policies for long-running sessions.
Short agent
AxAgent assistant = Ax.agent(
"question:string -> answer:string",
Map.of("contextFields", List.of())
);Stream the answer
streamingForward() runs the distiller and the executor first, then streams the responder’s answer as field deltas. A clarification or an executor error surfaces before any delta. Each delta carries a version: merge the deltas of one version (strings append, other values replace) and start over when the version changes. The citation check runs when the answer completes; an answer that cites evidence the run never gathered is sent back for a correction, which streams as a new version, and onCitations fires after the stream ends.
// The handbook stays in the agent's runtime, out of the prompt. With
// citations on, the answer cites the evidence it used, and ids the run
// never gathered are sent back to the model for a correction.
Consumer<List<Object>> onCitations = ids -> System.out.println("\ncited: " + ids);
AxAgent assistant = Ax.agent(
"question:string, handbook:string -> answer:string",
Map.of(
"contextFields", List.of("handbook"),
"runtime", Map.of("language", "JavaScript"),
"citations", Map.of("onCitations", onCitations)));
// The distiller and the executor run first; then the responder's answer
// streams. Merge each delta and start over when the version changes (a retry).
try (AxQuickJsCodeRuntime runtime = new AxQuickJsCodeRuntime();
AxGenDeltaStream stream = assistant.streamingForward(
client(),
Map.of(
"question", "I downgraded today. When does it take effect, and is my data safe if I delete the workspace?",
"handbook", HANDBOOK),
Map.of("runtime", runtime, "max_actor_steps", 12))) {
long version = 0;
for (AxGenDelta delta : stream) {
if (delta.version() != version) {
version = delta.version();
System.out.println("\n[retry: starting over]");
}
if (delta.delta().get("answer") instanceof String text) System.out.print(text);
}
System.out.println();Namespaced tools and discovery
Use a flat functions list for small stable sets: local fn() tools, child agents, MCP clients, and runtime providers can all live beside each other. The actor sees those callables directly.
var assistant = Ax.agent("message:string -> reply:string", Map.of(
"functions", List.of(search),
"contextFields", List.of()
));Use grouped functions when the catalog is large or easier to reason about by domain. Each group gives the actor a namespace plus module-level selection criteria; with functionDiscovery: true, concrete schemas are loaded only after the actor calls discover(...). You rarely need to set the flag yourself: autoUpgrade (ON by default) enables discovery automatically once the inline tool docs get large, and likewise keeps oversized input values runtime-only with a truncated prompt preview when they aren’t declared in contextFields. Explicit settings always win; pass autoUpgrade: false to opt out.
AxAgent assistant = Ax.agent(
"question:string -> answer:string",
Map.of("contextFields", List.of())
);For the cross-language smart-default path, see the Smart Defaults Agent in the long-agent examples.
Grouped mode keeps big catalogs out of the prompt until needed. Keep the top-level list either flat or grouped. If a child agent belongs inside a group, pass childAgent.getFunction() inside the group’s functions list.
Memory, skills, and context policy
AxAgent assistant = Ax.agent(
"question:string -> answer:string",
Map.of("contextFields", List.of())
);AxAgent assistant = Ax.agent(
"question:string -> answer:string",
Map.of("contextFields", List.of())
);Connect MCP servers
MCP clients can be passed as tool providers after initialization. Use the flat form when the server exposes a small, obvious tool set.
AxMCPClient client = new AxMCPClient(transport);
client.init();
AxAgent assistant = Ax.agent("request:string -> response:string", Map.of(
"functions", client.toFunction(),
"functionDiscovery", true,
"contextFields", List.of()
));Use grouped discovery when an MCP server has many tools, prompts, or resources. The group gives the actor a namespace and selection criteria before it asks to see detailed schemas.
AxAgent assistant = Ax.agent("request:string -> response:string", Map.of(
"functions", List.of(Map.of(
"namespace", "memory",
"title", "Memory MCP",
"selectionCriteria", "Use for persistent memory lookup.",
"functions", client.toFunction()
)),
"functionDiscovery", true,
"contextFields", List.of()
));Production Notes
Trace actor turns, tool calls, child-agent calls, clarification, discovery, recall, context growth, token usage, and final typed outputs. Keep host functions narrow and typed. Let fatal infrastructure errors bubble; let task uncertainty become clarification or a typed final answer.
See Tools, agent() API, and MCP.