acfg_…). Submitting the same definition again returns the same ID.
YAML and JSON configs refer to model providers, configured models, BYO machines, and machine pools by their human-readable names. When a config is created, Omnara resolves those names and stores the resources’ immutable IDs in the compiled config. Renaming a resource therefore does not change an existing config or an agent already using it. Recompiling saved source resolves its names again against the current resources, so an old name may stop resolving or may resolve to a different resource if that name has since been reused.
Provider names are unique within an organization, model names within a provider, and BYO machine and machine-pool names within an organization. Machine and pool resolution also requires the project to have access to the selected resource.
The example below includes every major section. If you are creating your first agent, start with the smaller config in the Quickstart.
Instruction and identity
Model
model selects a model configured in Omnara. provider_config is the name of a model provider, and name must exactly match one of its configured models. The model must also be available to the project.
Tools
Add a tool undertools: to make it available to the agent. Use {} to accept its defaults. You can add built-in tools that Omnara runs or custom tools that your own system runs. MCP tools are configured separately.
Built-in tools
Enable a built-in tool by name. The Built-in tools page explains the available tools and their inputs. You can also change a tool’s default permission:machine_sources is nonempty, Omnara adds missing entries for run_command, write_process, read_process, stop_process, list_processes, list_machines, inspect_machine, upload_file, and download_file to the compiled config. If any source is a machine pool, it also adds create_machine and delete_machine, regardless of pool counts or machine availability. Attached skills similarly add skill. Compilation leaves your YAML or JSON source unchanged. Explicit disables and permissions take precedence.
The builder displays these defaults under Tools → Other tools without writing them into your source. Changing a permission or selecting Disabled saves an explicit override. Defaults disappear when their relevant source is removed; explicitly configured tools remain.
Existing machine configs gain missing machine-tool defaults only when saved again. The builder previews that saved result, not the tools currently stored for an existing config.
Integration capabilities
Create a project integration first, then reference its tools astools.int__<integration-name>__<operation>. Tool entries contain enabled state, deferred
loading and permissions; handler entries use interaction_handlers: {integration-name: {}}.
The shipped tools use immutable integration-agent context established by a provider or
scheduled launch. They fail before provider I/O if no conversation is assigned. Their interaction handlers use the same assigned conversation and accept empty
selection arguments.
Incoming subscriptions belong to the integration and are attached through launch requests
or the integration subscriptions API, not config. Removing a tool or changing config does
not remove subscriptions.
Integration names resolve to immutable IDs when compiled, while credentials remain live
on the integration. See Integrations for examples and provider launchers.
Integration tools, subscriptions and interaction handlers are not inherited by spawned subagents.
Git credentials
Use a connected GitHub integration for HTTPS Git authentication in the agent’s machine processes:integration is the only setting. Compilation pins the integration’s immutable
ID. No assigned PR, integration tool or subscription is required. Credentials
inherit the connected installation’s granted repositories and permissions,
including its API access; they are not restricted to an assigned PR. Manage those
grants in GitHub. See GitHub credentials for
setup and daemon requirements.
GitHub launchers add this capability automatically. An explicit profile choice
wins as a whole, even when it references a different GitHub integration. Spawned
subagents do not receive Git credentials, including those configured in their
selected profile.
Deferred tools
Setdeferred: true on any tool (built-in, custom, or MCP) to keep its definition out of the model’s context until the model asks for it. Deferring a tool implicitly enables the built-in tool_search tool, which the model calls with a regular expression to load matching deferred tools by name, description, and argument names. Keep the tools the agent needs on almost every turn loaded; defer large or rarely used tool sets.
call_deferred_tool with the tool’s name and arguments, so call_deferred_tool is a reserved tool name.
Custom tools
A custom tool describes an operation that your system performs. Itsdescription tells the model when to use it, and its input_schema defines the arguments.
The full example above defines create_ticket as a custom tool. When the agent calls it, Omnara waits for your system to submit the result. Custom tools walks through that workflow.
MCP servers
mcp connects the agent to Model Context Protocol servers. Each entry sets the server URL, authentication, and permissions. auth.secret_id points to the secret required by the selected authentication type. MCP servers explains the full setup.
Event webhook
event_webhook sends this agent’s timeline events and tool-call updates to a public HTTPS endpoint:
event_webhook.events is a required, nonempty event-type allowlist. Supported types are agent_input, model_output, tool_result, context_checkpoint, and tool_call_update. The builder defaults to tool-call updates; “All events” selects the currently supported types explicitly. Changes apply to newly queued events.
Each POST contains event and data matching the event stream, excluding token previews, heartbeats, and stream errors. See Webhook payloads for examples and SDK validation. Each agent sends its own events. Self-subagents inherit the webhook configuration and send events with their own agent IDs; other subagents use their profile’s configuration.
Deliveries are queued for up to ten minutes, with a five-second request timeout. Failed deliveries of every selected event type are retried with exponential backoff and jitter within that window. Return 2xx to acknowledge receipt. Events may arrive more than once or out of order; deduplicate deliveries by Webhook-Id and custom tool execution by tool-call ID.
Signing is optional. Set event_webhook.signing_secret_id to a project-available generic secret, generated with openssl rand -base64 32. Configure the same value on your receiver and verify requests using Standard Webhooks.
Machines
For new agents only, the builder preselects a cluster-managed pool granted to the project if one exists; otherwise, it starts without a machine source.machine_sources provides execution environments for tools such as run_command. Use a machine you connected yourself or let Omnara create one from a pool:
env_overlay sets environment variables. secret_env_overlay references secrets, whose values are resolved when they are injected. Both apply to every process the agent runs on the machine; for pool sources they also apply to the machine environment at provisioning, so the pool’s startup script sees them. Pool sources can also set machine size and limits; supported fields vary by provider. See Machine pools and the config schema.
If a referenced secret is deleted or its project grant is revoked, subsequent processes and pool provisioning omit that environment variable.
Environment names beginning with OMNARA_ are reserved case-insensitively and cannot be set through agent or machine configuration. Agent processes receive OMNARA_HOME from the daemon as the location for Omnara-managed files.
Skills
skills attaches reusable instructions and files that the agent can load with the skill tool. The project must own or hold a grant for each referenced skill.
Subagents
subagents declares the helpers an agent may spawn, keyed by a name the agent passes to the spawn_agent tool. Declaring at least one key adds missing entries for the five subagent tools (spawn_agent, read_agent, send_agent_message, stop_agent, list_agents) to the compiled config without changing source; existing entries keep their enablement and permissions. spawn_agent requires at least one key, but the other four can be listed under tools without any keys, so an agent whose config dropped its subagents can still read, message, and stop the subagents it already has.
Subagents start with a clean context: only the
task passed to spawn_agent reaches them. Each subagent launches from a new config derived from its base with the key’s overrides applied; a subagent at the tree’s max_depth has subagents and spawn_agent removed. Subagents share the parent’s attached machines, including its pool machines, instead of provisioning from the base config’s machine_sources. A subagent’s final answer, question, or failure arrives in the parent’s timeline as a message from the subagent; read_agent reads its timeline on demand. Subagents appear in the console and API as agents with a parent_agent_id; listing agents returns top-level agents unless include_subagents or parent_agent_id is set. Archiving a parent archives its subagents.
For a complete example you can deploy, with a self subagent whose copies each work in their own git worktree on the parent’s machine, see Coding agent in Slack.
Memory stores
memory_stores attaches project-owned stores where agents can keep files between conversations or share them with other agents. Reference each store by name:
access: read or access: read_write. Agent writes require both attachment access and store agent_access to be read_write. Project managers can edit files in read-only stores.
Attached stores are available through the file tools at /memory/<store-name>/<file-path>. Paths can include nested directories. Files keep only their current contents; there is no edit history. Retrieval tools are added automatically; read_write attachments also add write_file. Explicit tool disables still apply.
The CLI’s omnara memory-stores commands manage stores; omnara memory-stores files manages their files using a store ID and a path relative to its root. Replacing or deleting a file requires --expected-digest, returned by upload and download.
Create a config
- API
- Dashboard
The examples assume the client, The response includes the config ID and final model settings after config overrides and project limits are applied. The CLI uploads the config first, reusing the existing ID when the same definition was already created. Validation errors identify the field that needs to be fixed.
$ORG/orgID, and $PROJ/projectID setup from the quickstart.POST /agent-configs returns 201 for a new config or 200 with the existing config when the same definition was already created. The CLI has no separate config step: pass the config to the command that uses it — --file takes a .yaml, .yml, or .json file, --source takes inline YAML or JSON, and --config references an existing acfg_… ID.Full schema and playground: Create agent config · Get agent config.
Profiles
A profile gives a config a stable name, such as Support triage. Launching from that profile uses the config it currently points to. Updating a profile points it to a new immutable config. Future launches use the new config; existing agents keep the config they already use. Previous versions remain available in the profile’s history.Create a profile
- API
- Dashboard
Point a name at an existing config:The response starts with
current_generation: 1; the generation increases each time the profile moves to a new config. With the CLI, pass --file agent.yaml instead of --config to create the config and the profile in one step.Full schema and playground: Create agent profile.
Advance a profile to a new config
- API
- Dashboard
With the REST API and the SDK, create the new config first, then update the profile, sending With the CLI, pass
expected_current_config_id so the request fails with 409 if someone changed the profile after you read it. One CLI command does all of that — it creates the new config, reads the profile’s current config, and points the profile at the new one:--expected-current-config-id acfg_… to pin the expected version yourself.Full schema and playground: Update agent profile.
Use or delete a profile
To launch from a profile, click Launch on its card under Agents → Profiles, pass--profile to omnara agents launch, or pass profile and config to the API. See Launch an agent.
Deleting a profile removes the profile and its version history, but agents launched from it keep running. In the dashboard, open the profile’s Configuration tab and click Delete profile, or run omnara profiles delete {agent-profile-id}. Integration settings can retain its public ID; future launches report the profile as unavailable until you choose an available profile. See Delete agent profile.
Next
Agents
Launch agents from the config you just created
Tools & permissions
Control which tools agents can use and which calls need approval