Headless Agent

    Execute agents programmatically without a UI — perfect for automation, cron jobs, and backend workflows.

    Simple Execution

    run-agent.ts
    import { CadraClient } from '@cadraos/sdk';
    
    const client = new CadraClient({
      apiKey: process.env.CADRA_API_KEY!,
      orgId: Number(process.env.CADRA_ORG_ID),
    });
    
    const result = await client.agents.executeSync('agent-uuid', {
      task: 'Summarize the latest sales data and identify trends',
      context: {
        department: 'Sales',
        period: 'Q4 2025',
      },
    });
    
    console.log('Output:', result.output);
    console.log('Tool calls:', result.toolResults?.length ?? 0);

    Batch Processing

    batch.ts
    const items = ['report-1.pdf', 'report-2.pdf', 'report-3.pdf'];
    
    const results = await Promise.all(
      items.map(item =>
        client.agents.executeSync('analysis-agent', {
          task: `Analyze document: ${item}`,
          attachmentIds: [item],
        })
      )
    );
    
    results.forEach((r, i) => {
      console.log(`${items[i]}: ${r.output?.slice(0, 100)}...`);
    });

    Streaming with Progress

    stream.ts
    const stream = await client.agents.stream('agent-uuid', {
      task: 'Generate a comprehensive market analysis',
    });
    
    stream.on('progress', ({ percent, message }) => {
      console.log(`[${percent}%] ${message}`);
    });
    
    stream.on('toolCall', ({ name, input }) => {
      console.log(`  Tool: ${name}(${JSON.stringify(input).slice(0, 80)})`);
    });
    
    stream.on('textDelta', ({ delta }) => process.stdout.write(delta));
    
    stream.on('complete', ({ execution }) => {
      console.log('\nCompleted in', execution.completedAt);
    });
    
    await stream.connect();

    Error Handling

    typescript
    import { RateLimitError, CadraError } from '@cadraos/sdk';
    
    try {
      const result = await client.agents.executeSync('agent-uuid', {
        task: 'Process data',
      });
    } catch (error) {
      if (error instanceof RateLimitError) {
        console.log(`Rate limited. Retry after ${error.retryAfter}s`);
        await new Promise(r => setTimeout(r, (error.retryAfter ?? 5) * 1000));
        // retry...
      } else if (error instanceof CadraError) {
        console.error(`API Error ${error.status}: ${error.message}`);
      }
    }