Agents Commands
See Agents module docs for permissions and data model.
soat create-agent
Create an agent
- Method:
POST - Path:
/api/v1/agents
Usage
soat create-agent
Options
--project-id
Public ID of the project
- Source:
body - Required: no
- Type:
string
--ai-provider-id
Public ID of the AI provider to pin. Mutually exclusive with model_route_id.
- Source:
body - Required: no
- Type:
string
--model-route-id
Public ID of a model route in the same project. The agent's completion model is then resolved through the route's ordered targets with failover. Mutually exclusive with ai_provider_id and model.
- Source:
body - Required: no
- Type:
string
--name
—
- Source:
body - Required: no
- Type:
string
--instructions
—
- Source:
body - Required: no
- Type:
string
--model
—
- Source:
body - Required: no
- Type:
string
--tool-bindings
Tools to attach, one binding object per tool — the only attachment field. An entry is either a reference (\{ "tool_id": … \}) or an inline definition (\{ "tool": … \}). See Tool Bindings.
- Source:
body - Required: no
- Type:
array<object>
--max-steps
—
- Source:
body - Required: no
- Type:
integer
--tool-choice
Tool choice strategy. Accepts a string ("auto", "required") or an object (\{ "type": "tool", "tool_name": "my_tool" \}). A forcing value ("required" or the object form) forbids a final assistant message on every step of every turn, including a resumed or continued one, so it requires a has_tool_call entry in stop_conditions — otherwise the write is refused with FORCED_TOOL_CHOICE_CANNOT_STOP.
- Source:
body - Required: no
- Type:
unknown
--stop-conditions
Conditions that end the agent's work early, on top of max_steps. Two scopes: \{"type": "has_tool_call", "tool_name": "<resolved tool name>"\} ends the turn after the step that calls the named tool. It narrows when the loop ends — it never lets it run past max_steps. \{"type": "max_chain_generations", "max_generations": <n>\} bounds the continuation chain instead: once the chain has spawned that many generations, further resumptions stop with chain_limit rather than extending it. It never shortens a turn. The effective ceiling is the smaller of this and the deployment's MAX_CONTINUATION_CHAIN_GENERATIONS, so an agent can be stricter than the platform but never looser. An unknown type, a has_tool_call without a tool_name, a max_chain_generations whose max_generations is not a positive integer, or a non-object entry is rejected with 400.
- Source:
body - Required: no
- Type:
array<object>
--active-tool-ids
—
- Source:
body - Required: no
- Type:
array<string>
--guardrail-ids
Guardrails attached at the agent scope.
- Source:
body - Required: no
- Type:
array<string>
--step-rules
—
- Source:
body - Required: no
- Type:
array<object>
--boundary-policy
—
- Source:
body - Required: no
- Type:
object
--temperature
—
- Source:
body - Required: no
- Type:
number
--knowledge-config
—
- Source:
body - Required: no
- Type:
object
--output-schema
JSON Schema describing the structured object the model must return. When set, non-streaming generations constrain output to this schema and the parsed value is returned as output.object. The schema is enforced on the way back, not just sent to the model: an object that violates it fails the generation with 502 OUTPUT_SCHEMA_VALIDATION_FAILED, naming the violated field. Constraints beyond required/type (minLength, enum, pattern, minItems) are honored and are what reject a structurally valid but degenerate answer. See the Structured Output section in the Agents module docs.
- Source:
body - Required: no
- Type:
object
--max-context-messages
Maximum number of recent messages included in the context window. Null means no limit.
- Source:
body - Required: no
- Type:
integer
--single-session-per-actor
When true, only one open session per actor_id is allowed for this agent.
- Source:
body - Required: no
- Type:
boolean
--trace-content-mode
Zero-retention opt-in for this agent. null inherits the project's setting; none means trace and generation content is never written. Setting full under a project whose own mode is none is refused with 400 — the project is a floor an agent may only tighten.
- Source:
body - Required: no
- Type:
enum("full", "none", null)
--on-approval-expiry
What happens when one of this agent's held tool calls expires un-approved. null (the default) and terminate end the chain there — the expired approval, its approvals.expired event and the auto-filed approval_expired exception are the whole record. react spawns a continuation that reports the staleness to the agent, for an agent that acts on it.
- Source:
body - Required: no
- Type:
enum("terminate", "react", null)
--version-label
Optional tag for the config version this write archives (e.g. initial). Annotates the version only — it is not stored on the agent and is not part of the config, so labelling a change is never itself a change.
- Source:
body - Required: no
- Type:
string \| null - Example:
initial
soat list-agents
List agents
- Method:
GET - Path:
/api/v1/agents
Usage
soat list-agents
Options
--project-id
Project public ID to filter by
- Source:
query - Required: no
- Type:
string
--limit
Maximum number of results to return
- Source:
query - Required: no
- Type:
integer - Default:
50
--offset
Number of results to skip
- Source:
query - Required: no
- Type:
integer - Default:
0
soat get-agent
Get an agent
- Method:
GET - Path:
/api/v1/agents/{agent_id}
Usage
soat get-agent --agent-id <string>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string
soat update-agent
Update an agent
- Method:
PUT - Path:
/api/v1/agents/{agent_id}
Usage
soat update-agent --agent-id <string>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string
--ai-provider-id
—
- Source:
body - Required: no
- Type:
string \| null
--model-route-id
Model route in the same project. Mutually exclusive with ai_provider_id and model; set to null to clear.
- Source:
body - Required: no
- Type:
string \| null
--name
—
- Source:
body - Required: no
- Type:
string \| null
--instructions
—
- Source:
body - Required: no
- Type:
string \| null
--model
—
- Source:
body - Required: no
- Type:
string \| null
--tool-bindings
Tools attached to the agent — the only attachment field. Replaces the whole binding list; set to null to clear. See Tool Bindings.
- Source:
body - Required: no
- Type:
array<object>
--max-steps
—
- Source:
body - Required: no
- Type:
integer \| null
--tool-choice
Tool choice strategy. Accepts a string ("auto", "required") or an object (\{ "type": "tool", "tool_name": "my_tool" \}). A forcing value ("required" or the object form) forbids a final assistant message on every step of every turn, including a resumed or continued one, so it requires a has_tool_call entry in stop_conditions — otherwise the write is refused with FORCED_TOOL_CHOICE_CANNOT_STOP.
- Source:
body - Required: no
- Type:
unknown \| null
--stop-conditions
Conditions that end the agent's work early, on top of max_steps. Two scopes: \{"type": "has_tool_call", "tool_name": "<resolved tool name>"\} ends the turn after the step that calls the named tool. It narrows when the loop ends — it never lets it run past max_steps. \{"type": "max_chain_generations", "max_generations": <n>\} bounds the continuation chain instead: once the chain has spawned that many generations, further resumptions stop with chain_limit rather than extending it. It never shortens a turn. The effective ceiling is the smaller of this and the deployment's MAX_CONTINUATION_CHAIN_GENERATIONS, so an agent can be stricter than the platform but never looser. An unknown type, a has_tool_call without a tool_name, a max_chain_generations whose max_generations is not a positive integer, or a non-object entry is rejected with 400.
- Source:
body - Required: no
- Type:
array<object>
--active-tool-ids
—
- Source:
body - Required: no
- Type:
array<string>
--guardrail-ids
Guardrails attached at the agent scope.
- Source:
body - Required: no
- Type:
array<string>
--step-rules
—
- Source:
body - Required: no
- Type:
array<object>
--boundary-policy
—
- Source:
body - Required: no
- Type:
object
--temperature
—
- Source:
body - Required: no
- Type:
number \| null
--knowledge-config
—
- Source:
body - Required: no
- Type:
object
--output-schema
JSON Schema describing the structured object the model must return. When set, non-streaming generations constrain output to this schema and the parsed value is returned as output.object. The schema is enforced on the way back, not just sent to the model: an object that violates it fails the generation with 502 OUTPUT_SCHEMA_VALIDATION_FAILED, naming the violated field. Constraints beyond required/type (minLength, enum, pattern, minItems) are honored and are what reject a structurally valid but degenerate answer. See the Structured Output section in the Agents module docs.
- Source:
body - Required: no
- Type:
object
--max-context-messages
Maximum number of recent messages included in the context window. Null means no limit.
- Source:
body - Required: no
- Type:
integer \| null
--single-session-per-actor
When true, only one open session per actor_id is allowed for this agent.
- Source:
body - Required: no
- Type:
boolean \| null
--trace-content-mode
Zero-retention opt-in for this agent. null inherits the project's setting; none means trace and generation content is never written. Setting full under a project whose own mode is none is refused with 400.
- Source:
body - Required: no
- Type:
enum("full", "none", null)
--on-approval-expiry
What happens when one of this agent's held tool calls expires un-approved. null (the default) and terminate end the chain there — the expired approval, its approvals.expired event and the auto-filed approval_expired exception are the whole record. react spawns a continuation that reports the staleness to the agent, for an agent that acts on it.
- Source:
body - Required: no
- Type:
enum("terminate", "react", null)
--version-label
Optional tag for the config version this write archives (e.g. pre-tone-change). Annotates the version only — it is not stored on the agent and is not part of the config, so labelling a change is never itself a change. Ignored when the write changes nothing, since no version is created.
- Source:
body - Required: no
- Type:
string \| null - Example:
pre-tone-change
soat patch-agent
Partially update an agent
- Method:
PATCH - Path:
/api/v1/agents/{agent_id}
Usage
soat patch-agent --agent-id <string>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string
--ai-provider-id
—
- Source:
body - Required: no
- Type:
string \| null
--model-route-id
Model route in the same project. Mutually exclusive with ai_provider_id and model; set to null to clear.
- Source:
body - Required: no
- Type:
string \| null
--name
—
- Source:
body - Required: no
- Type:
string \| null
--instructions
—
- Source:
body - Required: no
- Type:
string \| null
--model
—
- Source:
body - Required: no
- Type:
string \| null
--tool-bindings
Tools attached to the agent — the only attachment field. Replaces the whole binding list; set to null to clear. See Tool Bindings.
- Source:
body - Required: no
- Type:
array<object>
--max-steps
—
- Source:
body - Required: no
- Type:
integer \| null
--tool-choice
Tool choice strategy. Accepts a string ("auto", "required") or an object (\{ "type": "tool", "tool_name": "my_tool" \}). A forcing value ("required" or the object form) forbids a final assistant message on every step of every turn, including a resumed or continued one, so it requires a has_tool_call entry in stop_conditions — otherwise the write is refused with FORCED_TOOL_CHOICE_CANNOT_STOP.
- Source:
body - Required: no
- Type:
unknown \| null
--stop-conditions
Conditions that end the agent's work early, on top of max_steps. Two scopes: \{"type": "has_tool_call", "tool_name": "<resolved tool name>"\} ends the turn after the step that calls the named tool. It narrows when the loop ends — it never lets it run past max_steps. \{"type": "max_chain_generations", "max_generations": <n>\} bounds the continuation chain instead: once the chain has spawned that many generations, further resumptions stop with chain_limit rather than extending it. It never shortens a turn. The effective ceiling is the smaller of this and the deployment's MAX_CONTINUATION_CHAIN_GENERATIONS, so an agent can be stricter than the platform but never looser. An unknown type, a has_tool_call without a tool_name, a max_chain_generations whose max_generations is not a positive integer, or a non-object entry is rejected with 400.
- Source:
body - Required: no
- Type:
array<object>
--active-tool-ids
—
- Source:
body - Required: no
- Type:
array<string>
--guardrail-ids
Guardrails attached at the agent scope.
- Source:
body - Required: no
- Type:
array<string>
--step-rules
—
- Source:
body - Required: no
- Type:
array<object>
--boundary-policy
—
- Source:
body - Required: no
- Type:
object
--temperature
—
- Source:
body - Required: no
- Type:
number \| null
--knowledge-config
—
- Source:
body - Required: no
- Type:
object
--output-schema
JSON Schema describing the structured object the model must return. When set, non-streaming generations constrain output to this schema and the parsed value is returned as output.object. The schema is enforced on the way back, not just sent to the model: an object that violates it fails the generation with 502 OUTPUT_SCHEMA_VALIDATION_FAILED, naming the violated field. Constraints beyond required/type (minLength, enum, pattern, minItems) are honored and are what reject a structurally valid but degenerate answer. See the Structured Output section in the Agents module docs.
- Source:
body - Required: no
- Type:
object
--max-context-messages
Maximum number of recent messages included in the context window. Null means no limit.
- Source:
body - Required: no
- Type:
integer \| null
--single-session-per-actor
When true, only one open session per actor_id is allowed for this agent.
- Source:
body - Required: no
- Type:
boolean \| null
--trace-content-mode
Zero-retention opt-in for this agent. null inherits the project's setting; none means trace and generation content is never written. Setting full under a project whose own mode is none is refused with 400.
- Source:
body - Required: no
- Type:
enum("full", "none", null)
--on-approval-expiry
What happens when one of this agent's held tool calls expires un-approved. null (the default) and terminate end the chain there — the expired approval, its approvals.expired event and the auto-filed approval_expired exception are the whole record. react spawns a continuation that reports the staleness to the agent, for an agent that acts on it.
- Source:
body - Required: no
- Type:
enum("terminate", "react", null)
--version-label
Optional tag for the config version this write archives (e.g. pre-tone-change). Annotates the version only — it is not stored on the agent and is not part of the config, so labelling a change is never itself a change. Ignored when the write changes nothing, since no version is created.
- Source:
body - Required: no
- Type:
string \| null - Example:
pre-tone-change
soat delete-agent
Delete an agent
- Method:
DELETE - Path:
/api/v1/agents/{agent_id}
Usage
soat delete-agent --agent-id <string>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string
--force
When true, deletes the agent's dependent generations and traces instead of returning 409 AGENT_HAS_DEPENDENTS.
- Source:
query - Required: no
- Type:
boolean - Default:
false
soat create-agent-generation
Run an agent generation
- Method:
POST - Path:
/api/v1/agents/{agent_id}/generate
Usage
soat create-agent-generation --agent-id <string> --messages <array<object>>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string
--wait
When omitted or false (default), the generation runs in the background and 202 Accepted is returned immediately with a generation_id to poll. Pass true to block until the generation settles and receive the result. Mutually exclusive with stream: true. A builtin tool call always waits.
- Source:
query - Required: no
- Type:
boolean - Default:
false
--messages
—
- Source:
body - Required: yes
- Type:
array<object>
--stream
When true the response is an SSE stream
- Source:
body - Required: no
- Type:
boolean - Default:
false
--trace-id
Optional trace ID to group generations. Each generation appends its own steps to the trace's steps object, and step_count covers them all.
- Source:
body - Required: no
- Type:
string
--parent-trace-id
The trace ID of the parent agent generation that triggered this one (for agent-to-agent calls)
- Source:
body - Required: no
- Type:
string \| null
--root-trace-id
The trace ID of the root generation in the call chain; if omitted, this generation is the root
- Source:
body - Required: no
- Type:
string \| null
--max-call-depth
Maximum nested agent-call depth; 0 short-circuits with a depth-guard response
- Source:
body - Required: no
- Type:
integer - Default:
10
--tool-context
Key-value pairs forwarded as X-Soat-Context-<key> headers on every http, mcp and builtin tool call in this generation. The header name is the deployment's configured context prefix (X-Soat-Context- by default) plus the key verbatim — no character is re-cased. Keys are never case-converted — they round-trip exactly as sent. An invalid or colliding key is rejected with 400 INVALID_TOOL_CONTEXT_KEY.
- Source:
body - Required: no
- Type:
object<string, string>
--action-id
Logical action label recorded on the generation's usage meter, so spend can be rolled up per action (e.g. an A/B/C/D operating action).
- Source:
body - Required: no
- Type:
string
--guardrail-context
Caller-supplied guardrail context (the context.* namespace guard and class expressions read at tool-dispatch time). Free-form and never interpreted by the platform; a guardrail may combine it with a context_tool per its context_mode. See the guardrails module.
- Source:
body - Required: no
- Type:
object<string, unknown>
--metadata
Caller-supplied key/value metadata attached to the generation record for per-run audit attribution (e.g. the knowledge-corpus version that produced this action). Round-trips verbatim when the generation is fetched via the generations API. The bag is caller-owned and no key is reserved: server-owned state (usage attribution, the served agent version, the model route's record, the extraction summary) lives in its own top-level generation fields and cannot be written from here. Use the request's own action_id field to set the usage-attribution label.
- Source:
body - Required: no
- Type:
object<string, unknown>
--extract
Per-turn override of the agent's knowledge_config.extraction default. Omit to follow the agent's stored config. Set false to suppress automatic memory extraction for this turn (e.g. an operational or tool-listing turn that would only add noise to a curated memory). Set true to force extraction on for this turn even when the agent does not enable it by default, provided the agent has a write_memory_id. Has no effect on streaming or requires_action turns, which never extract.
- Source:
body - Required: no
- Type:
boolean
--knowledge-config
Per-generation knowledge retrieval override. Array filters (memory_ids, memory_tags, document_ids, document_paths) are unioned with the agent's stored knowledge_config; scalar fields (min_score, limit) use the per-generation value when present.
- Source:
body - Required: no
- Type:
object
soat submit-agent-tool-outputs
Submit tool outputs for a paused generation
- Method:
POST - Path:
/api/v1/agents/{agent_id}/generate/{generation_id}/tool-outputs
Usage
soat submit-agent-tool-outputs --agent-id <string> --generation-id <string> --tool-outputs <array<object>>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string
--generation-id
—
- Source:
path - Required: yes
- Type:
string
--tool-outputs
—
- Source:
body - Required: yes
- Type:
array<object>
soat list-agent-versions
List an agent's config versions
- Method:
GET - Path:
/api/v1/agents/{agent_id}/versions
Usage
soat list-agent-versions --agent-id <string>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string
--limit
Maximum number of results to return
- Source:
query - Required: no
- Type:
integer - Default:
50
--offset
Number of results to skip
- Source:
query - Required: no
- Type:
integer - Default:
0
soat get-agent-version
Get an archived agent config version
- Method:
GET - Path:
/api/v1/agents/{agent_id}/versions/{version}
Usage
soat get-agent-version --agent-id <string> --version <integer>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string
--version
—
- Source:
path - Required: yes
- Type:
integer
soat restore-agent-version
Restore an archived config as a new version
- Method:
POST - Path:
/api/v1/agents/{agent_id}/versions/{version}/restore
Usage
soat restore-agent-version --agent-id <string> --version <integer>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string
--version
—
- Source:
path - Required: yes
- Type:
integer
--label
Tag for the version this restore creates. Defaults to restored from v\{version\}.
- Source:
body - Required: no
- Type:
string - Example:
rollback-incident-42
soat set-agent-release
Set or replace a staged rollout
- Method:
PUT - Path:
/api/v1/agents/{agent_id}/release
Usage
soat set-agent-release --agent-id <string> --stable-version <integer> --canary-version <integer> --canary-percent <integer>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string
--stable-version
An existing version to serve as the baseline
- Source:
body - Required: yes
- Type:
integer - Example:
3
--canary-version
An existing version to trial. Must differ from stable_version.
- Source:
body - Required: yes
- Type:
integer - Example:
4
--canary-percent
Percentage of traffic to assign to canary_version
- Source:
body - Required: yes
- Type:
integer - Example:
20
--promotion-gate
Eval to gate promotion on. It must belong to this project and evaluate this agent; anything else is a 400. Omit it, or send null, for a rollout that can be promoted at will.
- Source:
body - Required: no
- Type:
string \| null - Example:
eval_V1StGXR8Z5jdHi6B
soat promote-agent-release
Promote the canary and end the rollout
- Method:
POST - Path:
/api/v1/agents/{agent_id}/release/promote
Usage
soat promote-agent-release --agent-id <string>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string
soat abort-agent-release
Abort the rollout and roll back to stable
- Method:
POST - Path:
/api/v1/agents/{agent_id}/release/abort
Usage
soat abort-agent-release --agent-id <string>
Options
--agent-id
—
- Source:
path - Required: yes
- Type:
string