@revmax/agent-sdk
Version:
Official Node.js SDK for RevMax - billing, customer management, and usage tracking
117 lines (100 loc) • 3.49 kB
JavaScript
/**
* 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);
});