daimon.email
Guides

Agent Autonomy Levels

Spectrum from fully supervised to fully autonomous AI agents

Overview

Not all AI agents need the same level of human oversight. daimon.email supports a spectrum of autonomy levels, from fully supervised agents that require approval for every action, to fully autonomous agents that self-provision resources and handle their own upgrades.

This guide helps you choose the right autonomy level for your use case and explains how daimon.email's features support each level.

The Autonomy Spectrum

graph LR
    A[Level 0<br/>Scripted] --> B[Level 1<br/>Supervised]
    B --> C[Level 2<br/>Monitored]
    C --> D[Level 3<br/>Autonomous]
    D --> E[Level 4<br/>Self-Evolving]

    style A fill:#e74c3c
    style B fill:#e67e22
    style C fill:#f39c12
    style D fill:#27ae60
    style E fill:#3498db
LevelDescriptionHuman Involvementdaimon.email Features
Level 0: ScriptedDeterministic automation, no LLMHuman writes every ruleN/A - not AI
Level 1: SupervisedAgent proposes, human approvesApprove every actionHITL workflows, approval links
Level 2: MonitoredAgent acts, human observesReview logs/dashboardsWebhooks, audit logs, alert triggers
Level 3: AutonomousAgent self-manages operationsIntervene only on exceptionsx402 upgrade links, capability checks, auto-provisioning
Level 4: Self-EvolvingAgent improves itself over timePeriodic review of outcomesModel fine-tuning, A/B testing (future)

Info

Most production AI agents operate at Level 2 (Monitored) — agents take routine actions automatically but humans receive notifications and can intervene when needed.

Level 1: Supervised Agents

Use when: High-stakes operations, new agent deployments, regulatory requirements, or when building operator trust.

How it works

Every action requires explicit human approval before execution:

  1. Agent detects opportunity to send email
  2. Agent requests approval via POST /v1/notify-operator
  3. Operator receives approval link (Slack, SMS, email)
  4. Operator reviews context and approves/rejects
  5. Agent proceeds only if approved
import { DaimonClient } from '@daimon/sdk';

const client = new DaimonClient({ apiKey: process.env.DAIMON_API_KEY });

async function sendWithApproval(draft: EmailDraft) {
  // Request approval
  const approval = await client.approvals.create({
    action_type: 'send_email',
    action_context: {
      to: draft.to,
      subject: draft.subject,
      preview: draft.text.substring(0, 200),
    },
    operator_message: `Agent wants to send "${draft.subject}" to ${draft.to}`,
    expires_in_seconds: 3600,
  });

  // Notify operator (via Slack, etc.)
  await notifySlack({
    text: `Approval needed: ${approval.magic_link}`,
    channel: '#agent-approvals',
  });

  // Wait for decision
  const decision = await pollForDecision(approval.approval_id);

  if (decision.status === 'approved') {
    return await client.inboxes.send(inboxId, draft);
  } else {
    throw new Error(`Approval rejected: ${decision.rejection_reason}`);
  }
}
from daimon import DaimonClient

client = DaimonClient(api_key=os.environ['DAIMON_API_KEY'])

def send_with_approval(draft):
    # Request approval
    approval = client.approvals.create(
        action_type='send_email',
        action_context={
            'to': draft['to'],
            'subject': draft['subject'],
            'preview': draft['text'][:200]
        },
        operator_message=f"Agent wants to send \"{draft['subject']}\" to {draft['to']}",
        expires_in_seconds=3600
    )

    # Notify operator
    notify_slack({
        'text': f"Approval needed: {approval.magic_link}",
        'channel': '#agent-approvals'
    })

    # Wait for decision
    decision = poll_for_decision(approval.approval_id)

    if decision.status == 'approved':
        return client.inboxes.send(inbox_id, draft)
    else:
        raise Exception(f"Approval rejected: {decision.rejection_reason}")

See Human-in-the-Loop for full implementation details.

Level 2: Monitored Agents

Use when: Routine operations, trusted agent patterns, or when operator time is limited.

How it works

Agents act autonomously but emit telemetry for human monitoring:

  • Send emails without approval
  • Log all actions to dashboard
  • Alert operator on anomalies or errors
  • Operator can pause/override at any time
// Agent sends email immediately
const sent = await client.inboxes.send(inboxId, {
  to: 'customer@company.com',
  subject: 'Re: Support ticket #1234',
  text: 'I found a solution to your issue...',
});

// But logs action for operator visibility
await logToDatadog({
  event: 'agent.email_sent',
  to: sent.to,
  subject: sent.subject,
  message_id: sent.message_id,
  confidence: 0.92,
});

// And sends FYI notification (not approval request)
await notifySlack({
  text: `Agent sent email to ${sent.to[0]}: "${sent.subject}"`,
  channel: '#agent-activity',
  priority: 'low',
});
# Send email immediately
sent = client.inboxes.send(
    inbox_id=inbox_id,
    to='customer@company.com',
    subject='Re: Support ticket #1234',
    text='I found a solution to your issue...'
)

# Log for monitoring
log_to_datadog({
    'event': 'agent.email_sent',
    'to': sent.to,
    'subject': sent.subject,
    'message_id': sent.message_id,
    'confidence': 0.92
})

# FYI notification
notify_slack({
    'text': f"Agent sent email to {sent.to[0]}: \"{sent.subject}\"",
    'channel': '#agent-activity',
    'priority': 'low'
})

Transition strategy: Supervised → Monitored

Gradually reduce approval requirements as trust builds:

// Week 1: Approve everything
const needsApproval = () => true;

// Week 2: Auto-approve routine support responses
const needsApproval = (email) => {
  return !email.subject.startsWith('Re: Support ticket');
};

// Week 3: Auto-approve messages under 500 chars
const needsApproval = (email) => {
  return email.text.length > 500 || email.attachments.length > 0;
};

// Week 4: Auto-approve everything except VIP contacts
const needsApproval = (email) => {
  return VIP_CONTACTS.includes(email.to);
};

// Month 2: Full monitoring mode, no approvals
const needsApproval = () => false;

Level 3: Autonomous Agents

Use when: Mature agent deployments, agents managing other agents, or fully automated workflows.

How it works

Agents self-manage their infrastructure and handle capability upgrades autonomously:

  1. Self-provisioning - Create inboxes as needed
  2. Self-upgrading - Detect capability limits and upgrade automatically
  3. Self-healing - Recover from errors without human intervention
  4. Self-optimizing - A/B test and improve performance over time

Note

Level 3 autonomy requires x402 Payment Required flow (Sprint 3 feature). Agents detect tier limits and autonomously upgrade by submitting payment methods.

Example: Self-upgrading agent

async function sendEmail(draft: EmailDraft) {
  try {
    // Attempt to send
    return await client.inboxes.send(inboxId, draft);
  } catch (error) {
    if (error.code === 'SEND_REQUIRES_PAID') {
      // Agent detects it needs paid tier
      console.log('Send capability requires upgrade. Initiating autonomous upgrade...');

      // Check if operator pre-authorized auto-upgrades
      const config = await getAgentConfig();
      if (config.auto_upgrade_enabled && config.payment_method_on_file) {
        // Autonomously upgrade using x402 flow
        const upgrade = await client.account.upgrade({
          tier: 'starter',
          payment_method_id: config.payment_method_id,
          initiated_by: 'agent_autonomous',
        });

        console.log(`Upgraded to ${upgrade.tier}. Retrying send...`);

        // Retry now that we have capability
        return await client.inboxes.send(inboxId, draft);
      } else {
        // Fall back to operator notification
        await notifyOperator({
          message: error.upgrade_context.agent_script,
          action_url: error.upgrade_context.operator_action_url,
          urgency: 'medium',
        });

        throw error;
      }
    }

    throw error; // Other errors bubble up
  }
}

Capability checks

Before taking action, autonomous agents check capabilities:

// Check what the agent can do
const capabilities = await client.account.capabilities();

console.log(capabilities);
// {
//   can_send: false,
//   can_create_inboxes: true,
//   can_use_webhooks: true,
//   send_limit_daily: 0,
//   inbox_limit: 10,
//   upgrade_required_for: ['sending', 'custom_domains', 'smtp_access']
// }

// Decide whether to proceed or upgrade
if (!capabilities.can_send) {
  console.log('Cannot send emails. Checking if auto-upgrade is authorized...');

  if (await isAutoUpgradeAuthorized()) {
    await autonomousUpgrade('starter');
  } else {
    await requestOperatorUpgrade();
  }
}

Level 4: Self-Evolving Agents

Use when: Cutting-edge research, AGI development, or fully delegated agent operations.

How it works

Agents not only manage their operations but improve their own decision-making over time:

  • Fine-tune models based on operator feedback
  • A/B test email copy and measure engagement
  • Adapt tone/style to recipient preferences
  • Learn from approval/rejection patterns

Info

Level 4 features are experimental and planned for future releases. Current daimon.email API supports up to Level 3 autonomy.

Conceptual example (future)

// Agent logs all sent emails and outcomes
await client.analytics.logOutcome({
  message_id: sent.message_id,
  outcome: 'reply_received',
  reply_time_seconds: 3600,
  sentiment: 'positive',
});

// Over time, agent fine-tunes its email generation
const trainingData = await client.analytics.export({
  outcome: 'reply_received',
  sentiment: 'positive',
  limit: 1000,
});

await finetuneModel({
  base_model: 'gpt-4',
  training_data: trainingData.map(msg => ({
    prompt: msg.context,
    completion: msg.text,
    weight: msg.reply_time_seconds < 7200 ? 1.5 : 1.0, // Prioritize fast replies
  })),
});

Choosing the Right Level

Level 1: Supervised

Best for: New agents, compliance-heavy industries, high-stakes communications (legal, medical, finance)

Level 2: Monitored

Best for: Customer support, sales outreach, internal notifications, routine operations

Level 3: Autonomous

Best for: Agent-to-agent communication, infrastructure management, scalable automation

Level 4: Self-Evolving

Best for: Research projects, experimental deployments, AGI systems (future)

daimon.email Features by Autonomy Level

FeatureLevel 1Level 2Level 3Level 4
Human approval workflows✅ Required⚠️ Optional❌ Disabled❌ Disabled
Webhook notifications
Audit logs
Capability checks
x402 upgrade links✅ Operator clicks✅ Operator clicks✅ Agent triggers✅ Agent triggers
Auto-provisioning⚠️ Limited✅ Full✅ Full
Self-upgrading
Model fine-tuning🔮 Future

Best Practices

  1. Start supervised, graduate to autonomous - Begin at Level 1, increase autonomy as trust builds
  2. Log everything - Even autonomous agents should emit telemetry for debugging
  3. Set guardrails - Use rate limits, spending caps, and recipient allowlists
  4. Monitor error rates - Sudden spikes in errors may indicate agent malfunction
  5. Version your agent logic - Track which version sent which email for rollback capability
  6. Test in sandbox - Use test API keys and sandbox inboxes before production deployment

Next Steps