UNPKG

@revmax/agent-sdk

Version:

Official Node.js SDK for RevMax - billing, customer management, and usage tracking

117 lines (100 loc) 3.49 kB
/** * RevMax SDK - Batch Events (5 Events in One Call) * * Send multiple events in a single API call for better performance. * Use this pattern when you have multiple events to record at once. * * Benefits: * - Fewer API calls = lower latency * - Atomic operation - all succeed or detailed error per event * - Ideal for bulk imports or high-throughput scenarios * * Usage: * REVMAX_API_KEY=revx_pk_xxx node 04-batch-events.js */ const { RevMaxClient } = require('../dist'); // Configuration const API_KEY = process.env.REVMAX_API_KEY || 'revx_pk_your_api_key_here'; const BASE_URL = process.env.REVMAX_API_URL || 'http://localhost:3005/v1/sdk'; const AGENT_ID = 'd1d6e514-faae-4e47-a100-0f2757d69849'; const CUSTOMER_EXTERNAL_ID = 'customer-4398bad1-9c3b-46f7-be7b-25e8770d0524'; // Helper to generate random token count function randomTokens(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } // Generate 5 events for batch processing function generateEvents() { const signals = [ 'qbr_generated', 'success_plan_created', 'customer_research_report', 'hours_saved', 'customer_retained', ]; return signals.map((signalName, index) => ({ customerExternalId: CUSTOMER_EXTERNAL_ID, agentId: AGENT_ID, signalName: signalName, quantity: signalName === 'hours_saved' ? randomTokens(2, 8) : 1, // hours_saved can be multiple usageDate: new Date().toISOString(), metadata: { batchIndex: index + 1, usageCost: [ { serviceName: 'Anthropic Claude Sonnet Input', provider: 'Anthropic', units: randomTokens(10000, 50000), unitType: 'token', }, { serviceName: 'Anthropic Claude Sonnet Output', provider: 'Anthropic', units: randomTokens(2000, 10000), unitType: 'token', }, ], }, })); } async function main() { console.log('🚀 RevMax SDK - Batch Events (5 at once)\n'); // Create and connect client const client = new RevMaxClient(API_KEY, { baseURL: BASE_URL, logging: { enabled: false }, }); await client.connect(); console.log(`✅ Connected to: ${client.getOrganization().name}\n`); // Generate 5 events const events = generateEvents(); console.log(`📤 Sending ${events.length} events in one batch...\n`); console.log('Events to send:'); events.forEach((e, i) => { console.log(` ${i + 1}. ${e.signalName} (qty: ${e.quantity})`); }); console.log(''); // Send all events in ONE API call using records array const startTime = Date.now(); const result = await client.trackEvent({ records: events, }); const duration = Date.now() - startTime; console.log(`✅ Batch completed in ${duration}ms\n`); console.log('📊 Results:'); console.log(` Total records: ${result.totalRecords}`); console.log(` Success: ${result.success}`); // Show individual results if available if (result.results) { console.log('\n Individual results:'); result.results.forEach((r, i) => { const status = r.success ? '✅' : '❌'; const eventId = r.responseData?.signalEvent?.id || 'N/A'; const cost = r.responseData?.timeline?.find((t) => t.event_type === 'cost')?.amount || 0; console.log(` ${status} [${i + 1}] Event ID: ${eventId.slice(0, 8)}... | Cost: $${cost.toFixed(4)}`); }); } } main().catch((err) => { console.error('❌ Error:', err.message); process.exit(1); });