Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use Transformers.js to run state-of-the-art machine learning models directly in JavaScript/TypeScript. Supports NLP (text classification, translation, summarization), computer vision (image classification, object detection), audio (speech recognition, audio classification), and multimodal tasks. Works in browsers and server-side runtimes (Node.js, Bun, Deno) with WebGPU/WASM using pre-trained models from Hugging Face Hub.
.claude/skills/sediman-agent-transformers-js/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 168% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 193% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 259% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 253% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 210% | 0% |
Transformers.js enables running state-of-the-art machine learning models directly in JavaScript across browsers and server-side runtimes (Node.js, Bun, Deno), with no Python server required.
Use this skill when you need to:
bashnpm install @huggingface/transformers
javascript<script type="module"> import { pipeline } from 'https://cdn.jsdelivr.net/npm/@huggingface/transformers'; </script>
The pipeline API is the easiest way to use models. It groups together preprocessing, model inference, and postprocessing:
javascriptimport { pipeline } from '@huggingface/transformers'; // Create a pipeline for a specific task const pipe = await pipeline('sentiment-analysis'); // Use the pipeline const result = await pipe('I love transformers!'); // Output: [{ label: 'POSITIVE', score: 0.999817686 }] // IMPORTANT: Always dispose when done to free memory await pipe.dispose();
⚠️ Memory Management: All pipelines must be disposed with pipe.dispose() when finished to prevent memory leaks. See examples in Code Examples for cleanup patterns across different environments.
You can specify a custom model as the second argument:
javascriptconst pipe = await pipeline( 'sentiment-analysis', 'Xenova/bert-base-multilingual-uncased-sentiment' );
Finding Models:
Browse available Transformers.js models on Hugging Face Hub:
pipeline_tag parameterTip: Filter by task type, sort by trending/downloads, and check model cards for performance metrics and usage examples.
Choose where to run the model:
javascript// Run on CPU (default for WASM) const pipe = await pipeline('sentiment-analysis', 'model-id'); // Run on GPU (WebGPU) const pipe = await pipeline('sentiment-analysis', 'model-id', { device: 'webgpu', });
Control model precision vs. performance:
javascript// Use quantized model (faster, smaller) const pipe = await pipeline('sentiment-analysis', 'model-id', { dtype: 'q4', // Options: 'fp32', 'fp16', 'q8', 'q4' });
Note: All examples below show basic usage.
javascriptconst classifier = await pipeline('text-classification'); const result = await classifier('This movie was amazing!');
javascriptconst ner = await pipeline('token-classification'); const entities = await ner('My name is John and I live in New York.');
javascriptconst qa = await pipeline('question-answering'); const answer = await qa({ question: 'What is the capital of France?', context: 'Paris is the capital and largest city of France.' });
javascriptconst generator = await pipeline('text-generation', 'onnx-community/gemma-3-270m-it-ONNX'); const text = await generator('Once upon a time', { max_new_tokens: 100, temperature: 0.7 });
For streaming and chat: See Text Generation Guide for:
TextStreamerjavascriptconst translator = await pipeline('translation', 'Xenova/nllb-200-distilled-600M'); const output = await translator('Hello, how are you?', { src_lang: 'eng_Latn', tgt_lang: 'fra_Latn' });
javascriptconst summarizer = await pipeline('summarization'); const summary = await summarizer(longText, { max_length: 100, min_length: 30 });
javascriptconst classifier = await pipeline('zero-shot-classification'); const result = await classifier('This is a story about sports.', ['politics', 'sports', 'technology']);
javascriptconst classifier = await pipeline('image-classification'); const result = await classifier('https://example.com/image.jpg'); // Or with local file const result = await classifier(imageUrl);
javascriptconst detector = await pipeline('object-detection'); const objects = await detector('https://example.com/image.jpg'); // Returns: [{ label: 'person', score: 0.95, box: { xmin, ymin, xmax, ymax } }, ...]
javascriptconst segmenter = await pipeline('image-segmentation'); const segments = await segmenter('https://example.com/image.jpg');
javascriptconst depthEstimator = await pipeline('depth-estimation'); const depth = await depthEstimator('https://example.com/image.jpg');
javascriptconst classifier = await pipeline('zero-shot-image-classification'); const result = await classifier('image.jpg', ['cat', 'dog', 'bird']);
javascriptconst transcriber = await pipeline('automatic-speech-recognition'); const result = await transcriber('audio.wav'); // Returns: { text: 'transcribed text here' }
javascriptconst classifier = await pipeline('audio-classification'); const result = await classifier('audio.wav');
javascriptconst synthesizer = await pipeline('text-to-speech', 'Xenova/speecht5_tts'); const audio = await synthesizer('Hello, this is a test.', { speaker_embeddings: speakerEmbeddings });
javascriptconst captioner = await pipeline('image-to-text'); const caption = await captioner('image.jpg');
javascriptconst docQA = await pipeline('document-question-answering'); const answer = await docQA('document-image.jpg', 'What is the total amount?');
javascriptconst detector = await pipeline('zero-shot-object-detection'); const objects = await detector('image.jpg', ['person', 'car', 'tree']);
javascriptconst extractor = await pipeline('feature-extraction'); const embeddings = await extractor('This is a sentence to embed.'); // Returns: tensor of shape [1, sequence_length, hidden_size] // For sentence embeddings (mean pooling) const extractor = await pipeline('feature-extraction', 'onnx-community/all-MiniLM-L6-v2-ONNX'); const embeddings = await extractor('Text to embed', { pooling: 'mean', normalize: true });
Discover compatible Transformers.js models on Hugging Face Hub:
Base URL (all models):
https://huggingface.co/models?library=transformers.js&sort=trendingFilter by task using the pipeline_tag parameter:
| Task | URL | |------|-----| | Text Generation | https://huggingface.co/models?pipeline_tag=text-generation&library=transformers.js&sort=trending | | Text Classification | https://huggingface.co/models?pipeline_tag=text-classification&library=transformers.js&sort=trending | | Translation | https://huggingface.co/models?pipeline_tag=translation&library=transformers.js&sort=trending | | Summarization | https://huggingface.co/models?pipeline_tag=summarization&library=transformers.js&sort=trending | | Question Answering | https://huggingface.co/models?pipeline_tag=question-answering&library=transformers.js&sort=trending | | Image Classification | https://huggingface.co/models?pipeline_tag=image-classification&library=transformers.js&sort=trending | | Object Detection | https://huggingface.co/models?pipeline_tag=object-detection&library=transformers.js&sort=trending | | Image Segmentation | https://huggingface.co/models?pipeline_tag=image-segmentation&library=transformers.js&sort=trending | | Speech Recognition | https://huggingface.co/models?pipeline_tag=automatic-speech-recognition&library=transformers.js&sort=trending | | Audio Classification | https://huggingface.co/models?pipeline_tag=audio-classification&library=transformers.js&sort=trending | | Image-to-Text | https://huggingface.co/models?pipeline_tag=image-to-text&library=transformers.js&sort=trending | | Feature Extraction | https://huggingface.co/models?pipeline_tag=feature-extraction&library=transformers.js&sort=trending | | Zero-Shot Classification | https://huggingface.co/models?pipeline_tag=zero-shot-classification&library=transformers.js&sort=trending |
Sort options:
&sort=trending - Most popular recently&sort=downloads - Most downloaded overall&sort=likes - Most liked by community&sort=modified - Recently updatedConsider these factors when selecting a model:
1. Model Size
2. Quantization Models are often available in different quantization levels:
fp32 - Full precision (largest, most accurate)fp16 - Half precision (smaller, still accurate)q8 - 8-bit quantized (much smaller, slight accuracy loss)q4 - 4-bit quantized (smallest, noticeable accuracy loss)3. Task Compatibility Check the model card for:
4. Performance Metrics Model cards typically show:
javascript// 1. Visit: https://huggingface.co/models?pipeline_tag=text-generation&library=transformers.js&sort=trending // 2. Browse and select a model (e.g., onnx-community/gemma-3-270m-it-ONNX) // 3. Check model card for: // - Model size: ~270M parameters // - Quantization: q4 available // - Language: English // - Use case: Instruction-following chat // 4. Use the model: import { pipeline } from '@huggingface/transformers'; const generator = await pipeline( 'text-generation', 'onnx-community/gemma-3-270m-it-ONNX', { dtype: 'q4' } // Use quantized version for faster inference ); const output = await generator('Explain quantum computing in simple terms.', { max_new_tokens: 100 }); await generator.dispose();
onnx folder in model repo)library=transformers.js to find compatible models: https://huggingface.co/models?library=transformers.jsjavascript const pipe = await pipeline('task', 'model-id', { revision: 'abc123' });
env)The env object provides comprehensive control over Transformers.js execution, caching, and model loading.
Quick Overview:
javascriptimport { env, LogLevel } from '@huggingface/transformers'; // View version console.log(env.version); // e.g., '4.x' // Common settings env.allowRemoteModels = true; // Load from Hugging Face Hub env.allowLocalModels = false; // Load from file system env.localModelPath = '/models/'; // Local model directory env.useFSCache = true; // Cache models on disk (Node.js) env.useBrowserCache = true; // Cache models in browser env.cacheDir = './.cache'; // Cache directory location // Optional: override logging level (default is LogLevel.WARNING) env.logLevel = LogLevel.INFO; // Optional: custom fetch for auth headers, retries, abort signals, etc. env.fetch = (url, options) => fetch(url, { ...options, headers: { ...options?.headers, Authorization: `Bearer ${HF_TOKEN}`, }, });
Configuration Patterns:
javascript// Development: Fast iteration with remote models env.allowRemoteModels = true; env.useFSCache = true; // Production: Local models only env.allowRemoteModels = false; env.allowLocalModels = true; env.localModelPath = '/app/models/'; // Custom CDN env.remoteHost = 'https://cdn.example.com/models'; // Disable caching (testing) env.useFSCache = false; env.useBrowserCache = false;
For complete documentation on all configuration options, caching strategies, cache management, pre-downloading models, and more, see:
→ Configuration Reference
ModelRegistry gives you visibility and control over model assets before loading a pipeline. Use it to estimate download size, check cache status, inspect available dtypes, and clear cached artifacts for a specific task/model/options tuple.
javascriptimport { ModelRegistry } from '@huggingface/transformers'; const task = 'feature-extraction'; const modelId = 'onnx-community/all-MiniLM-L6-v2-ONNX'; const modelOptions = { dtype: 'fp32' }; // List required files for this pipeline const files = await ModelRegistry.get_pipeline_files(task, modelId, modelOptions); // Check if assets are already cached const cached = await ModelRegistry.is_pipeline_cached(task, modelId, modelOptions); // Inspect precision formats available for this model const dtypes = await ModelRegistry.get_available_dtypes(modelId); console.log({ files: files.length, cached, dtypes });
For production patterns and full API coverage, see ModelRegistry Reference.
@huggingface/tokenizers)For tokenization-only workflows, use @huggingface/tokenizers. It is a separate lightweight package useful when you need fast tokenization/encoding without loading full model inference pipelines.
bashnpm install @huggingface/tokenizers
javascriptimport { Tokenizer } from '@huggingface/tokenizers';
javascriptimport { AutoTokenizer, AutoModel } from '@huggingface/transformers'; // Load tokenizer and model separately for more control const tokenizer = await AutoTokenizer.from_pretrained('bert-base-uncased'); const model = await AutoModel.from_pretrained('bert-base-uncased'); // Tokenize input const inputs = await tokenizer('Hello world!'); // Run model const outputs = await model(inputs);
javascriptconst classifier = await pipeline('sentiment-analysis'); // Process multiple texts const results = await classifier([ 'I love this!', 'This is terrible.', 'It was okay.' ]);
WebGPU provides GPU acceleration in browsers and server-side runtimes (when supported):
javascriptconst pipe = await pipeline('text-generation', 'onnx-community/gemma-3-270m-it-ONNX', { device: 'webgpu', dtype: 'fp32' });
Note: Use webgpu when available and fall back to WASM/CPU when not supported in the current runtime.
WASM is the most compatible execution backend across runtimes:
javascript// Optimized for browsers with quantization const pipe = await pipeline('sentiment-analysis', 'model-id', { dtype: 'q8' // or 'q4' for even smaller size });
Models can be large (ranging from a few MB to several GB) and consist of multiple files. Track download progress by passing a callback to the pipeline() function:
javascriptimport { pipeline } from '@huggingface/transformers'; // Track progress for each file const fileProgress = {}; function onProgress(info) { if (info.status === 'progress_total') { console.log(`Total: ${info.progress.toFixed(1)}%`); return; } console.log(`${info.status}: ${info.file ?? ''}`); if (info.status === 'progress') { fileProgress[info.file] = info.progress; console.log(`${info.file}: ${info.progress.toFixed(1)}%`); } if (info.status === 'done') { console.log(`✓ ${info.file} complete`); } } // Pass callback to pipeline const classifier = await pipeline('sentiment-analysis', null, { progress_callback: onProgress });
Progress Info Properties:
typescriptinterface ProgressInfo { status: 'initiate' | 'download' | 'progress' | 'progress_total' | 'done' | 'ready'; name: string; // Model id or path file?: string; // File being processed (per-file events) progress?: number; // Percentage (0-100, for 'progress' and 'progress_total') loaded?: number; // Bytes downloaded (only for 'progress' status) total?: number; // Total bytes (only for 'progress' status) }
For complete examples including browser UIs, React components, CLI progress bars, and retry logic, see:
→ Pipeline Options - Progress Callback
javascripttry { const pipe = await pipeline('sentiment-analysis', 'model-id'); const result = await pipe('text to analyze'); } catch (error) { if (error.message.includes('fetch')) { console.error('Model download failed. Check internet connection.'); } else if (error.message.includes('ONNX')) { console.error('Model execution failed. Check model compatibility.'); } else { console.error('Unknown error:', error); } }
q8 or q4 for faster inferencemax_new_tokens to avoid memory issuespipe.dispose() when done to free memoryIMPORTANT: Always call pipe.dispose() when finished to prevent memory leaks.
javascriptconst pipe = await pipeline('sentiment-analysis'); const result = await pipe('Great product!'); await pipe.dispose(); // ✓ Free memory (100MB - several GB per model)
When to dispose:
Models consume significant memory and hold GPU/CPU resources. Disposal is critical for browser memory limits and server stability.
For detailed patterns (React cleanup, servers, browser), see Code Examples
onnx folder in model repo)dtype: 'q4')max_lengthdtype: 'fp16' if fp32 failspipeline() with progress_callback, device, dtype, etc.env configuration for caching and model loadingpipe.dispose() when done - critical for preventing memory leaks| Task | Task ID | |------|---------| | Text classification | text-classification or sentiment-analysis | | Token classification | token-classification or ner | | Question answering | question-answering | | Fill mask | fill-mask | | Summarization | summarization | | Translation | translation | | Text generation | text-generation | | Text-to-text generation | text2text-generation | | Zero-shot classification | zero-shot-classification | | Image classification | image-classification | | Image segmentation | image-segmentation | | Object detection | object-detection | | Depth estimation | depth-estimation | | Image-to-image | image-to-image | | Zero-shot image classification | zero-shot-image-classification | | Zero-shot object detection | zero-shot-object-detection | | Automatic speech recognition | automatic-speech-recognition | | Audio classification | audio-classification | | Text-to-speech | text-to-speech or text-to-audio | | Image-to-text | image-to-text | | Document question answering | document-question-answering | | Feature extraction | feature-extraction | | Sentence similarity | sentence-similarity |
This skill enables you to integrate state-of-the-art machine learning capabilities directly into JavaScript applications without requiring separate ML servers or Python environments.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 14,770 | 6,009 | -59% | 1 | 1 | 0% | 2,744 | 7,342 | +168% | 0 | 0 | — |
case-02 | fail→pass | 16,663 | 10,795 | -35% | 1 | 1 | 0% | 2,731 | 8,009 | +193% | 0 | 0 | — |
case-03 | pass→pass | 10,415 | 5,905 | -43% | 1 | 1 | 0% | 1,745 | 7,191 | +312% | 0 | 0 | — |
case-04 | pass→pass | 11,875 | 7,121 | -40% | 1 | 1 | 0% | 2,062 | 7,462 | +262% | 0 | 0 | — |
case-05 | fail→pass | 11,749 | 5,473 | -53% | 1 | 1 | 0% | 1,965 | 7,050 | +259% | 0 | 0 | — |
case-06 | pass→pass | 11,651 | 6,634 | -43% | 1 | 1 | 0% | 2,023 | 7,402 | +266% | 0 | 0 | — |
case-07 | fail→pass | 12,072 | 3,300 | -73% | 1 | 1 | 0% | 1,895 | 6,696 | +253% | 0 | 0 | — |
case-08 | pass→pass | 12,187 | 5,704 | -53% | 1 | 1 | 0% | 1,981 | 7,197 | +263% | 0 | 0 | — |
case-09 | pass→pass | 6,093 | 3,522 | -42% | 1 | 1 | 0% | 1,073 | 6,743 | +528% | 0 | 0 | — |
case-10 | pass→pass | 11,049 | 8,459 | -23% | 1 | 1 | 0% | 1,942 | 7,745 | +299% | 0 | 0 | — |
case-11 | pass→pass | 10,859 | 6,253 | -42% | 1 | 1 | 0% | 1,800 | 7,311 | +306% | 0 | 0 | — |
case-12 | pass→pass | 7,277 | 3,485 | -52% | 1 | 1 | 0% | 1,211 | 6,739 | +456% | 0 | 0 | — |
case-13 | pass→pass | 6,476 | 4,748 | -27% | 1 | 1 | 0% | 1,200 | 6,992 | +483% | 0 | 0 | — |
case-14 | pass→pass | 10,445 | 5,761 | -45% | 1 | 1 | 0% | 1,745 | 7,151 | +310% | 0 | 0 | — |
case-15 | pass→pass | 11,536 | 6,917 | -40% | 1 | 1 | 0% | 1,786 | 7,387 | +314% | 0 | 0 | — |
case-16 | pass→pass | 6,027 | 2,317 | -62% | 1 | 1 | 0% | 939 | 6,506 | +593% | 0 | 0 | — |
case-17 | fail→pass | 13,111 | 4,903 | -63% | 1 | 1 | 0% | 2,249 | 6,969 | +210% | 0 | 0 | — |
case-18 | pass→pass | 6,427 | 4,110 | -36% | 1 | 1 | 0% | 1,151 | 6,845 | +495% | 0 | 0 | — |
case-19 | pass→pass | 10,713 | 5,652 | -47% | 1 | 1 | 0% | 1,920 | 7,110 | +270% | 0 | 0 | — |
case-20 | pass→pass | 17,259 | 12,048 | -30% | 1 | 1 | 0% | 2,954 | 8,308 | +181% | 0 | 0 | — |
case-21 | pass→pass | 14,099 | 11,864 | -16% | 1 | 1 | 0% | 2,513 | 8,559 | +241% | 0 | 0 | — |
case-22 | pass→pass | 10,117 | 7,163 | -29% | 1 | 1 | 0% | 1,713 | 7,378 | +331% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +23 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.