Skip to content

Agent presets

You do not have to design an agent from scratch. noeta.presets ships four ready-made ones: a conversational root called main, and the three subagents it delegates to. Most hosts start from main and adjust.

These are an SDK-level surface — you pick one by building its Options (presets.main_options()) and handing that to Client or query. Custom agents go through the flat Options.agents dict instead.

The quartet

AgentRoleToolsActivation
mainDefault coding agent: full built-in tool surface, spawns the three subagents.Full built-in set (allowed_tools unset), plus the memory tools its memory activation opensfs, web, todo_write, ask_user_question, skill_invocation, memory, mcp; delegation is derived from its agents roster
general-purposeSelf-contained coding worker: full read/write/edit/shell set, no delegation.Edit, Glob, Grep, Read, KillShell, BashOutput, Bash, WebSearch, WebFetch, Writeskill_invocation, mcp
exploreRead-only scout: glob/grep/read + read-only shell, fans out to report facts, never edits.Glob, Grep, Read, KillShell, BashOutput, Bash, WebFetchskill_invocation
planRead-only architect: reads the code and returns a concrete ordered implementation plan, never writes.Glob, Grep, Read, KillShell, BashOutput, Bash, WebFetchAskUserQuestion

explore and plan list Bash, but their prompts restrict it to read-only commands; the approval gate on high-risk shell is the backstop. general-purpose is a leaf worker — it never spawns further, which bounds fan-out.

Activation names

NameWhat it enables
TodoWriteThe TodoWrite control tool (state-patch based progress tracking).
AskUserQuestionThe model can yield for human input via the AskUserQuestion control tool.
delegationThe Task control tool. Derived for any agent with an agents roster; naming it explicitly grants a child the right to spawn.
skill_invocationThe skill control tool for model-driven skill selection.
memoryCross-task memory: the memory_write / memory_read / memory_search / memory_archive tools plus auto-recall at the user-message seam.
mcpMCP tool inheritance: subtasks whose own spec also opens mcp inherit the parent's enabled MCP servers.
browserThe sandbox-backed browser_* tool pack. Only the web specialist opens it.
fs / webDEFAULT_PLUGINS — the default tool packs. Identity-inert.

Only main activates memory: recall hooks into the user-message ingest seam, and only the top-level conversational agent receives user messages. Every memory-enabled preset's prompt carries the memory-policy fragment (exported as MEMORY_POLICY_PROMPT), which tells the model what to save, what not to, and the write hygiene.

Optional agents

Two more AgentDefinitions ship alongside the quartet. Neither is in OFFICIAL_SUBAGENTS, so neither changes main's spawnable roster unless a product registers it.

DefinitionRegistered byPurpose
WEB_SUBAGENT ("web")sandbox_browser_options()The browsing specialist — the sole identity that activates browser. Registering it swaps main's prompt to MAIN_WEB_SYSTEM_PROMPT in lockstep with the roster, so the prompt never names a subagent that is not spawnable. main itself stays browser-free and delegates every page interaction.
CONSOLIDATION_AGENT ("__consolidation__")with_consolidation_agent(options)The background memory curator, driven as an ordinary root task from a host trigger. tools=() empties the whitelist so its whole surface is the capability-gated memory pack. Its __-reserved name keeps it out of any parent's spawnable union.

Subagent fan-out

main can spawn the three subagents in parallel; the result is the subagent's return value, recorded into the EventLog so the whole tree folds back into state. See ADR: Subtask fan-out and durable wake and ADR: Subtask parallel execution.

Exported surface

NameShape
main_options()Options — the official main recipe
sandbox_browser_options()Optionsmain_options() plus the web subagent and the web-aware prompt
with_consolidation_agent(options)Optionsoptions with __consolidation__ registered
official_specs()dict[str, AgentSpec] — the four agents, compiled
OFFICIAL_SUBAGENTSdict[str, AgentDefinition]general-purpose / explore / plan
WEB_SUBAGENT / CONSOLIDATION_AGENTAgentDefinition
CONSOLIDATION_AGENT_NAMEstr"__consolidation__"
MAIN_SYSTEM_PROMPT / MAIN_WEB_SYSTEM_PROMPT / MEMORY_POLICY_PROMPTstr

Prompt text lives in noeta/presets/prompts/*.md and is loaded byte-faithfully, so editing a prompt is a docs-shaped diff. main and main-web are also registered as named presets, so SystemPromptPreset(preset="main") resolves.

Using presets programmatically

python
from noeta import presets
from noeta.sdk import query
from noeta.sdk.providers import AnthropicProvider

options = presets.main_options()

# `provider` and `workspace_dir` are required — without them the Client
# raises ValueError before any turn.
result = query(
    options,
    goal="Refactor module X to use Y",
    provider=AnthropicProvider(api_key="sk-ant-…"),
    workspace_dir="./",
    model="claude-sonnet-4-5-20250929",
)
print(result.answer())
# → 'Replaced the three call sites in module X with Y and ran the tests.'

Or compile all four agents as specs:

python
from noeta.presets import official_specs

specs = official_specs()
print(sorted(specs))
# → ['explore', 'general-purpose', 'main', 'plan']
print(specs["explore"].plugins)
# → ('skill_invocation',)

Custom agents

Define custom agents via the flat Options.agents dict:

python
from noeta.sdk import Options, AgentDefinition

options = Options(
    system_prompt="You are a docs writer.",
    agents={
        "reviewer": AgentDefinition(
            description="Reviews docs for accuracy and clarity.",
            prompt="...",
            tools=["read", "grep", "glob"],
        ),
    },
)

Source

  • Presets: packages/noeta-sdk/noeta/presets/__init__.py
  • Prompts: packages/noeta-sdk/noeta/presets/prompts/
  • Options / AgentDefinition: packages/noeta-sdk/noeta/client/options.py
  • Tool catalogue: packages/noeta-sdk/noeta/builtins/
  • ADR: Tool and agent catalog

Next

Released under the Apache License 2.0.