UNPKG

image-token-meter

Version:

Calculate token consumption for images in OpenAI Vision models (GPT-4o, GPT-4 Vision, etc.)

297 lines (217 loc) 8.2 kB
# Image Token Meter A TypeScript library to calculate token consumption for images in OpenAI Vision models. Works in both Node.js and browser environments. ## Features - 🧮 Accurate token calculation based on OpenAI's official documentation - 🤖 Support for multiple models (GPT-4o, GPT-4 Vision, GPT-4 Turbo, etc.) - 💰 Cost estimation with model-specific pricing - 🖼️ Support for different detail levels (high, low, auto) - 📦 Works in both Node.js and browser environments - 📐 TypeScript support with full type definitions - 🚀 Zero runtime dependencies ## Installation ```bash npm install image-token-meter ``` ## Usage ### Basic Usage ```typescript import { calculateImageTokens } from 'image-token-meter'; // Calculate tokens for GPT-4o (default model) const result = calculateImageTokens({ width: 1024, height: 768, detail: 'high' }); console.log(`Model: ${result.modelName}`); console.log(`Tokens: ${result.tokens}`); console.log(`Cost: $${result.cost.toFixed(4)}`); console.log(`Tiles: ${result.details.tiles.total}`); ``` ### Specific Model ```typescript // Calculate tokens for GPT-4 Vision const gpt4Result = calculateImageTokens({ width: 1024, height: 768, detail: 'high', model: 'gpt-4-vision-preview' }); // Calculate tokens for GPT-4o Mini (more affordable) const miniResult = calculateImageTokens({ width: 1024, height: 768, detail: 'high', model: 'gpt-4o-mini' }); ``` ### Low Detail Mode ```typescript const result = calculateImageTokens({ width: 4096, height: 2048, detail: 'low' }); // Low detail always returns 85 tokens console.log(result.tokens); // 85 ``` ### Batch Processing with Multiple Models ```typescript import { calculateBatchImageTokens } from 'image-token-meter'; const images = [ { width: 1024, height: 768, detail: 'high', model: 'gpt-4o' }, { width: 2048, height: 2048, detail: 'high', model: 'gpt-4-vision-preview' }, { width: 512, height: 512, detail: 'low', model: 'gpt-4o-mini' } ]; const batch = calculateBatchImageTokens(images); console.log(`Total tokens: ${batch.summary.totalTokens}`); console.log(`Total cost: $${batch.summary.totalCost.toFixed(2)}`); // View breakdown by model Object.entries(batch.summary.byModel).forEach(([model, stats]) => { console.log(`${model}: ${stats.count} images, ${stats.tokens} tokens, $${stats.cost.toFixed(2)}`); }); ``` ### Custom Pricing ```typescript import { calculateImageTokens, createPricing } from 'image-token-meter'; // Create custom pricing (e.g., $2.50 per 1k tokens) const customPricing = createPricing(2.50); const result = calculateImageTokens({ width: 1024, height: 768, model: 'gpt-4o' }, customPricing); console.log(`Cost with custom pricing: $${result.cost.toFixed(4)}`); ``` ### Available Models ```typescript import { getAvailableModels, getModel } from 'image-token-meter'; // List all available models const models = getAvailableModels(); console.log('Available models:', models); // Get details about a specific model const modelInfo = getModel('gpt-4o'); console.log(`${modelInfo.name}: $${modelInfo.defaultCostPer1kTokens}/1k tokens`); ``` ## Supported Models | Model | ID | Default Cost/1k tokens | Notes | |-------|----|-----------------------|-------| | GPT-4o | `gpt-4o` | $5.00 | Latest multimodal model | | GPT-4o Mini | `gpt-4o-mini` | $0.15 | Affordable alternative | | GPT-4 Vision | `gpt-4-vision-preview` | $10.00 | Original vision model | | GPT-4 Turbo | `gpt-4-turbo` | $10.00 | With vision support | | GPT-4 Turbo (2024-04-09) | `gpt-4-turbo-2024-04-09` | $10.00 | Specific version | | GPT-4 Vision (1106) | `gpt-4-1106-vision-preview` | $10.00 | November 2023 version | ## How It Works The calculator follows OpenAI's image tokenization rules: 1. **High Detail Mode**: - First, the image is scaled to fit within a 2048x2048 square - Then, the shortest side is scaled to 768px (if both dimensions exceed 768px) - The image is divided into 512x512 tiles - Token count = 85 (base) + 170 × (number of tiles) 2. **Low Detail Mode**: - Always returns 85 tokens regardless of image size - Image is processed at 512x512 resolution 3. **Auto Mode**: - Currently defaults to high detail mode ## API Reference ### `calculateImageTokens(input, pricing?)` Calculate tokens for a single image. **Parameters:** - `input`: Object with image parameters - `width`: Image width in pixels - `height`: Image height in pixels - `detail`: Optional detail level ('high', 'low', 'auto'). Default: 'high' - `model`: Optional model ID. Default: 'gpt-4o' - `pricing`: Optional custom pricing configuration **Returns:** Object containing: - `tokens`: Total token count - `cost`: Estimated cost in USD - `model`: Model ID used - `modelName`: Human-readable model name - `details`: Detailed calculation breakdown ### `calculateBatchImageTokens(images, pricing?)` Calculate tokens for multiple images. **Parameters:** - `images`: Array of image inputs - `pricing`: Optional custom pricing configuration **Returns:** Object containing: - `results`: Array of individual results - `summary`: Total tokens, cost, image count, and breakdown by model ### `getModel(modelId)` Get configuration for a specific model. ### `getAvailableModels()` Get list of all available model IDs. ### `getVisionModels()` Get list of all vision-enabled model configurations. ### `createPricing(costPer1kTokens)` Create a custom pricing configuration. ### `getPricing(model?)` Get the default pricing for a specific model. ## Examples ### Real-world Example ```typescript // A typical smartphone photo (4032x3024) const photo = calculateImageTokens({ width: 4032, height: 3024, detail: 'high', model: 'gpt-4o' }); console.log(`Smartphone photo: ${photo.tokens} tokens ($${photo.cost.toFixed(2)})`); console.log(`Resized to: ${photo.details.resizedSize.width}x${photo.details.resizedSize.height}`); console.log(`Tiles: ${photo.details.tiles.width}x${photo.details.tiles.height}`); ``` ### Cost Comparison Between Models ```typescript const imageSize = { width: 2048, height: 1536, detail: 'high' }; const models = ['gpt-4o', 'gpt-4o-mini', 'gpt-4-vision-preview']; models.forEach(model => { const result = calculateImageTokens({ ...imageSize, model }); console.log(`${result.modelName}: ${result.tokens} tokens, $${result.cost.toFixed(2)}`); }); ``` ### Optimization Strategy ```typescript // Compare costs between detail levels const highDetail = calculateImageTokens({ width: 4096, height: 3072, detail: 'high', model: 'gpt-4o' }); const lowDetail = calculateImageTokens({ width: 4096, height: 3072, detail: 'low', model: 'gpt-4o' }); console.log(`High detail: ${highDetail.tokens} tokens ($${highDetail.cost.toFixed(2)})`); console.log(`Low detail: ${lowDetail.tokens} tokens ($${lowDetail.cost.toFixed(2)})`); console.log(`Savings: $${(highDetail.cost - lowDetail.cost).toFixed(2)} (${((1 - lowDetail.cost/highDetail.cost) * 100).toFixed(1)}%)`); ``` ## Token Calculation Examples | Original Size | Model | Detail | Resized Size | Tiles | Tokens | Cost @ Default | |--------------|-------|--------|--------------|-------|--------|----------------| | 512×512 | GPT-4o | high | 512×512 | 1×1 | 255 | $1.28 | | 768×768 | GPT-4o | high | 768×768 | 2×2 | 765 | $3.83 | | 1024×1024 | GPT-4o | high | 768×768 | 2×2 | 765 | $3.83 | | 2048×2048 | GPT-4o | high | 768×768 | 2×2 | 765 | $3.83 | | 3000×1200 | GPT-4o | high | 1920×768 | 4×2 | 1445 | $7.23 | | Any size | Any | low | 512×512 | 1×1 | 85 | Varies by model | ## TypeScript Support The library includes comprehensive TypeScript definitions: ```typescript import type { ImageTokenInput, ImageTokenResult, VisionModel, ModelConfig } from 'image-token-meter'; ``` ## License MIT ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. ## Links - [OpenAI Vision Guide](https://platform.openai.com/docs/guides/images-vision) - [OpenAI Pricing](https://openai.com/api/pricing/)