Skip to main content

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
Profiles are reusable templates: one profile can back many concurrent sessions. Editing a profile never affects sessions that are already running.
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

The runtime field determines which agent-worker mode handles runs for this profile.
Use runtime: "vercel" when you want to switch providers without changing your runner infrastructure. Use runtime: "claude" when you need native Claude features like extended thinking or citations.
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

The tools 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:
This matches web_search and web_extract.

Empty = Defaults

An omitted or empty array grants the curated default set (equivalent to ["@default"]).
Raw artifact tools (@artifacts), Memory Bank tools (@memory), and orchestration tools (@orchestration) are not in @default. Web tools currently sit under @introspection; without TAVILY_API_KEY, they return a tool-level “not configured” error.

Skills

The skills 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.
Connected apps use credential-free catalog references instead:
Managed references authorize 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-in sonar profile, pinned by default:
This is the platform’s built-in helper agent: it answers questions about Orca itself using the docs site, and cannot be edited or deleted through the API. POST /api/orca/seed re-registers it idempotently if it is ever missing from a workspace.

Managing Profiles via API

Deleting a profile does not terminate existing sessions. Sessions hold a snapshot of their profile at creation time.

Profile Examples

Set AGENT_ORC_ORCHESTRATION_TOOLS=off on the runner to remove orchestration tools entirely in restricted environments.
Last modified on September 6, 2026