{"slug": "track-every-llm-token-in-node-js-with-all-llm-token-tracker", "title": "Track Every LLM Token in Node.js with all-llm-token-tracker", "summary": "A developer built all-llm-token-tracker, an npm package that tracks input and output tokens for LLM API calls in Node.js. The tool supports manual recording, auto-wrapping of OpenAI and Anthropic calls, multiple storage backends (memory, file, MongoDB), and query/summarize features. It is designed to be lightweight with zero required dependencies.", "body_md": "\n\n```\nnode\njavascript\nopenai\nllm\n```\n\n*(Alternates: typescript, npm, webdev)*\n\nUse a dashboard screenshot or a simple banner with:\n\n**\"Track input/output LLM tokens in Node.js\"**\n\nIf you build with OpenAI, Anthropic, or any LLM API, you've probably wondered:\n\nHow many tokens did that request actually use?\n\nToken usage drives **cost**, **performance**, and **scaling**. But in many Node.js apps, `response.usage`\n\ngets logged once and forgotten.\n\nI built ** all-llm-token-tracker** — a small npm package that tracks\n\n**npm:** [https://www.npmjs.com/package/all-llm-token-tracker](https://www.npmjs.com/package/all-llm-token-tracker)\n\n**GitHub:** [https://github.com/rkanumetta/all-llm-token-tracker](https://github.com/rkanumetta/all-llm-token-tracker)\n\nMost integrations look like this:\n\n``` js\nconst response = await openai.chat.completions.create({ ... });\nconsole.log(response.usage); // logged, rarely stored\n```\n\nThat works for debugging — not for production. You usually need:\n\nMany existing tools bundle pricing engines, MCP servers, or heavy infra. Sometimes you just want **clean token tracking**.\n\n`all-llm-token-tracker`\n\ndoes one job well:\n\n| Feature | Supported |\n|---|---|\n| Manual token recording | ✅ |\n| Auto-wrap LLM calls | ✅ |\n| OpenAI extractor | ✅ |\n| Anthropic extractor | ✅ |\n| Memory storage | ✅ |\n| File (JSON) storage | ✅ |\n| MongoDB storage | ✅ |\n| Query & summarize | ✅ |\n| Browser dashboard | ✅ |\n| Zero required deps | ✅ |\n\n**Requirements:** Node.js 18+\n\n**License:** MIT\n\n```\nnpm install all-llm-token-tracker\n```\n\nMongoDB storage (optional):\n\n```\nnpm install all-llm-token-tracker mongodb\njs\nimport { createTracker } from 'all-llm-token-tracker';\n\nconst tracker = createTracker({ storage: 'memory' });\n\nconst record = await tracker.record({\n  provider: 'openai',\n  model: 'gpt-4o-mini',\n  inputTokens: 120,\n  outputTokens: 45,\n  metadata: { userId: 'user-123' },\n});\n\nconsole.log(record.totalTokens); // 165\n```\n\nEach record gets a UUID, timestamp, and optional metadata.\n\nWrap your existing function — usage is recorded automatically:\n\n``` js\nimport {\n  createTracker,\n  extractOpenAiUsage,\n} from 'all-llm-token-tracker';\nimport OpenAI from 'openai';\n\nconst tracker = createTracker({\n  storage: 'file',\n  file: { filePath: './.llm-usage/usage.json' },\n});\n\nconst openai = new OpenAI();\n\nconst { result, record } = await tracker.track(\n  () =>\n    openai.chat.completions.create({\n      model: 'gpt-4o-mini',\n      messages: [{ role: 'user', content: 'Hello!' }],\n    }),\n  {\n    provider: 'openai',\n    model: 'gpt-4o-mini',\n    extractUsage: extractOpenAiUsage,\n    metadata: { feature: 'chat' },\n  }\n);\n\nconsole.log(result.choices[0].message.content);\nconsole.log(record.inputTokens, record.outputTokens);\n```\n\n**What happens:**\n\n`{ result, record }`\n\nbackNo changes to your core LLM logic — just a wrapper.\n\n``` js\nimport { extractAnthropicUsage } from 'all-llm-token-tracker';\n\nawait tracker.track(\n  () => anthropic.messages.create({\n    model: 'claude-3-5-sonnet-20241022',\n    max_tokens: 1024,\n    messages: [{ role: 'user', content: 'Hello!' }],\n  }),\n  {\n    provider: 'anthropic',\n    model: 'claude-3-5-sonnet-20241022',\n    extractUsage: extractAnthropicUsage,\n  }\n);\njs\nconst tracker = createTracker({ storage: 'memory' });\njs\nconst tracker = createTracker({\n  storage: 'file',\n  file: { filePath: './.llm-usage/usage.json' },\n});\njs\nconst tracker = createTracker({\n  storage: 'mongodb',\n  mongodb: {\n    uri: process.env.MONGODB_URI,\n    database: 'my_app',\n    collection: 'llm_token_usage',\n  },\n});\n\n// on shutdown\nawait tracker.close();\njs\nconst calls = await tracker.getCalls({\n  provider: 'openai',\n  from: '2026-07-01',\n  limit: 100,\n});\n\nconst summary = await tracker.getSummary();\n/*\n{\n  totalCalls: 42,\n  totalInputTokens: 12500,\n  totalOutputTokens: 3200,\n  totalTokens: 15700,\n  averageInputTokens: 297.6,\n  averageOutputTokens: 76.2,\n  averageTotalTokens: 373.8\n}\n*/\n\nconst byModel = await tracker.getSummaryByModel();\nconst byProvider = await tracker.getSummaryByProvider();\n```\n\nEvery call is stored like this:\n\n```\n{\n  \"id\": \"uuid\",\n  \"provider\": \"openai\",\n  \"model\": \"gpt-4o-mini\",\n  \"inputTokens\": 120,\n  \"outputTokens\": 45,\n  \"totalTokens\": 165,\n  \"timestamp\": \"2026-07-10T06:00:00.000Z\",\n  \"durationMs\": 842,\n  \"metadata\": { \"userId\": \"user-123\" }\n}\njs\nimport { createUsageExtractor } from 'all-llm-token-tracker';\n\nconst extractMyProvider = createUsageExtractor((response) => ({\n  inputTokens: response.tokens.in,\n  outputTokens: response.tokens.out,\n}));\n```\n\nOr plug in your own storage (Postgres, Redis, etc.):\n\n``` js\nimport { createTracker, type StorageAdapter, type LlmCallRecord } from 'all-llm-token-tracker';\n\nclass PostgresStorage implements StorageAdapter {\n  async save(record: LlmCallRecord) { /* ... */ }\n  async find(query) { /* ... */ }\n  async count(query) { /* ... */ }\n}\n\nconst tracker = createTracker({ storage: new PostgresStorage() });\n```\n\nThe repo includes a simple dashboard to visualize input vs output tokens:\n\n```\ngit clone https://github.com/rkanumetta/all-llm-token-tracker.git\ncd all-llm-token-tracker\nnpm install\nnpm run example\nnpm run dashboard\n```\n\nYou'll see:\n\n```\nnpm install all-llm-token-tracker\n```\n\n**Links:**\n\nIf you find it useful, **star the repo** ⭐ and open an issue if you want support for another provider (Gemini, Mistral, etc.).\n\nLLM token tracking doesn't need to be complicated. Wrap your API calls, store consistent records, query when you need insights.\n\n**Track input. Track output. Store it. Query it. Done.**\n\n*What storage backend do you use for LLM observability — file, MongoDB, or something else? Drop a comment below.*\n\n`node`\n\n, `javascript`\n\n, `openai`\n\n, `llm`\n\nPaste this as the first line under the title if DEV shows a preview/subtitle field:\n\n```\nA lightweight Node.js npm package to track input/output tokens for OpenAI, Anthropic, and custom LLM providers — with memory, file, and MongoDB storage plus a browser dashboard.\n```\n\n", "url": "https://wpnews.pro/news/track-every-llm-token-in-node-js-with-all-llm-token-tracker", "canonical_source": "https://dev.to/rajesh_kumarkanumetta_b5/track-every-llm-token-in-nodejs-with-all-llm-token-tracker-2k90", "published_at": "2026-07-10 07:36:09+00:00", "updated_at": "2026-07-10 07:42:29.908191+00:00", "lang": "en", "topics": ["developer-tools", "large-language-models", "ai-tools"], "entities": ["all-llm-token-tracker", "OpenAI", "Anthropic", "Node.js", "npm", "GitHub", "MongoDB"], "alternates": {"html": "https://wpnews.pro/news/track-every-llm-token-in-node-js-with-all-llm-token-tracker", "markdown": "https://wpnews.pro/news/track-every-llm-token-in-node-js-with-all-llm-token-tracker.md", "text": "https://wpnews.pro/news/track-every-llm-token-in-node-js-with-all-llm-token-tracker.txt", "jsonld": "https://wpnews.pro/news/track-every-llm-token-in-node-js-with-all-llm-token-tracker.jsonld"}}