Agents
Configure a governed workspace agent, authorize its tools and its spend separately, and inspect every run it produces.
An Agent is a workspace worker that takes one goal and executes it as a durable, inspectable run. The Workspace Agent and every custom agent are pinned to an immutable version — instructions, model, tool policy — so a chat already in flight never changes underneath you.
Two separate gates. Nav: /agents is beta-gated — the sidebar item under Action stays hidden until someone turns on Beta features in Settings; the pages still load if you type the URL. Execution: starting a run is gated by the platform switch OXYGEN_AGENTS_ENABLED. When it is off the roster, the settings form, and oxygen agent create keep working, but starting a chat fails with feature_disabled — "Workspace Agent execution is not enabled." It is a platform-wide switch, not a per-workspace setting — support can tell you whether execution is live.
Ongoing sessions (staff dev preview)
Staff on the dev deployment can open Agents → Workspace Agent → Sessions, or the Sessions tab of a custom Agent. Each session is a separate continuing job with its own goal, conversation, memory, schedule and spend caps.
Choose Campaign monitor, Lead replenishment, Reply handling, Deliverability, Account research, Inbound qualification, CRM hygiene, Pipeline review or Custom job. Select exact native resources and create a draft. Describe the job in chat or edit its settings; proposed settings need your review. Draft chat uses the entered credit caps and cannot perform writes. Review activation shows the exact version, resources, standing actions, schedule and budgets. Approve and activate grants that scope once. Later scope changes pause work and require another review.
Every check reserves the per-run cap against the rolling 24-hour cap and optional lifetime cap. Confirmed costs replace the hold; uncertain costs remain held. A session can choose its next check within the earliest/latest bounds. It waits when its daily budget is full and pauses when its lifetime budget is exhausted. Pause, Resume, Complete and Archive preserve its conversation and run history. Run links show detailed actions, costs and approvals.
oxygen agent session templates --slug workspace --json
oxygen agent session create --slug workspace --config-json '{
"title": "Campaign monitor", "goal": "Review this campaign each day",
"template": "campaign-monitor",
"resources": {"sequences": ["<campaign-id>"], "tables": [],
"conversations": [], "mailboxes": [], "records": [], "objects": [],
"knowledge": [], "domains": []},
"actions": [], "events": [],
"schedule": {"interval_minutes": 1440, "min_interval_minutes": 60,
"max_interval_minutes": 10080},
"budget": {"per_run_credits": 5, "daily_credits": 20}
}' --json
oxygen agent session get --slug workspace --session <session-id> --json
oxygen agent session preview --slug workspace --session <session-id> --json
oxygen agent session activate --slug workspace --session <session-id> \
--revision 1 --preview-token <token-from-preview> --approved --json
oxygen agent session run --slug workspace --session <session-id> --json
oxygen agent session webhook --slug workspace --session <session-id> --json
oxygen agent session pause --slug workspace --session <session-id> --json
oxygen agent session resume --slug workspace --session <session-id> --jsonrun starts an active session's next check now, within its caps. webhook returns a URL and a secret, shown once; another tool posts a JSON object to the URL with the x-oxygen-agent-webhook-secret header (add x-oxygen-delivery-id so a retry counts once), and each delivery wakes the active session within its caps. A delivery comes from outside your workspace: from its first one on, the session asks before every external write. Run webhook again to rotate the secret, or pass --remove to delete it.
Use oxygen agent session create --help for flags. Pass the configuration as JSON directly; MCP exposes the same operations as oxygen_agent_session_*. Configuration needs title, goal, template, exact resources arrays, actions, events, schedule (interval, minimum and maximum minutes), and budget (per_run_credits, daily_credits, optional lifetime_credits). ends_at is optional. Only selected resources and reviewed native actions qualify for standing authority. Workflows remain the deterministic orchestration primitive; generic workflow dispatch, browser/voice autonomy and autonomous delegation are outside this preview.
Production and restricted client logins cannot access this preview. Existing specialists and manual Agent chats keep their existing entry points.
The roster
| Agent | Slug | What it does | Configure with |
|---|---|---|---|
| Workspace Agent | workspace | Runs organization-grounded goals through the governed capability catalog | oxygen agent set workspace |
| AI Sales Agent | inbox-reply-drafts | Drafts inbox replies — nothing sends without your approval | oxygen inbox reply-agent |
| AI Meeting Notetaker | meeting-notetaker | Joins meetings in its configured scope to record, transcribe, and file notes | oxygen notetaker setup |
| AI Knowledge Agent | knowledge-synthesis | Distills outreach and meeting learnings into knowledge pages | oxygen knowledge agent |
| AI Inbox Tagger | inbox-auto-tagger | Auto-tags new inbound conversations from your tag allowlist | oxygen inbox auto-tagger |
| Your custom agents | your slug | Whatever you write into the system prompt | oxygen agent set <slug> |
oxygen agent list shows the built-ins, oxygen agent custom lists yours. oxygen agent enable <slug> and disable <slug> accept built-in slugs only; a custom agent is retired with oxygen agent delete <slug> (archive — versions and runs are preserved).
Tool authority is not spend authority
A published version grants standing tool authorization. It grants no money.
Tool access is set per version. On /agents/new and on the Settings tab, the Tool access picker offers four presets:
| Preset | Behavior |
|---|---|
| Read only | Inspects workspace data. No writes, no paid tools. |
| Ask before changes | Reads freely, pauses before every paid call or write. The default. |
| Specific tools | Only the tools you pick; new paid or write selections ask first. |
| Full access | Uses eligible tools without asking — requires ticking the authorization checkbox first. |
The CLI equivalent is --tool-policy-json on agent create / agent set, with --confirm-full-access for "mode":"full".
Spend is authorized separately, every time:
- A manual run requires an explicit ceiling.
oxygen agent runmakes both--max-creditsand--approvedrequired flags — there is no unbounded run, and no version setting removes them. - A cron, event, or webhook trigger persists a per-delivery ceiling:
oxygen agent trigger-createalso requires--max-creditsand--approved, and each firing is bounded by that number, not by the run before it. - Your plan sets a default Agent run ceiling. A
--max-creditsabove it needs one more approval, for that run or trigger only:--approve-above-defaulton the CLI,approve_above_default: trueon MCP, and a confirmation card in the web app. Without it the request is refused withapproval_required(details.approval_kind: agent_ceiling_above_default), and nothing starts.
Four things are enforced outside the model and cannot be prompted away: a platform deny list (agent self-management, credentials and secrets, billing, admin, support, Copilot, org selection, integration connect/disconnect, directory publishing); a scoped policy denying anything it does not explicitly match; full mode denying everything until standing authorization is recorded on the version; and the per-run credit ceiling. A run spends at most its approved --max-credits, and never more than the default ceiling unless you approved the higher number for it. oxygen limits show --json reports the default as spend_safety_defaults.agent_run_max_total_credits (and agent_run_max_inference_credits for the run's own model calls), and the pricing reference lists every size's. No approval goes above agent_run_approved_max_credits (25,000 credits), and the balance check, the daily spend guard and the run's upstream-cost, step and time bounds still apply. Grandfathered Starter, Pro, and Team keep the size their price maps to; Enterprise uses the $1,999 plan default. A paid tool call that arrives without its own credit cap is refused with agent_paid_capability_requires_max_credits.
Create one
Web: /agents → New agent → /agents/new. Fill Name, System prompt, Model (Oxygen Fast, Oxygen Balanced — the default — or Oxygen Max), and Tool access, then Create agent. The slug is generated from the name.
CLI — free, starts no run, spends nothing:
oxygen agent create lead-research \
--name "Lead research agent" \
--instructions "Research inbound signups and write a one-paragraph brief onto their CRM record." \
--model-policy-json '{"level":"medium"}' \
--tool-policy-json '{"mode":"scoped","rules":[{"decision":"allow","effect":"read"}]}'Editing configuration publishes a new immutable version. On /agents/<slug>?tab=settings that is the Save settings button; from the terminal it is oxygen agent set <slug> --instructions "…". Chats already running stay pinned to the version they started on.
Run it
oxygen agent run is the paid entry point — it starts the run and its spend.
oxygen agent run lead-research \
--goal "Brief the five newest inbound signups" \
--max-credits 200 --approvedIn the web app, the Chats tab on /agents/<slug> has Start a chat: a Prompt box, a Maximum credits input, and the Start chat button. Starting approves managed inference and permitted tool actions up to that ceiling — nothing above it. A maximum above your default Agent run ceiling opens a card naming both numbers; Approve and start approves it for that chat only.
oxygen agent runs lead-research --json # newest first
oxygen agent run-get lead-research <run-id> # append-only event ledger
oxygen agent cancel lead-research <run-id>Each run has a transcript at /agents/<slug>/runs/<run-id>. When an ask rule pauses a tool call, decide it there with Approve and resume or Reject, or from the terminal:
oxygen agent approval-decide lead-research <run-id> <approval-id> --decision approvedTriggers, files, MCP
Triggers have no web screen. oxygen agent triggers workspace lists them; oxygen agent trigger-set workspace <trigger-id> --status paused stops deliveries without deleting one. A new trigger carries its standing per-delivery ceiling:
oxygen agent trigger-create workspace --type cron \
--cron "0 9 * * 1" --timezone Europe/Berlin \
--instruction "Summarize last week's replies" \
--max-credits 100 --approvedAttach text context with oxygen agent file-create --name notes.md --text "…", list it with oxygen agent files, pass it to a run with --file-ids.
The agent MCP tools (oxygen_agent_run, oxygen_agent_approval_decide, and the rest) are not in the default set a fresh client sees. Reconnect with ?toolset=agents to load them; they are listed in the MCP reference. An agent can never manage or run agents through them: create, update, delete, enable, disable, run, cancel, approval-decide, and trigger create/set are all on the platform deny list.