What is a Profile?
A Profile is the blueprint for an agent. It captures:- Which LLM runtime and model to use
- What the agent’s persona and instructions are (system prompt)
- Which tools the agent is allowed to call
- Which external MCP servers the agent can access
The API and this concepts page use the term Profile. The dashboard and the
orca CLI surface the same object as an Agent (dashboard routes /agents, /agents/new, /agents/:name/edit; CLI command group orca agents). The underlying schema and the /api/profiles/* endpoints are unchanged.Profile Schema
Creating a Profile
Most operators create and edit profiles in the dashboard. The API and generated SDKs use the same schema for automation, tenant onboarding, and tests.Runtime Selection
Theruntime field determines which agent-worker mode handles runs for this profile.
Marlin is outbound-only and therefore requires
workerMode: "sandbox". Its
model must be an explicit, priced openai:<modelId>, anthropic:<modelId>,
or openrouter:<vendor>/<modelId>; there is no implicit runtime-default model
because the profile model is also the billing identity. GET /api/models is
the authoritative list of currently priced OpenRouter models; examples include
openrouter:anthropic/claude-sonnet-4.5 and
openrouter:anthropic/claude-haiku-4.5.
Worker Placement
workerMode selects how the runner reaches the agent-worker without changing the profile’s runtime or model behavior:
Sandbox workers are launched lazily on the session’s first run, reused by later runs, and closed when the session shuts down. The runner must have
WORKER_TOKEN_HMAC_KEY and a worker substrate configured, or an operator must launch the worker out of band. See Dynamic sandbox workers for runner configuration.
For sandbox workers, workerSubstrate explicitly selects e2b, daytona,
docker, or process. When omitted, Orca prefers the profile’s
sandbox.provider if the runner serves it, then falls back to that runner’s
default substrate. An explicit substrate that no runner serves is not rejected
when the profile is saved; session placement fails with the fleet’s available
substrates instead.
workerImage overrides the runner’s image for the selected substrate: an E2B
template id, Daytona snapshot name, or Docker image reference. Because those
artifacts are not interchangeable, set workerSubstrate and workerImage
together or leave both unset.
On profile reads, a pooled Conductor may add workerPlacement with the resolved
substrate, its source (explicit, shell, default, or unknown), whether
it is servable, and explanatory requested or detail fields when needed.
This value reflects the live fleet, is absent for static profiles, and is
ignored rather than persisted when supplied on create or update.
Tool Selectors
Thetools array controls which platform tools the agent can invoke. Four forms are supported:
1. Named Tools
Include specific tools by name:2. Capability Sentinels
Expand all tools in a capability group:3. Wildcard Patterns
Pattern-match tool names:web_search and web_extract.
Empty = Defaults
["@default"]).
Skills
Theskills array names instruction bodies from the conductor skill store (see Skills). Profile create and update requests do not validate skills against the skill store: an unknown skill name is accepted and saved. A missing skill instead shows up as unreadiness on the profile’s readiness field, in the dashboard banner and Dependencies tab, and POST /api/runs refuses with profile_not_ready until the skill is installed. Use the dashboard picker or GET /api/skills to see what is available before attaching a skill.
At run dispatch, the conductor resolves the named skills and sends the matched skill bodies, Agent Skills metadata, and resource manifests to the worker. Skills with executable scripts/ resources are marked requiresSandbox; their scripts execute through the runner’s run_skill_script tool inside the session sandbox.
Tool capability selectors also auto-attach matching platform skills. For example, a profile with @vfs receives using-vfs, and an omitted or empty tools array receives the using-* skills for the @default bundle. In Postgres deployments, the conductor first reconciles the tenant’s platform-skill rows; a tenant-scoped tombstone keeps an intentionally deleted seed absent. Any auto-attached name that remains missing is skipped silently.
MCP Servers and Connected Apps
Profiles can attach inline external MCP servers or grant access to provider-managed connected apps (see MCP Integration). Inline servers are sent to the sidecar during a run:Header values prefixed with
${VAR} are resolved from the runner’s environment before the run envelope is sent to the sidecar. A header value can also be a whole-value secret://name reference, resolved instead from the tenant’s secrets manager. The two schemes are not mixed within one value. Unresolved secrets never reach the sidecar or appear in logs.search_connected_app_tools and call_connected_app_tool. They are omitted from the worker’s native MCP transport configuration, and must not include transport, url, or headers.
MCP Server Spec
Filesystem Policy
Every profile gets an implicit home directory at/agents/{self}/** with read/write/delete access. The optional fs field adds more grants or denies:
delete defaults to write when omitted. deny is a hard override. Pod membership can add more access under /pools/{pool}/...; see Pods.
When the runtime has a per-session VirtualFS manager, session creation also allocates a VirtualFS session. fs.allow_mounts is the explicit mount-prefix allowlist for that lease. If it is omitted, Orca derives the allowlist from the first path segment of the profile’s read, write, and delete globs. If no mount prefixes can be derived, the VFS lease is unrestricted.
In the dashboard profile editor’s Files & permissions section, setting the Mount allowlist field (fs.allow_mounts) does not add the @vfs tool selector automatically. Whether you set fs.allow_mounts through the dashboard or the API, add @vfs to tools yourself when the agent needs vfs_execute or vfs_grep.
Default Seed Profile
Every workspace gets a built-insonar profile, pinned by default:
POST /api/orca/seed re-registers it idempotently if it is ever missing from a workspace.
Managing Profiles via API
Profile Examples
Code Review Agent
Code Review Agent
Research Coordinator (with delegation)
Research Coordinator (with delegation)
Set
AGENT_ORC_ORCHESTRATION_TOOLS=off on the runner to remove orchestration tools entirely in restricted environments.Data Pipeline Agent (with external MCP)
Data Pipeline Agent (with external MCP)