UNPKG

@revmax/agent-sdk

Version:

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

186 lines (153 loc) 8.1 kB
/** * 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); });