Skip to main content
Version: v2.0

Agent configuration

An agent's configuration is one JSON object, the agent template. It is stored on a workflow revision and travels on the wire at data.parameters.agent.

The schema is published as the catalog type agent-template. Fetch the live JSON Schema with:

GET /api/workflows/catalog/types/agent-template

The template rejects unknown keys. The harness, runner, and sandbox sub-objects also reject unknown keys at parse time and return HTTP 400.

For what these parts mean, see Agents, Harnesses and models, and Permissions.

Top-level fields

Every field is optional. An omitted field falls back to the default in the table.

FieldTypeRequiredDefaultDescription
instructionsobjectNo{"agents_md": "<built-in text>"}The agent's instruction documents.
llmobjectNosee llmThe model the agent runs on, its provider, and its credential connection.
toolsarrayNo[]Tools the agent can call. Each entry is one of the tool objects below.
mcpsarrayNo[]MCP servers exposed to the agent.
skillsarrayNo[]Skills the agent ships with.
harnessobjectNosee harnessThe coding agent to drive, plus its gating posture.
runnerobjectNosee runnerThe engine that drives the harness loop, plus the tool execution policy.
sandboxobjectNosee sandboxWhere the agent runs, plus its security boundary.

instructions

FieldTypeRequiredDefaultDescription
agents_mdstringNoA built-in hello-world textThe agent's system prompt. The harness receives it as AGENTS.md.

llm

FieldTypeRequiredDefaultDescription
modelstringNo"gpt-5.6-luna"Model id in the provider's namespace. A provider/model string also parses, split on the first /.
providerstring or nullNonullModel provider. When unset, resolution infers it from a matching stored connection, and fails with an error when it cannot.
connectionobject or nullNonullWhere the model credential comes from. Omit for the project default.
extrasobjectNo{}Model knobs passed through unchanged, for example reasoning_effort.

llm.connection

FieldTypeRequiredDefaultDescription
mode"agenta" | "self_managed"No"agenta"agenta uses a connection stored in the project. self_managed injects no credential; the harness signs itself in.
slugstring or nullNonullThe named stored connection. Valid only with mode: "agenta". Omit for the project default. Setting it with self_managed is rejected.

Which providers, deployments, and connection modes each harness can reach is served per harness:

GET /api/workflows/catalog/harnesses/{harness}

In the shipped table, pi_core and pi_agenta reach openai, anthropic, gemini, mistral, groq, minimax, together_ai, and openrouter, with deployments direct and custom. claude reaches anthropic only, with deployments direct, custom, bedrock, and vertex_ai, and selects its model by alias rather than by a provider/model string.

tools

Each entry in tools is an object discriminated by type. Every entry also accepts the two shared fields below.

FieldTypeRequiredDefaultDescription
permission"allow" | "ask" | "deny" | nullNonullPer-tool override of the runner policy. Absent means inherit runner.permissions.default. On a builtin entry it is not enforceable, so it is dropped and logged.
renderobject or nullNonullDisplay hint carried through to the client.

type: builtin

A tool the harness itself provides. Present means the agent has it. Absent means it does not exist for that agent.

FieldTypeRequiredDefaultDescription
type"builtin"Yes
namestringYesBuilt-in tool name.

Pi built-in names are read, bash, edit, write, grep, find, and ls. read, grep, find, and ls are read-only for permission purposes. Claude Code has no Pi built-ins; its Agenta tools are delivered over MCP.

type: gateway

One action from a built-in integration.

FieldTypeRequiredDefaultDescription
type"gateway"Yes
providerstringNoThe built-in integrations gatewayWhich gateway serves the action.
integrationstringYesThe connected app.
actionstringYesThe single action to expose.
connectionstringYesThe account connection the action runs as.
namestring or nullNonullModel-visible tool name.

type: code

A script the runner executes.

FieldTypeRequiredDefaultDescription
type"code"Yes
namestringYesModel-visible tool name.
descriptionstring or nullNonullWhat the tool does.
runtime"python" | "node"No"python"Script runtime.
scriptstringYesThe script source.
input_schemaobjectNo{"type": "object", "properties": {}}JSON Schema for the tool's arguments.
secretsarray of stringNo[]Names of secrets injected into the script's environment.

type: client

A tool the calling client fulfils instead of the server.

FieldTypeRequiredDefaultDescription
type"client"Yes
namestringYesModel-visible tool name.
descriptionstring or nullNonullWhat the tool does.
input_schemaobjectNo{"type": "object", "properties": {}}JSON Schema for the tool's arguments.

type: reference

Another workflow exposed to the agent as a tool. Agenta runs it server-side.

FieldTypeRequiredDefaultDescription
type"reference"Yes
ref_by"variant" | "environment"No"variant"Which axis selects the workflow revision.
slugstringYesThe workflow slug to reference.
environmentstring or nullNonullEnvironment slug. Required when ref_by is "environment", rejected otherwise.
versionstring or nullNonullPin a revision. Valid only with ref_by: "variant". Absent means the latest revision.
namestring or nullNonullModel-visible tool name. Defaults to slug.
descriptionstring or nullNonullWhat the tool does.
input_schemaobjectNo{"type": "object", "properties": {}}JSON Schema for the tool's arguments.

type: platform

An existing Agenta endpoint exposed as a tool. The catalog owns its description, endpoint, and request schema.

FieldTypeRequiredDefaultDescription
type"platform"Yes
opstringYesWhich catalog operation to expose, for example discover_tools.

mcps

Each entry declares one MCP server. See Tools and integrations.

FieldTypeRequiredDefaultDescription
namestringYes1 to 128 characters matching ^[A-Za-z0-9._-]+$. The name agenta-tools is reserved and rejected.
connectionobjectYesHow Agenta reaches the server.
policyobjectNo{"tools": {"mode": "all", "names": []}}Which of the server's tools are exposed, and at what permission.

mcps[].connection

FieldTypeRequiredDefaultDescription
type"http"No"http"Transport. http is the only value.
urlstringYesThe server URL.
headersobject of stringNo{}Static request headers.
credentialsobjectNo{"type": "none"}Either {"type": "none"} or {"type": "header_secret_refs", "headers": {"<header>": "<secret-name>"}}. Secret values resolve at run time and are never stored in the configuration.

mcps[].policy

FieldTypeRequiredDefaultDescription
tools.mode"all" | "include"No"all"all exposes every tool the server advertises. include exposes only tools.names.
tools.namesarray of stringNo[]Tool names to expose. Required with include, rejected with all.
permission"allow" | "ask" | "deny" | nullNonullPermission applied to this server's tools. Absent means inherit runner.permissions.default.

skills

Each entry is an inline skill package. See Skills.

FieldTypeRequiredDefaultDescription
namestringYes1 to 64 characters matching ^[a-z0-9]+(-[a-z0-9]+)*$.
descriptionstringYes1 to 1024 characters. This is what the agent sees at the start of a session, and what decides when the skill loads.
bodystringYes1 to 50,000 characters. The skill's SKILL.md content after the frontmatter.
filesarrayNo[]Files laid beside SKILL.md.
disable_model_invocationbooleanNofalseHide the skill from the prompt so it loads only when invoked by name.
allow_executable_filesbooleanNofalseAllow bundled files to be marked executable. Sandbox policy must also allow it.

skills[].files[]

FieldTypeRequiredDefaultDescription
pathstringYes1 to 255 characters. Relative POSIX path. A leading /, a backslash, a .. segment, or a root-level SKILL.md is rejected.
contentstringYesUTF-8 text, up to 200,000 characters.
executablebooleanNofalseMark the file executable when it is written out.

harness

FieldTypeRequiredDefaultDescription
kind"pi_core" | "pi_agenta" | "claude"No"pi_core"Which coding agent to drive.
permissionsobjectNosee harness.permissionsTool-use gating posture, applied by harnesses that gate.
extrasobjectNo{}Per-harness knobs passed through unchanged. For Pi, system replaces the base system prompt and append_system adds to it. Both are independent of instructions.agents_md.
kindDisplay nameVersioned slug
pi_corePiagenta:harness:pi_core:v0
pi_agentaPi (Agenta)agenta:harness:pi_agenta:v0
claudeClaude Codeagenta:harness:claude:v0

pi_agenta runs the same engine as pi_core with Agenta's own skills, tools, and base instructions forced on.

harness.permissions

Applied by harnesses that gate tool use. Claude Code renders it into .claude/settings.json in the session working directory. Pi does not gate and leaves it empty.

FieldTypeRequiredDefaultDescription
default_mode"default" | "acceptEdits" | "plan" | "bypassPermissions" | nullNonullThe harness's own default permission mode.
allowarray of stringNo[]Per-tool rules approved without prompting.
askarray of stringNo[]Per-tool rules that raise a prompt.
denyarray of stringNo[]Per-tool rules always rejected.

runner

FieldTypeRequiredDefaultDescription
kind"sidecar"No"sidecar"The engine that drives the harness loop. sidecar is the only value.
permissionsobjectNo{"default": "allow_reads"}The runner-enforced tool execution policy.
extrasobjectNo{}Per-runner knobs passed through unchanged.

runner.permissions

FieldTypeRequiredDefaultDescription
default"allow" | "ask" | "deny" | "allow_reads"No"allow_reads"allow runs every tool without asking. ask requires approval for every tool. deny refuses every tool. allow_reads runs read-hinted tools and asks for everything else.

A value outside that set is rejected. A permission set on a single tool entry overrides this default for that tool.

sandbox

FieldTypeRequiredDefaultDescription
kind"local" | "daytona"No"local"Where the agent runs.
permissionsobject or nullNonullThe declared security boundary. Unset means no declared boundary, and the field never reaches the wire.
extrasobjectNo{}Per-sandbox knobs passed through unchanged, for example a Daytona snapshot.

A deployment restricts which sandbox providers it accepts. A request naming a provider the deployment has not enabled is refused before the run starts.

sandbox.permissions

FieldTypeRequiredDefaultDescription
network.mode"on" | "off" | "allowlist"No"on"Outbound network policy.
network.allowlistarray of stringNo[]CIDR ranges allowed when network.mode is "allowlist".
filesystem"on" | "readonly" | "off" | nullNonullDeclared only. Not enforced.
enforcement"strict" | "best_effort"No"strict"strict fails the run when the boundary cannot be applied.

The default template

This is the value a new agent starts with. It is also the default on the agent workflow's /inspect parameters schema.

{
"instructions": {
"agents_md": "You are a friendly hello-world agent running on the Agenta agent service.\n\n- Greet the user warmly.\n- Answer the user's message in one or two short sentences."
},
"llm": {
"provider": "openai",
"model": "gpt-5.6-luna"
},
"tools": [
{"type": "builtin", "name": "read"},
{"type": "builtin", "name": "bash"},
{"type": "builtin", "name": "edit"},
{"type": "builtin", "name": "write"}
],
"mcps": [],
"harness": {"kind": "pi_core"},
"runner": {"kind": "sidecar", "permissions": {"default": "allow_reads"}},
"sandbox": {"kind": "local"}
}

An empty tools array grants no built-ins at all. The four entries above are what a new agent ships with.

Rejected shapes

The parser returns HTTP 400 instead of falling back to a default when:

SentErrorUse instead
A flat model key on the templatePre-migration flat keyllm.model
A flat agents_md key on the templatePre-migration flat keyinstructions.agents_md
harness or sandbox as a bare stringPre-migration flat selector{"kind": "..."}
A key other than kind, permissions, or extras inside harness, runner, or sandboxUnknown selector keyOne of the three allowed keys
A runner.permissions.default outside the four modesInvalid permission defaultallow, ask, deny, or allow_reads

Embed references

A tools or skills entry can be an @ag.embed reference instead of an inline object. Agenta resolves it into the inline shape server-side, before the runner sees it.

{
"@ag.embed": {
"@ag.references": {"workflow": {"slug": "pdf-report"}},
"@ag.selector": {"path": "parameters.skill"}
}
}