@revmax/agent-sdk
Version:
Official Node.js SDK for RevMax - billing, customer management, and usage tracking
186 lines (153 loc) • 8.1 kB
JavaScript
/**
* RevMax SDK - Full Workflow Example
*
* Complete end-to-end example demonstrating:
* 1. Connect to API
* 2. Create a customer
* 3. Track individual events
* 4. Track batch events
* 5. Show summary
*
* This simulates a real-world AI agent workflow.
*
* Usage:
* REVMAX_API_KEY=revx_pk_xxx node 06-full-workflow.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 DEMO_CUSTOMER_ID = 'customer-4398bad1-9c3b-46f7-be7b-25e8770d0524';
// Helper functions
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function randomTokens(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
async function main() {
console.log('═══════════════════════════════════════════════════════════');
console.log(' 🚀 RevMax SDK - Full Workflow Example');
console.log('═══════════════════════════════════════════════════════════\n');
let totalCost = 0;
let eventsTracked = 0;
// ─────────────────────────────────────────────────────────────
// Step 1: Initialize and Connect
// ─────────────────────────────────────────────────────────────
console.log('📡 Step 1: Connecting to RevMax API...');
const client = new RevMaxClient(API_KEY, {
baseURL: BASE_URL,
logging: { enabled: false },
});
await client.connect();
const org = client.getOrganization();
console.log(` ✅ Connected to: ${org.name}\n`);
// ─────────────────────────────────────────────────────────────
// Step 2: Create a Demo Customer
// ─────────────────────────────────────────────────────────────
console.log('👤 Step 2: Creating demo customer...');
const customerId = `workflow-demo-${Date.now()}`;
const customer = await client.customers.create({
name: 'Workflow Demo Customer',
externalId: customerId,
email: 'demo@example.com',
status: 'active',
metadata: { source: 'sdk-example' },
});
console.log(` ✅ Customer created: ${customer.name}`);
console.log(` External ID: ${customerId}\n`);
// Note: In production, you would also need an active subscription
// for this customer. Using existing customer for demo.
// ─────────────────────────────────────────────────────────────
// Step 3: Track Individual Events (Simulating AI Workflow)
// ─────────────────────────────────────────────────────────────
console.log('📊 Step 3: Tracking individual events...\n');
const workflowSteps = [
{
name: 'Customer Research',
signal: 'customer_research_report',
inputTokens: randomTokens(15000, 25000),
outputTokens: randomTokens(3000, 5000),
},
{
name: 'Success Plan Creation',
signal: 'success_plan_created',
inputTokens: randomTokens(8000, 12000),
outputTokens: randomTokens(2000, 4000),
},
];
for (const step of workflowSteps) {
console.log(` 🔄 ${step.name}...`);
const result = await client.trackEvent({
customerExternalId: DEMO_CUSTOMER_ID,
agentId: AGENT_ID,
signalName: step.signal,
quantity: 1,
metadata: {
usageCost: [
{ serviceName: 'Anthropic Claude Sonnet Input', units: step.inputTokens, unitType: 'token' },
{ serviceName: 'Anthropic Claude Sonnet Output', units: step.outputTokens, unitType: 'token' },
],
},
});
const cost = result.timeline?.find((t) => t.event_type === 'cost')?.amount || 0;
totalCost += cost;
eventsTracked++;
console.log(` ✅ Tracked | Tokens: ${(step.inputTokens + step.outputTokens).toLocaleString()} | Cost: $${cost.toFixed(4)}`);
await sleep(200); // Simulate processing time
}
console.log('');
// ─────────────────────────────────────────────────────────────
// Step 4: Track Batch Events (End of Day Summary)
// ─────────────────────────────────────────────────────────────
console.log('📦 Step 4: Tracking batch events (QBRs generated today)...\n');
const batchEvents = [
{ signalName: 'qbr_generated', quantity: 1, inputTokens: 30000, outputTokens: 8000 },
{ signalName: 'qbr_generated', quantity: 1, inputTokens: 28000, outputTokens: 7500 },
{ signalName: 'qbr_generated', quantity: 1, inputTokens: 32000, outputTokens: 9000 },
];
const records = batchEvents.map((event, i) => ({
customerExternalId: DEMO_CUSTOMER_ID,
agentId: AGENT_ID,
signalName: event.signalName,
quantity: event.quantity,
usageDate: new Date().toISOString(),
metadata: {
batchId: `batch-${Date.now()}`,
index: i + 1,
usageCost: [
{ serviceName: 'Anthropic Claude Sonnet Input', units: event.inputTokens, unitType: 'token' },
{ serviceName: 'Anthropic Claude Sonnet Output', units: event.outputTokens, unitType: 'token' },
],
},
}));
console.log(` 📤 Sending ${records.length} QBR events in one batch...`);
const batchResult = await client.trackEvent({ records });
console.log(` ✅ Batch complete!`);
if (batchResult.results) {
batchResult.results.forEach((r, i) => {
const cost = r.responseData?.timeline?.find((t) => t.event_type === 'cost')?.amount || 0;
totalCost += cost;
eventsTracked++;
console.log(` [${i + 1}] QBR Generated | Cost: $${cost.toFixed(4)}`);
});
}
console.log('');
// ─────────────────────────────────────────────────────────────
// Step 5: Summary
// ─────────────────────────────────────────────────────────────
console.log('═══════════════════════════════════════════════════════════');
console.log(' 📈 WORKFLOW SUMMARY');
console.log('═══════════════════════════════════════════════════════════');
console.log(` Organization: ${org.name}`);
console.log(` Events Tracked: ${eventsTracked}`);
console.log(` Total Cost: $${totalCost.toFixed(4)}`);
console.log('═══════════════════════════════════════════════════════════\n');
console.log('✅ Full workflow example complete!');
}
main().catch((err) => {
console.error('❌ Error:', err.message);
console.error(err.stack);
process.exit(1);
});