UNPKG

magnitude-core

Version:
64 lines (63 loc) 3.39 kB
import { blueBright, bold, cyanBright, gray } from 'ansis'; export function narrateAgent(agent) { let totalInputTokens = 0; let totalOutputTokens = 0; let totalCachedWriteInputTokens = 0; let totalCachedReadInputTokens = 0; let totalInputTokenCost = 0.0; let totalOutputTokenCost = 0.0; agent.events.on('tokensUsed', (usage) => { totalInputTokens += usage.inputTokens; totalOutputTokens += usage.outputTokens; totalCachedWriteInputTokens += usage.cacheWriteInputTokens ?? 0; totalCachedReadInputTokens += usage.cacheReadInputTokens ?? 0; totalInputTokenCost += usage.inputCost ?? 0.0; totalOutputTokenCost += usage.outputCost ?? 0.0; }); agent.events.on('start', () => { console.log(bold(blueBright(`▶ [start] agent started with ${agent.models.describe()}`))); }); agent.events.on('stop', () => { console.log(bold(blueBright(`■ [stop] agent stopped`))); console.log(` Total usage: ` + bold `${totalInputTokens + totalCachedWriteInputTokens + totalCachedReadInputTokens}` + ` input tokens` + (totalCachedWriteInputTokens > 0 || totalCachedReadInputTokens > 0 ? ` (${totalCachedWriteInputTokens} cache write, ${totalCachedReadInputTokens} cache read)` : '') + ` / ` + bold `${totalOutputTokens}` + ` output tokens`); if (totalInputTokenCost > 0 || totalOutputTokenCost > 0) { if (agent.models.numUniqueModels === 1 && agent.models.describe().startsWith('claude-code')) { console.log(` Cost: ` + cyanBright `None - using Claude Pro or Max subscription`); } else { console.log(` Cost: $${(totalInputTokenCost + totalOutputTokenCost).toFixed(3)}`); } } // Show token usage and cost if available // if (totalInputTokenCost > 0 || totalOutputTokenCost > 0) { // console.log(` Total usage: ` + bold`${totalInputTokens}` + ` input tokens (` + `$${totalInputTokenCost.toFixed(3)}` + `)` + ` / ` + bold`${totalOutputTokens}` + ` output tokens (` + `$${totalOutputTokenCost.toFixed(3)}` + `)`); // } else { // console.log(` Total usage: ` + bold`${totalInputTokens}` + ` input tokens` + ` / ` + bold`${totalOutputTokens}` + ` output tokens`); // } }); agent.events.on('thought', (thought) => { console.log(gray `${thought}`); //console.log(gray`⚙︎ ${thought}`); }); agent.events.on('actStarted', (task, options) => { console.log(bold(cyanBright(`◆ [act] ${task}`))); }); agent.events.on('actionStarted', (action) => { const actionDefinition = agent.identifyAction(action); console.log(bold ` ${actionDefinition.render(action)}`); }); } export function narrateBrowserAgent(agent) { narrateAgent(agent); agent.browserAgentEvents.on('nav', (url) => { console.log(bold(cyanBright `⛓︎ [nav] ${url}`)); }); agent.browserAgentEvents.on('extractStarted', (instructions, schema) => { console.log(bold(cyanBright `⛏ [extract] ${instructions}`)); }); agent.browserAgentEvents.on('extractDone', (instructions, data) => { // console.log has a decent default formatter for arbitrary data e.g. objects console.log(data); //console.log(blueBright`${JSON.stringify(data, null, 2)}`); }); }