@revmax/agent-sdk
Version:
Official Node.js SDK for RevMax - billing, customer management, and usage tracking
100 lines (84 loc) • 3.06 kB
JavaScript
/**
* RevMax SDK - Multiple Single Events (One at a Time)
*
* Send 3 events sequentially, one API call per event.
* Use this pattern when events happen at different times or need individual tracking.
*
* Usage:
* REVMAX_API_KEY=revx_pk_xxx node 03-multiple-single-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';
// Events to track (simulating a customer success workflow)
const EVENTS = [
{
signalName: 'customer_research_report',
quantity: 1,
metadata: {
usageCost: [
{ serviceName: 'Anthropic Claude Sonnet Input', units: 15000, unitType: 'token' },
{ serviceName: 'Anthropic Claude Sonnet Output', units: 3000, unitType: 'token' },
],
},
},
{
signalName: 'success_plan_created',
quantity: 1,
metadata: {
usageCost: [
{ serviceName: 'OpenAI GPT-4 Turbo Input', units: 8000, unitType: 'token' },
{ serviceName: 'OpenAI GPT-4 Turbo Output', units: 2000, unitType: 'token' },
],
},
},
{
signalName: 'qbr_generated',
quantity: 1,
metadata: {
usageCost: [
{ serviceName: 'Anthropic Claude Sonnet Input', units: 25000, unitType: 'token' },
{ serviceName: 'Anthropic Claude Sonnet Output', units: 5000, unitType: 'token' },
],
},
},
];
async function main() {
console.log('🚀 RevMax SDK - Multiple Single Events\n');
// Create and connect client
const client = new RevMaxClient(API_KEY, {
baseURL: BASE_URL,
logging: { enabled: false }, // Quiet mode for cleaner output
});
await client.connect();
console.log(`✅ Connected to: ${client.getOrganization().name}\n`);
console.log(`📤 Sending ${EVENTS.length} events one at a time...\n`);
// Track each event individually
for (let i = 0; i < EVENTS.length; i++) {
const event = EVENTS[i];
console.log(`[${i + 1}/${EVENTS.length}] Tracking: ${event.signalName}`);
const result = await client.trackEvent({
customerExternalId: CUSTOMER_EXTERNAL_ID,
agentId: AGENT_ID,
signalName: event.signalName,
quantity: event.quantity,
usageDate: new Date().toISOString(),
metadata: event.metadata,
});
// Extract cost from timeline
const costEvent = result.timeline?.find((t) => t.event_type === 'cost');
const cost = costEvent?.amount || 0;
console.log(` ✅ Event ID: ${result.signalEvent?.id}`);
console.log(` 💰 Cost: $${cost.toFixed(4)}\n`);
// Small delay between events (optional, for realistic pacing)
await new Promise((resolve) => setTimeout(resolve, 100));
}
console.log('✅ All events tracked successfully!');
}
main().catch((err) => {
console.error('❌ Error:', err.message);
process.exit(1);
});