Augments LabsAugments ADK

Runner Profiles

Runner.configure() creates an immutable RunnerProfile for defaults you reuse across multiple runs. A profile does not execute by itself. Bind it to a target, then call the target runner:

from augments.adk import Runner
 
profile = (
    Runner.configure()
    .model("claude-haiku-4-5-20251001")
    .verbose()
    .limits(tokens=50_000)
    .context({"tenant": "acme"})
)
 
result = await profile.agent(support_agent).max_turns(6).arun("Help reset billing access.")

Profiles sit alongside the direct Runner APIs. Use Runner.arun(agent, ...) for one-off calls; use a profile when several runs share the same model, limits, tracing, tenant, context management, or context value. Target runners delegate back to the corresponding Runner execution classmethods, such as Runner.arun, Runner.arun_swarm, Runner.arun_graph, Runner.arun_task, Runner.arun_task_pipeline, Runner.arun_task_group, and Runner.arun_flow, so profiles do not introduce a second execution path.

Immutability

Every fluent call returns a new object:

base = Runner.configure().model("claude-haiku-4-5-20251001")
 
loud = base.verbose()
quiet = base.verbose(enabled=False)

base, loud, and quiet can be reused independently. Reading profile.run_config returns a copy, so mutating that value does not change the profile.

Targets

Bind the profile to the primitive you want to execute:

agent_run = profile.agent(agent).max_turns(6)
swarm_run = profile.swarm(swarm).max_total_turns(30)
graph_run = profile.graph(graph).thread("case-123")
task_run = profile.task(task)
pipeline_run = profile.pipeline(pipeline)
group_run = profile.task_group(task_group)
flow_run = profile.flow(flow).config(flow_config)

Each target runner keeps target-specific options local:

agent_result = await agent_run.arun("Draft the customer reply.")
swarm_result = await swarm_run.arun("Resolve the incident.")
graph_result = await graph_run.arun("Review the claim.")
task_output = await task_run.arun()
pipeline_result = await pipeline_run.arun()
group_result = await group_run.arun()
flow_result = await flow_run.arun()

Streaming stays explicit:

agent_stream = await profile.agent(agent).arun("Write a summary.", stream=True)
graph_stream = await profile.graph(graph).arun("Start", stream=True)
task_stream = await profile.task(task).arun_streamed()
pipeline_stream = profile.pipeline(pipeline).arun_streamed()
flow_stream = profile.flow(flow).arun_streamed()

Scope

RunnerProfile stores RunConfig defaults and the user context value. Hooks, sessions, memory, checkpointers, graph thread ids, and flow configs stay on target runners because their types and semantics differ by primitive:

agent_runner = profile.agent(agent).hooks(run_hooks).session(session).memory(memory)
swarm_runner = profile.swarm(swarm).checkpointer(swarm_checkpointer)
graph_runner = profile.graph(graph).hooks([graph_hooks]).thread("thread-123")
flow_runner = profile.flow(flow).config(flow_config)

Flow execution uses FlowConfig, not RunConfig. A profile's context value is passed to Runner.arun_flow(...); profile RunConfig defaults are not auto-injected into step bodies. For that reason, FlowRunner exposes .context(...) and .config(...), not RunConfig mutators such as .model(...) or .limits(...).

Full Config

Use with_config() when a field does not have a convenience method:

from augments.adk import RunConfig, Runner
 
profile = Runner.configure().with_config(
    RunConfig(
        tracing_enabled=True,
        max_parallel_tools=3,
    )
)

Convenience methods copy into the profile's RunConfig:

profile = (
    Runner.configure()
    .model("claude-haiku-4-5-20251001")
    .tracing(enabled=True, metadata={"service": "support"})
    .tenant("acme")
    .max_total_turns(40)
    .fail_on_tool_error(False)
)