| name | self-config |
| description | Edit the runtime setup via get_setup and patch_setup. Use when the user asks to change the agent model, edge model profiles, agent definitions, or channel display metadata. Covers what is editable, what is operator-only, and the JSON-Pointer patch format. |
| requiresTools | ["get_setup","patch_setup"] |
Self-Config
Use get_setup and patch_setup to read and modify the runtime setup shared by the edge and agent. The setup lives in OpenBao; you never hold a local copy. Every write is validated server-side against an allowlist — anything outside it is rejected regardless of what you pass.
When to Use
Use this skill when the user asks to change one of:
- which model the agent uses —
/agent/model
- which edge model profile a surface routes to —
/edge/modelProfiles/bySurface/<surface>, /edge/modelProfiles/defaultProfile
- agent definition routing and content —
/edge/agentDefinitions/bySurface/<surface>, /edge/agentDefinitions/definitions/<name>
- channel display metadata — Slack team/handle, Telegram bot username/name, AgentMail inbox list, AgentMail poll interval
- session policy for agent sub-sessions —
/edge/agentDefinitions/sessionPolicy
- Langfuse environment tag —
/observability/langfuse/environment
For anything not in this list, push the user to /console — see "Out of Jurisdiction" below.
Workflow
- Read first. Call
get_setup before every patch. It returns { setup, credentialNames, allowlist }. Don't cache across turns.
- Confirm the path. Check your target path against the
allowlist in the response. Allowlist patterns use * to wildcard a single segment.
- Patch atomically.
patch_setup accepts multiple ops in one call and applies them atomically — either all succeed or none do. Prefer one call over several.
- Verify. The response returns the post-patch
setup. Confirm the field landed where you expected before telling the user it's done.
Path Format
Paths are JSON-Pointer (RFC 6901) with / between segments. Leading / is optional.
/edge/modelProfiles/bySurface/slack
/edge/agentDefinitions/definitions/support/body
Escape rules — because some names can contain special characters:
/ inside a segment → ~1
~ inside a segment → ~0
So a trigger slug foo/bar becomes foo~1bar inside a path segment. This only matters when the segment itself contains / or ~; normal keys need no escaping.
Values — any JSON value (string, number, boolean, array, object). Passing null deletes the key at that path.
Out of Jurisdiction
These are human-only and must be changed through the console by the operator. Do not try to patch them — the server will reject the op. If the user asks for one, redirect them explicitly.
- Credentials of any kind. You have no write path to the credential bag. Never attempt to set bot tokens, API keys, signing secrets, or similar. If the user wants to rotate a secret, tell them to do it in
/console.
- Enabling or disabling channels / integrations — any
*.enabled flag.
- Credential references inside setup — anything under a
credentials sub-object (e.g. /edge/slack/credentials/botToken).
- Transport and trust boundaries —
server.*, edge.api.*, edge.sessionMerging.*.
- S3 endpoint / bucket / region, Langfuse host, and custom webhook definitions that require credential wiring.
When in doubt: if get_setup's allowlist doesn't cover the path, it's out of jurisdiction.
Common Patterns
Change the agent model.
{ "ops": [{ "path": "/agent/model", "value": "anthropic/claude-opus-4-7" }] }
Point a surface at a different edge model profile.
{ "ops": [{ "path": "/edge/modelProfiles/bySurface/slack", "value": "fast" }] }
Update an agent definition body.
{ "ops": [{ "path": "/edge/agentDefinitions/definitions/support/body", "value": "You are the support agent. Be concise and verify facts before replying." }] }
Remove a per-surface override (fall back to default).
{ "ops": [{ "path": "/edge/modelProfiles/bySurface/telegram", "value": null }] }
Batch multiple related changes in one atomic call.
{
"ops": [
{ "path": "/edge/modelProfiles/defaultProfile", "value": "balanced" },
{ "path": "/edge/modelProfiles/bySurface/slack", "value": "fast" }
]
}
Failure Modes
Patch path "..." is not in the allowlist — the path is operator-only or you mistyped it. Re-check against get_setup's allowlist field. Do not retry the same path.
- Sanitization drops your value — setup values are validated and normalized after the patch. If a field doesn't appear in the returned setup, the sanitizer rejected it; re-read the setup to see the actual shape expected.
- Verification stamp cleared — rotating a credential (operator-only, not something you can trigger) clears
verifiedAt on any block referencing it. That's expected, not an error.
Reload Semantics
The edge picks up most patched setup values on the next request that reads the OpenBao-backed snapshot. The agent reads parts of setup at boot; assume a restart is needed for changes that affect agent runtime behavior, and tell the user when a restart is relevant.