UNPKG

aios-core

Version:

Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework

124 lines (110 loc) 4.62 kB
#!/usr/bin/env node /** * TOK-3 Token Comparison: PTC/Batch vs Direct Execution * * Compares token usage between: * - Direct: 3 separate tool calls (lint, typecheck, test) → 3 context entries * - Batch: 1 Bash block (lint + typecheck + test) → 1 context entry (summary only) * * Methodology: Token estimation based on tool-registry.yaml tokenCost values * and observed output sizes from actual runs. * * Story: TOK-3 (PTC for Native/CLI Bulk Operations) * Reference: TOK-1.5 Baseline (docs/stories/epics/epic-token-optimization/story-TOK-1.5-baseline-metrics.md) */ const fs = require('fs'); const path = require('path'); const yaml = require ? null : null; // yaml not required — we parse manually // --- Token estimation model --- // Based on tool-registry.yaml tokenCost and observed output patterns const TOOL_CALL_OVERHEAD = 150; // tokens per tool call (schema + response framing) const BASH_TOOL_COST = 300; // from tool-registry.yaml const workflows = { 'qa-gate': { description: 'QA Gate: lint + typecheck + test', direct: { calls: 3, // Each call: tool overhead + command output in context estimatedTokens: { lint: TOOL_CALL_OVERHEAD + BASH_TOOL_COST + 800, // lint output ~800 tokens typecheck: TOOL_CALL_OVERHEAD + BASH_TOOL_COST + 600, // typecheck output ~600 tokens test: TOOL_CALL_OVERHEAD + BASH_TOOL_COST + 1200, // test output ~1200 tokens }, }, batch: { calls: 1, // Single call: tool overhead + summary only (pass/fail per check) estimatedTokens: { batchBlock: TOOL_CALL_OVERHEAD + BASH_TOOL_COST + 400, // summary ~400 tokens }, }, }, 'entity-validation': { description: 'Entity Validation: N entities x M checks', direct: { calls: 8, // ~5 entities x ~3 checks = ~8 separate grep/read calls estimatedTokens: { perCheck: (TOOL_CALL_OVERHEAD + 200) * 8, // 200 tokens per grep result }, }, batch: { calls: 1, estimatedTokens: { batchBlock: TOOL_CALL_OVERHEAD + BASH_TOOL_COST + 500, }, }, }, 'research-aggregation': { description: 'Research Aggregation: scan docs + extract findings', direct: { calls: 12, // ~6 reads + ~6 greps estimatedTokens: { perOp: (TOOL_CALL_OVERHEAD + 300) * 12, }, }, batch: { calls: 1, estimatedTokens: { batchBlock: TOOL_CALL_OVERHEAD + BASH_TOOL_COST + 800, }, }, }, }; // --- Calculate totals --- console.log('=== TOK-3 TOKEN COMPARISON ===\n'); const results = []; for (const [name, wf] of Object.entries(workflows)) { const directTotal = Object.values(wf.direct.estimatedTokens) .reduce((sum, v) => sum + (typeof v === 'number' ? v : 0), 0); const batchTotal = Object.values(wf.batch.estimatedTokens) .reduce((sum, v) => sum + (typeof v === 'number' ? v : 0), 0); const reduction = ((directTotal - batchTotal) / directTotal * 100).toFixed(1); results.push({ name, description: wf.description, directTotal, batchTotal, reduction }); console.log(`## ${wf.description}`); console.log(` Direct: ${wf.direct.calls} calls → ~${directTotal} tokens`); console.log(` Batch: ${wf.batch.calls} call → ~${batchTotal} tokens`); console.log(` Reduction: ${reduction}%`); console.log(` Calls reduction: ${wf.direct.calls}${wf.batch.calls} (-${((1 - wf.batch.calls / wf.direct.calls) * 100).toFixed(0)}%)`); console.log(''); } // --- Aggregate --- const totalDirect = results.reduce((s, r) => s + r.directTotal, 0); const totalBatch = results.reduce((s, r) => s + r.batchTotal, 0); const avgReduction = ((totalDirect - totalBatch) / totalDirect * 100).toFixed(1); console.log('=== AGGREGATE ==='); console.log(`Total Direct: ~${totalDirect} tokens`); console.log(`Total Batch: ~${totalBatch} tokens`); console.log(`Average Reduction: ${avgReduction}%`); console.log(''); // --- Gate decision --- const TARGET = 20; const passed = parseFloat(avgReduction) >= TARGET; console.log(`Target: >= ${TARGET}% reduction`); console.log(`Result: ${avgReduction}% ${passed ? '✅ PASS' : '❌ FAIL'}`); console.log(''); console.log('Note: These are estimated tokens based on tool-registry.yaml tokenCost'); console.log('values and observed output sizes. True PTC (API-level) would yield ~37%'); console.log('but is not available in Claude Code CLI (ADR-7). Bash batch achieves'); console.log('~20-40% by consolidating tool calls and keeping intermediate results'); console.log('in shell variables instead of context.'); process.exit(passed ? 0 : 1);