| name | self-config |
| description | Edit the runtime setup via get_setup and patch_setup. Use when the user asks to change the agent model, routing profiles, Composio trigger prompts, 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 that apps/proxy, apps/assemblio, and apps/gateway share. The setup lives in OpenBao on the proxy; 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 gateway profile a surface routes to —
/proxy/modelProfiles/bySurface/<surface>, /proxy/modelProfiles/defaultProfile
- how a gateway profile is defined —
/gateway/profiles/<name>
- a Composio trigger's prompt or routing —
/composio/triggers/<slug>, /composio/triggers/<slug>/message
- channel display metadata — Slack team/handle, Telegram bot username/name, Discord bot username/id, AgentMail inbox list, AgentMail poll interval
- session policy for agent sub-sessions —
/proxy/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.
/proxy/modelProfiles/bySurface/slack
/composio/triggers/gmail.new_message/message
Escape rules — because some Composio slugs and similar keys 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. /proxy/slack/credentials/botToken).
- Transport and trust boundaries —
server.*, proxy.api.*, proxy.sessionMerging.*.
- S3 endpoint / bucket / region, Langfuse host, new Composio trigger slugs (creating a new trigger requires wiring a credential/webhook first).
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 gateway profile.
{ "ops": [{ "path": "/proxy/modelProfiles/bySurface/slack", "value": "fast" }] }
Update a Composio trigger's prompt.
{ "ops": [{ "path": "/composio/triggers/gmail.new_message/message", "value": "A new email arrived. Summarize and decide if it needs a reply." }] }
Remove a per-surface override (fall back to default).
{ "ops": [{ "path": "/proxy/modelProfiles/bySurface/telegram", "value": null }] }
Batch multiple related changes in one atomic call.
{
"ops": [
{ "path": "/proxy/modelProfiles/defaultProfile", "value": "balanced" },
{ "path": "/proxy/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
apps/proxy may pick up a patched value on the next request that reads the in-memory snapshot. apps/assemblio and apps/gateway read their snapshot at boot — assume a restart is needed for changes there to take effect, and tell the user so when the patch is relevant to those services (e.g. changing /agent/model takes effect on next Assemblio boot).