Skip to content

Profiles

A profile is a template for an agent. When you submit a task, you pick a profile; the platform spins up a workspace using that template.

Profiles are user-owned. You can have many. Common patterns: one for coding, one for personal finance, one for research, one shared across the household.

FieldWhat it does
idprof_<nanoid>. Stable identifier.
slugURL-friendly handle (coding, vzfinance). How you @mention the profile in Slack/Telegram. Unique per user.
nameDisplay name.
modelAnthropic model id (claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5) or Ollama model id.
api_key_idWhich API key in your api_keys vault to bill against.
default_toolsDefault tool list (Bash, Read, Write, WebSearch, WebFetch, custom tool ids).
mcp_serversWhich MCP servers to inject (memory, notify, gmail, teller, vonzio, or custom HTTP MCPs).
skill_ids, tool_ids, agent_idsCurated skills / custom tools / subagent definitions.
claude_mdThe system prompt. Plain text. This is where you encode the agent’s personality, scope, and rules.
memory_enabledWhether the memory MCP server is injected. Defaults true.
persistent_sessionsWhether new workspaces use named volumes (see Workspaces).
setup_commandsBash commands to run inside fresh containers (e.g. apt-get install, env setup).
concurrency_limitMax simultaneous workspaces per this profile.
max_turns, max_budget_usdPer-task safety limits.

This is the system prompt that defines who the agent is and what it should do. A good claude_md:

  • States the agent’s name and one-line purpose
  • Lists the data sources it has access to and what to do with them
  • States any hard rules (never modify .env, always check reminders_sent before nudging)
  • Provides format/style guidance for its outputs
  • Provides example interactions

For a real example see VZFinance’s claude_md field in the production DB (select claude_md from profiles where slug = 'vzfinance').

EndpointPurpose
GET /v1/profilesList your profiles.
POST /v1/profilesCreate a profile.
GET /v1/profiles/:idOne profile (incl. claude_md and tool/skill/agent ids).
PATCH /v1/profiles/:idUpdate fields.
DELETE /v1/profiles/:idDelete the profile. Workspaces using it still exist but you can’t start new ones.
GET /v1/profiles/:id/modelsList models available to this profile (filtered by the linked API key’s capabilities).

When the caller doesn’t specify a profile (e.g. inbound Slack message with no @slug prefix), the platform picks one in this order:

  1. Explicit @slug token in the prompt.
  2. The bot’s bound_profile_id (Telegram only — see Telegram integration).
  3. The user’s first profile (legacy fallback).

Profiles are cheap. Don’t over-think it. If two agents share 90% of a claude_md but differ in tools or model, just make two profiles. Sharing claude_md text by reference isn’t supported.